bool OBDepict::AddAtomLabels(AtomLabelType type) { d->painter->SetPenColor(OBColor("red")); d->painter->SetFillColor(OBColor("red")); d->painter->SetFontSize((int)(GetFontSize() * 0.8));// smaller text OBAtomIterator i; for (OBAtom *atom = d->mol->BeginAtom(i); atom; atom = d->mol->NextAtom(i)) { vector3 pos(atom->GetVector()); std::stringstream ss; switch (type) { case AtomId: ss << atom->GetId(); d->painter->DrawText(pos.x(), pos.y(), ss.str()); break; case AtomSymmetryClass: ss << GetAtomSymClass(atom); d->painter->DrawText(pos.x(), pos.y(), ss.str()); break; case AtomIndex: ss << atom->GetIdx(); d->painter->DrawText(pos.x(), pos.y(), ss.str()); break; default: break; } } return true; }
// OBMol::NewAtom() void testIdsNewAtom1() { OBMol mol; for (int i = 0; i < 10; ++i) { OBAtom *atom = mol.NewAtom(); OB_REQUIRE(atom->GetId() == i); } OB_REQUIRE( mol.GetAtomById(0) ); OB_REQUIRE( mol.GetAtomById(4) ); OB_REQUIRE( mol.GetAtomById(9) ); OB_REQUIRE( !mol.GetAtomById(10) ); OB_REQUIRE( mol.GetAtomById(0)->GetId() == 0 ); OB_REQUIRE( mol.GetAtomById(4)->GetId() == 4 ); OB_REQUIRE( mol.GetAtomById(9)->GetId() == 9 ); }
// OBMol::NewAtom(unsigned long id) void testIdsNewAtom2() { OBMol mol; for (int i = 0; i < 10; ++i) { OBAtom *atom = mol.NewAtom(i*2); OB_REQUIRE(atom->GetId() == i*2); } OB_REQUIRE( mol.GetAtomById(0) ); OB_REQUIRE( !mol.GetAtomById(7) ); OB_REQUIRE( mol.GetAtomById(8) ); OB_REQUIRE( !mol.GetAtomById(9) ); OB_REQUIRE( mol.GetAtomById(18) ); OB_REQUIRE( !mol.GetAtomById(19) ); OB_REQUIRE( mol.GetAtomById(0)->GetId() == 0 ); OB_REQUIRE( mol.GetAtomById(8)->GetId() == 8 ); OB_REQUIRE( mol.GetAtomById(18)->GetId() == 18 ); }
bool OBCisTransStereo::IsOnSameAtom(unsigned long id1, unsigned long id2) const { const OBMol *mol = GetMolecule(); if (!mol) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : No valid molecule set", obError); return false; } OBAtom *begin = mol->GetAtomById(m_cfg.begin); if (!begin) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Begin reference id is not valid.", obError); return false; } OBAtom *end = mol->GetAtomById(m_cfg.end); if (!end) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : End reference id is not valid.", obError); return false; } OBAtom *a = mol->GetAtomById(id1); OBAtom *b = mol->GetAtomById(id2); if (a && b) { // both on begin atom? if (a->IsConnected(begin) && b->IsConnected(begin)) return true; // both on end atom? if (a->IsConnected(end) && b->IsConnected(end)) return true; return false; } else { if (a) { // b atom not found, could be a deleted hydrogen... if (a->IsConnected(begin)) { // a is connected to begin. if this is the atom missing a hydrogen, return false if (begin->GetValence() == 2) return true; // check if the end atom really is missing an atom if (end->GetValence() != 2) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : id2 is not valid and is not a missing hydrogen.", obError); return false; } // inform user we are treating id2 as deleted hydrogen obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id2 doesn't exist anymore, must be a (deleted) hydrogen.", obInfo); } else if (a->IsConnected(end)) { // a is connected to end. again, if this is the atom missing a hydrogen, return false if (end->GetValence() == 2) return true; // check if the begin atom really is missing an atom if (begin->GetValence() != 2) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : id2 is not valid and is not a missing hydrogen.", obError); return true; } // inform user we are treating id2 as deleted hydrogen obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id2 doesn't exist, must be a (deleted) hydrogen.", obInfo); } else { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id1 isn't connected to the begin or end atom.", obError); return true; } } else if (b) { // a atom not found, could be a deleted hydrogen... if (b->IsConnected(begin)) { // b is connected to begin. if this is the atom missing a hydrogen, return false if (begin->GetValence() == 2) return true; // check if the end atom really is missing an atom if (end->GetValence() != 2) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : id1 is not valid and is not a missing hydrogen.", obError); return true; } // inform user we are treating id1 as deleted hydrogen obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id1 doesn't exist, must be a (deleted) hydrogen.", obInfo); } else if (b->IsConnected(end)) { // a is connected to end. again, if this is the atom missing a hydrogen, return false if (end->GetValence() == 2) return true; // check if the begin atom really is missing an atom if (begin->GetValence() != 2) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : id1 is not valid and is not a missing hydrogen.", obError); return true; } // inform user we are treating id2 as deleted hydrogen obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id1 doesn't exist, must be a (deleted) hydrogen.", obInfo); } else { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atom with id1 isn't connected to the begin or end atom.", obError); return true; } } else { OBAtom *c = 0, *d = 0; // no a & b, check the remaining ids which will reveal same info for (int i = 0; i < 4; ++i) { if ((m_cfg.refs.at(i) == id1) || (m_cfg.refs.at(i) == id2)) continue; if (!c) { c = mol->GetAtomById(m_cfg.refs.at(i)); } else { d = mol->GetAtomById(m_cfg.refs.at(i)); } } if (!c || !d) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : invalid stereochemistry!", obError); return true; } if ((begin->GetValence() != 2) || (end->GetValence() != 2)) { obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : invalid stereochemistry!", obError); return true; } obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Atoms with id1 & id2 don't exist, must be a (deleted) hydrogens.", obInfo); return IsOnSameAtom(c->GetId(), d->GetId()); } } return false; }