Difference between revisions of "Arthor Documentation for Future Developer"

From DISI
Jump to navigation Jump to search
 
(101 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Written by Jennifer Young on December 16, 2019. Last edited January 30, 2020
+
== Introduction ==
 +
[https://www.nextmovesoftware.com/downloads/arthor/documentation/Arthor.pdf Here is the link to Arthor's manual]
 +
* Username: ucsf@nextmovesoftware.com
 +
* Password: <Ask jjiteam@googlegroups.com>
  
==Install and Set Up on TomCat==
+
Arthor configurations and the frontend files are consolidated in '''/nfs/soft2/arthor_configs/'''.
Arthor currently runs on n-1-136, which runs CentOS Linux release 7.7.1908 (Core).  You can check the version of CentOS with the following command
 
    cat /etc/centos-release
 
  
Check your current version of Java with the following command:
+
'''/nfs/soft2/arthor_configs/start_arthor_script.sh''' can start/restart Arthor instances on respective machines.
    java -version
 
  
On n-1-136 we are running openjdk version "1.8.0_222", OpenJDK Runtime Environment (build 1.8.0_222-b10), and OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
+
Launch the script to see the options available.
If Java is not installed, install it using yum
 
  
==See this wiki page for more detailed information about installing Tomcat on our cluster==
+
== How To Download Arthor ==
http://wiki.docking.org/index.php/Tomcat_Installation
+
# Ssh to nfs-soft2 and become root. Prepare directory
 +
#: <source> mkdir /export/soft2/arthor_configs/arthor-<version> && cd /export/soft2/arthor_configs/arthor-<version> </source>
 +
# [https://www.nextmovesoftware.com/downloads/arthor/ Download Software with this link]
 +
#* Username: ucsf@nextmovesoftware.com
 +
#* Password: <Ask jjiteam@googlegroups.com>
 +
# Go to releases. Look for ''' smallworld-java-<version>.tar.gz ''' and copy the link address.
 +
# Download using wget
 +
#: <source> wget --user ucsf@nextmovesoftware.com --password <Ask jjiteam@googlegroups.com> <link address> </source>
 +
# Decompress the file
 +
#* <source> tar -xvf <file_name> </source>
  
==Open port for Arthor==
+
== How To Launch Arthor For The First Time ==
In order for Arthor to be usable in the browser, the port you wish to run it on must be opened.
+
=== Prepare Files and Directories ===
https://www.thegeekdiary.com/how-to-open-a-ports-in-centos-rhel-7/
+
# Ssh to nfs-exc and become root
 +
# Open a port in the firewall
 +
#: <source>firewall-cmd --permanent --add-port=<port_number>/tcp
 +
firewall-cmd --reload
 +
</source>
 +
# Go to Arthor Config directory
 +
#: <source>cd /export/soft2/arthor_configs/arthor-<latest_version></source>
 +
# Create an Arthor config file
 +
#: <source>vim <name_of_file>.cfg</source>
 +
#* Add these lines in the file. Check the manual for more options.
 +
#: <source>
 +
DataDir=/local2/public_arthor
 +
MaxConcurrentSearches=6
 +
MaxThreadsPerSearch=8
 +
AutomaticIndex=false
 +
AsyncHitCountMax=20000
 +
Depiction=./depict/bot/svg?w=%w&h=%h&svgunits=px&smi=%s&zoom=0.8&sma=%m&smalim=1
 +
Resolver=https://sw.docking.org/util/smi2mol?smi=%s
 +
</source>
 +
=== Start Arthor Instance ===
 +
# Now ssh into a machine you wish to run an Arthor instance on and become root
 +
# Change your shell to bash if you havn't already
 +
#: <source>bash</source>
 +
# Create a screen
 +
#: <source>screen -S <screen_name></source>
 +
# Prepare Arthor Config Path
 +
#: <source>export ARTHOR_CONFIG="/nfs/soft2/arthor_configs/arthor-<version>/<name_of_config_file>.cfg"</source>
 +
# Launch java
 +
#: <source>java -jar -Dserver.port=<port_number> /nfs/soft2/arthor_configs/arthor-<version>/arthor-server-<version>.war</source>
  
===Step 1: Check Port Status===
+
=== Configuration Details ===
Check that the port is not open and that Apache is not showing that port.
 
    netstat -na | grep <port number you are checking>
 
  
    lsof -i -P |grep http
+
*'''DataDir''': This is the directory where the Arthor data files live.  Location where the index files will be created and loaded from.
  
===Step 2: Check Port Status in IP Tables===
+
*'''MaxConcurrentSearches''': Controls the maximum number of searches that can be run concurrently by setting the database pool size. When switching between a large number of databases it can be useful to have a larger pool size, the only trade off is keeping file pointers open.
    iptables-save | grep <port number you are checking>
 
  
I skipped Step 3 from the guide, because there was a lot of information in the /etc/services file and I didn't want to edit it and break something.
+
*'''MaxThreadsPerSearch''': The number of threads to use for both ATDB and ATFP searches
  
===Step 4: Open Firewall Ports===
+
*Set '''AutomaticIndex''' to false if you don't want new smiles files added to the data directory to be indexed automatically
I did not include the zone=public section because the stand-alone servers are usually used for private instances of Arthor and SmallWorld.
 
Run as root.
 
    firewall-cmd --add-port=<port number you are adding>/tcp --permanent
 
  
You need to reload the firewall after a change is made.
+
*'''AsyncHitCountMax''': The upper-bound for the number of hits to retrieve in background searches.
    firewall-cmd --reload
 
  
===Step 5: Check that port is working===
+
*'''Resolver''': Using Smallworld API, allows input box to take in a SMILE format and automatically draw on the board.
To check that the port is active, run.
 
    iptables -nL
 
  
You should see something along the lines of:
+
'''Check Arthor manual for more configuration options'''
    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:<port number you're adding> ctstate NEW,UNTRACKED
 
  
==How to run standalone Arthor instance==
+
== How to Build Arthor Databases==
 +
We can build Arthor Databases anywhere. Consolidate smiles into one directory so you can index them all one by one.
  
===Step 1: Use or start a bash shell===
+
Just use the script located at '''/nfs/home/jjg/scripts/arthor_index_script.sh''' at the directory where you c
You can check your default shell using
 
    echo $SHELL
 
  
If your default shell is csh, use
+
Here is the content of the script:
    bash
+
<source>
to start a new bash shell in the current terminal window.  Note that echo $SHELL will show you your default shell regardless of the current shell.
+
#!/bin/bash
  
===Step 2: Set your environment variables===
+
version="3.4.2"
    export ARTHOR_DIR=/opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
    export PATH=$ARTHOR_DIR/bin/:$PATH
 
  
Make sure the ARTHOR_DIR variable is set to the directory for the latest version of Arthor or whichever version you would like to test.
+
export ARTHOR_DIR=/nfs/soft2/arthor_configs/arthor-$version/arthor-$version-centos7/
The PATH environment variable is needed if you wish to use the Arthor tools from the command line
+
export PATH=$ARTHOR_DIR/bin/:$PATH
  
===Step 3: Run the arthor-server.jar===
+
target="*.smi"
    java -jar /opt/nextmove/arthor/arthor-3.0-rt-beta-linux/java/arthor-server.jar --httpPort <your httpPort>
 
  
==Setting environment variables for TomCat Server==
+
for j in $target
Set the environment variables in the setenv.sh file. Note: Be sure to edit the file in the directory corresponding to the latest version of TomCat. As of December 2019, we are running 9.0.27 on n-1-136.
+
do
 +
        echo 'smi2atdb -j 4 -p '$j' '${j}'.atdb'
 +
        smi2atdb -j 4 -p $j ${j}.atdb
 +
        echo 'atdb2fp -j 4 '$j'.atdb'
 +
atdb2fp -j 4 ${j}.atdb
 +
done
 +
</source>
  
  vim  /opt/tomcat/apache-tomcat-9.0.27/bin/setenv.sh
+
=== Command Details ===
 +
'''smi2atdb''' creates the atdb files needed for Substructure searching.
 +
*'''-j''' is the amount of threads to use to index the smiles file
 +
*'''-p''' stores the position of the original file
 +
'''atdb2fp''' makes substructure searching faster
  
Add the line below to the setenv.sh file above, or substitute the path to wherever you currently store the arthor.cfg file
+
==Setting up Round Table==
  export ARTHOR_CONFIG=/usr/local/tomcat/arthor.cfg
+
"Round Table allows you to serve and split chemical searches across multiple host machines.  The implementation provides a lightweight proxy that forwards requests to other Arthor host servers that do the actual search. Communication is done using the existing Web APIs.
 +
===Setting up Host Server===
 +
# Ssh to nfs-soft2 and become root
 +
# Open a port in the firewall
 +
#: <source>firewall-cmd --permanent --add-port=<port_number>/tcp
 +
firewall-cmd --reload
 +
</source>
 +
# Go to Arthor Config Directory
 +
#: <source>cd /export/soft2/arthor_configs/arthor-<version></source>
 +
# Create Round Table Head configuration file. Here is an example:
 +
# <source>
 +
[RoundTable]
 +
RemoteClient=http://10.20.0.41:8008
 +
RemoteClient=http://10.20.5.19:8008
 +
Resolver=https://sw.docking.org/util/smi2mol?smi=%s
 +
</source>
 +
# Now ssh into a machine you wish to run the round table head on and become root
 +
# Change your shell to bash if you havn't already
 +
#: <source>bash</source>
 +
# Create a screen
 +
#: <source>screen -S <screen_name></source>
 +
# Prepare Arthor Config Path
 +
#: <source>export ARTHOR_CONFIG="/nfs/soft2/arthor_configs/arthor-<version>/<round_table_head>.cfg"</source>
 +
# Launch java
 +
#: <source>java -jar /nfs/soft2/arthor_configs/arthor-<version>/arthor-<version>-centos7/java/arthor.jar --httpPort=<port_number></source>
  
Here is an example of the arthor.cfg file:
+
== Active Arthor Instances ==
  # Arthor generated config file
+
===Public Arthor===
  BINDIR=/opt/nextmove/arthor/arthor-2.1.2-centos7/bin
+
{| class="wikitable"
  DATADIR=/usr/local/tomcat/arthor_data
+
|-
  STAGEDIR=/usr/local/arthor_data/stage
+
! CentOS 7 Machine
  NTHREADS=64 .
+
! Port
  NODEAFFINITY=true
+
! Round Table Data Directory
  SearchAsYouDraw=true
+
! Which Arthor
  AutomaticIndex=true
+
|-
  DEPICTION=./depict/bot/svg?w=%w&h=%h&svgunits=px&smi=%s&zoom=0.8&sma=%m&smalim=1
+
| samekh
  RESOLVER=
+
| 10.20.0.41:8000
 +
| /local2/public_arthor/
 +
| Public Arthor
 +
|-
 +
| nun
 +
| 10.20.0.40:8000
 +
| /local2/public_arthor/
 +
| Public Arthor
 +
|-
 +
|}
  
'''Important parts of the arthor.cfg file'''
+
===Arthor Round Table Head===
 +
{| class="wikitable"
 +
|-
 +
! CentOS 7 Machine
 +
! Port
 +
! Round Table Data Directory
 +
! Which Arthor
 +
|-
 +
| samekh
 +
| 10.20.0.41:8080
 +
| /local2/arthor_database/
 +
| Private Arthor Round Table Head Node
 +
|-
 +
| nun
 +
| 10.20.0.40:8080
 +
| /local2/arthor_database/
 +
| Super Private Arthor Round Table Head Node
 +
|-
 +
|}
  
'''BINDIR''' is the location of the Arthor command line binaries. These are used to generate the Arthor index files and to perform searches directly on n-1-136. An example of this would be using atdbgrep for substructure search.  
+
===Arthor Round Table Nodes===
 +
{| class="wikitable"
 +
|-
 +
! CentOS 7 Machine
 +
! Port
 +
! Round Table Data Directory
 +
! Which Arthor
 +
|-
 +
| samekh
 +
| 10.20.0.41:8008
 +
| /local2/arthor_database/
 +
| Private Arthor Database Node
 +
|-
 +
| nun
 +
| 10.20.0.40:8008
 +
| /local2/arthor_database/
 +
| Super Private Arthor Database Node
 +
|-
 +
| nfs-exd
 +
| 10.20.1.113:8008
 +
| /export/exd/arthor_database/
 +
| Super Private Arthor Database Node
 +
|-
 +
| nfs-exh
 +
| 10.20.5.19:8008
 +
| /export/exh/arthor_database/
 +
| Private Arthor Database Node
 +
|-
 +
|}
  
'''DATADIR''' This is the directory where the Arthor data files live. Location where the index files will be created and loaded from.
+
===Arthor BB and CC===
 
+
{| class="wikitable"
'''STAGEDIR''' Location where the index files will be built before being moved into the DATADIR.
+
|-
 
+
! CentOS 7 Machine
'''NTHREADS''' The number of threads to use for both ATDB and ATFP searches
+
! Port
 +
! Data Directory
 +
! Which Arthor
 +
|-
 +
| epyc-A40
 +
| 10.20.200.92:8081
 +
| /local2/arthorbb
 +
| ArthorBB
 +
|-
 +
| epyc-A40
 +
| 10.20.200.92:8082
 +
| /local2/arthorcc
 +
| ArthorCC
 +
|-
 +
|}
  
Set '''AutomaticIndex''' to false if you don't want new smiles files added to the data directory to be indexed automatically
+
== Customizing Arthor Frontend To Our Needs (Arthor 3.4.7) ==
 +
'''These instructions only worked and compiled for me in the machine called epyc which is running Rocky 8 Linux operating system.'''
  
==Background==
+
Summary of changes in index.html:
Before working with Arthor, it is recommended that you familiarize yourself with the Arthor documentation. Some useful pages to look at include 3-5, 22-25 and 33-39. Of course, reading everything would be the best!
+
*Add download options
 +
*Add contact info
 +
*Advertise TLDR
 +
*Remove buttons for Similarity and Formula
  
==Checking Memory Usage==
+
Summary of changes in index.js:
Before building arthor indexes, it's always a good thing to check what percent of the memory is being used. Try to be cautious with how much memory you have left, and make sure to check while building indexes to make sure that you have enough space. To check, run the following command:
+
*Add download options
 +
*Hyperlink the results to zinc20
  
  df -h /<directory with disc>
+
Summary of changes in sketcher.js:
 +
*Input box should be updated as user draws molecule
  
==Building Large Databases==
+
Summary of changes in arthor.js:
At the moment, we are building databases of size 500M molecules by merging smile files. There are multiple methods of trying to create large databases, one being merging based off of the same H?? prefix and stopping once the database reaches > 500M molecules (or whatever upperbound you want to use). Here is some python code that simulates this merging process. Essentially the program takes all of the .smi files within an input directory, sorts them lexiographically, and begins merging these .smi files together in order until the size reaches > 500M molecules.
+
*Change default search type to be 'Substructure'
 
 
Feel free to modify it if you think a better method exists.
 
 
 
  import subprocess
 
  import sys
 
  import os                                                                                                                                                                         
 
 
 
  from os import listdir
 
  from os.path import isfile, join
 
 
 
  mypath = "<Path to directory holding .smi files>"
 
  onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
 
  onlyfiles.sort()
 
 
 
  create_fp = True
 
  cur_mols = 0
 
  lower_bound = 500000000
 
  upper_bound = 600000000
 
  files_to_merge = []
 
 
 
  def merge_files(f_t_m):
 
      arr = f_t_m[0].split(".")
 
      arr2 = f_t_m[len(f_t_m) - 1].split(".")
 
      file_name_merge = (arr[0] + "_" + arr2[0] + ".smi")
 
      print ("File being created: " + file_name_merge)
 
 
 
      for file in f_t_m:
 
        tmp = file.split(".")
 
        process = subprocess.Popen("cat " + join(mypath, file) + " >> " + file_name_merge, shell=True)
 
        process.wait()
 
 
 
  for file in onlyfiles:
 
      arr = file.split(".")
 
 
 
      if (arr[len(arr) - 1] == "smi"):
 
        print("Working with " + file)
 
        mol = sum(1 for line in open(join(mypath, file)))
 
        print(file, mol, cur_mols)
 
 
 
        if (cur_mols + mol > lower_bound):
 
            if (cur_mols + mol < upper_bound):
 
              files_to_merge.append(file)
 
              merge_files(files_to_merge)
 
              cur_mols = 0
 
              files_to_merge.clear()
 
            else:
 
              merge_files(files_to_merge)
 
              files_to_merge.clear()
 
              files_to_merge.append(file)
 
              merge_files(files_to_merge)
 
              cur_mols = 0
 
              files_to_merge.clear()
 
        else:
 
            cur_mols += mol
 
            files_to_merge.append(file)
 
 
 
  if (len(files_to_merge) != 0):
 
      merge_files(files_to_merge)
 
  
==Building Arthor Indexes==
+
Summary of changes in arthor-swagger.yaml.js:
Once you've merged the .smi files together, it's time to start building the databases themselves. To do this we use the command
+
*Input box should be updated as user draws molecule
  
  smi2atdb -j 0 -p <The .smi file> <The .atdb>
 
  
The flag "-j 0" enables parallel generation and utilizes all available processors to generate the .atdb file. The "-p" flag stores the offset position in the ATDB file. Since we're building indexes for the Web Application, you must use the "-p" flag when building indexes. Please note that the name of the .smi file should also be the name of the .atdb file. That way, the Web Application knows to use these files together and correctly display the required images. Refer to pages 33-34 in the Arthor documentation for more information.
+
=== Install Prerequisite Packages ===
 +
# Install Apache Maven
 +
#* <source>dnf install maven -y</source>
 +
# Install Node Package Manager (NPM)
 +
#* <source>dnf install npm -y</source>
 +
# In your home directory, create a new directory to hold the files for the upcoming procedures
 +
#* <source>mkdir /mnt/nfs/home/jjg/arthor_build_from_source</source>
 +
# Download these latest Arthors and store them in 'arthor_build_from_source/'. [[Arthor Documentation for Future Developer#How To Download Arthor|Here's how to download Arthor.]]
 +
#* arthor-3.4.7-source.tar.gz
 +
#* arthor-3.4.7-centos7.tar.gz
 +
# Extract contents from the tar.gz files
 +
#* <source>tar -xvf arthor-3.4.7-source.tar.gz
 +
tar -xvf arthor-3.4.7-centos7.tar.gz</source>
 +
# Install Apache Maven Arthor dependencies through this script
 +
#* <source>
 +
#!/bin/bash
  
If there are too many large .smi files and you do not want to manually build each .atdb file, you can use this python script which takes all of the .smi files in the current directory and converts them to .atdb files. Make sure to modify mypath to the directory containing the .smi files. You can change the variable "create_fp" to false if you don't want to create .atdb.fp files (refer to page 9 in the Arthor documentation).
+
export ARTHOR_DIR=/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-centos7/java
 +
export OS=linux
 +
export VERSION=3.4.7
  
  import subprocess
+
mvn install:install-file -Dfile=$ARTHOR_DIR/arthor-jni-${OS}.jar \
  import sys
+
                        -Dpackaging=jar \
  import os
+
                        -DgeneratePom=true \
 
+
                        -DartifactId=arthor-jni-${OS} \
  from os import listdir
+
                        -DgroupId=com.nextmovesoftware.arthor \
  from os.path import isfile, join
+
                        -Dversion=$VERSION
 
+
mvn install:install-file -Dfile=$ARTHOR_DIR/arthor-jni.jar \
  mypath = "<Path containing the .smi files"
+
                        -Dpackaging=jar \
  onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
+
                        -DgeneratePom=true \
 
+
                        -DartifactId=arthor-jni \
  create_fp = True
+
                        -DgroupId=com.nextmovesoftware.arthor \
 
+
                        -Dversion=$VERSION
  for file in onlyfiles:
+
</source>
      arr = file.split(".")
+
=== Customizing Index.html ===
 
+
Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
      if (arr[len(arr) - 1] == "smi"):
 
        process = subprocess.Popen("/nfs/ex9/work/xyz/psql/arthor-3.3-centos7/bin/smi2atdb -j 0 -p {0} {1}.atdb".format(join(mypath, file), arr[0]), shell=True)
 
        process.wait()
 
 
 
        print("SUCCESS! {0}.atdb file was created!".format(arr[0]))
 
 
 
        if (create_fp):
 
            process = subprocess.Popen("/nfs/ex9/work/xyz/psql/arthor-3.3-centos7/bin/atdb2fp -j 0 {0}.atdb".format(arr[0]), shell=True)
 
            process.wait()
 
     
 
            print("SUCCESS! {0}.atdb.fp file was created!".format(arr[0]))
 
  
==Search Queries==
+
==== Change download options ====
 +
# vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
 +
# Search for 'arthor_tsv_link'
 +
#* <source>?arthor_tsv_link</source>
 +
# Delete original download links
 +
#*<source>
 +
              <a id="arthor_tsv_link" href="#"> TSV</a>
 +
              <a id="arthor_csv_link" href="#"> CSV</a>
 +
              <a id="arthor_sdf_link" href="#"> SDF</a>
 +
</source>
 +
# Add new download link options
 +
#* <source>
 +
              <a id="arthor_tsv_link_100" href="#"> TSV-100</a>
 +
              <a id="arthor_tsv_link_1k" href="#"> TSV-1,000</a>
 +
              <a id="arthor_tsv_link_10k" href="#"> TSV-10,000</a>
 +
              <a id="arthor_tsv_link_100k" href="#"> TSV-100,000</a>
 +
              <a id="arthor_tsv_link_200k" href="#"> TSV-200,000</a>
 +
              <a id="arthor_tsv_link_300k" href="#"> TSV-300,000</a>
 +
              <a id="arthor_csv_link_100" href="#"> CSV-100</a>
 +
              <a id="arthor_csv_link_1k" href="#"> CSV-1,000</a>
 +
              <a id="arthor_csv_link_10k" href="#"> CSV-10,000</a>
 +
              <a id="arthor_csv_link_100k" href="#"> CSV-100,000</a>
 +
              <a id="arthor_csv_link_200k" href="#"> CSV-200,000</a>
 +
              <a id="arthor_csv_link_300k" href="#"> CSV-300,000</a>
 +
              <a id="arthor_sdf_link_100" href="#"> SDF-100</a>
 +
              <a id="arthor_sdf_link_1k" href="#"> SDF-1,000</a>
 +
              <a id="arthor_sdf_link_10k" href="#"> SDF-10,000</a>
 +
              <a id="arthor_sdf_link_100k" href="#"> SDF-100,000</a>
 +
              <a id="arthor_sdf_link_200k" href="#"> SDF-200,000</a>
 +
              <a id="arthor_sdf_link_300k" href="#"> SDF-300,000</a>
 +
</source>
  
 +
==== Add contact info and tldr ====
 +
# vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
 +
# Search for 'arthor_table_list'
 +
#* <source>?arthor_table_list</source>
 +
# Add contact info and a plug to tldr.docking.org after the div block where arthor_table_list is inside of. It should look like this
 +
#* <source>
 +
      <div class="opt-box-border">
 +
        <label>Databases</label>
 +
        <!-- This will be populated by available databases -->
 +
        <ul id="arthor_table_list">
 +
          <li class="placeholder">Please select a search type</li>
 +
        </ul>
 +
      </div>
 +
      <div class="opt-box-border">
 +
        <label>Ask Questions</label>
 +
        Email us: jjiteam@googlegroups.com
 +
      </div>
 +
      <div class="opt-box-border">
 +
        <label> To Download 100K+ Results</label>
 +
        Sign up for <a href="http://tldr.docking.org/">tldr.docking.org</a> and use arthorbatch
 +
      </div>
 +
</source>
 +
==== Remove Similarity and Formula Buttons ====
 +
# vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
 +
# Search for 'arthor_search_list'
 +
#* ?arthor_search_list
 +
# Delete and Replace the whole 'ul' element block with this
 +
#* <source>
 +
        <ul id="arthor_search_list">
 +
          <li class="first" value="Substructure" onclick="setSearchType(this)">
 +
            Substructure
 +
          </li><li value="SMARTS" onclick="setSearchType(this)" class="last">
 +
            SMARTS
 +
          </li>
 +
        </ul>
 +
</source>
  
==Uploading Indexes to the Web Application==
+
=== Customize Index.js ===
 +
Location /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/index.js
  
 +
==== Add download option logic ====
 +
# vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/index.js
 +
# Comment out these lines of code
 +
#* <source>
 +
            if (setDownloadLinks)
 +
              setDownloadLinks(hist_limit);
 +
</source>
 +
#* <source>
 +
                        let limit = arthor.config.WebApp.DefaultDownloadLimit;
 +
                        if (!limit)
 +
                          limit = 500;
 +
</source>
 +
# Search for 'setDownloadLinks(limit)', both the function call and the function call argument, and remove the argument 'limit'.
 +
#* <source>?setDownloadLinks(limit)</source>
 +
# As for the function, add all the logic for the download sizes
 +
#* <source>
 +
function setDownloadLinks() {
 +
  //100 Download Size
 +
  var limit = 100;
 +
  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_100').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_100').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_100').attr('href', base_url + '?fmt=csv&' + params);
  
==Further Arthor Optimizations==
+
  //1k Download Size
The following edits can be made to the arthor.cfg to optimize substructure search queries. More information can be found in pages 6-8 in the Arthor Documentation file.
+
  var limit = 1000;
 +
  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_1k').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_1k').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_1k').attr('href', base_url + '?fmt=csv&' + params);
 +
  //10k Download Size
 +
  var limit = 10000;
 +
  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_10k').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_10k').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_10k').attr('href', base_url + '?fmt=csv&' + params);
  
 +
  //100k Download Size
 +
  var limit = 100000;
 +
  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_100k').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_100k').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_100k').attr('href', base_url + '?fmt=csv&' + params);
  
