DiffLinker / output.py
igashov's picture
Added an option to select anchor atoms
92263a6
raw
history blame
7.15 kB
INITIAL_RENDERING_TEMPLATE = """<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<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.org/build/3Dmol.js"></script>
<style>
.mol-container {{
width: 600px;
height: 600px;
position: relative;
}}
.mol-container select{{
background-image:None;
}}
</style>
</head>
<body>
<div id="container" class="mol-container"></div>
<script>
$(document).ready(function() {{
let element = $("#container");
let config = {{ backgroundColor: "white" }};
let viewer = $3Dmol.createViewer(element, config);
let defaultStyle = {{ stick: {{ colorscheme: "greenCarbon" }} }};
viewer.addModel(`{molecule}`, "{fmt}");
viewer.getModel(0).setStyle(defaultStyle);
// document.cookie = document.cookie + "|selected_atoms:";
viewer.getModel(0).setClickable(
{{}},
true,
function (_atom, _viewer, _event, _container) {{
if (!_atom.isClicked) {{
_atom.isClicked = true;
_viewer.addStyle(
{{"serial": _atom.serial, "model": 0}},
{{"sphere": {{"color": "magenta", "radius": 0.4}} }}
);
// document.cookie = document.cookie + "atom_" + String(_atom.serial) + "-";
window.parent.postMessage({{
name: "atom_selection",
data: {{"atom": _atom.serial, "add": true}}
// data: JSON.stringify({{"add": _atom.serial}})
}}, "*");
}} else {{
delete _atom.isClicked;
_viewer.setStyle({{"serial": _atom.serial, "model": 0}}, defaultStyle);
// document.cookie = document.cookie.replace("atom_" + String(_atom.serial) + "-", "");
window.parent.postMessage({{
name: "atom_selection",
data: {{"atom": _atom.serial, "add": false}}
// data: JSON.stringify({{"remove": _atom.serial}})
}}, "*");
}}
_viewer.render();
}}
);
viewer.zoomTo();
viewer.zoom(0.7);
viewer.render();
}});
</script>
</body>
</html>
"""
SAMPLES_RENDERING_TEMPLATE = """<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<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.org/build/3Dmol.js"></script>
<style>
.mol-container {{
width: 600px;
height: 600px;
position: relative;
}}
.mol-container select{{
background-image:None;
}}
</style>
</head>
<body>
<div id="container" class="mol-container"></div>
<button id="fragments">Input Fragments</button>
<button id="molecule">Output Molecule</button>
<script>
let element = $("#container");
let config = {{ backgroundColor: "white" }};
let viewer = $3Dmol.createViewer( element, config );
$(document).ready(function() {{
viewer.addModel(`{fragments}`, "{fragments_fmt}")
viewer.getModel().setStyle({{ stick: {{ colorscheme:"greenCarbon" }} }})
viewer.getModel().hide();
viewer.addModel(`{molecule}`, "{molecule_fmt}")
viewer.getModel().setStyle({{ stick: {{ colorscheme:"greenCarbon" }} }})
viewer.zoomTo();
viewer.zoom(0.7);
viewer.render();
}});
$("#fragments").click(function() {{
viewer.getModel(0).show();
viewer.getModel(1).hide();
viewer.render();
}});
$("#molecule").click(function() {{
viewer.getModel(1).show();
viewer.getModel(0).hide();
viewer.render();
}});
</script>
</body>
</html>
"""
INVALID_FORMAT_MSG = """
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<style>
body{{
font-family:sans-serif
}}
</style>
</head>
<body>
<h3>Invalid file format: {extension}</h3>
Please upload the file in one of the following formats:
<ul>
<li>.pdb</li>
<li>.sdf</li>
<li>.mol</li>
<li>.mol2</li>
</ul>
</body>
</html>
"""
ERROR_FORMAT_MSG = """
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<style>
body{{
font-family:sans-serif
}}
</style>
</head>
<body>
<h3>Error:</h3>
{message}
</body>
</html>
"""
IFRAME_TEMPLATE = """<iframe style="width: 100%; height: 700px" name="result" allow="midi; geolocation; microphone; camera;
display-capture; encrypted-media;" 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='{html}'></iframe>"""
STARTUP_JS = """
() => {
window.selected_elements = {}
function handleMessage(event) {
// console.log("New message: ", event.data)
let atom = event.data.data["atom"];
let add = event.data.data["add"];
console.log("add: ", add, " atom: ", atom);
window.selected_elements[atom] = add;
}
window.addEventListener("message", handleMessage);
console.log("Listener Added");
}
"""
RETURN_SELECTION_JS = """
(input_file, n_steps, n_atoms, samples, hidden) => {
let selected = []
for (const [atom, add] of Object.entries(window.selected_elements)) {
if (add) {
console.log("Adding atom ", atom);
selected.push(String(atom));
window.parent.postMessage({
name: "atom_selection",
data: {"atom": parseInt(atom), "add": false}
}, "*");
}
}
console.log("Finished parsing");
return [input_file, n_steps, n_atoms, samples, selected.join(",")];
}
"""