56#include "utils/Constants.hpp"
57#include "utils/simError.h"
61 HBondR::HBondR(
SimInfo* info,
const std::string& filename,
62 const std::string& sele1,
const std::string& sele2,
63 const std::string& sele3,
double rCut, RealType len,
64 double thetaCut,
int nrbins) :
66 selectionScript1_(sele1), seleMan1_(info), evaluator1_(info),
67 selectionScript2_(sele2), seleMan2_(info), evaluator2_(info),
68 selectionScript3_(sele3), seleMan3_(info), evaluator3_(info), len_(len),
70 ff_ = info_->getForceField();
72 evaluator1_.loadScriptString(sele1);
73 if (!evaluator1_.isDynamic()) {
74 seleMan1_.setSelectionSet(evaluator1_.evaluate());
76 evaluator2_.loadScriptString(sele2);
77 if (!evaluator2_.isDynamic()) {
78 seleMan2_.setSelectionSet(evaluator2_.evaluate());
80 evaluator3_.loadScriptString(sele3);
81 if (!evaluator3_.isDynamic()) {
82 seleMan3_.setSelectionSet(evaluator3_.evaluate());
89 deltaR_ = len_ / nBins_;
93 nHBonds_.resize(nBins_);
94 nDonor_.resize(nBins_);
95 nAcceptor_.resize(nBins_);
96 sliceQ_.resize(nBins_);
97 sliceCount_.resize(nBins_);
98 std::fill(sliceQ_.begin(), sliceQ_.end(), 0.0);
99 std::fill(sliceCount_.begin(), sliceCount_.end(), 0);
101 setOutputName(
getPrefix(filename) +
".hbondr");
104 void HBondR::process() {
108 Molecule::HBondDonor* hbd1;
109 Molecule::HBondDonor* hbd2;
110 std::vector<Molecule::HBondDonor*>::iterator hbdi;
111 std::vector<Molecule::HBondDonor*>::iterator hbdj;
112 std::vector<Atom*>::iterator hbai;
113 std::vector<Atom*>::iterator hbaj;
124 RealType DAdist, DHdist, theta, ctheta;
128 DumpReader reader(info_, dumpFilename_);
129 int nFrames = reader.getNFrames();
132 for (
int istep = 0; istep < nFrames; istep += step_) {
133 reader.readFrame(istep);
134 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
136 if (evaluator1_.isDynamic()) {
137 seleMan1_.setSelectionSet(evaluator1_.evaluate());
140 if (evaluator2_.isDynamic()) {
141 seleMan2_.setSelectionSet(evaluator2_.evaluate());
144 if (evaluator3_.isDynamic()) {
145 seleMan3_.setSelectionSet(evaluator3_.evaluate());
148 for (mol1 = seleMan1_.beginSelectedMolecule(ii); mol1 != NULL;
149 mol1 = seleMan1_.nextSelectedMolecule(ii)) {
154 Vector3d mPos = mol1->getCom();
156 for (mol2 = seleMan2_.beginSelectedMolecule(jj); mol2 != NULL;
157 mol2 = seleMan2_.nextSelectedMolecule(jj)) {
159 for (hbd1 = mol1->beginHBondDonor(hbdi); hbd1 != NULL;
160 hbd1 = mol1->nextHBondDonor(hbdi)) {
161 dPos = hbd1->donorAtom->getPos();
162 hPos = hbd1->donatedHydrogen->getPos();
164 currentSnapshot_->wrapVector(DH);
165 DHdist = DH.length();
168 for (hba2 = mol2->beginHBondAcceptor(hbaj); hba2 != NULL;
169 hba2 = mol2->nextHBondAcceptor(hbaj)) {
170 aPos = hba2->getPos();
172 currentSnapshot_->wrapVector(DA);
173 DAdist = DA.length();
177 if (DAdist < rCut_) {
178 ctheta =
dot(DH, DA) / (DHdist * DAdist);
179 theta = acos(ctheta) * 180.0 / Constants::PI;
182 if (theta < thetaCut_) {
192 for (hba1 = mol1->beginHBondAcceptor(hbai); hba1 != NULL;
193 hba1 = mol1->nextHBondAcceptor(hbai)) {
194 aPos = hba1->getPos();
197 for (hbd2 = mol2->beginHBondDonor(hbdj); hbd2 != NULL;
198 hbd2 = mol2->nextHBondDonor(hbdj)) {
199 dPos = hbd2->donorAtom->getPos();
202 currentSnapshot_->wrapVector(DA);
203 DAdist = DA.length();
207 if (DAdist < rCut_) {
208 hPos = hbd2->donatedHydrogen->getPos();
210 currentSnapshot_->wrapVector(DH);
211 DHdist = DH.length();
212 ctheta =
dot(DH, DA) / (DHdist * DAdist);
213 theta = acos(ctheta) * 180.0 / Constants::PI;
215 if (theta < thetaCut_) {
225 int binNo = int(r / deltaR_);
226 sliceQ_[binNo] += nHB;
227 sliceCount_[binNo] += 1;
233 void HBondR::writeDensityR() {
236 std::ofstream qRstream(outputFilename_.c_str());
237 if (qRstream.is_open()) {
238 qRstream <<
"# " << getAnalysisType() <<
"\n";
239 qRstream <<
"#selection 1: (" << selectionScript1_ <<
")\n";
240 qRstream <<
"#selection 2: (" << selectionScript2_ <<
")\n";
241 qRstream <<
"#selection 3: (" << selectionScript3_ <<
")\n";
242 if (!paramString_.empty())
243 qRstream <<
"# parameters: " << paramString_ <<
"\n";
245 qRstream <<
"#distance"
247 for (
unsigned int i = 0; i < sliceQ_.size(); ++i) {
248 RealType Rval = (i + 0.5) * deltaR_;
249 if (sliceCount_[i] != 0) {
250 qRstream << Rval <<
"\t" << sliceQ_[i] / (RealType)sliceCount_[i]
256 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
257 "HBondR: unable to open %s\n", outputFilename_.c_str());
258 painCave.isFatal = 1;
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Real length() const
Returns the length of this vector.
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)