'''NodeAffinity NUMA''': optimized flag, pin processing to specific CPU sets to where the data is located in memory. There is a small start-up cost and is most useful for long running services (see Non-Uniform Memory Access (NUMA))
+
  //200k Download Size
 +
  var limit = 200000;
 +
  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_200k').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_200k').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_200k').attr('href', base_url + '?fmt=csv&' + params);
 +
  //300k Download Size
 +
  var limit = 300000;
 +
  var params = $.param({
 +
                query: arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link_300k').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link_300k').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link_300k').attr('href', base_url + '?fmt=csv&' + params);
  
 +
/*  var params = $.param({
 +
                query:  arthor.query,
 +
                type:  arthor.type,
 +
                draw:  0,
 +
                start:  0,
 +
                length: limit,
 +
                flags:  arthor.flags
 +
              });
 +
  var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
 +
  $('#arthor_sdf_link').attr('href', base_url + '?fmt=sdf&' + params);
 +
  $('#arthor_tsv_link').attr('href', base_url + '?fmt=tsv&' + params);
 +
  $('#arthor_csv_link').attr('href', base_url + '?fmt=csv&' + params);
 +
*/
 +
}
 +
</source>
 +
# Lastly, add the zinc20 hyperlink to the Arthor results. Search for this
 +
