| viewer_description = """ | |
| PDB viewer using 3Dmol.js | |
| If using please cite: | |
| 3Dmol.js: Molecular visualization with WebGL, Nicholas Rego, David Koes , Bioinformatics, Volume 31, Issue 8, April 2015, Pages 1322–1324, https://doi.org/10.1093/bioinformatics/btu829 | |
| See also: | |
| https://huggingface.co/blog/spaces_3dmoljs | |
| https://huggingface.co/spaces/simonduerr/3dmol.js/blob/main/app.py | |
| """ | |
| def gen_3dmol_vis(pdb_text: str, sdf_text: str): | |
| x = ( | |
| """<!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> | |
| <style> | |
| body{ | |
| font-family:sans-serif | |
| } | |
| .mol-container { | |
| width: 100%; | |
| height: 600px; | |
| position: relative; | |
| } | |
| .mol-container select{ | |
| background-image:None; | |
| } | |
| </style> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> | |
| <script src="https://3Dmol.csb.pitt.edu/build/3Dmol-min.js"></script> | |
| </head> | |
| <body> | |
| <div id="container" class="mol-container"></div> | |
| <script> | |
| let pdb = `""" + pdb_text + """` | |
| let sdf = `""" + sdf_text + """` | |
| $(document).ready(function () { | |
| let element = $("#container"); | |
| let config = { backgroundColor: "white" }; | |
| let viewer = $3Dmol.createViewer(element, config); | |
| viewer.addModel(pdb, "pdb", { format: "pdb" }); | |
| pdb_model = viewer.getModel(0); | |
| // Cartoon view for protein | |
| // First argument is a selector | |
| pdb_model.setStyle({}, {cartoon: {color: "spectrum", opacity: 0.8}}); | |
| viewer.addModel(sdf, "sdf", {format: "sdf"}); | |
| sdf_model = viewer.getModel(1); | |
| // Stick view for SDF | |
| sdf_model.setStyle({}, {stick: {color: "red", radius: 0.2, opacity: 0.8}}); | |
| viewer.zoomTo(); | |
| viewer.render(); | |
| // viewer.zoom(0.8, 2000); | |
| }) | |
| </script> | |
| </body></html>""" | |
| ) | |
| return f"""<iframe style="width: 100%; height: 600px" name="result" sandbox="allow-modals allow-forms | |
| allow-scripts allow-same-origin allow-popups | |
| allow-top-navigation-by-user-activation allow-downloads" allowfullscreen="" | |
| allowpaymentrequest="" frameborder="0" srcdoc='{x}'></iframe>""" | |