Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support allenes in canonicalizing double bonds, fixes #7044 #7137

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
9 changes: 9 additions & 0 deletions Code/GraphMol/Canon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,15 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,
secondNeighborBond = bond;
}
}
if (!firstNeighborBond) {
// allene
for (const auto bond : mol.atomBonds(atom)) {
if (bond == dblBond) {
continue;
}
firstNeighborBond = bond;
}
}
};

findNeighborBonds(atom1, firstFromAtom1, secondFromAtom1, dir1Set);
Expand Down
56 changes: 55 additions & 1 deletion Code/GraphMol/MolStandardize/testTautomer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,10 @@ void testEnumerator() {
checkAns("C/C=C/C(C)=O", {"C=C(O)C=CC", "C=CC=C(C)O", "C=CCC(=C)O",
"C=CCC(C)=O", "CC=CC(C)=O"});

// // Remove stereochemistry from conjugated double bonds to nitro
// checkAns("c1ccnc(c1)/C=C/[N+](=O)[O-]", {"O=[N+]([O-])C=Cc1ccccn1",
// "[O-][N+](O)=C=Cc1ccccn1"});

// Remove stereochemistry from mobile double bonds
std::string smi66 = "C/C=C\\C(C)=O";
ROMOL_SPTR m66(SmilesToMol(smi66));
Expand All @@ -334,7 +338,7 @@ void testEnumerator() {
std::sort(ans66.begin(), ans66.end());
TEST_ASSERT(sm66 == ans66);

// Gaunine tautomers
// Guanine tautomers
std::string smi67 = "N1C(N)=NC=2N=CNC2C1=O";
ROMOL_SPTR m67(SmilesToMol(smi67));
TautomerEnumeratorResult res67 = te.enumerate(*m67);
Expand Down Expand Up @@ -490,6 +494,56 @@ void testEnumeratorParams() {
}
}
}
std::string eOximeSmi = "c1ccnc(c1)/C=N/O";
ROMOL_SPTR eOxime(SmilesToMol(eOximeSmi));
TEST_ASSERT(eOxime->getBondWithIdx(6)->getStereo() == Bond::STEREOE);
{
// test remove oxime E stereochemistry
CleanupParameters params;
params.tautomerRemoveBondStereo = true;
TautomerEnumerator te(params);
TautomerEnumeratorResult res = te.enumerate(*eOxime);
for (const auto &taut : res) {
TEST_ASSERT(taut->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);
}
}
{
// test retain enol E stereochemistry
CleanupParameters params;
params.tautomerRemoveBondStereo = false;
TautomerEnumerator te(params);
TautomerEnumeratorResult res = te.enumerate(*eOxime);
for (const auto &taut : res) {
if (taut->getBondWithIdx(6)->getBondType() == Bond::DOUBLE) {
TEST_ASSERT(taut->getBondWithIdx(6)->getStereo() == Bond::STEREOE);
}
}
}
ROMOL_SPTR zOxime = "c1ccnc(c1)/C=N\\O"_smiles;
// zOxime->debugMol(std::cerr);
TEST_ASSERT(zOxime->getBondWithIdx(6)->getStereo() == Bond::STEREOZ);
{
// test remove enol Z stereochemistry
CleanupParameters params;
params.tautomerRemoveBondStereo = true;
TautomerEnumerator te(params);
TautomerEnumeratorResult res = te.enumerate(*zOxime);
for (const auto &taut : res) {
TEST_ASSERT(taut->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);
}
}
{
// test retain enol Z stereochemistry
CleanupParameters params;
params.tautomerRemoveBondStereo = false;
TautomerEnumerator te(params);
TautomerEnumeratorResult res = te.enumerate(*zOxime);
for (const auto &taut : res) {
if (taut->getBondWithIdx(6)->getBondType() == Bond::DOUBLE) {
TEST_ASSERT(taut->getBondWithIdx(6)->getStereo() == Bond::STEREOZ);
}
}
}
ROMOL_SPTR chembl2024142 =
"[2H]C1=C(C(=C2C(=C1[2H])C(=O)C(=C(C2=O)C([2H])([2H])[2H])C/C=C(\\C)/CC([2H])([2H])/C=C(/CC/C=C(\\C)/CCC=C(C)C)\\C([2H])([2H])[2H])[2H])[2H]"_smiles;
MolOps::RemoveHsParameters hparams;
Expand Down