#!/bin/sh
#
# gaddwicc - Bourne shell script for running GA-based Druglike Database program
#
# Michael A. Kappler
# 25 Jan 2002
#
# Usage: gadd.sh [ -clean [ -name <database> ] ] [ GADD options ]
#    Options:
#        -clean                  destroy previous Thor database only
#        -name <base>     set CFRAG, FRAG, and database basename
#
#    All other options are passed to the GADD program.
#    See gadd.c for details on its options.
#
# Execute 'GoMedchem00' to make SMILES for input into GADD
# Execute 'GoCombiChem' after 'GoMedchem00' to make SMILES for input into GADD
#    with combinatorial chemistry options (-combichem, -exhaustive)

# Usage
if [ "_$1" = '_-help' ]; then
    printf "Usage: $0 [ -clean ] [ -name <database> ] [ -align ] [ GADD options ]\n"
    printf "Options:\n"
    printf "\t-clean \t\tdestroy previous Thor database only\n"
    printf "\t-name <base> \tset CFRAG, FRAG, and database basename\n"
    printf "\nAll other options are passed to the GADD program.\n"
    printf "See gadd.c for details on its options.\n"
    exit 0
fi

# PATH to Thor database
# database name
# database password
# machine name
# user name
# password

DY_THORDB=/usr/local/daylight/thordb
DB=gadd_demo
DB_PW=
HOST=localhost
USER=thor
USER_PW=

# use -clean to destory previous Thor database only
if [ "_$1" = '_-clean' ]; then
  CLEAN=y;
  shift
