Identifying anti-Bredt Bridgehead compounds? #6157
-
There are a few threads floating on the interwebs on identifying / counting bridgehead atoms. RDKit even has its own counter within rdMolDescriptors. However, I haven't found a discussion about how to generally identify compounds that violate Bredt's rule, which states that a bridgehead atom cannot be in a double bond (or be aromatic). Sometimes these wacky compounds get generated from reaction transformations and it would be great to be able to filter them out. Has anyone figured out a SMARTS pattern or other way to address this topic? |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 2 replies
-
@paconius Based on the complexity of identifying bridghead atoms in general, I don't think you can do this with a SMARTS. |
Beta Was this translation helpful? Give feedback.
-
I have been using this function to check for bredt violations, which returns True if there is a violation: def bredt_violation(mol):
"""filter to check if there's a violation of bredts rule
(no bridgehead double bonds). in this case also no aromatic bonds are
allowed so it also filters cyclophane type compounds (intendedly)
"""
problem=False
sssr_idx = [set(x) for x in list(Chem.GetSymmSSSR(mol))]
for i,ring1 in enumerate(sssr_idx):
for j,ring2 in enumerate(sssr_idx):
if i>j:
intersect_idx=ring1.intersection(ring2)
if len(intersect_idx)>2:
for idx in intersect_idx:
bh=False
neighbors = [a.GetIdx() for a
in mol.GetAtomWithIdx(idx).GetNeighbors()]
for nidx in neighbors:
if nidx not in intersect_idx:
bh=True
if bh==True:
bondtypes = [b.GetBondType() for b in
mol.GetAtomWithIdx(idx).GetBonds()]
if set(bondtypes) != {Chem.rdchem.BondType.SINGLE}:
problem=True
return problem i have not tested it thoroughly but it worked in my use case. |
Beta Was this translation helpful? Give feedback.
-
Interesting problem! Fortunately, there appear to be only 16 ring systems (substructures) with S<7, i.e. that must obey Bredt's rule.
Perhaps these can be added to RDKit's MolVS, as an additional sanity check. |
Beta Was this translation helpful? Give feedback.
-
Not super helpful but all of the Bredt violations have been coded up in C in https://github.com/StructureGenerator/surge |
Beta Was this translation helpful? Give feedback.
@paconius Based on the complexity of identifying bridghead atoms in general, I don't think you can do this with a SMARTS.
This would be pretty straightforward if the RDKit allowed you to get the bridgehead atoms (instead of just their counts) from Python, but that's unfortunately not currently possible (I will fix this for the next release). In the meantime you would have to duplicate the logic that's used to identify bridgeheads and work from that. The next release is coming in ~6 weeks, so I'll let you decide how urgent this is. :-)