#* <source>"<b>" + id + "</b>"</source>
 +
# Delete that whole line and replace it with this
 +
#* <source>$('<td>').append("<b><a target='_blank' href='https://zinc20.docking.org/substances/"+id+"'>" + id + "</a></b>",</source>
  
'''AsyncHitCountAllowed=true|false''' After fetching a page from a substructure or formula search the server will spin off a background process to count the total number of hits. This can be resource intensive for large databases and may not be desirable for servers under heavy load and may not even be needed.  
+
=== Customize Sketcher.js ===
 +
Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/sketcher.js
  
 +
==== Input Box Updates as User Draws ====
 +
#vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/sketcher.js
 +
#Search for this line "var smiles = event.src.smiles();"
 +
#* <source>?var smiles = event.src.smiles();</source>
 +
#Add this new line below it
 +
#* <source>$('#ar_text_input').val(smiles);</source>
  
'''AsyncHitCountMax=#''' The upper-bound for the number of hits to retrieve in background searches. If very generic queries are issued (e.g. benzene or methane) hundred’s of millions of hits may be counted. Setting this value to anything other than zero (e.g. 10,000) will stop the background search if it exceeds this limit. Note some pathological queries may find very few hits but still end up looking at everything.
+
=== Customize Arthor.js ===
 
+
Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui/src/arthor.js
 
 
'''MaxConcurrentSearches=#''' Controls the maximum number of searches that can be run concurrently by setting the database pool size. The searches may be on the same or different databases. If a search comes in and the pool is full it will have to wait for another search to finish - this increases the request time.

 
 
 
Typically if each search is using all the processing cores on a machine then additional searches will run at 1/Nth the speed. If the request time is substantially larger that the search time the request had to wait for resources to become available. When switching between a large number of databases it can be useful to have a larger pool size, the only trade off is keeping file pointers open. 
Default: 6
 
 
 
 
 
