50#include "applications/staticProps/AngleR.hpp"
57#include "brains/Thermo.hpp"
60#include "utils/Revision.hpp"
61#include "utils/simError.h"
65 AngleR::AngleR(
SimInfo* info,
const std::string& filename,
66 const std::string& sele1, RealType len,
int nrbins) :
68 doVect_(true), doOffset_(false), selectionScript1_(sele1),
69 seleMan1_(info), seleMan2_(info), evaluator1_(info), evaluator2_(info),
70 len_(len), nRBins_(nrbins) {
71 evaluator1_.loadScriptString(sele1);
72 if (!evaluator1_.isDynamic()) {
73 seleMan1_.setSelectionSet(evaluator1_.evaluate());
76 deltaR_ = len_ / nRBins_;
78 histogram_.resize(nRBins_);
79 count_.resize(nRBins_);
80 avgAngleR_.resize(nRBins_);
82 setAnalysisType(
"radial density function Angle(r)");
83 setOutputName(
getPrefix(filename) +
".AngleR");
84 std::stringstream params;
85 params <<
" len = " << len_ <<
", nrbins = " << nRBins_;
86 const std::string paramString = params.str();
87 setParameterString(paramString);
90 AngleR::AngleR(SimInfo* info,
const std::string& filename,
91 const std::string& sele1,
const std::string& sele2,
92 RealType len,
int nrbins) :
93 StaticAnalyser(info, filename, nrbins),
94 doVect_(false), doOffset_(false), selectionScript1_(sele1),
95 selectionScript2_(sele2), seleMan1_(info), seleMan2_(info),
96 evaluator1_(info), evaluator2_(info), len_(len), nRBins_(nrbins) {
97 setOutputName(
getPrefix(filename) +
".AngleR");
99 evaluator1_.loadScriptString(sele1);
100 if (!evaluator1_.isDynamic()) {
101 seleMan1_.setSelectionSet(evaluator1_.evaluate());
104 evaluator2_.loadScriptString(sele2);
105 if (!evaluator2_.isDynamic()) {
106 seleMan2_.setSelectionSet(evaluator2_.evaluate());
109 deltaR_ = len_ / nRBins_;
111 histogram_.resize(nRBins_);
112 count_.resize(nRBins_);
113 avgAngleR_.resize(nRBins_);
115 setAnalysisType(
"radial density function Angle(r)");
116 setOutputName(
getPrefix(filename) +
".AngleR");
117 std::stringstream params;
118 params <<
" len = " << len_ <<
", nrbins = " << nRBins_;
119 const std::string paramString = params.str();
120 setParameterString(paramString);
123 AngleR::AngleR(SimInfo* info,
const std::string& filename,
124 const std::string& sele1,
int seleOffset, RealType len,
126 StaticAnalyser(info, filename, nrbins),
127 doVect_(false), doOffset_(true), doOffset2_(false),
128 selectionScript1_(sele1), seleMan1_(info), seleMan2_(info),
129 evaluator1_(info), evaluator2_(info), seleOffset_(seleOffset), len_(len),
131 setOutputName(
getPrefix(filename) +
".AngleR");
133 evaluator1_.loadScriptString(sele1);
134 if (!evaluator1_.isDynamic()) {
135 seleMan1_.setSelectionSet(evaluator1_.evaluate());
138 deltaR_ = len_ / nRBins_;
140 histogram_.resize(nRBins_);
141 count_.resize(nRBins_);
142 avgAngleR_.resize(nRBins_);
144 setAnalysisType(
"radial density function Angle(r)");
145 setOutputName(
getPrefix(filename) +
".AngleR");
146 std::stringstream params;
147 params <<
" len = " << len_ <<
", nrbins = " << nRBins_;
148 const std::string paramString = params.str();
149 setParameterString(paramString);
152 AngleR::AngleR(SimInfo* info,
const std::string& filename,
153 const std::string& sele1,
int seleOffset,
int seleOffset2,
154 RealType len,
int nrbins) :
155 StaticAnalyser(info, filename, nrbins),
156 doVect_(false), doOffset_(true), doOffset2_(true),
157 selectionScript1_(sele1), seleMan1_(info), seleMan2_(info),
158 evaluator1_(info), evaluator2_(info), seleOffset_(seleOffset),
159 seleOffset2_(seleOffset2), len_(len), nRBins_(nrbins) {
160 setOutputName(
getPrefix(filename) +
".AngleR");
162 evaluator1_.loadScriptString(sele1);
163 if (!evaluator1_.isDynamic()) {
164 seleMan1_.setSelectionSet(evaluator1_.evaluate());
167 histogram_.resize(nRBins_);
168 count_.resize(nRBins_);
169 avgAngleR_.resize(nRBins_);
171 setAnalysisType(
"radial density function Angle(r)");
172 setOutputName(
getPrefix(filename) +
".AngleR");
173 std::stringstream params;
174 params <<
" len = " << len_ <<
", nrbins = " << nRBins_;
175 const std::string paramString = params.str();
176 setParameterString(paramString);
179 void AngleR::process() {
185 bool usePeriodicBoundaryConditions_ =
186 info_->getSimParams()->getUsePeriodicBoundaryConditions();
188 Thermo thermo(info_);
189 DumpReader reader(info_, dumpFilename_);
190 int nFrames = reader.getNFrames();
192 nProcessed_ = nFrames / step_;
194 std::fill(avgAngleR_.begin(), avgAngleR_.end(), 0.0);
195 std::fill(histogram_.begin(), histogram_.end(), 0.0);
196 std::fill(count_.begin(), count_.end(), 0);
198 for (
int istep = 0; istep < nFrames; istep += step_) {
199 reader.readFrame(istep);
200 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
202 Vector3d CenterOfMass = thermo.getCom();
204 if (evaluator1_.isDynamic()) {
205 seleMan1_.setSelectionSet(evaluator1_.evaluate());
209 for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
210 sd1 = seleMan1_.nextSelected(ii)) {
211 Vector3d pos = sd1->getPos();
213 Vector3d r1 = CenterOfMass - pos;
217 if (sd1->isDirectional()) {
218 Vector3d vec = sd1->getA().transpose() * V3Z;
221 RealType cosangle =
dot(r1, vec);
223 if (distance < len_) {
224 int whichBin = int(distance / deltaR_);
225 histogram_[whichBin] += cosangle;
226 count_[whichBin] += 1;
232 for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
233 sd1 = seleMan1_.nextSelected(ii)) {
240 int sd1Aind = sd1->getGlobalIndex() + seleOffset2_;
241 StuntDouble* sd1A = info_->getIOIndexToIntegrableObject(sd1Aind);
242 r1 = CenterOfMass - sd1A->getPos();
244 r1 = CenterOfMass - sd1->getPos();
247 if (usePeriodicBoundaryConditions_)
248 currentSnapshot_->wrapVector(r1);
250 int sd2Index = sd1->getGlobalIndex() + seleOffset_;
251 sd2 = info_->getIOIndexToIntegrableObject(sd2Index);
253 Vector3d r2 = CenterOfMass - sd2->getPos();
254 if (usePeriodicBoundaryConditions_)
255 currentSnapshot_->wrapVector(r1);
257 Vector3d rc = 0.5 * (r1 + r2);
258 if (usePeriodicBoundaryConditions_)
259 currentSnapshot_->wrapVector(rc);
263 Vector3d vec = r1 - r2;
264 if (usePeriodicBoundaryConditions_)
265 currentSnapshot_->wrapVector(vec);
269 RealType cosangle =
dot(rc, vec);
270 if (distance < len_) {
271 int whichBin = int(distance / deltaR_);
272 histogram_[whichBin] += cosangle;
273 count_[whichBin] += 1;
277 if (evaluator2_.isDynamic()) {
278 seleMan2_.setSelectionSet(evaluator2_.evaluate());
281 if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount()) {
282 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
283 "In frame %d, the number of selected StuntDoubles are\n"
284 "\tnot the same in --sele1 and sele2\n",
286 painCave.severity = OPENMD_INFO;
287 painCave.isFatal = 0;
291 for (sd1 = seleMan1_.beginSelected(ii),
292 sd2 = seleMan2_.beginSelected(jj);
293 sd1 != NULL && sd2 != NULL; sd1 = seleMan1_.nextSelected(ii),
294 sd2 = seleMan2_.nextSelected(jj)) {
295 Vector3d r1 = CenterOfMass - sd1->getPos();
296 if (usePeriodicBoundaryConditions_)
297 currentSnapshot_->wrapVector(r1);
299 Vector3d r2 = CenterOfMass - sd2->getPos();
300 if (usePeriodicBoundaryConditions_)
301 currentSnapshot_->wrapVector(r1);
303 Vector3d rc = 0.5 * (r1 + r2);
304 if (usePeriodicBoundaryConditions_)
305 currentSnapshot_->wrapVector(rc);
307 Vector3d vec = r1 - r2;
308 if (usePeriodicBoundaryConditions_)
309 currentSnapshot_->wrapVector(vec);
315 RealType cosangle =
dot(rc, vec);
316 if (distance < len_) {
317 int whichBin = int(distance / deltaR_);
318 histogram_[whichBin] += cosangle;
319 count_[whichBin] += 1;
329 void AngleR::processHistogram() {
330 for (
unsigned int i = 0; i < histogram_.size(); ++i) {
332 avgAngleR_[i] += histogram_[i] / count_[i];
336 std::cerr <<
" count = " << count_[i] <<
" avgAngle = " << avgAngleR_[i]
341 void AngleR::writeAngleR() {
342 std::ofstream ofs(outputFilename_.c_str());
346 ofs <<
"# " << getAnalysisType() <<
"\n";
347 ofs <<
"# OpenMD " << rev.getFullRevision() <<
"\n";
348 ofs <<
"# " << rev.getBuildDate() <<
"\n";
349 ofs <<
"#nFrames:\t" << nProcessed_ <<
"\n";
350 ofs <<
"#selection1: (" << selectionScript1_ <<
")";
351 if (!doVect_) { ofs <<
"\tselection2: (" << selectionScript2_ <<
")"; }
352 if (!paramString_.empty())
353 ofs <<
"# parameters: " << paramString_ <<
"\n";
355 ofs <<
"#r\tcorrValue\n";
356 for (
unsigned int i = 0; i < avgAngleR_.size(); ++i) {
357 RealType r = deltaR_ * (i + 0.5);
358 ofs << r <<
"\t" << avgAngleR_[i] <<
"\n";
362 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
363 "AngleR: unable to open %s\n", outputFilename_.c_str());
364 painCave.isFatal = 1;
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
void normalize()
Normalizes this vector in place.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Real dot(const DynamicVector< Real > &v1, const DynamicVector< Real > &v2)
Returns the dot product of two DynamicVectors.
std::string getPrefix(const std::string &str)
Real distance(const DynamicVector< Real > &v1, const DynamicVector< Real > &v2)
Returns the distance between two DynamicVectors.