Spaces:
Running
on
Zero
Running
on
Zero
fix visualiser
Browse files
app.py
CHANGED
|
@@ -14,6 +14,8 @@ from esm.utils import residue_constants as RC
|
|
| 14 |
import requests
|
| 15 |
from dotenv import load_dotenv
|
| 16 |
import torch
|
|
|
|
|
|
|
| 17 |
|
| 18 |
load_dotenv()
|
| 19 |
|
|
@@ -187,15 +189,16 @@ def align_after_prediction(protein: ESMProtein, structure_prediction: ESMProtein
|
|
| 187 |
|
| 188 |
def visualize_after_pred(protein: ESMProtein, aligned: ESMProtein):
|
| 189 |
if aligned is None:
|
| 190 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
|
| 192 |
-
|
| 193 |
-
view.addModel(protein_to_pdb(protein), "pdb")
|
| 194 |
-
view.setStyle({"cartoon": {"color": "lightgrey"}})
|
| 195 |
-
view.addModel(protein_to_pdb(aligned), "pdb")
|
| 196 |
-
view.setStyle({"model": 1}, {"cartoon": {"color": "lightgreen"}})
|
| 197 |
-
view.zoomTo()
|
| 198 |
-
return view
|
| 199 |
|
| 200 |
def protein_to_pdb(protein: ESMProtein):
|
| 201 |
pdb_str = ""
|
|
@@ -206,42 +209,58 @@ def protein_to_pdb(protein: ESMProtein):
|
|
| 206 |
pdb_str += f"ATOM {i*37+j+1:5d} {atom:3s} {aa:3s} A{i+1:4d} {x:8.3f}{y:8.3f}{z:8.3f}\n"
|
| 207 |
return pdb_str
|
| 208 |
|
| 209 |
-
def prediction_visualization(pdb_file, num_runs: int, noise_level: float, num_frames: int):
|
| 210 |
protein = get_protein(pdb_file)
|
| 211 |
runs = []
|
| 212 |
|
| 213 |
-
|
|
|
|
|
|
|
|
|
|
| 214 |
noisy_protein = add_noise_to_coordinates(protein, noise_level)
|
| 215 |
|
| 216 |
for i in range(num_runs):
|
|
|
|
| 217 |
structure_prediction = run_structure_prediction(noisy_protein)
|
| 218 |
if structure_prediction is not None:
|
| 219 |
aligned, crmsd = align_after_prediction(protein, structure_prediction)
|
| 220 |
if aligned is not None:
|
| 221 |
runs.append((crmsd, aligned))
|
|
|
|
| 222 |
|
| 223 |
if not runs:
|
| 224 |
return None, "No successful predictions"
|
| 225 |
|
| 226 |
best_aligned = sorted(runs, key=lambda x: x[0])[0]
|
| 227 |
-
|
| 228 |
-
return
|
| 229 |
|
| 230 |
-
def run_prediction(pdb_file, num_runs, noise_level, num_frames):
|
| 231 |
try:
|
| 232 |
if pdb_file is None:
|
| 233 |
return "Please upload a PDB file.", "No file uploaded"
|
| 234 |
|
| 235 |
-
|
| 236 |
-
|
|
|
|
| 237 |
return "No successful predictions were made. Try adjusting the parameters or check the PDB file.", crmsd_text
|
| 238 |
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
<div style="height: 600px;">
|
| 242 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 243 |
</div>
|
| 244 |
-
"""
|
|
|
|
|
|
|
| 245 |
except Exception as e:
|
| 246 |
error_message = str(e)
|
| 247 |
stack_trace = traceback.format_exc()
|
|
|
|
| 14 |
import requests
|
| 15 |
from dotenv import load_dotenv
|
| 16 |
import torch
|
| 17 |
+
import json
|
| 18 |
+
import time
|
| 19 |
|
| 20 |
load_dotenv()
|
| 21 |
|
|
|
|
| 189 |
|
| 190 |
def visualize_after_pred(protein: ESMProtein, aligned: ESMProtein):
|
| 191 |
if aligned is None:
|
| 192 |
+
return None
|
| 193 |
+
|
| 194 |
+
viewer = py3Dmol.view(width=800, height=600)
|
| 195 |
+
viewer.addModel(protein_to_pdb(protein), "pdb")
|
| 196 |
+
viewer.setStyle({"cartoon": {"color": "lightgrey"}})
|
| 197 |
+
viewer.addModel(protein_to_pdb(aligned), "pdb")
|
| 198 |
+
viewer.setStyle({"model": -1}, {"cartoon": {"color": "lightgreen"}})
|
| 199 |
+
viewer.zoomTo()
|
| 200 |
|
| 201 |
+
return viewer.render()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
|
| 203 |
def protein_to_pdb(protein: ESMProtein):
|
| 204 |
pdb_str = ""
|
|
|
|
| 209 |
pdb_str += f"ATOM {i*37+j+1:5d} {atom:3s} {aa:3s} A{i+1:4d} {x:8.3f}{y:8.3f}{z:8.3f}\n"
|
| 210 |
return pdb_str
|
| 211 |
|
| 212 |
+
def prediction_visualization(pdb_file, num_runs: int, noise_level: float, num_frames: int, progress=gr.Progress()):
|
| 213 |
protein = get_protein(pdb_file)
|
| 214 |
runs = []
|
| 215 |
|
| 216 |
+
total_iterations = num_frames * num_runs
|
| 217 |
+
progress(0, desc="Starting predictions")
|
| 218 |
+
|
| 219 |
+
for frame in progress.tqdm(range(num_frames), desc="Processing frames"):
|
| 220 |
noisy_protein = add_noise_to_coordinates(protein, noise_level)
|
| 221 |
|
| 222 |
for i in range(num_runs):
|
| 223 |
+
progress((frame * num_runs + i + 1) / total_iterations, desc=f"Frame {frame+1}, Run {i+1}")
|
| 224 |
structure_prediction = run_structure_prediction(noisy_protein)
|
| 225 |
if structure_prediction is not None:
|
| 226 |
aligned, crmsd = align_after_prediction(protein, structure_prediction)
|
| 227 |
if aligned is not None:
|
| 228 |
runs.append((crmsd, aligned))
|
| 229 |
+
time.sleep(0.1) # Small delay to allow for UI updates
|
| 230 |
|
| 231 |
if not runs:
|
| 232 |
return None, "No successful predictions"
|
| 233 |
|
| 234 |
best_aligned = sorted(runs, key=lambda x: x[0])[0]
|
| 235 |
+
view_data = visualize_after_pred(protein, best_aligned[1])
|
| 236 |
+
return view_data, f"Best cRMSD: {best_aligned[0]:.4f}"
|
| 237 |
|
| 238 |
+
def run_prediction(pdb_file, num_runs, noise_level, num_frames, progress=gr.Progress()):
|
| 239 |
try:
|
| 240 |
if pdb_file is None:
|
| 241 |
return "Please upload a PDB file.", "No file uploaded"
|
| 242 |
|
| 243 |
+
progress(0, desc="Starting prediction")
|
| 244 |
+
view_data, crmsd_text = prediction_visualization(pdb_file, num_runs, noise_level, num_frames, progress)
|
| 245 |
+
if view_data is None:
|
| 246 |
return "No successful predictions were made. Try adjusting the parameters or check the PDB file.", crmsd_text
|
| 247 |
|
| 248 |
+
progress(0.9, desc="Rendering visualization")
|
| 249 |
+
html_content = f"""
|
| 250 |
+
<div style="height: 600px; width: 100%;">
|
| 251 |
+
<script src="https://3dmol.csb.pitt.edu/build/3Dmol-min.js"></script>
|
| 252 |
+
<div id="container-{id(view_data)}" style="height: 100%; width: 100%; position: relative;"></div>
|
| 253 |
+
<script>
|
| 254 |
+
var viewer = $3Dmol.createViewer(document.getElementById("container-{id(view_data)}"), {{defaultcolors: $3Dmol.rasmolElementColors}});
|
| 255 |
+
viewer.addModel({json.dumps(view_data['pdb'])}, "pdb");
|
| 256 |
+
viewer.setStyle({{}}, {json.dumps(view_data['style'])});
|
| 257 |
+
viewer.zoomTo();
|
| 258 |
+
viewer.render();
|
| 259 |
+
</script>
|
| 260 |
</div>
|
| 261 |
+
"""
|
| 262 |
+
progress(1.0, desc="Completed")
|
| 263 |
+
return html_content, crmsd_text
|
| 264 |
except Exception as e:
|
| 265 |
error_message = str(e)
|
| 266 |
stack_trace = traceback.format_exc()
|