'''Binary Fingerprint Folding''' Arthor uses binary circular fingerprints (ECFP4/radius=2) for similarity. When creating an ATFP index you can specify how large to make your fingerprints. Circular fingerprints are sparser than path based fingerprints (e.g. Daylight) and so can be folded smaller without too much degradation in performance. Folding can significantly reduce the footprint size of a database and improve search speeds. A 256-bit fingerprint takes up 1/4 of the space of 1024-bit and can therefore be traversed 4x faster.
 
 
 
This is more important for very large databases with billions of compounds, in such instances a minor drop in precision is likely tolerable as ultimately all that happens is some hits may swap places in the hit list.
 
 
 
==Virtual Memory==
 
In addition to modifying the arthor.cfg file, virtual memory can also be used to make queries faster. More information can be found in pages 10-16 in the Arthor Documentation.
 
 
 
==Setting up Round Table==
 
This is a new feature in Arthor 3.0 and is currently beta (January 2020). See section 2.4 in the manual
 
As explained in the manual, "Round Table allows you to serve and split chemical searches across multiple host machines.  The implementation provides a lightweight proxy that forwards requests to other Arthor host servers that do the actual search.  Communication is done using the existing Web APIs.
 
 
 
Since Arthor requires CentOS 7, as of January 2020 we have 6 servers that are capable of running Arthor with Round Table.  See the table below for the machines currently involved in Round Table
 
