Exemple #1
0
def _mols2imageStream(mols, f, format, size, legend, highlightMatch=None):
    """Return an input stream for the molecule as drawn"""
    highlights = None
    if highlightMatch:
        pattern = MolFromSmarts(highlightMatch)
        highlights = [mol.GetSubstructMatch(pattern) for mol in mols]
    kek = True
    if mols[0].HasProp("_drawingBondsWedged"):
        kek=False

    fit = False
    options = DrawingOptions() 
    subim = (size,size)
    if size >150:
        subim = (size *2,size *2)

        options.coordScale = 3
        options.bondLineWidth = 3.6
        options.dblBondOffset = 0.435
        options.atomLabelFontSize = 60
        if kek:
            options.bondLineWidth = 4.5
            options.dblBondOffset = 0.6
            options.atomLabelFontSize = 150

        fit = True
    elif kek:
        options.dblBondOffset = 0.4

        
    image = Draw.MolsToGridImage(mols,molsPerRow=min(len(mols),4),subImgSize=subim,
                                     kekulize=kek,highlightAtomLists=highlights, fitImage=fit,
                                    options=options
    )
    image.save(f, format)
def GenerateImageFile(ValidMols, MolNames, AtomLists, BondLists):
    """Generate a non SVG image file."""

    Outfile = OptionsInfo["Outfile"]

    NumOfMolsPerRow = OptionsInfo["NumOfMolsPerRow"]
    Width = OptionsInfo["MolImageWidth"]
    Height = OptionsInfo["MolImageHeight"]

    # Setup drawing options...
    UpdatedDrawingOptions = DrawingOptions()
    UpdatedDrawingOptions.atomLabelFontSize = int(
        OptionsInfo["AtomLabelFontSize"])
    UpdatedDrawingOptions.bondLineWidth = float(OptionsInfo["BondLineWidth"])

    MolsImage = Draw.MolsToGridImage(ValidMols,
                                     molsPerRow=NumOfMolsPerRow,
                                     subImgSize=(Width, Height),
                                     legends=MolNames,
                                     highlightAtomLists=AtomLists,
                                     highlightBondLists=BondLists,
                                     useSVG=False,
                                     kekulize=OptionsInfo["Kekulize"],
                                     options=UpdatedDrawingOptions)

    MiscUtil.PrintInfo("\nGenerating image file %s..." % Outfile)

    if MiscUtil.CheckFileExt(Outfile, "pdf"):
        if MolsImage.mode == 'RGBA':
            MolsImage = MolsImage.convert('RGB')

    MolsImage.save(Outfile)
def generate_png(mol, pngpath, logfile=devnull, size=300):
    with stdout_redirected(to=sys.stdout, stdout=sys.stderr):
        with stdout_redirected(to=logfile, stdout=sys.stdout):
            nhmol = RemoveHs(mol,
                             implicitOnly=False,
                             updateExplicitCount=True,
                             sanitize=False)
            SanitizeMol(nhmol, catchErrors=True)
            op = DrawingOptions()
            op.atomLabelFontSize = size / 25
            MolToFile(PrepareMolForDrawing(nhmol,forceCoords=True,addChiralHs=True),\
                pngpath,fitImage=True,size=(size, size),options=op)
Exemple #4
0
def _mols2imageStream(mols, f, format, size, legend, highlightMatch=None):
    """Return an input stream for the molecule as drawn"""
    highlights = None
    if highlightMatch:
        pattern = MolFromSmarts(highlightMatch)
        highlights = [mol.GetSubstructMatch(pattern) for mol in mols]
    kek = True
    if mols[0].HasProp("_drawingBondsWedged"):
        kek = False

    fit = False
    options = DrawingOptions()
    subim = (size, size)
    if size > 150:
        subim = (size * 2, size * 2)

        options.coordScale = 3
        options.bondLineWidth = 3.6
        options.dblBondOffset = 0.435
        options.atomLabelFontSize = 60
        if kek:
            options.bondLineWidth = 4.5
            options.dblBondOffset = 0.6
            options.atomLabelFontSize = 150

        fit = True
    elif kek:
        options.dblBondOffset = 0.4

    image = Draw.MolsToGridImage(mols,
                                 molsPerRow=min(len(mols), 4),
                                 subImgSize=subim,
                                 kekulize=kek,
                                 highlightAtomLists=highlights,
                                 fitImage=fit,
                                 options=options)
    image.save(f, format)
