# | Line 42 | Line 42 | |
---|---|---|
42 | #include <algorithm> | |
43 | ||
44 | #include "RadialDistrFunc.hpp" | |
45 | < | |
45 | > | #include "io/DumpReader.hpp" |
46 | > | #include "primitives/Molecule.hpp" |
47 | namespace oopse { | |
48 | ||
49 | < | RadialDistrFunc:: RadialDistrFunc(SimInfo* info, const std::string& filename, const std::string& sele1, const std::string& sele2, double len) |
50 | < | : info_(info), currentSnapshot_(NULL), dumpFilename_(filename), len_(len), nbins_(50), step_(1), |
51 | < | selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info), evaluator2_(info){ |
49 | > | RadialDistrFunc:: RadialDistrFunc(SimInfo* info, const std::string& filename, const std::string& sele1, const std::string& sele2) |
50 | > | : info_(info), currentSnapshot_(NULL), dumpFilename_(filename), step_(1), |
51 | > | selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info), evaluator2_(info), seleMan1_(info), seleMan2_(info){ |
52 | ||
53 | evaluator1_.loadScriptString(sele1); | |
54 | evaluator2_.loadScriptString(sele2); | |
55 | ||
56 | < | if (!evaluator1_->isDynamic()) { |
57 | < | seleMan1_.setSelectionSet(evaluator1_->evaluate()); |
56 | > | if (!evaluator1_.isDynamic()) { |
57 | > | seleMan1_.setSelectionSet(evaluator1_.evaluate()); |
58 | } | |
59 | < | if (!evaluator2_->isDynamic()) { |
60 | < | seleMan2_.setSelectionSet(evaluator2_->evaluate()); |
59 | > | if (!evaluator2_.isDynamic()) { |
60 | > | seleMan2_.setSelectionSet(evaluator2_.evaluate()); |
61 | } | |
62 | ||
63 | < | delta_ = len_ /nbins_; |
63 | > | if (!evaluator1_.isDynamic() && !evaluator2_.isDynamic()) { |
64 | > | //if all selections are static, we can precompute the number of real pairs |
65 | > | |
66 | > | int nSelected1 = seleMan1_.getSelectionCount(); |
67 | > | int nSelected2 = seleMan2_.getSelectionCount(); |
68 | > | |
69 | > | BitSet bs = seleMan1_.getSelectionSet(); |
70 | > | bs &= seleMan2_.getSelectionSet(); |
71 | > | int nIntersect = bs.countBits(); |
72 | > | |
73 | > | nRealPairs_ = nSelected1 * nSelected2 - (nIntersect +1) * nIntersect/2; |
74 | > | } |
75 | > | |
76 | } | |
77 | ||
78 | void RadialDistrFunc::process() { | |
79 | < | |
79 | > | Molecule* mol; |
80 | > | RigidBody* rb; |
81 | > | SimInfo::MoleculeIterator mi; |
82 | > | Molecule::RigidBodyIterator rbIter; |
83 | > | |
84 | preProcess(); | |
85 | ||
86 | DumpReader reader(info_, dumpFilename_); | |
87 | < | int nFrames = reader->getNFrames(); |
88 | < | nProcessed_ = nFrames / step_ + 1; |
87 | > | int nFrames = reader.getNFrames(); |
88 | > | nProcessed_ = nFrames / step_; |
89 | > | |
90 | for (int i = 0; i < nFrames; i += step_) { | |
91 | < | reader->readFrame(i); |
91 | > | reader.readFrame(i); |
92 | currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot(); | |
93 | ||
94 | < | if (evaluator1_->isDynamic()) { |
95 | < | seleMan1_.setSelectionSet(evaluator1_->evaluate()); |
94 | > | if (evaluator1_.isDynamic()) { |
95 | > | seleMan1_.setSelectionSet(evaluator1_.evaluate()); |
96 | } | |
97 | < | if (evaluator2_->isDynamic()) { |
98 | < | seleMan2_.setSelectionSet(evaluator2_->evaluate()); |
97 | > | if (evaluator2_.isDynamic()) { |
98 | > | seleMan2_.setSelectionSet(evaluator2_.evaluate()); |
99 | } | |
100 | ||
101 | + | for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { |
102 | + | |
103 | + | //change the positions of atoms which belong to the rigidbodies |
104 | + | for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) { |
105 | + | rb->updateAtoms(); |
106 | + | } |
107 | + | } |
108 | + | |
109 | initalizeHistogram(); | |
110 | ||
111 | StuntDouble* sd1; | |
112 | int j; | |
113 | < | for (sd1 = seleMan1_->beginSelected(j); sd1 != NULL; sd1 = seleMan1_->nextSelected(j)) { |
113 | > | for (sd1 = seleMan1_.beginSelected(j); sd1 != NULL; sd1 = seleMan1_.nextSelected(j)) { |
114 | ||
115 | StuntDouble* sd2; | |
116 | int k; | |
117 | < | for (sd2 = seleMan2_->beginSelected(k); sd2 != NULL; sd2 = seleMan2_->nextSelected(k)) { |
118 | < | collectHistogram(sd1, sd2); |
117 | > | for (sd2 = seleMan2_.beginSelected(k); sd2 != NULL; sd2 = seleMan2_.nextSelected(k)) { |
118 | > | if (sd1 != sd2) { |
119 | > | collectHistogram(sd1, sd2); |
120 | > | } |
121 | } | |
122 | } | |
123 | ||
# | Line 102 | Line 130 | void RadialDistrFunc::process() { | |
130 | writeRdf(); | |
131 | } | |
132 | ||
133 | + | int RadialDistrFunc::getNRealPairs() { |
134 | + | if (evaluator1_.isDynamic() || evaluator2_.isDynamic()) { |
135 | + | //if one of the selection is dynamic, need to recompute it |
136 | + | |
137 | + | int nSelected1 = seleMan1_.getSelectionCount(); |
138 | + | int nSelected2 = seleMan2_.getSelectionCount(); |
139 | + | |
140 | + | BitSet bs = seleMan1_.getSelectionSet(); |
141 | + | bs &= seleMan2_.getSelectionSet(); |
142 | + | int nIntersect = bs.countBits(); |
143 | + | |
144 | + | nRealPairs_ = nSelected1 * nSelected2 - (nIntersect +1) * nIntersect/2; |
145 | + | } |
146 | + | |
147 | + | return nRealPairs_; |
148 | } | |
149 | + | |
150 | + | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |