<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.docking.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bromero</id>
	<title>DISI - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.docking.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bromero"/>
	<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Special:Contributions/Bromero"/>
	<updated>2026-08-23T16:38:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17399</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17399"/>
		<updated>2026-07-13T22:09:47Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[File:Web-interface.png|thumb]]&lt;br /&gt;
[[File:Ex._Results_.png|thumb]]&lt;br /&gt;
[[File:Example results.png|thumb]]&lt;br /&gt;
[[File:Ex results with building blocks.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
As of 7/13/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results (also enumeration)--all info is from Chemistry Commons and uses RDKit.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc (port 8001)&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=retro-blockbalster@gmail.com&lt;br /&gt;
SMTP_PASSWORD=abcdefghijklmnop&lt;br /&gt;
FROM_EMAIL=retro-blockbalster@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Ex_results_with_building_blocks.png&amp;diff=17398</id>
		<title>File:Ex results with building blocks.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Ex_results_with_building_blocks.png&amp;diff=17398"/>
		<updated>2026-07-13T22:09:42Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;4 Synthons&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Example_results.png&amp;diff=17397</id>
		<title>File:Example results.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Example_results.png&amp;diff=17397"/>
		<updated>2026-07-13T22:08:22Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enumeration&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17396</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17396"/>
		<updated>2026-07-13T22:05:43Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[File:Web-interface.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
As of 7/13/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results (also enumeration)--all info is from Chemistry Commons and uses RDKit.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc (port 8001)&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=retro-blockbalster@gmail.com&lt;br /&gt;
SMTP_PASSWORD=abcdefghijklmnop&lt;br /&gt;
FROM_EMAIL=retro-blockbalster@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Ex._Results_.png&amp;diff=17395</id>
		<title>File:Ex. Results .png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Ex._Results_.png&amp;diff=17395"/>
		<updated>2026-07-13T22:04:06Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Synthons&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Web-interface.png&amp;diff=17394</id>
		<title>File:Web-interface.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Web-interface.png&amp;diff=17394"/>
		<updated>2026-07-13T22:03:36Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Landing page&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17393</id>
		<title>ADMET Builder</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17393"/>
		<updated>2026-07-13T22:00:23Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ADMET Builder (OpenADMET) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 7/6/26, &#039;&#039;&#039;ADMET Builder&#039;&#039;&#039; is an internal Irwin Lab web tool for submitting one or more compounds in SMILES format and receiving OpenADMET prediction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on C7 using the `openadmet-models` conda environment.&lt;br /&gt;
&lt;br /&gt;
ADMET Builder returns:&lt;br /&gt;
&lt;br /&gt;
* Molecular formula&lt;br /&gt;
* SMILES string&lt;br /&gt;
* RDKit-generated 2D structure image&lt;br /&gt;
* logD&lt;br /&gt;
* Caco-2 A to B permeability&lt;br /&gt;
* Caco-2 B to A permeability&lt;br /&gt;
* Mouse plasma protein binding&lt;br /&gt;
* Human plasma protein binding&lt;br /&gt;
* Downloadable CSV output&lt;br /&gt;
&lt;br /&gt;
[[File:ADMET builder.png|thumb]]&lt;br /&gt;
[[File:ADMET builder results.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
Log into C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
If using SwitchyOmega, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the SOCKS proxy is not running, start it from a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app.py&lt;br /&gt;
static/index.html&lt;br /&gt;
static/styles.css&lt;br /&gt;
static/app.js&lt;br /&gt;
.gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repository ==&lt;br /&gt;
&lt;br /&gt;
GitLab repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gitlab.docking.org/USERNAME/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using HTTPS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://gitlab.docking.org/USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using SSH:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.docking.org:USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend uses the OpenADMET conda environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python dependencies include:&lt;br /&gt;
&lt;br /&gt;
* Flask&lt;br /&gt;
* pandas&lt;br /&gt;
* RDKit&lt;br /&gt;
* OpenADMET models package&lt;br /&gt;
&lt;br /&gt;
The OpenADMET model directory is expected at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/permeability-logd-ppb-chemeleon-baseline/anvil_training&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The browser URL is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -S admet-builder&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
Example SMILES input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CCO&lt;br /&gt;
c1ccccc1&lt;br /&gt;
CC(=O)Oc1ccccc1C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Larger test molecule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test API With curl ==&lt;br /&gt;
&lt;br /&gt;
Test the API from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8501/predict-smiles \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;smiles&amp;quot;:[&amp;quot;CCO&amp;quot;,&amp;quot;c1ccccc1&amp;quot;,&amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;]}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current API Endpoint ==&lt;br /&gt;
&lt;br /&gt;
Main endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /predict-smiles&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example JSON request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;smiles&amp;quot;: [&lt;br /&gt;
    &amp;quot;CCO&amp;quot;,&lt;br /&gt;
    &amp;quot;c1ccccc1&amp;quot;,&lt;br /&gt;
    &amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example response contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;csv&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;rows&amp;quot;: [],&lt;br /&gt;
  &amp;quot;columns&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frontend uses this response to display the results table and automatically download the CSV.&lt;br /&gt;
&lt;br /&gt;
== How It Works ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder has three major parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Layer&lt;br /&gt;
! Technology&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Frontend&lt;br /&gt;
| HTML, CSS, JavaScript&lt;br /&gt;
| User interface, SMILES input, results table, and structure image display&lt;br /&gt;
|-&lt;br /&gt;
| Backend API&lt;br /&gt;
| Flask&lt;br /&gt;
| Receives SMILES, runs predictions, and returns results&lt;br /&gt;
|-&lt;br /&gt;
| Prediction Engine&lt;br /&gt;
| OpenADMET&lt;br /&gt;
| Generates ADMET predictions from molecular input&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Backend flow:&lt;br /&gt;
&lt;br /&gt;
# Receives SMILES strings from the website.&lt;br /&gt;
# Converts the SMILES into a temporary CSV file.&lt;br /&gt;
# Runs the OpenADMET command-line prediction tool.&lt;br /&gt;
# Reads the OpenADMET output CSV.&lt;br /&gt;
# Uses RDKit to calculate molecular formulas.&lt;br /&gt;
# Uses RDKit to generate 2D molecular structure images.&lt;br /&gt;
# Sends results back to the web interface as JSON.&lt;br /&gt;
# Provides the same results as a downloadable CSV file.&lt;br /&gt;
&lt;br /&gt;
== Modularity ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is modular by design. The frontend, backend, and prediction engine are separated so each part can be reused or replaced.&lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
&lt;br /&gt;
* The frontend can be redesigned without changing the model logic.&lt;br /&gt;
* The Flask backend can support new endpoints.&lt;br /&gt;
* Additional OpenADMET models can be added later.&lt;br /&gt;
* Other chemistry tools can be wrapped using the same backend pattern.&lt;br /&gt;
* The results table can be adapted for different prediction outputs.&lt;br /&gt;
* The SMILES-to-structure display can be reused in other cheminformatics apps.&lt;br /&gt;
* The app can serve as a template for future scientific web interfaces.&lt;br /&gt;
&lt;br /&gt;
Because of this structure, ADMET Builder can be used both as a working lab tool and as a starting point for other modular research software.&lt;br /&gt;
&lt;br /&gt;
== Output ==&lt;br /&gt;
&lt;br /&gt;
The output table includes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Column&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Molecule&lt;br /&gt;
| Molecular formula calculated from the SMILES string&lt;br /&gt;
|-&lt;br /&gt;
| SMILES&lt;br /&gt;
| Input molecule string&lt;br /&gt;
|-&lt;br /&gt;
| Structure Image&lt;br /&gt;
| RDKit-generated 2D molecular structure&lt;br /&gt;
|-&lt;br /&gt;
| logD&lt;br /&gt;
| Predicted distribution coefficient&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 A to B&lt;br /&gt;
| Predicted apical-to-basolateral permeability&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 B to A&lt;br /&gt;
| Predicted basolateral-to-apical permeability&lt;br /&gt;
|-&lt;br /&gt;
| Mouse PPB&lt;br /&gt;
| Predicted mouse plasma protein binding&lt;br /&gt;
|-&lt;br /&gt;
| Human PPB&lt;br /&gt;
| Predicted human plasma protein binding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CSV download contains the same prediction values in a machine-readable format.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on C7.&lt;br /&gt;
* The app is running on port 8501.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1074.&lt;br /&gt;
* The browser is using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SwitchyOmega Proxy Error ===&lt;br /&gt;
&lt;br /&gt;
If Chrome says the proxy failed, the SOCKS proxy may not be running.&lt;br /&gt;
&lt;br /&gt;
Start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwitchyOmega should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8501:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Missing pandas or Flask ===&lt;br /&gt;
&lt;br /&gt;
This usually means the conda environment is not active.&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RDKit Image Error ===&lt;br /&gt;
&lt;br /&gt;
Make sure the app is running inside the `openadmet-models` environment, which includes RDKit.&lt;br /&gt;
&lt;br /&gt;
Test RDKit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is a research tool. Its predictions are intended for screening, comparison, prioritization, and exploration.&lt;br /&gt;
&lt;br /&gt;
Results should not be treated as experimental measurements.&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, ADMET Builder should eventually be placed behind an internal hostname or proxy.&lt;br /&gt;
&lt;br /&gt;
== Attribution ==&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&amp;lt;br&amp;gt;&lt;br /&gt;
Released as part of an open-source UCSF research tool; please credit the creator and lab when using or adapting this work.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:ADMET_builder_results.png&amp;diff=17392</id>
		<title>File:ADMET builder results.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:ADMET_builder_results.png&amp;diff=17392"/>
		<updated>2026-07-13T21:59:46Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;results&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:ADMET_builder.png&amp;diff=17391</id>
		<title>File:ADMET builder.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:ADMET_builder.png&amp;diff=17391"/>
		<updated>2026-07-13T21:58:55Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ADMET builder&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17390</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17390"/>
		<updated>2026-07-10T21:29:37Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results (also enumeration)--all info is from Chemistry Commons and uses RDKit.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc (port 8001)&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 USER@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=retro-blockbalster@gmail.com&lt;br /&gt;
SMTP_PASSWORD=abcdefghijklmnop&lt;br /&gt;
FROM_EMAIL=retro-blockbalster@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17377</id>
		<title>ADMET Builder</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17377"/>
		<updated>2026-07-07T00:23:52Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ADMET Builder (OpenADMET) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:ADMET builder webpage.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
As of 7/6/26, &#039;&#039;&#039;ADMET Builder&#039;&#039;&#039; is an internal Irwin Lab web tool for submitting one or more compounds in SMILES format and receiving OpenADMET prediction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on C7 using the `openadmet-models` conda environment.&lt;br /&gt;
&lt;br /&gt;
ADMET Builder returns:&lt;br /&gt;
&lt;br /&gt;
* Molecular formula&lt;br /&gt;
* SMILES string&lt;br /&gt;
* RDKit-generated 2D structure image&lt;br /&gt;
* logD&lt;br /&gt;
* Caco-2 A to B permeability&lt;br /&gt;
* Caco-2 B to A permeability&lt;br /&gt;
* Mouse plasma protein binding&lt;br /&gt;
* Human plasma protein binding&lt;br /&gt;
* Downloadable CSV output&lt;br /&gt;
&lt;br /&gt;
[[File:Results.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
Log into C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
pwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
If using SwitchyOmega, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the SOCKS proxy is not running, start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app.py&lt;br /&gt;
static/index.html&lt;br /&gt;
static/styles.css&lt;br /&gt;
static/app.js&lt;br /&gt;
.gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repository ==&lt;br /&gt;
&lt;br /&gt;
GitLab repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gitlab.docking.org/USERNAME/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using HTTPS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://gitlab.docking.org/USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using SSH:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.docking.org:USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend uses the OpenADMET conda environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python dependencies include:&lt;br /&gt;
&lt;br /&gt;
* Flask&lt;br /&gt;
* pandas&lt;br /&gt;
* RDKit&lt;br /&gt;
* OpenADMET models package&lt;br /&gt;
&lt;br /&gt;
The OpenADMET model directory is expected at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/permeability-logd-ppb-chemeleon-baseline/anvil_training&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The browser URL is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -S admet-builder&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
Example SMILES input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CCO&lt;br /&gt;
c1ccccc1&lt;br /&gt;
CC(=O)Oc1ccccc1C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Larger test molecule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test API With curl ==&lt;br /&gt;
&lt;br /&gt;
Test the API from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8501/predict-smiles \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;smiles&amp;quot;:[&amp;quot;CCO&amp;quot;,&amp;quot;c1ccccc1&amp;quot;,&amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;]}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current API Endpoint ==&lt;br /&gt;
&lt;br /&gt;
Main endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /predict-smiles&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example JSON request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;smiles&amp;quot;: [&lt;br /&gt;
    &amp;quot;CCO&amp;quot;,&lt;br /&gt;
    &amp;quot;c1ccccc1&amp;quot;,&lt;br /&gt;
    &amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example response contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;csv&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;rows&amp;quot;: [],&lt;br /&gt;
  &amp;quot;columns&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frontend uses this response to display the results table and automatically download the CSV.&lt;br /&gt;
&lt;br /&gt;
== How It Works ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder has three major parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Layer&lt;br /&gt;
! Technology&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Frontend&lt;br /&gt;
| HTML, CSS, JavaScript&lt;br /&gt;
| User interface, SMILES input, results table, and structure image display&lt;br /&gt;
|-&lt;br /&gt;
| Backend API&lt;br /&gt;
| Flask&lt;br /&gt;
| Receives SMILES, runs predictions, and returns results&lt;br /&gt;
|-&lt;br /&gt;
| Prediction Engine&lt;br /&gt;
| OpenADMET&lt;br /&gt;
| Generates ADMET predictions from molecular input&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Backend flow:&lt;br /&gt;
&lt;br /&gt;
# Receives SMILES strings from the website.&lt;br /&gt;
# Converts the SMILES into a temporary CSV file.&lt;br /&gt;
# Runs the OpenADMET command-line prediction tool.&lt;br /&gt;
# Reads the OpenADMET output CSV.&lt;br /&gt;
# Uses RDKit to calculate molecular formulas.&lt;br /&gt;
# Uses RDKit to generate 2D molecular structure images.&lt;br /&gt;
# Sends results back to the web interface as JSON.&lt;br /&gt;
# Provides the same results as a downloadable CSV file.&lt;br /&gt;
&lt;br /&gt;
== Modularity ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is modular by design. The frontend, backend, and prediction engine are separated so each part can be reused or replaced.&lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
&lt;br /&gt;
* The frontend can be redesigned without changing the model logic.&lt;br /&gt;
* The Flask backend can support new endpoints.&lt;br /&gt;
* Additional OpenADMET models can be added later.&lt;br /&gt;
* Other chemistry tools can be wrapped using the same backend pattern.&lt;br /&gt;
* The results table can be adapted for different prediction outputs.&lt;br /&gt;
* The SMILES-to-structure display can be reused in other cheminformatics apps.&lt;br /&gt;
* The app can serve as a template for future scientific web interfaces.&lt;br /&gt;
&lt;br /&gt;
Because of this structure, ADMET Builder can be used both as a working lab tool and as a starting point for other modular research software.&lt;br /&gt;
&lt;br /&gt;
== Output ==&lt;br /&gt;
&lt;br /&gt;
The output table includes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Column&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Molecule&lt;br /&gt;
| Molecular formula calculated from the SMILES string&lt;br /&gt;
|-&lt;br /&gt;
| SMILES&lt;br /&gt;
| Input molecule string&lt;br /&gt;
|-&lt;br /&gt;
| Structure Image&lt;br /&gt;
| RDKit-generated 2D molecular structure&lt;br /&gt;
|-&lt;br /&gt;
| logD&lt;br /&gt;
| Predicted distribution coefficient&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 A to B&lt;br /&gt;
| Predicted apical-to-basolateral permeability&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 B to A&lt;br /&gt;
| Predicted basolateral-to-apical permeability&lt;br /&gt;
|-&lt;br /&gt;
| Mouse PPB&lt;br /&gt;
| Predicted mouse plasma protein binding&lt;br /&gt;
|-&lt;br /&gt;
| Human PPB&lt;br /&gt;
| Predicted human plasma protein binding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CSV download contains the same prediction values in a machine-readable format.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on C7.&lt;br /&gt;
* The app is running on port 8501.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1074.&lt;br /&gt;
* The browser is using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SwitchyOmega Proxy Error ===&lt;br /&gt;
&lt;br /&gt;
If Chrome says the proxy failed, the SOCKS proxy may not be running.&lt;br /&gt;
&lt;br /&gt;
Start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwitchyOmega should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8501:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Missing pandas or Flask ===&lt;br /&gt;
&lt;br /&gt;
This usually means the conda environment is not active.&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RDKit Image Error ===&lt;br /&gt;
&lt;br /&gt;
Make sure the app is running inside the `openadmet-models` environment, which includes RDKit.&lt;br /&gt;
&lt;br /&gt;
Test RDKit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is a research tool. Its predictions are intended for screening, comparison, prioritization, and exploration.&lt;br /&gt;
&lt;br /&gt;
Results should not be treated as experimental measurements.&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, ADMET Builder should eventually be placed behind an internal hostname or proxy.&lt;br /&gt;
&lt;br /&gt;
== Attribution ==&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&amp;lt;br&amp;gt;&lt;br /&gt;
Released as part of an open-source UCSF research tool; please credit the creator and lab when using or adapting this work.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Results.png&amp;diff=17376</id>
		<title>File:Results.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Results.png&amp;diff=17376"/>
		<updated>2026-07-07T00:23:43Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Results&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:ADMET_builder_webpage.png&amp;diff=17375</id>
		<title>File:ADMET builder webpage.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:ADMET_builder_webpage.png&amp;diff=17375"/>
		<updated>2026-07-07T00:22:09Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;interface&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17374</id>
		<title>ADMET Builder</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17374"/>
		<updated>2026-07-07T00:18:27Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ADMET Builder (OpenADMET) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 7/6/26, &#039;&#039;&#039;ADMET Builder&#039;&#039;&#039; is an internal Irwin Lab web tool for submitting one or more compounds in SMILES format and receiving OpenADMET prediction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on C7 using the `openadmet-models` conda environment.&lt;br /&gt;
&lt;br /&gt;
ADMET Builder returns:&lt;br /&gt;
&lt;br /&gt;
* Molecular formula&lt;br /&gt;
* SMILES string&lt;br /&gt;
* RDKit-generated 2D structure image&lt;br /&gt;
* logD&lt;br /&gt;
* Caco-2 A to B permeability&lt;br /&gt;
* Caco-2 B to A permeability&lt;br /&gt;
* Mouse plasma protein binding&lt;br /&gt;
* Human plasma protein binding&lt;br /&gt;
* Downloadable CSV output&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
Log into C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
pwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
If using SwitchyOmega, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the SOCKS proxy is not running, start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app.py&lt;br /&gt;
static/index.html&lt;br /&gt;
static/styles.css&lt;br /&gt;
static/app.js&lt;br /&gt;
.gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repository ==&lt;br /&gt;
&lt;br /&gt;
GitLab repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gitlab.docking.org/USERNAME/admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using HTTPS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://gitlab.docking.org/USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clone using SSH:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.docking.org:USERNAME/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend uses the OpenADMET conda environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python dependencies include:&lt;br /&gt;
&lt;br /&gt;
* Flask&lt;br /&gt;
* pandas&lt;br /&gt;
* RDKit&lt;br /&gt;
* OpenADMET models package&lt;br /&gt;
&lt;br /&gt;
The OpenADMET model directory is expected at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/openadmet/permeability-logd-ppb-chemeleon-baseline/anvil_training&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The browser URL is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -S admet-builder&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
Example SMILES input:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CCO&lt;br /&gt;
c1ccccc1&lt;br /&gt;
CC(=O)Oc1ccccc1C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Larger test molecule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test API With curl ==&lt;br /&gt;
&lt;br /&gt;
Test the API from C7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8501/predict-smiles \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;smiles&amp;quot;:[&amp;quot;CCO&amp;quot;,&amp;quot;c1ccccc1&amp;quot;,&amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;]}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current API Endpoint ==&lt;br /&gt;
&lt;br /&gt;
Main endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /predict-smiles&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example JSON request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;smiles&amp;quot;: [&lt;br /&gt;
    &amp;quot;CCO&amp;quot;,&lt;br /&gt;
    &amp;quot;c1ccccc1&amp;quot;,&lt;br /&gt;
    &amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example response contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;csv&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;rows&amp;quot;: [],&lt;br /&gt;
  &amp;quot;columns&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frontend uses this response to display the results table and automatically download the CSV.&lt;br /&gt;
&lt;br /&gt;
== How It Works ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder has three major parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Layer&lt;br /&gt;
! Technology&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Frontend&lt;br /&gt;
| HTML, CSS, JavaScript&lt;br /&gt;
| User interface, SMILES input, results table, and structure image display&lt;br /&gt;
|-&lt;br /&gt;
| Backend API&lt;br /&gt;
| Flask&lt;br /&gt;
| Receives SMILES, runs predictions, and returns results&lt;br /&gt;
|-&lt;br /&gt;
| Prediction Engine&lt;br /&gt;
| OpenADMET&lt;br /&gt;
| Generates ADMET predictions from molecular input&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Backend flow:&lt;br /&gt;
&lt;br /&gt;
# Receives SMILES strings from the website.&lt;br /&gt;
# Converts the SMILES into a temporary CSV file.&lt;br /&gt;
# Runs the OpenADMET command-line prediction tool.&lt;br /&gt;
# Reads the OpenADMET output CSV.&lt;br /&gt;
# Uses RDKit to calculate molecular formulas.&lt;br /&gt;
# Uses RDKit to generate 2D molecular structure images.&lt;br /&gt;
# Sends results back to the web interface as JSON.&lt;br /&gt;
# Provides the same results as a downloadable CSV file.&lt;br /&gt;
&lt;br /&gt;
== Modularity ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is modular by design. The frontend, backend, and prediction engine are separated so each part can be reused or replaced.&lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
&lt;br /&gt;
* The frontend can be redesigned without changing the model logic.&lt;br /&gt;
* The Flask backend can support new endpoints.&lt;br /&gt;
* Additional OpenADMET models can be added later.&lt;br /&gt;
* Other chemistry tools can be wrapped using the same backend pattern.&lt;br /&gt;
* The results table can be adapted for different prediction outputs.&lt;br /&gt;
* The SMILES-to-structure display can be reused in other cheminformatics apps.&lt;br /&gt;
* The app can serve as a template for future scientific web interfaces.&lt;br /&gt;
&lt;br /&gt;
Because of this structure, ADMET Builder can be used both as a working lab tool and as a starting point for other modular research software.&lt;br /&gt;
&lt;br /&gt;
== Output ==&lt;br /&gt;
&lt;br /&gt;
The output table includes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Column&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Molecule&lt;br /&gt;
| Molecular formula calculated from the SMILES string&lt;br /&gt;
|-&lt;br /&gt;
| SMILES&lt;br /&gt;
| Input molecule string&lt;br /&gt;
|-&lt;br /&gt;
| Structure Image&lt;br /&gt;
| RDKit-generated 2D molecular structure&lt;br /&gt;
|-&lt;br /&gt;
| logD&lt;br /&gt;
| Predicted distribution coefficient&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 A to B&lt;br /&gt;
| Predicted apical-to-basolateral permeability&lt;br /&gt;
|-&lt;br /&gt;
| Caco-2 B to A&lt;br /&gt;
| Predicted basolateral-to-apical permeability&lt;br /&gt;
|-&lt;br /&gt;
| Mouse PPB&lt;br /&gt;
| Predicted mouse plasma protein binding&lt;br /&gt;
|-&lt;br /&gt;
| Human PPB&lt;br /&gt;
| Predicted human plasma protein binding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The CSV download contains the same prediction values in a machine-readable format.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on C7.&lt;br /&gt;
* The app is running on port 8501.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1074.&lt;br /&gt;
* The browser is using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SwitchyOmega Proxy Error ===&lt;br /&gt;
&lt;br /&gt;
If Chrome says the proxy failed, the SOCKS proxy may not be running.&lt;br /&gt;
&lt;br /&gt;
Start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -f -N -D 1074 USER@epsilon.compbio.ucsf.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwitchyOmega should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1074&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8501:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8501&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Missing pandas or Flask ===&lt;br /&gt;
&lt;br /&gt;
This usually means the conda environment is not active.&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RDKit Image Error ===&lt;br /&gt;
&lt;br /&gt;
Make sure the app is running inside the `openadmet-models` environment, which includes RDKit.&lt;br /&gt;
&lt;br /&gt;
Test RDKit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is a research tool. Its predictions are intended for screening, comparison, prioritization, and exploration.&lt;br /&gt;
&lt;br /&gt;
Results should not be treated as experimental measurements.&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, ADMET Builder should eventually be placed behind an internal hostname or proxy.&lt;br /&gt;
&lt;br /&gt;
== Attribution ==&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.&amp;lt;br&amp;gt;&lt;br /&gt;
Developed in the Irwin Lab at UCSF.&amp;lt;br&amp;gt;&lt;br /&gt;
Released as part of an open-source UCSF research tool; please credit the creator and lab when using or adapting this work.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17373</id>
		<title>ADMET Builder</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ADMET_Builder&amp;diff=17373"/>
		<updated>2026-07-07T00:13:48Z</updated>

		<summary type="html">&lt;p&gt;Bromero: ADMET Builder is a lightweight very modular web interface for running OpenADMET predictions from typed SMILES strings. It was created to make ADMET prediction easier to use for chemists, students, and researchers who may not want to run command-line tools directly.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# ADMET Builder&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is a lightweight web interface for running OpenADMET predictions from typed SMILES strings. It was created to make ADMET prediction easier to use for chemists, students, and researchers who may not want to run command-line tools directly.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## What It Does&lt;br /&gt;
&lt;br /&gt;
ADMET Builder lets a user paste one or more SMILES strings into a web interface and run ADMET predictions.&lt;br /&gt;
&lt;br /&gt;
The app returns:&lt;br /&gt;
&lt;br /&gt;
- A clean results table in the browser&lt;br /&gt;
- A downloadable CSV file&lt;br /&gt;
- Molecular formulas calculated from SMILES&lt;br /&gt;
- RDKit-generated 2D structure images&lt;br /&gt;
- Click-to-enlarge structure viewing&lt;br /&gt;
&lt;br /&gt;
The current OpenADMET model predicts:&lt;br /&gt;
&lt;br /&gt;
- logD&lt;br /&gt;
- Caco-2 A to B permeability&lt;br /&gt;
- Caco-2 B to A permeability&lt;br /&gt;
- Mouse plasma protein binding&lt;br /&gt;
- Human plasma protein binding&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## How It Works&lt;br /&gt;
&lt;br /&gt;
ADMET Builder has three main parts:&lt;br /&gt;
&lt;br /&gt;
| Layer | Technology | Purpose |&lt;br /&gt;
|---|---|---|&lt;br /&gt;
| Frontend | HTML, CSS, JavaScript | User interface, SMILES input, results table, structure display |&lt;br /&gt;
| Backend API | Flask | Receives SMILES, runs predictions, returns results |&lt;br /&gt;
| Prediction Engine | OpenADMET | Generates ADMET predictions from molecular input |&lt;br /&gt;
&lt;br /&gt;
The browser sends SMILES strings to the backend using:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
POST /predict-smiles&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
The Flask backend then:&lt;br /&gt;
&lt;br /&gt;
1. Receives the SMILES strings.&lt;br /&gt;
2. Converts them into a temporary CSV file.&lt;br /&gt;
3. Runs the OpenADMET command-line prediction tool.&lt;br /&gt;
4. Reads the prediction output.&lt;br /&gt;
5. Generates molecular formulas and structure images using RDKit.&lt;br /&gt;
6. Sends results back to the web interface as JSON.&lt;br /&gt;
7. Provides the same results as a downloadable CSV file.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Why It Is Modular&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is intentionally modular. The frontend, backend, and prediction engine are separated so each part can be changed or reused.&lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
&lt;br /&gt;
- The frontend can be redesigned without changing the model logic.&lt;br /&gt;
- The Flask backend can support new endpoints.&lt;br /&gt;
- Additional OpenADMET models can be added later.&lt;br /&gt;
- Other chemistry tools can be wrapped using the same backend pattern.&lt;br /&gt;
- The results table can be adapted for different prediction outputs.&lt;br /&gt;
- The SMILES-to-structure display can be reused in other cheminformatics apps.&lt;br /&gt;
- The app can serve as a template for future scientific web interfaces.&lt;br /&gt;
&lt;br /&gt;
Because of this structure, ADMET Builder can be used not only as a lab tool, but also as a starting point for other modular research software.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Getting The Code&lt;br /&gt;
&lt;br /&gt;
Clone the repository using HTTPS:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://gitlab.docking.org/bromero/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Or clone using SSH:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone git@gitlab.docking.org:bromero/admet-builder.git&lt;br /&gt;
cd admet-builder&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Requirements&lt;br /&gt;
&lt;br /&gt;
ADMET Builder expects OpenADMET to already be installed in a working conda environment.&lt;br /&gt;
&lt;br /&gt;
The C7 setup uses:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Python dependencies include:&lt;br /&gt;
&lt;br /&gt;
- Flask&lt;br /&gt;
- pandas&lt;br /&gt;
- RDKit&lt;br /&gt;
- OpenADMET models package&lt;br /&gt;
&lt;br /&gt;
The app also expects the OpenADMET model directory to be available at:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
~/openadmet/permeability-logd-ppb-chemeleon-baseline/anvil_training&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Running The App&lt;br /&gt;
&lt;br /&gt;
From the repository folder:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
python app.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
The app runs on:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Running In Screen&lt;br /&gt;
&lt;br /&gt;
For persistent use on C7, run ADMET Builder inside `screen`.&lt;br /&gt;
&lt;br /&gt;
Start a screen session:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
screen -S admet-builder&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Inside screen, run:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
module load anaconda3/2025.06.0&lt;br /&gt;
source &amp;quot;$(conda info --base)/etc/profile.d/conda.sh&amp;quot;&lt;br /&gt;
conda activate openadmet-models&lt;br /&gt;
cd ~/openadmet/admet-builder&lt;br /&gt;
python app.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Detach from screen while keeping the app running:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
Ctrl+A&lt;br /&gt;
D&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Reconnect later:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
screen -r admet-builder&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
List running screen sessions:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
screen -ls&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Stop the app from inside screen:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
Ctrl+C&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Using The Website&lt;br /&gt;
&lt;br /&gt;
1. Open ADMET Builder in the browser.&lt;br /&gt;
2. Paste one SMILES string per line.&lt;br /&gt;
3. Click `RUN ADMET`.&lt;br /&gt;
4. View the results in the table.&lt;br /&gt;
5. A CSV file downloads automatically.&lt;br /&gt;
6. Click a molecular structure image to enlarge it.&lt;br /&gt;
&lt;br /&gt;
Example input:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
CCO&lt;br /&gt;
c1ccccc1&lt;br /&gt;
CC(=O)Oc1ccccc1C(=O)O&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Output&lt;br /&gt;
&lt;br /&gt;
The output table includes:&lt;br /&gt;
&lt;br /&gt;
| Column | Meaning |&lt;br /&gt;
|---|---|&lt;br /&gt;
| Molecule | Molecular formula calculated from the SMILES string |&lt;br /&gt;
| SMILES | Input molecule string |&lt;br /&gt;
| Structure Image | RDKit-generated 2D molecular structure |&lt;br /&gt;
| logD | Predicted distribution coefficient |&lt;br /&gt;
| Caco-2 A to B | Predicted apical-to-basolateral permeability |&lt;br /&gt;
| Caco-2 B to A | Predicted basolateral-to-apical permeability |&lt;br /&gt;
| Mouse PPB | Predicted mouse plasma protein binding |&lt;br /&gt;
| Human PPB | Predicted human plasma protein binding |&lt;br /&gt;
&lt;br /&gt;
The CSV download contains the same prediction values in a machine-readable format.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Access Through SwitchyOmega&lt;br /&gt;
&lt;br /&gt;
If using SwitchyOmega, the proxy should be:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
SOCKS5&lt;br /&gt;
localhost&lt;br /&gt;
1074&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
The website itself is opened at:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
http://169.230.26.173:8501&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
The ports mean different things:&lt;br /&gt;
&lt;br /&gt;
| Port | Purpose |&lt;br /&gt;
|---|---|&lt;br /&gt;
| 1074 | Local SOCKS5 proxy used by SwitchyOmega |&lt;br /&gt;
| 8501 | ADMET Builder web app running on C7 |&lt;br /&gt;
&lt;br /&gt;
If the SOCKS proxy is not running, start it from a Mac terminal:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ssh -f -N -D 1074 bromero@epsilon.compbio.ucsf.edu&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Repository Structure&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
admet-builder/&lt;br /&gt;
├── app.py&lt;br /&gt;
├── static/&lt;br /&gt;
│   ├── index.html&lt;br /&gt;
│   ├── styles.css&lt;br /&gt;
│   └── app.js&lt;br /&gt;
└── .gitignore&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### `app.py`&lt;br /&gt;
&lt;br /&gt;
The Flask backend. It receives SMILES input, runs OpenADMET, generates formulas and structure images, and returns results.&lt;br /&gt;
&lt;br /&gt;
### `static/index.html`&lt;br /&gt;
&lt;br /&gt;
The main web page structure.&lt;br /&gt;
&lt;br /&gt;
### `static/styles.css`&lt;br /&gt;
&lt;br /&gt;
The UCSF-style visual design and table layout.&lt;br /&gt;
&lt;br /&gt;
### `static/app.js`&lt;br /&gt;
&lt;br /&gt;
The browser-side logic. It sends SMILES to the backend, renders the results table, downloads CSV output, and handles structure image enlargement.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Current API Endpoint&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
POST /predict-smiles&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Example JSON request:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;smiles&amp;quot;: [&lt;br /&gt;
    &amp;quot;CCO&amp;quot;,&lt;br /&gt;
    &amp;quot;c1ccccc1&amp;quot;,&lt;br /&gt;
    &amp;quot;CC(=O)Oc1ccccc1C(=O)O&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Example response includes:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;csv&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;rows&amp;quot;: [],&lt;br /&gt;
  &amp;quot;columns&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
The frontend uses this response to display results and download the CSV.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Notes&lt;br /&gt;
&lt;br /&gt;
ADMET Builder is a research tool. Its predictions are intended for screening, comparison, prioritization, and exploration.&lt;br /&gt;
&lt;br /&gt;
Results should not be treated as experimental measurements.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Attribution&lt;br /&gt;
&lt;br /&gt;
Created by Benjamin &amp;quot;Ben&amp;quot; Romero (Undergrad Northwestern University &#039;29), Summer 2026.  &lt;br /&gt;
Developed in the Irwin Lab at UCSF.  &lt;br /&gt;
Released as part of an open-source UCSF research tool; please credit the creator and lab when using or adapting this work.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17358</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17358"/>
		<updated>2026-06-29T20:49:04Z</updated>

		<summary type="html">&lt;p&gt;Bromero: /* Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
=== Off Site ===&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 USER@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== On Site ===&lt;br /&gt;
&lt;br /&gt;
If on the UCSF/lab network, direct login may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -o HostKeyAlgorithms=+ssh-rsa bromero@gimel.compbio.ucsf.edu&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=retro-blockbalster@gmail.com&lt;br /&gt;
SMTP_PASSWORD=abcdefghijklmnop&lt;br /&gt;
FROM_EMAIL=retro-blockbalster@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, Retro-Blockblaster will eventually be placed behind an internal hostname or proxy.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17357</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17357"/>
		<updated>2026-06-29T20:47:49Z</updated>

		<summary type="html">&lt;p&gt;Bromero: /* Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
=== Off Site ===&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 USER@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== On Site ===&lt;br /&gt;
&lt;br /&gt;
If on the UCSF/lab network, direct login may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -o HostKeyAlgorithms=+ssh-rsa bromero@gimel.compbio.ucsf.edu&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=retro-blockbalster@gmail.com&lt;br /&gt;
SMTP_PASSWORD=GOOGLE_APP_PASSWORD&lt;br /&gt;
FROM_EMAIL=retro-blockbalster@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, Retro-Blockblaster will eventually be placed behind an internal hostname or proxy.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17356</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17356"/>
		<updated>2026-06-29T20:46:56Z</updated>

		<summary type="html">&lt;p&gt;Bromero: /* How to Open Website (MUST USE) With SwitchyOmega */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
=== Off Site ===&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 USER@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== On Site ===&lt;br /&gt;
&lt;br /&gt;
If on the UCSF/lab network, direct login may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -o HostKeyAlgorithms=+ssh-rsa bromero@gimel.compbio.ucsf.edu&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=benzinc26@gmail.com&lt;br /&gt;
SMTP_PASSWORD=GOOGLE_APP_PASSWORD&lt;br /&gt;
FROM_EMAIL=benzinc26@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, Retro-Blockblaster will eventually be placed behind an internal hostname or proxy.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17355</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17355"/>
		<updated>2026-06-29T20:46:38Z</updated>

		<summary type="html">&lt;p&gt;Bromero: /* Off Site */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
=== Off Site ===&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 USER@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 USER@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== On Site ===&lt;br /&gt;
&lt;br /&gt;
If on the UCSF/lab network, direct login may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -o HostKeyAlgorithms=+ssh-rsa bromero@gimel.compbio.ucsf.edu&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 bromero@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=benzinc26@gmail.com&lt;br /&gt;
SMTP_PASSWORD=GOOGLE_APP_PASSWORD&lt;br /&gt;
FROM_EMAIL=benzinc26@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, Retro-Blockblaster will eventually be placed behind an internal hostname or proxy.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17354</id>
		<title>Retro-Blockblaster</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Retro-Blockblaster&amp;diff=17354"/>
		<updated>2026-06-29T20:39:33Z</updated>

		<summary type="html">&lt;p&gt;Bromero: Retro-Blockblaster is an internal UCSF Irwin Lab web tool for submitting compounds in SMILES format and identifying possible Chemistry Commons retro/analoging reactions. The site runs on Cluster 2 using epyc, processes jobs with an RDKit-enabled environment, generates downloadable result files, and emails users when their job is complete.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Retro-Blockbalster (BenZinc26) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As of 6/29/26, Retro-Blockbalster is an internal Irwin Lab web tool for submitting a compound in SMILES format and receiving retro/analoging reaction results.&lt;br /&gt;
&lt;br /&gt;
The current backend runs on Cluster 2 using epyc.&lt;br /&gt;
&lt;br /&gt;
== How to Login ==&lt;br /&gt;
&lt;br /&gt;
=== Off Site ===&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel from your laptop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 bromero@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave this terminal open.&lt;br /&gt;
&lt;br /&gt;
In a second terminal, log into gimel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -p 2222 bromero@localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log into epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== On Site ===&lt;br /&gt;
&lt;br /&gt;
If on the UCSF/lab network, direct login may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -o HostKeyAlgorithms=+ssh-rsa bromero@gimel.compbio.ucsf.edu&lt;br /&gt;
ssh epyc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Open Website (MUST USE) With SwitchyOmega ==&lt;br /&gt;
&lt;br /&gt;
Start the portal SSH/SOCKS tunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -vNL localhost:2222:gimel:22 -D1080 bromero@portal3.ucsf.bkslab.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Chrome, set SwitchyOmega to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol: SOCKS5&lt;br /&gt;
Host: localhost&lt;br /&gt;
Port: 1080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finished, switch SwitchyOmega back to Direct.&lt;br /&gt;
&lt;br /&gt;
== Where The Website Lives ==&lt;br /&gt;
&lt;br /&gt;
Project directory on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Initial-BenZinc26-website&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.html&lt;br /&gt;
run_job.py&lt;br /&gt;
backend/server_old.py&lt;br /&gt;
.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== .env Setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=...@...com&lt;br /&gt;
SMTP_PASSWORD=....(GOOGLE_APP_PASSWORD)&lt;br /&gt;
FROM_EMAIL=...@....com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Start Backend ==&lt;br /&gt;
&lt;br /&gt;
On epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The backend currently runs on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://0.0.0.0:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl http://127.0.0.1:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Keep Backend Running ==&lt;br /&gt;
&lt;br /&gt;
Use screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/Initial-BenZinc26-website&lt;br /&gt;
screen -S benzinc26&lt;br /&gt;
python3 backend/server_old.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ctrl-A&lt;br /&gt;
D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reconnect:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List screens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop backend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -r benzinc26&lt;br /&gt;
Ctrl-C&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test Input ==&lt;br /&gt;
&lt;br /&gt;
A test molecule that returns reaction rows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CN(C)C(=O)NC1=CC=CC=C1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test with curl from epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X POST http://127.0.0.1:8001/hello-job \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;user_input&amp;quot;:&amp;quot;CN(C)C(=O)NC1=CC=CC=C1 urea_test&amp;quot;,&amp;quot;email&amp;quot;:&amp;quot;your_email@gmail.com&amp;quot;}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
&lt;br /&gt;
The backend needs a `.env` file in the project root.&lt;br /&gt;
&lt;br /&gt;
Do not commit `.env` to GitHub.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTP_HOST=smtp.gmail.com&lt;br /&gt;
SMTP_PORT=587&lt;br /&gt;
SMTP_USER=benzinc26@gmail.com&lt;br /&gt;
SMTP_PASSWORD=GOOGLE_APP_PASSWORD&lt;br /&gt;
FROM_EMAIL=benzinc26@gmail.com&lt;br /&gt;
BASE_URL=http://epyc:8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RDKit Environment ==&lt;br /&gt;
&lt;br /&gt;
The retro reaction script uses RDKit through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test on epyc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfs/exj/Fe/scripts/common_db/arthor-env/bin/python -c &amp;quot;from rdkit import Chem; print(&#039;rdkit works&#039;)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RDKit works on epyc. RDKit may fail on gimel.&lt;br /&gt;
&lt;br /&gt;
== Final Result ==&lt;br /&gt;
&lt;br /&gt;
Web interface&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 1.27.35 PM.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Finished job&lt;br /&gt;
&lt;br /&gt;
[[File:FinalJobEx.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Site Cannot Be Reached ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* Backend is running on epyc.&lt;br /&gt;
* The SSH/SOCKS tunnel is running.&lt;br /&gt;
* SwitchyOmega is set to SOCKS5 localhost port 1080.&lt;br /&gt;
* The browser is using http://epyc:8001.&lt;br /&gt;
&lt;br /&gt;
=== Port Already In Use ===&lt;br /&gt;
&lt;br /&gt;
Check port 8001:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ss -ltnp | grep 8001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only kill processes owned by you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kill PID_NUMBER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Email Not Sending ===&lt;br /&gt;
&lt;br /&gt;
Check that:&lt;br /&gt;
&lt;br /&gt;
* `.env` exists.&lt;br /&gt;
* Gmail app password is correct.&lt;br /&gt;
* SMTP_USER and FROM_EMAIL are the same account.&lt;br /&gt;
* The app password belongs to that same account.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
For office-wide use without SSH/SOCKS tunnels, Retro-Blockblaster will eventually be placed behind an internal hostname or proxy.&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:FinalJobEx.png&amp;diff=17353</id>
		<title>File:FinalJobEx.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:FinalJobEx.png&amp;diff=17353"/>
		<updated>2026-06-29T20:36:56Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Complete Job&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=File:Screenshot_2026-06-29_at_1.27.35_PM.png&amp;diff=17352</id>
		<title>File:Screenshot 2026-06-29 at 1.27.35 PM.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=File:Screenshot_2026-06-29_at_1.27.35_PM.png&amp;diff=17352"/>
		<updated>2026-06-29T20:28:40Z</updated>

		<summary type="html">&lt;p&gt;Bromero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Website Screen&lt;/div&gt;</summary>
		<author><name>Bromero</name></author>
	</entry>
</feed>