Ejemplo n.º 1
0
class RexgenForwardSynthesizer:
    def __init__(self):
        # load trained model
        self.directcorefinder = DirectCoreFinder()
        self.directcorefinder.load_model()
        self.directcandranker = DirectCandRanker()
        self.directcandranker.load_model()

    def predict_outcome(self, list_of_mols, k=1):
        """
        Using a predictor, produce top-k most likely reactions

        Params:
        :list_of_mols: list of reactants and reagents (both of class Molecule)
                                     (former contribute atoms, latter don't)
        """
        react = ".".join([m.smiles for m in list_of_mols])
        (react, bond_preds, bond_scores,
         cur_att_score) = self.directcorefinder.predict(react)

        #---> TODO: add input check here: some molecules seem to be 'unparseable' <---#
        # this might be a problem of Rexgen, though
        outcomes = self.directcandranker.predict(react, bond_preds,
                                                 bond_scores)

        res = []
        for out in outcomes[:k]:
            smiles = out["smiles"][0]
            mol = Molecule(smiles)
            mol.set_synthesis(list_of_mols)
            res.append(mol)

        return res
Ejemplo n.º 2
0
class RexgenForwardSynthesizer(ForwardSynthesizer):
    def __init__(self):
        # load trained model
        self.directcorefinder = DirectCoreFinder()
        self.directcorefinder.load_model()
        self.directcandranker = DirectCandRanker()
        self.directcandranker.load_model()

    def predict_outcome(self, reaction, k=1):
        """
        Using a predictor, produce top-k most likely reactions

        Params:
            reaction {Reaction}
            k {int} - how many top predictions to set and return
        Returns:
            {list[Molecule]} - list of products of reaction
        """
        react = reaction.get_input_str()
        try:
            (react, bond_preds, bond_scores,
             cur_att_score) = self.directcorefinder.predict(react)
            outcomes = self.directcandranker.predict(react, bond_preds,
                                                     bond_scores)
        except RuntimeError as e:
            logging.error(f"Error occured in DirectCandRanker.predict: {e}")
            raise e

        res = []
        for out in outcomes:
            if out["smiles"]:  # may be empty for some reason?
                smiles = out["smiles"][0]
                mol = Molecule(smiles)
                mol.set_synthesis(reaction.inputs)
                res.append(mol)
            else:
                continue
        # outcomes are sorted by probability in decreasing order
        res = res[:k]

        # setting predicted products, if not already set:
        reaction.set_products(res)
        return res
 def __init__(self):
     # load trained model
     self.directcorefinder = DirectCoreFinder()
     self.directcorefinder.load_model()
     self.directcandranker = DirectCandRanker()
     self.directcandranker.load_model()
Ejemplo n.º 4
0
        return outcomes


