18#include "rxdock/Config.h"
19#include "rxdock/Coord.h"
20#include "rxdock/PMF.h"
21#include "rxdock/Quat.h"
22#include "rxdock/TriposAtomType.h"
26#include <nlohmann/json.hpp>
28using json = nlohmann::json;
39 bool operator()(
Bond *pBond1,
Bond *pBond2)
const;
45typedef std::map<Bond *, bool, BondPCmp_BondId> BondMap;
46typedef BondMap::iterator BondMapIter;
47typedef BondMap::const_iterator BondMapConstIter;
74 explicit Atom(
int nAtomId,
int nAtomicNo = 6, std::string strAtomName =
"C",
75 std::string strSubunitId =
"1",
76 std::string strSubunitName =
"RES",
77 std::string strSegmentName =
"SEG1",
80 unsigned int nHydrogens = 0,
int nFormalCharge = 0);
99 RBTDLL_EXPORT
friend std::ostream &operator<<(std::ostream &s,
101 friend void to_json(json &j,
const Atom &atom);
102 friend void from_json(
const json &j,
Atom &atom);
106 virtual std::ostream &Print(std::ostream &s)
const;
116 RBTDLL_EXPORT
bool GetEnabled()
const;
119 int GetAtomId()
const {
return m_nAtomId; }
120 void SetAtomId(
const int nAtomId) { m_nAtomId = nAtomId; }
123 int GetAtomicNo()
const {
return m_nAtomicNo; }
124 void SetAtomicNo(
const int nAtomicNo) { m_nAtomicNo = nAtomicNo; }
127 std::string GetName()
const {
return m_strAtomName; }
128 void SetAtomName(
const std::string &strAtomName) {
129 m_strAtomName = strAtomName;
131 RBTDLL_EXPORT std::string
132 GetFullAtomName()
const;
136 std::string GetSubunitId()
const {
return m_strSubunitId; }
137 void SetSubunitId(
const std::string &strSubunitId) {
138 m_strSubunitId = strSubunitId;
142 std::string GetSubunitName()
const {
return m_strSubunitName; }
143 void SetSubunitName(
const std::string &strSubunitName) {
144 m_strSubunitName = strSubunitName;
148 std::string GetSegmentName()
const {
return m_strSegmentName; }
149 void SetSegmentName(
const std::string &strSegmentName) {
150 m_strSegmentName = strSegmentName;
154 eHybridState GetHybridState()
const {
return m_eState; }
155 void SetHybridState(
const eHybridState eState) { m_eState = eState; }
158 unsigned int GetNumImplicitHydrogens()
const {
return m_nHydrogens; }
159 void SetNumImplicitHydrogens(
const unsigned int nHydrogens) {
160 m_nHydrogens = nHydrogens;
164 int GetFormalCharge()
const {
return m_nFormalCharge; }
165 void SetFormalCharge(
const int nFormalCharge) {
166 m_nFormalCharge = nFormalCharge;
170 bool GetCyclicFlag()
const {
return m_bCyclic; }
171 void SetCyclicFlag(
bool bCyclic =
true) { m_bCyclic = bCyclic; }
175 bool GetSelectionFlag()
const {
return m_bSelected; }
176 void SetSelectionFlag(
bool bSelected =
true) { m_bSelected = bSelected; }
177 void InvertSelectionFlag() { m_bSelected = !m_bSelected; }
180 bool GetUser1Flag()
const {
return m_bUser1; }
181 void SetUser1Flag(
bool bUser1 =
true) { m_bUser1 = bUser1; }
184 double GetUser1Value()
const {
return m_dUser1; }
185 void SetUser1Value(
double dUser1 = 0.0) { m_dUser1 = dUser1; }
188 double GetUser2Value()
const {
return m_dUser2; }
189 void SetUser2Value(
double dUser2 = 0.0) { m_dUser2 = dUser2; }
192 Model *GetModelPtr()
const {
return m_pModel; }
193 void SetModelPtr(
Model *pModel =
nullptr) { m_pModel = pModel; }
197 unsigned int GetNumBonds()
const {
return m_bondMap.size(); }
201 const BondMap &GetBondMap()
const {
return m_bondMap; }
204 bool AddBond(
Bond *pBond);
207 bool RemoveBond(
Bond *pBond);
209 unsigned int GetNumCyclicBonds()
const;
211 BondMap GetCyclicBondMap()
const;
213 int GetTotalFormalBondOrder()
const;
215 int GetMaxFormalBondOrder()
const;
227 const Coord &GetCoords()
const {
return m_coord; }
228 double GetX()
const {
return m_coord.xyz(0); }
229 double GetY()
const {
return m_coord.xyz(1); }
230 double GetZ()
const {
return m_coord.xyz(2); }
232 void SetCoords(
const Coord &coord) { m_coord = coord; }
233 void SetCoords(
const double x,
const double y,
const double z) {
238 void SetX(
const double x) { m_coord.xyz(0) = x; }
239 void SetY(
const double y) { m_coord.xyz(1) = y; }
240 void SetZ(
const double z) { m_coord.xyz(2) = z; }
243 double GetPartialCharge()
const {
return m_dPartialCharge; }
244 void SetPartialCharge(
const double dPartialCharge) {
245 m_dPartialCharge = dPartialCharge;
249 double GetGroupCharge()
const {
return m_dGroupCharge; }
250 void SetGroupCharge(
const double dGroupCharge) {
251 m_dGroupCharge = dGroupCharge;
255 double GetAtomicMass()
const {
return m_dAtomicMass; }
256 void SetAtomicMass(
const double dAtomicMass) { m_dAtomicMass = dAtomicMass; }
259 double GetVdwRadius()
const {
return m_dVdwRadius; }
260 void SetVdwRadius(
const double dVdwRadius) { m_dVdwRadius = dVdwRadius; }
263 std::string GetFFType()
const {
return m_strFFType; }
264 void SetFFType(
const std::string &strFFType) { m_strFFType = strFFType; }
265 PMFType GetPMFType()
const {
return m_nPMFType; }
266 void SetPMFType(PMFType aType) { m_nPMFType = aType; }
267 TriposAtomType::eType GetTriposType()
const {
return m_triposType; }
268 void SetTriposType(TriposAtomType::eType aType) { m_triposType = aType; }
284 void SaveCoords(
unsigned int coordNum = 0);
285 void RevertCoords(
unsigned int coordNum = 0);
288 void Translate(
const Vector &vector) { m_coord += vector; }
290 void Translate(
const double vx,
const double vy,
const double vz) {
291 m_coord +=
Coord(vx, vy, vz);
295 void RotateUsingQuat(
const Quat &q) { m_coord = q.Rotate(m_coord); }
301 unsigned int GetCoordinationNumber()
const;
305 unsigned int GetCoordinationNumber(
int nAtomicNo)
const;
308 unsigned int GetCoordinationNumber(
const std::string &strFFType)
const;
311 unsigned int GetCoordinationNumber(eHybridState e)
const;
327 std::string m_strAtomName;
328 std::string m_strSubunitId;
329 std::string m_strSubunitName;
330 std::string m_strSegmentName;
331 eHybridState m_eState;
332 unsigned int m_nHydrogens;
344 TriposAtomType::eType m_triposType;
349 double m_dPartialCharge;
350 double m_dGroupCharge;
351 double m_dAtomicMass;
353 std::string m_strFFType;
356 UIntCoordMap m_savedCoords;
362typedef std::vector<AtomPtr> AtomList;
363typedef AtomList::iterator AtomListIter;
364typedef AtomList::const_iterator AtomListConstIter;
366typedef std::vector<Atom *> AtomRList;
367typedef AtomRList::iterator AtomRListIter;
368typedef AtomRList::const_iterator AtomRListConstIter;
370typedef std::vector<AtomList>
372typedef AtomListList::iterator AtomListListIter;
373typedef AtomListList::const_iterator AtomListListConstIter;
375typedef std::vector<AtomRList>
377typedef AtomRListList::iterator AtomRListListIter;
378typedef AtomRListList::const_iterator AtomRListListConstIter;
380typedef std::list<AtomPtr> AtomTrueList;
381typedef AtomTrueList::iterator AtomTrueListIter;
382typedef AtomTrueList::const_iterator AtomTrueListConstIter;
388std::ostream &operator<<(std::ostream &s,
const Atom &atom);
390void to_json(json &j,
const Atom &atom);
391void from_json(
const json &j,
Atom &site);
400inline double BondLength(
Atom *pAtom1,
Atom *pAtom2) {
401 return Length(pAtom1->GetCoords(), pAtom2->GetCoords());
406inline double BondAngle(Atom *pAtom1, Atom *pAtom2, Atom *pAtom3) {
407 return Angle(pAtom1->GetCoords(), pAtom2->GetCoords(), pAtom3->GetCoords());
412inline double BondDihedral(Atom *pAtom1, Atom *pAtom2, Atom *pAtom3,
414 return Dihedral(pAtom1->GetCoords(), pAtom2->GetCoords(), pAtom3->GetCoords(),
415 pAtom4->GetCoords());
423std::string ConvertHybridStateToString(Atom::eHybridState eState);
425std::string ConvertFormalChargeToString(
int nCharge);
438 bool operator()(
Atom *pAtom)
const {
return pAtom->GetEnabled(); }
445 bool operator()(
Atom *pAtom)
const {
return pAtom->GetSelectionFlag(); }
452 bool operator()(
const Atom *pAtom)
const {
return pAtom->GetCyclicFlag(); }
459 bool operator()(
const Atom *pAtom)
const {
460 return (pAtom->GetNumCyclicBonds() > 2);
469 RBTDLL_EXPORT
bool operator()(
const Atom *)
const;
478 RBTDLL_EXPORT
bool operator()(
const Atom *)
const;
486 bool operator()(
const Atom *pAtom)
const {
487 return (pAtom->GetFormalCharge() != 0);
496 bool operator()(
const Atom *pAtom)
const {
497 return (pAtom->GetFormalCharge() > 0);
506 bool operator()(
const Atom *pAtom)
const {
507 return (pAtom->GetFormalCharge() < 0);
515 bool operator()(
const Atom *pAtom)
const {
516 return (pAtom->GetNumImplicitHydrogens() > 0);
526 bool operator()(
const Atom *)
const;
531class isPiAtom :
public std::function<bool(Atom *)> {
534 RBTDLL_EXPORT
bool operator()(
const Atom *)
const;
543 bool operator()(
const Atom *pAtom)
const {
return pAtom->GetAtomicNo() == n; }
551 explicit isFFType_eq(std::string ss) : s(std::move(ss)) {}
552 bool operator()(
const Atom *pAtom)
const {
return pAtom->GetFFType() == s; }
561 bool operator()(
const Atom *pAtom)
const {
return pAtom->GetName() == s; }
570 bool operator()(
const Atom *pAtom)
const {
571 return pAtom->GetSubunitName() == s;
581 bool operator()(
const Atom *pAtom)
const {
582 return pAtom->GetSubunitId() == s;
592 bool operator()(
const Atom *pAtom)
const {
593 return pAtom->GetSegmentName() == s;
599 Atom::eHybridState e;
603 bool operator()(
const Atom *pAtom)
const {
604 return pAtom->GetHybridState() == e;
615 bool operator()(
const Atom *pAtom1,
const Atom *pAtom2)
const {
616 return pAtom1 == pAtom2;
623class isAtom_eq :
public std::function<bool(Atom *, Atom *)> {
626 bool operator()(
const Atom *pAtom1,
const Atom *pAtom2)
const {
627 return ((pAtom1->GetSubunitId() == pAtom2->GetSubunitId()) &&
628 (pAtom1->GetSubunitName() == pAtom2->GetSubunitName()) &&
629 (pAtom1->GetName() == pAtom2->GetName()));
639 bool operator()(
const Atom *pAtom1,
const Atom *pAtom2)
const {
640 return (pAtom1->GetAtomId() == pAtom2->GetAtomId());
651 : c(cc), r2(rr * rr) {}
652 bool operator()(
const Atom *pAtom)
const {
653 return Length2(pAtom->GetCoords() - c) <= r2;
665 : cmin(ccmin), cmax(ccmax) {}
666 bool operator()(
const Atom *pAtom)
const {
668 const Coord &c = pAtom->GetCoords();
669 return (c >= cmin) && (c <= cmax);
680 : cl(ccl), r2(rr * rr) {}
681 bool operator()(
const Atom *pAtom)
const;
687 AtomList bondedAtomList1;
691 bool operator()(
Atom *spAtom2)
const;
697 AtomList bondedAtomList1;
701 bool operator()(
Atom *pAtom2)
const;
708 bool operator()(
const Atom *)
const;
754 bool operator()(
const Atom *pAtom)
const {
755 return (std::fabs(pAtom->GetGroupCharge()) > 0.001);
764 bool operator()(
const Atom *pAtom)
const {
765 return (pAtom->GetGroupCharge() > 0.001);
774 bool operator()(
const Atom *pAtom)
const {
775 return (pAtom->GetGroupCharge() < -0.001);
790 bool operator()(
const Atom *pAtom)
const {
791 return bIsCationic(pAtom) && bIsCarbon(pAtom) && bIsPi(pAtom) &&
802 RBTDLL_EXPORT
bool operator()(
const Atom *pAtom)
const;
819 : isSP3(Atom::SP3), isSP2(Atom::SP2), isO(8), isN(7) {}
820 RBTDLL_EXPORT
bool operator()(
Atom *pAtom)
const;
840 Atom::eHybridState hybrid;
845 : eCNType(TOTAL), n(nn), atNo(0), ffType(
""), hybrid(Atom::UNDEFINED) {}
848 : eCNType(ATNO), n(nn), atNo(nAt), ffType(
""), hybrid(Atom::UNDEFINED) {}
851 : eCNType(FFTYPE), n(nn), atNo(0), ffType(std::move(strType)),
852 hybrid(Atom::UNDEFINED) {}
855 : eCNType(HYBRID), n(nn), atNo(0), ffType(
""), hybrid(eState) {}
856 bool operator()(
Atom *pAtom)
const {
859 return pAtom->GetCoordinationNumber() == n;
861 return pAtom->GetCoordinationNumber(atNo) == n;
863 return pAtom->GetCoordinationNumber(ffType) == n;
865 return pAtom->GetCoordinationNumber(hybrid) == n;
880 bool operator()(
Atom *pAtom1,
Atom *pAtom2)
const {
881 return pAtom1->GetAtomId() < pAtom2->GetAtomId();
888 bool operator()(
Atom *pAtom1,
Atom *pAtom2)
const {
889 return pAtom1->GetAtomicNo() < pAtom2->GetAtomicNo();
896 bool operator()(
Atom *pAtom1,
Atom *pAtom2)
const {
897 return pAtom1->GetName() < pAtom2->GetName();
904 bool operator()(
Atom *pAtom1,
Atom *pAtom2)
const {
return pAtom1 < pAtom2; }
914inline const Coord &ExtractAtomCoord(
Atom *pAtom) {
return pAtom->GetCoords(); }
917inline double AccumAtomicMass(
double val, Atom *pAtom) {
918 return val + pAtom->GetAtomicMass();
922inline Coord AccumMassWeightedCoords(
const Coord &val, Atom *pAtom) {
923 return val + pAtom->GetAtomicMass() * pAtom->GetCoords();
932 void operator()(
Atom *pAtom) { pAtom->Translate(v); }
942 void operator()(
Atom *pAtom) {
943 if (pAtom->GetSelectionFlag())
954 void operator()(
Atom *pAtom) { pAtom->RotateUsingQuat(q); }
964 void operator()(
Atom *pAtom) {
965 if (pAtom->GetSelectionFlag())
966 pAtom->RotateUsingQuat(q);
976 void operator()(
Atom *pAtom) { pAtom->SetSelectionFlag(b); }
983 void operator()(
Atom *pAtom) { pAtom->InvertSelectionFlag(); }
991 void operator()(
Atom *pAtom);
1000 void operator()(
Atom *pAtom) { pAtom->SetCyclicFlag(b); }
1010template <
class Predicate>
1011unsigned int GetNumAtomsWithPredicate(
const AtomList &atomList,
1012 const Predicate &pred) {
1013 return std::count_if(atomList.begin(), atomList.end(), pred);
1017template <
class Predicate>
1018AtomList GetAtomListWithPredicate(
const AtomList &atomList,
1019 const Predicate &pred) {
1020 AtomList newAtomList;
1021 std::copy_if(atomList.begin(), atomList.end(),
1022 std::back_inserter(newAtomList), pred);
1027template <
class Predicate>
1028AtomListIter FindAtomInList(AtomList &atomList,
const Predicate &pred) {
1029 return std::find_if(atomList.begin(), atomList.end(), pred);
1033void SetAtomSelectionFlagsInList(AtomList &atomList,
bool bSelected =
true);
1034void InvertAtomSelectionFlags(AtomList &atomList);
1036inline unsigned int GetNumSelectedAtomsInList(
const AtomList &atomList) {
1037 return GetNumAtomsWithPredicate(atomList, isAtomSelected());
1040inline AtomList GetSelectedAtomsFromList(
const AtomList &atomList) {
1041 return GetAtomListWithPredicate(atomList, isAtomSelected());
1045void SetAtomCyclicFlagsInList(AtomList &atomList,
bool bCyclic =
true);
1047inline unsigned int GetNumCyclicAtomsInList(
const AtomList &atomList) {
1048 return GetNumAtomsWithPredicate(atomList, isAtomCyclic());
1050inline AtomList GetCyclicAtomsFromList(
const AtomList &atomList) {
1051 return GetAtomListWithPredicate(atomList, isAtomCyclic());
1055inline unsigned int GetNumHBondAcceptorAtomsInList(
const AtomList &atomList) {
1056 return GetNumAtomsWithPredicate(atomList, isAtomHBondAcceptor());
1058inline AtomList GetHBondAcceptorAtomsFromList(
const AtomList &atomList) {
1059 return GetAtomListWithPredicate(atomList, isAtomHBondAcceptor());
1063inline unsigned int GetNumHBondDonorAtomsInList(
const AtomList &atomList) {
1064 return GetNumAtomsWithPredicate(atomList, isAtomHBondDonor());
1066inline AtomList GetHBondDonorAtomsFromList(
const AtomList &atomList) {
1067 return GetAtomListWithPredicate(atomList, isAtomHBondDonor());
1071inline unsigned int GetNumChargedAtomsInList(
const AtomList &atomList) {
1072 return GetNumAtomsWithPredicate(atomList, isAtomCharged());
1074inline AtomList GetChargedAtomsFromList(
const AtomList &atomList) {
1075 return GetAtomListWithPredicate(atomList, isAtomCharged());
1079inline unsigned int GetNumPlanarAtomsInList(
const AtomList &atomList) {
1080 return GetNumAtomsWithPredicate(atomList, isAtomPlanar());
1082inline AtomList GetPlanarAtomsFromList(
const AtomList &atomList) {
1083 return GetAtomListWithPredicate(atomList, isAtomPlanar());
1133AtomPtr GetBondedAtomPtr(std::pair<Bond *, bool> bondBoolPair);
1139unsigned int GetNumBondedAtoms(
const BondMap &bondMap);
1140AtomList GetBondedAtomList(
const BondMap &bondMap);
1145unsigned int GetNumBondedAtoms(
const Atom *pAtom);
1146RBTDLL_EXPORT AtomList GetBondedAtomList(
const Atom *pAtom);
1151inline unsigned int GetNumAtomsWithAtomicNo_eq(
const AtomList &atomList,
1153 return GetNumAtomsWithPredicate(atomList, isAtomicNo_eq(nAtomicNo));
1155inline AtomList GetAtomListWithAtomicNo_eq(
const AtomList &atomList,
1157 return GetAtomListWithPredicate(atomList, isAtomicNo_eq(nAtomicNo));
1161inline unsigned int GetNumAtomsWithFFType_eq(
const AtomList &atomList,
1162 std::string strFFType) {
1163 return GetNumAtomsWithPredicate(atomList, isFFType_eq(std::move(strFFType)));
1165inline AtomList GetAtomListWithFFType_eq(
const AtomList &atomList,
1166 std::string strFFType) {
1167 return GetAtomListWithPredicate(atomList, isFFType_eq(std::move(strFFType)));
1171inline unsigned int GetNumAtomsWithAtomName_eq(
const AtomList &atomList,
1172 std::string strAtomName) {
1173 return GetNumAtomsWithPredicate(atomList,
1174 isAtomName_eq(std::move(strAtomName)));
1176inline AtomList GetAtomListWithAtomName_eq(
const AtomList &atomList,
1177 std::string strAtomName) {
1178 return GetAtomListWithPredicate(atomList,
1179 isAtomName_eq(std::move(strAtomName)));
1189unsigned int GetNumMatchingAtoms(
const AtomList &atomList1,
1190 const AtomList &atomList2);
1191AtomList GetMatchingAtomList(
const AtomList &atomList1,
1192 const AtomList &atomList2);
1206unsigned int GetNumMatchingAtoms(
const AtomList &atomList,
1207 const std::string &strFullName);
1208AtomList GetMatchingAtomList(
const AtomList &atomList,
1209 const std::string &strFullName);
1214unsigned int GetNumMatchingAtoms(
const AtomList &atomList,
1215 const std::vector<std::string> &fullNameList);
1216AtomList GetMatchingAtomList(
const AtomList &atomList,
1217 const std::vector<std::string> &fullNameList);
1224inline void TranslateAtoms(
const AtomList &atomList,
const Vector &v) {
1225 std::for_each(atomList.begin(), atomList.end(), TranslateAtom(v));
1229inline void TranslateSelectedAtoms(
const AtomList &atomList,
const Vector &v) {
1230 std::for_each(atomList.begin(), atomList.end(), TranslateAtomIfSelected(v));
1234inline void RotateAtomsUsingQuat(
const AtomList &atomList,
const Quat &q) {
1235 std::for_each(atomList.begin(), atomList.end(), RotateAtomUsingQuat(q));
1239inline void RotateSelectedAtomsUsingQuat(
const AtomList &atomList,
1241 std::for_each(atomList.begin(), atomList.end(),
1242 RotateAtomUsingQuatIfSelected(q));
1246void SaveAtomCoords(
const AtomList &atomList,
unsigned int coordNum = 0);
1248void RevertAtomCoords(
const AtomList &atomList,
unsigned int coordNum = 0);
1252double GetTotalAtomicMass(
const AtomList &atomList);
1255Coord GetCenterOfAtomicMass(
const AtomList &atomList);
1258CoordList GetCoordList(
const AtomList &atomList);
1260RBTDLL_EXPORT
void GetCoordList(
const AtomList &atomList, CoordList &coordList);
1267void PrintQuantaCSDFormat(
const AtomList &atomList, std::ostream &s,
1268 int nColor = 2,
int nFormat = 0);
1275void RemoveZwitterions(AtomList &atomList);
Definition SmartPointer.h:48