double TopparManager::getVdwRadius(MolAtomPtr pAtom, bool bExplH) { LString resn = pAtom->getResName(); TopoDB *pDB = getTopoDB(); // Resolve alias name ResiToppar *pTop = pDB->get(resn); if (pTop==NULL) return elemBasedVdw(pAtom->getElement()); LString aname = pAtom->getName(); TopAtom *pTA = pTop->getAtom(aname); if (pTA==NULL) return elemBasedVdw(pAtom->getElement()); LString atype = pTA->type; ParamDB *pPDB = getParamDB(); param::AtomVal *pPA = pPDB->getAtom(atype); if (pPA==NULL) return elemBasedVdw(pAtom->getElement()); if (bExplH) return pPA->vdwr; if (pPA->vdwhr > 0.0) return pPA->vdwhr; return pPA->vdwr; }
bool TopparManager::getCharge(MolAtomPtr pAtom, bool bExplH, const LString &ns, double &rval) { LString resn = pAtom->getResName(); TopoDB *pDB = getTopoDB(); // Resolve alias name ResiToppar *pTop = pDB->get(resn); if (pTop==NULL) return false; LString aname = pAtom->getName(); return getChargeImpl(pTop, aname, ns, bExplH, rval); /* LString ns_aname = aname; if (!ns.isEmpty()) ns_aname = ns + ":" + aname; TopAtom *pTA = pTop->getAtom(ns_aname); if (pTA==NULL) return false; if (bExplH) { rval = pTA->charge; return true; } double prot_chg = 0.0; ResiToppar::BondList *pBL= pTop->getBondList(); BOOST_FOREACH (const TopBond *pBond, *pBL) { if (pBond->a1==pTA) { if (pBond->a2->elem.equals("H")) prot_chg += pBond->a2->charge; } else if (pBond->a2==pTA) { if (pBond->a1->elem.equals("H")) prot_chg += pBond->a1->charge; } } rval = pTA->charge + prot_chg; return true; */ }
int MolCoord::appendAtom(MolAtomPtr pAtom) { pAtom->setParentUID(getUID()); const LString &cname = pAtom->getChainName(); const LString &rname = pAtom->getResName(); const LString &aname = pAtom->getName(); ResidIndex nresid = pAtom->getResIndex(); if (cname.length()<=0 || aname.length()<=0) { LString msg = LString::format("MolCoord> ERROR: appending atom with invalid properties" " (c:'%s' rn:'%s' ri:'%s' an:'%s')", cname.c_str(), rname.c_str(), nresid.toString().c_str(), aname.c_str()); MB_DPRINTLN(msg); MB_THROW(qlib::IllegalArgumentException, msg); return -1; } MolChainPtr pCh = getChain(cname); if (pCh.isnull()) { pCh = MolChainPtr(MB_NEW MolChain()); pCh->setParentUID(getUID()); pCh->setName(cname); appendChain(pCh); } MolResiduePtr pRes = pCh->getResidue(nresid); if (pRes.isnull()) { pRes = MolResiduePtr(MB_NEW MolResidue()); pRes->setParentUID(getUID()); pRes->setIndex(nresid); pRes->setName(rname); // pRes->setChainName(cname); pCh->appendResidue(pRes); } else { const LString &pre_rname = pRes->getName(); if (!pre_rname.equals(rname)) { MB_DPRINTLN("MolCoord> ERROR: appending an atom (%s %s%s %s) with inconsistent residue (%s)", cname.c_str(), rname.c_str(), nresid.toString().c_str(), aname.c_str(), pre_rname.c_str()); // TO DO: throw exception (???) // This is often the case, so is not an exception. // return -1; } } // // Append to the atompool --> assign the atom ID // int atomid = m_atomPool.put(pAtom); if (atomid<0) { // This isn't fail in normal situation. MB_THROW(qlib::RuntimeException, "append to the atompool failed"); return -1; } pAtom->setID(atomid); // MolResidue::appendAtom() must be called after setID(), // because MolResidue makes map from name to AID, which requires "AID". if (!pRes->appendAtom(pAtom)) { // This is often the case with malformed PDB files, so is not an exception. MB_DPRINTLN("MolCoord> ERROR: appending duplicated atom (%s %s%s %s)", cname.c_str(), rname.c_str(), nresid.toString().c_str(), aname.c_str()); // Remove the mis-appended atom from the pool. m_atomPool.remove(atomid); return -1; } // Update the cached xform matrix if required pAtom->resetXformMatrix(); if (!getXformMatrix().isIdent()) pAtom->setXformMatrix(getXformMatrix()); return atomid; }