{| class="wikitable"
 
|-
 
! CentOS 7 Machine
 
! Private IP
 
! Arthor Install Location
 
! Round Table Data Directory
 
|-
 
| n-1-136
 
| 10.20.10.136
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| N/A. Round Table Server
 
|-
 
| abacus
 
| 10.20.0.5
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| /export/db2/arthor_round_table_abacus
 
|-
 
| shin
 
| 10.20.0.1
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| /export/db/arthor
 
|-
 
| zayin
 
| 10.20.0.2
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| /export/exa/work/jyoung/arthor_round_table_zayin
 
|-  
 
| qof
 
| 10.20.9.29
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| /export/ex9/work/jyoung/arthor_data_qof/data
 
|-
 
| lamed
 
| 10.20.9.15
 
| /opt/nextmove/arthor/arthor-3.0-rt-beta-linux
 
| /export/ex6/work/jyoung
 
|-
 
|}
 
 
 
===Setting up Host Server===
 
If we want to add machines to the Round Table, for example 'nun' and 'samekh', we need to edit their arthor.cfg file so that when our Local Machine passes commands these secondary servers know to perform the search they are given.
 
  
  $ cat arthor.cfg
+
==== Make Substructure Default Search Type ====
  MaxThreadsPerSearch=4  
+
#vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui/src/arthor.js
  AutomaticIndex=false
