diff --git a/Code/GraphMol/Chirality.cpp b/Code/GraphMol/Chirality.cpp index abdeb250d..ae864783a 100644 --- a/Code/GraphMol/Chirality.cpp +++ b/Code/GraphMol/Chirality.cpp @@ -425,8 +425,7 @@ const Atom *findHighestCIPNeighbor(const Atom *atom, const Atom *skipAtom) { namespace Chirality { std::optional atomChiralTypeFromBondDirPseudo3D( - const ROMol &mol, const Bond *bond, const Conformer *conf, - double pseudo3DOffset = 0.1) { + const ROMol &mol, const Bond *bond, const Conformer *conf) { PRECONDITION(bond, "no bond"); PRECONDITION(conf, "no conformer"); auto bondDir = bond->getBondDir(); @@ -438,6 +437,9 @@ std::optional atomChiralTypeFromBondDirPseudo3D( 0.00031; // used to recognize T-shaped arrangements // corresponds to an angle between the two vectors of just under 178 degrees // degree + + constexpr double pseudo3DOffset = 0.1; // z-displacement for wedged bonds + constexpr double volumeTolerance = 0.00174; // used to recognize zero chiral volume // This is what we get for a T-shaped arrangement with just over 178 degrees @@ -477,12 +479,8 @@ std::optional atomChiralTypeFromBondDirPseudo3D( // at the end of this process bond 0 is the input wedged bond // //---------------------------------------------------------- - bool hSeen = false; INT_VECT neighborBondIndices; - if (is_regular_h(*bondAtom)) { - hSeen = true; - } unsigned int refIdx = mol.getNumBonds() + 1; std::vector bondVects; @@ -528,9 +526,6 @@ std::optional atomChiralTypeFromBondDirPseudo3D( allSingle = false; } bondVects.push_back(centerLoc.directionVector(tmpPt)); - if (is_regular_h(*oAtom)) { - hSeen = true; - } neighborBondIndices.push_back(nbrBond->getIdx()); } CHECK_INVARIANT(refIdx < mol.getNumBonds(), @@ -540,12 +535,11 @@ std::optional atomChiralTypeFromBondDirPseudo3D( //---------------------------------------------------------- // - // Return now if there aren't at least 3 non-H bonds to the atom. - // (we can implicitly add a single H to 3 coordinate atoms, but - // we're horked otherwise). + // Return now if there aren't at least 3 bonds to the atom. + // (we can implicitly add a single H to 3 coordinate atoms). // //---------------------------------------------------------- - if (nNbrs < 3 || nNbrs > 4 || (hSeen && nNbrs < 4)) { + if (nNbrs < 3 || nNbrs > 4) { return std::nullopt; } @@ -1487,7 +1481,8 @@ bool atomIsCandidateForRingStereochem( ringNbrRanks.insert(atomRanks[nbr->getIdx()]); } } - // std::cerr << "!!!! " << atom->getIdx() << " " << ringNbrRanks.size() << " " + // std::cerr << "!!!! " << atom->getIdx() << " " << ringNbrRanks.size() << + // " " // << ringNbrs.size() << " " << nonRingNbrs.size() << std::endl; switch (nonRingNbrs.size()) { case 2: diff --git a/Code/GraphMol/FileParsers/macromols_catch.cpp b/Code/GraphMol/FileParsers/macromols_catch.cpp index 1baa23583..06075d8da 100644 --- a/Code/GraphMol/FileParsers/macromols_catch.cpp +++ b/Code/GraphMol/FileParsers/macromols_catch.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -48,15 +49,20 @@ class ScsiMolTest { unsigned int querySgroupCount; bool scsrExpandResult; SCSRBaseHbondOptions scsrBaseHbondOptions; + std::vector> chiralChecks; + std::vector> chiralChecksQuery; ScsiTest(std::string fileNameInit, bool scsrExpandResult, SCSRBaseHbondOptions scsrBaseHbondOptions, unsigned int totalAtomCountInit, unsigned int totalBondCountInit, unsigned int sgroupCountInit, unsigned int totalQueryAtomCountInit, unsigned int totalQueryBondCountInit, - unsigned int querySgroupCountInit = 0) + unsigned int querySgroupCountInit, + std::vector> + chiralChecksInit = {}, + std::vector> + chiralChecksQueryInit = {}) : fileName(fileNameInit), - totalAtomCount(totalAtomCountInit), totalBondCount(totalBondCountInit), sgroupCount(sgroupCountInit), @@ -64,7 +70,9 @@ class ScsiMolTest { totalQueryBondCount(totalQueryBondCountInit), querySgroupCount(querySgroupCountInit), scsrExpandResult(scsrExpandResult), - scsrBaseHbondOptions(scsrBaseHbondOptions) {}; + scsrBaseHbondOptions(scsrBaseHbondOptions), + chiralChecks(chiralChecksInit), + chiralChecksQuery(chiralChecksQueryInit) {}; }; void testScsiFiles(const ScsiTest *scsiTest) { @@ -101,6 +109,11 @@ class ScsiMolTest { CHECK(mol->getNumBonds() == scsiTest->totalBondCount); CHECK(getSubstanceGroups(*mol).size() == scsiTest->sgroupCount); + for (auto chiralCheck : scsiTest->chiralChecks) { + CHECK(mol->getAtomWithIdx(chiralCheck.first)->getChiralTag() == + chiralCheck.second); + } + // now make the expanded mol in "query" mode - not including any leaving // groups @@ -120,6 +133,11 @@ class ScsiMolTest { CHECK(molNoLeavingGroups->getNumBonds() == scsiTest->totalQueryBondCount); CHECK(getSubstanceGroups(*molNoLeavingGroups).size() == scsiTest->querySgroupCount); + + for (auto chiralCheck : scsiTest->chiralChecksQuery) { + CHECK(mol->getAtomWithIdx(chiralCheck.first)->getChiralTag() == + chiralCheck.second); + } } void threeLetterCodeTest(const ScsiTest *scsiTest) { @@ -178,6 +196,28 @@ class ScsiMolTest { TEST_CASE("scsiTests", "scsiTests") { SECTION("basics") { std::list scsiTests{ + ScsiMolTest::ScsiTest("DNASlurpErrorImport.mol", true, + SCSRBaseHbondOptions::Auto, 81, 90, 13, 79, 88, + 11, + {{0, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {22, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {41, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {61, Atom::ChiralType::CHI_TETRAHEDRAL_CW}}, + {{0, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {22, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {41, Atom::ChiralType::CHI_TETRAHEDRAL_CW}, + {61, Atom::ChiralType::CHI_TETRAHEDRAL_CW}}), + ScsiMolTest::ScsiTest("DNASlurpErrorSketch.mol", true, + SCSRBaseHbondOptions::Auto, 84, 93, 14, 82, 91, + 12, + {{51, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {60, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {68, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {76, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}}, + {{51, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {60, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {68, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}, + {76, Atom::ChiralType::CHI_TETRAHEDRAL_CCW}}), ScsiMolTest::ScsiTest("ValenceErrorScsr.mol", true, SCSRBaseHbondOptions::Auto, 38, 39, 6, 35, 36, 3), ScsiMolTest::ScsiTest("ValenceErrorScsr2.mol", true, diff --git a/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorImport.mol b/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorImport.mol new file mode 100644 index 000000000..2965afc44 --- /dev/null +++ b/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorImport.mol @@ -0,0 +1,227 @@ + +Generated by WebMolKit + + 0 0 0 0 0 999 V3000 +M V30 BEGIN CTAB +M V30 COUNTS 11 10 0 0 1 +M V30 BEGIN ATOM +M V30 1 dR 0.0000 0.0000 0.0000 0 CLASS=SUGAR SEQID=1 ATTCHORD=(4 2 Cx 3 Br) +M V30 2 A 0.0000 -1.5000 0.0000 0 CLASS=BASE SEQID=1 ATTCHORD=(2 1 Al) +M V30 3 P 1.5000 0.0000 0.0000 0 CLASS=PHOSPHATE SEQID=2 ATTCHORD=(4 1 Al 4 Br) +M V30 4 dR 3.0000 0.0000 0.0000 0 CLASS=SUGAR SEQID=2 ATTCHORD=(6 3 Al 5 Cx 6 Br) +M V30 5 C 3.0000 -1.5000 0.0000 0 CLASS=BASE SEQID=2 ATTCHORD=(2 4 Al) +M V30 6 P 4.5000 0.0000 0.0000 0 CLASS=PHOSPHATE SEQID=3 ATTCHORD=(4 4 Al 7 Br) +M V30 7 dR 6.0000 0.0000 0.0000 0 CLASS=SUGAR SEQID=3 ATTCHORD=(6 6 Al 8 Cx 9 Br) +M V30 8 T 6.0000 -1.5000 0.0000 0 CLASS=BASE SEQID=3 ATTCHORD=(2 7 Al) +M V30 9 P 7.5000 0.0000 0.0000 0 CLASS=PHOSPHATE SEQID=4 ATTCHORD=(4 7 Al 10 Br) +M V30 10 dR 9.0000 0.0000 0.0000 0 CLASS=SUGAR SEQID=4 ATTCHORD=(4 9 Al 11 Cx) +M V30 11 G 9.0000 -1.5000 0.0000 0 CLASS=BASE SEQID=4 ATTCHORD=(2 10 Al) +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 1 1 3 +M V30 3 1 3 4 +M V30 4 1 4 5 +M V30 5 1 4 6 +M V30 6 1 6 7 +M V30 7 1 7 8 +M V30 8 1 7 9 +M V30 9 1 9 10 +M V30 10 1 10 11 +M V30 END BOND +M V30 END CTAB +M V30 BEGIN TEMPLATE +M V30 TEMPLATE 1 SUGAR/dR/dR/ NATREPLACE=SUGAR/dR +M V30 BEGIN CTAB +M V30 COUNTS 11 11 4 0 1 +M V30 BEGIN ATOM +M V30 1 C 14.8638 -7.5440 0.0000 0 +M V30 2 C 16.0773 -8.4257 0.0000 0 +M V30 3 C 15.6138 -9.8523 0.0000 0 +M V30 4 C 14.1138 -9.8523 0.0000 0 +M V30 5 O 13.6503 -8.4257 0.0000 0 +M V30 6 H 14.8638 -6.0440 0.0000 0 +M V30 7 C 13.2321 -11.0658 0.0000 0 +M V30 8 O 16.4955 -11.0658 0.0000 0 +M V30 9 H 17.9873 -10.9090 0.0000 0 +M V30 10 O 11.7403 -10.9090 0.0000 0 +M V30 11 H 10.8586 -12.1225 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 1 2 3 +M V30 3 1 3 4 +M V30 4 1 4 5 +M V30 5 1 5 1 +M V30 6 1 1 6 CFG=1 +M V30 7 1 4 7 CFG=1 +M V30 8 1 3 8 CFG=3 +M V30 9 1 8 9 +M V30 10 1 7 10 +M V30 11 1 10 11 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=dR ATOMS=(8 1 2 3 4 5 7 8 10) XBONDS=(2 11 9) CLASS=SUGAR NATREPLACE=SUGAR/dR SAP=(3 10 11 Al) SAP=(3 8 9 Br) SAP=(3 1 6 Cx) +M V30 2 SUP 0 LABEL=H ATOMS=(1 11) XBONDS=(1 11) CLASS=LGRP +M V30 3 SUP 0 LABEL=H ATOMS=(1 9) XBONDS=(1 9) CLASS=LGRP +M V30 4 SUP 0 LABEL=H ATOMS=(1 6) XBONDS=(1 6) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 2 BASE/A/A/ NATREPLACE=BASE/A +M V30 BEGIN CTAB +M V30 COUNTS 11 12 2 0 1 +M V30 BEGIN ATOM +M V30 1 C 0.0000 0.0000 0.0000 0 +M V30 2 C -1.2990 -0.7500 0.0000 0 +M V30 3 C -1.2990 -2.2500 0.0000 0 +M V30 4 N 0.0000 -3.0000 0.0000 0 +M V30 5 C 1.2990 -2.2500 0.0000 0 +M V30 6 N 1.2990 -0.7500 0.0000 0 +M V30 7 N -2.7256 -0.2865 0.0000 0 +M V30 8 C -3.6073 -1.5000 0.0000 0 +M V30 9 N -2.7256 -2.7135 0.0000 0 +M V30 10 H -3.1891 -4.1401 0.0000 0 +M V30 11 N 0.0000 1.5000 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 2 2 3 +M V30 3 1 3 4 +M V30 4 2 4 5 +M V30 5 1 5 6 +M V30 6 2 6 1 +M V30 7 1 2 7 +M V30 8 2 7 8 +M V30 9 1 8 9 +M V30 10 1 9 3 +M V30 11 1 9 10 +M V30 12 1 1 11 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=A ATOMS=(10 1 2 3 4 5 6 7 8 9 11) XBONDS=(1 11) CLASS=BASE NATREPLACE=BASE/A SAP=(3 9 10 Al) +M V30 2 SUP 0 LABEL=H ATOMS=(1 10) XBONDS=(1 11) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 3 PHOSPHATE/P/P/ NATREPLACE=PHOSPHATE/P +M V30 BEGIN CTAB +M V30 COUNTS 5 4 3 0 1 +M V30 BEGIN ATOM +M V30 1 P 0.0000 0.0000 0.0000 0 +M V30 2 O 1.5000 0.0000 0.0000 0 +M V30 3 O -1.5000 0.0000 0.0000 0 +M V30 4 O 0.0000 -1.5000 0.0000 0 +M V30 5 O 0.0000 1.5000 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 1 1 3 +M V30 3 1 1 4 +M V30 4 2 1 5 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=P ATOMS=(3 1 4 5) XBONDS=(2 2 1) CLASS=PHOSPHATE NATREPLACE=PHOSPHATE/P SAP=(3 1 3 Al) SAP=(3 1 2 Br) +M V30 2 SUP 0 LABEL=O ATOMS=(1 3) XBONDS=(1 2) CLASS=LGRP +M V30 3 SUP 0 LABEL=O ATOMS=(1 2) XBONDS=(1 1) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 4 BASE/C/C/ NATREPLACE=BASE/C +M V30 BEGIN CTAB +M V30 COUNTS 9 9 2 0 1 +M V30 BEGIN ATOM +M V30 1 C 0.0000 0.0000 0.0000 0 +M V30 2 N -1.2990 -0.7500 0.0000 0 +M V30 3 C -1.2990 -2.2500 0.0000 0 +M V30 4 N 0.0000 -3.0000 0.0000 0 +M V30 5 C 1.2990 -2.2500 0.0000 0 +M V30 6 C 1.2990 -0.7500 0.0000 0 +M V30 7 H 0.0000 -4.5000 0.0000 0 +M V30 8 O -2.5981 -3.0000 0.0000 0 +M V30 9 N 0.0000 1.5000 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 2 1 2 +M V30 2 1 2 3 +M V30 3 1 3 4 +M V30 4 1 4 5 +M V30 5 2 5 6 +M V30 6 1 6 1 +M V30 7 1 4 7 +M V30 8 2 3 8 +M V30 9 1 1 9 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=C ATOMS=(8 1 2 3 4 5 6 8 9) XBONDS=(1 7) CLASS=BASE NATREPLACE=BASE/C SAP=(3 4 7 Al) +M V30 2 SUP 0 LABEL=H ATOMS=(1 7) XBONDS=(1 7) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 5 BASE/T/T/ NATREPLACE=BASE/T +M V30 BEGIN CTAB +M V30 COUNTS 10 10 2 0 1 +M V30 BEGIN ATOM +M V30 1 C 0.0000 0.0000 0.0000 0 +M V30 2 N -1.2990 -0.7500 0.0000 0 +M V30 3 C -1.2990 -2.2500 0.0000 0 +M V30 4 N 0.0000 -3.0000 0.0000 0 +M V30 5 C 1.2990 -2.2500 0.0000 0 +M V30 6 C 1.2990 -0.7500 0.0000 0 +M V30 7 H 0.0000 -4.5000 0.0000 0 +M V30 8 O -2.5981 -3.0000 0.0000 0 +M V30 9 O 0.0000 1.5000 0.0000 0 +M V30 10 C 2.5980 0.0000 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 1 2 3 +M V30 3 1 3 4 +M V30 4 1 4 5 +M V30 5 2 5 6 +M V30 6 1 6 1 +M V30 7 1 4 7 +M V30 8 2 3 8 +M V30 9 2 1 9 +M V30 10 1 6 10 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=T ATOMS=(9 1 2 3 4 5 6 8 9 10) XBONDS=(1 7) CLASS=BASE NATREPLACE=BASE/T SAP=(3 4 7 Al) +M V30 2 SUP 0 LABEL=H ATOMS=(1 7) XBONDS=(1 7) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 6 BASE/G/G/ NATREPLACE=BASE/G +M V30 BEGIN CTAB +M V30 COUNTS 12 13 2 0 1 +M V30 BEGIN ATOM +M V30 1 C 0.0000 0.0000 0.0000 0 +M V30 2 C -1.2990 -0.7500 0.0000 0 +M V30 3 C -1.2990 -2.2500 0.0000 0 +M V30 4 N 0.0000 -3.0000 0.0000 0 +M V30 5 C 1.2990 -2.2500 0.0000 0 +M V30 6 N 1.2990 -0.7500 0.0000 0 +M V30 7 N -2.7256 -0.2865 0.0000 0 +M V30 8 C -3.6073 -1.5000 0.0000 0 +M V30 9 N -2.7256 -2.7135 0.0000 0 +M V30 10 H -3.1891 -4.1401 0.0000 0 +M V30 11 O 0.0000 1.5000 0.0000 0 +M V30 12 N 2.5980 -3.0000 0.0000 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 2 2 3 +M V30 3 1 3 4 +M V30 4 2 4 5 +M V30 5 1 5 6 +M V30 6 1 6 1 +M V30 7 1 2 7 +M V30 8 2 7 8 +M V30 9 1 8 9 +M V30 10 1 9 3 +M V30 11 1 9 10 +M V30 12 2 1 11 +M V30 13 1 5 12 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 0 LABEL=G ATOMS=(11 1 2 3 4 5 6 7 8 9 11 12) XBONDS=(1 11) CLASS=BASE NATREPLACE=BASE/G SAP=(3 9 10 Al) +M V30 2 SUP 0 LABEL=H ATOMS=(1 10) XBONDS=(1 11) CLASS=LGRP +M V30 END SGROUP +M V30 END CTAB +M V30 END TEMPLATE +M END \ No newline at end of file diff --git a/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorSketch.mol b/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorSketch.mol new file mode 100644 index 000000000..ea0b1d77a --- /dev/null +++ b/Code/GraphMol/FileParsers/test_data/macromols/DNASlurpErrorSketch.mol @@ -0,0 +1,265 @@ + + -INDIGO-11062509012D + + 0 0 0 0 0 0 0 0 0 0 0 V3000 +M V30 BEGIN CTAB +M V30 COUNTS 12 11 0 0 0 +M V30 BEGIN ATOM +M V30 1 A 1.25 -2.75 0.0 0 CLASS=BASE SEQID=1 ATTCHORD=(2 9 Al) +M V30 2 P 2.75 -1.25 0.0 0 CLASS=PHOSPHATE SEQID=1 ATTCHORD=(4 9 Al 10 Br) +M V30 3 C 4.25 -2.75 0.0 0 CLASS=BASE SEQID=2 ATTCHORD=(2 10 Al) +M V30 4 P 5.75 -1.25 0.0 0 CLASS=PHOSPHATE SEQID=2 ATTCHORD=(4 10 Al 11 Br) +M V30 5 G 7.25 -2.75 0.0 0 CLASS=BASE SEQID=3 ATTCHORD=(2 11 Al) +M V30 6 P 8.75 -1.25 0.0 0 CLASS=PHOSPHATE SEQID=3 ATTCHORD=(4 11 Al 12 Br) +M V30 7 T 10.25 -2.75 0.0 0 CLASS=BASE SEQID=4 ATTCHORD=(2 12 Al) +M V30 8 P 11.75 -1.25 0.0 0 CLASS=PHOSPHATE SEQID=4 ATTCHORD=(2 12 Al) +M V30 9 dR 1.25 -1.25 0.0 0 CLASS=SUGAR SEQID=1 ATTCHORD=(4 1 Cx 2 Br) +M V30 10 dR 4.25 -1.25 0.0 0 CLASS=SUGAR SEQID=2 ATTCHORD=(6 3 Cx 2 Al 4 Br) +M V30 11 dR 7.25 -1.25 0.0 0 CLASS=SUGAR SEQID=3 ATTCHORD=(6 5 Cx 4 Al 6 Br) +M V30 12 dR 10.25 -1.25 0.0 0 CLASS=SUGAR SEQID=4 ATTCHORD=(6 7 Cx 6 Al 8 Br- +M V30 ) +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 9 +M V30 2 1 9 2 +M V30 3 1 3 10 +M V30 4 1 10 2 +M V30 5 1 10 4 +M V30 6 1 5 11 +M V30 7 1 11 4 +M V30 8 1 11 6 +M V30 9 1 7 12 +M V30 10 1 12 6 +M V30 11 1 8 12 +M V30 END BOND +M V30 END CTAB +M V30 BEGIN TEMPLATE +M V30 TEMPLATE 1 BASE/Ade/A NATREPLACE=BASE/A +M V30 BEGIN CTAB +M V30 COUNTS 11 12 2 0 0 +M V30 BEGIN ATOM +M V30 1 N -0.438 1.041 0.0 0 +M V30 2 C -0.438 0.041 0.0 0 +M V30 3 C 0.428 -0.459 0.0 0 +M V30 4 C 1.294 0.041 0.0 0 +M V30 5 N 1.294 1.041 0.0 0 +M V30 6 C 0.428 1.541 0.0 0 +M V30 7 N 0.22 -1.437 0.0 0 +M V30 8 C -0.775 -1.541 0.0 0 +M V30 9 N -1.182 -0.628 0.0 0 +M V30 10 N 2.16 -0.459 0.0 0 +M V30 11 H -2.16 -0.42 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 2 6 1 +M V30 2 1 1 2 +M V30 3 2 2 3 +M V30 4 1 3 4 +M V30 5 2 4 5 +M V30 6 1 5 6 +M V30 7 1 2 9 +M V30 8 1 9 8 +M V30 9 2 8 7 +M V30 10 1 7 3 +M V30 11 1 4 10 +M V30 12 1 9 11 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 11) XBONDS=(1 12) BRKXYZ=(9 0.489000 -0.104000 0.0000- +M V30 00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLAS- +M V30 S=LGRP +M V30 2 SUP 2 ATOMS=(10 1 2 3 4 5 6 7 8 9 10) XBONDS=(1 12) BRKXYZ=(9 -0.489- +M V30 000 0.104000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0- +M V30 00000) LABEL=A CLASS=BASE SAP=(3 9 11 Al) NATREPLACE=BASE/A +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 2 PHOSPHATE/P/P NATREPLACE=PHOSPHATE/P +M V30 BEGIN CTAB +M V30 COUNTS 5 4 3 0 0 +M V30 BEGIN ATOM +M V30 1 P 0.0 0.0 0.0 0 +M V30 2 O 0.5 -0.866 0.0 0 +M V30 3 O 0.5 0.866 0.0 0 +M V30 4 O -1.0 0.0 0.0 0 +M V30 5 O 1.0 0.0 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 2 1 2 +M V30 2 1 1 3 +M V30 3 1 1 4 +M V30 4 1 1 5 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 4) XBONDS=(1 3) BRKXYZ=(9 0.500000 0.000000 0.000000 - +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=OH CLASS=- +M V30 LGRP +M V30 2 SUP 2 ATOMS=(1 5) XBONDS=(1 4) BRKXYZ=(9 -0.500000 0.000000 0.000000- +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=OH CLASS- +M V30 =LGRP +M V30 3 SUP 3 ATOMS=(3 1 2 3) XBONDS=(2 3 4) BRKXYZ=(9 -0.500000 0.000000 0.- +M V30 000000 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=P - +M V30 CLASS=PHOSPHATE SAP=(3 1 4 Al) SAP=(3 1 5 Br) NATREPLACE=PHOSPHATE/P +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 3 BASE/Cyt/C NATREPLACE=BASE/C +M V30 BEGIN CTAB +M V30 COUNTS 9 9 2 0 0 +M V30 BEGIN ATOM +M V30 1 C -0.5 -0.433 0.0 0 +M V30 2 N 0.5 -0.433 0.0 0 +M V30 3 C 1.0 0.433 0.0 0 +M V30 4 C 0.5 1.299 0.0 0 +M V30 5 C -0.5 1.299 0.0 0 +M V30 6 N -1.0 0.433 0.0 0 +M V30 7 N 2.0 0.433 0.0 0 +M V30 8 O -1.0 -1.299 0.0 0 +M V30 9 H -2.0 0.433 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 6 1 +M V30 2 1 1 2 +M V30 3 2 2 3 +M V30 4 1 3 4 +M V30 5 2 4 5 +M V30 6 1 5 6 +M V30 7 1 3 7 +M V30 8 2 1 8 +M V30 9 1 6 9 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 9) XBONDS=(1 9) BRKXYZ=(9 0.500000 0.000000 0.000000 - +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLASS=L- +M V30 GRP +M V30 2 SUP 2 ATOMS=(8 1 2 3 4 5 6 7 8) XBONDS=(1 9) BRKXYZ=(9 -0.500000 0.0- +M V30 00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) - +M V30 LABEL=C CLASS=BASE SAP=(3 6 9 Al) NATREPLACE=BASE/C +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 4 BASE/Gua/G NATREPLACE=BASE/G +M V30 BEGIN CTAB +M V30 COUNTS 12 13 2 0 0 +M V30 BEGIN ATOM +M V30 1 N -0.438 0.541 0.0 0 +M V30 2 C -0.438 -0.459 0.0 0 +M V30 3 C 0.428 -0.959 0.0 0 +M V30 4 C 1.294 -0.459 0.0 0 +M V30 5 N 1.294 0.541 0.0 0 +M V30 6 C 0.428 1.041 0.0 0 +M V30 7 N 0.22 -1.937 0.0 0 +M V30 8 C -0.775 -2.041 0.0 0 +M V30 9 N -1.182 -1.128 0.0 0 +M V30 10 O 2.16 -0.959 0.0 0 +M V30 11 H -2.16 -0.92 0.0 0 +M V30 12 N 0.428 2.041 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 2 6 1 +M V30 2 1 1 2 +M V30 3 2 2 3 +M V30 4 1 3 4 +M V30 5 1 4 5 +M V30 6 1 5 6 +M V30 7 1 2 9 +M V30 8 1 9 8 +M V30 9 2 8 7 +M V30 10 1 7 3 +M V30 11 2 4 10 +M V30 12 1 9 11 +M V30 13 1 6 12 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 11) XBONDS=(1 12) BRKXYZ=(9 0.489000 -0.104000 0.0000- +M V30 00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLAS- +M V30 S=LGRP +M V30 2 SUP 2 ATOMS=(11 1 2 3 4 5 6 7 8 9 10 12) XBONDS=(1 12) BRKXYZ=(9 -0.- +M V30 489000 0.104000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 - +M V30 0.000000) LABEL=G CLASS=BASE SAP=(3 9 11 Al) NATREPLACE=BASE/G +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 5 BASE/Thy/T NATREPLACE=BASE/T +M V30 BEGIN CTAB +M V30 COUNTS 10 10 2 0 0 +M V30 BEGIN ATOM +M V30 1 C -0.5 -0.866 0.0 0 +M V30 2 C 0.5 -0.866 0.0 0 +M V30 3 C 1.0 0.0 0.0 0 +M V30 4 N 0.5 0.866 0.0 0 +M V30 5 C -0.5 0.866 0.0 0 +M V30 6 N -1.0 0.0 0.0 0 +M V30 7 O 2.0 0.0 0.0 0 +M V30 8 H -2.0 0.0 0.0 0 +M V30 9 C 1.0 -1.732 0.0 0 +M V30 10 O -1.0 1.732 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 6 1 +M V30 2 2 1 2 +M V30 3 1 2 3 +M V30 4 1 3 4 +M V30 5 1 4 5 +M V30 6 1 5 6 +M V30 7 2 3 7 +M V30 8 1 6 8 +M V30 9 1 2 9 +M V30 10 2 5 10 +M V30 END BOND +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 8) XBONDS=(1 8) BRKXYZ=(9 0.500000 0.000000 0.000000 - +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLASS=L- +M V30 GRP +M V30 2 SUP 2 ATOMS=(9 1 2 3 4 5 6 7 9 10) XBONDS=(1 8) BRKXYZ=(9 -0.500000 - +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000- +M V30 0) LABEL=T CLASS=BASE SAP=(3 6 8 Al) NATREPLACE=BASE/T +M V30 END SGROUP +M V30 END CTAB +M V30 TEMPLATE 6 SUGAR/dRib/dR NATREPLACE=SUGAR/R-Ribose +M V30 BEGIN CTAB +M V30 COUNTS 11 11 4 0 0 +M V30 BEGIN ATOM +M V30 1 C 0.294 -1.026 0.0 0 CFG=1 +M V30 2 C 1.103 -0.438 0.0 0 +M V30 3 C 0.794 0.513 0.0 0 CFG=1 +M V30 4 C -0.206 0.513 0.0 0 CFG=2 +M V30 5 O -0.515 -0.438 0.0 0 +M V30 6 O 0.294 -2.026 0.0 0 +M V30 7 O 1.382 1.322 0.0 0 +M V30 8 H 2.376 1.217 0.0 0 +M V30 9 C -0.794 1.322 0.0 0 +M V30 10 O -1.788 1.217 0.0 0 +M V30 11 H -2.376 2.026 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 5 +M V30 2 1 5 4 +M V30 3 1 4 3 +M V30 4 1 3 2 +M V30 5 1 2 1 +M V30 6 1 1 6 CFG=3 +M V30 7 1 3 7 CFG=1 +M V30 8 1 7 8 +M V30 9 1 4 9 CFG=3 +M V30 10 1 9 10 +M V30 11 1 10 11 +M V30 END BOND +M V30 BEGIN COLLECTION +M V30 MDLV30/STEABS ATOMS=(3 1 3 4) +M V30 END COLLECTION +M V30 BEGIN SGROUP +M V30 1 SUP 1 ATOMS=(1 11) XBONDS=(1 11) BRKXYZ=(9 0.294000 -0.404500 0.0000- +M V30 00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLAS- +M V30 S=LGRP +M V30 2 SUP 2 ATOMS=(1 8) XBONDS=(1 8) BRKXYZ=(9 -0.497000 0.052500 0.000000- +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=H CLASS=- +M V30 LGRP +M V30 3 SUP 3 ATOMS=(1 6) XBONDS=(1 6) BRKXYZ=(9 0.000000 0.500000 0.000000 - +M V30 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000) LABEL=OH CLASS=- +M V30 LGRP +M V30 4 SUP 4 ATOMS=(8 1 2 3 4 5 7 9 10) XBONDS=(3 6 8 11) BRKXYZ=(9 0.00000- +M V30 0 -0.500000 0.000000 0.497000 -0.052500 0.000000 0.000000 0.000000 0.0- +M V30 00000) BRKXYZ=(9 -0.294000 0.404500 0.000000 0.000000 0.000000 0.00000- +M V30 0 0.000000 0.000000 0.000000) LABEL=dR CLASS=SUGAR SAP=(3 10 11 Al) SA- +M V30 P=(3 7 8 Br) SAP=(3 1 6 Cx) NATREPLACE=SUGAR/R +M V30 END SGROUP +M V30 END CTAB +M V30 END TEMPLATE +M END