From: Eugen L. <eu...@le...> - 2003-11-26 15:40:48
|
I've made a simple hack to do stereochem conservation for babel -imol blah.mol -omol blahout.mol Not tested much, and I don't know how you submit patches.=20 All changes are to mdl.cpp, relatively to today's cvs checkout, and do build on cygwin cleanly. Regression tests are not more broken than usual. Right at beginning of the file mdl.cpp insert the function wedgeorhatch: =2E... #include "mol.h" using namespace std; namespace OpenBabel { extern OBAtomTyper atomtyper; //CM int wedgeorhatch(int flag) { if (flag & OB_WEDGE_BOND) return 1; if (flag & OB_HASH_BOND ) return 6; return 0; } =2E... ReadSDFFile already does what it should, so no changes there. In WriteSDFile: =2E... vector<OBEdgeBase*>::iterator j; for (atom =3D mol.BeginAtom(i);atom;atom =3D mol.NextAtom(i)) for (nbr =3D atom->BeginNbrAtom(j);nbr;nbr =3D atom->NextNbrAtom(j)) if (atom->GetIdx() < nbr->GetIdx()) { bond =3D (OBBond*) *j; sprintf(buff,"%3d%3d%3d%3d%3d%3d%3d%3d", // probably one %3d too ma= ny bond->GetBeginAtomIdx(), bond->GetEndAtomIdx(), (bond->GetBO() =3D=3D 5) ? 4 : bond->GetBO(), wedgeorhatch(bond->GetFlags()), // this is the change 0,0,0,0); ofs << buff << endl; } =2E... I'm using isopentan.mol mit sterochem as input: -ISIS- 11100315272D 5 4 0 0 0 0 0 0 0 0999 V2000 -2.9792 0.9542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -2.1647 1.4667 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0 -1.5002 0.8750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -2.4272 2.2458 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -1.5042 2.0542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 2 3 1 0 0 0 0 1 2 1 0 0 0 0 2 4 1 1 0 0 0 2 5 1 6 0 0 0 M END and get the following as output: OpenBabel 2D 5 4 0 0 0 0 0 0 0 0 1 -2.9792 0.9542 0.0000 C 0 0 0 0 0 -2.1647 1.4667 0.0000 C 0 0 0 0 0 -1.5002 0.8750 0.0000 C 0 0 0 0 0 -2.4272 2.2458 0.0000 C 0 0 0 0 0 -1.5042 2.0542 0.0000 C 0 0 0 0 0 1 2 1 0 0 0 0 0 2 3 1 0 0 0 0 0 2 4 1 1 0 0 0 0 2 5 1 6 0 0 0 0 M END $$$$ Oops, I notice that there's an extra zero columnt. Just remove one superfluous %3d from sprintf, and get rid of one of the zeros below wedgeorhatch(bond->GetFlags()),=20 I haven't tidied it all up, because I'm not a programmer, and you will probably add the functionality using equivalent but different code. I can supply some test cases for the regression tests, though, if you need them. I don't have time nor the skills to work on cml.cpp, so I leave that to Peter.=20 -- Eugen* Leitl <a href=3D"http://leitl.org">leitl</a> ______________________________________________________________ ICBM: 48.07078, 11.61144 http://www.leitl.org 8B29F6BE: 099D 78BA 2FD3 B014 B08A 7779 75B0 2443 8B29 F6BE http://moleculardevices.org http://nanomachines.net |