import gradio as gr import py3Dmol from Bio.PDB import * import numpy as np from Bio.PDB import PDBParser import pandas as pd import os, sys #sys.path.append(os.getcwd()) print('importing...') from run_gfn import run_gfn2 print('done') # JavaScript functions resid_hover = """function(atom,viewer) {{ if(!atom.label) {{ atom.label = viewer.addLabel('{0}:'+atom.atom+atom.serial, {{position: atom, backgroundColor: 'mintcream', fontColor:'black'}}); }} }}""" hover_func = """ function(atom,viewer) { if(!atom.label) { atom.label = viewer.addLabel(atom.interaction, {position: atom, backgroundColor: 'black', fontColor:'white'}); } }""" unhover_func = """ function(atom,viewer) { if(atom.label) { viewer.removeLabel(atom.label); delete atom.label; } }""" #def get_qm_atom_features(gfn2_output, checked_features): # qm_atom_features = {} # qm_atom_features['atom type'] = gfn2_output["fetchatomicprops"]["atmlist"] # for checked_feature in checked_features: # if checked_feature == 'Charge': # qm_atom_features['Charge'] = gfn2_output["fetchatomicprops"]["charges"] # if checked_feature == 'Polarizability': # qm_atom_features['Polarizability'] = gfn2_output["fetchatomicprops"]["polarisabilities"] # return qm_atom_features def get_qm_atom_features(gfn2_output): qm_atom_features = {} atom_list = gfn2_output["fetchatomicprops"]["atmlist"] charge = gfn2_output["fetchatomicprops"]["charges"] pol = gfn2_output["fetchatomicprops"]["polarisabilities"] #atom_list = atom_list.append('Molecule') #charge = charge.append("") #pol = pol.append(gfn2_output["totalpol"]) qm_atom_features['atom type'] = atom_list qm_atom_features['Charge'] = charge qm_atom_features['Polarizability'] = pol return qm_atom_features def get_qm_mol_features(gfn2_output): qm_mol_features = {} qm_mol_features['Total Energy'] = gfn2_output["etotal"] qm_mol_features['Total Polarizability'] = gfn2_output["totalpol"] return qm_mol_features def export_csv(d): d.to_csv("qm_atom_features.csv") return gr.File.update(value="qm_atom_features.csv", visible=True) def get_basic_visualization(input_f,input_format): view = py3Dmol.view(width=600, height=400) view.setBackgroundColor('white') view.addModel(input_f, input_format) view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': 'turquoise'}}}) #view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}},'cartoon': {'color': '#4c4e9e', 'alpha':"0.6"}}) view.zoomTo() output = view._make_html().replace("'", '"') print('output of html', output) x = f""" {output} """ # do not use ' in this input visualization_html = f"""""" return visualization_html def add_spheres_feature_view(view, feature,xyz, viewnum, sizefactor, spec_color): normalization = max(max(feature),abs(min(feature))) for i in range(len(feature)): if feature[i]<0: color="#a0210f" else: color=spec_color view.addSphere({'center':{ 'x':xyz[i][0], 'y':xyz[i][1], 'z':xyz[i][2]}, 'radius':abs(feature[i])/normalization*sizefactor,'color':color,'alpha':1.00}, viewer=viewnum) return view def add_densities(view, dens, color, viewnum): view.addVolumetricData(dens, "cube", {'isoval': 0.01, 'color': color, 'opacity': 1.0}, viewer=viewnum) return view def get_feature_visualization(input_f,input_format, features, xyz): view = py3Dmol.view(width=620, height=620, viewergrid=(2,2)) view.setBackgroundColor('white') view.addModel(input_f, input_format, viewer=(0,0)) #view.addModel(input_f, input_format, viewer=(0,1)) #view.addModel(input_f, input_format, viewer=(1,0)) view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}}}, viewer=(0,0)) #view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}}}, viewer=(0,1)) #view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}}}, viewer=(1,0)) #view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}}}, viewer=(0,1)) print('features', features) add_spheres_feature_view(view, features["fetchatomicprops"]["charges"], xyz, (0,1), 1.0, '#4c4e9e') add_spheres_feature_view(view, features["fetchatomicprops"]["polarisabilities"], xyz, (1,0), 1.0, '#809BAC') add_densities(view, open('dummy_struct_dens.cub', "r").read(), '#F7D7BE', (1,1)) #view.setStyle({'stick': {'colorscheme': {'prop': 'resi', 'C': '#cccccc'}},'cartoon': {'color': '#4c4e9e', 'alpha':"0.6"}}) view.zoomTo(viewer=(0,0)) output = view._make_html().replace("'", '"') x = f""" {output} """ # do not use ' in this input visualization_html = f"""""" return visualization_html def predict(input_file): input_f = open(input_file.name, "r").read() input_format = input_file.name.split('.')[-1] with open('dummy_struct.'+input_format, "w") as oF: oF.write(input_f) input_f2 = open('dummy_struct.'+input_format, "r").read() gfn2_input = ["filename","geom=dummy_struct."+input_format, 'calcdens=1'] gfn2_output = run_gfn2(gfn2_input) #qm_mol_features = get_qm_mol_features(gfn2_output, checked_features) #basic_visualization_html = get_basic_visualization(input_f,input_format) feature_visualization_html = get_feature_visualization(input_f,input_format, gfn2_output, gfn2_output['xyz']) qm_atom_features = get_qm_atom_features(gfn2_output) return feature_visualization_html, pd.DataFrame(qm_atom_features)#, pd.DataFrame(qm_mol_features, index=[0]) with gr.Blocks() as demo: gr.Markdown("# QM property calculation") #text_input = gr.Textbox() #text_output = gr.Textbox() #text_button = gr.Button("Flip") with gr.Row(): input_file = gr.File(label="Structure file for input") charge = gr.Textbox(placeholder="Total charge", label="Give the total charge of the input molecule. (Default=0)") #checked_features = gr.CheckboxGroup(["Charge", "Polarizability", "Koopman IP", "Electronic Density"], label="QM features", info="Which features shall be calculated?") #temperature = gr.Slider(value=300,minimum=0, maximum=1000, label="Temperature for Thermodynamics evaluation in K", step=5) single_btn = gr.Button(label="Run") with gr.Row(): basic_html = gr.HTML() gr.HighlightedText(value=[("Positive Charge","Purple"),("Negative charge","red"),("Polarizability","Light blue"), ("Electronic Densities", "Beige")], color_map={"red":"#a0210f", "Light blue":"#809BAC", "Purple":"#4c4e9e", "Beige":"#F7D7BE"}) with gr.Row(): Dbutton = gr.Button("Download calculated atom features") csv = gr.File(interactive=False, visible=False) with gr.Row(): df_atom_features = gr.Dataframe() #df_mol_features = gr.Dataframe() single_btn.click(fn=predict, inputs=[input_file], outputs=[basic_html, df_atom_features]) Dbutton.click(export_csv, df_atom_features, csv) demo.launch(server_name="0.0.0.0", server_port=7860)