static bool StandardPDBDoubleBond(RWMol *mol, Atom *beg, Atom *end) { AtomPDBResidueInfo *bInfo = (AtomPDBResidueInfo*)beg->getMonomerInfo(); if (!bInfo || bInfo->getMonomerType() != AtomMonomerInfo::PDBRESIDUE) return false; AtomPDBResidueInfo *eInfo = (AtomPDBResidueInfo*)end->getMonomerInfo(); if (!eInfo || eInfo->getMonomerType() != AtomMonomerInfo::PDBRESIDUE) return false; if (!SamePDBResidue(bInfo,eInfo)) return false; if (bInfo->getIsHeteroAtom() || eInfo->getIsHeteroAtom()) return false; const char *ptr = bInfo->getResidueName().c_str(); unsigned int rescode = BCNAM(ptr[0],ptr[1],ptr[2]); ptr = bInfo->getName().c_str(); unsigned int atm1 = BCATM(ptr[0],ptr[1],ptr[2],ptr[3]); ptr = eInfo->getName().c_str(); unsigned int atm2 = BCATM(ptr[0],ptr[1],ptr[2],ptr[3]); if (!StandardPDBDoubleBond(rescode,atm1,atm2)) return false; // Check that neither end already has a double bond ROMol::OBOND_ITER_PAIR bp; for (bp=mol->getAtomBonds(beg); bp.first!=bp.second; ++bp.first) if ((*mol)[*bp.first].get()->getBondType() == Bond::DOUBLE) return false; for (bp=mol->getAtomBonds(end); bp.first!=bp.second; ++bp.first) if ((*mol)[*bp.first].get()->getBondType() == Bond::DOUBLE) return false; return true; }