I'm not sure if this is a good candidate for the cookbook. As Ivan said,
it's a pretty dangerous function (exponentially complex) to run on
molecules of arbitrary size/complexity. You may want a path-based approach
with a cutoff for ring-size. (e.g. using
https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.unweighted.single_target_shortest_path.html#networkx.algorithms.shortest_paths.unweighted.single_target_shortest_path
)

*dan nealschneider* | lead developer
[image: Schrodinger Logo] <https://www.schrodinger.com/>


On Tue, Mar 17, 2020 at 6:50 AM Scalfani, Vincent <vfscalf...@ua.edu> wrote:

> Hello Ivan and all,
>
>
> I found this old thread about counting rings in bicyclics and I would like
> to add it to the RDKit Cookbook, however, I'm not able to get the fuse
> function to work. I get a 'Mol object is not iterable' error.
>
>
> Any help appreciated. Thanks.
>
>
> Vin
>
>
> ------------------------------
> *From:* Ivan Tubert-Brohman <ivan.tubert-broh...@schrodinger.com>
> *Sent:* Wednesday, December 5, 2018 9:06 AM
> *To:* baptiste.cana...@gmail.com
> *Cc:* RDKit Discuss
> *Subject:* Re: [Rdkit-discuss] Count rings in bicyclic compounds
>
> Hi Baptiste,
>
> RDKit focuses on "simple rings". As far as I know, it has no builtin
> function to return all possible cycles in a molecule.
>
> For a molecule with a "basis set" of N rings, there can be up to 2^N-1
> ring systems, which can be obtained by taking all possible subsets (aka the
> powerset) of rings and fusing them. Below is an implementation based on
> fusing simple rings. Another possibility would be to write an exhaustive
> ring search (DFS or BFS) of the molecular graph and report all cycles that
> are found, instead of only the simple ones.
>
> *Warning*: do not run this code on fullerenes or similar molecules unless
> you are prepared to wait for a long, long time!
>
> def all_bond_rings(mol):
>     """
>     Generate all ring systems for a molecule. A Ring is a set of bond
> indexes.
>
>     :type mol: rdkit.Chem.Mol
>     :rtype: set of int
>     """
>     ring_info = mol.GetRingInfo()
>     rings = [set(r) for r in ring_info.BondRings()]
>
>     # Truncate nrings to the basis set size because RDKit returns redundant
>     # rings (e.g., 6 instead of 5 for cubane).
>     nfrags = len(Chem.GetMolFrags(mol))
>     nrings = mol.GetNumBonds() - mol.GetNumAtoms() + nfrags
>     del rings[nrings:]
>
>     for i in range(1, len(rings)+1):
>         for comb in itertools.combinations(rings, i):
>             fused = fuse(comb)
>             if fused:
>                 yield fused
>
> def fuse(rings):
>     """
>     Return the ring system that results from fusing the given rings, if the
>     rings are fusable into a single ring system; otherwise None.
>
>     :type rings: list of set of int
>     :rtype: set of in
>     """
>     pending = list(rings)
>     fused = set(pending.pop())
>     while pending:
>         for i in range(len(pending)):
>             ring = pending[i]
>             if fused & ring: # rings are fused
>                 fused ^= ring
>                 del pending[i]
>                 break
>         else:
>             # None of the pending rings were fusable!
>             return None
>     return fused
>
> Hope this helps,
> Ivan
>
>
>
> On Wed, Dec 5, 2018 at 5:54 AM Baptiste CANAULT <
> baptiste.cana...@gmail.com> wrote:
>
>> Hi RDKiters,
>>
>> I would like to identify all cycles present in a molecular
>> structure. However, when the molecules correspond to bicyclic compounds,
>> the ring count does not correspond to the number actually observed in the
>> structure. Simple example:
>>
>> >>> m = Chem.MolFromSmiles('C1CC2CCC1O2')
>> >>> r = m.GetRingInfo()
>> >>> r.NumRings()
>> 2
>>
>> In reality, this molecular structure has 3 cycles with the cyclohexan. Am
>> I completely wrong and is there a trick to identify all the cycles present
>> in a structure?
>>
>> Thanks in advance,
>>
>> Best regards,
>>
>> Baptiste
>> _______________________________________________
>> Rdkit-discuss mailing list
>> Rdkit-discuss@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
>>
> _______________________________________________
> Rdkit-discuss mailing list
> Rdkit-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
>
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to