+
#Search for "let DEFAULT_SEARCH_TYPE"
  DATADIR=<Directory where smiles are located>
+
#* <source>?let DEFAULT_SEARCH_TYPE</source>
 +
#Change parameter to "Substructure"
  
We then run the jar server on each of these host machines containing data on any available port.  
+
=== Customize arthor-swagger.yaml ===
 +
Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/swagger/arthor-swagger.yaml
  
For our local machine, the arthor.cfg file will look different.
+
==== Change URL Base Path for API Call ====
 +
# vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/swagger/arthor-swagger.yaml
 +
# Search for "basePath"
 +
#* <source>?basePath</source>
 +
# Remove "/arthor" and keep argument empty
  
  $ cat arthor.cfg
+
=== Compile/Minify Code through NPM ===
  [RoundTable]
+
# Install NPM packages and Minify Code
  RemoteClient=http://skynet:<port number where jar server is running>/  
+
#* <source>
  RemoteClient=http://hal:<port number where jar server is running>/
+
cd /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui
 +
npm install
 +
npx webpack-dev-server
 +
npx webpack --mode=production
 +
</source>
 +
# Build the war file
 +
#* <source>
 +
cd /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server
 +
mvn install -Pbootable
 +
</source>
 +
# If it works, then the path to new war file is at /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/target
  
Please refer to Section 2 in the RoundTable Documentation file (pages 6-8) for more useful information on configuration.
+
== Restarting Arthor Instance(s) Instructions ==
 +
# Ssh to machine with respective Arthor instance and become root
 +
# execute '''run_arthors_on_reboot.sh''' to show restart all instances on the machine
 +
#: <source>
 +
bash /root/run_arthors_on_reboot.sh
 +
</source>
 +
# execute '''start_arthor_script.sh''' to restart specific Arthor instance. It will show you options to choose from.
 +
#: <source>
 +
bash /nfs/soft2/arthor_configs/start_arthor_script.sh
 +
</source>

Latest revision as of 17:22, 3 November 2022

Introduction

Here is the link to Arthor's manual

  • Username: ucsf@nextmovesoftware.com
  • Password: <Ask jjiteam@googlegroups.com>

Arthor configurations and the frontend files are consolidated in /nfs/soft2/arthor_configs/.

/nfs/soft2/arthor_configs/start_arthor_script.sh can start/restart Arthor instances on respective machines.

Launch the script to see the options available.

How To Download Arthor

  1. Ssh to nfs-soft2 and become root. Prepare directory
     mkdir /export/soft2/arthor_configs/arthor-<version> && cd /export/soft2/arthor_configs/arthor-<version>
  2. Download Software with this link
    • Username: ucsf@nextmovesoftware.com
    • Password: <Ask jjiteam@googlegroups.com>
  3. Go to releases. Look for smallworld-java-<version>.tar.gz and copy the link address.
  4. Download using wget
     wget --user ucsf@nextmovesoftware.com --password <Ask jjiteam@googlegroups.com> <link address>
  5. Decompress the file
    •  tar -xvf <file_name>

How To Launch Arthor For The First Time

Prepare Files and Directories

  1. Ssh to nfs-exc and become root
  2. Open a port in the firewall
    firewall-cmd --permanent --add-port=<port_number>/tcp 
    firewall-cmd --reload
  3. Go to Arthor Config directory
    cd /export/soft2/arthor_configs/arthor-<latest_version>
  4. Create an Arthor config file
    vim <name_of_file>.cfg
    • Add these lines in the file. Check the manual for more options.
    DataDir=/local2/public_arthor
    MaxConcurrentSearches=6
    MaxThreadsPerSearch=8
    AutomaticIndex=false
    AsyncHitCountMax=20000
    Depiction=./depict/bot/svg?w=%w&h=%h&svgunits=px&smi=%s&zoom=0.8&sma=%m&smalim=1
    Resolver=https://sw.docking.org/util/smi2mol?smi=%s

Start Arthor Instance

  1. Now ssh into a machine you wish to run an Arthor instance on and become root
  2. Change your shell to bash if you havn't already
    bash
  3. Create a screen
    screen -S <screen_name>
  4. Prepare Arthor Config Path
    export ARTHOR_CONFIG="/nfs/soft2/arthor_configs/arthor-<version>/<name_of_config_file>.cfg"
  5. Launch java
    java -jar -Dserver.port=<port_number> /nfs/soft2/arthor_configs/arthor-<version>/arthor-server-<version>.war

Configuration Details

  • DataDir: This is the directory where the Arthor data files live. Location where the index files will be created and loaded from.
  • MaxConcurrentSearches: Controls the maximum number of searches that can be run concurrently by setting the database pool size. When switching between a large number of databases it can be useful to have a larger pool size, the only trade off is keeping file pointers open.
  • MaxThreadsPerSearch: The number of threads to use for both ATDB and ATFP searches
  • Set AutomaticIndex to false if you don't want new smiles files added to the data directory to be indexed automatically
  • AsyncHitCountMax: The upper-bound for the number of hits to retrieve in background searches.
  • Resolver: Using Smallworld API, allows input box to take in a SMILE format and automatically draw on the board.

Check Arthor manual for more configuration options

How to Build Arthor Databases

We can build Arthor Databases anywhere. Consolidate smiles into one directory so you can index them all one by one.

Just use the script located at /nfs/home/jjg/scripts/arthor_index_script.sh at the directory where you c

Here is the content of the script:

#!/bin/bash

version="3.4.2"