fi
# use -name to override default database
if [ "_$1" = '_-name' ]; then
  shift
  if [ $# -ne 0 ]; then
    DB=$1
    shift
  else
      printf "$0: missing argument to $1\n"
    fi
fi
# use -align to orientate structures that have the same core
if [ "_$1" = '_-align' ]; then
  ALIGN=y;
  shift
fi

# check arguments for GADD -combichem option
ARGS="$*"
while [ $# -ne 0 ]
do
  if [ $1 = '-combichem' ]; then
    COMBICHEM=y
  elif [ $1 = '-silent' ]; then
    SILENT=y
  fi
  shift
done

run_command() {
  if [ "_$SILENT" = '_' ]; then
    echo $1
    $1
  else
    $1 > /dev/null 2>1
  fi
}

# Thor server
# Merlin server
# datatypes
TSERVER=thor
MSERVER=merlin
DBDATATYPES="$DB"_datatypes

# release previous pool from Merlin
DB_EXISTS=`merlinls -MERLIN_IPC_SERVICE $MSERVER | grep $DB`
if [ "_$DB_EXISTS" != '_' ]; then
  OPTS='-LOAD_POOL RELEASE'
  DBSPEC="$DB%$DB_PW@$HOST:$MSERVER:$USER%$USER_PW"
  CMD="merlinload $OPTS $DBSPEC"
  run_command "$CMD"
fi

# destroy previous Thor database
DB_EXISTS=`thorls -THOR_IPC_SERVICE $TSERVER | grep $DB`
if [ "_$DB_EXISTS" != '_' ]; then
  OPTS='-ARE_YOU_SURE DONTASK'
  # database
  DBSPEC="$DY_THORDB/$DB%$DB_PW@$HOST:$TSERVER:$USER%$USER_PW"
  CMD="thordestroy $OPTS $DBSPEC"
  run_command "$CMD"
  # datatypes
  DBSPEC="$DY_THORDB/$DBDATATYPES%@$HOST:$TSERVER:$USER%$USER_PW"
  CMD="thordestroy $OPTS $DBSPEC"
  run_command "$CMD"
elif [ "_$CLEAN"  = '_y' ]; then
    printf "Thor database $DB doesn't exist\n"
fi

if [ "_$CLEAN" != '_' ]; then
    exit 0
fi

# GADD parameters
DBSPEC="$DB%$DB_PW@$HOST:$TSERVER:$USER%$USER_PW"
OPTDB="-db $DBSPEC"
OPTS=
if [ "_$COMBICHEM" != '_' ]; then
  CFRAGS="$DB.cores"
  FRAGS="$DB.rgroups"
else
  CFRAGS="$DB.cfrags"
  FRAGS="$DB.frags"
fi
DATA="-cfrags $CFRAGS -frags $FRAGS"

# run GADD
CMD="gadd $OPTDB $OPTS $DATA $ARGS"
run_command "$CMD"
# get return value
GADD=$?

# generate aligned 2D coordinates
if [ "_$ALIGN" != '_' ]; then
    NULL=/dev/null
    SMI2MOL='smi2mol'
    MOLALIGN='molalign'
    MOL2SMI='mol2smi -output_format TDT -dont_quote_ditem'
    CORES=`cat $CFRAGS | awk '{ print $1 }' | sed s/'\*'/X/g`
    for CORE in $CORES
    do
	CORESMI=`echo $CORE | sed -e s/=X//g -e s/X=//g -e s/#X//g -e s/X#//g -e s/'\[1X\]'//g -e s/'\[2X\]'//g -e s/'\[3X\]'//g -e s/'\[4X\]'//g -e s/X//g -e s/'()'//g`
	CORE=`echo $CORE | sed s/X/'\*'/g`
	CMD="echo \"\\\$CORE<$CORE>|\" | thorlookup -INPUT_FORMAT TDT -OUTPUT_FORMAT SMI -RETRIEVE_ALL TRUE $DBSPEC | cut -d' ' -f1 | $SMI2MOL 2>$NULL | $MOLALIGN -s \"$CORESMI\" 2>$NULL | $MOL2SMI 2>$NULL | tdtcat -TDT_OUTPUT_FORMAT DUMP | thorload $DBSPEC"
	if [ "_$SILENT" = '_' ]; then
	    echo "$CMD"
	fi
	echo "\$CORE<$CORE>|" | thorlookup -INPUT_FORMAT TDT -OUTPUT_FORMAT SMI -RETRIEVE_ALL TRUE $DBSPEC | cut -d' ' -f1 | $SMI2MOL 2>$NULL | $MOLALIGN -s \"$CORESMI\" 2>$NULL | $MOL2SMI 2>$NULL | tdtcat -TDT_OUTPUT_FORMAT DUMP | thorload $DBSPEC
    done
fi

# view results if molecule were created
if [ $GADD -eq 0 ]; then
  # count TDTs
  CMD="thorlist $DB%$DB_PW@$HOST:$TSERVER:$USER%$USER_PW | tdtcount | cut -d' ' -f5"
  if [ "_$SILENT" = '_' ]; then
    echo $CMD
  fi
  TDTs=`thorlist $DB%$DB_PW@$HOST:$TSERVER:$USER%$USER_PW | tdtcat -TDT_OUTPUT_FORMAT DUMP | grep -v SMIG | tdtcount | cut -d' ' -f5`
  if [ $TDTs -le 1 ]; then
    # view with Thor
    CMD="thorlist $DB%$DB_PW@$HOST:$TSERVER:$USER%$USER_PW"
    run_command "$CMD"
  else
    # view with Merlin
    CMD="merlinload $DB%$DB_PW@$HOST:$MSERVER:$USER%$USER_PW"
    run_command "$CMD"
    OPTS="-MERLIN_COLS_MAXINIT 8 -MERLIN_DEPICT_2D_SMILES TRUE -MERLIN_VERBOSE_MESSAGES FALSE"
    # run_command "$CMD"
    CMD="xvmerlin $OPTS $DB%$DB_PW@$HOST:$MSERVER:$USER%$USER_PW -MERLIN_INIT_COLS '\$SMI CP HBA HBD ROT MOLWT HEAVY CHARGE'"
    if [ "_$SILENT" = '_' ]; then
	echo $CMD
    fi
    xvmerlin $OPTS $DB%$DB_PW@$HOST:$MSERVER:$USER%$USER_PW -MERLIN_INIT_COLS '$SMI CP HBA HBD ROT MOLWT HEAVY CHARGE'
  fi
fi
