mgbam commited on
Commit
eaf86b1
·
verified ·
1 Parent(s): 48c2479

Create molecule_viewer.py

Browse files
Files changed (1) hide show
  1. genesis/molecule_viewer.py +45 -0
genesis/molecule_viewer.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # genesis/molecule_viewer.py
2
+ import requests
3
+ from typing import Optional
4
+
5
+ def fetch_pdb(pdb_id: str) -> Optional[str]:
6
+ """Fetch PDB file from RCSB."""
7
+ url = f"https://files.rcsb.org/download/{pdb_id.upper()}.pdb"
8
+ r = requests.get(url)
9
+ if r.status_code == 200:
10
+ return r.text
11
+ return None
12
+
13
+ def fetch_alphafold(uniprot_id: str) -> Optional[str]:
14
+ """Fetch PDB model from AlphaFold."""
15
+ url = f"https://alphafold.ebi.ac.uk/files/AF-{uniprot_id}-F1-model_v4.pdb"
16
+ r = requests.get(url)
17
+ if r.status_code == 200:
18
+ return r.text
19
+ return None
20
+
21
+ def render_3dmol(pdb_data: str) -> str:
22
+ """Generate HTML for 3Dmol.js viewer with biotech neon styling."""
23
+ return f"""
24
+ <div id="viewer" style="width: 100%; height: 600px; background-color: black; border: 2px solid #00ff99; box-shadow: 0 0 20px #ff6600;"></div>
25
+ <script src="https://3dmol.csb.pitt.edu/build/3Dmol-min.js"></script>
26
+ <script>
27
+ let viewer = $3Dmol.createViewer('viewer', {{ backgroundColor: 'black' }});
28
+ let pdbData = `{pdb_data}`;
29
+ viewer.addModel(pdbData, "pdb");
30
+ viewer.setStyle({{}}, {{cartoon: {{color: 'spectrum'}}}});
31
+ viewer.zoomTo();
32
+ viewer.render();
33
+ </script>
34
+ """
35
+
36
+ def get_molecule_view(pdb_or_gene: str) -> str:
37
+ """Fetch molecule structure and return 3D viewer HTML."""
38
+ # Try PDB ID first
39
+ pdb_data = fetch_pdb(pdb_or_gene)
40
+ if not pdb_data:
41
+ # Try AlphaFold with UniProt ID or gene name
42
+ pdb_data = fetch_alphafold(pdb_or_gene)
43
+ if pdb_data:
44
+ return render_3dmol(pdb_data)
45
+ return f"<p style='color:red;'>No structure found for {pdb_or_gene}</p>"