In [1]:
Copied!
%%time
from IPython.core.display import HTML
import retropaths.helper_functions as hf
from retropaths.molecules.molecule import Molecule
from retropaths.reactions.pot import Pot
from pathlib import Path
library = hf.pload('../data/reactions.p')
HTML('<script src="//d3js.org/d3.v3.min.js"></script>')
%%time
from IPython.core.display import HTML
import retropaths.helper_functions as hf
from retropaths.molecules.molecule import Molecule
from retropaths.reactions.pot import Pot
from pathlib import Path
library = hf.pload('../data/reactions.p')
HTML('')
CPU times: user 6.57 s, sys: 654 ms, total: 7.22 s Wall time: 7.34 s
Out[1]:
In [2]:
Copied!
# let's take a molecule
mol = Molecule.from_smiles('c1cc(c(cc1N)F)O.c1cc(ccc1NC(=O)CC(=O)O)F') # <- you can change smiles here, of course
mol.draw()
# let's take a molecule
mol = Molecule.from_smiles('c1cc(c(cc1N)F)O.c1cc(ccc1NC(=O)CC(=O)O)F') # <- you can change smiles here, of course
mol.draw()
Out[2]:
In [3]:
Copied!
# You can create a Pot object with the molecule above, this will set up a Pot with
# empty environment
# and empty condition.
pot = Pot(mol, rxn_name='Tutorial_pot')
pot.draw() # the STATUS of the pot is EMPTY, because it has not been run yet.
# You can create a Pot object with the molecule above, this will set up a Pot with
# empty environment
# and empty condition.
pot = Pot(mol, rxn_name='Tutorial_pot')
pot.draw() # the STATUS of the pot is EMPTY, because it has not been run yet.
Out[3]:
Pot name: Tutorial_pot | Status: EMPTY
Acidity all_pH | Solvent any
Pot root
Pot environment
Pot reaction graph
Running the pot¶
In [5]:
Copied!
%%time
pot.run(library)
pot.draw() # NOTE: after the run is executed, the STATUS is: FINISHED
%%time
pot.run(library)
pot.draw() # NOTE: after the run is executed, the STATUS is: FINISHED
CPU times: user 13.8 s, sys: 24.4 ms, total: 13.9 s Wall time: 13.9 s
Out[5]:
Pot name: Tutorial_pot | Status: FINISHED - Time: 1.4e+01 s
Acidity all_pH | Solvent any
Pot root
Pot environment
Pot reaction graph
In [6]:
Copied!
# some pot properties
print(f'{pot.number_of_nodes=}\n{pot.clustering_coefficient=}\n{pot.average_node_degree=}\n{pot.leaves=}\n{pot.reactions_in_the_pot=}\n{pot.how_many_paths()=}')
# some pot properties
print(f'{pot.number_of_nodes=}\n{pot.clustering_coefficient=}\n{pot.average_node_degree=}\n{pot.leaves=}\n{pot.reactions_in_the_pot=}\n{pot.how_many_paths()=}')
pot.number_of_nodes=6 pot.clustering_coefficient=0.125 pot.average_node_degree=2.0 pot.leaves=[1, 3, 4, 5] pot.reactions_in_the_pot=['Fries-Rearrangement-ortho', 'Nucleophilic-Acyl-Substitution-Lg-Alkoxide-and-Nu-Amino', 'Nucleophilic-Acyl-Substitution-Lg-Hydroxyl-and-Nu-Alkoxide', 'Nucleophilic-Acyl-Substitution-Lg-Hydroxyl-and-Nu-Amino', 'Nucleophilic-Aromatic-Substitution-Lg-Fluorine-and-Nu-Alkoxide', 'Nucleophilic-Aromatic-Substitution-Lg-Fluorine-and-Nu-Amino'] pot.how_many_paths()=5
In [7]:
Copied!
from ipywidgets import interact
@interact(node_index=list(pot.graph.nodes))
def draw_reaction(node_index):
global N
N = node_index
return pot.draw_mol_and_subgraph_from_node(N)
from ipywidgets import interact
@interact(node_index=list(pot.graph.nodes))
def draw_reaction(node_index):
global N
N = node_index
return pot.draw_mol_and_subgraph_from_node(N)
interactive(children=(Dropdown(description='node_index', options=(0, 1, 2, 3, 4, 5), value=0), Output()), _dom…
In [8]:
Copied!
# Draw unique paths from node N
pot.draw_from_node(N, arrows=True)
# Draw unique paths from node N
pot.draw_from_node(N, arrows=True)
Out[8]:
Empty Path
Root Molecule
In [9]:
Copied!
pot.draw_neighbors_of_node(N)
pot.draw_neighbors_of_node(N)
Out[9]:
Children of node 0
0 -> 1
Nucleophilic-Acyl-Substitution-Lg-Hydroxyl-and-Nu-Amino
0 -> 2
Nucleophilic-Acyl-Substitution-Lg-Hydroxyl-and-Nu-Alkoxide
0 -> 3
Nucleophilic-Aromatic-Substitution-Lg-Fluorine-and-Nu-Alkoxide
0 -> 4
Nucleophilic-Aromatic-Substitution-Lg-Fluorine-and-Nu-Amino
In [10]:
Copied!
# WARNING BIG OUTPUT -> you can draw all the paths
# pot.draw(leaves=True)
# WARNING BIG OUTPUT -> you can draw all the paths
# pot.draw(leaves=True)
Molecules in POT¶
In [11]:
Copied!
# lookup dictionary for the content of EACH NODE in the reaction network graph.
pot.encountered_species
# lookup dictionary for the content of EACH NODE in the reaction network graph.
pot.encountered_species
Out[11]:
{'c1cc(c(cc1N)F)O.c1cc(ccc1NC(=O)CC(=O)O)F': 0, 'c1cc(ccc1NC(=O)CC(=O)Nc2ccc(c(c2)F)O)F': 1, 'c1cc(ccc1NC(=O)CC(=O)Oc2ccc(cc2F)N)F': 2, 'c1cc(ccc1NC(=O)CC(=O)O)Oc2ccc(cc2F)N': 3, 'c1cc(ccc1Nc2ccc(c(c2)F)O)NC(=O)CC(=O)O': 4, 'c1cc(ccc1NC(=O)CC(=O)c2cc(cc(c2O)F)N)F': 5}
In [12]:
Copied!
# This makes it easy to query
'C' in pot.encountered_species, 'c1cc(ccc1NC2=CC(=O)Nc3cc2c(c(c3)F)O)F' in pot.encountered_species
# This makes it easy to query
'C' in pot.encountered_species, 'c1cc(ccc1NC2=CC(=O)Nc3cc2c(c(c3)F)O)F' in pot.encountered_species
Out[12]:
(False, False)
In [13]:
Copied!
# Unique molecules found in the pot.
pot_unique_molecules = pot.unique_smiles() # NOTE: this is unique molecules, the one above is the CONTENT OF EACH NODE in the graph. A node can contain more than one molecule.
print(f'{pot_unique_molecules=}')
Molecule.draw_list([Molecule.from_smiles(x) for x in pot_unique_molecules])
# Unique molecules found in the pot.
pot_unique_molecules = pot.unique_smiles() # NOTE: this is unique molecules, the one above is the CONTENT OF EACH NODE in the graph. A node can contain more than one molecule.
print(f'{pot_unique_molecules=}')
Molecule.draw_list([Molecule.from_smiles(x) for x in pot_unique_molecules])
pot_unique_molecules={'c1cc(ccc1NC(=O)CC(=O)O)Oc2ccc(cc2F)N', 'c1cc(ccc1NC(=O)CC(=O)Nc2ccc(c(c2)F)O)F', 'c1cc(ccc1NC(=O)CC(=O)Oc2ccc(cc2F)N)F', 'c1cc(ccc1NC(=O)CC(=O)c2cc(cc(c2O)F)N)F', 'c1cc(ccc1Nc2ccc(c(c2)F)O)NC(=O)CC(=O)O'}
Out[13]:
In [ ]:
Copied!