achiral reaction product "remembers" stereo of reactant

User 7c177bab3b

25-11-2011 14:17:49

Hi


JChem 5.6.0.2


It seems that when a reaction makes a chiral centre non-chiral e.g. by going from a single to double bond, the chiral flag is retained in the relevant product atom.


The following sequence should remove the chiral information from the input molecule.


import chemaxon.struc.Molecule;
import chemaxon.struc.MolAtom;
import chemaxon.reaction.Reactor;
import chemaxon.util.MolHandler;

public class Test {

    public Test() {
        try {
            Molecule[] prods;
            Molecule[] prods2;
            String smirks = "[#1:1][C:2][C:3]=[O:4]>>[C:2]=[C:3](-[O:4][#1:1])";
            Molecule q = new MolHandler(smirks, true).getMolecule();
            Reactor r1 = new Reactor();
            r1.setReaction(q);
            Reactor r2 = new Reactor();
            r2.setReaction(q);
            r2.setReverse(true);

            Molecule mol = new MolHandler("C[C@H](CC)C(=O)C").getMolecule();
            listFlags(mol);

            r1.setReactant(mol);
            while ((prods = r1.react()) != null) {
                for (Molecule p : prods) {
                    System.out.println("forward");
                    listFlags(p);
                    r2.setReactant(p);
                    System.out.println("Reverse");
                    while ((prods2 = r2.react()) != null) {
                        for (Molecule p2 : prods2) {
                            listFlags(p2);
                        }
                    }
                }
            }
        } catch (Exception ex) {
        }
    }

    private void listFlags(Molecule mol) {
        try {
            System.out.println(mol.exportToFormat("smiles"));
            for (MolAtom atom : mol.getAtomArray()) {
                System.out.println(atom.getFlags());
            }
        } catch (Exception ex) {
        }
    }
 
    public static void main(String[] args) {
        Test test = new Test();
    }
}


 


By the way, what is the syntax for checking if an atom is chiral using getFlags? Or is there another method?


Thanks


Stephen

User 7c177bab3b

30-11-2011 16:36:41

Might have been useful if I had included the output :-)


CC[C@@H](C)C(C)=O
81920
81922
81920
81920
81920
81920
81920
forward
CCC(C)=C(C)O
81920
81922
81920
81920
81920
81920
81920
Reverse
CC[C@@H](C)C(C)=O
81920
81922
81920
81920
81920
81920
81920
forward
CC[C@@H](C)C(O)=C
81920
81922
81920
81920
81920
81920
81920
Reverse
CC[C@@H](C)C(C)=O
81920
81922
81920
81920
81920
81920
81920

ChemAxon e08c317633

30-11-2011 16:58:44

Hi Stephen,


(I answered your questions two days ago, but my answer was lost...)


The parity flag in MolAtom is ignored if the atom is not chiral. For example if an sp2 carbon atom has a parity flag set, then it's just ignored by the Molecule.getParity(int) method.


Here is the output I get after I have slightly modified your code.


Modified code:


import chemaxon.reaction.Reactor;
import chemaxon.struc.Molecule;
import chemaxon.struc.StereoConstants;
import chemaxon.util.MolHandler;

public class ReactorStereoTest {

public static void main(String[] args) {
reactorTest();
}

public static void reactorTest() {
try {
Molecule[] prods;
Molecule[] prods2;
String smirks = "[#1:1][C:2][C:3]=[O:4]>>[C:2]=[C:3](-[O:4][#1:1])";
Molecule q = new MolHandler(smirks, true).getMolecule();
Reactor r1 = new Reactor();
r1.setReaction(q);
Reactor r2 = new Reactor();
r2.setReaction(q);
r2.setReverse(true);

Molecule mol = new MolHandler("C[C@H](CC)C(=O)C").getMolecule();
listFlags(mol);

r1.setReactant(mol);
while ((prods = r1.react()) != null) {
for (Molecule p : prods) {
System.out.println("forward");
listFlags(p);
r2.setReactant(p);
System.out.println("Reverse");
while ((prods2 = r2.react()) != null) {
for (Molecule p2 : prods2) {
listFlags(p2);
}
}
}
}
} catch (Exception ex) {
}
}

private static void listFlags(Molecule mol) {
try {
System.out.println(mol.exportToFormat("smiles"));
for (int i = 0; i < mol.getAtomCount(); i++) {
System.out.println((mol.getAtom(i).getFlags() & StereoConstants.PARITY_MASK) +" : "+mol.getParity(i));
}
} catch (Exception ex) {
}
}
}

 


Output:


CC[C@@H](C)C(C)=O
0 : 0
2 : 2
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
forward
CCC(C)=C(C)O
0 : 0
2 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
Reverse
CC[C@@H](C)C(C)=O
0 : 0
2 : 2
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
forward
CC[C@@H](C)C(O)=C
0 : 0
2 : 2
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
Reverse
CC[C@@H](C)C(C)=O
0 : 0
2 : 2
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0

I highlighted with red letters the important part. The 2nd atom in molecule "CCC(C)=C(C)O" has the parithy flag set, but it's not considered to have parity or chirality information as it's not tetrahedral. The Molecule.getParity(int) method returns 0 for this atom.


Zsolt


 

User 7c177bab3b

30-11-2011 17:27:19

Thanks Zsolt


So the reverse reaction on the double bond regenerates the chiral centre because the atom, whilst not tetrahedral, still has the flag set. Once it becomes tetrahedral again the atom remembers the original chirality.


However, this is not the behaviour that I would expect. 


Shouldn't the flag be cleared from the atom once it is no longer possible for it to be chiral?


 


Cheers


Stephen

ChemAxon e08c317633

07-12-2011 15:29:10

Stephen, you are right, achiral reaction products should not "remember" previous chirality information. We will fix it.


Workaround: export the products to SMILES, and then import them again. It will remove all irrelevant chiralily information.


Zsolt

ChemAxon e08c317633

07-11-2012 11:21:13

Fix for this issue is available in JChem 5.11.4.


Zsolt