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