48#include "RadialDistrFunc.hpp"
57 RadialDistrFunc::RadialDistrFunc(
SimInfo* info,
const std::string& filename,
58 const std::string& sele1,
59 const std::string& sele2,
62 selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info),
63 evaluator2_(info), seleMan1_(info), seleMan2_(info),
64 sele1_minus_common_(info), sele2_minus_common_(info), common_(info) {
65 evaluator1_.loadScriptString(sele1);
66 evaluator2_.loadScriptString(sele2);
68 if (!evaluator1_.isDynamic()) {
69 seleMan1_.setSelectionSet(evaluator1_.evaluate());
70 validateSelection1(seleMan1_);
72 if (!evaluator2_.isDynamic()) {
73 seleMan2_.setSelectionSet(evaluator2_.evaluate());
74 validateSelection2(seleMan2_);
77 if (!evaluator1_.isDynamic() && !evaluator2_.isDynamic()) {
80 common_ = seleMan1_ & seleMan2_;
81 sele1_minus_common_ = seleMan1_ - common_;
82 sele2_minus_common_ = seleMan2_ - common_;
84 nSelected1_ = seleMan1_.getSelectionCount();
85 nSelected2_ = seleMan2_.getSelectionCount();
86 int nIntersect = common_.getSelectionCount();
88 nPairs_ = nSelected1_ * nSelected2_ - (nIntersect + 1) * nIntersect / 2;
92 void RadialDistrFunc::process() {
95 DumpReader reader(info_, dumpFilename_);
96 int nFrames = reader.getNFrames();
97 nProcessed_ = nFrames / step_;
99 for (
int i = 0; i < nFrames; i += step_) {
101 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
103 if (evaluator1_.isDynamic()) {
104 seleMan1_.setSelectionSet(evaluator1_.evaluate());
105 validateSelection1(seleMan1_);
107 if (evaluator2_.isDynamic()) {
108 seleMan2_.setSelectionSet(evaluator2_.evaluate());
109 validateSelection2(seleMan2_);
112 initializeHistogram();
135 if (evaluator1_.isDynamic() || evaluator2_.isDynamic()) {
136 common_ = seleMan1_ & seleMan2_;
137 sele1_minus_common_ = seleMan1_ - common_;
138 sele2_minus_common_ = seleMan2_ - common_;
139 nSelected1_ = seleMan1_.getSelectionCount();
140 nSelected2_ = seleMan2_.getSelectionCount();
141 int nIntersect = common_.getSelectionCount();
143 nPairs_ = nSelected1_ * nSelected2_ - (nIntersect + 1) * nIntersect / 2;
146 processNonOverlapping(sele1_minus_common_, seleMan2_);
147 processNonOverlapping(common_, sele2_minus_common_);
148 processOverlapping(common_);
158 void RadialDistrFunc::processNonOverlapping(SelectionManager& sman1,
159 SelectionManager& sman2) {
170 for (sd1 = sman1.beginSelected(i); sd1 != NULL;
171 sd1 = sman1.nextSelected(i)) {
172 for (sd2 = sman2.beginSelected(j); sd2 != NULL;
173 sd2 = sman2.nextSelected(j)) {
174 collectHistogram(sd1, sd2);
179 void RadialDistrFunc::processOverlapping(SelectionManager& sman) {
190 for (sd1 = sman.beginSelected(i); sd1 != NULL; sd1 = sman.nextSelected(i)) {
191 for (j = i, sd2 = sman.nextSelected(j); sd2 != NULL;
192 sd2 = sman.nextSelected(j)) {
193 collectHistogram(sd1, sd2);
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.