Exemple #5
0
from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions


# 二、芳香性
芳香性是一个简单又复杂的话题。无论是实验化学家还是理论化学家都无法给出一个明确的定义

rdkit除了通过模式匹配已知的芳香体系进行识别 , 还定义了一些识别方向体系的规则 。
这些具体规则如下 :

1.芳香性仅仅和环上的原子和键有关 。
2.芳香性键必须由2两个芳香性原子组成 。
3.由2个芳香性原子组成的键不一定就是芳香键。

m = Chem.MolFromSmiles('C1=CC2=C(C=C1)C1=CC=CC=C21')
opts = DrawingOptions()
opts.atomLabelFontSize = 400

opts.includeAtomNumbers = True
opts.dblBondLengthFrac = 0.8
opts.includeAtomNumbers = True
opts.dotsPerAngstrom = 1000
img = Draw.MolToImage(m, options=opts, size=(500, 500))
img.save(
    '/drug_development/studyRdkit/st_rdcit/img/mol41.jpg'
)

# 基于RDKit方向模型判断其上的原子和键的芳香性
atom3 = m.GetAtomWithIdx(3).GetIsAromatic()
atom6 = m.GetAtomWithIdx(6).GetIsAromatic()
bond_36 = m.GetBondBetweenAtoms(3, 6).GetIsAromatic()
Exemple #6
0
def gen_plot(QCA, fnm):
    try:
        d = np.loadtxt(fnm, usecols=(5, 2, 6), skiprows=3)
        if d.size == 0:
            return
    except StopIteration:
        print("No data for", fnm)
        return

    entry = np.genfromtxt(fnm,
                          usecols=(0, ),
                          skip_header=HEADER_LEN,
                          dtype=np.dtype("str"))[0]
    smiles = np.genfromtxt(fnm,
                           usecols=(7, ),
                           skip_header=HEADER_LEN,
                           dtype=np.dtype("str"),
                           comments=None)[0]
    scanned = np.genfromtxt(fnm,
                            usecols=(4, ),
                            skip_header=HEADER_LEN,
                            dtype=np.dtype("str"))[0]
    scanned = eval('[' + scanned.replace('-', ',') + ']')
    scanned = [x + 1 for x in scanned]
    #print(scanned)
    print(fnm, smiles)
    mol_id = np.genfromtxt(fnm,
                           usecols=(1, ),
                           skip_header=HEADER_LEN,
                           dtype=np.dtype("str"))

    with open(fnm, 'r') as fd:
        ds_name = fd.readline().strip("\n")
        method = fd.readline().strip("\n")
        basis = fd.readline().strip("\n")

    scan = d[:, 0]
    qm_abs_min = d[:, 1].min()
    qmene = d[:, 1] * const.hartree2kcalmol
    qmene -= qmene.min()
    mmene = d[:, 2]
    mmene -= mmene.min()

    mm_min_pt = scan[np.argsort(mmene)[0]]
    qm_min_pt = scan[np.argsort(qmene)[0]]

    qcmol = QCA.db.get(mol_id[0]).get("data")
    try:
        mol = rdutil.mol.build_from_smiles(smiles)
        molnoindex = rdutil.mol.build_from_smiles(
            re.sub(":[1-9][0-9]*", "", smiles))
    except Exception as e:
        print(e)
        return
    AllChem.ComputeGasteigerCharges(mol)
    totalcharge = 0.0
    for i, atom in enumerate(mol.GetAtoms()):
        totalcharge += float(atom.GetProp('_GasteigerCharge'))
    atom_map = rdutil.mol.atom_map(mol)
    inv = {val: key for key, val in atom_map.items()}
    #print(atom_map)
    scanned = [inv[i] for i in scanned]
    #scanned = [rdutil.mol.atom_map_invert( atom_map)[i] for i in scanned]
    #print(scanned)
    molflat = rdutil.mol.build_from_smiles(smiles)
    try:
        ret = rdutil.mol.embed_qcmol_3d(mol, qcmol)
        #print("EMBED WAS RET:", ret)
        #AllChem.GenerateDepictionMatching3DStructure(molflat, mol)
        AllChem.Compute2DCoords(molnoindex)
    except Exception as e:
        print("Could not generate conformation:")
        print(e)
        return
    options = DrawingOptions()
    options.atomLabelFontSize = 110
    options.atomLabelFontFace = "sans"
    options.dotsPerAngstrom = 400
    options.bondLineWidth = 8
    options.coordScale = 1
    png = Draw.MolToImage(molnoindex,
                          highlightAtoms=scanned,
                          highlightColor=[0, .8, 0],
                          size=(500 * 12, 500 * 4),
                          fitImage=True,
                          options=options)

    fig = plt.figure(figsize=(8, 3.5), dpi=300, constrained_layout=True)
    matplotlib.rc("font", **{"size": 10})
    gs = GridSpec(2, 2, figure=fig)
    ax1 = fig.add_subplot(gs[:2, 0])
    ax1.plot(scan, qmene, 'bo-', lw=1, ms=2, label="QM")
    ax1.plot(scan, mmene, 'ro-', lw=1, ms=2, label="MM")
    ax1.set_ylabel("Energy (kcal/mol)")
    ax1.set_xlabel("Scan value")
    ax1.spines['top'].set_visible(False)
    ax1.spines['right'].set_visible(False)
    ax1.legend(loc='best')
    ax2 = fig.add_subplot(gs[0, 1])
    ax2.imshow(png)
    ax2.axis('off')
    ax3 = fig.add_subplot(gs[1, 1])
    kwargs = {"fontsize": 8, "fontname": "Monospace"}
    #ax3.text(.5,1.1,"{:^60s}".format(re.sub(":[1-9][0-9]*","",smiles)), fontsize=4, fontname="Monospace", ha='center')
    ax3.text(0, .9, "{:<16s}{:>39s}".format("QCA Dataset:", ds_name), **kwargs)
    ax3.text(0, .8, "{:<16s}{:>39s}".format("QCA Entry:",
                                            entry.split("-")[1]), **kwargs)
    ax3.text(0, .7, "{:<16s}{:>39s}".format("MM spec:",
                                            "Parsley unconstrained"), **kwargs)
    ax3.text(0, .6, "{:<16s}{:>39s}".format("MM charges:",
                                            "ANTECHAMBER AM1-BCC"), **kwargs)
    ax3.text(
        0, .5, "{:<16s}{:>39s}".format("Total charge",
                                       "{:6.2f}".format(totalcharge)),
        **kwargs)
    ax3.text(
        0, .4, "{:<16s}{:>39s}".format("QM spec:",
                                       "{}/{}".format(method, basis)),
        **kwargs)
    ax3.text(
        0, .3, "{:<16s}{:>39s}".format("QM Absolute min:",
                                       "{:16.13e} au".format(qm_abs_min)),
        **kwargs)
    ax3.text(
        0, .2, "{:<16s}{:>39s}".format("QM Min point:",
                                       "{:8.2f}".format(qm_min_pt)), **kwargs)
    ax3.text(
        0, .1, "{:<16s}{:>39s}".format("MM Min point:",
                                       "{:8.2f}".format(mm_min_pt)), **kwargs)
    ax3.text(0, .0, "{:<16s}{:>39s}".format("OFFSB ver", "1.0"), **kwargs)
    ax3.axis('off')
    fig.savefig(re.sub("\.*$", ".png", fnm))
    fig = None
    plt.close("all")

    return