if __name__ == '__main__':

    sys.path.insert(
        0,
        os.path.dirname(
            os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
    print(sys.path)

    from rexgen_direct.core_wln_global.directcorefinder import DirectCoreFinder
    from rexgen_direct.scripts.eval_by_smiles import edit_mol

    directcorefinder = DirectCoreFinder()
    directcorefinder.load_model()
    if len(sys.argv) < 2:
        print('Using example reaction')
        react = '[CH3:26][c:27]1[cH:28][cH:29][cH:30][cH:31][cH:32]1.[Cl:18][C:19](=[O:20])[O:21][C:22]([Cl:23])([Cl:24])[Cl:25].[NH2:1][c:2]1[cH:3][cH:4][c:5]([Br:17])[c:6]2[c:10]1[O:9][C:8]([CH3:11])([C:12](=[O:13])[O:14][CH2:15][CH3:16])[CH2:7]2'
        print(react)
    else:
        react = str(sys.argv[1])

    (react, bond_preds, bond_scores,
     cur_att_score) = directcorefinder.predict(react)

    directcandranker = DirectCandRanker()
    directcandranker.load_model()
    #outcomes = directcandranker.predict(react, bond_preds, bond_scores)
    outcomes = directcandranker.predict(react, bond_preds, bond_scores)
        return outcomes


if __name__ == '__main__':

    sys.path.insert(
        0,
        os.path.dirname(
            os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
    print(sys.path)

    from rexgen_direct.core_wln_global.directcorefinder import DirectCoreFinder
    from rexgen_direct.scripts.eval_by_smiles import edit_mol

    directcorefinder = DirectCoreFinder()
    directcorefinder.restore()
    if len(sys.argv) < 2:
        print('Using example reaction')
        react = '[CH3:26][c:27]1[cH:28][cH:29][cH:30][cH:31][cH:32]1.[Cl:18][C:19](=[O:20])[O:21][C:22]([Cl:23])([Cl:24])[Cl:25].[NH2:1][c:2]1[cH:3][cH:4][c:5]([Br:17])[c:6]2[c:10]1[O:9][C:8]([CH3:11])([C:12](=[O:13])[O:14][CH2:15][CH3:16])[CH2:7]2'
        print(react)
    else:
        react = str(sys.argv[1])

    (react, bond_preds, bond_scores,
     cur_att_score) = directcorefinder.predict(react)

    directcandranker = DirectCandRanker()
    directcandranker.restore()
    #outcomes = directcandranker.predict(react, bond_preds, bond_scores)
    outcomes = directcandranker.predict_smiles(react, bond_preds, bond_scores)
Ejemplo n.º 6
0
import rdkit.Chem.AllChem as AllChem
from PIL import Image, ImageOps
import rdkit.Chem.Draw as Draw

from IPython.display import SVG, display, clear_output
from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D

import sys
print(sys.path)
sys.path += [os.path.dirname(rexgen_direct_root)
             ]  # need to be able to import directcorefinder

from rexgen_direct.core_wln_global.directcorefinder import DirectCoreFinder
directcorefinder = DirectCoreFinder()
directcorefinder.restore()


def arrow():
    subImgSize = (115, 115)
    img, canvas = Draw._createCanvas(subImgSize)
    p0 = (10, subImgSize[1] // 2)
    p1 = (subImgSize[0] - 10, subImgSize[1] // 2)
    p3 = (subImgSize[0] - 20, subImgSize[1] // 2 - 10)
    p4 = (subImgSize[0] - 20, subImgSize[1] // 2 + 10)

    def drawthick(pa, pb, d=1):
        canvas.addCanvasLine(pa, pb, color=(0, 0, 0))
        pa = (pa[0], pa[1] + d)
        pb = (pb[0], pb[1] + d)
Ejemplo n.º 7
0
from rdkit.Chem.Draw import IPythonConsole, ReactionToImage, MolToImage, MolsToGridImage
import rdkit.Chem.AllChem as AllChem
from PIL import Image, ImageOps
import rdkit.Chem.Draw as Draw

from IPython.display import SVG, display, clear_output
from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D

import sys
print(sys.path)
sys.path += [os.path.dirname(rexgen_direct_root)] # need to be able to import directcorefinder

from rexgen_direct.core_wln_global.directcorefinder import DirectCoreFinder
directcorefinder = DirectCoreFinder()
directcorefinder.load_model()

def arrow():
    subImgSize = (115, 115)
    img, canvas = Draw._createCanvas(subImgSize)
    p0 = (10, subImgSize[1]//2)
    p1 = (subImgSize[0]-10, subImgSize[1]//2)
    p3 = (subImgSize[0]-20, subImgSize[1]//2-10)
    p4 = (subImgSize[0]-20, subImgSize[1]//2+10)
    
    
    def drawthick(pa, pb, d=1):
        canvas.addCanvasLine(pa, pb, color=(0, 0, 0))
        pa = (pa[0], pa[1]+d)
        pb = (pb[0], pb[1]+d)