export ARTHOR_DIR=/nfs/soft2/arthor_configs/arthor-$version/arthor-$version-centos7/
export PATH=$ARTHOR_DIR/bin/:$PATH

target="*.smi"

for j in $target
do
        echo 'smi2atdb -j 4 -p '$j' '${j}'.atdb'
        smi2atdb -j 4 -p $j ${j}.atdb
        echo 'atdb2fp -j 4 '$j'.atdb'
	atdb2fp -j 4 ${j}.atdb
done

Command Details

smi2atdb creates the atdb files needed for Substructure searching.

  • -j is the amount of threads to use to index the smiles file
  • -p stores the position of the original file

atdb2fp makes substructure searching faster

Setting up Round Table

"Round Table allows you to serve and split chemical searches across multiple host machines. The implementation provides a lightweight proxy that forwards requests to other Arthor host servers that do the actual search. Communication is done using the existing Web APIs.

Setting up Host Server

  1. Ssh to nfs-soft2 and become root
  2. Open a port in the firewall
    firewall-cmd --permanent --add-port=<port_number>/tcp 
    firewall-cmd --reload
  3. Go to Arthor Config Directory
    cd /export/soft2/arthor_configs/arthor-<version>
  4. Create Round Table Head configuration file. Here is an example:
  5. [RoundTable]
    RemoteClient=http://10.20.0.41:8008
    RemoteClient=http://10.20.5.19:8008
    Resolver=https://sw.docking.org/util/smi2mol?smi=%s
  6. Now ssh into a machine you wish to run the round table head on and become root
  7. Change your shell to bash if you havn't already
    bash
  8. Create a screen
    screen -S <screen_name>
  9. Prepare Arthor Config Path
    export ARTHOR_CONFIG="/nfs/soft2/arthor_configs/arthor-<version>/<round_table_head>.cfg"
  10. Launch java
    java -jar /nfs/soft2/arthor_configs/arthor-<version>/arthor-<version>-centos7/java/arthor.jar --httpPort=<port_number>

Active Arthor Instances

Public Arthor

CentOS 7 Machine Port Round Table Data Directory Which Arthor
samekh 10.20.0.41:8000 /local2/public_arthor/ Public Arthor
nun 10.20.0.40:8000 /local2/public_arthor/ Public Arthor

Arthor Round Table Head

CentOS 7 Machine Port Round Table Data Directory Which Arthor
samekh 10.20.0.41:8080 /local2/arthor_database/ Private Arthor Round Table Head Node
nun 10.20.0.40:8080 /local2/arthor_database/ Super Private Arthor Round Table Head Node

Arthor Round Table Nodes

CentOS 7 Machine Port Round Table Data Directory Which Arthor
samekh 10.20.0.41:8008 /local2/arthor_database/ Private Arthor Database Node
nun 10.20.0.40:8008 /local2/arthor_database/ Super Private Arthor Database Node
nfs-exd 10.20.1.113:8008 /export/exd/arthor_database/ Super Private Arthor Database Node
nfs-exh 10.20.5.19:8008 /export/exh/arthor_database/ Private Arthor Database Node

Arthor BB and CC

CentOS 7 Machine Port Data Directory Which Arthor
epyc-A40 10.20.200.92:8081 /local2/arthorbb ArthorBB
epyc-A40 10.20.200.92:8082 /local2/arthorcc ArthorCC

Customizing Arthor Frontend To Our Needs (Arthor 3.4.7)

These instructions only worked and compiled for me in the machine called epyc which is running Rocky 8 Linux operating system.

Summary of changes in index.html:

  • Add download options
  • Add contact info
  • Advertise TLDR
  • Remove buttons for Similarity and Formula

Summary of changes in index.js:

  • Add download options
  • Hyperlink the results to zinc20

Summary of changes in sketcher.js:

  • Input box should be updated as user draws molecule

Summary of changes in arthor.js:

  • Change default search type to be 'Substructure'

Summary of changes in arthor-swagger.yaml.js:

  • Input box should be updated as user draws molecule


Install Prerequisite Packages

  1. Install Apache Maven
    • dnf install maven -y
  2. Install Node Package Manager (NPM)
    • dnf install npm -y
  3. In your home directory, create a new directory to hold the files for the upcoming procedures
    • mkdir /mnt/nfs/home/jjg/arthor_build_from_source
  4. Download these latest Arthors and store them in 'arthor_build_from_source/'. Here's how to download Arthor.
    • arthor-3.4.7-source.tar.gz
    • arthor-3.4.7-centos7.tar.gz
  5. Extract contents from the tar.gz files
    • tar -xvf arthor-3.4.7-source.tar.gz
      tar -xvf arthor-3.4.7-centos7.tar.gz
  6. Install Apache Maven Arthor dependencies through this script
    • #!/bin/bash
      
      export ARTHOR_DIR=/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-centos7/java
      export OS=linux
      export VERSION=3.4.7
      
      mvn install:install-file -Dfile=$ARTHOR_DIR/arthor-jni-${OS}.jar \
                               -Dpackaging=jar \
                               -DgeneratePom=true \
                               -DartifactId=arthor-jni-${OS} \
                               -DgroupId=com.nextmovesoftware.arthor \
                               -Dversion=$VERSION
      mvn install:install-file -Dfile=$ARTHOR_DIR/arthor-jni.jar \
                               -Dpackaging=jar \
                               -DgeneratePom=true \
                               -DartifactId=arthor-jni \
                               -DgroupId=com.nextmovesoftware.arthor \
                               -Dversion=$VERSION

Customizing Index.html

Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html

