<?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=Pseemann</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=Pseemann"/>
	<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Special:Contributions/Pseemann"/>
	<updated>2026-05-25T04:13:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16912</id>
		<title>Running ChemSTEP in the 13 billion space</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16912"/>
		<updated>2025-09-23T17:30:19Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Written by Philipp Seemann with the kind assistance of Katie Holland and Joseph Pepe (08/28/2025)&lt;br /&gt;
*This tutorial should work on Wynton with the provided scripts and public environments; you might need to catch tiny typos. I apologize.&lt;br /&gt;
&lt;br /&gt;
This is meant to be a simple hands-on step by step guide for ChemSTEP on Wynton in the 13 billion space. For exploring the trillion space please refer to:[[Running ChemSTEP|https://wiki.docking.org/index.php?title=Running_ChemSTEP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The general workflow is:&#039;&#039;&#039;&lt;br /&gt;
   |--- Simply DOCK the seeds set (you can use any docking method)&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP &lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 2nd time&lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 3rd time&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   |--- Repeat until your Recovery rate does not improve&lt;br /&gt;
&lt;br /&gt;
Here is a recommended folder layout after several rounds of ChemSTEP. We will also provide the initial layout here right after this one. This should just give you an overview of what folders we will need to make iteratively, not to confuse our building and docking, and ChemSTEP rounds. (You can change this however you want. After you get the hang of this, you can be creative and find a better layout workflow for you!) This tutorial will lead you through round_0 and round_1. After that, it should become clear what steps you will need to repeat over and over again. This tutorial is written for Wynton. Please use the scripts starting from a dev node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folder layout:&#039;&#039;&#039;&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/&lt;br /&gt;
   |&lt;br /&gt;
   |----building_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----building_2/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_2/&lt;br /&gt;
   |&lt;br /&gt;
   |....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explanation of folders&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;run_inital_and_iterative_chemstep/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here, we actually run ChemSTEP with every new round as well. Here will  be copied all scores_round_*.npy and indices_round_*.npy after every new round of docking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_0/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking of the seeds set. So this contains your dockfiles, and here we generate the initial indices and score .npys, which will be copied to the run_inital_and_iterative_chemstep/ folder later on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This folder is for building of the first .smi file from run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
docking of the molecules from the building_1 folder. So this contains again your dockfiles with an adjusted INDOCK and a new sdi file. After extracting the scores, it will yield us indices and scores .npys of round_1 for the second round of chemstep. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After running chemstep from run_inital_and_iterative_chemstep the second time we will have a new .smi file which we will need to build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have read carefully to this point, you will know what comes next. We will dock the molecules from building_2 here and extract the scores. Generate .npys files. Copy those to our run_inital_and_iterative_chemstep folder to generate the next smi_round_*.smi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this is now all still confusing, but we will start easy. It will make sense as any other Shoichet Lab tutorial. I promise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of docking&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here are the first folders that you will need to set up for this tutorial&lt;br /&gt;
&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/ # docking of the seeds set&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/ #here will  be copied all scores_round_*.npy and indices_round_*.npy files&lt;br /&gt;
&lt;br /&gt;
First, we make a traditional DOCKing directory in your work directories (be sure not to be in your home directory because we will dock and build (DISKSPACE!)). The first step for ChemSTEP is basically just docking the 13B_seed_set_built.sdi, so submit as your traditional LSD screen (whatever submission style or script you prefer). This layout follows the above shown layout of folders.  What you need to bring on your own here are your dockfiles (and your way of submission script).&lt;br /&gt;
&lt;br /&gt;
   mkdir CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   cd CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   mkdir round_0&lt;br /&gt;
   cd round_0&lt;br /&gt;
   cp -r path/to/your/dockfiles . #check your INDOCK parameters&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp /wynton/group/bks/work/bwhall61/mor_chemstep/DOCK/13M/seed/docking/bundle_paths.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   # cp your favourite submission script or whatever you use for submitting jobs&lt;br /&gt;
   # or in case you use SymDOCK with the right executable set in the submission    &lt;br /&gt;
   # script&lt;br /&gt;
&lt;br /&gt;
Submit the docking job with your method of preference. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Things to consider for the size of the seeds set&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ideally, we want enough molecules in our desired pProp region to be considered as beacons and virtual hits. So it is of great importance that enough molecules score in the desired region to be considered as beacons. On Wynton, there is the 130k seeds set, a 13M set, and somewhere also a 1.3M set. &lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi #130k &lt;br /&gt;
   /wynton/group/bks/work/bwhall61/mor_chemstep/DOCK/13M/seed/docking/bundle_paths.sdi #13M&lt;br /&gt;
&lt;br /&gt;
Our aim is actually to dock a small chunk, which is still big enough to represent the library, and among those molecules we want enough beacons (so probably something between 50-100 molecules in the desired score range) chosen by ChemSTEP&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When the docking finishes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source the right environment now:&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
We will now extract scores and Molecule IDs, so we run get_scores.py&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/get_scores.py .&lt;br /&gt;
   python get_scores.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
When get_scores.py runs successfully, we see scores_round_0.txt in our folder. Check your scores.txt file for output. It should look like this:&lt;br /&gt;
&lt;br /&gt;
   MOL12457028547 -29.32&lt;br /&gt;
   MOL12457032486 -32.39&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
The get_scores.py script expects a certain output folder structure. If you do not see any output in your .txt file, vim into the script and adjust the paths. If you use the copied version, it should be: &lt;br /&gt;
   /output/*/*/OUTDOCK.*&lt;br /&gt;
&lt;br /&gt;
Now we translate scores_round_0.txt into indices_round_0.npy and scores_round_0.npy&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/convert_scores_to_npy.py .&lt;br /&gt;
   python convert_scores_to_npy.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
now we should find indices_round_0.npy and scores_round_0.npy in our round_0 directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of ChemSTEP. EXCITING!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Now we set up ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #now cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir run_initial_and_iterative_chemstep&lt;br /&gt;
   cp round_0/*_round_0.npy run_initial_and_iterative_chemstep/&lt;br /&gt;
   cd run_initial_and_iterative_chemstep/&lt;br /&gt;
&lt;br /&gt;
Now the two .npy files should be in our run_inital_and_iterative_chemstep folder to run chemstep.&lt;br /&gt;
We will now set up our initial submission script, which will be slightly different from the iterative one for the following rounds.&lt;br /&gt;
&lt;br /&gt;
   #cd into your folder for running chemstep - &lt;br /&gt;
   #run_initial_and_iterative_chemstep/ &lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_initial.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_initial.py .&lt;br /&gt;
&lt;br /&gt;
We stay in this folder and copy over a params.txt file, and then adjust it to your liking &lt;br /&gt;
&lt;br /&gt;
   #we are still in run_inital_and_iterative_chemstep&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/params.txt .&lt;br /&gt;
&lt;br /&gt;
Adjust your params file - with vim if you like.&lt;br /&gt;
   vim params.txt&lt;br /&gt;
&lt;br /&gt;
   seed_indices_file: path/to/your/run_initial_and_iterative_chemstep/indices_round_0.npy &lt;br /&gt;
   &lt;br /&gt;
   seed_scores_file: path/to/your/run_initial_and_iterative_chemstep/scores_round_0.npy&lt;br /&gt;
   &lt;br /&gt;
   hit_pprop: 6 #may change depending on library size, here 13B&lt;br /&gt;
   &lt;br /&gt;
   n_docked_per_round: 1000000 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_beacons: 100 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_n_rounds: 250 # recommended&lt;br /&gt;
   &lt;br /&gt;
Now there should be two scripts and two .npy files, and one params.txt file in your run_inital_and_iterative_chemstep folder.&lt;br /&gt;
Now we submit our first round of running ChemSTEP with :&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_initial.sh&lt;br /&gt;
   &lt;br /&gt;
   # this will queue a job&lt;br /&gt;
   # the job will split into many jobs, 600, eg which will run for a while&lt;br /&gt;
   # the initial job will run for a while after the jobs finish, and should generate &lt;br /&gt;
   # output in /output/complete_info/ ,there should be a .smi file when sucessfully &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two notes here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, we will never touch the params.txt file again. From my understanding, we need to copy each following scores_round_*.npy and indices_round_*.npy into the same directory (in our case, run_initial_and_iterative_chemstep)&lt;br /&gt;
&lt;br /&gt;
Second, I had issues with getting Wynton to execute python for every submitted job. I hope this is fixed for you as well now.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When ChemSTEP finishes, we can go to our CHEMSTEP_PROJECT_FOLDER and brace ourselves for building. &lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_1&lt;br /&gt;
   cd building_1&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi .&lt;br /&gt;
   &lt;br /&gt;
   #if there is no smi file, something went wrong&lt;br /&gt;
&lt;br /&gt;
We now source the building environment, prepare the job, submit the job, and wait until the building is completed.&lt;br /&gt;
&lt;br /&gt;
source environment:&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
prepare job&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_1.smi&lt;br /&gt;
   &lt;br /&gt;
   #note: smi_round_*.smi for the following rounds must be adjusted. &lt;br /&gt;
&lt;br /&gt;
submit job&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
When this is finished, check for failed jobs and resubmit. Some will always fail, just try to keep them low.&lt;br /&gt;
When the molecules are built, we can proceed with docking them.&lt;br /&gt;
Now we generate an .sdi file from our first building round.&lt;br /&gt;
&lt;br /&gt;
   #cd into your building_1 folder&lt;br /&gt;
   &lt;br /&gt;
   find /wynton/group/bks/work/pseemann/CHEMSTEP_PROJECT_FOLDER/building_1/building_output/ -type f -name &amp;quot;*.tgz&amp;quot; &amp;gt; round1.sdi&lt;br /&gt;
   &lt;br /&gt;
   #example adjust paths&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of docking: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We proceed with docking the freshly built compounds, so we make a directory called round_1, with dockfiles, and copy our new SDI file here, too&lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir round_1&lt;br /&gt;
   cd round_1&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp ../../building_1/*.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   cp -r ../round_0/dockfiles .&lt;br /&gt;
   vim dockfiles/INDOCK &lt;br /&gt;
   &lt;br /&gt;
   # adjust the score maximum in the INDOCK to your chosen pprop (recommended)&lt;br /&gt;
   # submit with your favourite submission script just as you did for round_0&lt;br /&gt;
   # so sh your_way_of_submitting.sh&lt;br /&gt;
&lt;br /&gt;
As before, we will now run get_scores.py&lt;br /&gt;
&lt;br /&gt;
source environment&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #cd into your round_1 directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_0/get_scores.py .&lt;br /&gt;
   python get_scores.py 1&lt;br /&gt;
   &lt;br /&gt;
   # wait until this finishes, always adjust the argument after                 &lt;br /&gt;
   # python get_scores.py to not confuse your scores files with other rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #still in your round_1 directory&lt;br /&gt;
   #copy the right script, IDs have changed, and needed to be adjusted in the convert script&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/64_char_convert_scores_to_npy.py .&lt;br /&gt;
   python 64_char_convert_scores_to_npy.py 1&lt;br /&gt;
   &lt;br /&gt;
   # Wait until this finishes; always adjust the argument afterward &lt;br /&gt;
   # python 64_char_convert_scores_to_npy.py&lt;br /&gt;
   # script was adjusted to fit the output of round_1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #cd into your run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_1/scores_round_1.npy .&lt;br /&gt;
   cp ../round_1/indices_round_1.npy .&lt;br /&gt;
&lt;br /&gt;
Copy over the iterative run_chemstep_iteratively.py and launch_chemstep_as_job_iteratively.sh&lt;br /&gt;
These are slightly different then the initial ones. But from here, we will only use these scripts. Be sure to always provide the right arguments to the scripts. Be sure to use the right scripts. This is (hopefully) the most confusing step in this ChemSTEP tutorial.&lt;br /&gt;
&lt;br /&gt;
   #still in run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_iteratively.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_iteratively.py .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Submit the 2nd round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_iteratively.sh 2 &lt;br /&gt;
   &lt;br /&gt;
   #Give the number of rounds you are running chemstep if you are using scores_round_1.npy and indices_round_1.npy you provide 2 as an&lt;br /&gt;
   #argument, like in the example above.&lt;br /&gt;
   #if you run your 3rd round of chemstep and provide indices_round_2.py and &lt;br /&gt;
   #scores_round_2.npy, one would do qsub launch_chemstep_as_job_iteratively.sh 3&lt;br /&gt;
   #and so on...&lt;br /&gt;
   #If no argument is provided, it will queue but shut down. &lt;br /&gt;
   #You can check this in the chemstep_submission.log file | &lt;br /&gt;
   #So when the job is submitted, it will just quit, when no argument is given, after a few seconds to minutes.&lt;br /&gt;
&lt;br /&gt;
Now we wait until the jobs finish, and brace ourselves for the next time-consuming round of building.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #so in your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_2&lt;br /&gt;
   cd building_2&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_2.smi .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;source environment&#039;&#039;&#039;&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;prepare job (always adjust smi_round.smi here)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_2.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;submit the job&#039;&#039;&#039;&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
Now like shown before. Resubmit failed jobs, make your sdi, and proceed with docking (new folder round_2 recommended).&lt;br /&gt;
&lt;br /&gt;
Now we went full circle. The next step would be to make your next round_2 of the docking directory with the updated .sdi file from the 2nd round of building. With the next round of docking, you would extract scores and IDs, convert them, feed them to ChemSTEP,  and repeat this as often as you don&#039;t see an increase in recovery rate. You would always need to update the arguments you pass to the python and submission scripts to match the round of ChemSTEP and building, and extracting etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check your beacons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In the first rounds, one might want to check the selected beacons that were chosen by ChemSTEP. To do so, go to your run_inital_and_iterative_chemstep/ folder (the folder where you run ChemSTEP). Then make a list of IDs:&lt;br /&gt;
&lt;br /&gt;
   cat chemstep_algo.log | grep &amp;quot;with score&amp;quot; | awk &#039;{print $3}&#039; &amp;gt; list.txt&lt;br /&gt;
&lt;br /&gt;
Copy this file to a new folder. Then source a Python environment.&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy over this script and run it&lt;br /&gt;
&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/beacon_to_smiles.py .&lt;br /&gt;
   python beacon_to_smiles.py /wynton/group/bks/work/shared/kholland/chemstep_13B/boltz_fplib.pickle list.txt&lt;br /&gt;
   #python beacon_to_smiles.py path/to/fingerprint_library list.txt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;All scripts and files for this tutorial are present in&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16910</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16910"/>
		<updated>2025-09-19T19:27:19Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules as beacons not only by score but also to be influenced by interaction-filtering or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- if the automated beacon selection takes place.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best described in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produce the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16909</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16909"/>
		<updated>2025-09-19T19:26:30Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules as beacons not only by score but also to be influenced by interaction-filtering or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- if the automated beacon selection takes place.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best describe in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produce the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16908</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16908"/>
		<updated>2025-09-19T19:22:11Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules as beacons not only by score but also to be influences by interaction-filtering or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- if the automated beacon selection takes place.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best describe in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produce the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16907</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16907"/>
		<updated>2025-09-19T19:19:22Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules as beacons not only by score but also to be influences by interaction-filtering or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- if the automated beacon selection takes place.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best describe in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produces the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16906</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16906"/>
		<updated>2025-09-19T19:18:48Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules as beacons not only by score but also to be influences by interactions or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- if the automated beacon selection takes place.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best describe in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produces the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16905</id>
		<title>ChemSTEP and how to cinvince it to pick the good stuff</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=ChemSTEP_and_how_to_cinvince_it_to_pick_the_good_stuff&amp;diff=16905"/>
		<updated>2025-09-19T19:17:28Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: An approach to force ChemSTEP to select beacons by human reasoning&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently some Lab members encountered an unusual and dominating enrichment of non-reasonable molecules after several rounds of ChemSTEP. This here might be a work around to train ChemSTEP in the beginning to pick molecules not only by score but also to be influences by interactions or visual inspection. This can be crucial in the first round of ChemSTEP, because it can lead to a exclusive domination of cheating molecules -at least in the current version- .  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First step&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking the seeds set as described either here [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]. This is happening in your round_0 before running ChemSTEP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filtering - inspection - your own prioritization&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What we will basically do is IFP-filtering - or any other filtering method you want to do - to not only rely on score. I am assuming here that you will do IFP, too, but you can also just do visual inspection and pick 100 molecules you like, to force ChemSTEP to like them, too (so to use them as beacons for your first round of ChemSTEP). For Lab members IFP-filtering is best describe in the Read-the-DOCK-docs: https://docs.docking.org/filtering.html#interaction-and-novelty-filtering&lt;br /&gt;
if you want to have a reference for files and folder structures etc. you might want to have a look here on wynton:&lt;br /&gt;
&lt;br /&gt;
   cd /wynton/group/bks/work/pseemann/2_IFP_CHEMSTEP &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Making a list of names&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a list of the molecule IDs that you find reasonable - so from your list of molecules which passed your filtering/visual-inspection/whatever-method-you-used. Save it as filterd_molecules.txt for example.&lt;br /&gt;
&lt;br /&gt;
Note: Between the &#039;trillion&#039; and &#039;billion&#039; version of ChemSTEP the beginning of the MOL IDs might be different, but that should not be an issue for this approach&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;example list&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
   MOL0000egWAbN&lt;br /&gt;
   MOL0000deAfVb&lt;br /&gt;
   MOL00006qQdBI&lt;br /&gt;
   MOL0000besVZV&lt;br /&gt;
   MOL0000blhcqH&lt;br /&gt;
   MOL00008TJKq8&lt;br /&gt;
   MOL0000emHoK9&lt;br /&gt;
   MOL0000e3b5Xz&lt;br /&gt;
   MOL00008K8dFx&lt;br /&gt;
   MOL0000byZUhT&lt;br /&gt;
&lt;br /&gt;
We go back to our docking folder for the seeds set (round_0) and run the get_scores.py (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). This will yield a scores_round_0.txt file. This file we will now tweak with artificial scores. So I usually make a folder like this&lt;br /&gt;
&lt;br /&gt;
   mkdir round_0_filtering&lt;br /&gt;
   cd round_0_filtering&lt;br /&gt;
   cp /path/to/filtered_molecules.txt . # your file with the names of molecules you want to be picked as beacons&lt;br /&gt;
   cp /path/to/scores_round_0.txt . # your file from the get_scores.py script in your round_0 seed set docking folder&lt;br /&gt;
&lt;br /&gt;
Now you need a script to just set artificial scores. I went for good stuff 0 and bad stuff 100. You could also do -40 and 100 or whatever you like. I do IFP every round since my target is a bit special. But I think only doing it in the first round can also suffice. &lt;br /&gt;
&lt;br /&gt;
An example script to do so is here:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;score_correction.py&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   import sys&lt;br /&gt;
   &lt;br /&gt;
   scores_file = sys.argv[1]&lt;br /&gt;
   ids_file = sys.argv[2]&lt;br /&gt;
   out_file = sys.argv[3]&lt;br /&gt;
   &lt;br /&gt;
   with open(ids_file) as f:&lt;br /&gt;
       id_set = set(line.strip() for line in f if line.strip())&lt;br /&gt;
   &lt;br /&gt;
   print(&amp;quot;IDs loaded:&amp;quot;, id_set)&lt;br /&gt;
   &lt;br /&gt;
   with open(scores_file) as f:&lt;br /&gt;
       lines = f.readlines()&lt;br /&gt;
   &lt;br /&gt;
   with open(out_file, &amp;quot;w&amp;quot;) as out:&lt;br /&gt;
       for line in lines:&lt;br /&gt;
           parts = line.strip().split()&lt;br /&gt;
           if len(parts) != 2:&lt;br /&gt;
               continue&lt;br /&gt;
           mol_id, score = parts&lt;br /&gt;
           mol_id = mol_id.strip()&lt;br /&gt;
           if mol_id in id_set:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 0\n&amp;quot;) #set good stuff to 0 you can adjust&lt;br /&gt;
           else:&lt;br /&gt;
               out.write(f&amp;quot;{mol_id} 100\n&amp;quot;) #set bad stuff to 100 you can adjust&lt;br /&gt;
&lt;br /&gt;
The script takes three arguments which is &lt;br /&gt;
&lt;br /&gt;
    ### We run this now in the prepared round_0_filtering folder which contains your scores_round_0.txt and filtered_molecules.txt&lt;br /&gt;
    python score_correction.py scores_round_0.txt filtered_molecules.txt out.txt&lt;br /&gt;
&lt;br /&gt;
The out.txt should contain now all the previous IDs &lt;br /&gt;
&lt;br /&gt;
   to check&lt;br /&gt;
   grep &amp;quot; 0&amp;quot; out.txt | wc -l &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;file example of out.txt &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   MOL00004n1zC2 100&lt;br /&gt;
   MOL00004n204O 100&lt;br /&gt;
   MOL00004n21qu 100&lt;br /&gt;
   MOL00004n242A 100&lt;br /&gt;
   MOL00004n24Zm 0&lt;br /&gt;
   MOL00004n28dM 100&lt;br /&gt;
   MOL00004n2Anc 100&lt;br /&gt;
   MOL00004n2AvB 100&lt;br /&gt;
&lt;br /&gt;
So now we can copy the out.txt file over to our round_0 seed set docking folder and replace the &#039;old&#039; scores_round_0.txt&lt;br /&gt;
   #assuming you are still in round_0_filtering&lt;br /&gt;
   cp out.txt /path/to/round_0/scores_round_0.txt&lt;br /&gt;
&lt;br /&gt;
So with the tweaked scores_round_0.txt file we now run convert_scores_to_npy.py, which now reads the adjusted scores_round_0.txt to produces the indices.npy and score.npy files. Meaning, that now every step will be the same as previously described (see [[Running_ChemSTEP]] or here [[Running_ChemSTEP_in_the_13_billion_space|ChemSTEP_in_the_13_billion_space]]). &lt;br /&gt;
&lt;br /&gt;
ChemSTEP should now just &#039;see&#039; compounds with a good score of 0 and ignore the ones with a score of 100. You can check this also in your ChemSTEP folder by looking at the .log files and the picked beacons.&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16903</id>
		<title>Running ChemSTEP in the 13 billion space</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16903"/>
		<updated>2025-09-18T21:42:16Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Written by Philipp Seemann with the kind assistance of Katie Holland and Joseph Pepe (08/28/2025)&lt;br /&gt;
*This tutorial should work on Wynton with the provided scripts and public environments; you might need to catch tiny typos. I apologize.&lt;br /&gt;
&lt;br /&gt;
This is meant to be a simple hands-on step by step guide for ChemSTEP on Wynton in the 13 billion space. For exploring the trillion space please refer to:[[Running ChemSTEP|https://wiki.docking.org/index.php?title=Running_ChemSTEP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The general workflow is:&#039;&#039;&#039;&lt;br /&gt;
   |--- Simply DOCK the seeds set (you can use any docking method)&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP &lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 2nd time&lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 3rd time&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   |--- Repeat until your Recovery rate does not improve&lt;br /&gt;
&lt;br /&gt;
Here is a recommended folder layout after several rounds of ChemSTEP. We will also provide the initial layout here right after this one. This should just give you an overview of what folders we will need to make iteratively, not to confuse our building and docking, and ChemSTEP rounds. (You can change this however you want. After you get the hang of this, you can be creative and find a better layout workflow for you!) This tutorial will lead you through round_0 and round_1. After that, it should become clear what steps you will need to repeat over and over again. This tutorial is written for Wynton. Please use the scripts starting from a dev node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folder layout:&#039;&#039;&#039;&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/&lt;br /&gt;
   |&lt;br /&gt;
   |----building_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----building_2/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_2/&lt;br /&gt;
   |&lt;br /&gt;
   |....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explanation of folders&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;run_inital_and_iterative_chemstep/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here, we actually run ChemSTEP with every new round as well. Here will  be copied all scores_round_*.npy and indices_round_*.npy after every new round of docking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_0/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking of the seeds set. So this contains your dockfiles, and here we generate the initial indices and score .npys, which will be copied to the run_inital_and_iterative_chemstep/ folder later on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This folder is for building of the first .smi file from run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
docking of the molecules from the building_1 folder. So this contains again your dockfiles with an adjusted INDOCK and a new sdi file. After extracting the scores, it will yield us indices and scores .npys of round_1 for the second round of chemstep. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After running chemstep from run_inital_and_iterative_chemstep the second time we will have a new .smi file which we will need to build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have read carefully to this point, you will know what comes next. We will dock the molecules from building_2 here and extract the scores. Generate .npys files. Copy those to our run_inital_and_iterative_chemstep folder to generate the next smi_round_*.smi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this is now all still confusing, but we will start easy. It will make sense as any other Shoichet Lab tutorial. I promise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of docking&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here are the first folders that you will need to set up for this tutorial&lt;br /&gt;
&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/ # docking of the seeds set&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/ #here will  be copied all scores_round_*.npy and indices_round_*.npy files&lt;br /&gt;
&lt;br /&gt;
First, we make a traditional DOCKing directory in your work directories (be sure not to be in your home directory because we will dock and build (DISKSPACE!)). The first step for ChemSTEP is basically just docking the 13B_seed_set_built.sdi, so submit as your traditional LSD screen (whatever submission style or script you prefer). This layout follows the above shown layout of folders.  What you need to bring on your own here are your dockfiles (and your way of submission script).&lt;br /&gt;
&lt;br /&gt;
   mkdir CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   cd CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   mkdir round_0&lt;br /&gt;
   cd round_0&lt;br /&gt;
   cp -r path/to/your/dockfiles . #check your INDOCK parameters&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp /wynton/group/bks/work/bwhall61/mor_chemstep/DOCK/13M/seed/docking/bundle_paths.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   # cp your favourite submission script or whatever you use for submitting jobs&lt;br /&gt;
   # or in case you use SymDOCK with the right executable set in the submission    &lt;br /&gt;
   # script&lt;br /&gt;
&lt;br /&gt;
Submit the docking job with your method of preference. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Things to consider for the size of the seeds set&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ideally, we want enough molecules in our desired pProp region to be considered as beacons and virtual hits. So it is of great importance that enough molecules score in the desired region to be considered as beacons. On Wynton, there is the 130k seeds set, a 13M set, and somewhere also a 1.3M set. &lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi #130k &lt;br /&gt;
   /wynton/group/bks/work/bwhall61/mor_chemstep/DOCK/13M/seed/docking/bundle_paths.sdi #13M&lt;br /&gt;
&lt;br /&gt;
Our aim is actually to dock a small chunk, which is still big enough to represent the library, and among those molecules we want enough beacons (so probably something between 50-100 molecules in the desired score range) chosen by ChemSTEP&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When the docking finishes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source the right environment now:&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
We will now extract scores and Molecule IDs, so we run get_scores.py&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/get_scores.py .&lt;br /&gt;
   python get_scores.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
When get_scores.py runs successfully, we see scores_round_0.txt in our folder. Check your scores.txt file for output. It should look like this:&lt;br /&gt;
&lt;br /&gt;
   MOL12457028547 -29.32&lt;br /&gt;
   MOL12457032486 -32.39&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
The get_scores.py script expects a certain output folder structure. If you do not see any output in your .txt file, vim into the script and adjust the paths. If you use the copied version, it should be: &lt;br /&gt;
   /output/*/*/OUTDOCK.*&lt;br /&gt;
&lt;br /&gt;
Now we translate scores_round_0.txt into indices_round_0.npy and scores_round_0.npy&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/convert_scores_to_npy.py .&lt;br /&gt;
   python convert_scores_to_npy.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
now we should find indices_round_0.npy and scores_round_0.npy in our round_0 directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of ChemSTEP. EXCITING!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Now we set up ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #now cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir run_initial_and_iterative_chemstep&lt;br /&gt;
   cp round_0/*_round_0.npy run_initial_and_iterative_chemstep/&lt;br /&gt;
   cd run_initial_and_iterative_chemstep/&lt;br /&gt;
&lt;br /&gt;
Now the two .npy files should be in our run_inital_and_iterative_chemstep folder to run chemstep.&lt;br /&gt;
We will now set up our initial submission script, which will be slightly different from the iterative one for the following rounds.&lt;br /&gt;
&lt;br /&gt;
   #cd into your folder for running chemstep - &lt;br /&gt;
   #run_initial_and_iterative_chemstep/ &lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_initial.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_initial.py .&lt;br /&gt;
&lt;br /&gt;
We stay in this folder and copy over a params.txt file, and then adjust it to your liking &lt;br /&gt;
&lt;br /&gt;
   #we are still in run_inital_and_iterative_chemstep&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/params.txt .&lt;br /&gt;
&lt;br /&gt;
Adjust your params file - with vim if you like.&lt;br /&gt;
   vim params.txt&lt;br /&gt;
&lt;br /&gt;
   seed_indices_file: path/to/your/run_initial_and_iterative_chemstep/indices_round_0.npy &lt;br /&gt;
   &lt;br /&gt;
   seed_scores_file: path/to/your/run_initial_and_iterative_chemstep/scores_round_0.npy&lt;br /&gt;
   &lt;br /&gt;
   hit_pprop: 6 #may change depending on library size, here 13B&lt;br /&gt;
   &lt;br /&gt;
   n_docked_per_round: 1000000 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_beacons: 100 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_n_rounds: 250 # recommended&lt;br /&gt;
   &lt;br /&gt;
Now there should be two scripts and two .npy files, and one params.txt file in your run_inital_and_iterative_chemstep folder.&lt;br /&gt;
Now we submit our first round of running ChemSTEP with :&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_initial.sh&lt;br /&gt;
   &lt;br /&gt;
   # this will queue a job&lt;br /&gt;
   # the job will split into many jobs, 600, eg which will run for a while&lt;br /&gt;
   # the initial job will run for a while after the jobs finish, and should generate &lt;br /&gt;
   # output in /output/complete_info/ ,there should be a .smi file when sucessfully &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two notes here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, we will never touch the params.txt file again. From my understanding, we need to copy each following scores_round_*.npy and indices_round_*.npy into the same directory (in our case, run_initial_and_iterative_chemstep)&lt;br /&gt;
&lt;br /&gt;
Second, I had issues with getting Wynton to execute python for every submitted job. I hope this is fixed for you as well now.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When ChemSTEP finishes, we can go to our CHEMSTEP_PROJECT_FOLDER and brace ourselves for building. &lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_1&lt;br /&gt;
   cd building_1&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi .&lt;br /&gt;
   &lt;br /&gt;
   #if there is no smi file, something went wrong&lt;br /&gt;
&lt;br /&gt;
We now source the building environment, prepare the job, submit the job, and wait until the building is completed.&lt;br /&gt;
&lt;br /&gt;
source environment:&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
prepare job&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_1.smi&lt;br /&gt;
   &lt;br /&gt;
   #note: smi_round_*.smi for the following rounds must be adjusted. &lt;br /&gt;
&lt;br /&gt;
submit job&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
When this is finished, check for failed jobs and resubmit. Some will always fail, just try to keep them low.&lt;br /&gt;
When the molecules are built, we can proceed with docking them.&lt;br /&gt;
Now we generate an .sdi file from our first building round.&lt;br /&gt;
&lt;br /&gt;
   #cd into your building_1 folder&lt;br /&gt;
   &lt;br /&gt;
   find /wynton/group/bks/work/pseemann/CHEMSTEP_PROJECT_FOLDER/building_1/building_output/ -type f -name &amp;quot;*.tgz&amp;quot; &amp;gt; round1.sdi&lt;br /&gt;
   &lt;br /&gt;
   #example adjust paths&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of docking: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We proceed with docking the freshly built compounds, so we make a directory called round_1, with dockfiles, and copy our new SDI file here, too&lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir round_1&lt;br /&gt;
   cd round_1&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp ../../building_1/*.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   cp -r ../round_0/dockfiles .&lt;br /&gt;
   vim dockfiles/INDOCK &lt;br /&gt;
   &lt;br /&gt;
   # adjust the score maximum in the INDOCK to your chosen pprop (recommended)&lt;br /&gt;
   # submit with your favourite submission script just as you did for round_0&lt;br /&gt;
   # so sh your_way_of_submitting.sh&lt;br /&gt;
&lt;br /&gt;
As before, we will now run get_scores.py&lt;br /&gt;
&lt;br /&gt;
source environment&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #cd into your round_1 directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_0/get_scores.py .&lt;br /&gt;
   python get_scores.py 1&lt;br /&gt;
   &lt;br /&gt;
   # wait until this finishes, always adjust the argument after                 &lt;br /&gt;
   # python get_scores.py to not confuse your scores files with other rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #still in your round_1 directory&lt;br /&gt;
   #copy the right script, IDs have changed, and needed to be adjusted in the convert script&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/64_char_convert_scores_to_npy.py .&lt;br /&gt;
   python 64_char_convert_scores_to_npy.py 1&lt;br /&gt;
   &lt;br /&gt;
   # Wait until this finishes; always adjust the argument afterward &lt;br /&gt;
   # python 64_char_convert_scores_to_npy.py&lt;br /&gt;
   # script was adjusted to fit the output of round_1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #cd into your run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_1/scores_round_1.npy .&lt;br /&gt;
   cp ../round_1/indices_round_1.npy .&lt;br /&gt;
&lt;br /&gt;
Copy over the iterative run_chemstep_iteratively.py and launch_chemstep_as_job_iteratively.sh&lt;br /&gt;
These are slightly different then the initial ones. But from here, we will only use these scripts. Be sure to always provide the right arguments to the scripts. Be sure to use the right scripts. This is (hopefully) the most confusing step in this ChemSTEP tutorial.&lt;br /&gt;
&lt;br /&gt;
   #still in run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_iteratively.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_iteratively.py .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Submit the 2nd round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_iteratively.sh 2 &lt;br /&gt;
   &lt;br /&gt;
   #Give the number of rounds you are running chemstep if you are using scores_round_1.npy and indices_round_1.npy you provide 2 as an&lt;br /&gt;
   #argument, like in the example above.&lt;br /&gt;
   #if you run your 3rd round of chemstep and provide indices_round_2.py and &lt;br /&gt;
   #scores_round_2.npy, one would do qsub launch_chemstep_as_job_iteratively.sh 3&lt;br /&gt;
   #and so on...&lt;br /&gt;
   #If no argument is provided, it will queue but shut down. &lt;br /&gt;
   #You can check this in the chemstep_submission.log file | &lt;br /&gt;
   #So when the job is submitted, it will just quit, when no argument is given, after a few seconds to minutes.&lt;br /&gt;
&lt;br /&gt;
Now we wait until the jobs finish, and brace ourselves for the next time-consuming round of building.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #so in your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_2&lt;br /&gt;
   cd building_2&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_2.smi .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;source environment&#039;&#039;&#039;&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;prepare job (always adjust smi_round.smi here)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_2.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;submit the job&#039;&#039;&#039;&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
Now like shown before. Resubmit failed jobs, make your sdi, and proceed with docking (new folder round_2 recommended).&lt;br /&gt;
&lt;br /&gt;
Now we went full circle. The next step would be to make your next round_2 of the docking directory with the updated .sdi file from the 2nd round of building. With the next round of docking, you would extract scores and IDs, convert them, feed them to ChemSTEP,  and repeat this as often as you don&#039;t see an increase in recovery rate. You would always need to update the arguments you pass to the python and submission scripts to match the round of ChemSTEP and building, and extracting etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Slight changes here so far compared to the trillion space:&lt;br /&gt;
&lt;br /&gt;
-added a workflow chart&lt;br /&gt;
&lt;br /&gt;
-added  a suggested directory structure&lt;br /&gt;
&lt;br /&gt;
-adjusted the extract scripts for 13B&lt;br /&gt;
&lt;br /&gt;
-Separated the initial and iterative scripts for submission and run ChemSTEP, the iterative submission now only works when an argument is passed for the round of submission&lt;br /&gt;
&lt;br /&gt;
-Added a shared folder for the 13B scripts if others want to use them as well&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16899</id>
		<title>Running ChemSTEP in the 13 billion space</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16899"/>
		<updated>2025-09-18T20:14:36Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Written by Philipp Seemann with the kind assistance of Katie Holland and Joseph Pepe (08/28/2025)&lt;br /&gt;
*This tutorial should work on Wynton with the provided scripts and public environments; you might need to catch tiny typos. I apologize.&lt;br /&gt;
&lt;br /&gt;
This is meant to be a simple hands-on step by step guide for ChemSTEP on Wynton in the 13 billion space. For exploring the trillion space please refer to:[[Running ChemSTEP|https://wiki.docking.org/index.php?title=Running_ChemSTEP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The general workflow is:&#039;&#039;&#039;&lt;br /&gt;
   |--- Simply DOCK the seeds set (you can use any docking method)&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP &lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 2nd time&lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 3rd time&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   |--- Repeat until your Recovery rate does not improve&lt;br /&gt;
&lt;br /&gt;
Here is a recommended folder layout after several rounds of ChemSTEP. We will also provide the initial layout here right after this one. This should just give you an overview of what folders we will need to make iteratively, not to confuse our building and docking, and ChemSTEP rounds. (You can change this however you want. After you get the hang of this, you can be creative and find a better layout workflow for you!) This tutorial will lead you through round_0 and round_1. After that, it should become clear what steps you will need to repeat over and over again. This tutorial is written for Wynton. Please use the scripts starting from a dev node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folder layout:&#039;&#039;&#039;&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/&lt;br /&gt;
   |&lt;br /&gt;
   |----building_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----building_2/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_2/&lt;br /&gt;
   |&lt;br /&gt;
   |....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explanation of folders&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;run_inital_and_iterative_chemstep/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here, we actually run ChemSTEP with every new round as well. Here will  be copied all scores_round_*.npy and indices_round_*.npy after every new round of docking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_0/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking of the seeds set. So this contains your dockfiles, and here we generate the initial indices and score .npys, which will be copied to the run_inital_and_iterative_chemstep/ folder later on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This folder is for building of the first .smi file from run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
docking of the molecules from the building_1 folder. So this contains again your dockfiles with an adjusted INDOCK and a new sdi file. After extracting the scores, it will yield us indices and scores .npys of round_1 for the second round of chemstep. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After running chemstep from run_inital_and_iterative_chemstep the second time we will have a new .smi file which we will need to build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have read carefully to this point, you will know what comes next. We will dock the molecules from building_2 here and extract the scores. Generate .npys files. Copy those to our run_inital_and_iterative_chemstep folder to generate the next smi_round_*.smi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this is now all still confusing, but we will start easy. It will make sense as any other Shoichet Lab tutorial. I promise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of docking&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here are the first folders that you will need to set up for this tutorial&lt;br /&gt;
&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/ # docking of the seeds set&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/ #here will  be copied all scores_round_*.npy and indices_round_*.npy files&lt;br /&gt;
&lt;br /&gt;
First, we make a traditional DOCKing directory in your work directories (be sure not to be in your home directory because we will dock and build (DISKSPACE!)). The first step for ChemSTEP is basically just docking the 13B_seed_set_built.sdi, so submit as your traditional LSD screen (whatever submission style or script you prefer). This layout follows the above shown layout of folders.  What you need to bring on your own here are your dockfiles (and your way of submission script).&lt;br /&gt;
&lt;br /&gt;
   mkdir CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   cd CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   mkdir round_0&lt;br /&gt;
   cd round_0&lt;br /&gt;
   cp -r path/to/your/dockfiles . #check your INDOCK parameters&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   # cp your favourite submission script or whatever you use for submitting jobs&lt;br /&gt;
   # or in case you use SymDOCK with the right executable set in the submission    &lt;br /&gt;
   # script&lt;br /&gt;
&lt;br /&gt;
Submit the docking job with your method of preference. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Things to consider for the size of the seeds set&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ideally, we want enough molecules in our desired pProp region to be considered as beacons and virtual hits. So it is of great importance that enough molecules score in the desired region to be considered as beacons. On Wynton, there is the 130k seeds set, a 13M set, and somewhere also a 1.3M set. &lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi #130k &lt;br /&gt;
   /wynton/group/bks/work/bwhall61/mor_chemstep/DOCK/13M/seed/docking/bundle_paths.sdi #13M&lt;br /&gt;
&lt;br /&gt;
Our aim is actually to dock a small chunk, which is still big enough to represent the library, and among those molecules we want enough beacons (so probably something between 50-100 molecules in the desired score range) chosen by ChemSTEP&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When the docking finishes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source the right environment now:&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
We will now extract scores and Molecule IDs, so we run get_scores.py&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/get_scores.py .&lt;br /&gt;
   python get_scores.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
When get_scores.py runs successfully, we see scores_round_0.txt in our folder. Check your scores.txt file for output. It should look like this:&lt;br /&gt;
&lt;br /&gt;
   MOL12457028547 -29.32&lt;br /&gt;
   MOL12457032486 -32.39&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
The get_scores.py script expects a certain output folder structure. If you do not see any output in your .txt file, vim into the script and adjust the paths. If you use the copied version, it should be: &lt;br /&gt;
   /output/*/*/OUTDOCK.*&lt;br /&gt;
&lt;br /&gt;
Now we translate scores_round_0.txt into indices_round_0.npy and scores_round_0.npy&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/convert_scores_to_npy.py .&lt;br /&gt;
   python convert_scores_to_npy.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
now we should find indices_round_0.npy and scores_round_0.npy in our round_0 directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of ChemSTEP. EXCITING!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Now we set up ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #now cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir run_initial_and_iterative_chemstep&lt;br /&gt;
   cp round_0/*_round_0.npy run_initial_and_iterative_chemstep/&lt;br /&gt;
   cd run_initial_and_iterative_chemstep/&lt;br /&gt;
&lt;br /&gt;
Now the two .npy files should be in our run_inital_and_iterative_chemstep folder to run chemstep.&lt;br /&gt;
We will now set up our initial submission script, which will be slightly different from the iterative one for the following rounds.&lt;br /&gt;
&lt;br /&gt;
   #cd into your folder for running chemstep - &lt;br /&gt;
   #run_initial_and_iterative_chemstep/ &lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_initial.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_initial.py .&lt;br /&gt;
&lt;br /&gt;
We stay in this folder and copy over a params.txt file, and then adjust it to your liking &lt;br /&gt;
&lt;br /&gt;
   #we are still in run_inital_and_iterative_chemstep&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/params.txt .&lt;br /&gt;
&lt;br /&gt;
Adjust your params file - with vim if you like.&lt;br /&gt;
   vim params.txt&lt;br /&gt;
&lt;br /&gt;
   seed_indices_file: path/to/your/run_initial_and_iterative_chemstep/indices_round_0.npy &lt;br /&gt;
   &lt;br /&gt;
   seed_scores_file: path/to/your/run_initial_and_iterative_chemstep/scores_round_0.npy&lt;br /&gt;
   &lt;br /&gt;
   hit_pprop: 6 #may change depending on library size, here 13B&lt;br /&gt;
   &lt;br /&gt;
   n_docked_per_round: 1000000 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_beacons: 100 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_n_rounds: 250 # recommended&lt;br /&gt;
   &lt;br /&gt;
Now there should be two scripts and two .npy files, and one params.txt file in your run_inital_and_iterative_chemstep folder.&lt;br /&gt;
Now we submit our first round of running ChemSTEP with :&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_initial.sh&lt;br /&gt;
   &lt;br /&gt;
   # this will queue a job&lt;br /&gt;
   # the job will split into many jobs, 600, eg which will run for a while&lt;br /&gt;
   # the initial job will run for a while after the jobs finish, and should generate &lt;br /&gt;
   # output in /output/complete_info/ ,there should be a .smi file when sucessfully &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two notes here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, we will never touch the params.txt file again. From my understanding, we need to copy each following scores_round_*.npy and indices_round_*.npy into the same directory (in our case, run_initial_and_iterative_chemstep)&lt;br /&gt;
&lt;br /&gt;
Second, I had issues with getting Wynton to execute python for every submitted job. I hope this is fixed for you as well now.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When ChemSTEP finishes, we can go to our CHEMSTEP_PROJECT_FOLDER and brace ourselves for building. &lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_1&lt;br /&gt;
   cd building_1&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi .&lt;br /&gt;
   &lt;br /&gt;
   #if there is no smi file, something went wrong&lt;br /&gt;
&lt;br /&gt;
We now source the building environment, prepare the job, submit the job, and wait until the building is completed.&lt;br /&gt;
&lt;br /&gt;
source environment:&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
prepare job&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_1.smi&lt;br /&gt;
   &lt;br /&gt;
   #note: smi_round_*.smi for the following rounds must be adjusted. &lt;br /&gt;
&lt;br /&gt;
submit job&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
When this is finished, check for failed jobs and resubmit. Some will always fail, just try to keep them low.&lt;br /&gt;
When the molecules are built, we can proceed with docking them.&lt;br /&gt;
Now we generate an .sdi file from our first building round.&lt;br /&gt;
&lt;br /&gt;
   #cd into your building_1 folder&lt;br /&gt;
   &lt;br /&gt;
   find /wynton/group/bks/work/pseemann/CHEMSTEP_PROJECT_FOLDER/building_1/building_output/ -type f -name &amp;quot;*.tgz&amp;quot; &amp;gt; round1.sdi&lt;br /&gt;
   &lt;br /&gt;
   #example adjust paths&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of docking: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We proceed with docking the freshly built compounds, so we make a directory called round_1, with dockfiles, and copy our new SDI file here, too&lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir round_1&lt;br /&gt;
   cd round_1&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp ../../building_1/*.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   cp -r ../round_0/dockfiles .&lt;br /&gt;
   vim dockfiles/INDOCK &lt;br /&gt;
   &lt;br /&gt;
   # adjust the score maximum in the INDOCK to your chosen pprop (recommended)&lt;br /&gt;
   # submit with your favourite submission script just as you did for round_0&lt;br /&gt;
   # so sh your_way_of_submitting.sh&lt;br /&gt;
&lt;br /&gt;
As before, we will now run get_scores.py&lt;br /&gt;
&lt;br /&gt;
source environment&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #cd into your round_1 directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_0/get_scores.py .&lt;br /&gt;
   python get_scores.py 1&lt;br /&gt;
   &lt;br /&gt;
   # wait until this finishes, always adjust the argument after                 &lt;br /&gt;
   # python get_scores.py to not confuse your scores files with other rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #still in your round_1 directory&lt;br /&gt;
   #copy the right script, IDs have changed, and needed to be adjusted in the convert script&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/64_char_convert_scores_to_npy.py .&lt;br /&gt;
   python 64_char_convert_scores_to_npy.py 1&lt;br /&gt;
   &lt;br /&gt;
   # Wait until this finishes; always adjust the argument afterward &lt;br /&gt;
   # python 64_char_convert_scores_to_npy.py&lt;br /&gt;
   # script was adjusted to fit the output of round_1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #cd into your run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_1/scores_round_1.npy .&lt;br /&gt;
   cp ../round_1/indices_round_1.npy .&lt;br /&gt;
&lt;br /&gt;
Copy over the iterative run_chemstep_iteratively.py and launch_chemstep_as_job_iteratively.sh&lt;br /&gt;
These are slightly different then the initial ones. But from here, we will only use these scripts. Be sure to always provide the right arguments to the scripts. Be sure to use the right scripts. This is (hopefully) the most confusing step in this ChemSTEP tutorial.&lt;br /&gt;
&lt;br /&gt;
   #still in run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_iteratively.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_iteratively.py .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Submit the 2nd round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_iteratively.sh 2 &lt;br /&gt;
   &lt;br /&gt;
   #Give the number of rounds you are running chemstep if you are using scores_round_1.npy and indices_round_1.npy you provide 2 as an&lt;br /&gt;
   #argument, like in the example above.&lt;br /&gt;
   #if you run your 3rd round of chemstep and provide indices_round_2.py and &lt;br /&gt;
   #scores_round_2.npy, one would do qsub launch_chemstep_as_job_iteratively.sh 3&lt;br /&gt;
   #and so on...&lt;br /&gt;
   #If no argument is provided, it will queue but shut down. &lt;br /&gt;
   #You can check this in the chemstep_submission.log file | &lt;br /&gt;
   #So when the job is submitted, it will just quit, when no argument is given, after a few seconds to minutes.&lt;br /&gt;
&lt;br /&gt;
Now we wait until the jobs finish, and brace ourselves for the next time-consuming round of building.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #so in your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_2&lt;br /&gt;
   cd building_2&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_2.smi .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;source environment&#039;&#039;&#039;&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;prepare job (always adjust smi_round.smi here)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_2.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;submit the job&#039;&#039;&#039;&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
Now like shown before. Resubmit failed jobs, make your sdi, and proceed with docking (new folder round_2 recommended).&lt;br /&gt;
&lt;br /&gt;
Now we went full circle. The next step would be to make your next round_2 of the docking directory with the updated .sdi file from the 2nd round of building. With the next round of docking, you would extract scores and IDs, convert them, feed them to ChemSTEP,  and repeat this as often as you don&#039;t see an increase in recovery rate. You would always need to update the arguments you pass to the python and submission scripts to match the round of ChemSTEP and building, and extracting etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Slight changes here so far compared to the trillion space:&lt;br /&gt;
&lt;br /&gt;
-added a workflow chart&lt;br /&gt;
&lt;br /&gt;
-added  a suggested directory structure&lt;br /&gt;
&lt;br /&gt;
-adjusted the extract scripts for 13B&lt;br /&gt;
&lt;br /&gt;
-Separated the initial and iterative scripts for submission and run ChemSTEP, the iterative submission now only works when an argument is passed for the round of submission&lt;br /&gt;
&lt;br /&gt;
-Added a shared folder for the 13B scripts if others want to use them as well&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16856</id>
		<title>Running ChemSTEP in the 13 billion space</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16856"/>
		<updated>2025-09-02T18:18:54Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Written by Philipp Seemann with the kind assistance of Katie Holland and Joseph Pepe (08/28/2025)&lt;br /&gt;
*This tutorial should work on Wynton with the provided scripts and public environments; you might need to catch tiny typos. I apologize.&lt;br /&gt;
&lt;br /&gt;
This is meant to be a simple hands-on step by step guide for ChemSTEP on Wynton in the 13 billion space. For exploring the trillion space please refer to:[[Running ChemSTEP|https://wiki.docking.org/index.php?title=Running_ChemSTEP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The general workflow is:&#039;&#039;&#039;&lt;br /&gt;
   |--- Simply DOCK the seeds set (you can use any docking method)&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP &lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 2nd time&lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 3rd time&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   |--- Repeat until your Recovery rate does not improve&lt;br /&gt;
&lt;br /&gt;
Here is a recommended folder layout after several rounds of ChemSTEP. We will also provide the initial layout here right after this one. This should just give you an overview of what folders we will need to make iteratively, not to confuse our building and docking, and ChemSTEP rounds. (You can change this however you want. After you get the hang of this, you can be creative and find a better layout workflow for you!) This tutorial will lead you through round_0 and round_1. After that, it should become clear what steps you will need to repeat over and over again. This tutorial is written for Wynton. Please use the scripts starting from a dev node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folder layout:&#039;&#039;&#039;&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/&lt;br /&gt;
   |&lt;br /&gt;
   |----building_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----building_2/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_2/&lt;br /&gt;
   |&lt;br /&gt;
   |....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explanation of folders&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;run_inital_and_iterative_chemstep/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here, we actually run ChemSTEP with every new round as well. Here will  be copied all scores_round_*.npy and indices_round_*.npy after every new round of docking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_0/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking of the seeds set. So this contains your dockfiles, and here we generate the initial indices and score .npys, which will be copied to the run_inital_and_iterative_chemstep/ folder later on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This folder is for building of the first .smi file from run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
docking of the molecules from the building_1 folder. So this contains again your dockfiles with an adjusted INDOCK and a new sdi file. After extracting the scores, it will yield us indices and scores .npys of round_1 for the second round of chemstep. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After running chemstep from run_inital_and_iterative_chemstep the second time we will have a new .smi file which we will need to build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have read carefully to this point, you will know what comes next. We will dock the molecules from building_2 here and extract the scores. Generate .npys files. Copy those to our run_inital_and_iterative_chemstep folder to generate the next smi_round_*.smi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this is now all still confusing, but we will start easy. It will make sense as any other Shoichet Lab tutorial. I promise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of docking&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here are the first folders that you will need to set up for this tutorial&lt;br /&gt;
&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/ # docking of the seeds set&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/ #here will  be copied all scores_round_*.npy and indices_round_*.npy files&lt;br /&gt;
&lt;br /&gt;
First, we make a traditional DOCKing directory in your work directories (be sure not to be in your home directory because we will dock and build (DISKSPACE!)). The first step for ChemSTEP is basically just docking the 13B_seed_set_built.sdi, so submit as your traditional LSD screen (whatever submission style or script you prefer). This layout follows the above shown layout of folders.  What you need to bring on your own here are your dockfiles (and your way of submission script).&lt;br /&gt;
&lt;br /&gt;
   mkdir CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   cd CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   mkdir round_0&lt;br /&gt;
   cd round_0&lt;br /&gt;
   cp -r path/to/your/dockfiles . #check your INDOCK parameters&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   # cp your favourite submission script or whatever you use for submitting jobs&lt;br /&gt;
   # or in case you use SymDOCK with the right executable set in the submission    &lt;br /&gt;
   # script&lt;br /&gt;
&lt;br /&gt;
Submit the docking job with your method of preference. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When the docking finishes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source the right environment now:&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
We will now extract scores and Molecule IDs, so we run get_scores.py&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/get_scores.py .&lt;br /&gt;
   python get_scores.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
When get_scores.py runs successfully, we see scores_round_0.txt in our folder. Check your scores.txt file for output. It should look like this:&lt;br /&gt;
&lt;br /&gt;
   MOL12457028547 -29.32&lt;br /&gt;
   MOL12457032486 -32.39&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
The get_scores.py script expects a certain output folder structure. If you do not see any output in your .txt file, vim into the script and adjust the paths. If you use the copied version, it should be: &lt;br /&gt;
   /output/*/*/OUTDOCK.*&lt;br /&gt;
&lt;br /&gt;
Now we translate scores_round_0.txt into indices_round_0.npy and scores_round_0.npy&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/convert_scores_to_npy.py .&lt;br /&gt;
   python convert_scores_to_npy.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
now we should find indices_round_0.npy and scores_round_0.npy in our round_0 directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of ChemSTEP. EXCITING!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Now we set up ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #now cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir run_initial_and_iterative_chemstep&lt;br /&gt;
   cp round_0/*_round_0.npy run_initial_and_iterative_chemstep/&lt;br /&gt;
   cd run_initial_and_iterative_chemstep/&lt;br /&gt;
&lt;br /&gt;
Now the two .npy files should be in our run_inital_and_iterative_chemstep folder to run chemstep.&lt;br /&gt;
We will now set up our initial submission script, which will be slightly different from the iterative one for the following rounds.&lt;br /&gt;
&lt;br /&gt;
   #cd into your folder for running chemstep - &lt;br /&gt;
   #run_initial_and_iterative_chemstep/ &lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_initial.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_initial.py .&lt;br /&gt;
&lt;br /&gt;
We stay in this folder and copy over a params.txt file, and then adjust it to your liking &lt;br /&gt;
&lt;br /&gt;
   #we are still in run_inital_and_iterative_chemstep&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/params.txt .&lt;br /&gt;
&lt;br /&gt;
Adjust your params file - with vim if you like.&lt;br /&gt;
   vim params.txt&lt;br /&gt;
&lt;br /&gt;
   seed_indices_file: path/to/your/run_initial_and_iterative_chemstep/indices_round_0.npy &lt;br /&gt;
   &lt;br /&gt;
   seed_scores_file: path/to/your/run_initial_and_iterative_chemstep/scores_round_0.npy&lt;br /&gt;
   &lt;br /&gt;
   hit_pprop: 6 #may change depending on library size, here 13B&lt;br /&gt;
   &lt;br /&gt;
   n_docked_per_round: 1000000 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_beacons: 100 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_n_rounds: 250 # recommended&lt;br /&gt;
   &lt;br /&gt;
Now there should be two scripts and two .npy files, and one params.txt file in your run_inital_and_iterative_chemstep folder.&lt;br /&gt;
Now we submit our first round of running ChemSTEP with :&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_initial.sh&lt;br /&gt;
   &lt;br /&gt;
   # this will queue a job&lt;br /&gt;
   # the job will split into many jobs, 600, eg which will run for a while&lt;br /&gt;
   # the initial job will run for a while after the jobs finish, and should generate &lt;br /&gt;
   # output in /output/complete_info/ ,there should be a .smi file when sucessfully &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two notes here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, we will never touch the params.txt file again. From my understanding, we need to copy each following scores_round_*.npy and indices_round_*.npy into the same directory (in our case, run_initial_and_iterative_chemstep)&lt;br /&gt;
&lt;br /&gt;
Second, I had issues with getting Wynton to execute python for every submitted job. I hope this is fixed for you as well now.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When ChemSTEP finishes, we can go to our CHEMSTEP_PROJECT_FOLDER and brace ourselves for building. &lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_1&lt;br /&gt;
   cd building_1&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi .&lt;br /&gt;
   &lt;br /&gt;
   #if there is no smi file, something went wrong&lt;br /&gt;
&lt;br /&gt;
We now source the building environment, prepare the job, submit the job, and wait until the building is completed.&lt;br /&gt;
&lt;br /&gt;
source environment:&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
prepare job&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_1.smi&lt;br /&gt;
   &lt;br /&gt;
   #note: smi_round_*.smi for the following rounds must be adjusted. &lt;br /&gt;
&lt;br /&gt;
submit job&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
When this is finished, check for failed jobs and resubmit. Some will always fail, just try to keep them low.&lt;br /&gt;
When the molecules are built, we can proceed with docking them.&lt;br /&gt;
Now we generate an .sdi file from our first building round.&lt;br /&gt;
&lt;br /&gt;
   #cd into your building_1 folder&lt;br /&gt;
   &lt;br /&gt;
   find /wynton/group/bks/work/pseemann/CHEMSTEP_PROJECT_FOLDER/building_1/building_output/ -type f -name &amp;quot;*.tgz&amp;quot; &amp;gt; round1.sdi&lt;br /&gt;
   &lt;br /&gt;
   #example adjust paths&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of docking: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We proceed with docking the freshly built compounds, so we make a directory called round_1, with dockfiles, and copy our new SDI file here, too&lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir round_1&lt;br /&gt;
   cd round_1&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp ../../building_1/*.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   cp -r ../round_0/dockfiles .&lt;br /&gt;
   vim dockfiles/INDOCK &lt;br /&gt;
   &lt;br /&gt;
   # adjust the score maximum in the INDOCK to your chosen pprop (recommended)&lt;br /&gt;
   # submit with your favourite submission script just as you did for round_0&lt;br /&gt;
   # so sh your_way_of_submitting.sh&lt;br /&gt;
&lt;br /&gt;
As before, we will now run get_scores.py&lt;br /&gt;
&lt;br /&gt;
source environment&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #cd into your round_1 directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_0/get_scores.py .&lt;br /&gt;
   python get_scores.py 1&lt;br /&gt;
   &lt;br /&gt;
   # wait until this finishes, always adjust the argument after                 &lt;br /&gt;
   # python get_scores.py to not confuse your scores files with other rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #still in your round_1 directory&lt;br /&gt;
   #copy the right script, IDs have changed, and needed to be adjusted in the convert script&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/64_char_convert_scores_to_npy.py .&lt;br /&gt;
   python 64_char_convert_scores_to_npy.py 1&lt;br /&gt;
   &lt;br /&gt;
   # Wait until this finishes; always adjust the argument afterward &lt;br /&gt;
   # python 64_char_convert_scores_to_npy.py&lt;br /&gt;
   # script was adjusted to fit the output of round_1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #cd into your run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_1/scores_round_1.npy .&lt;br /&gt;
   cp ../round_1/indices_round_1.npy .&lt;br /&gt;
&lt;br /&gt;
Copy over the iterative run_chemstep_iteratively.py and launch_chemstep_as_job_iteratively.sh&lt;br /&gt;
These are slightly different then the initial ones. But from here, we will only use these scripts. Be sure to always provide the right arguments to the scripts. Be sure to use the right scripts. This is (hopefully) the most confusing step in this ChemSTEP tutorial.&lt;br /&gt;
&lt;br /&gt;
   #still in run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_iteratively.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_iteratively.py .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Submit the 2nd round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_iteratively.sh 2 &lt;br /&gt;
   &lt;br /&gt;
   #Give the number of rounds you are running chemstep if you are using scores_round_1.npy and indices_round_1.npy you provide 2 as an&lt;br /&gt;
   #argument, like in the example above.&lt;br /&gt;
   #if you run your 3rd round of chemstep and provide indices_round_2.py and &lt;br /&gt;
   #scores_round_2.npy, one would do qsub launch_chemstep_as_job_iteratively.sh 3&lt;br /&gt;
   #and so on...&lt;br /&gt;
   #If no argument is provided, it will queue but shut down. &lt;br /&gt;
   #You can check this in the chemstep_submission.log file | &lt;br /&gt;
   #So when the job is submitted, it will just quit, when no argument is given, after a few seconds to minutes.&lt;br /&gt;
&lt;br /&gt;
Now we wait until the jobs finish, and brace ourselves for the next time-consuming round of building.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #so in your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_2&lt;br /&gt;
   cd building_2&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_2.smi .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;source environment&#039;&#039;&#039;&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;prepare job (always adjust smi_round.smi here)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_2.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;submit the job&#039;&#039;&#039;&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
Now like shown before. Resubmit failed jobs, make your sdi, and proceed with docking (new folder round_2 recommended).&lt;br /&gt;
&lt;br /&gt;
Now we went full circle. The next step would be to make your next round_2 of the docking directory with the updated .sdi file from the 2nd round of building. With the next round of docking, you would extract scores and IDs, convert them, feed them to ChemSTEP,  and repeat this as often as you don&#039;t see an increase in recovery rate. You would always need to update the arguments you pass to the python and submission scripts to match the round of ChemSTEP and building, and extracting etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Slight changes here so far compared to the trillion space:&lt;br /&gt;
&lt;br /&gt;
-added a workflow chart&lt;br /&gt;
&lt;br /&gt;
-added  a suggested directory structure&lt;br /&gt;
&lt;br /&gt;
-adjusted the extract scripts for 13B&lt;br /&gt;
&lt;br /&gt;
-Separated the initial and iterative scripts for submission and run ChemSTEP, the iterative submission now only works when an argument is passed for the round of submission&lt;br /&gt;
&lt;br /&gt;
-Added a shared folder for the 13B scripts if others want to use them as well&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
	<entry>
		<id>http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16854</id>
		<title>Running ChemSTEP in the 13 billion space</title>
		<link rel="alternate" type="text/html" href="http://wiki.docking.org/index.php?title=Running_ChemSTEP_in_the_13_billion_space&amp;diff=16854"/>
		<updated>2025-08-28T19:59:24Z</updated>

		<summary type="html">&lt;p&gt;Pseemann: Tutorial for running ChemSTEP on Wynton in the 13 billion space&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Written by Philipp Seemann with the kind assistance of Katie Holland and Joseph Pepe (08/28/2025)&lt;br /&gt;
*This tutorial should work on Wynton with the provided scripts and public environments; you might need to catch tiny typos. I apologize.&lt;br /&gt;
&lt;br /&gt;
This is meant to be a simple hands-on step by step guide for ChemSTEP on Wynton in the 13 billion space. For exploring the trillion space please refer to:[[Running ChemSTEP|https://wiki.docking.org/index.php?title=Running_ChemSTEP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The general workflow is:&#039;&#039;&#039;&lt;br /&gt;
   |--- Simply DOCK the seeds set (you can use any docking method)&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP &lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 1st round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 2nd time&lt;br /&gt;
   |&lt;br /&gt;
   |--- Build molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- DOCK molecules from 2nd round of ChemSTEP&lt;br /&gt;
   |&lt;br /&gt;
   |--- Run ChemSTEP the 3rd time&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   |--- Repeat until your Recovery rate does not improve&lt;br /&gt;
&lt;br /&gt;
Here is a recommended folder layout after several rounds of ChemSTEP. We will also provide the initial layout here right after this one. This should just give you an overview of what folders we will need to make iteratively, not to confuse our building and docking, and ChemSTEP rounds. (You can change this however you want. After you get the hang of this, you can be creative and find a better layout workflow for you!) This tutorial will lead you through round_0 and round_1. After that, it should become clear what steps you will need to repeat over and over again. This tutorial is written for Wynton. Please use the scripts starting from a dev node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folder layout:&#039;&#039;&#039;&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/&lt;br /&gt;
   |&lt;br /&gt;
   |----building_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_1/ &lt;br /&gt;
   |&lt;br /&gt;
   |----building_2/ &lt;br /&gt;
   |&lt;br /&gt;
   |----round_2/&lt;br /&gt;
   |&lt;br /&gt;
   |....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explanation of folders&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;run_inital_and_iterative_chemstep/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here, we actually run ChemSTEP with every new round as well. Here will  be copied all scores_round_*.npy and indices_round_*.npy after every new round of docking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_0/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Docking of the seeds set. So this contains your dockfiles, and here we generate the initial indices and score .npys, which will be copied to the run_inital_and_iterative_chemstep/ folder later on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This folder is for building of the first .smi file from run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_1/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
docking of the molecules from the building_1 folder. So this contains again your dockfiles with an adjusted INDOCK and a new sdi file. After extracting the scores, it will yield us indices and scores .npys of round_1 for the second round of chemstep. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;building_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After running chemstep from run_inital_and_iterative_chemstep the second time we will have a new .smi file which we will need to build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;round_2/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have read carefully to this point, you will know what comes next. We will dock the molecules from building_2 here and extract the scores. Generate .npys files. Copy those to our run_inital_and_iterative_chemstep folder to generate the next smi_round_*.smi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this is now all still confusing, but we will start easy. It will make sense as any other Shoichet Lab tutorial. I promise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of docking&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here are the first folders that you will need to set up for this tutorial&lt;br /&gt;
&lt;br /&gt;
   CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----round_0/ # docking of the seeds set&lt;br /&gt;
   |&lt;br /&gt;
   |&lt;br /&gt;
   |----run_inital_and_iterative_chemstep/ #here will  be copied all scores_round_*.npy and indices_round_*.npy files&lt;br /&gt;
&lt;br /&gt;
First, we make a traditional DOCKing directory in your work directories (be sure not to be in your home directory because we will dock and build (DISKSPACE!)). The first step for ChemSTEP is basically just docking the 13B_seed_set_built.sdi, so submit as your traditional LSD screen (whatever submission style or script you prefer). This layout follows the above shown layout of folders.  What you need to bring on your own here are your dockfiles (and your way of submission script).&lt;br /&gt;
&lt;br /&gt;
   mkdir CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   cd CHEMSTEP_PROJECT_FOLDER/&lt;br /&gt;
   mkdir round_0&lt;br /&gt;
   cd round_0&lt;br /&gt;
   cp -r path/to/your/dockfiles . #check your INDOCK parameters&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp /wynton/group/bks/work/shared/kholland/chemstep_13B/13B_seed_set_built.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   # cp your favourite submission script or whatever you use for submitting jobs&lt;br /&gt;
   # or in case you use SymDOCK with the right executable set in the submission    &lt;br /&gt;
   # script&lt;br /&gt;
&lt;br /&gt;
Submit the docking job with your method of preference. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When the docking finishes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source the right environment now:&lt;br /&gt;
&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
We will now extract scores and Molecule IDs, so we run get_scores.py&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/get_scores.py .&lt;br /&gt;
   python get_scores.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
When get_scores.py runs successfully, we see scores_round_0.txt in our folder. Check your scores.txt file for output. It should look like this:&lt;br /&gt;
&lt;br /&gt;
   MOL12457028547 -29.32&lt;br /&gt;
   MOL12457032486 -32.39&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
The get_scores.py script expects a certain output folder structure. If you do not see any output in your .txt file, vim into the script and adjust the paths. If you use the copied version, it should be: &lt;br /&gt;
   /output/*/*/OUTDOCK.*&lt;br /&gt;
&lt;br /&gt;
Now we translate scores_round_0.txt into indices_round_0.npy and scores_round_0.npy&lt;br /&gt;
&lt;br /&gt;
   #cd into your round_0 directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/convert_scores_to_npy.py .&lt;br /&gt;
   python convert_scores_to_npy.py 0&lt;br /&gt;
   &lt;br /&gt;
   #0 for initial round of chemstep&lt;br /&gt;
&lt;br /&gt;
now we should find indices_round_0.npy and scores_round_0.npy in our round_0 directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of ChemSTEP. EXCITING!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Now we set up ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #now cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir run_initial_and_iterative_chemstep&lt;br /&gt;
   cp round_0/*_round_0.npy run_initial_and_iterative_chemstep/&lt;br /&gt;
   cd run_initial_and_iterative_chemstep/&lt;br /&gt;
&lt;br /&gt;
Now the two .npy files should be in our run_inital_and_iterative_chemstep folder to run chemstep.&lt;br /&gt;
We will now set up our initial submission script, which will be slightly different from the iterative one for the following rounds.&lt;br /&gt;
&lt;br /&gt;
   #cd into your folder for running chemstep - &lt;br /&gt;
   #run_initial_and_iterative_chemstep/ &lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_initial.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_initial.py .&lt;br /&gt;
&lt;br /&gt;
We stay in this folder and copy over a params.txt file, and then adjust it to your liking &lt;br /&gt;
&lt;br /&gt;
   #we are still in run_inital_and_iterative_chemstep&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/params.txt .&lt;br /&gt;
&lt;br /&gt;
Adjust your params file - with vim if you like.&lt;br /&gt;
   vim params.txt&lt;br /&gt;
&lt;br /&gt;
   seed_indices_file: path/to/your/run_initial_and_iterative_chemstep/indices_round_0.npy &lt;br /&gt;
   &lt;br /&gt;
   seed_scores_file: path/to/your/run_initial_and_iterative_chemstep/scores_round_0.npy&lt;br /&gt;
   &lt;br /&gt;
   hit_pprop: 6 #may change depending on library size, here 13B&lt;br /&gt;
   &lt;br /&gt;
   n_docked_per_round: 1000000 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_beacons: 100 #reasonable for 13B&lt;br /&gt;
   &lt;br /&gt;
   max_n_rounds: 250 # recommended&lt;br /&gt;
   &lt;br /&gt;
Now there should be two scripts and two .npy files, and one params.txt file in your run_inital_and_iterative_chemstep folder.&lt;br /&gt;
Now we submit our first round of running ChemSTEP with :&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_initial.sh&lt;br /&gt;
   &lt;br /&gt;
   # this will queue a job&lt;br /&gt;
   # the job will split into many jobs, 600, eg which will run for a while&lt;br /&gt;
   # the initial job will run for a while after the jobs finish, and should generate &lt;br /&gt;
   # output in /output/complete_info/ ,there should be a .smi file when sucessfully &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two notes here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
First, we will never touch the params.txt file again. From my understanding, we need to copy each following scores_round_*.npy and indices_round_*.npy into the same directory (in our case, run_initial_and_iterative_chemstep)&lt;br /&gt;
&lt;br /&gt;
Second, I had issues with getting Wynton to execute python for every submitted job. I hope this is fixed for you as well now.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;First round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When ChemSTEP finishes, we can go to our CHEMSTEP_PROJECT_FOLDER and brace ourselves for building. &lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_1&lt;br /&gt;
   cd building_1&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_1.smi .&lt;br /&gt;
   &lt;br /&gt;
   #if there is no smi file, something went wrong&lt;br /&gt;
&lt;br /&gt;
We now source the building environment, prepare the job, submit the job, and wait until the building is completed.&lt;br /&gt;
&lt;br /&gt;
source environment:&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
prepare job&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_1.smi&lt;br /&gt;
   &lt;br /&gt;
   #note: smi_round_*.smi for the following rounds must be adjusted. &lt;br /&gt;
&lt;br /&gt;
submit job&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
When this is finished, check for failed jobs and resubmit. Some will always fail, just try to keep them low.&lt;br /&gt;
When the molecules are built, we can proceed with docking them.&lt;br /&gt;
Now we generate an .sdi file from our first building round.&lt;br /&gt;
&lt;br /&gt;
   #cd into your building_1 folder&lt;br /&gt;
   &lt;br /&gt;
   find /wynton/group/bks/work/pseemann/CHEMSTEP_PROJECT_FOLDER/building_1/building_output/ -type f -name &amp;quot;*.tgz&amp;quot; &amp;gt; round1.sdi&lt;br /&gt;
   &lt;br /&gt;
   #example adjust paths&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of docking: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We proceed with docking the freshly built compounds, so we make a directory called round_1, with dockfiles, and copy our new SDI file here, too&lt;br /&gt;
&lt;br /&gt;
   #cd into your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir round_1&lt;br /&gt;
   cd round_1&lt;br /&gt;
   mkdir sdi&lt;br /&gt;
   cd sdi&lt;br /&gt;
   cp ../../building_1/*.sdi .&lt;br /&gt;
   cd ..&lt;br /&gt;
   cp -r ../round_0/dockfiles .&lt;br /&gt;
   vim dockfiles/INDOCK &lt;br /&gt;
   &lt;br /&gt;
   # adjust the score maximum in the INDOCK to your chosen pprop (recommended)&lt;br /&gt;
   # submit with your favourite submission script just as you did for round_0&lt;br /&gt;
   # so sh your_way_of_submitting.sh&lt;br /&gt;
&lt;br /&gt;
As before, we will now run get_scores.py&lt;br /&gt;
&lt;br /&gt;
source environment&lt;br /&gt;
   source /wynton/group/bks/work/shared/kholland/chemstep_env/bin/activate&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #cd into your round_1 directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_0/get_scores.py .&lt;br /&gt;
   python get_scores.py 1&lt;br /&gt;
   &lt;br /&gt;
   # wait until this finishes, always adjust the argument after                 &lt;br /&gt;
   # python get_scores.py to not confuse your scores files with other rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy scripts and execute them&lt;br /&gt;
   #still in your round_1 directory&lt;br /&gt;
   #copy the right script, IDs have changed, and needed to be adjusted in the convert script&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/64_char_convert_scores_to_npy.py .&lt;br /&gt;
   python 64_char_convert_scores_to_npy.py 1&lt;br /&gt;
   &lt;br /&gt;
   # Wait until this finishes; always adjust the argument afterward &lt;br /&gt;
   # python 64_char_convert_scores_to_npy.py&lt;br /&gt;
   # script was adjusted to fit the output of round_1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #cd into your run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp ../round_1/scores_round_1.npy .&lt;br /&gt;
   cp ../round_1/indices_round_1.npy .&lt;br /&gt;
&lt;br /&gt;
Copy over the iterative run_chemstep_iteratively.py and launch_chemstep_as_job_iteratively.sh&lt;br /&gt;
These are slightly different then the initial ones. But from here, we will only use these scripts. Be sure to always provide the right arguments to the scripts. Be sure to use the right scripts. This is (hopefully) the most confusing step in this ChemSTEP tutorial.&lt;br /&gt;
&lt;br /&gt;
   #still in run_initial_and_iterative_chemstep directory&lt;br /&gt;
   &lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/launch_chemstep_as_job_iteratively.sh .&lt;br /&gt;
   cp /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/run_chemstep_iteratively.py .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Submit the 2nd round of ChemSTEP:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   qsub launch_chemstep_as_job_iteratively.sh 2 &lt;br /&gt;
   &lt;br /&gt;
   #Give the number of rounds you are running chemstep if you are using scores_round_1.npy and indices_round_1.npy you provide 2 as an&lt;br /&gt;
   #argument, like in the example above.&lt;br /&gt;
   #if you run your 3rd round of chemstep and provide indices_round_2.py and &lt;br /&gt;
   #scores_round_2.npy, one would do qsub launch_chemstep_as_job_iteratively.sh 3&lt;br /&gt;
   #and so on...&lt;br /&gt;
   #If no argument is provided, it will queue but shut down. You can check this in the launch_chemstep_as_job_iterativley.sh.e* file&lt;br /&gt;
   #So when the job is submitted, it will just quit, when no argument is given, after a few seconds to minutes.&lt;br /&gt;
&lt;br /&gt;
Now we wait until the jobs finish, and brace ourselves for the next time-consuming round of building.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Next round of building:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   #so in your CHEMSTEP_PROJECT_FOLDER&lt;br /&gt;
   &lt;br /&gt;
   mkdir building_2&lt;br /&gt;
   cd building_2&lt;br /&gt;
   cp ../run_initial_and_iterative_chemstep/output/complete_info/smi_round_2.smi .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;source environment&#039;&#039;&#039;&lt;br /&gt;
   source /wynton/group/bks/soft/DOCK-3.8.5/env.sh&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;prepare job (always adjust smi_round.smi here)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   python /wynton/group/bks/soft/DOCK-3.8.5/DOCK3.8/zinc22-3d/submit/submit_building_docker.py --output_folder building_output --bundle_size 1000 --minutes_per_mol 1 --skip_name_check --scheduler sge --container_software apptainer --container_path_or_name /wynton/group/bks/soft/DOCK-3.8.5/building_pipeline.sif smi_round_2.smi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;submit the job&#039;&#039;&#039;&lt;br /&gt;
   qsub building_array_job.sh&lt;br /&gt;
&lt;br /&gt;
Now like shown before. Resubmit failed jobs, make your sdi, and proceed with docking (new folder round_2 recommended).&lt;br /&gt;
&lt;br /&gt;
Now we went full circle. The next step would be to make your next round_2 of the docking directory with the updated .sdi file from the 2nd round of building. With the next round of docking, you would extract scores and IDs, convert them, feed them to ChemSTEP,  and repeat this as often as you don&#039;t see an increase in recovery rate. You would always need to update the arguments you pass to the python and submission scripts to match the round of ChemSTEP and building, and extracting etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Slight changes here so far compared to the trillion space:&lt;br /&gt;
&lt;br /&gt;
-added a workflow chart&lt;br /&gt;
&lt;br /&gt;
-added  a suggested directory structure&lt;br /&gt;
&lt;br /&gt;
-adjusted the extract scripts for 13B&lt;br /&gt;
&lt;br /&gt;
-Separated the initial and iterative scripts for submission and run ChemSTEP, the iterative submission now only works when an argument is passed for the round of submission&lt;br /&gt;
&lt;br /&gt;
-Added a shared folder for the 13B scripts if others want to use them as well&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /wynton/group/bks/work/shared/chemstep_13B_scripts_tutorial/&lt;/div&gt;</summary>
		<author><name>Pseemann</name></author>
	</entry>
</feed>