void OBChargeModel::FillChargeVectors(OBMol &mol) { OBAtom *atom; vector<OBAtom*>::iterator itr; m_partialCharges.clear(); m_partialCharges.reserve(mol.NumAtoms()); m_formalCharges.clear(); m_formalCharges.reserve(mol.NumAtoms()); for (atom = mol.BeginAtom(itr);atom;atom = mol.NextAtom(itr)) { m_partialCharges.push_back(atom->GetPartialCharge()); m_formalCharges.push_back((double)(atom->GetFormalCharge())); } }
bool ReadHIN(istream &ifs,OBMol &mol, const char *title) { // Right now only read in the first molecule int i; int max, bo; char buffer[BUFF_SIZE]; string str,str1; double x,y,z; OBAtom *atom; vector<string> vs; ifs.getline(buffer, BUFF_SIZE); while (strstr(buffer,"mol") == NULL) ifs.getline(buffer, BUFF_SIZE); ifs.getline(buffer, BUFF_SIZE); mol.BeginModify(); while (strstr(buffer,"endmol") == NULL) { tokenize(vs,buffer); // Don't really know how long it'll be if (vs.size() < 11) break; atom = mol.NewAtom(); atom->SetAtomicNum(etab.GetAtomicNum(vs[3].c_str())); x = atof((char*)vs[7].c_str()); y = atof((char*)vs[8].c_str()); z = atof((char*)vs[9].c_str()); atom->SetVector(x,y,z); max = 11 + 2 * atoi((char *)vs[10].c_str()); for (i = 11; i < max; i+=2) { switch(((char*)vs[i+1].c_str())[0]) // First char in next token { case 's': bo = 1; break; case 'd': bo = 2; break; case 't': bo = 3; break; case 'a': bo = 5; break; default : bo = 1; break; } mol.AddBond(mol.NumAtoms(), atoi((char *)vs[i].c_str()), bo); } ifs.getline(buffer, BUFF_SIZE); } mol.EndModify(); mol.SetTitle(title); return(true); }
void testIdsAddAtom() { OBMol mol; // add 5 atoms for (int i = 0; i < 5; ++i) mol.NewAtom(); OBAtom a; a.SetAtomicNum(6); // add a sixth atom mol.AddAtom(a); OB_REQUIRE( mol.NumAtoms() == 6 ); OB_REQUIRE( mol.GetAtomById(5) ); OB_REQUIRE( mol.GetAtomById(5)->GetId() == 5 ); }
OBMolAtomDFSIter::OBMolAtomDFSIter(OBMol &mol, int StartIndex): _parent(&mol), _ptr(_parent->GetAtom(StartIndex)) { _notVisited.Resize(_parent->NumAtoms()); _notVisited.Negate(); // all on _notVisited.SetBitOff(_ptr->GetIdx() - 1); vector<OBBond*>::iterator i; OBAtom *a; for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i)) { _stack.push(a); _notVisited.SetBitOff(a->GetIdx() - 1); } }
bool WriteGromos96(ostream &ofs,OBMol &mol,double fac) { char type_name[10]; char res_name[10],padded_name[10]; char buffer[BUFF_SIZE]; int res_num; sprintf(buffer,"#GENERATED BY OPEN BABEL %s",BABEL_VERSION); ofs << buffer << endl; /* GROMOS wants a TITLE block, so let's write one*/ sprintf(buffer,"TITLE\n%s\nEND",mol.GetTitle()); ofs << buffer << endl; ofs << "POSITION" << endl; OBAtom *atom; OBResidue *res; vector<OBNodeBase*>::iterator i; for(atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i)) { if (res = atom->GetResidue()) { strcpy(res_name,(char*)res->GetName().c_str()); strcpy(type_name,(char*)res->GetAtomID(atom).c_str()); res_num = res->GetNum(); } else { strcpy(type_name,etab.GetSymbol(atom->GetAtomicNum())); strcpy(res_name,"UNK"); sprintf(padded_name,"%2s",type_name); strcpy(type_name,padded_name); res_num = 1; } sprintf(buffer,"%5d %5s %5s %6d %15.5f %15.5f %15.5f", res_num,res_name,type_name,atom->GetIdx(), atom->x()*fac,atom->y()*fac,atom->z()*fac); ofs << buffer << endl; if (!(atom->GetIdx()%10)) { sprintf(buffer,"# %d",atom->GetIdx()); ofs << buffer << endl; } } ofs << "END" << endl; return(true); }
bool BoxFormat::ReadMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = pOb->CastAndClear<OBMol>(); if(pmol==NULL) return false; //Define some references so we can use the old parameter names istream &ifs = *pConv->GetInStream(); OBMol &mol = *pmol; const char* title = pConv->GetTitle(); char buffer[BUFF_SIZE]; vector<string> vs; vector<string>::iterator i; OBAtom atom; mol.BeginModify(); while (ifs.getline(buffer,BUFF_SIZE) && !EQn(buffer,"END",3)) { if (EQn(buffer,"ATOM",4)) { string sbuf = &buffer[6]; /* X, Y, Z */ string x = sbuf.substr(24,8); string y = sbuf.substr(32,8); string z = sbuf.substr(40,8); vector3 v(atof(x.c_str()),atof(y.c_str()),atof(z.c_str())); atom.SetVector(v); if (!mol.AddAtom(atom)) return(false); } if (EQn(buffer,"CONECT",6)) { tokenize(vs,buffer); if (!vs.empty() && vs.size() > 2) for (i = vs.begin(),i+=2; i != vs.end(); i++) mol.AddBond(atoi(vs[1].c_str()),atoi((*i).c_str()),1); } } mol.EndModify(); mol.SetTitle(title); return(true); }
void WriteCharges(ostream &ofs,OBMol &mol) { unsigned int i; OBAtom *atom; char buffer[BUFF_SIZE]; for(i = 1;i <= mol.NumAtoms(); i++) { atom = mol.GetAtom(i); sprintf(buffer,"%4s%4d % 2.10f", etab.GetSymbol(atom->GetAtomicNum()), i, atom->GetPartialCharge()); ofs << buffer << endl; } }
OBMolAtomDFSIter::OBMolAtomDFSIter(OBMol *mol, int StartIndex): _parent(mol), _ptr(_parent->GetAtom(StartIndex)) { _notVisited.Resize(_parent->NumAtoms()); _notVisited.SetRangeOn(0, _parent->NumAtoms() - 1); if (!_ptr) return; _notVisited.SetBitOff(_ptr->GetIdx() - 1); vector<OBBond*>::iterator i; OBAtom *a; for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i)) { _stack.push(a); _notVisited.SetBitOff(a->GetIdx() - 1); } }
void ReportFormat::WriteCharges(ostream &ofs,OBMol &mol) { unsigned int i; OBAtom *atom; char buffer[BUFF_SIZE]; for(i = 1;i <= mol.NumAtoms(); i++) { atom = mol.GetAtom(i); snprintf(buffer, BUFF_SIZE, "%4s%4d % 2.10f", OBElements::GetSymbol(atom->GetAtomicNum()), i, atom->GetPartialCharge()); ofs << buffer << "\n"; } }
// 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 ); }
/** \brief Traverse a potentially aromatic cycle starting at @p root. \return True if the cycle is likely aromatic \param root The initial, "root" atom in traversing this ring \param atom The current atom to visit and check \param prev The bond traversed in moving to this @p atom \param er The min and max number of pi electrons for this ring \param depth The maximum number of atoms to visit in a ring (e.g., 6) This method traverses a potentially aromatic ring, adding up the possible pi electrons for each atom. At the end (e.g., when @p atom == @p root) the Huekel 4n+2 rule is checked to see if there is a possible electronic configuration which corresponds to aromaticity. **/ bool OBAromaticTyper::TraverseCycle(OBAtom *root, OBAtom *atom, OBBond *prev, std::pair<int,int> &er,int depth) { if (atom == root) { int i; for (i = er.first;i <= er.second;++i) if (i%4 == 2 && i > 2) return(true); return(false); } if (!depth || !_vpa[atom->GetIdx()] || _visit[atom->GetIdx()]) return(false); bool result = false; depth--; er.first += _velec[atom->GetIdx()].first; er.second += _velec[atom->GetIdx()].second; _visit[atom->GetIdx()] = true; OBAtom *nbr; vector<OBBond*>::iterator i; for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i)) if (*i != prev && (*i)->IsInRing() && _vpa[nbr->GetIdx()]) { if (TraverseCycle(root,nbr,(OBBond*)(*i),er,depth)) { result = true; ((OBBond*) *i)->SetAromatic(); } } _visit[atom->GetIdx()] = false; if (result) atom->SetAromatic(); er.first -= _velec[atom->GetIdx()].first; er.second -= _velec[atom->GetIdx()].second; return(result); }
void WriteChiral(ostream &ofs,OBMol &mol) { OBAtom *atom; vector<OBNodeBase*>::iterator i; char buffer[BUFF_SIZE]; for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i)) { if (atom->IsChiral()) { sprintf(buffer,"%4s %5d is chiral: %s", etab.GetSymbol(atom->GetAtomicNum()), atom->GetIdx(), (atom->IsClockwise() ? "clockwise" : "counterclockwise")); ofs << buffer << endl; } } }
// 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 ); }
void OBAromaticTyper::PropagatePotentialAromatic(OBAtom *atom) { int count = 0; OBAtom *nbr; vector<OBBond*>::iterator i; for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i)) if ((*i)->IsInRing() && _vpa[nbr->GetIdx()]) count++; if (count < 2) { _vpa[atom->GetIdx()] = false; if (count == 1) for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i)) if ((*i)->IsInRing() && _vpa[nbr->GetIdx()]) PropagatePotentialAromatic(nbr); } }
BoundingBox NXOpenGLRenderingEngine::GetBoundingBox(OBMol *const molPtr) { BoundingBox bbox; OBAtomIterator atomIter; OBAtom *atomPtr = NULL; for(atomPtr = molPtr->BeginAtom(atomIter); atomPtr != NULL; atomPtr = molPtr->NextAtom(atomIter)) { Vector atomPos(real(atomPtr->GetX()), real(atomPtr->GetY()), real(atomPtr->GetZ())); bbox += atomPos; } return bbox; }
bool CacaoFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(pmol==NULL) return false; //Define some references so we can use the old parameter names ostream &ofs = *pConv->GetOutStream(); OBMol &mol = *pmol; OBAtom *atom; char buffer[BUFF_SIZE]; vector<OBAtom*>::iterator i; snprintf(buffer, BUFF_SIZE, "%s\n",mol.GetTitle()); ofs << buffer; snprintf(buffer, BUFF_SIZE, "%3d DIST 0 0 0\n",mol.NumAtoms()); ofs << buffer; if (!mol.HasData(OBGenericDataType::UnitCell)) ofs << "CELL 1.,1.,1.,90.,90.,90.\n"; else { OBUnitCell *uc = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell); snprintf(buffer, BUFF_SIZE, "CELL %f,%f,%f,%f,%f,%f\n", uc->GetA(), uc->GetB(), uc->GetC(), uc->GetAlpha(), uc->GetBeta(), uc->GetGamma()); ofs << buffer; } for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i)) { snprintf(buffer,BUFF_SIZE,"%2s %7.4f, %7.4f, %7.4f\n", etab.GetSymbol(atom->GetAtomicNum()), atom->x(), atom->y(), atom->z()); ofs << buffer; } return(true); }
bool fingerprint2::GetFingerprint(OBBase* pOb, vector<unsigned int>&fp, int nbits) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(!pmol) return false; fp.resize(1024/Getbitsperint()); fragset.clear();//needed because now only one instance of fp class ringset.clear(); //identify fragments starting at every atom OBAtom *patom; vector<OBNodeBase*>::iterator i; for (patom = pmol->BeginAtom(i);patom;patom = pmol->NextAtom(i)) { if(patom->GetAtomicNum() == OBElements::Hydrogen) continue; vector<int> curfrag; vector<int> levels(pmol->NumAtoms()); getFragments(levels, curfrag, 1, patom, NULL); } // TRACE("%s %d frags before; ",pmol->GetTitle(),fragset.size()); //Ensure that each chemically identical fragment is present only in a single DoRings(); DoReverses(); SetItr itr; _ss.str(""); for(itr=fragset.begin();itr!=fragset.end();++itr) { //Use hash of fragment to set a bit in the fingerprint int hash = CalcHash(*itr); SetBit(fp,hash); if(!(Flags() & FPT_NOINFO)) PrintFpt(*itr,hash); } if(nbits) Fold(fp, nbits); // TRACE("%d after\n",fragset.size()); return true; }
void AliasData::DeleteExpandedAtoms(OBMol& mol) { //The atom that carries the AliasData object remains as an Xx atom with no charge; //the others are deleted. All the attached hydrogens are also deleted. for(unsigned i=0;i<_expandedatoms.size();++i) { OBAtom* at = mol.GetAtomById(_expandedatoms[i]); if(!at) continue; mol.DeleteHydrogens(at); if(at->HasData(AliasDataType)) { at->SetAtomicNum(0); at->SetFormalCharge(0); at->SetSpinMultiplicity(0); } else mol.DeleteAtom(at); } _expandedatoms.clear(); }
bool WriteFeat(ostream &ofs,OBMol &mol) { char buffer[BUFF_SIZE]; ofs << mol.NumAtoms() << endl; ofs << mol.GetTitle() << endl; OBAtom *atom; vector<OBNodeBase*>::iterator i; for(atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i)) { sprintf(buffer,"%-3s %8.5f %8.5f %8.5f ", etab.GetSymbol(atom->GetAtomicNum()), atom->x(), atom->y(), atom->z()); ofs << buffer << endl; } return(true); }
OBMolAtomBFSIter::OBMolAtomBFSIter(OBMol &mol, int StartIndex): _parent(&mol), _ptr(_parent->GetAtom(StartIndex)) { _notVisited.Resize(_parent->NumAtoms()); _notVisited.Negate(); // all on _notVisited.SetBitOff(_ptr->GetIdx() - 1); // Set up storage for the depths _depth.resize(_parent->NumAtoms() + 1, 0); _depth[_ptr->GetIdx()] = 1; vector<OBBond*>::iterator i; OBAtom *a; for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i)) { _queue.push(a); _depth[a->GetIdx()] = 2; _notVisited.SetBitOff(a->GetIdx() - 1); } }
static void FindRings(OBMol &mol,vector<int> &path,OBBitVec &avisit, OBBitVec &bvisit, int natom,int depth ) { OBAtom *atom; OBBond *bond; vector<OBBond*>::iterator k; // don't return if all atoms are visited // (For example, some atoms are in multiple rings!) -GRH if (avisit[natom]) { int j = depth-1; bond=mol.GetBond(path[j--]); bond->SetInRing(); while( j >= 0 ) { bond=mol.GetBond(path[j--]); bond->SetInRing(); (bond->GetBeginAtom())->SetInRing(); (bond->GetEndAtom())->SetInRing(); if(bond->GetBeginAtomIdx()==static_cast<unsigned int>(natom) || bond-> GetEndAtomIdx()==static_cast<unsigned int>(natom)) break; } } else { avisit.SetBitOn(natom); atom = mol.GetAtom(natom); for(bond = atom->BeginBond(k);bond;bond=atom->NextBond(k)) if( !bvisit[bond->GetIdx()]) { path[depth] = bond->GetIdx(); bvisit.SetBitOn(bond->GetIdx()); FindRings(mol,path,avisit,bvisit,bond->GetNbrAtomIdx(atom), depth+1); } } }
void OutputAtoms(ostream &ofs, OBMol &mol, string prefix) { /* ---- Write all coordinates ---- */ ofs << "//Coodinates of atoms 1 - " << mol.NumAtoms() << endl; unsigned int i; for(i = 1; i <= mol.NumAtoms(); ++i) { /* ---- Get a pointer to ith atom ---- */ OBAtom *atom = mol.GetAtom(i); /* ---- Write position of atom i ---- */ ofs << "#declare " << prefix << "_pos_" << i << " = <" << atom -> GetX() << "," << atom -> GetY() << "," << atom -> GetZ() << ">;" << endl; } /* ---- Write povray-description of all atoms ---- */ ofs << endl << "//Povray-description of atoms 1 - " << mol.NumAtoms() << endl; for(i = 1; i <= mol.NumAtoms(); ++i) { /* ---- Get a pointer to ith atom ---- */ OBAtom *atom = mol.GetAtom(i); /* ---- Write full description of atom i ---- */ ofs << "#declare " << prefix << "_atom" << i << " = "; ofs << "object {" << endl << "\t Atom_" << etab.GetSymbol(atom->GetAtomicNum()) << endl << "\t translate " << prefix << "_pos_" << i << endl << "\t }" << endl; } /* ---- Add empty line ---- */ ofs << endl; }
unsigned int OBRing::GetRootAtom() { vector<int>::iterator i; OBMol *mol = (OBMol*)GetParent(); //if (!IsAromatic()) // return 0; if (Size() == 6) for (i = _path.begin();i != _path.end();++i) if (mol->GetAtom(*i)->GetAtomicNum() != OBElements::Carbon) return (*i); if (Size() == 5) for (i = _path.begin();i != _path.end();++i) { OBAtom *atom = mol->GetAtom(*i); switch (atom->GetAtomicNum()) { case OBElements::Sulfur: if (atom->GetValence() == 2) return (*i); break; case OBElements::Oxygen: if (atom->GetValence() == 2) return (*i); break; case OBElements::Nitrogen: if (atom->BOSum() == atom->GetValence()) return (*i); break; } } return 0; }
void BuildOBRTreeVector(OBAtom *atom,OBRTree *prv,vector<OBRTree*> &vt,OBBitVec &bv) { vt[atom->GetIdx()] = new OBRTree (atom,prv); int i; OBAtom *nbr; OBMol *mol = (OBMol*)atom->GetParent(); OBBitVec curr,used,next; vector<OBBond*>::iterator j; curr |= atom->GetIdx(); used = bv|curr; #define OB_RTREE_CUTOFF 20 int level=0; for (;;) { next.Clear(); for (i = curr.NextBit(0);i != bv.EndBit();i = curr.NextBit(i)) { atom = mol->GetAtom(i); for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j)) if (!used[nbr->GetIdx()]) { next |= nbr->GetIdx(); used |= nbr->GetIdx(); vt[nbr->GetIdx()] = new OBRTree (nbr,vt[atom->GetIdx()]); } } if (next.Empty()) break; curr = next; level++; if (level > OB_RTREE_CUTOFF) break; } #undef OB_RTREE_CUTOFF }
OBMolAtomBFSIter& OBMolAtomBFSIter::operator++() { if (!_queue.empty()) { _ptr = _queue.front(); _queue.pop(); } else // are there any disconnected subgraphs? { int next = _notVisited.FirstBit(); if (next != _notVisited.EndBit()) { _ptr = _parent->GetAtom(next + 1); // Atom index issue if (_ptr != NULL) _depth[_ptr->GetIdx()] = 1; // new island _notVisited.SetBitOff(next); } else _ptr = NULL; } if (_ptr) { vector<OBBond*>::iterator i; OBAtom *a; for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i)) if (_notVisited[a->GetIdx() - 1]) { _queue.push(a); _depth[a->GetIdx()] = _depth[_ptr->GetIdx()] + 1; _notVisited.SetBitOff(a->GetIdx() - 1); } } return *this; }
bool OBDepict::AddAtomLabels(AtomLabelType type) { d->painter->SetPenColor(OBColor("red")); d->painter->SetFillColor(OBColor("red")); 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; default: break; } } return true; }
/* A recursive O(N) traversal of the molecule */ static int FindRings(OBAtom *atom, int *avisit, unsigned char *bvisit, unsigned int &frj, int depth) { OBBond *bond; int result = -1; vector<OBBond*>::iterator k; for(bond = atom->BeginBond(k);bond;bond=atom->NextBond(k)) { unsigned int bidx = bond->GetIdx(); if (bvisit[bidx] == 0) { bvisit[bidx] = 1; OBAtom *nbor = bond->GetNbrAtom(atom); unsigned int nidx = nbor->GetIdx(); int nvisit = avisit[nidx]; if (nvisit == 0) { avisit[nidx] = depth+1; nvisit = FindRings(nbor,avisit,bvisit,frj,depth+1); if (nvisit > 0) { if (nvisit <= depth) { bond->SetInRing(); if (result < 0 || nvisit < result) result = nvisit; } } } else { if (result < 0 || nvisit < result) result = nvisit; bond->SetClosure(); bond->SetInRing(); frj++; } } } if (result > 0 && result <= depth) atom->SetInRing(); return result; }
bool WriteHIN(ostream &ofs,OBMol &mol) { unsigned int i, file_num = 1; string str,str1; char buffer[BUFF_SIZE]; OBAtom *atom; OBBond *bond; vector<OBEdgeBase*>::iterator j; char bond_char; ofs << "mol " << file_num << " " << mol.GetTitle() << endl;; for(i = 1;i <= mol.NumAtoms(); i++) { atom = mol.GetAtom(i); sprintf(buffer,"atom %d - %-3s ** - %8.5f %8.5f %8.5f %8.5f %d ", i, etab.GetSymbol(atom->GetAtomicNum()), atom->GetPartialCharge(), atom->GetX(), atom->GetY(), atom->GetZ(), atom->GetValence()); ofs << buffer; for (bond = atom->BeginBond(j); bond; bond = atom->NextBond(j)) { switch(bond->GetBO()) { case 1 : bond_char = 's'; break; case 2 : bond_char = 'd'; break; case 3 : bond_char = 't'; break; case 5 : bond_char = 'a'; break; default: bond_char = 's'; break; } sprintf(buffer,"%d %c ", (bond->GetNbrAtom(atom))->GetIdx(), bond_char); ofs << buffer; } ofs << endl; } ofs << "endmol " << file_num << endl; return(true); }
void OBAtomTyper::AssignTypes(OBMol &mol) { if (!_init) Init(); obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::AssignTypes", obAuditMsg); mol.SetAtomTypesPerceived(); vector<vector<int> >::iterator j; vector<pair<OBSmartsPattern*,string> >::iterator i; for (i = _vexttyp.begin();i != _vexttyp.end();++i) if (i->first->Match(mol)) { _mlist = i->first->GetMapList(); for (j = _mlist.begin();j != _mlist.end();++j) mol.GetAtom((*j)[0])->SetType(i->second); } // Special cases vector<OBAtom*>::iterator a; OBAtom* atom; for (atom = mol.BeginAtom(a); atom; atom = mol.NextAtom(a)) { // guanidinium. Fixes PR#1800964 if (strncasecmp(atom->GetType(),"C2", 2) == 0) { int guanidineN = 0; OBAtom *nbr; vector<OBBond*>::iterator k; for (nbr = atom->BeginNbrAtom(k);nbr;nbr = atom->NextNbrAtom(k)) { if (strncasecmp(nbr->GetType(),"Npl", 3) == 0 || strncasecmp(nbr->GetType(),"N2", 2) == 0 || strncasecmp(nbr->GetType(),"Ng+", 3) == 0) ++guanidineN; } if (guanidineN == 3) atom->SetType("C+"); } // end C2 carbon for guanidinium } // end special cases }
void OBAtomTyper::AssignImplicitValence(OBMol &mol) { // FF Make sure that valence has not been perceived if(mol.HasImplicitValencePerceived()) return; if (!_init) Init(); mol.SetImplicitValencePerceived(); obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::AssignImplicitValence", obAuditMsg); // FF Ensure that the aromatic typer will not be called int oldflags = mol.GetFlags(); // save the current state flags mol.SetAromaticPerceived(); // and set the aromatic perceived flag on OBAtom *atom; vector<OBAtom*>::iterator k; for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k)) atom->SetImplicitValence(atom->GetValence()); vector<vector<int> >::iterator j; vector<pair<OBSmartsPattern*,int> >::iterator i; for (i = _vimpval.begin();i != _vimpval.end();++i) if (i->first->Match(mol)) { _mlist = i->first->GetMapList(); for (j = _mlist.begin();j != _mlist.end();++j) mol.GetAtom((*j)[0])->SetImplicitValence(i->second); } if (!mol.HasAromaticCorrected()) CorrectAromaticNitrogens(mol); for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k)) { if (atom->GetImplicitValence() < atom->GetValence()) atom->SetImplicitValence(atom->GetValence()); } // FF Come back to the initial flags mol.SetFlags(oldflags); return; }