Change download options

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
  2. Search for 'arthor_tsv_link'
    • ?arthor_tsv_link
  3. Delete original download links
    •               <a id="arthor_tsv_link" href="#"> TSV</a>
                    <a id="arthor_csv_link" href="#"> CSV</a>
                    <a id="arthor_sdf_link" href="#"> SDF</a>
  4. Add new download link options
    •               <a id="arthor_tsv_link_100" href="#"> TSV-100</a>
                    <a id="arthor_tsv_link_1k" href="#"> TSV-1,000</a>
                    <a id="arthor_tsv_link_10k" href="#"> TSV-10,000</a>
                    <a id="arthor_tsv_link_100k" href="#"> TSV-100,000</a>
                    <a id="arthor_tsv_link_200k" href="#"> TSV-200,000</a>
                    <a id="arthor_tsv_link_300k" href="#"> TSV-300,000</a>
                    <a id="arthor_csv_link_100" href="#"> CSV-100</a>
                    <a id="arthor_csv_link_1k" href="#"> CSV-1,000</a>
                    <a id="arthor_csv_link_10k" href="#"> CSV-10,000</a>
                    <a id="arthor_csv_link_100k" href="#"> CSV-100,000</a>
                    <a id="arthor_csv_link_200k" href="#"> CSV-200,000</a>
                    <a id="arthor_csv_link_300k" href="#"> CSV-300,000</a>
                    <a id="arthor_sdf_link_100" href="#"> SDF-100</a>
                    <a id="arthor_sdf_link_1k" href="#"> SDF-1,000</a>
                    <a id="arthor_sdf_link_10k" href="#"> SDF-10,000</a>
                    <a id="arthor_sdf_link_100k" href="#"> SDF-100,000</a>
                    <a id="arthor_sdf_link_200k" href="#"> SDF-200,000</a>
                    <a id="arthor_sdf_link_300k" href="#"> SDF-300,000</a>

Add contact info and tldr

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
  2. Search for 'arthor_table_list'
    • ?arthor_table_list
  3. Add contact info and a plug to tldr.docking.org after the div block where arthor_table_list is inside of. It should look like this
    •       <div class="opt-box-border">
              <label>Databases</label>
              <!-- This will be populated by available databases -->
              <ul id="arthor_table_list">
                <li class="placeholder">Please select a search type</li>
              </ul>
            </div>
            <div class="opt-box-border">
              <label>Ask Questions</label>
              Email us: jjiteam@googlegroups.com
            </div>
            <div class="opt-box-border">
              <label> To Download 100K+ Results</label>
              Sign up for <a href="http://tldr.docking.org/">tldr.docking.org</a> and use arthorbatch
            </div>

Remove Similarity and Formula Buttons

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/index.html
  2. Search for 'arthor_search_list'
    • ?arthor_search_list
  3. Delete and Replace the whole 'ul' element block with this
    •         <ul id="arthor_search_list">
                <li class="first" value="Substructure" onclick="setSearchType(this)">
                  Substructure
                </li><li value="SMARTS" onclick="setSearchType(this)" class="last">
                  SMARTS
                </li>
              </ul>

Customize Index.js

Location /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/index.js

Add download option logic

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/index.js
  2. Comment out these lines of code
    •              if (setDownloadLinks)
                     setDownloadLinks(hist_limit);
    •                          let limit = arthor.config.WebApp.DefaultDownloadLimit;
                               if (!limit)
                                 limit = 500;
  3. Search for 'setDownloadLinks(limit)', both the function call and the function call argument, and remove the argument 'limit'.
    • ?setDownloadLinks(limit)
  4. As for the function, add all the logic for the download sizes
    • function setDownloadLinks() {
        //100 Download Size
        var limit = 100;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_100').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_100').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_100').attr('href', base_url + '?fmt=csv&' + params);
      
        //1k Download Size
        var limit = 1000;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_1k').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_1k').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_1k').attr('href', base_url + '?fmt=csv&' + params);
        //10k Download Size
        var limit = 10000;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_10k').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_10k').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_10k').attr('href', base_url + '?fmt=csv&' + params);
      
        //100k Download Size
        var limit = 100000;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_100k').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_100k').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_100k').attr('href', base_url + '?fmt=csv&' + params);
      
        //200k Download Size
        var limit = 200000;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_200k').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_200k').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_200k').attr('href', base_url + '?fmt=csv&' + params);
        //300k Download Size
        var limit = 300000;
        var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link_300k').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link_300k').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link_300k').attr('href', base_url + '?fmt=csv&' + params);
      
      /*  var params = $.param({
                      query:  arthor.query,
                      type:   arthor.type,
                      draw:   0,
                      start:  0,
                      length: limit,
                      flags:  arthor.flags
                     });
        var base_url = arthor.url + '/dt/' + normTableNames(arthor.table) + '/search';
        $('#arthor_sdf_link').attr('href', base_url + '?fmt=sdf&' + params);
        $('#arthor_tsv_link').attr('href', base_url + '?fmt=tsv&' + params);
        $('#arthor_csv_link').attr('href', base_url + '?fmt=csv&' + params);
      */
      }
  5. Lastly, add the zinc20 hyperlink to the Arthor results. Search for this
    • "<b>" + id + "</b>"
  6. Delete that whole line and replace it with this
    • $('<td>').append("<b><a target='_blank' href='https://zinc20.docking.org/substances/"+id+"'>" + id + "</a></b>",

Customize Sketcher.js

Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/sketcher.js

Input Box Updates as User Draws

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server-ui/src/sketcher.js
  2. Search for this line "var smiles = event.src.smiles();"
    • ?var smiles = event.src.smiles();
  3. Add this new line below it
    • $('#ar_text_input').val(smiles);

Customize Arthor.js

Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui/src/arthor.js

Make Substructure Default Search Type

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui/src/arthor.js
  2. Search for "let DEFAULT_SEARCH_TYPE"
    • ?let DEFAULT_SEARCH_TYPE
  3. Change parameter to "Substructure"

Customize arthor-swagger.yaml

Location: /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/swagger/arthor-swagger.yaml

Change URL Base Path for API Call

  1. vim /mnt/nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server/src/main/webapp/WEB-INF/static/swagger/arthor-swagger.yaml
  2. Search for "basePath"
    • ?basePath
  3. Remove "/arthor" and keep argument empty

Compile/Minify Code through NPM

  1. Install NPM packages and Minify Code
    • cd /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server-ui
      npm install
      npx webpack-dev-server
      npx webpack --mode=production
  2. Build the war file
    • cd /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7/arthor-3.4.7-source/server
      mvn install -Pbootable
  3. If it works, then the path to new war file is at /nfs/home/jjg/arthor_build_from_source/arthor-3.4.7-source/server/target

Restarting Arthor Instance(s) Instructions

  1. Ssh to machine with respective Arthor instance and become root
  2. execute run_arthors_on_reboot.sh to show restart all instances on the machine
    bash /root/run_arthors_on_reboot.sh
  3. execute start_arthor_script.sh to restart specific Arthor instance. It will show you options to choose from.
    bash /nfs/soft2/arthor_configs/start_arthor_script.sh