int MolCoord::appendAtomScrHelper(MolAtomPtr pAtom, const LString &ch, ResidIndex resid, const LString &resn) { qlib::uid_t nuid = pAtom->getParentUID(); if (nuid!=qlib::invalid_uid) { // pAtom has been already belonged to other mol // --> ERROR!! MB_DPRINTLN("MolCoord.appendAtom> ERROR, pAtom already belongs to mol %d ().", nuid); return -1; } pAtom->setParentUID(getUID()); pAtom->setChainName(ch); pAtom->setResIndex(resid); if (resn.isEmpty()) { // res name is determined by chain name and resindex MolResiduePtr pRes = getResidue(ch, resid); if (pRes.isnull()) { // ERROR!! cannot determine the residue to append to return -1; } pAtom->setResName(pRes->getName()); } else { pAtom->setResName(resn); } return appendAtom(pAtom); }
bool MolCoord::removeAtom(int atomid) { MolAtomPtr pAtom = getAtom(atomid); if (pAtom.isnull() || pAtom->getParentUID()!=getUID()) return false; m_atomPool.remove(atomid); // invalidate ID pAtom->setID(-1); const LString &aname = pAtom->getName(); char cConfID = pAtom->getConfID(); ResidIndex nresid = pAtom->getResIndex(); const LString &cname = pAtom->getChainName(); MolChainPtr pCh = getChain(cname); if (pCh.isnull()) return false; MolResiduePtr pRes = getResidue(cname, nresid); if (pRes.isnull()) return false; // remove atom if (!pRes->removeAtom(aname, cConfID)) return false; if (pRes->getAtomSize()>0) return true; // purge the empty residue if (!pCh->removeResidue(nresid)) return false; // delete pRes; if (pCh->getSize()>0) return true; // purge the empty chain if (!removeChain(cname)) return false; // delete pCh; return true; }