48#include "visitors/ReplacementVisitor.hpp"
58 void ReplacementVisitor::addReplacedAtomName(
const std::string& repName) {
59 myTypes_.insert(repName);
62 bool ReplacementVisitor::isReplacedAtom(
const std::string& atomType) {
63 std::set<std::string>::iterator strIter;
64 strIter = myTypes_.find(atomType);
65 return strIter != myTypes_.end() ? true :
false;
68 void ReplacementVisitor::addSite(
const std::string& name,
69 const Vector3d& refPos) {
70 std::shared_ptr<AtomInfo> atomInfo = std::make_shared<AtomInfo>();
71 atomInfo->atomTypeName = name;
72 atomInfo->pos = refPos;
73 sites_->addAtomInfo(atomInfo);
75 void ReplacementVisitor::addSite(
const std::string& name,
76 const Vector3d& refPos,
77 const Vector3d& refVec) {
78 std::shared_ptr<AtomInfo> atomInfo = std::make_shared<AtomInfo>();
79 atomInfo->atomTypeName = name;
80 atomInfo->pos = refPos;
81 atomInfo->vec = refVec;
82 atomInfo->hasVector =
true;
83 sites_->addAtomInfo(atomInfo);
98 std::shared_ptr<AtomInfo> atomInfo;
99 std::shared_ptr<AtomData> atomData;
100 std::shared_ptr<GenericData> data;
104 if (!isReplacedAtom(datom->getType()))
return;
106 data = datom->getPropertyByName(
"ATOMDATA");
108 if (data !=
nullptr) {
109 atomData = std::dynamic_pointer_cast<AtomData>(data);
111 if (atomData ==
nullptr) {
112 std::cerr <<
"can not get Atom Data from " << datom->getType()
114 atomData = std::make_shared<AtomData>();
115 haveAtomData =
false;
119 atomData = std::make_shared<AtomData>();
120 haveAtomData =
false;
123 pos = datom->getPos();
124 vel = datom->getVel();
131 skewMat(0, 1) = j[2] / I(2, 2);
132 skewMat(0, 2) = -j[1] / I(1, 1);
133 skewMat(1, 0) = -j[2] / I(2, 2);
135 skewMat(1, 2) = j[0] / I(0, 0);
136 skewMat(2, 0) = j[1] / I(1, 1);
137 skewMat(2, 1) = -j[0] / I(0, 0);
139 Mat3x3d mat = (A * skewMat).transpose();
142 Atrans = A.transpose();
144 std::shared_ptr<AtomInfo> siteInfo;
145 std::vector<std::shared_ptr<AtomInfo>>::iterator iter;
147 for (siteInfo = sites_->beginAtomInfo(iter); siteInfo;
148 siteInfo = sites_->nextAtomInfo(iter)) {
149 newVec = Atrans * siteInfo->pos;
151 atomInfo = std::make_shared<AtomInfo>();
152 atomInfo->atomTypeName = siteInfo->atomTypeName;
153 atomInfo->pos = pos + newVec;
155 if (siteInfo->hasVector) {
156 newVec = Atrans * siteInfo->vec;
157 atomInfo->vec = newVec;
159 atomInfo->vec = V3Zero;
162 atomInfo->vel = vel + mat * siteInfo->pos;
163 atomInfo->hasVelocity =
true;
165 atomData->addAtomInfo(atomInfo);
168 atomData->setID(
"ATOMDATA");
169 datom->addProperty(atomData);
175 const std::string ReplacementVisitor::toString() {
181 "------------------------------------------------------------------\n");
184 snprintf(buffer, 65535,
"Visitor name: %s\n", visitorName.c_str());
187 snprintf(buffer, 65535,
188 "Visitor Description: replace atom with other sites\n");
193 "------------------------------------------------------------------\n");
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.