From 8140043fefd2101326b3e651e3b7e2d4ac806b99 Mon Sep 17 00:00:00 2001 From: pvtroshin Date: Tue, 21 Jun 2011 14:14:44 +0000 Subject: [PATCH] removing tcoffee to update git-svn-id: link to svn.lifesci.dundee.ac.uk/svn/barton/ptroshin/JABA2@4297 e3abac25-378b-4346-85de-24260fe3988d --- binaries/src/tcoffee/README | 50 - binaries/src/tcoffee/install | 1568 -- binaries/src/tcoffee/license.txt | 348 - .../t_coffee_source/CUSTOM_evaluate_for_struc.c | 460 - binaries/src/tcoffee/t_coffee_source/TMalign.f | 2554 --- binaries/src/tcoffee/t_coffee_source/aln_compare.c | 1223 -- .../tcoffee/t_coffee_source/aln_convertion_util.c |17537 -------------------- .../src/tcoffee/t_coffee_source/define_header.h | 702 - binaries/src/tcoffee/t_coffee_source/dev1.c | 133 - .../src/tcoffee/t_coffee_source/dev1_lib_header.h | 31 - binaries/src/tcoffee/t_coffee_source/dev2.c | 43 - .../src/tcoffee/t_coffee_source/dev2_lib_header.h | 30 - binaries/src/tcoffee/t_coffee_source/dev3.c | 42 - .../src/tcoffee/t_coffee_source/dev3_lib_header.h | 30 - binaries/src/tcoffee/t_coffee_source/dev4.c | 42 - .../src/tcoffee/t_coffee_source/dev4_lib_header.h | 30 - .../src/tcoffee/t_coffee_source/dp_lib_header.h | 839 - binaries/src/tcoffee/t_coffee_source/evaluate.c | 5053 ------ .../tcoffee/t_coffee_source/evaluate_dirichlet.c | 599 - .../tcoffee/t_coffee_source/evaluate_for_domain.c | 311 - .../tcoffee/t_coffee_source/evaluate_for_struc.c | 2674 --- .../src/tcoffee/t_coffee_source/fast_tree_header.h | 112 - binaries/src/tcoffee/t_coffee_source/fastal.c | 2235 --- .../tcoffee/t_coffee_source/fastal_lib_header.h | 213 - binaries/src/tcoffee/t_coffee_source/fsa_dp.c | 2541 --- binaries/src/tcoffee/t_coffee_source/header_list | 13 - binaries/src/tcoffee/t_coffee_source/hsearch.c | 290 - binaries/src/tcoffee/t_coffee_source/io_func.c | 1492 -- .../src/tcoffee/t_coffee_source/io_lib_header.h | 1095 -- binaries/src/tcoffee/t_coffee_source/makefile | 11 - binaries/src/tcoffee/t_coffee_source/matrices.h | 960 -- binaries/src/tcoffee/t_coffee_source/parttree.c | 1040 -- binaries/src/tcoffee/t_coffee_source/pavie_dp.c | 1411 -- .../t_coffee_source/pb_util_read_seq_util.c | 374 - .../t_coffee_source/pb_util_read_sequence.c | 562 - .../src/tcoffee/t_coffee_source/perl_header_lib.h | 5955 ------- binaries/src/tcoffee/t_coffee_source/random.c | 94 - binaries/src/tcoffee/t_coffee_source/reformat.c |11819 ------------- .../src/tcoffee/t_coffee_source/reformat_struc.c | 1093 -- binaries/src/tcoffee/t_coffee_source/showpair.c | 560 - binaries/src/tcoffee/t_coffee_source/source_list | 50 - binaries/src/tcoffee/t_coffee_source/t_coffee | Bin 1729699 -> 0 bytes binaries/src/tcoffee/t_coffee_source/t_coffee.c | 5321 ------ binaries/src/tcoffee/t_coffee_source/t_coffee.h | 31 - binaries/src/tcoffee/t_coffee_source/tree_util.c | 5231 ------ binaries/src/tcoffee/t_coffee_source/util.c | 7986 --------- .../src/tcoffee/t_coffee_source/util_aln_analyze.c | 6379 ------- .../util_analyse_constraints_list.c | 115 - .../t_coffee_source/util_constraints_list.c | 6739 -------- .../src/tcoffee/t_coffee_source/util_declare.c | 1832 -- .../t_coffee_source/util_domain_constraints_list.c | 399 - .../src/tcoffee/t_coffee_source/util_domain_dp.c | 569 - .../t_coffee_source/util_domain_dp_drivers.c | 681 - .../t_coffee_source/util_dp_cdna_fasta_nw.c | 974 -- .../tcoffee/t_coffee_source/util_dp_clean_maln.c | 384 - .../src/tcoffee/t_coffee_source/util_dp_drivers.c | 4749 ------ binaries/src/tcoffee/t_coffee_source/util_dp_est.c | 89 - .../src/tcoffee/t_coffee_source/util_dp_fasta_nw.c | 1840 -- .../src/tcoffee/t_coffee_source/util_dp_fasta_sw.c | 64 - .../t_coffee_source/util_dp_generic_fasta_nw.c | 378 - .../src/tcoffee/t_coffee_source/util_dp_gotoh_nw.c | 3059 ---- .../src/tcoffee/t_coffee_source/util_dp_gotoh_sw.c | 585 - .../src/tcoffee/t_coffee_source/util_dp_mm_nw.c | 397 - binaries/src/tcoffee/t_coffee_source/util_dp_sim.c | 1163 -- .../tcoffee/t_coffee_source/util_dp_ssec_pwaln.c | 476 - .../t_coffee_source/util_dp_suboptimal_nw.c | 1655 -- binaries/src/tcoffee/t_coffee_source/util_dps.c | 44 - .../src/tcoffee/t_coffee_source/util_graph_maln.c | 570 - .../tcoffee/t_coffee_source/util_job_handling.c | 319 - .../src/tcoffee/t_coffee_source/util_lib_header.h | 2677 --- .../src/tcoffee/t_coffee_source/util_make_tree.c | 1472 -- binaries/src/tcoffee/tclinkdb.txt | 290 - 72 files changed, 122687 deletions(-) delete mode 100644 binaries/src/tcoffee/README delete mode 100644 binaries/src/tcoffee/install delete mode 100644 binaries/src/tcoffee/license.txt delete mode 100644 binaries/src/tcoffee/t_coffee_source/CUSTOM_evaluate_for_struc.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/TMalign.f delete mode 100644 binaries/src/tcoffee/t_coffee_source/aln_compare.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/aln_convertion_util.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/define_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev1.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev1_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev2.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev2_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev3.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev3_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev4.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/dev4_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/dp_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/evaluate.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/evaluate_dirichlet.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/evaluate_for_domain.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/evaluate_for_struc.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/fast_tree_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/fastal.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/fastal_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/fsa_dp.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/header_list delete mode 100644 binaries/src/tcoffee/t_coffee_source/hsearch.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/io_func.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/io_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/makefile delete mode 100644 binaries/src/tcoffee/t_coffee_source/matrices.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/parttree.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/pavie_dp.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/pb_util_read_seq_util.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/pb_util_read_sequence.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/perl_header_lib.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/random.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/reformat.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/reformat_struc.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/showpair.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/source_list delete mode 100644 binaries/src/tcoffee/t_coffee_source/t_coffee delete mode 100644 binaries/src/tcoffee/t_coffee_source/t_coffee.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/t_coffee.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/tree_util.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_aln_analyze.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_analyse_constraints_list.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_constraints_list.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_declare.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_domain_constraints_list.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_domain_dp.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_domain_dp_drivers.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_cdna_fasta_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_clean_maln.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_drivers.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_est.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_fasta_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_fasta_sw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_generic_fasta_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_gotoh_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_gotoh_sw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_mm_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_sim.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_ssec_pwaln.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dp_suboptimal_nw.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_dps.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_graph_maln.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_job_handling.c delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_lib_header.h delete mode 100644 binaries/src/tcoffee/t_coffee_source/util_make_tree.c delete mode 100644 binaries/src/tcoffee/tclinkdb.txt diff --git a/binaries/src/tcoffee/README b/binaries/src/tcoffee/README deleted file mode 100644 index e042d9a..0000000 --- a/binaries/src/tcoffee/README +++ /dev/null @@ -1,50 +0,0 @@ -README for T-Coffee installation version 6.70 and higer - -UNIX/LINUX/Mac OSX - -T-Coffee requires gcc, g77, makefile, CPAN, an internet connection and your root password - - - 1. Download and save the Package - 2. gunzip t_coffee.tar.gz - 3. tar -xvf t_coffee.tar - 4. cd T-COFFEE_distribution_Version_X.XX - 5. ./install - -This installation procedure is semi-interactive. It will prompt questions here and there. You can interrupt it any time and resume it later. - - -The install procedure carries out three distinct tasks: Compilation of T-Coffee (C program), Compilation and Installation of SOAP::Lite (Perl Module), Download/Compilation and Installation of all the T-Coffee companion packages required for all possible T-Coffee flavors (tcoffee,expresso,3dcoffee,mcoffee,rcoffee). Except for T-Coffee, the installer will only install the packages that are NOT already on your computer. If you want a lighter or more specific installation, you can try any of the following: - - - 1. ./install tcoffee - 2. ./install rcoffee - 3. ./install expresso - 4. ./install 3dcoffee - 5. ./install 3dcoffee - - -While Installing SOAP::Lite, CPAN will ask you many questions: say Yes to all or type return to keep the default values. If everything went well, the procedure has created in the bin directory two executables: t_coffee and TMalign (Make sure these executables are on your $PATH!). - - -If you have not managed to install SOAP::Lite, you can re-install it anytime (from anywhere) using steps 1-2 - -If you cannot log as root, or if for some reason this procedure does not work, see with your system manager and/or go directly to the CPAN repository of SOAP::Lite. You will still be able to use the most basic functions of T-Coffee. - - - -IMPORTANT: The purpose of SOAP::Lite is to allow T-Coffee the use of the EBI webservices such as webblast. BLAST brings many functionalities to T-Coffee and if you cannot install SOAP we suggest you go to the Installing BLAST for T-Coffee section of the Technical Doumentation (in the Installation section). There you will find alternative ways of using BLAST without SOAP. It is also in this document that you will find all the information required for a full installation of T-Coffee - -Microsoft Windows/Cygwin - -Install Cygwin - - * Download The Installer (NOT Cygwin/X) - * Click on view to list ALL the packages - * Select: gcc-core, make, wget - * Optional: ssh, xemacs, nano - * Run mkpasswd in Cywin (as requested when you start cygwin) - -Install T-Coffee within Cygwin using the Unix procedure (see above) - - diff --git a/binaries/src/tcoffee/install b/binaries/src/tcoffee/install deleted file mode 100644 index 8c7bb60..0000000 --- a/binaries/src/tcoffee/install +++ /dev/null @@ -1,1568 +0,0 @@ -#!/usr/bin/env perl -#Version 2.01 (25/02/03) -use Cwd; -use File::Path; -use FileHandle; -use strict; - - -our (%MODE, %PG, %ENV_SET, %SUPPORTED_OS); - - -our $EXIT_SUCCESS=0; -our $EXIT_FAILURE=1; -our $INTERNET=0; - -#our $CP="cp -d "; -our $CP="cp "; #was causing a crash on MacOSX -our $SILENT=">/dev/null 2>/dev/null"; -our $WEB_BASE="http://www.tcoffee.org"; -our $TCLINKDB_ADDRESS="$WEB_BASE/Resources/tclinkdb.txt"; -our $OS=get_os(); -our $ROOT=&get_root(); -our $CD=cwd(); -our $CDIR=$CD; -our $HOME=$ENV{'HOME'}; -########### DEFINITIONS ############################## -# -# -our $CXX="g++"; -our $CXXFLAGS=""; - -our $CPP="g++"; -our $CPPFLAGS=""; - -our $CC="gcc"; -our $CFLAGS=""; - -our $FC="f77"; -our $FFLAGS=""; - -my $install="all"; -my $default_update_action="no_update"; -######################################################## -my @required_applications=("wget_OR_curl"); -########### Mode Definitions ############################## -# -# -my @smode=("all", "clean", "install"); - -######################################################## -&initialize_PG(); - -#Parse The Command Line -my $cl=join( " ", @ARGV); -if ($#ARGV==-1 || ($cl=~/-h/) ||($cl=~/-H/) ) - { - print "\n!!!!!!! ./install t_coffee --> installs t_coffee only"; - print "\n!!!!!!! ./install all --> installs all the modes [mcoffee, expresso, psicoffee,rcoffee..]"; - print "\n!!!!!!! ./install [mcoffee|rcoffee|..] --> installs the specified mode"; - print "\n!!!!!!! ./install -h --> print usage\n\n"; - if ( $#ARGV==-1){exit ($EXIT_FAILURE);} - } - -if (($cl=~/-h/) ||($cl=~/-H/) ) - { - my $m; - print "\n\n!!!!!!! advanced mode\n"; - foreach $m ((keys (%MODE)),@smode) - { - print "!!!!!!! ./install $m\n"; - } - - print "!!!!!!! ./install [target:package|mode|] [-update|-force|-exec=dir|-dis=dir|-root|-tclinkdb=file|-] [CC=|FCC=|CXX=|CFLAGS=|CXXFLAGS=]\n"; - print "!!!!!!! ./install clean [removes all executables]\n"; - print "!!!!!!! ./install [optional:target] -update [updates package already installed]\n"; - print "!!!!!!! ./install [optional:target] -force [Forces recompilation over everything]\n"; - - print "!!!!!!! ./install [optional:target] -root [You are running as root]\n"; - print "!!!!!!! ./install [optional:target] -exec=/foo/bar/ [address for the T-Coffee executable]\n"; - print "!!!!!!! ./install [optional:target] -dis=/foo/bar/ [Address where distributions should be stored]\n"; - print "!!!!!!! ./install [optional:target] -tclinkdb=foo|update [file containing all the packages to be installed]\n"; - print "!!!!!!! ./install [optional:target] -tclinkdb=foo|update [file containing all the packages to be installed]\n"; - print "!!!!!!! ./install [optional:target] -clean [clean everything]\n"; - print "!!!!!!! ./install [optional:target] -plugins [plugins directory]\n"; - print "!!!!!!! mode:"; - foreach $m (keys(%MODE)){print "$m ";} - print "\n"; - print "!!!!!!! Packages:"; - foreach $m (keys (%PG)){print "$m ";} - print "\n"; - - print "\n\n"; - exit ($EXIT_FAILURE); - } - - - -# parse compiler flags -my (@argl)=($cl=~/(\S+=[^=]+)\s\w+=/g); -push (@argl, ($cl=~/(\S+=[^=]+\S)\s*$/g)); - -foreach $a (@argl) - { - if ( ($cl=~/CXX=(.*)/)){$CXX=$1;} - if ( ($cl=~/-CC=(.*)/ )){$CC=$1;} - if ( ($cl=~/-FC=(.*)/ )){$FC=$1;} - if ( ($cl=~/-CFLAGS=(.*)/)){$CFLAGS=$1;} - if ( ($cl=~/-CXXFLAGS=(.*)/)){$CXXFLAGS=$1;} - } -#parse install flags -our ($ROOT_INSTALL, $NO_QUESTION, $default_update_action,$BINARIES_ONLY,$force, $default_update_action, $INSTALL_DIR, $PLUGINS_DIR, $DISTRIBUTIONS,$tclinkdb, $proxy, $clean); -if ( ($cl=~/-root/)){$ROOT_INSTALL=1;} -if ( ($cl=~/-no_question/)){$NO_QUESTION=1;} -if ( ($cl=~/-update/)){$default_update_action="update";} -if ( ($cl=~/-binaries/)){$BINARIES_ONLY=1;} -if ( ($cl=~/-force/)){$force=1;$default_update_action="update"} -if ( ($cl=~/-exec=\s*(\S+)/)){$INSTALL_DIR=$1;} -if ( ($cl=~/-plugins=\s*(\S+)/)){$PLUGINS_DIR=$1;} -if ( ($cl=~/-dis=\s*(\S+)/)){$DISTRIBUTIONS=$1;} - -if ( ($cl=~/-tclinkdb=\s*(\S+)/)){$tclinkdb=$1;} -if ( ($cl=~/-proxy=\s*(\S+)/)){$proxy=$1;} -if ( ($cl=~/-clean/)){$clean=1;} -#automated update -if ($tclinkdb){&update_tclinkdb ($tclinkdb);} - -#Prepare the T-Coffee directory structure -our $TCDIR=$ENV{DIR_4_TCOFFEE}; -our $TCCACHE=$ENV{CACHE_4_TCOFFEE}; -our $TCTMP=$ENV{CACHE_4_TCOFFEE}; -our $TCM=$ENV{MCOFFEE_4_TCOFFEE}; -our $TCMETHODS=$ENV{METHODS_4_TCOFFEE}; -our $TCPLUGINS=$ENV{PLUGINS_4_TCOFFEE}; -our $PLUGINS_DIR=""; -our $INSTALL_DIR=""; - -&add_dir ($TCDIR="$HOME/.t_coffee"); -&add_dir ($TCCACHE="$TCDIR/cache"); -&add_dir ($TCTMP="$CDIR/tmp"); -&add_dir ($TCM="$TCDIR/mcoffee"); -&add_dir ($TCMETHODS="$TCDIR/methods"); -&add_dir ($TCPLUGINS="$TCDIR/plugins/$OS"); - -#Prepare the Installation Structure - -our $BASE="$CD/bin"; -our $BIN="$BASE/binaries/$OS"; -our $DOWNLOAD_DIR="$BASE/download"; -our $DOWNLOAD_FILE="$DOWNLOAD_DIR/files"; -our $TMP="$BASE/tmp"; - -&add_dir($BASE); -&add_dir($BIN); -&add_dir($DOWNLOAD_DIR); -&add_dir($DOWNLOAD_FILE); -if (!$DISTRIBUTIONS){$DISTRIBUTIONS="$DOWNLOAD_DIR/distributions";} -&add_dir ($DISTRIBUTIONS); -&add_dir ($TMP); - - -#set the directory for the plugins -if (!$PLUGINS_DIR && !$ROOT_INSTALL){$PLUGINS_DIR=$TCPLUGINS;} -elsif (!$PLUGINS_DIR && $ROOT_INSTALL){$PLUGINS_DIR="/usr/local/bin/";} - -#set the directory for t_coffee -if (!$INSTALL_DIR && !$ROOT_INSTALL){$INSTALL_DIR="$HOME/bin/";mkpath ($INSTALL_DIR);} -elsif (!$INSTALL_DIR && $ROOT_INSTALL){$INSTALL_DIR="/usr/local/bin/";} - -#prepare mcoffee files [Only if vanilla installation] -if (-d "mcoffee"){`cp mcoffee/* $TCM`;} - - -#prepare the environement -our $ENV_FILE="$TCDIR/t_coffee_env"; -&env_file2putenv ($ENV_FILE); -&set_proxy($proxy); -my ($target, $p, $r); -$target=$p; - -foreach $p ( ((keys (%PG)),(keys(%MODE)),(@smode)) ) - { - if ($ARGV[0] eq $p && $target eq ""){$target=$p;} - } -if ($target eq ""){exit ($EXIT_FAILURE);} - - -# Check the basic requirements are met -foreach $r (@required_applications) - { - my @app_list; - my $i; - $i=0; - - @app_list=split (/_OR_/, $r); - foreach my $pg (@app_list) - { - $i+=&pg_is_installed ($pg); - } - if ($i==0) - { - print "One of the following packages must be installed to proceed: "; - foreach my $pg (@app_list) - { - print ("$pg "); - } - die; - } - } - - -# Set the mains paths and create directories -# distrib_dir/install/bin -# distrib_dir/install/Downloads -# distrib_dir/install/Downloads/Files -# distrib_dir/install/Downloads/Distributions -# distrib_dir/tmp - -#Directory structure of the installation WITHIN the distribution dir - - - -#sign the license -&sign_license_ni(); - - -#Configure the copilers and their optins -$PG{C}{compiler}=get_C_compiler($CC); -$PG{Fortran}{compiler}=get_F_compiler($FC); -$PG{CXX}{compiler}=$PG{CPP}{compiler}=$PG{GPP}{compiler}=get_CXX_compiler($CXX); -if ($CXXFLAGS){$PG{CPP}{options}=$PG{GPP}{options}=$PG{CXX}{options}=$CXXFLAGS;} -if ($CFLAGS){$PG{C}{options}=$CFLAGS;} -foreach my $c (keys(%PG)) - { - my $arguments; - if ($PG{$c}{compiler}) - { - $arguments="$PG{$c}{compiler_flag}=$PG{$c}{compiler} "; - if ($PG{$c}{options}) - { - $arguments.="$PG{$c}{options_flag}=$PG{$c}{options} "; - } - $PG{$c}{arguments}=$arguments; - } - } - -# select the list of packages to update -if ($PG{$target}){$PG{$target}{install}=1;} -else - { - foreach my $pg (keys(%PG)) - { - if ( $target eq "all" || ($PG{$pg}{mode}=~/$target/)) - { - $PG{$pg} {install}=1; - } - } - } - -foreach my $pg (keys(%PG)) - { - if (!$PG{$pg}{update_action}){$PG{$pg}{update_action}=$default_update_action;} - elsif ($PG{$pg}{update_action} eq "never"){$PG{$pg}{install}=0;} - if ( $force && $PG{$pg}{install}) - { - `rm $BIN/$pg $BIN/$pg.exe $SILENT`; - } - if ($PG{$pg}{update_action} eq "update" && $PG{$pg}{install}){$PG{$pg}{update}=1;} - } - -#Execute the target: install/remove all the selected components -if (($target=~/clean/)) - { - print "------- cleaning executables -----\n"; - `rm bin/* $SILENT`; - exit ($EXIT_SUCCESS); - } - -if ( !$PG{$target}){print "------- Installing T-Coffee Modes\n";} - -#1 - Installing various modes -foreach my $m (keys(%MODE)) - { - if ( $target eq "all" || $target eq $m) - { - print "\n------- The installer will now install the $m components $MODE{$m}{description}\n"; - foreach my $pg (keys(%PG)) - { - if ( $PG{$pg}{mode} =~/$m/ && $PG{$pg}{install}) - { - if ($PG{$pg}{touched}){print "------- $PG{$pg}{dname}: already processed\n";} - else {$PG{$pg}{success}=&install_pg($pg);$PG{$pg}{touched}=1;} - } - } - } - } - -#2 - Installing Various Packages -if ( $PG{$target}){print "------- Installing Individual Package\n";} -foreach my $pg (keys (%PG)) - { - - if ( $PG{$pg}{install} && !$PG{$pg}{touched}) - { - print "\n------- Install $pg\n"; - $PG{$pg}{success}=&install_pg($pg);$PG{$pg}{touched}=1; - } - } -print "------- Finishing The installation\n"; -my $final_report=&install ($INSTALL_DIR); - -print "\n"; -print "*********************************************************************\n"; -print "******** INSTALLATION SUMMARY *****************\n"; -print "*********************************************************************\n"; -print "------- SUMMARY package Installation:\n"; -foreach my $pg (keys(%PG)) - { - if ( $PG{$pg}{install}) - { - my $bin_status=($PG{$pg}{from_binary} && $PG{$pg}{success})?"[from binary]":""; - if ( $PG{$pg}{new} && !$PG{$pg}{old}) {print "*------ $PG{$pg}{dname}: installed $bin_status\n"; $PG{$pg}{status}=1;} - elsif ( $PG{$pg}{new} && $PG{$pg}{old}) {print "*------ $PG{$pg}{dname}: updated $bin_status\n" ; $PG{$pg}{status}=1;} - elsif (!$PG{$pg}{new} && $PG{$pg}{old} && !$PG{$pg}{update}){print "*------ $PG{$pg}{dname}: previous\n" ; $PG{$pg}{status}=1;} - elsif (!$PG{$pg}{new} && $PG{$pg}{old} && $PG{$pg}{update}){print "*------ $PG{$pg}{dname}: failed update (previous installation available)\n";$PG{$pg}{status}=0;} - else {print "*------ $PG{$pg}{dname}: failed installation";$PG{$pg}{status}=0;} - } - } - -if ( !$PG{$target}){print "*------ SUMMARY mode Installation:\n";} -foreach my $m (keys(%MODE)) - { - if ( $target eq "all" || $target eq $m) - { - my $succesful=1; - foreach my $pg (keys(%PG)) - { - if (($PG{$pg}{mode}=~/$m/) && $PG{$pg}{install} && $PG{$pg}{status}==0) - { - $succesful=0; - print "*!!!!!! $PG{$pg}{dname}: Missing\n"; - } - } - if ( $succesful) - { - $MODE{$m}{status}=1; - print "*------ MODE $MODE{$m}{dname} SUCCESFULY installed\n"; - } - else - { - $MODE{$m}{status}=0; - print "*!!!!!! MODE $MODE{$m}{dname} UNSUCCESFULY installed\n"; - } - } - } - -if ($clean==1 && ($BASE=~/install4tcoffee/) ){print "*------ Clean Installation Directory: $BASE\n";`rm -rf $BASE`;} -#failure if one program was not well installed -foreach my $pg (keys(%PG)){if ($PG{$pg}{install} && $PG{$pg}{status}==0){exit ($EXIT_FAILURE);}} -exit ($EXIT_SUCCESS); - -################################################################################# -# # -# # -# # -# GENERIC INSTALLATION # -# # -# # -# # -################################################################################# -sub get_CXX_compiler - { - my $c=@_[0]; - my (@clist)=("g++"); - - return get_compil ($c, @clist); - } -sub get_C_compiler - { - my $c=@_[0]; - my (@clist)=("gcc", "cc", "icc"); - - return get_compil ($c, @clist); - } - -sub get_F_compiler - { - my ($c)=@_[0]; - my @clist=("f77", "g77", "gfortran", "ifort"); - return get_compil ($c, @clist); - } - -sub get_compil - { - my ($fav,@clist)=(@_); - - #return the first compiler found installed in the system. Check first the favorite - foreach my $c ($fav,@clist) - { - if (&pg_is_installed ($c)){return $c;} - } - return ""; - } -sub exit_if_pg_not_installed - { - my (@arg)=(@_); - - foreach my $p (@arg) - { - if ( !&pg_is_installed ($p)) - { - print "!!!!!!!! The $p utility must be installed for this installation to proceed [FATAL]\n"; - die; - } - } - return 1; - } -sub set_proxy - { - my ($proxy)=(@_); - my (@list,$p); - - @list= ("HTTP_proxy", "http_proxy", "HTTP_PROXY", "ALL_proxy", "all_proxy","HTTP_proxy_4_TCOFFEE","http_proxy_4_TCOFFEE"); - - if (!$proxy) - { - foreach my $p (@list) - { - if ( ($ENV_SET{$p}) || $ENV{$p}){$proxy=$ENV{$p};} - } - } - foreach my $p(@list){$ENV{$p}=$proxy;} - } - -sub check_internet_connection - { - my $internet; - - if ( -e "x"){unlink ("x");} - if (&pg_is_installed ("wget")){`wget www.google.com -Ox >/dev/null 2>/dev/null`;} - elsif (&pg_is_installed ("curl")){`curl www.google.com -ox >/dev/null 2>/dev/null`;} - else - { - printf stderr "\nERROR: No pg for remote file fetching [wget or curl][FATAL]\n"; - exit ($EXIT_FAILURE); - } - - if ( !-e "x" || -s "x" < 10){$internet=0;} - else {$internet=1;} - if (-e "x"){unlink "x";} - return $internet; - } -sub url2file - { - my ($cmd, $file,$wget_arg, $curl_arg)=(@_); - my ($exit,$flag, $pg, $arg); - - if ($INTERNET || check_internet_connection ()){$INTERNET=1;} - else - { - print STDERR "ERROR: No Internet Connection [FATAL:install.pl]\n"; - exit ($EXIT_FAILURE); - } - - if (&pg_is_installed ("wget")){$pg="wget"; $flag="-O";$arg=$wget_arg;} - elsif (&pg_is_installed ("curl")){$pg="curl"; $flag="-o";$arg=$curl_arg;} - else - { - printf stderr "\nERROR: No pg for remote file fetching [wget or curl][FATAL]\n"; - exit ($EXIT_FAILURE); - } - - - if (-e $file){unlink($file);} - $exit=system "$pg $cmd $flag$file $arg"; - return $exit; - } - -sub pg_is_installed - { - my ($p, $dir)=(@_); - my ($r,$m); - my ($supported, $language, $compil); - - if ( $PG{$p}) - { - $language=$PG{$p}{language2}; - $compil=$PG{$language}{compiler}; - } - - if ( $compil eq "CPAN") - { - if ( system ("perl -M$p -e 1")==$EXIT_SUCCESS){return 1;} - else {return 0;} - } - elsif ($dir) - { - if (-e "$dir/$p" || -e "$dir/$p\.exe"){return 1;} - else {return 0;} - } - elsif (-e "$PLUGINS_DIR/$p" || -e "$PLUGINS_DIR/$p.exe"){return 1;} - else - { - $r=`which $p 2>/dev/null`; - if ($r eq ""){return 0;} - else {return 1;} - } - return 0; - } -sub install - { - my ($new_bin)=(@_); - my ($copied, $report); - - - if (!$ROOT_INSTALL) - { - - if (-e "$BIN/t_coffee"){`$CP $BIN/t_coffee $INSTALL_DIR`}; - `cp $BIN/* $PLUGINS_DIR`; - $copied=1; - } - else - { - $copied=&root_run ("You must be root to finalize the installation", "$CP $BIN/* $INSTALL_DIR $SILENT"); - } - - - if ( !$copied) - { - $report="*!!!!!! Installation unsuccesful. The executables have been left in $BASE/bin\n"; - } - elsif ( $copied && $ROOT) - { - $report="*------ Installation succesful. Your executables have been copied in $new_bin and are on your PATH\n"; - } - elsif ( $copied && !$ROOT) - { - $report= "*!!!!!! T-Coffee and associated packages have been copied in: $new_bin\n"; - $report.="*!!!!!! This address is NOT in your PATH sytem variable\n"; - $report.="*!!!!!! You can do so by adding the following line in your ~/.bashrc file:\n"; - $report.="*!!!!!! export PATH=$new_bin:\$PATH\n"; - } - return $report; -} - -sub sign_license_ni - { - my $F=new FileHandle; - open ($F, "license.txt"); - while (<$F>) - { - print "$_"; - } - close ($F); - - return; - } -################################################################################# -# # -# # -# # -# INDIVIDUAL MULTIPLE SEQUENCE ALIGNMNT PACKAGES INSTALLATION # -# # -# # -# # -################################################################################# - -sub install_pg - { - my ($pg)=(@_); - my ($report, $previous, $language, $compiler, $return); - - if (!$PG{$pg}{install}){return 1;} - - $previous=&pg_is_installed ($pg); - - if ($PG{$pg}{update_action} eq "no_update" && $previous) - { - $PG{$pg}{old}=1; - $PG{$pg}{new}=0; - $return=1; - } - else - { - $PG{$pg}{old}=$previous; - - if ($PG{$pg} {language2} eq "Perl"){&install_perl_package ($pg);} - elsif ($BINARIES_ONLY && &install_binary_package ($pg)){$PG{$pg}{from_binary}=1;} - elsif (&install_source_package ($pg)){;} - else - { - - if (!&supported_os($OS)) - { - print "!!!!!!!! $pg compilation failed, binary unsupported for $OS\n"; - } - elsif (!($PG{$pg}{from_binary}=&install_binary_package ($pg))) - { - print "!!!!!!!! $pg compilation and binary installation failed\n"; - } - } - $PG{$pg}{new}=$return=&pg_is_installed ($pg,$BIN); - } - - - return $return; - } -sub install_perl_package - { - my ($pg)=(@_); - my ($report, $language, $compiler); - - $language=$PG{$pg} {language2}; - $compiler=$PG{$language}{compiler}; - - if (!&pg_is_installed ($pg)) - { - if ( $OS eq "windows"){`perl -M$compiler -e 'install $pg'`;} - elsif ( $ROOT eq "sudo"){system ("sudo perl -M$compiler -e 'install $pg'");} - else {system ("su root -c perl -M$compiler -e 'install $pg'");} - } - return &pg_is_installed ($pg); - } - - - -sub install_source_package - { - my ($pg)=(@_); - my ($report, $download, $arguments, $language, $address, $name, $ext, $main_dir, $distrib); - my $wget_tmp="$TMP/wget.tmp"; - my (@fl); - if ( -e "$BIN/$pg" || -e "$BIN/$pg.exe"){return 1;} - - if ($pg eq "t_coffee") {return &install_t_coffee ($pg);} - elsif ($pg eq "TMalign"){return &install_TMalign ($pg);} - - chdir $DISTRIBUTIONS; - - $download=$PG{$pg}{source}; - - if (($download =~/tgz/)) - { - ($address,$name,$ext)=($download=~/(.+\/)([^\/]+)(\.tgz)/); - } - elsif (($download=~/tar\.gz/)) - { - ($address,$name,$ext)=($download=~/(.+\/)([^\/]+)(\.tar\.gz)/); - } - elsif (($download=~/tar/)) - { - ($address,$name,$ext)=($download=~/(.+\/)([^\/]+)(\.tar)/); - } - else - { - ($address,$name)=($download=~/(.+\/)([^\/]+)/); - $ext=""; - } - $distrib="$name$ext"; - - if ( !-d $pg){mkdir $pg;} - chdir $pg; - - #get the distribution if available - if ( -e "$DOWNLOAD_DIR/$distrib") - { - `$CP $DOWNLOAD_DIR/$distrib .`; - } - #UNTAR and Prepare everything - if (!-e "$name.tar" && !-e "$name") - { - &check_rm ($wget_tmp); - print "\n------- Downloading/Installing $pg\n"; - if (!-e $distrib && &url2file ("$download", "$wget_tmp")==$EXIT_SUCCESS) - { - - `mv $wget_tmp $distrib`; - `$CP $distrib $DOWNLOAD_DIR/`; - } - - if (!-e $distrib) - { - print "!!!!!!! Download of $pg distribution failed\n"; - print "!!!!!!! Check Address: $PG{$pg}{source}\n"; - return 0; - } - print "\n------- unzipping/untaring $name\n"; - if (($ext =~/z/)) - { - &flush_command ("gunzip $name$ext"); - - } - if (($ext =~/tar/) || ($ext =~/tgz/)) - { - &flush_command("tar -xvf $name.tar"); - } - } - #Guess and enter the distribution directory - @fl=ls($p); - foreach my $f (@fl) - { - if (-d $f) - { - $main_dir=$f; - } - } - if (-d $main_dir) - {chdir $main_dir;} - - print "\n------- Compiling/Installing $pg\n"; - `make clean $SILENT`; - #sap - if ($pg eq "sap") - { - `rm *.o sap sap.exe ./util/aa/*.o ./util/wt/.o $SILENT`; - &flush_command ("make $arguments sap"); - &check_cp ($pg, "$BIN"); - } - elsif ($pg eq "clustalw2") - { - &flush_command("./configure"); - &flush_command("make $arguments"); - &check_cp ("./src/$pg", "$BIN"); - - } - elsif ($pg eq "clustalw") - { - &flush_command("make $arguments clustalw"); - `$CP $pg $BIN $SILENT`; - } - - elsif ($pg eq "mafft") - { - my $base=cwd(); - my $c; - - #compile core - mkpath ("./mafft/bin"); - mkpath ("./mafft/lib"); - chdir "$base/core"; - `make clean $SILENT`; - &flush_command ("make $arguments"); - &flush_command ("make install LIBDIR=../mafft/lib BINDIR=../mafft/bin"); - - #compile extension - chdir "$base/extensions"; - `make clean $SILENT`; - &flush_command ("make $arguments"); - &flush_command ("make install LIBDIR=../mafft/lib BINDIR=../mafft/bin"); - - #put everything in mafft and copy the coompiled stuff in bin - chdir "$base"; - if ($ROOT_INSTALL) - { - &root_run ("You Must be Roor to Install MAFFT\n", "mkdir /usr/local/mafft/;$CP mafft/lib/* /usr/local/mafft;$CP mafft/lib/mafft* /usr/local/bin ;$CP mafft/bin/mafft /usr/local/bin/; "); - } - else - { - `$CP mafft/lib/* $BIN`; - `$CP mafft/bin/mafft $BIN`; - } - `tar -cvf mafft.tar mafft`; - `gzip mafft.tar`; - `mv mafft.tar.gz $BIN`; - } - elsif ( $pg eq "dialign-tx") - { - my $f; - my $base=cwd(); - - chdir "./source"; - &flush_command (" make CPPFLAGS='-O3 -funroll-loops' all"); - - chdir ".."; - &check_cp ("./source/$pg", "$BIN"); - &check_cp ("./source/$pg", "$BIN/dialign-t"); - } - elsif ($pg eq "poa") - { - &flush_command ("make $arguments poa"); - &check_cp ("$pg", "$BIN"); - } - elsif ( $pg eq "probcons") - { - `rm *.exe $SILENT`; - &flush_command ("make $arguments probcons"); - &check_cp("$pg", "$BIN/$pg"); - } - elsif ( $pg eq "probcons" || $pg eq "probconsRNA") - { - `rm *.exe $SILENT`; - &flush_command ("make $arguments probcons"); - &check_cp("probcons", "$BIN/$pg"); - } - - elsif ( $pg eq "muscle") - { - `rm *.o muscle muscle.exe $SILENT`; - &flush_command ("make $arguments all"); - &check_cp("$pg", "$BIN"); - } - elsif ( $pg eq "pcma") - { - &flush_command ("make $arguments pcma"); - &check_cp("$pg", "$BIN"); - } - elsif ($pg eq "kalign") - { - &flush_command ("./configure"); - &flush_command("make $arguments"); - &check_cp ("$pg",$BIN); - } - elsif ( $pg eq "amap") - { - chdir "align"; - `make clean $SILENT`; - &flush_command ("make $arguments all"); - &check_cp ("$pg", $BIN); - } - elsif ( $pg eq "proda") - { - &flush_command ("make $arguments all"); - &check_cp ("$pg", $BIN); - } - elsif ( $pg eq "prank") - { - &flush_command ("make $arguments all"); - &check_cp ("$pg", $BIN); - } - elsif ( $pg eq "mustang") - { - &flush_command ("make $arguments all"); - if ( $OS=~/windows/){&check_cp("./bin/MUSTANG_v.3", "$BIN/mustang.exe");} - else {&check_cp("./bin/MUSTANG_v.3", "$BIN/mustang");} - } - elsif ( $pg eq "RNAplfold") - { - &flush_command("./configure"); - &flush_command ("make $arguments all"); - &check_cp("./Progs/RNAplfold", "$BIN"); - } - chdir $CDIR; - return &pg_is_installed ($pg, $BIN); - } - -sub install_t_coffee - { - my ($pg)=(@_); - my ($report,$cflags, $arguments, $language, $compiler) ; - #1-Install T-Coffee - chdir "t_coffee_source"; - &flush_command ("make clean"); - print "\n------- Compiling T-Coffee\n"; - $language=$PG{$pg} {language2}; - $arguments=$PG{$language}{arguments}; - if (!($arguments =~/CFLAGS/)){$arguments .= " CFLAGS=-O2 ";} - - if ( $CC ne ""){&flush_command ("make -i $arguments t_coffee");} - &check_cp ($pg, $BIN); - - chdir $CDIR; - return &pg_is_installed ($pg, $BIN); - } -sub install_TMalign - { - my ($pg)=(@_); - my $report; - chdir "t_coffee_source"; - print "\n------- Compiling TMalign\n"; - `rm TMalign TMalign.exe $SILENT`; - if ( $FC ne ""){&flush_command ("make -i $PG{Fortran}{arguments} TMalign");} - &check_cp ($pg, $BIN); - if ( !-e "$BIN/$pg" && pg_has_binary_distrib ($pg)) - { - print "!!!!!!! Compilation of $pg impossible. Will try to install from binary\n"; - return &install_binary_package ($pg); - } - chdir $CDIR; - return &pg_is_installed ($pg, $BIN); - } - -sub pg_has_binary_distrib - { - my ($pg)=(@_); - if ($PG{$pg}{windows}){return 1;} - elsif ($PG{$pg}{osx}){return 1;} - elsif ($PG{$pg}{linux}){return 1;} - return 0; - } -sub install_binary_package - { - my ($pg)=(@_); - my ($base,$report,$name, $download, $arguments, $language, $dir); - my $isdir; - &input_os(); - - if (!&supported_os($OS)){return 0;} - if ( $PG{$pg}{binary}){$name=$PG{$pg}{binary};} - else - { - $name=$pg; - if ( $OS eq "windows"){$name.=".exe";} - } - - $download="$WEB_BASE/Packages/Binaries/$OS/$name"; - - $base=cwd(); - chdir $TMP; - - if (!-e $name) - { - `rm x $SILENT`; - if ( url2file("$download","x")==$EXIT_SUCCESS) - { - `mv x $name`; - } - } - - if (!-e $name) - { - print "!!!!!!! $PG{$pg}{dname}: Download of $pg binary failed\n"; - print "!!!!!!! $PG{$pg}{dname}: Check Address: $download\n"; - return 0; - } - print "\n------- Installing $pg\n"; - - if ($name =~/tar\.gz/) - { - `gunzip $name`; - `tar -xvf $pg.tar`; - chdir $pg; - if ( $pg eq "mafft") - { - if ($ROOT_INSTALL) - { - &root_run ("You Must be Roor to Install MAFFT\n", "$CP mafft/bin/* /usr/local/mafft;mkdir /usr/local/mafft/; $CP mafft/lib/* /usr/local/bin/"); - } - else - { - `$CP $TMP/$pg/bin/* $BIN $SILENT`; - `$CP $TMP/$pg/lib/* $BIN $SILENT`; - } - } - else - { - if (-e "$TMP/$pg/data"){`$CP $TMP/$pg/data/* $TCM $SILENT`;} - if (!($pg=~/\*/)){`rm -rf $pg`;} - } - } - else - { - &check_cp ("$pg", "$BIN"); - `chmod u+x $BIN/$pg`; - unlink ($pg); - } - chdir $base; - $PG{$pg}{from_binary}=1; - return &pg_is_installed ($pg, $BIN); - } - -################################################################################ -# # -# # -# # -# Simple Utilities # -# # -# # -# # -################################################################################# -sub add_dir - { - my $dir=@_[0]; - - if (!-e $dir && !-d $dir) - { - return mkpath ($dir); - } - else - { - return 0; - } - } -sub check_rm - { - my ($file)=(@_); - - if ( -e $file) - { - return unlink($file); - } - return 0; - } -sub check_cp - { - my ($from, $to)=(@_); - if ( !-e $from && -e "$from\.exe"){$from="$from\.exe";} - if ( !-e $from){return 0;} - - `$CP $from $to`; - return 1; - } -sub check_file_list_exists - { - my ($base, @flist)=(@_); - my $f; - - foreach $f (@flist) - { - if ( !-e "$base/$f"){return 0;} - } - return 1; - } -sub ls - { - my $f=@_[0]; - my @fl; - chomp(@fl=`ls -1 $f`); - return @fl; - } -sub flush_command - { - my $command=@_[0]; - my $F=new FileHandle; - open ($F, "$command|"); - while (<$F>){print " --- $_";} - close ($F); - } - -sub input_installation_directory - { - my $dir=@_[0]; - my $new; - - print "------- The current installation directory is: [$dir]\n"; - print "??????? Return to keep the default or new value:"; - - if ($NO_QUESTION==0) - { - chomp ($new=); - while ( $new ne "" && !input_yes ("You have entered $new. Is this correct? ([y]/n):")) - { - print "???????New installation directory:"; - chomp ($new=); - } - $dir=($new eq "")?$dir:$new; - $dir=~s/\/$//; - } - - if ( -d $dir){return $dir;} - elsif (&root_run ("You must be root to create $dir","mkdir $dir")==$EXIT_SUCCESS){return $dir;} - else - { - print "!!!!!!! $dir could not be created\n"; - if ( $NO_QUESTION) - { - return ""; - } - elsif ( &input_yes ("??????? Do you want to provide a new directory([y]/n)?:")) - { - return input_installation_directory ($dir); - } - else - { - return ""; - } - } - - } -sub input_yes - { - my $question =@_[0]; - my $answer; - - if ($NO_QUESTION==1){return 1;} - - if ($question eq ""){$question="??????? Do you wish to proceed ([y]/n)?:";} - print $question; - chomp($answer=lc()); - if (($answer=~/^y/) || $answer eq ""){return 1;} - elsif ( ($answer=~/^n/)){return 0;} - else - { - return input_yes($question); - } - } -sub root_run - { - my ($txt, $cmd)=(@_); - - if ( system ($cmd)==$EXIT_SUCCESS){return $EXIT_SUCCESS;} - else - { - print "------- $txt\n"; - if ( $ROOT eq "sudo"){return system ("sudo $cmd");} - else {return system ("su root -c \"$cmd\"");} - } - } -#analyze environement -sub get_root - { - if (&pg_is_installed ("sudo")){return "sudo";} - else {return "su";} - } - -sub get_os - { - my $raw_os=`uname`; - my $os; - - $raw_os=lc ($raw_os); - - if ($raw_os =~/cygwin/){$os="windows";} - elsif ($raw_os =~/linux/){$os="linux";} - elsif ($raw_os =~/osx/){$os="macosx";} - elsif ($raw_os =~/darwin/){$os="macosx";} - else - { - $os=$raw_os; - } - return $os; - } -sub input_os - { - my $answer; - if ($OS) {return $OS;} - - print "??????? which os do you use: [w]indows, [l]inux, [m]acosx:?"; - $answer=lc(); - - if (($answer=~/^m/)){$OS="macosx";} - elsif ( ($answer=~/^w/)){$OS="windows";} - elsif ( ($answer=~/^linux/)){$OS="linux";} - - else - { - return &input_os(); - } - return $OS; - } - -sub supported_os - { - my ($os)=(@_[0]); - return $SUPPORTED_OS{$os}; - } - - -################################################################################ -# # -# # -# # -# update/initialize links # -# # -# # -# # -################################################################################# - - -sub update_tclinkdb - { - my $file =@_[0]; - my $name; - my $F=new FileHandle; - my ($download, $address, $name, $l, $db); - - if ( $file eq "update"){$file=$TCLINKDB_ADDRESS;} - - if ( $file =~/http:\/\// || $file =~/ftp:\/\//) - { - ($address, $name)=($download=~/(.*)\/([^\/]+)$/); - `rm x $SILENT`; - if (&url2file ($file,"x")==$EXIT_SUCCESS) - { - print "------- Susscessful upload of $name"; - `mv x $name`; - $file=$name; - } - } - open ($F, "$file"); - while (<$F>) - { - my $l=$_; - if (($l =~/^\/\//) || ($db=~/^#/)){;} - elsif ( !($l =~/\w/)){;} - else - { - my @v=split (/\s+/, $l); - if ( $l=~/^MODE/) - { - $MODE{$v[1]}{$v[2]}=$v[3]; - } - elsif ($l=~/^PG/) - { - $PG{$v[1]}{$v[2]}=$v[3]; - } - } - } - close ($F); - &post_process_PG(); - return; - } - - - -sub initialize_PG - { - -$PG{"t_coffee"}{"4_TCOFFEE"}="TCOFFEE"; -$PG{"t_coffee"}{"type"}="sequence_multiple_aligner"; -$PG{"t_coffee"}{"ADDRESS"}="http://www.tcoffee.org"; -$PG{"t_coffee"}{"language"}="C"; -$PG{"t_coffee"}{"language2"}="C"; -$PG{"t_coffee"}{"source"}="http://www.tcoffee.org/Packages/T-COFFEE_distribution.tar.gz"; -$PG{"t_coffee"}{"update_action"}="always"; -$PG{"t_coffee"}{"mode"}="tcoffee,mcoffee,rcoffee,expresso,3dcoffee"; -$PG{"clustalw2"}{"4_TCOFFEE"}="CLUSTALW2"; -$PG{"clustalw2"}{"type"}="sequence_multiple_aligner"; -$PG{"clustalw2"}{"ADDRESS"}="http://www.clustal.org"; -$PG{"clustalw2"}{"language"}="C++"; -$PG{"clustalw2"}{"language2"}="CXX"; -$PG{"clustalw2"}{"source"}="http://www.clustal.org/download/2.0.10/clustalw-2.0.10-src.tar.gz"; -$PG{"clustalw2"}{"mode"}="mcoffee,rcoffee"; -$PG{"clustalw"}{"4_TCOFFEE"}="CLUSTALW"; -$PG{"clustalw"}{"type"}="sequence_multiple_aligner"; -$PG{"clustalw"}{"ADDRESS"}="http://www.clustal.org"; -$PG{"clustalw"}{"language"}="C"; -$PG{"clustalw"}{"language2"}="C"; -$PG{"clustalw"}{"source"}="http://www.clustal.org/download/1.X/ftp-igbmc.u-strasbg.fr/pub/ClustalW/clustalw1.82.UNIX.tar.gz"; -$PG{"clustalw"}{"mode"}="mcoffee,rcoffee"; -$PG{"dialign-t"}{"4_TCOFFEE"}="DIALIGNT"; -$PG{"dialign-t"}{"type"}="sequence_multiple_aligner"; -$PG{"dialign-t"}{"ADDRESS"}="http://dialign-tx.gobics.de/"; -$PG{"dialign-t"}{"DIR"}="/usr/share/dialign-tx/"; -$PG{"dialign-t"}{"language"}="C"; -$PG{"dialign-t"}{"language2"}="C"; -$PG{"dialign-t"}{"source"}="http://dialign-tx.gobics.de/DIALIGN-TX_1.0.1.tar.gz"; -$PG{"dialign-t"}{"mode"}="mcoffee"; -$PG{"dialign-t"}{"binary"}="dialign-t"; -$PG{"dialign-tx"}{"4_TCOFFEE"}="DIALIGNTX"; -$PG{"dialign-tx"}{"type"}="sequence_multiple_aligner"; -$PG{"dialign-tx"}{"ADDRESS"}="http://dialign-tx.gobics.de/"; -$PG{"dialign-tx"}{"DIR"}="/usr/share/dialign-tx/"; -$PG{"dialign-tx"}{"language"}="C"; -$PG{"dialign-tx"}{"language2"}="C"; -$PG{"dialign-tx"}{"source"}="http://dialign-tx.gobics.de/DIALIGN-TX_1.0.1.tar.gz"; -$PG{"dialign-tx"}{"mode"}="mcoffee"; -$PG{"dialign-tx"}{"binary"}="dialign-tx"; -$PG{"poa"}{"4_TCOFFEE"}="POA"; -$PG{"poa"}{"type"}="sequence_multiple_aligner"; -$PG{"poa"}{"ADDRESS"}="http://www.bioinformatics.ucla.edu/poa/"; -$PG{"poa"}{"language"}="C"; -$PG{"poa"}{"language2"}="C"; -$PG{"poa"}{"source"}="http://downloads.sourceforge.net/poamsa/poaV2.tar.gz"; -$PG{"poa"}{"DIR"}="/usr/share/"; -$PG{"poa"}{"FILE1"}="blosum80.mat"; -$PG{"poa"}{"mode"}="mcoffee"; -$PG{"poa"}{"binary"}="poa"; -$PG{"probcons"}{"4_TCOFFEE"}="PROBCONS"; -$PG{"probcons"}{"type"}="sequence_multiple_aligner"; -$PG{"probcons"}{"ADDRESS"}="http://probcons.stanford.edu/"; -$PG{"probcons"}{"language2"}="CXX"; -$PG{"probcons"}{"language"}="C++"; -$PG{"probcons"}{"source"}="http://probcons.stanford.edu/probcons_v1_12.tar.gz"; -$PG{"probcons"}{"mode"}="mcoffee"; -$PG{"probcons"}{"binary"}="probcons"; -$PG{"mafft"}{"4_TCOFFEE"}="MAFFT"; -$PG{"mafft"}{"type"}="sequence_multiple_aligner"; -$PG{"mafft"}{"ADDRESS"}="http://align.bmr.kyushu-u.ac.jp/mafft/online/server/"; -$PG{"mafft"}{"language"}="C"; -$PG{"mafft"}{"language"}="C"; -$PG{"mafft"}{"source"}="http://align.bmr.kyushu-u.ac.jp/mafft/software/mafft-6.603-with-extensions-src.tgz"; -$PG{"mafft"}{"windows"}="http://align.bmr.kyushu-u.ac.jp/mafft/software/mafft-6.603-mingw.tar"; -$PG{"mafft"}{"mode"}="mcoffee,rcoffee"; -$PG{"mafft"}{"binary"}="mafft.tar.gz"; -$PG{"muscle"}{"4_TCOFFEE"}="MUSCLE"; -$PG{"muscle"}{"type"}="sequence_multiple_aligner"; -$PG{"muscle"}{"ADDRESS"}="http://www.drive5.com/muscle/"; -$PG{"muscle"}{"language"}="C++"; -$PG{"muscle"}{"language2"}="GPP"; -$PG{"muscle"}{"source"}="http://www.drive5.com/muscle/downloads3.6/muscle3.6_src.tar.gz"; -$PG{"muscle"}{"windows"}="http://www.drive5.com/muscle/downloads3.6/muscle3.6_win32.zip"; -$PG{"muscle"}{"linux"}="http://www.drive5.com/muscle/downloads3.6/muscle3.6_linux_ia32.tar.gz"; -$PG{"muscle"}{"mode"}="mcoffee,rcoffee"; -$PG{"pcma"}{"4_TCOFFEE"}="PCMA"; -$PG{"pcma"}{"type"}="sequence_multiple_aligner"; -$PG{"pcma"}{"ADDRESS"}="ftp://iole.swmed.edu/pub/PCMA/"; -$PG{"pcma"}{"language"}="C"; -$PG{"pcma"}{"language2"}="C"; -$PG{"pcma"}{"source"}="ftp://iole.swmed.edu/pub/PCMA/pcma.tar.gz"; -$PG{"pcma"}{"mode"}="mcoffee"; -$PG{"kalign"}{"4_TCOFFEE"}="KALIGN"; -$PG{"kalign"}{"type"}="sequence_multiple_aligner"; -$PG{"kalign"}{"ADDRESS"}="http://msa.cgb.ki.se"; -$PG{"kalign"}{"language"}="C"; -$PG{"kalign"}{"language2"}="C"; -$PG{"kalign"}{"source"}="http://msa.cgb.ki.se/downloads/kalign/current.tar.gz"; -$PG{"kalign"}{"mode"}="mcoffee"; -$PG{"amap"}{"4_TCOFFEE"}="AMAP"; -$PG{"amap"}{"type"}="sequence_multiple_aligner"; -$PG{"amap"}{"ADDRESS"}="http://bio.math.berkeley.edu/amap/"; -$PG{"amap"}{"language"}="C++"; -$PG{"amap"}{"language2"}="CXX"; -$PG{"amap"}{"source"}="http://baboon.math.berkeley.edu/amap/download/amap.2.2.tar.gz"; -$PG{"amap"}{"mode"}="mcoffee"; -$PG{"proda"}{"4_TCOFFEE"}="PRODA"; -$PG{"proda"}{"type"}="sequence_multiple_aligner"; -$PG{"proda"}{"ADDRESS"}="http://proda.stanford.edu"; -$PG{"proda"}{"language"}="C++"; -$PG{"proda"}{"language2"}="CXX"; -$PG{"proda"}{"source"}="http://proda.stanford.edu/proda_1_0.tar.gz"; -$PG{"proda"}{"mode"}="mcoffee"; -$PG{"prank"}{"4_TCOFFEE"}="PRANK"; -$PG{"prank"}{"type"}="sequence_multiple_aligner"; -$PG{"prank"}{"ADDRESS"}="http://www.ebi.ac.uk/goldman-srv/prank/"; -$PG{"prank"}{"language"}="C++"; -$PG{"prank"}{"language2"}="CXX"; -$PG{"prank"}{"source"}="http://www.ebi.ac.uk/goldman-srv/prank/src/old/prank.src.081202.tgz"; -$PG{"prank"}{"mode"}="mcoffee"; -$PG{"sap"}{"4_TCOFFEE"}="SAP"; -$PG{"sap"}{"type"}="structure_pairwise_aligner"; -$PG{"sap"}{"ADDRESS"}="http://mathbio.nimr.mrc.ac.uk/wiki/Software"; -$PG{"sap"}{"language"}="C"; -$PG{"sap"}{"language2"}="C"; -$PG{"sap"}{"source"}="http://www.tcoffee.org/Packages/sap_distribution_TCC_0.6.tar.gz"; -$PG{"sap"}{"mode"}="expresso,3dcoffee"; -$PG{"TMalign"}{"4_TCOFFEE"}="TMALIGN"; -$PG{"TMalign"}{"type"}="structure_pairwise_aligner"; -$PG{"TMalign"}{"ADDRESS"}="http://zhang.bioinformatics.ku.edu/TM-align/TMalign.f"; -$PG{"TMalign"}{"language"}="Fortran"; -$PG{"TMalign"}{"language2"}="Fortran"; -$PG{"TMalign"}{"source"}="http://zhang.bioinformatics.ku.edu/TM-align/TMalign.f"; -$PG{"TMalign"}{"linux"}="http://zhang.bioinformatics.ku.edu/TM-align/TMalign_32.gz"; -$PG{"TMalign"}{"mode"}="expresso,3dcoffee"; -$PG{"mustang"}{"4_TCOFFEE"}="MUSTANG"; -$PG{"mustang"}{"type"}="structure_pairwise_aligner"; -$PG{"mustang"}{"ADDRESS"}="http://www.cs.mu.oz.au/~arun/mustang"; -$PG{"mustang"}{"language"}="C++"; -$PG{"mustang"}{"language2"}="CXX"; -$PG{"mustang"}{"source"}="http://www.cs.mu.oz.au/~arun/mustang/mustang_v.3.tgz"; -$PG{"mustang"}{"mode"}="expresso,3dcoffee"; -$PG{"lsqman"}{"4_TCOFFEE"}="LSQMAN"; -$PG{"lsqman"}{"type"}="structure_pairwise_aligner"; -$PG{"lsqman"}{"ADDRESS"}="empty"; -$PG{"lsqman"}{"language"}="empty"; -$PG{"lsqman"}{"language2"}="empty"; -$PG{"lsqman"}{"source"}="empty"; -$PG{"lsqman"}{"update_action"}="never"; -$PG{"lsqman"}{"mode"}="expresso,3dcoffee"; -$PG{"align_pdb"}{"4_TCOFFEE"}="ALIGN_PDB"; -$PG{"align_pdb"}{"type"}="structure_pairwise_aligner"; -$PG{"align_pdb"}{"ADDRESS"}="empty"; -$PG{"align_pdb"}{"language"}="empty"; -$PG{"align_pdb"}{"language2"}="empty"; -$PG{"align_pdb"}{"source"}="empty"; -$PG{"align_pdb"}{"update_action"}="never"; -$PG{"align_pdb"}{"mode"}="expresso,3dcoffee"; -$PG{"fugueali"}{"4_TCOFFEE"}="FUGUE"; -$PG{"fugueali"}{"type"}="structure_pairwise_aligner"; -$PG{"fugueali"}{"ADDRESS"}="http://www-cryst.bioc.cam.ac.uk/fugue/download.html"; -$PG{"fugueali"}{"language"}="empty"; -$PG{"fugueali"}{"language2"}="empty"; -$PG{"fugueali"}{"source"}="empty"; -$PG{"fugueali"}{"update_action"}="never"; -$PG{"fugueali"}{"mode"}="expresso,3dcoffee"; -$PG{"dalilite.pl"}{"4_TCOFFEE"}="DALILITEc"; -$PG{"dalilite.pl"}{"type"}="structure_pairwise_aligner"; -$PG{"dalilite.pl"}{"ADDRESS"}="built_in"; -$PG{"dalilite.pl"}{"ADDRESS2"}="http://www.ebi.ac.uk/Tools/webservices/services/dalilite"; -$PG{"dalilite.pl"}{"language"}="Perl"; -$PG{"dalilite.pl"}{"language2"}="Perl"; -$PG{"dalilite.pl"}{"source"}="empty"; -$PG{"dalilite.pl"}{"update_action"}="never"; -$PG{"dalilite.pl"}{"mode"}="expresso,3dcoffee"; -$PG{"probconsRNA"}{"4_TCOFFEE"}="PROBCONSRNA"; -$PG{"probconsRNA"}{"type"}="RNA_multiple_aligner"; -$PG{"probconsRNA"}{"ADDRESS"}="http://probcons.stanford.edu/"; -$PG{"probconsRNA"}{"language"}="C++"; -$PG{"probconsRNA"}{"language2"}="CXX"; -$PG{"probconsRNA"}{"source"}="http://probcons.stanford.edu/probconsRNA.tar.gz"; -$PG{"probconsRNA"}{"mode"}="mcoffee,rcoffee"; -$PG{"sfold"}{"4_TCOFFEE"}="CONSAN"; -$PG{"sfold"}{"type"}="RNA_pairwise_aligner"; -$PG{"sfold"}{"ADDRESS"}="http://selab.janelia.org/software/consan/"; -$PG{"sfold"}{"language"}="empty"; -$PG{"sfold"}{"language2"}="empty"; -$PG{"sfold"}{"source"}="empty"; -$PG{"sfold"}{"update_action"}="never"; -$PG{"sfold"}{"mode"}="rcoffee"; -$PG{"RNAplfold"}{"4_TCOFFEE"}="RNAPLFOLD"; -$PG{"RNAplfold"}{"type"}="RNA_secondarystructure_predictor"; -$PG{"RNAplfold"}{"ADDRESS"}="http://www.tbi.univie.ac.at/~ivo/RNA/"; -$PG{"RNAplfold"}{"language"}="C"; -$PG{"RNAplfold"}{"language2"}="C"; -$PG{"RNAplfold"}{"source"}="http://www.tbi.univie.ac.at/~ivo/RNA/ViennaRNA-1.7.2.tar.gz"; -$PG{"RNAplfold"}{"mode"}="rcoffee"; -$PG{"hmmtop"}{"4_TCOFFEE"}="HMMTOP"; -$PG{"hmmtop"}{"type"}="protein_secondarystructure_predictor"; -$PG{"hmmtop"}{"ADDRESS"}="www.enzim.hu/hmmtop/"; -$PG{"hmmtop"}{"language"}="C"; -$PG{"hmmtop"}{"language2"}="C"; -$PG{"hmmtop"}{"source"}="empty"; -$PG{"hmmtop"}{"update_action"}="never"; -$PG{"hmmtop"}{"mode"}="tcoffee"; -$PG{"gorIV"}{"4_TCOFFEE"}="GOR4"; -$PG{"gorIV"}{"type"}="protein_secondarystructure_predictor"; -$PG{"gorIV"}{"ADDRESS"}="http://mig.jouy.inra.fr/logiciels/gorIV/"; -$PG{"gorIV"}{"language"}="C"; -$PG{"gorIV"}{"language2"}="C"; -$PG{"gorIV"}{"source"}="http://mig.jouy.inra.fr/logiciels/gorIV/GOR_IV.tar.gz"; -$PG{"gorIV"}{"update_action"}="never"; -$PG{"gorIV"}{"mode"}="tcoffee"; -$PG{"wublast.pl"}{"4_TCOFFEE"}="EBIWUBLASTc"; -$PG{"wublast.pl"}{"type"}="protein_homology_predictor"; -$PG{"wublast.pl"}{"ADDRESS"}="built_in"; -$PG{"wublast.pl"}{"ADDRESS2"}="http://www.ebi.ac.uk/Tools/webservices/services/wublast"; -$PG{"wublast.pl"}{"language"}="Perl"; -$PG{"wublast.pl"}{"language2"}="Perl"; -$PG{"wublast.pl"}{"source"}="empty"; -$PG{"wublast.pl"}{"update_action"}="never"; -$PG{"wublast.pl"}{"mode"}="psicoffee,expresso,3dcoffee"; -$PG{"blastpgp.pl"}{"4_TCOFFEE"}="EBIBLASTPGPc"; -$PG{"blastpgp.pl"}{"type"}="protein_homology_predictor"; -$PG{"blastpgp.pl"}{"ADDRESS"}="built_in"; -$PG{"blastpgp.pl"}{"ADDRESS2"}="http://www.ebi.ac.uk/Tools/webservices/services/blastpgp"; -$PG{"blastpgp.pl"}{"language"}="Perl"; -$PG{"blastpgp.pl"}{"language2"}="Perl"; -$PG{"blastpgp.pl"}{"source"}="empty"; -$PG{"blastpgp.pl"}{"update_action"}="never"; -$PG{"blastpgp.pl"}{"mode"}="psicoffee,expresso,3dcoffee"; -$PG{"blastcl3"}{"4_TCOFFEE"}="NCBIWEBBLAST"; -$PG{"blastcl3"}{"type"}="protein_homology_predictor"; -$PG{"blastcl3"}{"ADDRESS"}="ftp://ftp.ncbi.nih.gov/blast/executables/LATEST"; -$PG{"blastcl3"}{"language"}="C"; -$PG{"blastcl3"}{"language2"}="C"; -$PG{"blastcl3"}{"source"}="empty"; -$PG{"blastcl3"}{"update_action"}="never"; -$PG{"blastcl3"}{"mode"}="psicoffee,expresso,3dcoffee"; -$PG{"blastpgp"}{"4_TCOFFEE"}="NCBIBLAST"; -$PG{"blastpgp"}{"type"}="protein_homology_predictor"; -$PG{"blastpgp"}{"ADDRESS"}="ftp://ftp.ncbi.nih.gov/blast/executables/LATEST"; -$PG{"blastpgp"}{"language"}="C"; -$PG{"blastpgp"}{"language2"}="C"; -$PG{"blastpgp"}{"source"}="empty"; -$PG{"blastpgp"}{"update_action"}="never"; -$PG{"blastpgp"}{"mode"}="psicoffee,expresso,3dcoffee"; -$PG{"SOAP::Lite"}{"4_TCOFFEE"}="SOAPLITE"; -$PG{"SOAP::Lite"}{"type"}="library"; -$PG{"SOAP::Lite"}{"ADDRESS"}="http://cpansearch.perl.org/src/MKUTTER/SOAP-Lite-0.710.08/Makefile.PL"; -$PG{"SOAP::Lite"}{"language"}="Perl"; -$PG{"SOAP::Lite"}{"language2"}="Perl"; -$PG{"SOAP::Lite"}{"source"}="empty"; -$PG{"SOAP::Lite"}{"mode"}="psicoffee,expresso,3dcoffee"; -$MODE{"tcoffee"}{"name"}="tcoffee"; -$MODE{"rcoffee"}{"name"}="rcoffee"; -$MODE{"3dcoffee"}{"name"}="3dcoffee"; -$MODE{"mcoffee"}{"name"}="mcoffee"; -$MODE{"expresso"}{"name"}="expresso"; -#TclinkdbEnd End tag for the list updating - -########### Compilers ############################## -# -# - -$PG{C}{compiler}="gcc"; -$PG{C}{compiler_flag}="CC"; -$PG{C}{options}=""; -$PG{C}{options_flag}="CFLAGS"; -$PG{C}{type}="compiler"; - -$PG{"CXX"}{compiler}="g++"; -$PG{"CXX"}{compiler_flag}="CXX"; -$PG{"CXX"}{options}=""; -$PG{"CXX"}{options_flag}="CXXFLAGS"; -$PG{CXX}{type}="compiler"; - -$PG{"CPP"}{compiler}="g++"; -$PG{"CPP"}{compiler_flag}="CPP"; -$PG{"CPP"}{options}=""; -$PG{"CPP"}{options_flag}="CPPFLAGS"; -$PG{CPP}{type}="compiler"; - -$PG{"GPP"}{compiler}="g++"; -$PG{"GPP"}{compiler_flag}="GPP"; -$PG{"GPP"}{options}=""; -$PG{"GPP"}{options_flag}="CFLAGS"; -$PG{GPP}{type}="compiler"; - -$PG{Fortran}{compiler}="g77"; -$PG{Fortran}{compiler_flag}="FCC"; -$PG{Fortran}{type}="compiler"; - -$PG{Perl}{compiler}="CPAN"; -$PG{Perl}{type}="compiler"; - -$SUPPORTED_OS{macox}="Macintosh"; -$SUPPORTED_OS{linux}="Linux"; -$SUPPORTED_OS{windows}="Cygwin"; - - - -$MODE{t_coffee}{description}=" for regular multiple sequence alignments"; -$MODE{rcoffee} {description}=" for RNA multiple sequence alignments"; - -$MODE{psicoffee} {description}=" for Homology Extended multiple sequence alignments"; -$MODE{expresso}{description}=" for very accurate structure based multiple sequence alignments"; -$MODE{"3dcoffee"}{description}=" for multiple structure alignments"; -$MODE{mcoffee} {description}=" for combining alternative multiple sequence alignment packages\n------- into a unique meta-package. The installer will upload several MSA packages and compile them\n -"; - - -&post_process_PG(); -return; -} - -sub post_process_PG - { - my $p; - - %PG=&name2dname (%PG); - %MODE=&name2dname(%MODE); - foreach $p (keys(%PG)){if ( $PG{$p}{type} eq "compiler"){$PG{$p}{update_action}="never";}} - - } - -sub name2dname - { - my (%L)=(@_); - my ($l, $ml); - - foreach my $pg (keys(%L)) - { - $l=length ($pg); - if ( $l>$ml){$ml=$l;} - } - $ml+=1; - foreach my $pg (keys(%L)) - { - my $name; - $l=$ml-length ($pg); - $name=$pg; - for ( $b=0; $b<$l; $b++) - { - $name .=" "; - } - $L{$pg}{dname}=$name; - } - return %L; - } - -sub env_file2putenv - { - my $f=@_[0]; - my $F=new FileHandle; - my $n; - - open ($F, "$f"); - while (<$F>) - { - my $line=$_; - my($var, $value)=($_=~/(\S+)\=(\S*)/); - $ENV{$var}=$value; - $ENV_SET{$var}=1; - $n++; - } - close ($F); - return $n; - } - diff --git a/binaries/src/tcoffee/license.txt b/binaries/src/tcoffee/license.txt deleted file mode 100644 index 3827054..0000000 --- a/binaries/src/tcoffee/license.txt +++ /dev/null @@ -1,348 +0,0 @@ -----------------------------------COPYRIGHT NOTICE---------------------------------/ - ACADEMIC LICENCE AGREEMENT - - © Centro de Regulacio Genomica and Cedric Notredame ( Tue Oct 27 10:12:26 WEST 2009). - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - - - -----------------------------------COPYRIGHT NOTICE---------------------------------/ diff --git a/binaries/src/tcoffee/t_coffee_source/CUSTOM_evaluate_for_struc.c b/binaries/src/tcoffee/t_coffee_source/CUSTOM_evaluate_for_struc.c deleted file mode 100644 index 62e3312..0000000 --- a/binaries/src/tcoffee/t_coffee_source/CUSTOM_evaluate_for_struc.c +++ /dev/null @@ -1,460 +0,0 @@ -#include -#include -#include -#include - - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - -#include "dp_lib_header.h" - - -/* - 23/06/00, Cedric Notredame - - - 1-Content of the data structures. - 2-Implementing your own function in pdb_align. - 3-Using that function with T-Coffee (multiple Sequence Alignment). - 4-Syntax rules as defined by Philipp Bucher (19/06/00). - 5-Current Shortcomings - 6-Enquiries. - - 1-Content of the data structures - - This file only contains a dummy function to help you create - your own matching potential function (Step 2 in the Notations RULES - - int evaluate_match_score ( Constraint_list *CL, int A, int i, int B, int j) - - returns a score, expected to be between -100 and 100, that corresponds to the matching of - A_i with B_j. - - Most needed parameters are included in the data structure CL, - This Data Structure is declared in util_constraint_list.h - The following, non exhaustive list explains the most common parameters - - The neighborhood is computed using: - ((CL->T[A])->pdb_param)->maximum_distance as a radius for the Bubble - ((CL->T[A])->pdb_param)->n_excluded_nb are excluded around the central residue - i.e i-1 and i+1 for n_excluded_nb=1. - - - ((CL->T[A])->Bubble)->nb[i][0] --> Number of residues in the bubble around A_i - ((CL->T[A])->Bubble)->nb[i][k]=j --> Index of the kth residue in the bubble - Residues are sorted according to the Ca chain - ((CL->T[A])->Bubble)->d_nb[i][k]=d --> Distance between A_i and A_j equals d; - - ((CL->T[A])->ca[i]->x -----------> Coordinates of the Ca A_i - ((CL->T[A])->ca[i]->y - ((CL->T[A])->ca[i]->z - - - - ((CL->T[A])->len -----------> Length of Chain A. - ((CL->T[A])->n_atom -----------> n atoms in A. - - - Unspecified parameters can be passed from the command line: - - align_pdb -extra_parameters=10, 10.3, 11, 12.4, my_file - - The values of these parameters can be accessed in: - - ((CL->T[A])->pdb_param)->n_extra_param=4 - ((CL->T[A])->pdb_param)->extra_param[0]="10" - ((CL->T[A])->pdb_param)->extra_param[1]="10.3" - ((CL->T[A])->pdb_param)->extra_param[2]="11.6" - ((CL->T[A])->pdb_param)->extra_param[3]="my_file" - - These parameters contain strings! To get the real values, in C, use atoi and atof: - atoi ( ((CL->T[A])->pdb_param)->extra_param[0])=10; - atof ( ((CL->T[A])->pdb_param)->extra_param[1])=10.3; - - The maximum number of parameters is currently 1000... - - - - 2-Implementing your own function - - all you need to do is to edit this file and recompile align_pdb. - There is no need to prototype any function. - - 10 functions holders exist, that correspond to the 10 dummy functions - declared in this file: - custom_pair_score_function1 - custom_pair_score_function2 - custom_pair_score_function3 - custom_pair_score_function4 - ..... - custom_pair_score_function10 - - Let us imagine, you want to use custom_pair_function1. - - 1-In CUSTOM_evaluate_for_struc.c, modify custom_pair_function1, - so that it computes the score you need. - - 2-If you need extra parameters, get them from ((CL->T[A])->pdb_param)->extra_param. - 3-Recompile pdb_align: - -put it in your bin - -rehash or whatever - - 4-run the program as follows: - - align_pdb -in -hasch_mode=custom_pair_score_function1 - -extra_param=10, 12, 0.4, matrix... - - 5-My advice for a first time: make a very simple dummy function that spits - out the content of extra_param. - - 6-Remember it is your responsability to control the number of extra parameters - and their proper order, and type. Do not forget to apply atoi and atof to the parameters - - 7-Remember that the modifications you made to CUSTOM_evaluate_for_sytructure - must be preserved by you!!! They may disappear if you update align_pdb, save them - appart as your own patch. - - - - -3-Using that function with T-Coffee (multiple Sequence Alignment). - - 1- setenv ALIGN_PDB_4_TCOFFEE - - 2- run t_coffee - To do so, you will NOT NEED to recompile T-Coffee, simply type: - t_coffee -in ... custom1_align_pdb_pair - - - -4-Syntax rules as defined by Philipp Bucher (19/06/00). - - Proposed ascii text notation for align_pdb - - First, let us summarize the align pdb algorithm in plain - english: - - Given are two protein structures A and B. - - Step 1: For each residue in each structure extract - the local structural neighbourhood. A neighbourhood - is simply a subset of (usually non-consecutive) - residues from one of the structures. - - Step 2: For all possible pairs of residues between structures - A and B, compute the optimal neighbourhood alignment - score. This score, which is also referred to as - local neighbourhood similarity (LNS) score indicates - whether two residues have similar local stuctural - environemnts. - - Step 3: Generate one (or multiple) optimal structural alignment(s) - for A and B based on LNS scores plus some gap penalty - function. - - Now, some rules for ascii/email notation: - - - Whenever possible use a style which fits on one line (because it - is painful to modify formulas that span over several lines). Example: - - Use: ( a**2 + b**2 )**0.5 - ________ - | 2 2 - instead of: \| a + b - - Introduce local variables/functions to split long expressions over - several lines, e.g. - - Score = Sum(0 Step 1: For each residue in each structure, extract - > the local structural neighbourhood. A neighbourhood - > is simply a subset of (usually non-consecutive) - > residues from the same structure. - - The result is something like: - - P(i) = P_1(i) .. P_k(i) .. P_K_i(i) - Q(i) = Q_1(j) .. Q_l(j) .. Q_L_j(j) - - These are all ordered integer arrays. The P's and Q's indicate - residue positions in sequence space. For the C-alpha coordinates, - we use: - - C(i) = C_1(i) .. C_k(i) .. C_K_i(i) - D(i) = D_1(j) .. D_l(j) .. D_L_i(j) - - > Step 2: For all possible pairs of residues between structures - > A and B, compute the optimal neighbourhood alignment - > score. This score, which is also referred to as - > local neighbourhood similarity (NSL) score indicates - > whether two residues have similar local stuctural - > environemnts. - - We have to define a similarity score: - - S(i,j) = function[A,B,P(i),Q(j)] - - More specifically, S(i,j) is the score of an opimal alignment between - two subsets of C-alpha coordinates from A and B, defined by P(i) and Q(j). - We use the following notation for an alignment between two neighbourhoods. - - R = (k_1,l_1) .. (k_m,l_m) .. (k_M, l_M) - - This is pretty abstract and requires some explanation. - - The alignment consists of M pairs of residues from two neighbourhoods. - The paired residues are numbered 1,2...K and 1,2...L, respectively. - Obviously M <= K,L. For K=9 and L=7, a possible alignment would - look as follows: - - R = (1,2) , (2,3) , (5,4) , (6,5) , (9,7) - - This alignment consists of five paired residues, the first - residue of neighbourhood P(i) is aligned with with the second residue - of Q(j), etc. - - The score of an alignment Z(R) is a function that can be - defined in many different ways. But independently of its - definition: - - S(i,j) = Z(R*,A,B,P(i),Q(j)) - R* = argmax Z(R,A,B,P(i),Q(j)) - - This is just a complicated way of saying that the LNS score - S(i,j) is an optimal alignment score. A simple alignment - scoring function would be: - - Z = Sum(m=1..M) [ 2 - |C_(k_m) - D_l_m)| ] - - A more complex function could be the sum of the sums of "pair-weights", - "pair-connection-weights", and unpaired-residue-weights": - - Z = Sum(m=1 .. M) [ PW (i,P_k_m,Q_l_m,C_k_m, D_l_m) ] - + Sum(m=2 .. M ) [ PCW(j,P_k_m,P_l_m,Q_k_m-1,Q_l_m-1,C_k_m,D_l_m,C_k_m-1,D_j_m-1 ] - + Sum(over k for all C_i(k) unpaired) UPRW [P_k, C_k ] - + Sum(over l for all C_i(l) unpaired) UPRW [Q_l, D_l)) ] - - Here, the terms P_k_m ... denote sequence positions, the terms C_k_m ... - denote coordinates. i and j, the sequence position of the center residues - of the neighbourhoods under consideration) are included in the argument - lists of the functions because they are necessary to decide whether - a residue A_k_m occurs before or after the residue A_i in sequence space. - We don not want to align a residue A_k_m that occurs before A_i with - a residue B_j_l that occurs after B_j and vice-versa. - - The LNS score could also be defined by a recursive equation system - defining a dynamic programming algorithm. However, I find the - above formulation more helpful for designing appropriate alignment - scoring functions. - - > Step 3: Generate one (or multiple) optimal structural alignment(s)r - > for A and B based on NLS scores plus some gap penalty - > function. - - This is now pretty simple. We use essentially the same notation as - for the neighbourhood alignments. - - R = (i_1,j_1) .. (i_n,j_n) .. (i_N, j_N) - - X* = X(R*,A,B) - R* = argmax X(R,A,B) - - The alignment scoring functing X is the sum of the LNS scores - of the pairs minus some gap penalties. - - -5-Current Shortcomings - - At present, it is impossible to use the extra_param flag with T-Coffee. This means that - the actual values of your parameters must be HARD-CODED within the custom_pair_score_function - you are using. - - On request, I will implement a solution to solve that problem. - -6-Contact - For any enquiry, please send a mail to: - cedric.notredame@europe.com - */ - - - - - - - - -int custom_pair_score_function1 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - int a; - FILE *fp; - - fp=vfopen ( "test_file", "w"); - for ( a=0; a< ((CL->T[0])->pdb_param)->n_extra_param; a++) - fprintf (fp, "\n\t%s", ((CL->T[0])->pdb_param)->extra_param[a]); - - fprintf ( fp, "\nTEST OK"); - vfclose ( fp); - exit (1); - - return score; - - } -int custom_pair_score_function2 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function3 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function4 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function5 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function6 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function7 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function8 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } - -int custom_pair_score_function9 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -int custom_pair_score_function10 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - int score=0; - - return score; - - } -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/TMalign.f b/binaries/src/tcoffee/t_coffee_source/TMalign.f deleted file mode 100644 index 5920db1..0000000 --- a/binaries/src/tcoffee/t_coffee_source/TMalign.f +++ /dev/null @@ -1,2554 +0,0 @@ -************************************************************************* -* This program is to identify the best alignment of two protein -* structures to give the best TM-score. By default, TM-score is -* normalized by the second protein. The program can be freely -* copied or modified or redistributed. -* (For comments, please email to: yzhang@ku.edu) -* -* Reference: -* Yang Zhang, Jeffrey Skolnick, Nucl. Acid Res. 2005 33: 2303-9 -* -************************ updating history ******************************* -* 2005/06/01: A small bug of two-point superposition was fixed. -* 2005/10/19: the program was reformed so that the alignment -* results are not dependent on the specific compilers. -* 2006/06/20: select 'A' if there is altLoc when reading PDB file. -* 2007/02/27: rotation matrix from Chain-1 to Chain-2 is added. -* 2007/04/18: add options with TM-score normalized by average -* length, shorter length, or longer length of two -* structures. -* 2007/05/23: add additional output file 'TM.sup_all' for showing -* all atoms while 'TM.sup' is only for aligned atoms -* 2007/09/19: add a new feature alignment to deal with the problem -* of aligning fractional structures (e.g. protein -* interfaces). -************************************************************************* - - program compares - PARAMETER(nmax=5000) - PARAMETER(nmax2=10000) - - COMMON/BACKBONE/XA(3,nmax,0:1) - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/length/nseq1,nseq2 - common/d0/d0,anseq - common/d0min/d0_min - common/d00/d00,d002 - - character*100 fnam,pdb(100),outname - character*3 aa(-1:20),aanam,ss1(nmax),ss2(nmax) - character*100 s,du - character*200 outnameall_tmp,outnameall - character seq1(0:nmax),seq2(0:nmax) - character aseq1(nmax2),aseq2(nmax2),aseq3(nmax2) - - dimension xx(nmax),yy(nmax),zz(nmax) - dimension m1(nmax),m2(nmax) - dimension xtm1(nmax),ytm1(nmax),ztm1(nmax) - dimension xtm2(nmax),ytm2(nmax),ztm2(nmax) - common/init/invmap_i(nmax) - - common/TM/TM,TMmax - common/n1n2/n1(nmax),n2(nmax) - common/d8/d8 - common/initial4/mm1(nmax),mm2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - - data aa/ 'BCK','GLY','ALA','SER','CYS','VAL','THR','ILE', - & 'PRO','MET','ASP','ASN','LEU', - & 'LYS','GLU','GLN','ARG', - & 'HIS','PHE','TYR','TRP','CYX'/ - character*1 slc(-1:20) - data slc/'X','G','A','S','C','V','T','I', - & 'P','M','D','N','L','K','E','Q','R', - & 'H','F','Y','W','C'/ - - call getarg(1,fnam) - if(fnam.eq.' '.or.fnam.eq.'?'.or.fnam.eq.'-h')then - write(*,*) - write(*,*)'Brief instruction for running TM-align program:' - write(*,*)'(For detail: Zhang & Skolnick, Nucl. Acid Res.', - & '2005 33, 2303)' - write(*,*) - write(*,*)'1. Align ''structure.pdb'' to ''target.pdb''' - write(*,*)' (By default, TM-score is normalized by the ', - & 'length of ''target.pdb'')' - write(*,*)' >TMalign structure.pdb target.pdb' - write(*,*) - write(*,*)'2. Run TM-align and output the superposition ', - & 'to ''TM.sup'' and ''TM.sup_all'':' - write(*,*)' >TMalign structure.pdb target.pdb -o TM.sup' - write(*,*)' To view the superimposed structures of the', - & ' aligned regions by rasmol:' - write(*,*)' >rasmol -script TM.sup)' - write(*,*)' To view the superimposed structures of all', - & ' regions by rasmol:' - write(*,*)' >rasmol -script TM.sup_all)' - write(*,*) - write(*,*)'3. If you want TM-score normalized by ', - & 'an assigned length, e.g. 100 aa:' - write(*,*)' >TMalign structure.pdb target.pdb -L 100' - write(*,*)' If you want TM-score normalized by the ', - & 'average length of two structures:' - write(*,*)' >TMalign structure.pdb target.pdb -a' - write(*,*)' If you want TM-score normalized by the ', - & 'shorter length of two structures:' - write(*,*)' >TMalign structure.pdb target.pdb -b' - write(*,*)' If you want TM-score normalized by the ', - & 'longer length of two structures:' - write(*,*)' >TMalign structure.pdb target.pdb -c' - write(*,*) -c write(*,*)'5. If you want to set a minimum cutoff for d0, ', -c & 'e.g. d0>3.0' -c write(*,*)' (By default d0>0.5, this option need ', -c & 'be considered only when L<35 aa)' -c write(*,*)' >TMalign structure.pdb target.pdb -dmin 3.0' -c write(*,*) - write(*,*)'(All above options does not change the ', - & 'final structure alignment result)' - write(*,*) - goto 9999 - endif - -******* options -----------> - m_out=-1 !decided output - m_fix=-1 !fixed length-scale only for output - m_ave=-1 !using average length - m_d0_min=-1 !diminum d0 for search - m_d0=-1 !given d0 for both search and output - narg=iargc() - i=0 - j=0 - 115 continue - i=i+1 - call getarg(i,fnam) - if(fnam.eq.'-o')then - m_out=1 - i=i+1 - call getarg(i,outname) - elseif(fnam.eq.'-L')then !change both L_all and d0 - m_fix=1 - i=i+1 - call getarg(i,fnam) - read(fnam,*)L_fix - elseif(fnam.eq.'-dmin')then - m_d0_min=1 - i=i+1 - call getarg(i,fnam) - read(fnam,*)d0_min_input - elseif(fnam.eq.'-d0')then - m_d0=1 - i=i+1 - call getarg(i,fnam) - read(fnam,*)d0_fix - elseif(fnam.eq.'-a')then ! this will change the superposed output but not the alignment - m_ave=1 - i=i+1 - elseif(fnam.eq.'-b')then - m_ave=2 - i=i+1 - elseif(fnam.eq.'-c')then - m_ave=3 - i=i+1 - else - j=j+1 - pdb(j)=fnam - endif - if(i.lt.narg)goto 115 - -ccccccccc read data from first CA file: - open(unit=10,file=pdb(1),status='old') - i=0 - do while (.true.) - read(10,9001,end=1010) s - if(i.gt.0.and.s(1:3).eq.'TER')goto 1010 - if(s(1:3).eq.'ATO')then - if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.or - & .s(13:16).eq.' CA')then - if(s(17:17).eq.' '.or.s(17:17).eq.'A')then - i=i+1 - read(s,9000)du,aanam,du,mm1(i),du, - $ xa(1,i,0),xa(2,i,0),xa(3,i,0) - do j=-1,20 - if(aanam.eq.aa(j))seq1(i)=slc(j) - enddo - ss1(i)=aanam - if(i.ge.nmax)goto 1010 - endif - endif - endif - enddo - 1010 continue - 9000 format(A17,A3,A2,i4,A4,3F8.3) - 9001 format(A100) - close(10) - nseq1=i -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -ccccccccc read data from the second CA file: - open(unit=10,file=pdb(2),status='old') - i=0 - do while (.true.) - read(10,9001,end=1011) s - if(i.gt.0.and.s(1:3).eq.'TER')goto 1011 - if(s(1:3).eq.'ATO')then - if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.or. - & s(13:16).eq.' CA')then - if(s(17:17).eq.' '.or.s(17:17).eq.'A')then - i=i+1 - read(s,9000)du,aanam,du,mm2(i),du, - $ xa(1,i,1),xa(2,i,1),xa(3,i,1) - do j=-1,20 - if(aanam.eq.aa(j))seq2(i)=slc(j) - enddo - ss2(i)=aanam - if(i.ge.nmax)goto 1011 - endif - endif - endif - enddo - 1011 continue - close(10) - nseq2=i -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -*!!! Scale of TM-score in search is based on the smaller protein ---------> - d0_min=0.5 - if(m_d0_min.eq.1)then - d0_min=d0_min_input !for search - endif - anseq_min=min(nseq1,nseq2) - anseq=anseq_min !length for defining TMscore in search - d8=1.5*anseq_min**0.3+3.5 !remove pairs with dis>d8 during search & final - if(anseq.gt.15)then - d0=1.24*(anseq-15)**(1.0/3.0)-1.8 !scale for defining TM-score - else - d0=d0_min - endif - if(d0.lt.d0_min)d0=d0_min - if(m_d0.eq.1)d0=d0_fix - d00=d0 !for quickly calculate TM-score in searching - if(d00.gt.8)d00=8 - if(d00.lt.4.5)d00=4.5 - d002=d00**2 - nseq=max(nseq1,nseq2) - do i=1,nseq - n1(i)=i - n2(i)=i - enddo - -***** do alignment ************************** - CALL super_align !to find invmap(j) - -************************************************************ -*** resuperpose to find residues of dis - n_al=0 - do j=1,nseq2 - if(invmap0(j).gt.0)then - i=invmap0(j) - n_al=n_al+1 - xtm1(n_al)=xa(1,i,0) - ytm1(n_al)=xa(2,i,0) - ztm1(n_al)=xa(3,i,0) - xtm2(n_al)=xa(1,j,1) - ytm2(n_al)=xa(2,j,1) - ztm2(n_al)=xa(3,j,1) - m1(n_al)=i !for recording residue order - m2(n_al)=j - endif - enddo - d0_input=d0 - call TMscore8(d0_input,n_al,xtm1,ytm1,ztm1,n1,n_al, - & xtm2,ytm2,ztm2,n2,TM,Rcomm,Lcomm) !TM-score with dis - d0_min=0.5 !for output - anseq=nseq2 !length for defining final TMscore - if(m_ave.eq.1)anseq=(nseq1+nseq2)/2.0 ! - if(m_ave.eq.2)anseq=min(nseq1,nseq2) - if(m_ave.eq.3)anseq=max(nseq1,nseq2) - if(anseq.lt.anseq_min)anseq=anseq_min - if(m_fix.eq.1)anseq=L_fix !input length - if(anseq.gt.15)then - d0=1.24*(anseq-15)**(1.0/3.0)-1.8 !scale for defining TM-score - else - d0=d0_min - endif - if(d0.lt.d0_min)d0=d0_min - if(m_d0.eq.1)d0=d0_fix - -*** remove dis>d8 in normal TM-score calculation for final report-----> - j=0 - n_eq=0 - do i=1,n_al - dis2=sqrt((xtm1(i)-xtm2(i))**2+(ytm1(i)-ytm2(i))**2+ - & (ztm1(i)-ztm2(i))**2) - if(dis2.le.d8)then - j=j+1 - xtm1(j)=xtm1(i) - ytm1(j)=ytm1(i) - ztm1(j)=ztm1(i) - xtm2(j)=xtm2(i) - ytm2(j)=ytm2(i) - ztm2(j)=ztm2(i) - m1(j)=m1(i) - m2(j)=m2(i) - if(ss1(m1(i)).eq.ss2(m2(i)))then - n_eq=n_eq+1 - endif - endif - enddo - seq_id=float(n_eq)/(n_al+0.00000001) - n8_al=j - d0_input=d0 - call TMscore(d0_input,n8_al,xtm1,ytm1,ztm1,n1,n8_al, - & xtm2,ytm2,ztm2,n2,TM8,Rcomm,Lcomm) !normal TMscore - rmsd8_al=Rcomm - TM8=TM8*n8_al/anseq !TM-score after cutoff - -********* for output summary ****************************** - write(*,*) - write(*,*)'*****************************************************', - & '*********************' - write(*,*)'* TM-align ', - & ' *' - write(*,*)'* A protein structural alignment algorithm based on T', - & 'M-score *' - write(*,*)'* Reference: Y. Zhang and J. Skolnick, Nucl. Acids Re', - & 's. 2005 33, 2302-9 *' - write(*,*)'* Comments on the program, please email to: yzhang@ku', - & '.edu *' - write(*,*)'*****************************************************', - & '*********************' - write(*,*) - write(*,101)pdb(1),nseq1 - 101 format('Chain 1:',A10,' Size=',I4) - write(*,102)pdb(2),nseq2,int(anseq) - 102 format('Chain 2:',A10,' Size=',I4, - & ' (TM-score is normalized by ',I4,')') - write(*,*) - write(*,103)n8_al,rmsd8_al,TM8,seq_id - 103 format('Aligned length=',I4,', RMSD=',f6.2, - & ', TM-score=',f7.5,', ID=',f5.3) - write(*,*) - -********* extract rotation matrix ------------> - L=0 - do i=1,n8_al - k=m1(i) - L=L+1 - r_1(1,L)=xa(1,k,0) - r_1(2,L)=xa(2,k,0) - r_1(3,L)=xa(3,k,0) - r_2(1,L)=xtm1(i) - r_2(2,L)=ytm1(i) - r_2(3,L)=ztm1(i) - enddo - if(L.gt.3)then - call u3b(w,r_1,r_2,L,1,rms,u,t,ier) !u rotate r_1 to r_2 - armsd=dsqrt(rms/L) - write(*,*)'-------- rotation matrix to rotate Chain-1 to ', - & 'Chain-2 ------' - write(*,*)'i t(i) u(i,1) u(i,2) ', - & ' u(i,3)' - do i=1,3 - write(*,204)i,t(i),u(i,1),u(i,2),u(i,3) - enddo -c do i=1,nseq1 -c ax=t(1)+u(1,1)*xa(1,i,0)+u(1,2)*xa(2,i,0)+u(1,3)*xa(3,i,0) -c ay=t(2)+u(2,1)*xa(1,i,0)+u(2,2)*xa(2,i,0)+u(2,3)*xa(3,i,0) -c az=t(3)+u(3,1)*xa(1,i,0)+u(3,2)*xa(2,i,0)+u(3,3)*xa(3,i,0) -c enddo - write(*,*) - endif - 204 format(I2,f18.10,f15.10,f15.10,f15.10) - -********* for output superposition ****************************** - if(m_out.eq.1)then - 1237 format('ATOM ',i5,' CA ',A3,I6,4X,3F8.3) - 1238 format('TER') - 1239 format('CONECT',I5,I5) - 900 format(A) - 901 format('select atomno=',I4) - 104 format('REMARK Chain 1:',A10,' Size=',I4) - 105 format('REMARK Chain 2:',A10,' Size=',I4, - & ' (TM-score is normalized by ',I4,')') - 106 format('REMARK Aligned length=',I4,', RMSD=',f6.2, - & ', TM-score=',f7.5,', ID=',f5.3) - OPEN(unit=7,file=outname,status='unknown') !pdb1.aln + pdb2.aln -*** script: - write(7,900)'load inline' - write(7,900)'select atomno<2000' - write(7,900)'wireframe .45' - write(7,900)'select none' - write(7,900)'select atomno>2000' - write(7,900)'wireframe .20' - write(7,900)'color white' - do i=1,n8_al - dis2=sqrt((xtm1(i)-xtm2(i))**2+ - & (ytm1(i)-ytm2(i))**2+(ztm1(i)-ztm2(i))**2) - if(dis2.le.5)then - write(7,901)m1(i) - write(7,900)'color red' - write(7,901)2000+m2(i) - write(7,900)'color red' - endif - enddo - write(7,900)'select all' - write(7,900)'exit' - write(7,104)pdb(1),nseq1 - write(7,105)pdb(2),nseq2,int(anseq) - write(7,106)n8_al,rmsd8_al,TM8,seq_id -*** chain1: - do i=1,n8_al - write(7,1237)m1(i),ss1(m1(i)),mm1(m1(i)), - & xtm1(i),ytm1(i),ztm1(i) - enddo - write(7,1238) !TER - do i=2,n8_al - write(7,1239)m1(i-1),m1(i) !connect atoms - enddo -*** chain2: - do i=1,n8_al - write(7,1237)2000+m2(i),ss2(m2(i)),mm2(m2(i)), - $ xtm2(i),ytm2(i),ztm2(i) - enddo - write(7,1238) - do i=2,n8_al - write(7,1239)2000+m2(i-1),2000+m2(i) - enddo - close(7) -ccc - k=0 - outnameall_tmp=outname//'_all' - outnameall='' - do i=1,200 - if(outnameall_tmp(i:i).ne.' ')then - k=k+1 - outnameall(k:k)=outnameall_tmp(i:i) - endif - enddo - OPEN(unit=8,file=outnameall,status='unknown') !pdb1.aln + pdb2.aln -*** script: - write(8,900)'load inline' - write(8,900)'select atomno<2000' - write(8,900)'wireframe .45' - write(8,900)'select none' - write(8,900)'select atomno>2000' - write(8,900)'wireframe .20' - write(8,900)'color white' - do i=1,n8_al - dis2=sqrt((xtm1(i)-xtm2(i))**2+ - & (ytm1(i)-ytm2(i))**2+(ztm1(i)-ztm2(i))**2) - if(dis2.le.5)then - write(8,901)m1(i) - write(8,900)'color red' - write(8,901)2000+m2(i) - write(8,900)'color red' - endif - enddo - write(8,900)'select all' - write(8,900)'exit' - write(8,104)pdb(1),nseq1 - write(8,105)pdb(2),nseq2,int(anseq) - write(8,106)n8_al,rmsd8_al,TM8,seq_id -*** chain1: - do i=1,nseq1 - ax=t(1)+u(1,1)*xa(1,i,0)+u(1,2)*xa(2,i,0)+u(1,3)*xa(3,i,0) - ay=t(2)+u(2,1)*xa(1,i,0)+u(2,2)*xa(2,i,0)+u(2,3)*xa(3,i,0) - az=t(3)+u(3,1)*xa(1,i,0)+u(3,2)*xa(2,i,0)+u(3,3)*xa(3,i,0) - write(8,1237)i,ss1(i),mm1(i),ax,ay,az - enddo - write(8,1238) !TER - do i=2,nseq1 - write(8,1239)i-1,i - enddo -*** chain2: - do i=1,nseq2 - write(8,1237)2000+i,ss2(i),mm2(i), - $ xa(1,i,1),xa(2,i,1),xa(3,i,1) - enddo - write(8,1238) - do i=2,nseq2 - write(8,1239)2000+i-1,2000+i - enddo - close(8) - endif -*^^^^^^^^^^^^^^^^^^ output finished ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -************ output aligned sequences ************************** - ii=0 - i1_old=1 - i2_old=1 - do i=1,n8_al - do j=i1_old,m1(i)-1 - ii=ii+1 - aseq1(ii)=seq1(j) - aseq2(ii)='-' - aseq3(ii)=' ' - enddo - do j=i2_old,m2(i)-1 - ii=ii+1 - aseq1(ii)='-' - aseq2(ii)=seq2(j) - aseq3(ii)=' ' - enddo - ii=ii+1 - aseq1(ii)=seq1(m1(i)) - aseq2(ii)=seq2(m2(i)) - dis2=sqrt((xtm1(i)-xtm2(i))**2+ - & (ytm1(i)-ytm2(i))**2+(ztm1(i)-ztm2(i))**2) - if(dis2.le.5)then - aseq3(ii)=':' - else - aseq3(ii)='.' - endif - i1_old=m1(i)+1 - i2_old=m2(i)+1 - enddo - do i=i1_old,nseq1 - ii=ii+1 - aseq1(ii)=seq1(i) - aseq2(ii)='-' - aseq3(ii)=' ' - enddo - do i=i2_old,nseq2 - ii=ii+1 - aseq1(ii)='-' - aseq2(ii)=seq2(i) - aseq3(ii)=' ' - enddo - write(*,50) - 50 format('(":" denotes the residue pairs of distance < 5.0 ', - & 'Angstrom)') - write(*,10)(aseq1(i),i=1,ii) - write(*,10)(aseq3(i),i=1,ii) - write(*,10)(aseq2(i),i=1,ii) - 10 format(10000A1) - write(*,*) - -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 9999 END - -*********************************************************************** -*********************************************************************** -* Structure superposition -*********************************************************************** -*********************************************************************** -*********************************************************************** - SUBROUTINE super_align - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - common/length/nseq1,nseq2 - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/zscore/zrms,n_al,rmsd_al - common/TM/TM,TMmax - common/init/invmap_i(nmax) - dimension gapp(100) - - TMmax=0 - n_gapp=2 - gapp(1)=-0.6 - gapp(2)=0 - -c n_gapp=11 -c do i=1,n_gapp -c gapp(i)=-(n_gapp-i) -c enddo - -*11111111111111111111111111111111111111111111111111111111 -* get initial alignment from gapless threading -********************************************************** - call get_initial !gapless threading - do i=1,nseq2 - invmap(i)=invmap_i(i) !with highest zcore - enddo - call get_score !TM, matrix score(i,j) - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - -***************************************************************** -* initerative alignment, for different gap_open: -***************************************************************** - DO 111 i_gapp=1,n_gapp !different gap panalties - GAP_OPEN=gapp(i_gapp) !gap panalty - do 222 id=1,30 !maximum interation is 200 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) -* Input: score(i,j), and gap_open -* Output: invmap(j) - - call get_score !calculate TM-score, score(i,j) -c record the best alignment in whole search ----------> - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - if(id.gt.1)then - diff=abs(TM-TM_old) - if(diff.lt.0.000001)goto 33 - endif - TM_old=TM - 222 continue - 33 continue - 111 continue - -*222222222222222222222222222222222222222222222222222222222 -* get initial alignment from secondary structure alignment -********************************************************** - call get_initial2 !DP for secondary structure - do i=1,nseq2 - invmap(i)=invmap_i(i) !with highest zcore - enddo - call get_score !TM, score(i,j) - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - -***************************************************************** -* initerative alignment, for different gap_open: -***************************************************************** - DO 1111 i_gapp=1,n_gapp !different gap panalties - GAP_OPEN=gapp(i_gapp) !gap panalty - do 2222 id=1,30 !maximum interation is 200 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) -* Input: score(i,j), and gap_open -* Output: invmap(j) - - call get_score !calculate TM-score, score(i,j) -c write(*,21)gap_open,rmsd_al,n_al,TM -c record the best alignment in whole search ----------> - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - if(id.gt.1)then - diff=abs(TM-TM_old) - if(diff.lt.0.000001)goto 333 - endif - TM_old=TM - 2222 continue - 333 continue - 1111 continue - -*333333333333333333333333333333333333333333333333333333333333 -* get initial alignment from invmap0+SS -************************************************************* - call get_initial3 !invmap0+SS - do i=1,nseq2 - invmap(i)=invmap_i(i) !with highest zcore - enddo - call get_score !TM, score(i,j) - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - -***************************************************************** -* initerative alignment, for different gap_open: -***************************************************************** - DO 1110 i_gapp=1,n_gapp !different gap panalties - GAP_OPEN=gapp(i_gapp) !gap panalty - do 2220 id=1,30 !maximum interation is 200 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) -* Input: score(i,j), and gap_open -* Output: invmap(j) - - call get_score !calculate TM-score, score(i,j) -c write(*,21)gap_open,rmsd_al,n_al,TM -c record the best alignment in whole search ----------> - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - if(id.gt.1)then - diff=abs(TM-TM_old) - if(diff.lt.0.000001)goto 330 - endif - TM_old=TM - 2220 continue - 330 continue - 1110 continue - -*444444444444444444444444444444444444444444444444444444444 -* get initial alignment of pieces from gapless threading -********************************************************** - call get_initial4 !gapless threading - do i=1,nseq2 - invmap(i)=invmap_i(i) !with highest zcore - enddo - call get_score !TM, matrix score(i,j) - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - -***************************************************************** -* initerative alignment, for different gap_open: -***************************************************************** - DO 44 i_gapp=2,n_gapp !different gap panalties - GAP_OPEN=gapp(i_gapp) !gap panalty - do 444 id=1,2 !maximum interation is 200 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) -* Input: score(i,j), and gap_open -* Output: invmap(j) - - call get_score !calculate TM-score, score(i,j) -c record the best alignment in whole search ----------> - if(TM.gt.TMmax)then - TMmax=TM - do j=1,nseq2 - invmap0(j)=invmap(j) - enddo - endif - 444 continue - 44 continue - -c^^^^^^^^^^^^^^^ best alignment invmap0(j) found ^^^^^^^^^^^^^^^^^^ - RETURN - END - -************************************************************** -* get initial alignment invmap0(i) from gapless threading -************************************************************** - subroutine get_initial - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - common/length/nseq1,nseq2 - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/zscore/zrms,n_al,rmsd_al - common/TM/TM,TMmax - common/init/invmap_i(nmax) - - aL=min(nseq1,nseq2) - idel=aL/2.5 !minimum size of considered fragment - if(idel.le.5)idel=5 - n1=-nseq2+idel - n2=nseq1-idel - GL_max=0 - do ishift=n1,n2 - L=0 - do j=1,nseq2 - i=j+ishift - if(i.ge.1.and.i.le.nseq1)then - L=L+1 - invmap(j)=i - else - invmap(j)=-1 - endif - enddo - if(L.ge.idel)then - call get_GL(GL) - if(GL.gt.GL_max)then - GL_max=GL - do i=1,nseq2 - invmap_i(i)=invmap(i) - enddo - endif - endif - enddo - - return - end - -************************************************************** -* get initial alignment invmap0(i) from secondary structure -************************************************************** - subroutine get_initial2 - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - common/length/nseq1,nseq2 - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/zscore/zrms,n_al,rmsd_al - common/TM/TM,TMmax - common/sec/isec(nmax),jsec(nmax) - common/init/invmap_i(nmax) - -********** assign secondary structures *************** -c 1->coil, 2->helix, 3->turn, 4->strand - do i=1,nseq1 - isec(i)=1 - j1=i-2 - j2=i-1 - j3=i - j4=i+1 - j5=i+2 - if(j1.ge.1.and.j5.le.nseq1)then - dis13=diszy(0,j1,j3) - dis14=diszy(0,j1,j4) - dis15=diszy(0,j1,j5) - dis24=diszy(0,j2,j4) - dis25=diszy(0,j2,j5) - dis35=diszy(0,j3,j5) - isec(i)=make_sec(dis13,dis14,dis15,dis24,dis25,dis35) - endif - enddo - do i=1,nseq2 - jsec(i)=1 - j1=i-2 - j2=i-1 - j3=i - j4=i+1 - j5=i+2 - if(j1.ge.1.and.j5.le.nseq2)then - dis13=diszy(1,j1,j3) - dis14=diszy(1,j1,j4) - dis15=diszy(1,j1,j5) - dis24=diszy(1,j2,j4) - dis25=diszy(1,j2,j5) - dis35=diszy(1,j3,j5) - jsec(i)=make_sec(dis13,dis14,dis15,dis24,dis25,dis35) - endif - enddo - call smooth !smooth the assignment - -********** score matrix ************************** - do i=1,nseq1 - do j=1,nseq2 - if(isec(i).eq.jsec(j))then - score(i,j)=1 - else - score(i,j)=0 - endif - enddo - enddo - -********** find initial alignment: invmap(j) ************ - gap_open=-1.0 !should be -1 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) - do i=1,nseq2 - invmap_i(i)=invmap(i) - enddo - -*^^^^^^^^^^^^ initial alignment done ^^^^^^^^^^^^^^^^^^^^^^ - return - end - -************************************************************** -* get initial alignment invmap0(i) from secondary structure -* and previous alignments -************************************************************** - subroutine get_initial3 - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - common/length/nseq1,nseq2 - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/zscore/zrms,n_al,rmsd_al - common/TM/TM,TMmax - common/sec/isec(nmax),jsec(nmax) - common/init/invmap_i(nmax) - -********** score matrix ************************** - do i=1,nseq2 - invmap(i)=invmap0(i) - enddo - call get_score1 !get score(i,j) using RMSD martix - do i=1,nseq1 - do j=1,nseq2 - if(isec(i).eq.jsec(j))then - score(i,j)=0.5+score(i,j) - else - score(i,j)=score(i,j) - endif - enddo - enddo - -********** find initial alignment: invmap(j) ************ - gap_open=-1.0 !should be -1 - call DP(NSEQ1,NSEQ2) !produce alignment invmap(j) - do i=1,nseq2 - invmap_i(i)=invmap(i) - enddo - -*^^^^^^^^^^^^ initial alignment done ^^^^^^^^^^^^^^^^^^^^^^ - return - end - -************************************************************** -* get initial alignment invmap0(i) from fragment gapless threading -************************************************************** - subroutine get_initial4 - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - common/length/nseq1,nseq2 - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/alignrst/invmap0(nmax) - common/zscore/zrms,n_al,rmsd_al - common/TM/TM,TMmax - common/init/invmap_i(nmax) - common/initial4/mm1(nmax),mm2(nmax) - logical contin - - dimension ifr2(2,nmax,nmax),Lfr2(2,nmax),Lfr_max2(2),i_fr2(2) - dimension ifr(nmax) - dimension mm(2,nmax) - - fra_min=4 !>=4,minimum fragment for search - fra_min1=fra_min-1 !cutoff for shift, save time - dcu0=3.85 - dcu_min=3.65 - -ccc Find the smallest continuous fragments --------> - do i=1,nseq1 - mm(1,i)=mm1(i) - enddo - do i=1,nseq2 - mm(2,i)=mm2(i) - enddo - do k=1,2 - dcu=dcu0 - if(k.eq.1)then - nseq0=nseq1 - r_min=nseq1/3.0 !minimum fragment, in case too small protein - else - nseq0=nseq2 - r_min=nseq2/3.0 !minimum fragment, in case too small protein - endif - if(r_min.gt.fra_min)r_min=fra_min - 20 nfr=1 !number of fragments - j=1 !number of residue at nf-fragment - ifr2(k,nfr,j)=1 !what residue - Lfr2(k,nfr)=j !length of the fragment - do i=2,nseq0 - dis=diszy(k-1,i-1,i) - contin=.false. - if(dcu.gt.dcu0)then - if(dis.lt.dcu)then - if(dis.gt.dcu_min)then - contin=.true. - endif - endif - elseif(mm(k,i).eq.(mm(k,i-1)+1))then - if(dis.lt.dcu)then - if(dis.gt.dcu_min)then - contin=.true. - endif - endif - endif - if(contin)then - j=j+1 - ifr2(k,nfr,j)=i - Lfr2(k,nfr)=j - else - nfr=nfr+1 - j=1 - ifr2(k,nfr,j)=i - Lfr2(k,nfr)=j - endif - enddo - Lfr_max=0 - i_fr2(k)=1 !ID of the maximum piece - do i=1,nfr - if(Lfr_max.lt.Lfr2(k,i))then - Lfr_max=Lfr2(k,i) - i_fr2(k)=i - endif - enddo - if(Lfr_max.lt.r_min)then - dcu=1.1*dcu - goto 20 - endif - enddo -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -ccc select what piece will be used (this may araise ansysmetry, but -ccc only when L1=L2 and Lfr1=Lfr2 and L1 ne Lfr1 -ccc if L1=Lfr1 and L2=Lfr2 (normal proteins), it will be the same as initial1 - mark=1 - if(Lfr2(1,i_fr2(1)).lt.Lfr2(2,i_fr2(2)))then - mark=1 - elseif(Lfr2(1,i_fr2(1)).gt.Lfr2(2,i_fr2(2)))then - mark=2 - else !Lfr1=Lfr2 - if(nseq1.le.nseq2)then - mark=1 - else - mark=2 - endif - endif -ccc - L_fr=Lfr2(mark,i_fr2(mark)) - do i=1,L_fr - ifr(i)=ifr2(mark,i_fr2(mark),i) - enddo -ccc - if(mark.eq.1)then !non-redundant to get_initial1 - nseq0=nseq1 - else - nseq0=nseq2 - endif - if(L_fr.eq.nseq0)then - n1=int(nseq0*0.1) !0 - n2=int(nseq0*0.89) !2 - j=0 - do i=n1,n2 - j=j+1 - ifr(j)=ifr(n1+j) - enddo - L_fr=j - endif - -ccc get initial -------------> - if(mark.eq.1)then !nseq1 as the smallest one - nseq1_=L_fr - aL=min(nseq1_,nseq2) - idel=aL/2.5 !minimum size of considered fragment - if(idel.le.fra_min1)idel=fra_min1 - n1=-nseq2+idel !shift1 - n2=nseq1_-idel !shift2 - GL_max=0 - do ishift=n1,n2 - L=0 - do j=1,nseq2 - i=j+ishift - if(i.ge.1.and.i.le.nseq1_)then - L=L+1 - invmap(j)=ifr(i) - else - invmap(j)=-1 - endif - enddo - if(L.ge.idel)then - call get_GL(GL) - if(GL.gt.GL_max)then - GL_max=GL - do i=1,nseq2 - invmap_i(i)=invmap(i) - enddo - endif - endif - enddo - else !@@@@@@@@@@@@@@@@@@@@ - nseq2_=L_fr - aL=min(nseq1,nseq2_) - idel=aL/2.5 !minimum size of considered fragment - if(idel.le.fra_min1)idel=fra_min1 - n1=-nseq2_+idel - n2=nseq1-idel - GL_max=0 - do ishift=n1,n2 - L=0 - do j=1,nseq2 - invmap(j)=-1 - enddo - do j=1,nseq2_ - i=j+ishift - if(i.ge.1.and.i.le.nseq1)then - L=L+1 - invmap(ifr(j))=i - endif - enddo - if(L.ge.idel)then - call get_GL(GL) - if(GL.gt.GL_max)then - GL_max=GL - do i=1,nseq2 - invmap_i(i)=invmap(i) - enddo - endif - endif - enddo - endif - - return - end - -************************************************************** -* smooth the secondary structure assignment -************************************************************** - subroutine smooth - PARAMETER(nmax=5000) - common/sec/isec(nmax),jsec(nmax) - common/length/nseq1,nseq2 - -*** smooth single --------------> -*** --x-- => ----- - do i=1,nseq1 - if(isec(i).eq.2.or.isec(i).eq.4)then - j=isec(i) - if(isec(i-2).ne.j)then - if(isec(i-1).ne.j)then - if(isec(i+1).ne.j)then - if(isec(i+1).ne.j)then - isec(i)=1 - endif - endif - endif - endif - endif - enddo - do i=1,nseq2 - if(jsec(i).eq.2.or.jsec(i).eq.4)then - j=jsec(i) - if(jsec(i-2).ne.j)then - if(jsec(i-1).ne.j)then - if(jsec(i+1).ne.j)then - if(jsec(i+1).ne.j)then - jsec(i)=1 - endif - endif - endif - endif - endif - enddo - -*** smooth double --------------> -*** --xx-- => ------ - do i=1,nseq1 - if(isec(i).ne.2)then - if(isec(i+1).ne.2)then - if(isec(i+2).eq.2)then - if(isec(i+3).eq.2)then - if(isec(i+4).ne.2)then - if(isec(i+5).ne.2)then - isec(i+2)=1 - isec(i+3)=1 - endif - endif - endif - endif - endif - endif - - if(isec(i).ne.4)then - if(isec(i+1).ne.4)then - if(isec(i+2).eq.4)then - if(isec(i+3).eq.4)then - if(isec(i+4).ne.4)then - if(isec(i+5).ne.4)then - isec(i+2)=1 - isec(i+3)=1 - endif - endif - endif - endif - endif - endif - enddo - do i=1,nseq2 - if(jsec(i).ne.2)then - if(jsec(i+1).ne.2)then - if(jsec(i+2).eq.2)then - if(jsec(i+3).eq.2)then - if(jsec(i+4).ne.2)then - if(jsec(i+5).ne.2)then - jsec(i+2)=1 - jsec(i+3)=1 - endif - endif - endif - endif - endif - endif - - if(jsec(i).ne.4)then - if(jsec(i+1).ne.4)then - if(jsec(i+2).eq.4)then - if(jsec(i+3).eq.4)then - if(jsec(i+4).ne.4)then - if(jsec(i+5).ne.4)then - jsec(i+2)=1 - jsec(i+3)=1 - endif - endif - endif - endif - endif - endif - enddo - -*** connect --------------> -*** x-x => xxx - do i=1,nseq1 - if(isec(i).eq.2)then - if(isec(i+1).ne.2)then - if(isec(i+2).eq.2)then - isec(i+1)=2 - endif - endif - endif - - if(isec(i).eq.4)then - if(isec(i+1).ne.4)then - if(isec(i+2).eq.4)then - isec(i+1)=4 - endif - endif - endif - enddo - do i=1,nseq2 - if(jsec(i).eq.2)then - if(jsec(i+1).ne.2)then - if(jsec(i+2).eq.2)then - jsec(i+1)=2 - endif - endif - endif - - if(jsec(i).eq.4)then - if(jsec(i+1).ne.4)then - if(jsec(i+2).eq.4)then - jsec(i+1)=4 - endif - endif - endif - enddo - - return - end - -************************************************************* -* assign secondary structure: -************************************************************* - function diszy(i,i1,i2) - PARAMETER(nmax=5000) - COMMON/BACKBONE/XA(3,nmax,0:1) - diszy=sqrt((xa(1,i1,i)-xa(1,i2,i))**2 - & +(xa(2,i1,i)-xa(2,i2,i))**2 - & +(xa(3,i1,i)-xa(3,i2,i))**2) - return - end - -************************************************************* -* assign secondary structure: -************************************************************* - function make_sec(dis13,dis14,dis15,dis24,dis25,dis35) - make_sec=1 - delta=2.1 - if(abs(dis15-6.37).lt.delta)then - if(abs(dis14-5.18).lt.delta)then - if(abs(dis25-5.18).lt.delta)then - if(abs(dis13-5.45).lt.delta)then - if(abs(dis24-5.45).lt.delta)then - if(abs(dis35-5.45).lt.delta)then - make_sec=2 !helix - return - endif - endif - endif - endif - endif - endif - delta=1.42 - if(abs(dis15-13).lt.delta)then - if(abs(dis14-10.4).lt.delta)then - if(abs(dis25-10.4).lt.delta)then - if(abs(dis13-6.1).lt.delta)then - if(abs(dis24-6.1).lt.delta)then - if(abs(dis35-6.1).lt.delta)then - make_sec=4 !strand - return - endif - endif - endif - endif - endif - endif - if(dis15.lt.8)then - make_sec=3 - endif - - return - end - -**************************************************************** -* quickly calculate TM-score with given invmap(i) in 3 iterations -**************************************************************** - subroutine get_GL(GL) - PARAMETER(nmax=5000) - common/length/nseq1,nseq2 - COMMON/BACKBONE/XA(3,nmax,0:1) - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/zscore/zrms,n_al,rmsd_al - common/d0/d0,anseq - dimension xtm1(nmax),ytm1(nmax),ztm1(nmax) - dimension xtm2(nmax),ytm2(nmax),ztm2(nmax) - common/TM/TM,TMmax - common/n1n2/n1(nmax),n2(nmax) - common/d00/d00,d002 - - dimension xo1(nmax),yo1(nmax),zo1(nmax) - dimension xo2(nmax),yo2(nmax),zo2(nmax) - dimension dis2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - -c calculate RMSD between aligned structures and rotate the structures --> - n_al=0 - do j=1,NSEQ2 - i=invmap(j) !j aligned to i - if(i.gt.0)then - n_al=n_al+1 - r_1(1,n_al)=xa(1,i,0) - r_1(2,n_al)=xa(2,i,0) - r_1(3,n_al)=xa(3,i,0) - r_2(1,n_al)=xa(1,j,1) - r_2(2,n_al)=xa(2,j,1) - r_2(3,n_al)=xa(3,j,1) - xo1(n_al)=xa(1,i,0) - yo1(n_al)=xa(2,i,0) - zo1(n_al)=xa(3,i,0) - xo2(n_al)=xa(1,j,1) - yo2(n_al)=xa(2,j,1) - zo2(n_al)=xa(3,j,1) - endif - enddo - call u3b(w,r_1,r_2,n_al,1,rms,u,t,ier) !u rotate r_1 to r_2 - GL=0 - do i=1,n_al - xx=t(1)+u(1,1)*xo1(i)+u(1,2)*yo1(i)+u(1,3)*zo1(i) - yy=t(2)+u(2,1)*xo1(i)+u(2,2)*yo1(i)+u(2,3)*zo1(i) - zz=t(3)+u(3,1)*xo1(i)+u(3,2)*yo1(i)+u(3,3)*zo1(i) - dis2(i)=(xx-xo2(i))**2+(yy-yo2(i))**2+(zz-zo2(i))**2 - GL=GL+1/(1+dis2(i)/(d0**2)) - enddo -ccc for next iteration-------------> - d002t=d002 - 21 j=0 - do i=1,n_al - if(dis2(i).le.d002t)then - j=j+1 - r_1(1,j)=xo1(i) - r_1(2,j)=yo1(i) - r_1(3,j)=zo1(i) - r_2(1,j)=xo2(i) - r_2(2,j)=yo2(i) - r_2(3,j)=zo2(i) - endif - enddo - if(j.lt.3.and.n_al.gt.3)then - d002t=d002t+.5 - goto 21 - endif - L=j - call u3b(w,r_1,r_2,L,1,rms,u,t,ier) !u rotate r_1 to r_2 - G2=0 - do i=1,n_al - xx=t(1)+u(1,1)*xo1(i)+u(1,2)*yo1(i)+u(1,3)*zo1(i) - yy=t(2)+u(2,1)*xo1(i)+u(2,2)*yo1(i)+u(2,3)*zo1(i) - zz=t(3)+u(3,1)*xo1(i)+u(3,2)*yo1(i)+u(3,3)*zo1(i) - dis2(i)=(xx-xo2(i))**2+(yy-yo2(i))**2+(zz-zo2(i))**2 - G2=G2+1/(1+dis2(i)/(d0**2)) - enddo -ccc for next iteration-------------> - d002t=d002+1 - 22 j=0 - do i=1,n_al - if(dis2(i).le.d002t)then - j=j+1 - r_1(1,j)=xo1(i) - r_1(2,j)=yo1(i) - r_1(3,j)=zo1(i) - r_2(1,j)=xo2(i) - r_2(2,j)=yo2(i) - r_2(3,j)=zo2(i) - endif - enddo - if(j.lt.3.and.n_al.gt.3)then - d002t=d002t+.5 - goto 22 - endif - L=j - call u3b(w,r_1,r_2,L,1,rms,u,t,ier) !u rotate r_1 to r_2 - G3=0 - do i=1,n_al - xx=t(1)+u(1,1)*xo1(i)+u(1,2)*yo1(i)+u(1,3)*zo1(i) - yy=t(2)+u(2,1)*xo1(i)+u(2,2)*yo1(i)+u(2,3)*zo1(i) - zz=t(3)+u(3,1)*xo1(i)+u(3,2)*yo1(i)+u(3,3)*zo1(i) - dis2(i)=(xx-xo2(i))**2+(yy-yo2(i))**2+(zz-zo2(i))**2 - G3=G3+1/(1+dis2(i)/(d0**2)) - enddo - if(G2.gt.GL)GL=G2 - if(G3.gt.GL)GL=G3 - -c^^^^^^^^^^^^^^^^ GL done ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - end - -**************************************************************** -* with invmap(i) calculate TM-score and martix score(i,j) for rotation -**************************************************************** - subroutine get_score - PARAMETER(nmax=5000) - common/length/nseq1,nseq2 - COMMON/BACKBONE/XA(3,nmax,0:1) - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/zscore/zrms,n_al,rmsd_al - common/d0/d0,anseq - dimension xtm1(nmax),ytm1(nmax),ztm1(nmax) - dimension xtm2(nmax),ytm2(nmax),ztm2(nmax) - common/TM/TM,TMmax - common/n1n2/n1(nmax),n2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - -c calculate RMSD between aligned structures and rotate the structures --> - n_al=0 - do j=1,NSEQ2 - i=invmap(j) !j aligned to i - if(i.gt.0)then - n_al=n_al+1 -ccc for TM-score: - xtm1(n_al)=xa(1,i,0) !for TM-score - ytm1(n_al)=xa(2,i,0) - ztm1(n_al)=xa(3,i,0) - xtm2(n_al)=xa(1,j,1) - ytm2(n_al)=xa(2,j,1) - ztm2(n_al)=xa(3,j,1) -ccc for rotation matrix: - r_1(1,n_al)=xa(1,i,0) - r_1(2,n_al)=xa(2,i,0) - r_1(3,n_al)=xa(3,i,0) - endif - enddo -*** calculate TM-score for the given alignment-----------> - d0_input=d0 - call TMscore8_search(d0_input,n_al,xtm1,ytm1,ztm1,n1, - & n_al,xtm2,ytm2,ztm2,n2,TM,Rcomm,Lcomm) !simplified search engine - TM=TM*n_al/anseq !TM-score -*** calculate score matrix score(i,j)------------------> - do i=1,n_al - r_2(1,i)=xtm1(i) - r_2(2,i)=ytm1(i) - r_2(3,i)=ztm1(i) - enddo - call u3b(w,r_1,r_2,n_al,1,rms,u,t,ier) !u rotate r_1 to r_2 - do i=1,nseq1 - xx=t(1)+u(1,1)*xa(1,i,0)+u(1,2)*xa(2,i,0)+u(1,3)*xa(3,i,0) - yy=t(2)+u(2,1)*xa(1,i,0)+u(2,2)*xa(2,i,0)+u(2,3)*xa(3,i,0) - zz=t(3)+u(3,1)*xa(1,i,0)+u(3,2)*xa(2,i,0)+u(3,3)*xa(3,i,0) - do j=1,nseq2 - dd=(xx-xa(1,j,1))**2+(yy-xa(2,j,1))**2+(zz-xa(3,j,1))**2 - score(i,j)=1/(1+dd/d0**2) - enddo - enddo - -c^^^^^^^^^^^^^^^^ score(i,j) done ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - end - -**************************************************************** -* with invmap(i) calculate score(i,j) using RMSD rotation -**************************************************************** - subroutine get_score1 - PARAMETER(nmax=5000) - common/length/nseq1,nseq2 - COMMON/BACKBONE/XA(3,nmax,0:1) - common/dpc/score(nmax,nmax),gap_open,invmap(nmax) - common/zscore/zrms,n_al,rmsd_al - common/d0/d0,anseq - common/d0min/d0_min - dimension xtm1(nmax),ytm1(nmax),ztm1(nmax) - dimension xtm2(nmax),ytm2(nmax),ztm2(nmax) - common/TM/TM,TMmax - common/n1n2/n1(nmax),n2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - -c calculate RMSD between aligned structures and rotate the structures --> - n_al=0 - do j=1,NSEQ2 - i=invmap(j) !j aligned to i - if(i.gt.0)then - n_al=n_al+1 -ccc for rotation matrix: - r_1(1,n_al)=xa(1,i,0) - r_1(2,n_al)=xa(2,i,0) - r_1(3,n_al)=xa(3,i,0) - r_2(1,n_al)=xa(1,j,1) - r_2(2,n_al)=xa(2,j,1) - r_2(3,n_al)=xa(3,j,1) - endif - enddo -*** calculate score matrix score(i,j)------------------> - call u3b(w,r_1,r_2,n_al,1,rms,u,t,ier) !u rotate r_1 to r_2 - d01=d0+1.5 - if(d01.lt.d0_min)d01=d0_min - d02=d01*d01 - do i=1,nseq1 - xx=t(1)+u(1,1)*xa(1,i,0)+u(1,2)*xa(2,i,0)+u(1,3)*xa(3,i,0) - yy=t(2)+u(2,1)*xa(1,i,0)+u(2,2)*xa(2,i,0)+u(2,3)*xa(3,i,0) - zz=t(3)+u(3,1)*xa(1,i,0)+u(3,2)*xa(2,i,0)+u(3,3)*xa(3,i,0) - do j=1,nseq2 - dd=(xx-xa(1,j,1))**2+(yy-xa(2,j,1))**2+(zz-xa(3,j,1))**2 - score(i,j)=1/(1+dd/d02) - enddo - enddo - -c^^^^^^^^^^^^^^^^ score(i,j) done ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - end - - -************************************************************************* -************************************************************************* -* This is a subroutine to compare two structures and find the -* superposition that has the maximum TM-score. -* -* L1--Length of the first structure -* (x1(i),y1(i),z1(i))--coordinates of i'th residue at the first structure -* n1(i)--Residue sequence number of i'th residue at the first structure -* L2--Length of the second structure -* (x2(i),y2(i),z2(i))--coordinates of i'th residue at the second structure -* n2(i)--Residue sequence number of i'th residue at the second structure -* TM--TM-score of the comparison -* Rcomm--RMSD of two structures in the common aligned residues -* Lcomm--Length of the common aligned regions -* -* Note: -* 1, Always put native as the second structure, by which TM-score -* is normalized. -* 2, The returned (x1(i),y1(i),z1(i)) are the rotated structure after -* TM-score superposition. -************************************************************************* -************************************************************************* -*** dis<8, simplified search engine - subroutine TMscore8_search(dx,L1,x1,y1,z1,n1,L2,x2,y2,z2,n2, - & TM,Rcomm,Lcomm) - PARAMETER(nmax=5000) - common/stru/xt(nmax),yt(nmax),zt(nmax),xb(nmax),yb(nmax),zb(nmax) - common/nres/nresA(nmax),nresB(nmax),nseqA,nseqB - common/para/d,d0 - common/d0min/d0_min - common/align/n_ali,iA(nmax),iB(nmax) - common/nscore/i_ali(nmax),n_cut ![1,n_ali],align residues for the score - dimension k_ali(nmax),k_ali0(nmax) - dimension L_ini(100),iq(nmax) - common/scores/score - double precision score,score_max - dimension xa(nmax),ya(nmax),za(nmax) - dimension iL0(nmax) - - dimension x1(nmax),y1(nmax),z1(nmax),n1(nmax) - dimension x2(nmax),y2(nmax),z2(nmax),n2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - -********* convert input data *************************** -* because L1=L2 in this special case----------> - nseqA=L1 - nseqB=L2 - do i=1,nseqA - xa(i)=x1(i) - ya(i)=y1(i) - za(i)=z1(i) - nresA(i)=n1(i) - xb(i)=x2(i) - yb(i)=y2(i) - zb(i)=z2(i) - nresB(i)=n2(i) - iA(i)=i - iB(i)=i - enddo - n_ali=L1 !number of aligned residues - Lcomm=L1 - -************///// -* parameters: -***************** -*** d0-------------> - d0=dx - if(d0.lt.d0_min)d0=d0_min -*** d0_search -----> - d0_search=d0 - if(d0_search.gt.8)d0_search=8 - if(d0_search.lt.4.5)d0_search=4.5 -*** iterative parameters -----> - n_it=20 !maximum number of iterations - d_output=5 !for output alignment - n_init_max=6 !maximum number of L_init - n_init=0 - L_ini_min=4 - if(n_ali.lt.4)L_ini_min=n_ali - do i=1,n_init_max-1 - n_init=n_init+1 - L_ini(n_init)=n_ali/2**(n_init-1) - if(L_ini(n_init).le.L_ini_min)then - L_ini(n_init)=L_ini_min - goto 402 - endif - enddo - n_init=n_init+1 - L_ini(n_init)=L_ini_min - 402 continue - -****************************************************************** -* find the maximum score starting from local structures superposition -****************************************************************** - score_max=-1 !TM-score - do 333 i_init=1,n_init - L_init=L_ini(i_init) - iL_max=n_ali-L_init+1 - k=0 - do i=1,iL_max,40 !this is the simplification! - k=k+1 - iL0(k)=i - enddo - if(iL0(k).lt.iL_max)then - k=k+1 - iL0(k)=iL_max - endif - n_shift=k - do 300 i_shift=1,n_shift - iL=iL0(i_shift) - LL=0 - ka=0 - do i=1,L_init - k=iL+i-1 ![1,n_ali] common aligned - r_1(1,i)=xa(iA(k)) - r_1(2,i)=ya(iA(k)) - r_1(3,i)=za(iA(k)) - r_2(1,i)=xb(iB(k)) - r_2(2,i)=yb(iB(k)) - r_2(3,i)=zb(iB(k)) - LL=LL+1 - ka=ka+1 - k_ali(ka)=k - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - if(i_init.eq.1)then !global superposition - armsd=dsqrt(rms/LL) - Rcomm=armsd - endif - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - d=d0_search-1 - call score_fun8 !init, get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka0 - k_ali0(i)=k_ali(i) - enddo - endif -*** iteration for extending ----------------------------------> - d=d0_search+1 - do 301 it=1,n_it - LL=0 - ka=0 - do i=1,n_cut - m=i_ali(i) ![1,n_ali] - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - ka=ka+1 - k_ali(ka)=m - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - call score_fun8 !get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka - k_ali0(i)=k_ali(i) - enddo - endif - if(it.eq.n_it)goto 302 - if(n_cut.eq.ka)then - neq=0 - do i=1,n_cut - if(i_ali(i).eq.k_ali(i))neq=neq+1 - enddo - if(n_cut.eq.neq)goto 302 - endif - 301 continue !for iteration - 302 continue - 300 continue !for shift - 333 continue !for initial length, L_ali/M - -******** return the final rotation **************** - LL=0 - do i=1,ka0 - m=k_ali0(i) !record of the best alignment - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - x1(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - y1(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - z1(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - TM=score_max - -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - END - -************************************************************************* -************************************************************************* -* This is a subroutine to compare two structures and find the -* superposition that has the maximum TM-score. -* -* L1--Length of the first structure -* (x1(i),y1(i),z1(i))--coordinates of i'th residue at the first structure -* n1(i)--Residue sequence number of i'th residue at the first structure -* L2--Length of the second structure -* (x2(i),y2(i),z2(i))--coordinates of i'th residue at the second structure -* n2(i)--Residue sequence number of i'th residue at the second structure -* TM--TM-score of the comparison -* Rcomm--RMSD of two structures in the common aligned residues -* Lcomm--Length of the common aligned regions -* -* Note: -* 1, Always put native as the second structure, by which TM-score -* is normalized. -* 2, The returned (x1(i),y1(i),z1(i)) are the rotated structure after -* TM-score superposition. -************************************************************************* -************************************************************************* -*** dis<8, but same search engine - subroutine TMscore8(dx,L1,x1,y1,z1,n1,L2,x2,y2,z2,n2, - & TM,Rcomm,Lcomm) - PARAMETER(nmax=5000) - common/stru/xt(nmax),yt(nmax),zt(nmax),xb(nmax),yb(nmax),zb(nmax) - common/nres/nresA(nmax),nresB(nmax),nseqA,nseqB - common/para/d,d0 - common/d0min/d0_min - common/align/n_ali,iA(nmax),iB(nmax) - common/nscore/i_ali(nmax),n_cut ![1,n_ali],align residues for the score - dimension k_ali(nmax),k_ali0(nmax) - dimension L_ini(100),iq(nmax) - common/scores/score - double precision score,score_max - dimension xa(nmax),ya(nmax),za(nmax) - - dimension x1(nmax),y1(nmax),z1(nmax),n1(nmax) - dimension x2(nmax),y2(nmax),z2(nmax),n2(nmax) - -ccc RMSD: - double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) - double precision u(3,3),t(3),rms,drms !armsd is real - data w /nmax*1.0/ -ccc - -********* convert input data *************************** -* because L1=L2 in this special case----------> - nseqA=L1 - nseqB=L2 - do i=1,nseqA - xa(i)=x1(i) - ya(i)=y1(i) - za(i)=z1(i) - nresA(i)=n1(i) - xb(i)=x2(i) - yb(i)=y2(i) - zb(i)=z2(i) - nresB(i)=n2(i) - iA(i)=i - iB(i)=i - enddo - n_ali=L1 !number of aligned residues - Lcomm=L1 - -************///// -* parameters: -***************** -*** d0-------------> - d0=dx - if(d0.lt.d0_min)d0=d0_min -*** d0_search -----> - d0_search=d0 - if(d0_search.gt.8)d0_search=8 - if(d0_search.lt.4.5)d0_search=4.5 -*** iterative parameters -----> - n_it=20 !maximum number of iterations - d_output=5 !for output alignment - n_init_max=6 !maximum number of L_init - n_init=0 - L_ini_min=4 - if(n_ali.lt.4)L_ini_min=n_ali - do i=1,n_init_max-1 - n_init=n_init+1 - L_ini(n_init)=n_ali/2**(n_init-1) - if(L_ini(n_init).le.L_ini_min)then - L_ini(n_init)=L_ini_min - goto 402 - endif - enddo - n_init=n_init+1 - L_ini(n_init)=L_ini_min - 402 continue - -****************************************************************** -* find the maximum score starting from local structures superposition -****************************************************************** - score_max=-1 !TM-score - do 333 i_init=1,n_init - L_init=L_ini(i_init) - iL_max=n_ali-L_init+1 - do 300 iL=1,iL_max !on aligned residues, [1,nseqA] - LL=0 - ka=0 - do i=1,L_init - k=iL+i-1 ![1,n_ali] common aligned - r_1(1,i)=xa(iA(k)) - r_1(2,i)=ya(iA(k)) - r_1(3,i)=za(iA(k)) - r_2(1,i)=xb(iB(k)) - r_2(2,i)=yb(iB(k)) - r_2(3,i)=zb(iB(k)) - LL=LL+1 - ka=ka+1 - k_ali(ka)=k - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - if(i_init.eq.1)then !global superposition - armsd=dsqrt(rms/LL) - Rcomm=armsd - endif - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - d=d0_search-1 - call score_fun8 !init, get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka0 - k_ali0(i)=k_ali(i) - enddo - endif -*** iteration for extending ----------------------------------> - d=d0_search+1 - do 301 it=1,n_it - LL=0 - ka=0 - do i=1,n_cut - m=i_ali(i) ![1,n_ali] - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - ka=ka+1 - k_ali(ka)=m - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - call score_fun8 !get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka - k_ali0(i)=k_ali(i) - enddo - endif - if(it.eq.n_it)goto 302 - if(n_cut.eq.ka)then - neq=0 - do i=1,n_cut - if(i_ali(i).eq.k_ali(i))neq=neq+1 - enddo - if(n_cut.eq.neq)goto 302 - endif - 301 continue !for iteration - 302 continue - 300 continue !for shift - 333 continue !for initial length, L_ali/M - -******** return the final rotation **************** - LL=0 - do i=1,ka0 - m=k_ali0(i) !record of the best alignment - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - x1(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - y1(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - z1(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - TM=score_max - -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - END - -ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -c 1, collect those residues with dis - nseqA=L1 - nseqB=L2 - do i=1,nseqA - xa(i)=x1(i) - ya(i)=y1(i) - za(i)=z1(i) - nresA(i)=n1(i) - xb(i)=x2(i) - yb(i)=y2(i) - zb(i)=z2(i) - nresB(i)=n2(i) - iA(i)=i - iB(i)=i - enddo - n_ali=L1 !number of aligned residues - Lcomm=L1 - -************///// -* parameters: -***************** -*** d0-------------> -c d0=1.24*(nseqB-15)**(1.0/3.0)-1.8 - d0=dx - if(d0.lt.d0_min)d0=d0_min -*** d0_search -----> - d0_search=d0 - if(d0_search.gt.8)d0_search=8 - if(d0_search.lt.4.5)d0_search=4.5 -*** iterative parameters -----> - n_it=20 !maximum number of iterations - d_output=5 !for output alignment - n_init_max=6 !maximum number of L_init - n_init=0 - L_ini_min=4 - if(n_ali.lt.4)L_ini_min=n_ali - do i=1,n_init_max-1 - n_init=n_init+1 - L_ini(n_init)=n_ali/2**(n_init-1) - if(L_ini(n_init).le.L_ini_min)then - L_ini(n_init)=L_ini_min - goto 402 - endif - enddo - n_init=n_init+1 - L_ini(n_init)=L_ini_min - 402 continue - -****************************************************************** -* find the maximum score starting from local structures superposition -****************************************************************** - score_max=-1 !TM-score - do 333 i_init=1,n_init - L_init=L_ini(i_init) - iL_max=n_ali-L_init+1 - do 300 iL=1,iL_max !on aligned residues, [1,nseqA] - LL=0 - ka=0 - do i=1,L_init - k=iL+i-1 ![1,n_ali] common aligned - r_1(1,i)=xa(iA(k)) - r_1(2,i)=ya(iA(k)) - r_1(3,i)=za(iA(k)) - r_2(1,i)=xb(iB(k)) - r_2(2,i)=yb(iB(k)) - r_2(3,i)=zb(iB(k)) - LL=LL+1 - ka=ka+1 - k_ali(ka)=k - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - if(i_init.eq.1)then !global superposition - armsd=dsqrt(rms/LL) - Rcomm=armsd - endif - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - d=d0_search-1 - call score_fun !init, get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka0 - k_ali0(i)=k_ali(i) - enddo - endif -*** iteration for extending ----------------------------------> - d=d0_search+1 - do 301 it=1,n_it - LL=0 - ka=0 - do i=1,n_cut - m=i_ali(i) ![1,n_ali] - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - ka=ka+1 - k_ali(ka)=m - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - call score_fun !get scores, n_cut+i_ali(i) for iteration - if(score_max.lt.score)then - score_max=score - ka0=ka - do i=1,ka - k_ali0(i)=k_ali(i) - enddo - endif - if(it.eq.n_it)goto 302 - if(n_cut.eq.ka)then - neq=0 - do i=1,n_cut - if(i_ali(i).eq.k_ali(i))neq=neq+1 - enddo - if(n_cut.eq.neq)goto 302 - endif - 301 continue !for iteration - 302 continue - 300 continue !for shift - 333 continue !for initial length, L_ali/M - -******** return the final rotation **************** - LL=0 - do i=1,ka0 - m=k_ali0(i) !record of the best alignment - r_1(1,i)=xa(iA(m)) - r_1(2,i)=ya(iA(m)) - r_1(3,i)=za(iA(m)) - r_2(1,i)=xb(iB(m)) - r_2(2,i)=yb(iB(m)) - r_2(3,i)=zb(iB(m)) - LL=LL+1 - enddo - call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 - do j=1,nseqA - x1(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) - y1(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) - z1(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) - enddo - TM=score_max - -c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - return - END - -ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -c 1, collect those residues with dis -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "dp_lib_header.h" -#include "define_header.h" - - -int aln_compare ( int argc, char *argv[]) - { - int a, b, c,f; - - Alignment *A, *B; - Sequence *SA, *SB, *TOT_SEQ=NULL; - Sequence *defined_residueA; - Sequence *defined_residueB; - char **seq_list; - int n_seq_file; - - - Sequence *S=NULL; - Structure *ST=NULL; - Result *R=NULL; - char *buf1; - char *buf2; - -/*PARAMETERS*/ - char ***grep_list; - int n_greps; - char compare_mode[STRING]; - char sim_aln[STRING]; - char *alignment1_file; - char *alignment2_file; - - char *pep1_file; - char *pep2_file; - - char io_format[STRING]; - - int n_structure; - char **struct_file; - char **struct_format; - int *n_symbol; - char ***symbol_list; - int pep_compare; - int aln_compare; - int count; - int output_aln; - int output_aln_threshold; - char output_aln_file[LONG_STRING]; - char output_aln_format[LONG_STRING]; - char output_aln_modif[LONG_STRING]; -/*LIST VARIABLES*/ - Constraint_list *CL_A; - Constraint_list *CL_B; - CLIST_TYPE *clist_entry; - int pos_in_clist; - Sequence *CLS; - - -/*Column Comparison Variables*/ - int **posA; - int **posB; - int **seq_cache; - int is_same; - int n; -/*RESULTS_VARIABLES*/ - int **tot_count; - int **pos_count; - int ***pw_tot_count; - int ***pw_pos_count; - int *glob; - int **pw_glob; - int s1, r1, s2, r2; -/*IO VARIABLES*/ - int n_categories; - char ***category; - char *category_list; - int *n_sub_categories; - char sep_l; - char sep_r; - char io_file[STRING]; - FILE *fp; - int **aln_output_count; - int **aln_output_tot; - -/*Sims VARIABLES*/ - float **sim; - float **sim_param; - char sim_matrix[STRING]; - - int sim_n_categories; - char ***sim_category; - char *sim_category_list; - int *sim_n_sub_categories; - - - if ( argc==1|| strm6 ( argv[1], "h", "-h", "help", "-help", "-man", "?")) - { - output_informations(); - } - - argv=standard_initialisation (argv, &argc); -/*Declarations and Initializations*/ - alignment1_file=vcalloc ( LONG_STRING, sizeof (char)); - alignment2_file=vcalloc ( LONG_STRING, sizeof (char)); - - pep1_file=vcalloc ( LONG_STRING, sizeof (char)); - pep2_file=vcalloc ( LONG_STRING, sizeof (char)); - - - sprintf (compare_mode, "sp"); - count=0; - pep_compare=0; - aln_compare=1; - - - grep_list=vcalloc ( STRING, sizeof (char**)); - for ( a=0; a< STRING; a++)grep_list[a]=declare_char (3, STRING); - n_greps=0; - - n_structure=0; - struct_file=declare_char ( MAX_N_STRUC, LONG_STRING); - struct_format=declare_char (MAX_N_STRUC, STRING); - - n_symbol=vcalloc ( MAX_N_STRUC, sizeof (int)); - symbol_list=vcalloc (MAX_N_STRUC, sizeof (char**)); - for ( a=0; a< MAX_N_STRUC; a++)symbol_list[a]=declare_char ( 100, 100); - - - - - n_categories=1; - category=vcalloc ( MAX_N_CATEGORIES, sizeof (char**)); - for ( a=0; a< MAX_N_CATEGORIES; a++)category[a]=declare_char(100, STRING); - n_sub_categories=vcalloc ( 100, sizeof (int)); - category_list=vcalloc ( LONG_STRING, sizeof (char)); - sprintf ( category_list, "[*][*]=[ALL]"); - - - sim_n_categories=1; - sim_category=vcalloc ( MAX_N_CATEGORIES, sizeof (char**)); - for ( a=0; a< MAX_N_CATEGORIES; a++)sim_category[a]=declare_char(100, STRING); - sim_n_sub_categories=vcalloc ( 100, sizeof (int)); - sim_category_list=vcalloc ( LONG_STRING, sizeof (char)); - sprintf ( sim_category_list, "[*][*]=[ALL]"); - sprintf ( sim_aln, "al1"); - sim_matrix[0]='\0'; - sprintf ( sim_category_list, "[*][*]=[ALL]"); - - sprintf ( io_format, "ht"); - sprintf ( io_file, "stdout"); - sep_l='['; - sep_r=']'; - - output_aln=0; - output_aln_threshold=100; - sprintf ( output_aln_file, "stdout"); - sprintf ( output_aln_format, "clustalw"); - sprintf ( output_aln_modif, "lower"); -/*END OF INITIALIZATION*/ - - - - -/*PARAMETERS INPUT*/ - - for ( a=1; a< argc; a++) - { - if (strcmp ( argv[a], "-f")==0) - { - sprintf (io_file,"%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-sim_aln")==0) - { - sprintf (sim_aln,"%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-sim_matrix")==0) - { - sprintf (sim_matrix,"%s", argv[++a]); - } - else if ( strm ( argv[a], "-compare_mode")) - { - sprintf ( compare_mode, "%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-sim_cat")==0) - { - if ( argv[++a][0]!='[') - { - if ( strcmp ( argv[a], "3d_ali")==0)sprintf ( sim_category_list, "[b][b]+[h][h]=[struc]"); - else - { - fprintf ( stderr, "\n%s: Unknown category for distance measure", argv[a]); - } - - } - else - { - sprintf ( sim_category_list, "%s", argv[a]); - } - } - else if ( strcmp ( argv[a], "-grep_value")==0) - { - sprintf ( grep_list[n_greps][0], "%s", argv[++a]); - sprintf ( grep_list[n_greps][1], "%s", argv[++a]); - n_greps++; - - } - else if ( strcmp ( argv[a], "-al1")==0) - { - - sprintf ( alignment1_file, "%s", argv[++a]); - - } - else if ( strcmp ( argv[a], "-al2")==0) - { - - sprintf ( alignment2_file, "%s", argv[++a]); - - } - else if ( strcmp ( argv[a], "-pep1")==0) - { - pep_compare=1; - sprintf ( pep1_file, "%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-pep2")==0) - { - pep_compare=1; - sprintf ( pep2_file, "%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-pep")==0) - { - pep_compare=1; - } - else if ( strcmp ( argv[a], "-count")==0) - { - count=1; - } - else if ( strcmp ( argv[a], "-output_aln")==0) - { - output_aln=1; - } - else if ( strcmp ( argv[a], "-output_aln_threshold")==0) - { - output_aln_threshold=atoi(argv[++a]); - } - else if ( strcmp ( argv[a], "-output_aln_file")==0) - { - sprintf (output_aln_file,"%s",argv[++a]); - } - else if ( strcmp ( argv[a], "-output_aln_format")==0) - { - sprintf (output_aln_format,"%s",argv[++a]); - } - else if ( strcmp ( argv[a], "-output_aln_modif")==0) - { - sprintf (output_aln_modif,"%s",argv[++a]); - } - else if ( strcmp ( argv[a], "-st")==0) - { - sprintf ( struct_file [n_structure], "%s", argv[++a]); - if (!NEXT_ARG_IS_FLAG && is_a_struc_format (argv[a+1])) - sprintf ( struct_format[n_structure], "%s", argv[++a]); - else - sprintf ( struct_format[n_structure], "%s", "pep"); - - if ( !NEXT_ARG_IS_FLAG && strcmp ( argv[a+1], "conv")==0) - { - a++; - while(!NEXT_ARG_IS_FLAG) - { - sprintf ( symbol_list[n_structure][n_symbol[n_structure]], "%s", argv[++a]); - n_symbol[n_structure]++; - } - } - else if (!NEXT_ARG_IS_FLAG) - { - symbol_list[n_structure]=make_symbols ( argv[++a], &n_symbol[n_structure]); - } - - else - { - symbol_list[n_structure]=make_symbols ( "any", &n_symbol[n_structure]); - } - - n_structure++; - - } - else if ( strcmp (argv[a], "-sep")==0) - { - if ( !NEXT_ARG_IS_FLAG) - get_separating_char ( argv[++a][0], &sep_l, &sep_r); - else - sep_l=sep_r=' '; - } - else if ( strncmp ( argv[a], "-io_format",5)==0) - { - sprintf ( io_format, "%s", argv[++a]); - } - else if ( strcmp ( argv[a], "-io_cat")==0) - { - if ( argv[++a][0]!='[') - { - if ( strcmp ( argv[a], "3d_ali")==0)sprintf ( category_list, "[b][b]+[h][h]=[struc];[*][*]=[tot]"); - } - else - { - sprintf ( category_list, "%s", argv[a]); - } - } - else - { - fprintf ( stdout, "\nOPTION %s UNKNOWN[FATAL]\n", argv[a]); - myexit (EXIT_FAILURE); - } - } - -/*PARAMETER PROCESSING*/ - -if ( pep_compare==1 || count==1)aln_compare=0; -if ( aln_compare==1)pep_compare=0; - -/*READ THE TOTAL SEQUENCES*/ - seq_list=declare_char ( 100,STRING); - n_seq_file=0; - - if ( alignment1_file[0] && !check_file_exists ( alignment1_file)) - { - fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n", alignment1_file, PROGRAM); - myexit(EXIT_FAILURE); - } - if ( alignment2_file[0] && !check_file_exists ( alignment2_file)) - { - fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n", alignment2_file, PROGRAM); - myexit(EXIT_FAILURE); - } - if ( pep1_file[0] && !check_file_exists ( pep1_file)) - { - fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n", pep1_file, PROGRAM); - myexit(EXIT_FAILURE); - } - if ( pep2_file[0] && !check_file_exists ( pep2_file)) - { - fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n", pep2_file, PROGRAM); - myexit(EXIT_FAILURE); - } - - if ( alignment1_file[0])sprintf ( seq_list[n_seq_file++], "A%s", alignment1_file); - if ( alignment2_file[0])sprintf ( seq_list[n_seq_file++], "A%s", alignment2_file); - if ( pep1_file[0])sprintf ( seq_list[n_seq_file++], "S%s", pep1_file); - if ( pep2_file[0])sprintf ( seq_list[n_seq_file++], "S%s", pep2_file); - - - - TOT_SEQ=read_seq_in_n_list ( seq_list, n_seq_file, NULL, NULL); - - A=declare_aln (TOT_SEQ); - B=declare_aln (TOT_SEQ); - - -/*1 COMPARISON OF THE SEQUENCES*/ - if ( pep_compare==1 || count==1) - { - f=0; - - if ( pep1_file[0]!='\0')SA=main_read_seq (pep1_file); - else if (alignment1_file[0]!='\0') - { - main_read_aln ( alignment1_file, A); - SA=aln2seq ( A); - } - else - { - main_read_aln ("stdin", A); - sprintf ( alignment1_file, "stdin"); - SA=aln2seq ( A); - } - if ( pep2_file[0]!='\0')SB=main_read_seq (pep2_file); - else if (alignment2_file[0]!='\0') - { - main_read_aln ( alignment2_file, B); - - SB=aln2seq (B); - } - else - { - SB=SA; - sprintf ( alignment2_file, "%s", alignment1_file ); - } - buf1=(pep1_file[0]!='\0')?pep1_file: alignment1_file; - buf2=(pep2_file[0]!='\0')?pep2_file: alignment2_file; - /*Output of the Results*/ - - fp=vfopen ( io_file, "w"); - - - if ( count==1) - { - fprintf (fp, "Number of seq: %d %d\n", SA->nseq,SA->nseq); - for ( a=0; a< SA->nseq; a++) fprintf (fp, "%-15s %d %d\n", SA->name[a], (int)strlen (SA->seq[a]), (int)strlen (SA->seq[a])); - } - - if (SA->nseq!=SB->nseq) - { - - fprintf ( fp, "DIFFERENCE TYPE 1: Different number of sequences %3d/%3d",SA->nseq,SB->nseq); - f=1; - } - - trim_seq ( SA, SB); - for ( a=0; a< SA->nseq; a++) - { - lower_string (SA->seq[a]); - lower_string (SB->seq[a]); - ungap ( SA->seq[a]); - ungap ( SB->seq[a]); - - if ( strcmp ( SA->seq[a], SB->seq[a])!=0) - { - fprintf ( fp, "DIFFERENCE TYPE 2: %s is different in the 2 files\n", SA->name[a]); - f=1; - } - } - for ( a=0; a< SA->nseq; a++) - { - lower_string (SA->seq[a]); - lower_string (SB->seq[a]); - ungap ( SA->seq[a]); - ungap ( SB->seq[a]); - - if ( strlen ( SA->seq[a])!= strlen (SB->seq[a])) - { - fprintf ( fp, "DIFFERENCE TYPE 3: %s has != length in the 2 files (%d-%d)\n", SA->name[a],(int)strlen ( SA->seq[a]), (int)strlen (SB->seq[a])); - f=1; - } - } - if ( f==1) - { - fprintf ( fp, "\nDIFFERENCES found between:\n\t%s\n\t%s\n**********\n\n",buf1, buf2); - } - fclose (fp); - } - -/*2 COMPARISON OF THE ALIGNMENTS*/ - else if ( aln_compare==1) - { - - n_categories=parse_category_list ( category_list, category, n_sub_categories); - sim_n_categories=parse_category_list ( sim_category_list, sim_category, sim_n_sub_categories); - - main_read_aln ( alignment1_file, A); - main_read_aln ( alignment2_file, B); - CLS=trim_aln_seq ( A, B); - - - defined_residueA=get_defined_residues (A); - defined_residueB=get_defined_residues (B); - - - A=thread_defined_residues_on_aln(A, defined_residueA); - A=thread_defined_residues_on_aln(A, defined_residueB); - B=thread_defined_residues_on_aln(B, defined_residueA); - B=thread_defined_residues_on_aln(B, defined_residueB); - - - CL_A=declare_constraint_list ( CLS, NULL, NULL, 0, NULL, NULL); - CL_B=declare_constraint_list ( CLS, NULL, NULL, 0, NULL, NULL); - - - CL_A=aln2constraint_list (A,CL_A, "sim"); - CL_B=aln2constraint_list (B,CL_B, "sim"); - - clist_entry=vcalloc ( CL_A->entry_len, CL_A->el_size); - - glob=vcalloc ( A->nseq+1, sizeof (int)); - pw_glob=declare_int ( A->nseq+1, A->nseq+1); - - - if ( strm( compare_mode, "sp")) - { - for ( b=0,a=0; ane; a++) - { - s1=vread_clist(CL_A, a, SEQ1); - s2=vread_clist(CL_A, a, SEQ2); - clist_entry=extract_entry ( clist_entry, a, CL_A); - - glob[0]++; - glob[s1+1]++; - glob[s2+1]++; - pw_glob[s1][s2]++; - pw_glob[s2][s1]++; - - clist_entry=extract_entry ( clist_entry, a, CL_A); - - if ((main_search_in_list_constraint (clist_entry,&pos_in_clist,4,CL_B))!=NULL) - { - vwrite_clist ( CL_A, a, MISC, 1); - b++; - } - else - { - vwrite_clist ( CL_A, a, MISC, 0); - } - } - } - else if ( strm( compare_mode, "column")) - { - posA=aln2pos_simple_2(A); - posB=aln2pos_simple_2(B); - seq_cache=declare_int ( A->nseq, A->len_aln+1); - for ( n=0,a=0; a< A->len_aln; a++) - for ( b=0; blen_aln; b++) - { - is_same=compare_pos_column(posA, a, posB, b, A->nseq); - - n+=is_same; - if (is_same) - { - for (c=0; c< A->nseq;c++)if ( posA[c][a]>0)seq_cache[c][posA[c][a]]=1; - } - } - - for ( a=0,b=0; a< CL_A->ne; a++) - { - s1=vread_clist(CL_A, a, SEQ1); - s2=vread_clist(CL_A, a, SEQ2); - glob[0]++; - glob[s1+1]++; - glob[s2+1]++; - pw_glob[s1][s2]++; - pw_glob[s2][s1]++; - r1=vread_clist(CL_A, a, R1); - if (seq_cache[s1][r1]){b++;vwrite_clist ( CL_A, a, MISC, 1);} - } - free_int (posA, -1); - free_int (posB, -1); - free_int (seq_cache, -1); - - } - - for ( a=0; a< n_structure; a++) - { - ST=read_structure (struct_file[a],struct_format[a], A,B,ST,n_symbol[a], symbol_list[a]); - } - - /*RESULT ARRAY DECLARATION*/ - - tot_count=declare_int (n_categories+1, A->nseq+1); - pos_count=declare_int (n_categories+1, A->nseq+1); - pw_tot_count=vcalloc ( A->nseq, sizeof (int**)); - for ( a=0; a< A->nseq; a++)pw_tot_count[a]=declare_int ( A->nseq, n_categories); - - - pw_pos_count=vcalloc ( A->nseq, sizeof (int**)); - for ( a=0; a< A->nseq; a++)pw_pos_count[a]=declare_int ( A->nseq, n_categories); - - /*COMPARISON MODULE*/ - for ( a=0; a< n_categories; a++) - { - for (b=0; bne; b++) - { - s1=vread_clist(CL_A, b, SEQ1); - s2=vread_clist(CL_A, b, SEQ2); - - r1=vread_clist(CL_A, b, R1); - r2=vread_clist(CL_A, b, R2); - - c=vread_clist(CL_A, b, MISC); - - if ( is_in_struct_category ( s1, s2, r1, r2, ST, category[a], n_sub_categories[a])) - { - - tot_count[a][0]++; - tot_count[a][s1+1]++; - tot_count[a][s2+1]++; - pw_tot_count[s1][s2][a]++; - pw_tot_count[s2][s1][a]++; - if ( c==1) - { - pw_pos_count[s1][s2][a]++; - pw_pos_count[s2][s1][a]++; - pos_count[a][0]++; - pos_count[a][s1+1]++; - pos_count[a][s2+1]++; - } - } - - } - } - - - - - - /*Measure of Aligned Sequences Similarity*/ - - sim=get_aln_compare_sim ((strcmp (sim_aln, "al1")==0)?A:B, ST,sim_category[0], sim_n_sub_categories[0], sim_matrix); - sim_param=analyse_sim ((strcmp (sim_aln, "al1")==0)?A:B, sim); - - - /*Fill the Result_structure*/ - R=vcalloc ( 1, sizeof (Result)); - - R->grep_list=grep_list; - R->n_greps=n_greps; - R->A=A; - R->B=B; - - R->S=S; - R->ST=ST; - R->sim_aln=sim_aln; - R->alignment1_file=alignment1_file; - R->alignment2_file=alignment2_file; - R->io_format=io_format; - R->n_structure=n_structure; - R->struct_file=struct_file; - R->struct_format=struct_format; - R->n_symbol=n_symbol; - R->symbol_list=symbol_list; - - - R->tot_count=tot_count; - R->pos_count=pos_count; - R->pw_tot_count=pw_tot_count; - R->pw_pos_count=pw_pos_count; - R->glob=glob; - R->pw_glob=pw_glob; - R->n_categories=n_categories; - R->category=category; - R->category_list=category_list; - R->n_sub_categories=n_sub_categories; - R->sim=sim; - R->sim_param=sim_param; - R->sim_matrix=sim_matrix; - R->sim_n_categories=sim_n_categories; - R->sim_category=sim_category; - R->sim_category_list=sim_category_list; - R->sim_n_sub_categories=sim_n_sub_categories; - R->sep_r=sep_r; - R->sep_l=sep_l; - - /*Output of the Results*/ - - fp=vfopen ( io_file, "w"); - fp=output_format (io_format, fp, R); - vfclose ( fp); - - - /*Rewriting of Alignment A*/ - if ( output_aln) - { - A->residue_case=2; - aln_output_tot =declare_int ( A->nseq, A->len_aln+1); - aln_output_count=declare_int ( A->nseq, A->len_aln+1); - - for ( a=0; a< CL_A->ne; a++) - { - clist_entry=extract_entry ( clist_entry, a, CL_A); - aln_output_tot[clist_entry[SEQ1]][clist_entry[R1]]++; - aln_output_tot[clist_entry[SEQ2]][clist_entry[R2]]++; - - aln_output_count[clist_entry[SEQ1]][clist_entry[R1]]+=clist_entry[MISC]; - aln_output_count[clist_entry[SEQ2]][clist_entry[R2]]+=clist_entry[MISC]; - } - for ( a=0; a< A->nseq; a++) - { - - for (c=0, b=0; b< A->len_aln; b++) - { - if ( !is_gap(A->seq_al[a][b])) - { - c++; - if ( aln_output_tot[a][c] && ((aln_output_count[a][c]*100)/aln_output_tot[a][c])seq_al[a][b]=tolower(A->seq_al[a][b]); - else - A->seq_al[a][b]=output_aln_modif[0]; - } - else A->seq_al[a][b]=toupper(A->seq_al[a][b]); - } - - } - } - A->score_aln=(int)(R->tot_count[0][0]==0)?0:((R->pos_count[0][0]*100)/(float)R->tot_count[0][0]); - - output_format_aln (output_aln_format,A,NULL,output_aln_file); - - free_int ( aln_output_tot, -1); - free_int ( aln_output_count, -1 ); - } - } - return EXIT_SUCCESS; - } -/************************************************************************************/ -/* */ -/* OUTPUT */ -/* */ -/* */ -/************************************************************************************/ -FILE *output_format (char *iof,FILE *fp, Result *R) - { - int a; - int l; - - /* - H: files Header - h: basic header; - s: sequence results - t: total results (global); - p: pairwise_results; - */ - l=strlen ( iof); - - for ( a=0; a< l; a++) - { - if ( iof[a]=='H')fp=output_large_header (fp,R); - else if ( iof[a]=='h')fp=output_header (fp,R); - else if ( iof[a]=='t')fp=output_total_results (fp, R); - else if ( iof[a]=='s')fp=output_sequence_results (fp,R); - else if ( iof[a]=='p')fp=output_pair_wise_sequence_results(fp,R); - } - return fp; - } - -FILE *output_pair_wise_sequence_results (FILE *fp, Result *R) - { - int a,c,d; - - - for ( c=0; c<(R->A)->nseq-1; c++) - { - for ( d=c+1; d< (R->A)->nseq; d++) - { - fprintf (fp, "%-10s %-10s%s",(R->A)->name[c],(R->A)->name[d],SSPACE); - fprintf (fp, "%5.1f%s", R->sim[c][d], SSPACE); - - for (a=0; a< R->n_categories; a++) - { - fprintf ( fp, "%5.1f ",(R->pw_tot_count[c][d][a]==0)?0:((float)(R->pw_pos_count[c][d][a]*100)/(float)R->pw_tot_count[c][d][a])); - fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->pw_glob[c][d]==0)?0:((float)(R->pw_tot_count[c][d][a]*100)/(float)R->pw_glob[c][d]),(R->sep_r),SSPACE); - } - fprintf ( fp, "%c%5d%c\n",(R->sep_l), R->pw_glob[c][d],(R->sep_r)); - } - } - - return fp; - } -FILE *output_sequence_results (FILE *fp, Result *R) - { - int a,c; - - for ( c=1; c<=R->A->nseq; c++) - { - fprintf (fp, "%-10s %-10s%s",(R->A)->name[c-1], "..",SSPACE); - fprintf (fp, "%5.1f%s", R->sim_param[c-1][0],SSPACE); - for (a=0; a< R->n_categories; a++) - { - fprintf ( fp, "%5.1f ",(R->tot_count[a][c]==0)?0:((float)(R->pos_count[a][c]*100)/(float)R->tot_count[a][c])); - fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->glob[c]==0)?0:((float)(R->tot_count[a][c]*100)/(float)R->glob[c]),(R->sep_r), SSPACE); - } - fprintf ( fp, "%c%5d%c\n",(R->sep_l), R->glob[c],(R->sep_r)); - } - return fp; - } - - -FILE *output_total_results (FILE *fp, Result *R) - { - int a; - - - fprintf ( fp, "%-13s %-7d%s",extract_suffixe (R->alignment1_file),(R->A)->nseq, SSPACE); - fprintf (fp, "%5.1f%s", R->sim_param[(R->A)->nseq][0], SSPACE); - for (a=0; a< R->n_categories; a++) - { - fprintf ( fp, "%5.1f ",(R->tot_count[a][0]==0)?0:((float)(R->pos_count[a][0]*100)/(float)R->tot_count[a][0])); - fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->glob[0]==0)?0:((float)(R->tot_count[a][0]*100)/(float)R->glob[0]),(R->sep_r), SSPACE); - } - fprintf ( fp, "%c%5d%c\n",(R->sep_l), R->glob[0],(R->sep_r)); - return fp; - } -FILE *output_header (FILE *fp, Result *R) - { - int a; - - - fprintf ( fp, "%s\n",generate_string ( R->n_categories*(13+strlen(SSPACE))+31+2*strlen(SSPACE),'*')); - - fprintf ( fp, "%-10s %-10s %s%-3s%s", "seq1", "seq2",SSPACE,"Sim",SSPACE); - - for ( a=0; a< R->n_categories; a++) - fprintf ( fp, "%-12s%s ",R->category[a][0], SSPACE); - fprintf (fp, "%-5s", "Tot"); - fprintf (fp, "\n"); - return fp; - } -FILE *output_large_header ( FILE *fp, Result *R) - { - int a, b; - - fprintf ( fp, "AL1: %s\n", R->alignment1_file); - fprintf ( fp, "AL2: %s\n", R->alignment2_file); - for ( a=0; a< R->n_structure; a++) - { - fprintf (fp, "ST %d: %s [%s]/[", a, R->struct_file[a], R->struct_format[a]); - for ( b=0; b< R->n_symbol[a]; b++)fprintf (fp, "%s ", R->symbol_list[a][b]); - fprintf ( fp, "]\n"); - } - return (fp); - } - -void get_separating_char ( char s, char *l, char *r) - { - if ( s=='{' || s=='}') - { - l[0]='{'; - r[0]='}'; - return; - } - else if ( s==']' || s=='[') - { - l[0]='['; - r[0]=']'; - return; - } - else if ( s==')' || s=='(') - { - l[0]='('; - r[0]=')'; - return; - } - else - { - l[0]=s; - r[0]=s; - return; - } - } - -/************************************************************************************/ -/* */ -/* SIM MEASURE */ -/* */ -/* */ -/************************************************************************************/ -float **get_aln_compare_sim ( Alignment *A, Structure *ST, char **cat, int n_cat, char *matrix) - { - int a, b, c; - - float **sim; - char cr1, cr2; - int r1, r2; - int p1, p2; - float pos,tot; - - sim=declare_float ( A->nseq, A->nseq); - - for ( a=0; anseq-1; a++) - { - for (b=a+1; b< A->nseq; b++) - { - for ( r1=0, r2=0,tot=0, pos=0,c=0; c< A->len_aln; c++) - { - p1=is_gap(A->seq_al[a][c]); - p2=is_gap(A->seq_al[b][c]); - - r1+=1-p1; - r2+=1-p2; - cr1=A->seq_al[a][c]; - cr2=A->seq_al[b][c]; - if (!p1 && !p2) - { - if (is_in_struct_category (a, b, r1, r2, ST, cat, n_cat)) - { - tot++; - pos+=is_in_same_group_aa ( cr1, cr2, 0, NULL, matrix); - } - } - } - sim[a][b]=sim[b][a]=(tot==0)?0:((pos*100)/tot); - } - } - return sim; - } -float **analyse_sim ( Alignment *A, float **sim) - { - int a,b,c; - - float **an, d; - - - an=declare_float ( A->nseq+1,2); - - for (d=0, a=0; a< A->nseq;a++) - { - for ( b=0; b< A->nseq; b++) - { - if ( b!=a) - { - an[a][0]+=sim[a][b]; - an[A->nseq][0]+=sim[a][b]; - d++; - } - } - an[a][0]=((float)an[a][0]/(float)(A->nseq-1)); - } - - - an[A->nseq][0]=an[A->nseq][0]/d; - - for ( d=0,a=0; a< A->nseq; a++) - { - for ( b=0; b< A->nseq; b++) - { - if ( b!=a) - { - c=an[a][0]-sim[a][b]; - an[a][1]+=(c>0)?c:-c; - an[A->nseq][1]+=(c>0)?c:-c; - d++; - } - } - an[a][1]=((float)an[a][1]/(float)(A->nseq-1)); - } - - an[A->nseq][1]=an[A->nseq][1]/d; - - return an; - } - - - - - - - - -/************************************************************************************/ -/* */ -/* STRUC ANALYSE */ -/* */ -/* */ -/************************************************************************************/ -int is_in_struct_category ( int s1, int s2, int r1, int r2, Structure *ST, char **cat, int n_cat) - { - int a; - static char *struc_r1; - static char *struc_r2; - char first[STRING]; - char second[STRING]; - static int **r; - - - - - if ( ST==NULL)return 1; - if ( struc_r1!=NULL) - { - vfree ( struc_r1); - vfree ( struc_r2); - } - - if ( r==NULL)r=declare_int (2, 2); - else r[0][0]=r[1][1]=r[1][0]=r[0][1]=0; - - - struc_r1=get_structure_residue ( s1, r1, ST); - struc_r2=get_structure_residue ( s2, r2, ST); - - - for ( a=1; a< n_cat; a+=2) - { - sprintf ( first, "%s", cat[a]); - sprintf ( second,"%s", cat[a+1]); - r[0][0]=struc_matches_pattern ( struc_r1, first); - r[0][1]=struc_matches_pattern ( struc_r2, first); - r[1][0]=struc_matches_pattern ( struc_r1, second); - r[1][1]=struc_matches_pattern ( struc_r2, second); - - if ( (r[0][0]&&r[1][1])||(r[1][0]&&r[0][1]))return 1; - } - return 0; - } - -char * get_structure_residue (int seq, int res, Structure *ST) - { - int a; - char *s; - - s=vcalloc ( ST->n_fields+1, sizeof (char)); - for (a=0; a< ST->n_fields; a++) - s[a]=ST->struc[seq][res][a]; - s[a]='\0'; - return s; - } - -int struc_matches_pattern ( char *struc, char *pattern) - { - char p[STRING]; - char *y; - - int b,l; - - - sprintf ( p, "%s", pattern); - - if ( strcmp (p, "*")==0)return 1; - else - { - l=strlen ( struc); - y=strtok ( p, "."); - - for ( b=0; bnseq, A->seq_al); - else - ST=extend_structure ( ST); - - StrucAln=declare_Alignment(NULL); - if (strm ( format, "pep")) - { - SEQ=main_read_seq ( fname); - StrucAln=seq2aln(SEQ,StrucAln,0); - } - - else if ( strcmp ( format, "aln")==0) - { - StrucAln=main_read_aln (fname, StrucAln); - } - - reorder_aln(StrucAln, A->name, A->nseq); - - SA=aln2seq(StrucAln); - string_array_convert (SA->seq, SA->nseq, n_symbols, symbol_table); - seq2struc (SA, ST); - - free_aln(StrucAln); - if (SEQ)free_sequence (SEQ, SEQ->nseq); - - return ST; - } - -int parse_category_list ( char *category_list_in, char ***category, int*n_sub_categories) - { - int n,a; - char *category_list; - char *y,*z; - category_list=vcalloc ( strlen(category_list_in)+1, sizeof (char)); - sprintf (category_list, "%s", category_list_in); - - n=0; - z=category_list; - while ((y=strtok(z, ";"))!=NULL) - { - sprintf ( category[n++][2], "%s", y); - z=NULL; - } - - - for ( a=0; a< n; a++) - { - sprintf (category_list,"%s",strtok(category[a][2], "=")); - sprintf (category[a][0],"%s",strtok (NULL, "=")); - sprintf ( category[a][++n_sub_categories[a]],"%s", strtok(category_list, "[]+")); - while ( ((y=strtok(NULL, "[]+"))!=NULL)) - { - if ( strcmp (y, "#")==0)y=category[a][n_sub_categories[a]]; - sprintf ( category[a][++n_sub_categories[a]],"%s",y); - } - } - return n; - } - - -int is_a_struc_format (char *format) - { - if ( strcmp ( format, "pep")==0)return 1; - if ( strcmp ( format, "aln")==0)return 1; - return 0; - } -/************************************************************************************/ -/* */ -/* Informations */ -/* */ -/* */ -/************************************************************************************/ -void output_informations () -{ -fprintf ( stderr, "\nPROGRAM: %s (%s)\n",PROGRAM,VERSION); -fprintf ( stderr, "******INPUT***************************"); -fprintf ( stderr, "\n-al1 al1_file"); -fprintf ( stderr, "\n-al2 al2_file"); -fprintf ( stderr, "\n-compare_mode [sp] or column"); -fprintf ( stderr, "\n-pep (compare only the sequences"); -fprintf ( stderr, "\n-count"); -fprintf ( stderr, "\n-pep1 pep1_file"); -fprintf ( stderr, "\n-pep1 pep2_file"); -fprintf ( stderr, "\n-st str_file st_format conversion"); -fprintf ( stderr, "\n **st_format: aln, pep"); -fprintf ( stderr, "\n **conversion: 3d_ali, conv abcZ #X"); -fprintf ( stderr, "\nNOTE: Several structures in a row are possible"); - -fprintf ( stderr, "\n\n****DISTANCE MEASURE*****************"); -fprintf ( stderr, "\n-sim_cat category_format or category_name"); -fprintf ( stderr, "\n **category_format: [*][*]=[tot]"); -fprintf ( stderr, "\n **category_name : 3d_ali (<=>[h][h]+[e][e]=[Struc]"); -fprintf ( stderr, "\n-sim_matrix matrix_name"); -fprintf ( stderr, "\n **matrix_name: idmat,pam250mt.."); -fprintf ( stderr, "\n-sim_aln al1 or al2"); -fprintf ( stderr, "\n\n****COMPARISON***********************"); -fprintf ( stderr, "\n-io_cat category_format or category_name"); -fprintf ( stderr, "\n **category_format: [*][*]=[tot]"); -fprintf ( stderr, "\n **category_name : 3d_ali(<=>[h][h]+[e][e]=[Struc];[*][*]=[Tot]"); -fprintf ( stderr, "\n\nNOTE: if two structures:"); -fprintf ( stderr, "\n[he.123][#]=[he123VShe123];[beh.*][he.2345]=[other]"); -fprintf ( stderr, "\n\n****OUTPUT****************************"); -fprintf ( stderr, "\n-f stdout"); -fprintf ( stderr, "\n stderr"); -fprintf ( stderr, "\n file_name"); -fprintf ( stderr, "\n-io_format hts"); -fprintf ( stderr, "\n H ->large Header"); -fprintf ( stderr, "\n h ->small Header"); -fprintf ( stderr, "\n t->global (average)results"); -fprintf ( stderr, "\n s ->average results for each sequence"); -fprintf ( stderr, "\n p ->results for each pair of sequences"); -fprintf ( stderr, "\n-output_aln Outputs al1 with conserved bits in Upper"); -fprintf ( stderr, "\n-output_aln_threshold [100]"); -fprintf ( stderr, "\n-output_aln_file [stdout]"); -fprintf ( stderr, "\n-output_aln_format [clustalw]"); -fprintf ( stderr, "\n-output_aln_modif [lower]"); -fprintf ( stderr, "\n"); -myexit (EXIT_SUCCESS); -} - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Jul 1 10:00:54 WEST 2008. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/aln_convertion_util.c b/binaries/src/tcoffee/t_coffee_source/aln_convertion_util.c deleted file mode 100644 index 4bdbb51..0000000 --- a/binaries/src/tcoffee/t_coffee_source/aln_convertion_util.c +++ /dev/null @@ -1,17537 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "dp_lib_header.h" -#include "define_header.h" - -int aln_has_stockholm_structure (Alignment *A) -{ - return name_is_in_list ("#=GC SS_cons", A->name, A->nseq, 100); -} - -int get_aln_stockholm_structure (Alignment *A) -{ - int i; - if ((i=aln_has_stockholm_structure(A))==-1) - A=add_alifold2aln (A, NULL); - return aln_has_stockholm_structure(A); -} -int ** update_RNAfold_list (Alignment *A, int **pos, int s, int **l) -{ - int a=0; - while (l[a]) - { - if (!is_gap(A->seq_al[s][l[a][0]]) && !is_gap (A->seq_al[s][l[a][1]])) - { - l[a][2]=pos[s][l[a][0]]; - l[a][3]=pos[s][l[a][1]]; - } - else - { - l[a][2]=l[a][3]=-1; - } - a++; - } - return l; -} - -Alignment *compare_RNA_fold ( Alignment *A, Alignment *B) -{ - int i1, i2, i; - int **l1, **l2; - int **pos1, **pos2; - int a, b; - int tot_ol=0, tot_l=0; - - i1=get_aln_stockholm_structure (A); - i2=get_aln_stockholm_structure (B); - - l1=vienna2list (A->seq_al[i1]); - l2=vienna2list (B->seq_al[i2]); - - pos1=aln2pos_simple(A, A->nseq); - pos2=aln2pos_simple(B, B->nseq); - - - - for (a=0; a< A->nseq; a++) - { - char **lu; - int ol=0, ll1=0, ll2=0; - if ( A->name[a][0]=='#')continue; - i=name_is_in_list (A->name[a], B->name, B->nseq, 100); - if (i!=-1) - { - l1=update_RNAfold_list (A,pos1,a, l1); - l2=update_RNAfold_list (B,pos2,i, l2); - lu=declare_char (A->len_aln, B->len_aln); - - b=0; - while (l2[b]) - { - - if (l2[b][2]==-1 || l2[b][3]==-1); - else - { - ll2++; - lu[l2[b][2]][l2[b][3]]=1; - - } - b++; - } - b=0; - - while (l1[b]) - { - - if (l1[b][2]==-1 || l1[b][3]==-1); - else - { - ll1++; - if (lu[l1[b][2]][l1[b][3]]==1) - { - A->seq_al[a][l1[b][0]]='6'; - A->seq_al[a][l1[b][1]]='6'; - ol++; - } - else - { - A->seq_al[a][l1[b][0]]='0'; - A->seq_al[a][l1[b][1]]='0'; - } - } - b++; - } - - free_char (lu, -1); - } - tot_ol+=ol; - tot_l+=ll1; - tot_l+=ll2; - fprintf ( stdout, "@@ Seq: %s Overalp: %.2f Al1: %.2f Al2: %.2f \n", A->name[a], (float)(ol*200)/(ll1+ll2), (float)(ol*100)/ll1,(float)(ol*100)/ll2); - } - - fprintf ( stdout, "@@ Seq: Tot Overalp: %.2f \n", (float)(tot_ol*200)/(tot_l)); - - return A; -} -int is_neutral(char c1, char c2); -int is_watson (char c1, char c2); -int is_watson2 (char c1, char c2); -int is_watson (char c1, char c2) -{ - c1=tolower (c1); - c2=tolower (c2); - if ( is_watson2 (c1, c2)) return 1; - else return is_watson2 (c2, c1); -} -int is_watson2 (char c1, char c2) -{ - - if ( c1=='g' && c2=='c')return 1; - else if (c1=='a' && (c2=='t' || c2=='u'))return 1; - return 0; -} -int is_neutral (char c1, char c2) -{ - - c1=tolower (c1); - c2=tolower (c2); - if (is_watson (c1, c2)) return 1; - else if (c1=='g' && (c2=='t' || c2=='u'))return 1; - else if ((c1=='t' || c1=='u') && c2=='g')return 1; - return 0; -} - -int ** vienna2list ( char *seq) -{ - int a, b, i, i2,l; - int **list; - l=strlen (seq); - list=declare_int (l+1, 8); - for (i=0,a=0; a=0; b++) - { - if (seq[b]=='(')i2++; - else if (seq[b]==')')i2--; - } - list[i][1]=b-1; - i++; - } - } - - list[i]=NULL; - return list; -} -Alignment *aln2alifold(Alignment *A) -{ - char *tmp1; - char *tmp2; - - tmp1=vtmpnam (NULL); - tmp2=vtmpnam (NULL); - output_clustal_aln (tmp1,A); - printf_system ("RNAalifold %s >%s 2>/dev/null", tmp1, tmp2); - return alifold2aln (tmp2); -} - -Alignment *add_alifold2aln (Alignment *A, Alignment *ST) -{ - int a,b,c,d,p1,p2; - int r1, rr1, r2, rr2; - int watson, comp,tot; - int **compmat; - int max, p,k; - int minseq=3; - int **list; - int ncomp=0, nwatson=0; - int cons_l, fold_l; - int i,l; - - if (!ST) - { - char *tmp1, *tmp2; - int f; - Alignment *T; - T=copy_aln (A, NULL); - tmp1=vtmpnam (NULL); - tmp2=vtmpnam (NULL); - cons_l=A->len_aln; - for (a=0; alen_aln; a++) - { - for (f=0,b=0; bnseq && f==0; b++) - { - if (is_gap (A->seq_al[b][a]))f=1; - - } - if (f) - { - cons_l--; - for (b=0; bnseq; b++)T->seq_al[b][a]='-'; - } - } - ST=aln2alifold (T); - } - - - //add or Replace the structure - l=strlen (ST->seq_al[0]); - - if ( l!=A->len_aln) - { - HERE ("\n%s\n%s\n", ST->seq_al[0], A->seq_al[0]); - printf_exit ( EXIT_FAILURE, stderr, "ERROR the predicted structure and the multiple alignment do not have the same length [FATAL:%s]\n", PROGRAM); - - } - - for (a=0; a< l; a++)if (ST->seq_al[0][a]==STOCKHOLM_CHAR)ST->seq_al[0][a]='.'; - if ((i=name_is_in_list ("#=GC SS_cons", A->name, A->nseq, 100))!=-1) - { - sprintf (A->seq_al[i], "%s", ST->seq_al[0]); - } - else - { - A=realloc_aln2 ( A, A->nseq+1, A->len_aln+1); - sprintf (A->name[A->nseq], "#=GC SS_cons"); - sprintf (A->seq_al[A->nseq], "%s", ST->seq_al[0]); - A->nseq++; - } - return A; -} -Alignment * alifold2analyze (Alignment *A, Alignment *ST, char *mode) -{ - int s; - int **list; - int usegap; - - s=name_is_in_list ("#=GC SS_cons", A->name,A->nseq, 100); - - if (s==-1) - { - A=add_alifold2aln (A,ST); - s=name_is_in_list ("#=GC SS_cons", A->name,A->nseq, 100); - } - - list=vienna2list (A->seq_al[s]); - list=alifold_list2cov_list (A, list); - - usegap=0; //do not use gaped positions by default - if (mode && strstr (mode, "usegap"))usegap=1;//count positions with gaps - - if (!mode) - { - A=alifold2cov_stat (A, list,usegap); - } - else - { - if ( strstr (mode, "stat")) A=alifold2cov_stat (A, list, usegap); - if ( strstr (mode, "list")) A=alifold2cov_list (A, list, usegap); - if ( strstr (mode, "aln")) A=alifold2cov_aln (A, list, usegap); - if ( strstr (mode, "color") ) - { - Alignment *C; - C=copy_aln (A, NULL); - C=alifold2cov_cache (C, list, usegap); - A=alifold2cov_aln (A, list, usegap); - if ( strstr ( mode, "ps")) - output_color_ps (A, C, "stdout"); - else - output_color_html (A, C, "stdout"); - exit (EXIT_SUCCESS); - } - } - return A; -} - - -int ** alifold_list2cov_list (Alignment *A, int **list) -{ - int a,b,c,d,p1,p2,s; - int r1, rr1, r2, rr2; - int neutral,watson, comp,tot, occupancy; - int **compmat; - int max, p,k; - int minseq=3; - - int ncomp=0, nwatson=0, nneutral=0, ncomp_wc=0; - int cons_l, fold_l; - int nseq; - - - - for (nseq=0,a=0; a< A->nseq; a++)if ( A->name[a][0]!='#')nseq++; - max=((nseq*(nseq-1))/2); - a=0; - while (list[a]) - { - p1=list[a][0]; - p2=list[a][1]; - watson=0; - comp=0; - neutral=0; - tot=0; - occupancy=0; - for (c=0; cnseq-1; c++) - { - if (A->name[c][0]=='#')continue; - r1=tolower(A->seq_al[c][p1]); - r2=tolower(A->seq_al[c][p2]); - if (is_gap(r1) || is_gap(r2))continue; - for (d=c+1; dnseq; d++) - { - if (A->name[d][0]=='#')continue; - rr1=tolower(A->seq_al[d][p1]); - rr2=tolower(A->seq_al[d][p2]); - if (is_gap(rr1) || is_gap(rr2))continue; - if (is_watson (r1, r2))watson++; - if (is_watson (rr1, rr2))watson++; - if (is_neutral (r1, r2))neutral++; - if (is_neutral (rr1, rr2))neutral++; - if (r1!=rr1 && r2!=rr2)comp++; - occupancy++; - } - - } - watson=(watson*100)/(occupancy*2); - comp=(comp*100)/occupancy; - neutral=(neutral*100)/(occupancy*2); - occupancy=(occupancy*100)/max; - list[a][3]=neutral; - list[a][4]=watson; - list[a][5]=comp; - list[a][6]=occupancy; - - if (list[a][3]<100) - { - if (list[a][5]>0)list[a][7]='I';//compensated incompatible pair - else list[a][7]='i'; //non compensated incompatible pair - } - else - { - list[a][7]='N';//Neutral pair - if (list[a][4]==100) - { - list[a][7]='W';//Watson and Crick - if ( list[a][5]>0)list[a][7]='C'; //Watson and crick compensated - } - else if ( list[a][5]>0) - { - list[a][7]='c';//compensated - } - } - a++; - } - - return list; -} -Alignment *alifold2cov_aln (Alignment *inA,int **list, int ug) -{ - int a=0; - a=0; - Alignment *A; - - A=copy_aln (inA, NULL); - A=realloc_aln2 ( A, A->nseq+1, A->len_aln+1); - sprintf (A->name[A->nseq], "#=GC SS_analyze"); - sprintf (A->seq_al[A->nseq], "%s", A->seq_al[A->nseq-1]); - A->nseq++; - while (list[a]) - { - char s; - if (list[a][6]<100 && !ug); - else - { - s=list[a][7]; - A->seq_al[A->nseq-1][list[a][0]]=s; - A->seq_al[A->nseq-1][list[a][1]]=s; - } - a++; - } - return A; -} -Alignment *alifold2cov_stat (Alignment *A,int **list, int ug) -{ - int fold=0,watson=0, comp=0, compwc=0, incomp=0, neutral=0; - int a; - - a=0; - while (list[a]) - { - int s; - fold++; - if (list[a][6]<100 && !ug); - else - { - s=list[a][7]; - watson +=(s=='W')?1:0; - compwc +=(s=='C')?1:0; - comp +=(s=='c')?1:0; - neutral+=(s=='N')?1:0; - incomp +=(s=='I')?1:0; - } - a++; - } - fprintf ( stdout, "@@ TOT Nseq:%d tot_len: %d fold: %d neutral: %d watson: %d CorWC: %d cor: %d CorIncompatible: %d\n",A->nseq-1, A->len_aln,fold, neutral,watson, compwc,comp,incomp); - return A; -} -Alignment *alifold2cov_cache (Alignment *inA, int **list, int ug) -{ - int a,b, c; - Alignment *A; - - A=copy_aln (inA, NULL); - a=0; - while (list[a]) - { - int v, s; - if (list[a][6]<100 && !ug); - else - { - s=list[a][7]; - if (s=='C')v=9; //red - else if ( s=='c')v=7; //orange - else if ( s=='W')v=5; //Yellow - else if ( s=='N')v=2; //green - else if ( s=='I')v=0; //blue; - for (b=0;bnseq; b++) - { - if (A->name[b][0]=='#'); - else - { - for (c=0; c<2; c++) - { - A->seq_al[b][list[a][c]]='0'+v; - } - } - } - } - a++; - } - return A; -} - -Alignment *alifold2cov_list (Alignment *A,int **list, int ug) -{ - int a,b, s; - - a=0; - while (list[a]) - { - s=list[a][7]; - if (list[a][6]<100 && !ug); - else if (s=='C') - { - fprintf ( stdout, "@@ WC Compensated pair: %4d %4d =>", list[a][0]+1, list [a][1]+1); - for (b=0; bnseq; b++)if (A->name[b][0]!='#')fprintf ( stdout, "[%c%c]", toupper (A->seq_al[b][list[a][0]]), toupper(A->seq_al[b][list[a][1]])); - fprintf (stdout,"\n"); - } - else if (s=='c') - { - fprintf ( stdout, "@@ Neural Compensated pair: %4d %4d =>", list[a][0]+1, list [a][1]+1); - for (b=0; bnseq; b++)if (A->name[b][0]!='#')fprintf ( stdout, "[%c%c]", toupper (A->seq_al[b][list[a][0]]), toupper(A->seq_al[b][list[a][1]])); - fprintf (stdout,"\n"); - } - else if (s=='W') - { - fprintf ( stdout, "@@ WC pair: %4d %4d =>", list[a][0]+1, list [a][1]+1); - for (b=0; bnseq; b++)if (A->name[b][0]!='#')fprintf ( stdout, "[%c%c]", toupper (A->seq_al[b][list[a][0]]), toupper(A->seq_al[b][list[a][1]])); - fprintf (stdout,"\n"); - } - else if (s=='N') - { - fprintf ( stdout, "@@ Neutral pair: %4d %4d =>", list[a][0]+1, list [a][1]+1); - for (b=0; bnseq; b++)if (A->name[b][0]!='#')fprintf ( stdout, "[%c%c]", toupper (A->seq_al[b][list[a][0]]), toupper(A->seq_al[b][list[a][1]])); - fprintf (stdout,"\n"); - } - else if (s=='I') - { - fprintf ( stdout, "@@ incompatible pair: %4d %4d =>", list[a][0]+1, list [a][1]+1); - for (b=0; bnseq; b++)if (A->name[b][0]!='#')fprintf ( stdout, "[%c%c]", toupper (A->seq_al[b][list[a][0]]), toupper(A->seq_al[b][list[a][1]])); - fprintf (stdout,"\n"); - } - a++; - } - - return A; -} - - -Alignment *aln2sample (Alignment *A, int n) -{ - Alignment *B; - int a, b, p; - int **pos; - - B=copy_aln (A, NULL); - - vsrand(0); - - pos=declare_int (A->len_aln, 2); - for (a=0; alen_aln; a++){pos[a][0]=a;pos[a][1]=rand()%(1000*A->len_aln);} - - sort_int (pos, 2, 1, 0, A->len_aln-1); - - n=(n==0)?A->len_aln:(MIN (n, (A->len_aln))); - for (a=0; anseq; b++) - A->seq_al[b][a]=B->seq_al[b][pos[a][0]]; - for (b=0; bnseq; b++) - A->seq_al[b][n]='\0'; - A->len_aln=n; - - free_aln (B); - free_int (pos, -1); - return A; -} -Alignment *aln2bootstrap (Alignment *A, int n) -{ - Alignment *B; - int a, b, p; - - if (n==0)n=A->len_aln; - else A=realloc_aln (A, n+1); - vsrand(0); - B=copy_aln (A, NULL); - for (a=0; alen_aln; - for (b=0; bnseq; b++) - A->seq_al[b][a]=B->seq_al[b][p]; - } - for ( b=0; bnseq; b++)A->seq_al[b][n]='\0'; - A->len_aln=n; - - free_aln (B); - return A; - -} - - -Alignment * aln2random_aln (Alignment *A, char *smode) - -{ - int a, b, n, **res; - int max; - - - - if ( smode==NULL) - { - smode=vcalloc (4, sizeof (char)); - sprintf ( smode, "SCR");//Sequences, Column Residues - } - else if ( strm (smode, "NO"))return A; - - vsrand(0); - max=A->nseq*1000; - - if ( strstr ( smode, "S")) - { - A=aln2scramble_seq (A); - } - if ( strstr ( smode, "C")) - { - - res=declare_int (A->nseq, 2); - for (a=0; a< A->len_aln; a++) - { - for (n=0,b=0;bnseq; b++) - { - if ( !is_gap(A->seq_al[b][a])) - { - res[n][0]=A->seq_al[b][a]; - res[n][1]=rand()%max; - n++; - } - sort_int (res, 2, 1, 0, n-1); - } - for (n=0,b=0;bnseq; b++) - { - if ( !is_gap(A->seq_al[b][a]))A->seq_al[b][a]=res[n++][0]; - } - } - free_int (res, -a); - } - - - //Redistributes the residues randomly without changing the gap pattern - if ( strstr ( smode, "R")) - { - max=A->len_aln*A->nseq; - res=declare_int (max, 2); - - for (n=0,a=0; a< A->len_aln; a++) - { - for (b=0;bnseq; b++) - { - if ( !is_gap(A->seq_al[b][a])) - { - res[n][0]=A->seq_al[b][a]; - res[n][1]=rand()%max; - n++; - } - - } - } - sort_int (res, 2, 1, 0, n-1); - for (n=0,a=0; a< A->len_aln; a++) - { - for (b=0;bnseq; b++) - { - if ( !is_gap(A->seq_al[b][a])) - { - A->seq_al[b][a]=res[n++][0]; - } - - } - } - - free_int (res, -1); - } - - return A; -} -Alignment *score_aln2score_ascii_aln (Alignment *A, Alignment *C) -{ - //Convert the output of T-Coffee evaluate into a printable score_ascii alignment*/ - //A and C must be sorted - //sets to 0 lone residues - int a, b; - - for (a=0; anseq; a++) - for (b=0; blen_aln; b++) - { - - int rC=C->seq_al[a][b]; - int rA=A->seq_al[a][b]; - if ( !strm (A->name[a], C->name[a])){HERE ("Unsorted aln in score_aln2score_ascii"); exit (EXIT_FAILURE);} - - if ( rA=='x' || rA=='X')C->seq_al[a][b]='9'; - else if ( rC >='0' && rC<='9'); - else if ( rC<10)C->seq_al[a][b]='0'+rC; - else if ( rC==NO_COLOR_RESIDUE && !is_gap(rA)) C->seq_al[a][b]='0'; - else if ( rC==NO_COLOR_RESIDUE && is_gap(rA))C->seq_al[a][b]='-'; - } - return C; -} -Alignment*aln2gap_cache (Alignment *A, int val) -{ - Alignment *B; - int a, b, c, nr; - - B=copy_aln (A, NULL); - for (b=0; blen_aln; b++) - { - for (nr=0,a=0; anseq; a++)nr+=!is_gap (A->seq_al[a][b]); - for (a=0; anseq; a++)if (!is_gap(A->seq_al[a][b]))B->seq_al[a][b]=(nr==1)?'0'+val:'1'; - } - return B; -} - -Alignment* aln2case_aln (Alignment *B, char *upper, char *lower) -{ - int a, b, c, up, lo; - Alignment *A; - - A=copy_aln (B, NULL); - - up=(upper)?upper[0]:'u'; - lo=(lower)?lower[0]:'l'; - - for (a=0; anseq; a++) - for (b=0; blen_aln; b++) - { - c=A->seq_al[a][b]; - - if ( is_gap(c)); - else A->seq_al[a][b]=(isupper (c))?up:lo; - } - return A; -} -Alignment *aln2scale (Alignment *A, char *coffset) -{ - int a, b, t, v, n; - char *s1, *s2; - char s[1000]; - int offset; - - if (coffset)offset=atoi(coffset); - else offset=0; - - sprintf (s, "%d", A->len_aln+offset); - n=strlen (s); - - A=realloc_aln2 (A, A->nseq+n, A->len_aln+1); - s1=vcalloc ( n+1, sizeof (char)); - s2=vcalloc ( n+1, sizeof (char)); - - for (a=0; aname[A->nseq+a], "%s", s2); - } - - for (a=0; alen_aln; a++) - { - sprintf (s1, "%d", a+1+offset); - s2=invert_string (s1); - t=strlen (s2); - - for (b=0; b<=n; b++) - { - if (b>=t) v='0'; - else v=s2[b]; - - A->seq_al[A->nseq+b][a]=v; - } - } - - A->nseq+=n; - return A; -} - - - - -int * pos2list (int * pos, int len, int *nl) -{ - int *list; - int a; - nl[0]=0; - list=vcalloc (len, sizeof (int)); - for (a=0; anseq+((B)?B->nseq:0), sizeof (int)); - pos=aln2pos_simple_2 (A); - if (B) - { - n=B->nseq; - for ( a=0; anseq; a++) - { - list[a]=name_is_in_list(B->name[a], A->name, A->nseq, 100); - } - } - else - { - for ( a=0; anseq; a++) - list[a]=a; - n=A->nseq; - } - - - fprintf ( fp, "#"); - for ( b=0; bname[s]); - } - fprintf (fp, "\n"); - - for ( a=0; alen_aln; a++) - { - for ( b=0; bx, where x is the position of residue z of seq1/S1 in S2->seq[index[Seq1/S1]] - */ - int a; - int **index; - char *seq1=NULL, *seq2=NULL; - Alignment *Profile; - - index=vcalloc ( S1->nseq, sizeof (int*)); - - for (a=0; a< S1->nseq; a++) - { - int len1, len2, b, c; - - seq1=S1->seq[a]; - - if (name_index[a][0]==-1) - seq2=NULL; - else if (name_index[a][1]==-1) - { - seq2=S2->seq[name_index[a][0]]; - } - else if ((Profile=seq2R_template_profile (S2, name_index[a][0])) !=NULL) - { - seq2=Profile->seq_al[name_index[a][1]]; - } - - len1=strlen (seq1);len2=strlen (seq2); - index[a]=vcalloc (len2, sizeof(int)); - - - for (c=0,b=0; bx if seq1 is the xth sequence of S2 - ->-1 if seq1 is nowhere to be found - index[seq1 of S1][1]->z if seq1 is the zth sequence within the xth profile of S2 - */ - int **index; - int a, b, x, z; - Alignment *Profile; - index=declare_int (S1->nseq, 2); - - - for ( a=0; anseq; a++) - { - index[a][0]=index[a][1]=-1; - x=name_is_in_list (S1->name[a],S2->name,S2->nseq,100); - if ( x!=-1){index[a][0]=x;index[a][1]=-1;} - for ( b=0; bnseq; b++) - { - if ((Profile=seq2R_template_profile (S2,b))) - { - z=name_is_in_list (S1->name[a],Profile->name,Profile->nseq,100); - if ( z!=-1){index[a][0]=b;index[a][1]=z;b=S2->nseq;} - } - } - } - return index; -} - - - - -int *get_name_index (char **l1, int n1, char **l2, int n2) -{ - int *r; - int a; - /*return Array[Index_L1]=Index_L2 */ - r=vcalloc ( n1, sizeof (int)); - for ( a=0; a< n1; a++) - r[a]=name_is_in_list (l1[a],l2,n2,100); - return r; -} - -int* get_res_index (char *seq0, char *seq1) -{ - int *coor, a; - - if ( !seq0 || !seq1) return NULL; - - - coor=vcalloc ( strlen (seq0)+1, sizeof (int)); - if (!strm (seq0, seq1)) - { - int r0, r1 , isr0, isr1; - int l0=0, l1=0; - Alignment *A; - A=align_two_sequences (seq0,seq1,"pam250mt",-5,-1, "myers_miller_pair_wise"); - - for ( a=0; a< A->len_aln; a++) - { - r0=A->seq_al[0][a];r1=A->seq_al[1][a]; - isr0=!is_gap(r0); - isr1=!is_gap(r1); - l0+= isr0; - l1+= isr1; - if (isr0 && isr1)coor[l0-1]=l1-1; - else if (isr0) coor[l0-1]=-1; - } - free_aln (A); - } - else - { - int l0; - - l0=strlen (seq0); - for ( a=0;a< l0; a++) - coor[a]=a; - } - - return coor; -} - -int change_residue_coordinate ( char *in_seq1, char *in_seq2, int v) -{ - /*Expresses the coordinate of a residue in seq1, in the coordinate system of seq2*/ - - - static char *seq1, *seq2; - static int *coor; - - - if ( seq1 !=in_seq1 || seq2 !=in_seq2) - { - int r0, r1 , isr0, isr1; - int l0=0, l1=0; - Alignment *A; - int a; - - vfree (coor); - seq1=in_seq1, seq2=in_seq2; - A=align_two_sequences (seq1,seq2,"pam250mt", -14, -2, "myers_miller_pair_wise"); - - coor=vcalloc ( A->len_aln, sizeof (int)); - for ( a=0; a< A->len_aln; a++) - { - r0=A->seq_al[0][a];r1=A->seq_al[1][a]; - - isr0=!is_gap(r0); - isr1=!is_gap(r1); - l0+= isr0; - l1+= isr1; - - if (isr0 && isr1)coor[l0-1]=l1-1; - else if (isr0) coor[l0-1]=-1; - } - free_aln (A); - } - return coor[v]; -} - - -int ** minimise_repeat_coor (int **coor, int nseq, Sequence *S) - { - int **new_coor; - int a, min; - new_coor=declare_int ( nseq, 3); - min=return_min_int (coor, nseq, 2); - for ( a=0; a< nseq; a++) - { - new_coor[a][0]=coor[a][0]; - new_coor[a][1]=coor[a][1]; - new_coor[a][2]=min; - } - return new_coor; - } -int ** get_nol_seq ( Constraint_list *CL, int **coor, int nseq, Sequence *S) - { - int a, s, p, l, nl; - int **buf; - int **new_coor; - - new_coor=declare_int ( nseq+1, 3); - - - buf=get_undefined_list ( CL); - - - - for ( a=0; a< nseq; a++)buf[coor[a][0]][coor[a][1]]=1; - - - for ( a=0; a< nseq; a++) - { - s=coor[a][0]; - p=coor[a][1]+1; - l=strlen(S->seq[s]); - nl=0; - while ( p<=l && !buf[s][p++])nl++; - new_coor[a][0]=s; - new_coor[a][1]=coor[a][1]; - new_coor[a][2]=nl; - } - free_int ( buf, -1); - return new_coor; - } - - - -int compare_pos_column( int **pos1,int p1, int **pos2,int p2, int nseq) - { - int a,v1, v2; - int identical=0; - - - - for ( a=0; a< nseq; a++) - { - - v1=pos1[a][p1]; - v2=pos2[a][p2]; - - if (v1>0 || v2>0) - { - if ( v1!=v2)return 0; - else identical=1; - } - } - - return identical; - } - -char *seq2alphabet (Sequence *S) -{ - return array2alphabet (S->seq, S->nseq, ""); -} - -char *aln2alphabet (Alignment *A) -{ - return array2alphabet (A->seq_al, A->nseq, ""); -} - -char *array2alphabet (char **array, int n, char *forbiden) -{ - int a, b, l; - int *hasch; - char *alphabet; - - hasch=vcalloc (256, sizeof (int)); - alphabet=vcalloc ( 257, sizeof (char)); - - - for ( a=0; anseq; a++) - { - char s; - s=Pred->seq_al[a][pos]; - if (!is_gap(s)) - { - score[tolower(s)]++; - tot++; - } - } - - if ( score['h']>score['i'] && score['h']>score['o'])cons='h'; - - else if ( score['i']>score['o'])cons='i'; - else cons='o'; - if (tot==0) return ""; - - - if (mode==VERBOSE)sprintf (result, " H: %3d I: %3d O: %3d P: %c", (score['h']*100)/tot, (score['i']*100)/tot, (score['o']*100)/tot, cons); - else if (mode == SHORT)sprintf ( result, "%c", cons); - score['h']=score['o']=score['i']=0; - return result; -} - - -Alignment * aln2hmmtop_pred (Alignment *A) - { - int a, b, c; - char *buf, *pred; - Alignment *PA; - - PA=copy_aln (A, NULL); - buf=vcalloc ( A->len_aln+1, sizeof (char)); - - for ( a=0; a< A->nseq; a++) - { - sprintf (buf, "%s", A->seq_al[a]); - pred=seq2tmstruc (buf); - for (c=0,b=0; blen_aln; b++) - { - if (!is_gap (PA->seq_al[a][b]))PA->seq_al[a][b]=pred[c++]; - } - vfree (pred); - } - vfree (buf); - return PA; - } - -char * seq2tmstruc ( char *seq) - { - static Sequence *S; - char *seqfile, *predfile, *buf; - FILE *fp; - - seqfile=vtmpnam (NULL); - predfile=vtmpnam (NULL); - - fp=vfopen (seqfile, "w"); - fprintf ( fp, ">seq1\n%s", seq); - vfclose (fp); - - - printf_system ( "fasta_seq2hmmtop_fasta.pl -in=%s -out=%s -arch=%s/%s -psv=%s/%s", seqfile, predfile, get_mcoffee_4_tcoffee(), "hmmtop.arch", get_mcoffee_4_tcoffee(), "hmmtop.psv"); - S=get_fasta_sequence (predfile, NULL); - buf=vcalloc ( strlen (S->seq[0])+1, sizeof (char)); - sprintf ( buf, "%s", S->seq[0]); - - free_sequence (S, S->nseq); - - return buf; - } - -char * set_blast_default_values() -{ - set_string_variable ("blast_server", (getenv ("blast_server_4_TCOFFEE"))?getenv ("blast_server_4_TCOFFEE"):"EBI"); - set_string_variable ("pdb_db", (getenv ("pdb_db_4_TCOFFEE"))?getenv ("pdb_db_4_TCOFFEE"):"pdb"); - set_string_variable ("prot_db", (getenv ("prot_db_4_TCOFFEE"))?getenv ("prot_db_4_TCOFFEE"):"uniprot"); - set_int_variable ("prot_min_sim", 0); - set_int_variable ("prot_max_sim", 100); - - set_int_variable ("prot_min_cov", 0); - set_int_variable ("prot_max_cov", 100); - - set_int_variable ("pdb_min_sim", 0); - set_int_variable ("pdb_max_sim", 100); - set_int_variable ("pdb_min_cov", 0); - set_int_variable ("pdb_max_cov", 100); - - return; -} - -char * seq2pdb (Sequence *S) -{ - set_blast_default_values(); - S->nseq=1; - S=seq2template_seq (S, "PDB", NULL); - return seq2P_pdb_id(S,0); -} - -Alignment * seq2blast ( Sequence *S) -{ - Alignment *A; - set_blast_default_values(); - - if (S->nseq==1) - { - S=seq2template_seq (S, "BLAST", NULL); - A=seq2R_template_profile(S,0); - sprintf ( A->name[0], "%s", S->name[0]); - } - else - { - int a; - for (a=0; a< S->nseq; a++) - { - Sequence *NS; - char name[1000]; - NS=fill_sequence_struc(1, &(S->seq[a]), &(S->name[a])); - NS=seq2template_seq (NS, "BLAST", NULL); - A=seq2R_template_profile(NS,0); - sprintf ( name, "%s.prf", S->name[a]); - - output_fasta_aln (name,A); - fprintf (stdout, "\nOUTPUT %s\n", name); - } - exit (EXIT_SUCCESS); - } - return A; -} - - - - -Sequence * seq2unique_name_seq ( Sequence *S) -{ - int a; - if ((a=name_list2unique_name_list (S->nseq, S->name))) - { - add_warning ( stderr, "\nWarning: Sequence %s is duplicated in file %s. The sequence will be renamed", S->name[a-1], S->file[a-1]); - } - return S; -} -Alignment * aln2unique_name_aln ( Alignment *S) -{ - int a; - if ((a=name_list2unique_name_list (S->nseq, S->name))) - { - add_warning ( stderr, "\nWarning: Sequence %s is duplicated in file %s. The sequence will be renamed", S->name[a-1], S->file[a-1]); - } - return S; -} - - -int name_list2unique_name_list (int n, char **name) -{ - int duplicate=0; - int a, b; - - for (a=0; a%s\naggggg\n", name[a]); - vfclose (fp); - printf_system ("fasta_aln2fasta_aln_unique_name.pl %s > %s", tmp1, tmp2); - S=get_fasta_sequence (tmp2, NULL); - for (a=0; aname[a])+1)); - sprintf ( name[a], "%s", S->name [a]); - } - free_sequence(S, -1); - } - return duplicate; -} - -Sequence* seq2clean_seq (Sequence *S, char *alp) -{ - int a, b, c, d, l; - - for (a=0; a< S->nseq; a++) - { - l=strlen (S->seq[a]); - for (d=0,b=0; bseq[a][b]; - if ( alp==NULL && !strchr (AA_ALPHABET, c) && !strchr (DNA_ALPHABET, c)); - else if (alp && strchr (alp, c)); - else S->seq[a][d++]=c; - } - S->seq[a][d]='\0'; - S->len[a]=strlen (S->seq[a]); - } - return S; -} -int ** seq2aln_pos (Alignment *A, int *ns, int **l_s) - { - int **code; - int a, b,c, d,l, p , g; - - - l=MAX(strlen (A->seq_al[l_s[0][0]]), strlen (A->seq_al[l_s[1][0]])); - code=declare_int ((A->S)->nseq,l+1); - - for (c=0; c<2; c++) - { - l=strlen (A->seq_al[l_s[c][0]]); - for (d=0; dorder[l_s[c][d]][0]; - for (p=0, b=0; bseq_al[l_s[c][d]][b]); - if (!g){p++; code[a][p]=b+1;} - } - } - } - return code; - } - -Alignment *local_maln2global_maln (char *seq, Alignment *A) - { - /*inputs a BLAST alignmnent where the master sequence may be partila - outputs the same alignment, while amkeing sure the profile is perfectly in sink with its master sequence - */ - - int a, b, c; - int start, end, rend; - char qname[100], *p; - Alignment *B=NULL; - - sprintf ( qname, "%s", A->name[0]); - p=strtok (qname, "_"); - if ( !strm (p, "QUERY")) - { - fprintf ( stderr, "\nUnappropriate format for the alignment [%s:FATAL]", PROGRAM); - myexit (EXIT_FAILURE); - } - - start=atoi(strtok (NULL, "_")); - end=atoi(strtok (NULL, "_")); - rend=strlen (seq); - - B=copy_aln (A,NULL); - if ( start>1 || endseq_al[0][a]=seq[a]; - for ( b=1; b< A->nseq; b++)A->seq_al[b][a]='-'; - } - - for (c=0,a=start-1; a< end; a++, c++) - { - A->seq_al[0][a]=seq[a]; - for ( b=1; b< A->nseq; b++) - { - A->seq_al[b][a]=B->seq_al[b][c]; - } - } - for ( a=end; aseq_al[0][a]=seq[a]; - for ( b=1; b< A->nseq; b++)A->seq_al[b][a]='-'; - } - for ( a=0; a< A->nseq; a++) A->seq_al[a][rend]='\0'; - free_aln (B); - - A->len_aln=rend; - return A; - } - -int ** aln2inv_pos ( Alignment *A) -{ - int **pos,a; - pos=vcalloc (A->nseq, sizeof (char*)); - for (a=0; a< A->nseq; a++)pos[a]=seq2inv_pos (A->seq_al[a]); - return pos; -} -int * seq2inv_pos ( char *seq) -{ - /*returns a list where each value gives the index of the corresponding residue in seq*/ - /*Numbering: 1 to L : Analogy to the aln2pos*/ - - int a,l1, l2; - int *pos; - - l1=strlen ( seq); - for ( l2=a=0; a< l1; a++)l2+=1-is_gap(seq[a]); - pos=vcalloc (l2+1, sizeof (int)); - for ( l2=a=0; a< l1; a++)if (!is_gap(seq[a]))pos[++l2]=a+1; - return pos; -} - - -int ** aln2pos_simple_2 (Alignment *A) - { - int **pos1; - int **pos2; - pos1=aln2pos_simple (A, A->nseq); - pos2=duplicate_int (pos1, A->nseq,read_size_int (pos1[0],sizeof (int))); - pos1=aln2pos_simple (NULL, 0); - return pos2; - } -int ** aln2pos_simple (Alignment *A, int n_nseq, ...) - { - /* - function documentation: start - int ** aln2pos_simple (Alignment *A, int n_nseq, ...) - -####with two parameter only: Alignment *A, int n_nseq - - this function turns A into pos, a matrix where each residue is replace by its index according to the complete sequence. - the indices in pos are computed using A->order[x][1] that contains the indice of the first residue of seq x of A - - n_nseq MUST not be null - -####with more than two param: - int ** aln2pos_simple (Alignment *A, int n_nseq, int *ns, int **ls) - n_nseq must be set to 0 for the param 3 and four to be read - - ns[x]=number seq in group - ls[x]=list of the sequences in group x ( size=ns[x]) - - The computation of the indices is only carried out on the scpecified residues - -####IMPORTANT - in pos, the numbering of the residues goes from 1 to L: - pos[0][0]=3, means that the first position of the first sequence - in the alignmnet contains residue #3 from sequence A->order[0][0]; - - function documentation: end - */ - - int a, b,c, p, g,l; - int **T; - - int max_nseq; - int n_len=0; - - int *list=NULL; - int *ns=NULL; - int **ls=NULL; - - - - va_list ap; - - - if ( A==NULL) - { - return NULL; - } - else - { - if ( n_nseq>0) - { - list=vcalloc(n_nseq, sizeof (int)); - for ( a=0; a< n_nseq; a++)list[a]=a; - } - else - { - va_start (ap, n_nseq); - ns=va_arg(ap, int * ); - ls=va_arg(ap, int **); - va_end(ap); - list=vcalloc ( ns[0]+ns[1], sizeof (int)); - n_nseq=0; - for ( a=0; a< ns[0]; a++)list[n_nseq++]=ls[0][a]; - for ( a=0; a< ns[1]; a++)list[n_nseq++]=ls[1][a]; - - } - max_nseq=MAX(read_size_int(A->order,sizeof (int*)),return_max_int (A->order, read_size_int(A->order,sizeof (int*)),0))+1; - n_len=get_longest_string ( A->seq_al,A->max_n_seq, NULL, NULL)+1; - - - T=declare_int (max_nseq, n_len); - for ( c=0; c< n_nseq; c++) - { - a=list[c]; - l=strlen ( A->seq_al[a]); - - for ( p=A->order[a][1],b=0; bseq_al[a][b]); - p+=g; - T[a][b]=(g==1)?p:-(1+p); - if ( A->seq_al[a][b]==UNDEFINED_RESIDUE)T[a][b]=0; - if ( A->seq_cache && T[a][b]>0)T[a][b]=A->seq_cache[A->order[a][0]][T[a][b]]; - } - } - vfree (list); - } - - return T; - } -Alignment ** split_seq_in_aln_list ( Alignment **aln, Sequence *S, int n_seq, char **seq_list) - { - int a, b, c; - char * long_seq=NULL; - int len,l; - int **translation; - int **table; - - - - - if ( aln==NULL)return NULL; - translation=declare_int ( S->nseq,2); - - for (len=0,a=0; a< S->nseq; a++) - { - if((b=name_is_in_list (S->name[a],seq_list, n_seq, 100))!=-1) - { - l=strlen(S->seq[a])+1; - long_seq=vrealloc(long_seq,(len+l+1)*sizeof(char)); - long_seq=strcat(long_seq, S->seq[a]); - long_seq=strcat(long_seq, "*"); - - translation[a][0]=b; - translation[a][1]=len; - len+=l; - } - else translation[a][0]=-1; - } - - long_seq[len-1]='\0'; - len--; - - table=declare_int ( len+1, 2); - - for ( b=0,a=0; a< S->nseq; a++) - { - if ( translation[a][0]!=-1) - { - c=1; - while (long_seq[b]!='\0' && long_seq[b]!='*') - { - table[b+1][1]=c++; - table[b+1][0]=translation[a][0]; - b++; - } - table[b][1]=c++; - table[b][0]=translation[a][0]; - b++; - } - } - - for ( a=0; a< (aln[-1])->nseq; a++) - { - for ( b=0; b< (aln[a])->nseq; b++) - { - - (aln[a])->order[b][0]=table[(aln[a])->order[b][1]][0]; - (aln[a])->order[b][1]=table[(aln[a])->order[b][1]][1]; - sprintf ( (aln[a])->name[b],"%s_%d_%d", S->name[(aln[a])->order[b][0]],a+1,b+1); - } - } - free_int (translation, -1); - free_int (table, -1); - return aln; - } - - - -Sequence * fill_sequence_struc ( int nseq, char **sequences, char **seq_name) - { - int a; - Sequence *S; - int shortest, longuest; - - if (!sequences) - { - shortest=longuest=0; - } - else if ( nseq>1) - { - shortest=get_shortest_string( sequences, nseq, NULL, NULL); - longuest=get_longest_string (sequences, nseq, NULL, NULL); - } - else if ( nseq==1) - { - shortest=longuest=strlen (sequences[0]); - } - else - { - return NULL; - } - - - S=declare_sequence (shortest, longuest,nseq); - S->nseq=nseq; - - if (sequences)S->seq=copy_char ( sequences, S->seq, nseq, -1); - else S->seq=declare_char (S->nseq, 1); - - S->name=copy_char ( seq_name, S->name,nseq, -1); - - ungap_array (S->seq,nseq); - for ( a=0; a< S->nseq; a++)S->len[a]=strlen(S->seq[a]); - return S; - } - - -Alignment * thread_profile_files2aln (Alignment *A, char *template_file, Fname *F) -{ - - Alignment *P; - int a; - - if (!A->S)A->S=aln2seq (A); - if (template_file)A->S=seq2template_seq (A->S, template_file,F); - for ( a=0; a< A->nseq; a++) - { - P=seq2R_template_profile (A->S, a); - if ( P) - { - P->expand=1; - sprintf ( P->name[0], "%s", A->name[a]); - } - } - - return expand_aln (A); -} - - - - -Alignment * expand_aln (Alignment *A) - { - /*This function expands the profiles within an alignment*/ - - - int a, b, d, e; - Alignment *MAIN=NULL, *SUB=NULL; - int n_sub_seq=0; - int new_nseq=0; - int *list; - Alignment *Profile; - - if ( !A)return A; - - - - list=vcalloc (A->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++) - { - Profile=seq2R_template_profile (A->S, A->order[a][0]); - if (Profile && Profile->expand) - { - new_nseq+=Profile->nseq; - } - else - { - new_nseq++; - list[n_sub_seq++]=a; - } - } - - if ( n_sub_seq==A->nseq){vfree(list);return A;} - else if (n_sub_seq==0){MAIN=copy_aln (A, MAIN);MAIN->nseq=0;} - else - { - MAIN=extract_sub_aln (A, n_sub_seq, list); - } - vfree(list); - - - for ( a=0; a< A->nseq; a++) - { - Profile=seq2R_template_profile (A->S, A->order[a][0]); - if ( Profile && Profile->expand) - { - SUB=copy_aln (Profile,SUB); - SUB=realloc_aln2(SUB, SUB->nseq, A->len_aln+1); - - for ( e=0,b=0; b< A->len_aln; b++) - { - if ( is_gap(A->seq_al[a][b])) - {for (d=0; d< SUB->nseq; d++)SUB->seq_al[d][b]='-';} - else - { - for(d=0; dnseq; d++)SUB->seq_al[d][b]=Profile->seq_al[d][e]; - e++; - } - - } - MAIN=stack_aln(MAIN, SUB); - } - } - free_aln (A); - free_aln (SUB); - return MAIN; - } -Alignment * expand_number_aln (Alignment *A,Alignment *EA) - { - /*This function expands the profiles within an alignment*/ - - - int a, b, d, e; - Alignment *MAIN=NULL, *SUB=NULL, *C=NULL; - int n_sub_seq=0; - int new_nseq=0; - int *list; - Alignment *Profile; - - if ( !EA || !A)return EA; - - if ( EA->nseqnseq) - { - fprintf (stderr, "\n[ERROR:expand_number_aln] Using as a master an expanded aln (%d %d) [FATAL:%s]", EA->nseq, A->nseq,PROGRAM); - EA->A=A->A=NULL; - print_aln (EA); - print_aln (A); - myexit (EXIT_FAILURE); - } - - - list=vcalloc (EA->nseq, sizeof (int)); - for ( a=0; a< EA->nseq; a++) - { - Profile=seq2R_template_profile (EA->S, EA->order[a][0]); - if (Profile && Profile->expand)new_nseq+=Profile->nseq; - else - { - new_nseq++; - list[n_sub_seq++]=a; - } - } - - if ( n_sub_seq==EA->nseq){vfree(list);return EA;} - else if (n_sub_seq==0){MAIN=copy_aln (EA, MAIN);MAIN->nseq=0;} - else - { - MAIN=extract_sub_aln (EA, n_sub_seq, list); - } - - - list[0]=EA->nseq; - C=extract_sub_aln (EA,1, list); - vfree(list); - - - - for ( a=0; a< EA->nseq; a++) - { - Profile=seq2R_template_profile (EA->S, EA->order[a][0]); - if ( Profile && Profile->expand) - { - SUB=copy_aln (Profile,SUB); - SUB=realloc_aln2(SUB, SUB->nseq, EA->len_aln+1); - - for ( e=0,b=0; b<= EA->len_aln; b++) - { - if (is_gap(A->seq_al[a][b])) - { - for ( d=0; dnseq; d++) - SUB->seq_al[d][b]=NO_COLOR_RESIDUE; - } - else - { - for ( d=0; dnseq; d++) - { - - if ( is_gap (Profile->seq_al[d][e])) - { - SUB->seq_al[d][b]=NO_COLOR_RESIDUE; - } - else SUB->seq_al[d][b]=EA->seq_al[a][b]; - } - e++; - } - } - for (d=0; d< SUB->nseq; d++)SUB->score_seq[d]=EA->score_seq[a]; - - MAIN=stack_aln(MAIN, SUB); - } - } - - MAIN=stack_aln(MAIN, C); - MAIN->nseq--; - MAIN->score=MAIN->score_aln=EA->score_aln; - - free_aln (SUB); - free_aln (EA); - - free_aln (C); - - return MAIN; - } - -Alignment * probabilistic_rm_aa ( Alignment *A, int pos, int len) -{ - int random_len=0; - int a, b; - int left, right; - - if ( len<0) - { - random_len=1; - len=-len; - } - - vsrand(0); - - if (pos==0)pos= (rand()%(A->len_aln-(2*len+len))) +len; - - - for ( a=0; a< A->nseq; a++) - { - if (random_len)left =rand()%len; - else left=len; - if (random_len)right=rand()%len; - else right=len; - if ( (pos-right)<0 || (pos+left)>A->len_aln) - { - add_warning ( stderr, "\nWarning: probabilistic_rm_aa, pos out of range [%s]\n", PROGRAM); - } - else - for ( b=pos-right; bseq_al[a][b]=(b==pos)?'~':'*'; - } - - ungap_aln (A); - free_sequence ( A->S, A->nseq); - A->S=aln2seq (A); - return A; - -} - -Alignment * remove_gap_column ( Alignment *A, char *mode) - { - int a, b; - char *p; - int *seq_list; - int nseq=0; - int keep_col, cl; - - - seq_list =vcalloc ( A->nseq, sizeof (int)); - while ( (p=strtok(mode, ":"))) - { - mode=NULL; - if (p[0]=='#') - { - seq_list[nseq++]=atoi(p+1)-1; - } - else if ( (a=name_is_in_list (p, A->name, A->nseq, 100))!=-1) - { - seq_list[nseq++]=a; - } - } - - if ( nseq==0) - { - for ( a=0; a< A->nseq; a++)seq_list[a]=a; - nseq=A->nseq; - } - - for ( cl=0,a=0; a<=A->len_aln; a++) - { - for (keep_col=1, b=0; b< nseq && keep_col; b++) - { - keep_col=(is_gap(A->seq_al[seq_list[b]][a]))?0:keep_col; - } - - if ( keep_col) - { - for ( b=0; b< A->nseq; b++) - { - A->seq_al[b][cl]=A->seq_al[b][a]; - } - cl++; - } - else - { - for ( b=0; b< A->nseq; b++) - { - A->seq_al[b][cl]='-'; - } - cl++; - } - } - A->len_aln=cl; - vfree (seq_list); - - return A; - } - - -Alignment * ungap_sub_aln (Alignment *A, int ns, int *ls) - { - - int a, b, c,t; - int len; - - len=strlen ( A->seq_al[ls[0]]); - - for ( c=0,a=0; aseq_al[ls[b]][a]); - if (t==ns); - else - { - for ( b=0; bseq_al[ls[b]][c]=A->seq_al[ls[b]][a]; - c++; - } - } - for ( b=0; bseq_al[ls[b]][c]='\0'; - return A; - } - -Sequence * ungap_seq ( Sequence *S) - { - int a; - - if ( !S)return NULL; - ungap(S->seq[0]); - S->max_len=S->min_len=strlen (S->seq[0]); - for ( a=0; a< S->nseq; a++) - { - ungap(S->seq[a]); - S->len[a]=strlen (S->seq[a]); - S->max_len=MAX(S->max_len,S->len[a]); - S->min_len=MAX(S->min_len,S->len[a]); - } - return S; - - } -Alignment * unalign_aln (Alignment *A, Alignment *C, int t) -{ - int a, b, pos, len; - Sequence *S; - - for (a=0; anseq; a++) - for (b=0; blen_aln; b++) - { - int res=C->seq_al[a][b]; - A->seq_al[a][b]=toupper(A->seq_al[a][b]); - if ((isdigit (res) && (res-'0')<=t)) - A->seq_al[a][b]=tolower(A->seq_al[a][b]); - } - - - for (pos=-1, a=0; anseq; a++) - { - b=0; - while ( C->seq_al[a][b]) - { - int res=C->seq_al[a][b]; - if ((isdigit (res) && (res-'0')<=t)) - { - if (pos==-1){pos=b;len=1;} - else len++; - } - else if (pos!=-1) - { - - C=unalign_aln_pos(C,a,pos, len); - pos=-1; - } - b++; - } - if ( pos!=-1){C=unalign_aln_pos(C,a,pos, len);pos=-1;} - } - S=aln2seq (A); - thread_seq_struc2aln (C, S); - A=realloc_aln2 (A, A->nseq, C->len_aln+1); - A->len_aln=C->len_aln; - for (a=0; anseq; a++)sprintf ( A->seq_al[a], "%s", C->seq_al[a]); - ungap_aln (A); - - free_sequence (S, -1); - return A; -} -Alignment * unalign_aln_pos (Alignment *A, int s, int p, int l) -{ - int a; - char *buf; - int unalign=0; - - - buf=vcalloc (l+1, sizeof (char)); - for (a=0; aseq_al[s][p+a]; - A->seq_al[s][p+a]='-'; - } - - - A=insert_gap_col (A,p, l); - for (a=0; aseq_al[s][p+a]=buf[a]; - } - vfree (buf); - return A; -} -Alignment * insert_gap_col (Alignment *A, int p, int l) -{ - int a, c; - char *buf; - char *gap; - - gap=generate_null(l); - if ( !A || p>=A->len_aln || p<0 || p<=0)return A; - - buf=vcalloc (A->len_aln+l+1, sizeof (char)); - A=realloc_aln2(A,A->nseq, A->len_aln+l+1); - for (a=0; anseq; a++) - { - c=A->seq_al[a][p]; - A->seq_al[a][p]='\0'; - sprintf ( buf, "%s%s%c%s", A->seq_al[a],gap,c,A->seq_al[a]+p+1); - sprintf (A->seq_al[a], "%s", buf); - } - vfree (buf); - A->len_aln+=l; - return A; -} -Alignment * unalign_residues (Alignment *A, int si1, int si2) -{ - char *s1, *s2, *ns1, *ns2; - int l, a, b,r1, r2; - - s1=A->seq_al[si1];s2=A->seq_al[si2]; - l=strlen (s1); - - ns1=vcalloc (2*l+1, sizeof (char)); - ns2=vcalloc (2*l+1, sizeof (char)); - - for (b=a=0; a< l; a++) - { - r1=s1[a]; r2=s2[a]; - if (is_gap(r1) || is_gap(r2) || isupper (r1) || isupper(r2)) - { - ns1[b]=(r1=='.')?'-':r1; - ns2[b]=(r2=='.')?'-':r2; - b++; - } - else - { - ns1[b]=r1; - ns2[b]='-'; - b++; - ns2[b]=r2; - ns1[b]='-'; - b++; - } - } - ns1[b]='\0'; - ns2[b]='\0'; - A->seq_al[si1]=ns1; - A->seq_al[si2]=ns2; - - - A->len_aln=strlen (ns1); - return A; -} -Alignment *degap_aln (Alignment *A) -{ - //Reomove all the gaps - int a; - for ( a=0; a< A->nseq; a++)ungap (A->seq_al[a]); - return A; -} - -Alignment *ungap_aln_n ( Alignment *A, int p) - { -/*remove all the columns of gap-only within an alignment*/ - int a, b, c; - int t; - int gp; - - if ( A->nseq==0)return A; - - for ( c=0,a=0; a< A->len_aln; a++) - { - for ( t=0,b=0; bnseq; b++) - t+=is_gap(A->seq_al[b][a]); - gp=(t*100)/A->nseq; - if (p>0 && (gp>=p || (t==A->nseq && p==100) || (t && p==1)));//Remove columns containing more than p% gaps - else if (p<0 && (gp<=p || (t==0 && p==-100) ||(t && p==-1)));//remove columns containing less than p% gaps - else - { - for ( b=0; bnseq; b++) - A->seq_al[b][c]=A->seq_al[b][a]; - c++; - } - } - for ( b=0; bnseq; b++)A->seq_al[b][c]='\0'; - A->len_aln=c; - return A; - } - -Alignment *ungap_aln ( Alignment *A) -{ - return ungap_aln_n (A, 100); -} -/* -Alignment *ungap_aln ( Alignment *A) - { - int a, b, c,t; - - for ( c=0,a=0; a< A->len_aln; a++) - { - for ( t=0,b=0; bnseq; b++) - t+=is_gap(A->seq_al[b][a]); - if (t==A->nseq); - else - { - for ( b=0; bnseq; b++) - A->seq_al[b][c]=A->seq_al[b][a]; - c++; - } - } - for ( b=0; bnseq; b++)A->seq_al[b][c]='\0'; - A->len_aln=c; - return A; - - } -*/ - - -Alignment *remove_end (Alignment *A) - { - int a, b, d; - int left, right; - - for (a=0; a< A->len_aln; a++) - { - for ( b=0, d=0; b< A->nseq; b++) - if ( !is_gap(A->seq_al[b][a]))d++; - if ( d>1)break; - } - left=a; - for (a=A->len_aln-1; a>0; a--) - { - for ( b=0, d=0; b< A->nseq; b++) - if ( !is_gap(A->seq_al[b][a]))d++; - if ( d>1)break; - } - right=a; - - return extract_aln(A, left, right+1); - } - -Alignment* condense_aln (Alignment *A) -{ - /* condense complementarz columns: - X- X - -X ....>X - X- X - - */ - int a, b, plen, n,m, r1, r2; - - plen=0; - while ( A->len_aln !=plen) - { - plen=A->len_aln; - for ( a=0; a< A->len_aln-1; a++) - { - for ( n=m=b=0; b< A->nseq; b++) - { - r1=is_gap(A->seq_al[b][a]); - r2=is_gap(A->seq_al[b][a+1]); - n+=(r1 || r2); - m+=r1; - } - - if ( n==A->nseq && m!=A->nseq) - { - for (b=0; b< A->nseq; b++) - { - if (!is_gap(A->seq_al[b][a+1])) - { - A->seq_al[b][a]=A->seq_al[b][a+1]; - A->seq_al[b][a+1]='-'; - } - } - a++; - } - } - } - A=ungap_aln(A); - return A; -} - - - - -void compress_aln ( Alignment *A) - { - - /*remove all the columns of gap-only within an alignment*/ - int a, b, c, d; - - - - for (c=0, a=0; a< A->len_aln; a++) - { - for ( b=0, d=0; b< A->nseq; b++) - if ( A->seq_al[b][a]!='-'){d=1; break;} - if ( d==0); - else - { - for (b=0; b< A->nseq; b++) - A->seq_al[b][c]=A->seq_al[b][a]; - c++; - } - } - A->len_aln=c; - - for ( a=0; a< A->nseq; a++) - A->seq_al[a][c]='\0'; - } - -Alignment *seq_coor2aln ( Sequence *S, Alignment *A, int **coor, int nseq) - { - int a; - char *buf; - - A=realloc_alignment2(A, nseq, return_maxlen ( S->seq, S->nseq)+1); - for ( a=0; a< S->nseq; a++)sprintf ( A->file[a], "%s", S->file[a]); - for ( a=0; a< nseq; a++) - { - sprintf (A->name[a], "Repeat_%d_%d", a, coor[a][0]); - buf=extract_char ( S->seq[coor[a][0]], coor[a][1]-1, coor[a][2]); - sprintf ( A->seq_al[a],"%s", buf); - vfree(buf); - A->order[a][0]=0; - A->order[a][1]=coor[a][1]-1; - } - A->nseq=nseq; - return A; - } - -Alignment *strings2aln (int nseq,...) - { - /*strings2aln(nseq, , , , ....)*/ - va_list ap; - char **list, **list2; - char **name, **name2; - Sequence *S; - Alignment *A; - int a, max; - - va_start(ap, nseq); - list=vcalloc (nseq, sizeof (char*)); - name=vcalloc (nseq, sizeof (char*)); - for ( a=0; a< nseq; a++) - { - name[a]=va_arg(ap,char*); - list[a]=va_arg(ap,char*); - - } - va_end(ap); - - for ( max=0,a=0; a< nseq; a++) - { - max=(strlen (list[a])>max)?strlen(list[a]):max; - } - list2=declare_char (nseq, max+1); - name2=declare_char (nseq, MAXNAMES+1); - - for ( a=0; a< nseq; a++) - { - sprintf ( list2[a], "%s", list[a]); - sprintf ( name2[a], "%s", name[a]); - } - - - S=fill_sequence_struc(nseq,list2,name2); - - free_char (list2, -1); - free_char (name2, -1); - vfree (list); - vfree(name); - A=seq2aln(S,NULL, 1); - return A; - } -Alignment *seq2aln ( Sequence *S, Alignment *A,int rm_gap) - { - int a; - - A=realloc_alignment2(A, S->nseq, S->max_len+1); - for ( a=0; a< S->nseq; a++)sprintf ( A->file[a], "%s", S->file[a]); - A->nseq=S->nseq; - A->max_len=S->max_len; - A->min_len=S->min_len; - - for ( a=0; a< S->nseq; a++) - { - A->order[a][0]=a; - A->order[a][1]=0; - - sprintf ( A->seq_comment[a], "%s", S->seq_comment[a]); - sprintf ( A->aln_comment[a], "%s", S->aln_comment[a]); - - sprintf ( A->name[a], "%s", S->name[a]); - sprintf ( A->seq_al[a], "%s", S->seq[a]); - - ungap ( A->seq_al[a]); - A->len[a]=strlen ( A->seq_al[a]); - - if ( rm_gap==0 || rm_gap==NO_PAD)sprintf ( A->seq_al[a], "%s", S->seq[a]); - - } - if (rm_gap!=NO_PAD)padd_aln (A); - A->S=S; - return A; - } - -Alignment *padd_aln ( Alignment *A) -{ - A->seq_al=padd_string (A->seq_al, A->nseq, '-'); - A->len_aln=strlen (A->seq_al[0]); - return A; -} - -char **padd_string ( char **string, int n,char pad) -{ - /*Pads a the strings so that they all have the same length*/ - - int max_len, a; - char *buf; - - max_len=get_longest_string (string,n, NULL, NULL); - for (a=0; anseq; a++) sprintf (A->name[a], "tmpname_%d", seqindex++); - - R=copy_aln (A, NULL); - for (c=0, a=0; a< A->len_aln; a++) - { - if ( is_gap (A->seq_al[0][a])); - else - { - for ( b=0; bnseq; b++) - R->seq_al[b][c]=A->seq_al[b][a]; - c++; - } - } - for ( a=0; a< A->nseq; a++)R->seq_al[a][c]='\0'; - R->len_aln=c; - R->S=aln2seq (R); - - free_aln (S); - free_aln (P); - free_aln (A); - - return R; -} - -Alignment * add_align_seq2aln ( Alignment *A, char *seq, char *seq_name) - { - if ( !A) - { - A=declare_aln (NULL); - A=realloc_aln2 ( A, 1, strlen (seq)+1); - A->nseq=0; - sprintf ( A->name[A->nseq], "%s", seq_name); - sprintf ( A->seq_al[A->nseq], "%s", seq); - A->nseq++; - - } - else if ( strlen (seq)!=A->len_aln) - { - fprintf ( stderr, "\nError: Attempt to stack incompatible aln and aligned sequence[FATAL]\n"); - myexit (EXIT_FAILURE); - A=NULL; - } - else - { - - A=realloc_aln2 ( A, A->nseq+1, A->len_aln+1); - sprintf ( A->name[A->nseq], "%s", seq_name); - sprintf ( A->seq_al[A->nseq], "%s", seq); - A->nseq++; - } - return A; - } - - -Alignment *aln2number (Alignment *A) - { - A->seq_al=char_array2number(A->seq_al, A->nseq); - return A; - } -Sequence *seq2number (Sequence *A) - { - A->seq=char_array2number(A->seq, A->nseq); - return A; - } - -Sequence * aln2seq (Alignment *A) -{ - return aln2seq_main(A, RM_GAP); -} -Sequence * aln2seq_main (Alignment *A, int mode) - { - Sequence *LS; - int a; - int maxlen; - - if ( !A) return NULL; - else if ( A->nseq==0)return NULL; - for (maxlen=0,a=0; anseq; a++)maxlen=MAX(maxlen, strlen (A->seq_al[a])); - - - LS=declare_sequence ( maxlen+1, maxlen+1, A->nseq); - LS->nseq=A->nseq; - for ( a=0; a< LS->nseq; a++) - { - sprintf (LS->file[a],"%s", A->file[a]); - - sprintf ( LS->seq[a], "%s", A->seq_al[a]); - - if (mode==RM_GAP)ungap ( LS->seq[a]); - - LS->len[a]=strlen ( LS->seq[a]); - - sprintf ( LS->seq_comment[a], A->seq_comment[a]); - sprintf ( LS->aln_comment[a], A->aln_comment[a]); - sprintf ( LS->name[a], "%s", A->name[a]); - } - return LS; - } - -Sequence *keep_residues_in_seq ( Sequence *S, char *list, char replacement) -{ - Alignment *A=NULL; - int a; - - A=seq2aln (S, A,1); - A=keep_residues_in_aln ( A, list, replacement); - for ( a=0; a< A->nseq; a++) - { - ungap (A->seq_al[a]); - sprintf ( S->seq[a], "%s", A->seq_al[a]); - } - free_aln (A); - return S; -} - - -Alignment *aln2short_aln ( Alignment *A, char *list, char *new, int spacer) -{ - int a, b, r, cl, l; - char *buf; - - for ( a=0; a< A->nseq; a++) - { - buf=vcalloc ( strlen (A->seq_al[a])+1, sizeof (char)); - - for (l=0,cl=0, b=0; b< A->len_aln; b++) - { - r=A->seq_al[a][b]; - if ( is_gap(r)); - else if ( is_in_set (r, list)) - { - if (cl){cl=0; buf[l++]=new[0];} - buf[l++]=r; - } - else - { - if ( cl==spacer){buf[l++]=new[0];cl=0;} - cl++; - } - - } - - buf[l]='\0'; - sprintf (A->seq_al[a], "%s", buf); - vfree (buf); - } - return A; -} - -Alignment *keep_residues_in_aln ( Alignment *A, char *list, char replacement) -{ - return filter_keep_residues_in_aln (A,NULL, 0, -1, list, replacement); -} -Alignment *filter_keep_residues_in_aln ( Alignment *A,Alignment *ST, int use_cons, int value, char *list, char replacement) -{ - char **sl; - int n, a; - - n=strlen (list); - sl=declare_char (n+1, 256); - for (a=0; a< n; a++) - sprintf ( sl[a], "%c%c", list[a], list[a]); - sprintf ( sl[a],"#%c", replacement); - A=filter_aln_convert (A, ST,use_cons,value, n+1, sl); - free_char (sl, -1); - return A; -} - - -Alignment *filter_convert_aln ( Alignment *A,Alignment *ST, int use_cons, int value, int n, ...) -{ - va_list ap; - char **sl; - int a; - va_start (ap, n); - sl=vcalloc ( n,sizeof(char*)); - for ( a=0; a< n; a++) - { - sl[a]=va_arg(ap, char * ); - } - va_end(ap); - A=filter_aln_convert (A,ST,use_cons,value, n,sl); - vfree(sl); - return A; -} - -Alignment * filter_aln ( Alignment *A, Alignment *ST, int value) - { - return filter_aln_convert (A, ST,0,value,DELETE, NULL); - } -Alignment * filter_aln_switchcase ( Alignment *A, Alignment *ST,int use_cons, int value) - { - return filter_aln_convert (A, ST,0,value,SWITCHCASE, NULL); - } -Alignment * filter_aln_upper_lower ( Alignment *A, Alignment *ST,int use_cons, int value) - { - return filter_aln_convert (A, ST,use_cons,value, LOWER, NULL); - } -Alignment * filter_aln_lower_upper ( Alignment *A, Alignment *ST,int use_cons, int value) - { - - return filter_aln_convert (A, ST,use_cons,value, UPPER, NULL); - } -Alignment * STseq2STaln ( Alignment *A, Alignment *ST) - { - int a, i=0; - - if (ST && ST->len_aln !=A->len_aln) - { - Sequence *S_T, *S_A; - - S_T=aln2seq (ST); - S_A=aln2seq (A); - - for (a=0; a< A->nseq; a++) - { - i=name_is_in_list (A->name[a], S_T->name,S_T->nseq, 100); - if (i!=-1) - { - char *s1, *s2; - s1=(S_T)->seq[i];ungap(s1); - s2=(S_A)->seq[a];ungap(s2); - - if ( strlen (s1)!=strlen(s2)) - { - fprintf ( stderr, "%s\n%s\n", s1, s2); - printf_exit (EXIT_FAILURE, stderr, "ERROR: Sequence %s has different length in the alignment and in the structure Alignment [FATAL:%s]\n", A->name[a], PROGRAM); - } - } - } - ST=copy_aln (A, ST); - thread_seq_struc2aln (ST,S_T); - } - - return ST; - } -Alignment * merge_annotation ( Alignment *A, Alignment *ST, char *seq) -{ - int s, a, b; - - ST=STseq2STaln (A, ST); - if ( seq==NULL)s=0; - else - s=name_is_in_list ( seq, A->name, A->nseq, 100); - - if (s==-1) - { - add_warning ( stderr, "\nERROR: %s is not in your MSA [FATAL: %s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - for (a=0; alen_aln; a++) - { - int t, r; - - t=A->seq_al[s][a]; - if (is_gap (t))continue; - for (b=0; bnseq; b++) - { - t=A->seq_al[s][a]; - r=ST->seq_al[b][a]; - if ( isdigit (r)) - { - if (!isdigit(t) || (isdigit (t) && tseq_al[s][a]=r; - } - } - } - return A; -} - - - -Alignment * filter_aln_convert ( Alignment *A, Alignment *ST,int use_cons, int value, int n_symbol,char **symbol_list) - { - int a, b, c; - int st; - int cons=0; - - - ST=STseq2STaln (A, ST); - if ( ST && use_cons) - { - cons=name_is_in_list ("con", ST->name,ST->nseq+1, 100); - if ( cons==-1)cons=name_is_in_list ("cons", ST->name,ST->nseq+1, 100); - if ( cons==-1)cons=name_is_in_list ("Cons", ST->name,ST->nseq+1, 100); - if ( cons==-1) - { - use_cons=0; - fprintf (stderr, "WARNING: Could Not Use the Consensus Sequence [WARNING:%s]\n", PROGRAM); - } - } - - A->residue_case=KEEP_CASE; - for ( a=0; a< A->nseq; a++) - { - if(value!=10 && ST && !use_cons) - { - c=name_is_in_list (A->name[a], ST->name, ST->nseq,100); - if (c==-1)st=11; - } - - for ( b=0; b< A->len_aln; b++) - { - if ( value==10 || !ST)st=11; - else if ( ST && use_cons) - { - st=(isdigit(ST->seq_al[cons][b]))?ST->seq_al[cons][b]-'0':ST->seq_al[cons][b]; - } - else st=(isdigit(ST->seq_al[c][b]))?ST->seq_al[c][b]-'0':ST->seq_al[c][b]; - - - if ( st==value || value==-1 || st==NO_COLOR_RESIDUE) - { - if ( n_symbol==UPPER && !symbol_list)A->seq_al[a][b]=toupper (A->seq_al[a][b]); - else if ( n_symbol==LOWER && !symbol_list)A->seq_al[a][b]=tolower (A->seq_al[a][b]); - else if ( n_symbol==SWITCHCASE && !symbol_list) - { - if ( !isalpha(A->seq_al[a][b])); - else if (isupper (A->seq_al[a][b]))A->seq_al[a][b]=tolower (A->seq_al[a][b]); - else if (islower (A->seq_al[a][b]))A->seq_al[a][b]=toupper (A->seq_al[a][b]); - } - else if ( n_symbol==DELETE && !symbol_list)A->seq_al[a][b]='-'; - else - { - A->seq_al[a][b]=convert(A->seq_al[a][b],n_symbol,symbol_list); - } - } - - } - } - return A; - } - - -char ** sar_aln2motif (Alignment *A, Alignment *B, int *pos, int c); -char ** sar_aln2motif (Alignment *A, Alignment *B, int *pos, int c) -{ - static Alignment *I; - static Alignment *O; - int a, b, o, i; - - float tp,tn,fp,fn,best, sp, sn, sen2; - float best_pred=-1; - int best_motif=0; - - - int n1; - static char ***alp; - static int *alp_size; - - char ***motif_list; - int n; - - - if (!I) - { - I=copy_aln(A, NULL); - O=copy_aln(A, NULL); - } - - - - I->nseq=O->nseq=I->len_aln=O->len_aln=0; - for (a=0; alen_aln; a++) - { - if (pos[a]) - { - for (i=o=0,b=0; bnseq; b++) - { - - if ( is_gap(A->seq_al[b][a]))return 0; - if (B->seq_al[b][c]=='I')I->seq_al[i++][I->len_aln]=A->seq_al[b][a]; - else O->seq_al[o++][O->len_aln]=A->seq_al[b][a]; - } - I->len_aln++; - O->len_aln++; - } - } - - if (O->len_aln==0 || I->len_aln==0) return 0; - O->nseq=o; - I->nseq=i; - for (a=0; aseq_al[a][O->len_aln]='\0'; - for (a=0; aseq_al[a][I->len_aln]='\0'; - - alp=vcalloc ( sizeof (char**), I->len_aln); - alp_size= vcalloc ( I->len_aln, sizeof (int)); - for (a=0; alen_aln; a++) - { - char *col; - alp[a]=string2alphabet ( (col=aln_column2string (I,a)),2, &alp_size[a]); - vfree (col); - } - - - - motif_list=generate_array_string_list (I->len_aln, alp, alp_size, &n, NULL, OVERLAP); - best_pred=best_motif=0; - for (a=0; anseq; b++) - { - if (match_motif (I->seq_al[b], motif_list[a]))tp++; - else fn++; - } - for (b=0; bnseq; b++) - { - if (match_motif (O->seq_al[b], motif_list[a]))fp++; - else tn++; - } - rates2sensitivity (tp, tn, fp, fn, &sp, &sn, &sen2, &best); - - if (best> best_pred) - { - best_pred=best; - best_motif=a; - } - } - - output_Alignment_without_header ( I, stdout); - fprintf ( stdout, "\n"); - output_Alignment_without_header ( O, stdout); - - - fprintf ( stdout, "\nMotifCompound %d pred: %.2f motif: ", c, best_pred); - for (n1=0, a=0; alen_aln; a++) - { - char *m; - int l; - m=motif_list[best_motif][a]; - fprintf ( stdout, "[%s]-", m); - l=strlen (m); - n1+=(l==1 && !strm ("*",m) )?1:0; - } - fprintf (stdout, "SCORE: %d", n1); - - for (a=0; alen_aln) - { - fprintf ( stdout, "\n W:"); - for (a=0; alen_aln; a++)fprintf ( stdout, "%d", array[a]); - fprintf ( stdout, " %.4f",(float)sar_aln2r(A,B,array,0)); - return; - } - else - { - for ( a=0; alen_aln=w; - for ( a=0; alen_aln-w;a++) - { - for (b=0; bnseq; b++) - { - for (c=0; cseq_al[b][c]=B->seq_al[b][a+c]; - } - S->seq_al[b][c]='\0'; - } - - s=search_best_combo (A, S); - fprintf ( stdout,"\nP: XXXX \nP: XXXXX A=%d / %d", a, B->len_aln); - - } - -} - -float search_best_combo(Alignment *A, Alignment *B) -{ - int a, b, c, d, best_pos,nl, max; - float best_score, score; - int *list, *pos; - - int w; - int combo_mode=1; //1: greedy 2: consider all thw w combinations; - FILE *fp2; - static int **M; - max=2; - int delta=0; - w=1; - - pos=vcalloc ( A->len_aln, sizeof (int)); - list=vcalloc (A->len_aln, sizeof (int)); - nl=0; - - if ( combo_mode==1) - { - for (a=0; a< max; a++) - { - for (best_score=-9999,best_pos=0,b=0; b< A->len_aln-w; b++) - { - for (c=0; cbest_score) - { - best_score=score; - best_pos=b; - } - for (c=0; clen_aln-1, 1,NULL, tmpf); - printf_system ( "cp %s testfile", tmpf); - buf=vcalloc ( 1000, sizeof (char)); - fp=vfopen (tmpf, "r"); - best_score=-99999; - - n_preset=0; - preset=vcalloc (A->len_aln, sizeof (int)); - preset[n_preset++]=353; - preset[n_preset++]=361; - //preset[n_preset++]=365; - //preset[n_preset++]=187; - //preset[n_preset++]=397; - //preset[n_preset++]=492; - - - while ( (buf=vfgets ( buf, fp))!=NULL) - { - - array=string2num_list (buf); - - for (a=1; a<=max; a++) - { - pos[array[a]]=1; - } - for ( a=0; abest_score) - { - best_score=score; - fprintf ( stdout, "\n"); - for (a=0; alen_aln; c++) - { - sar_aln2motif (A,B,pos, c); - - } - exit (0); - HERE ("***************"); - fp2=vfopen ("aln.aln", "w"); - for (a=0; anseq; a++) - { - fprintf (fp2, ">%s\n", A->name[a]); - for ( b=0; bseq_al[a][list[b]]); - fprintf ( fp2, "\n"); - } - vfclose (fp2); - HERE ("Output aln.aln"); - if (1) - { - float tp=0, tn=0, fp=0, fn=0, pp2=0,pp=0, sn,sn2, sp; - int **result,**result2,**compound_score, *ref_score,n2,n, s, p, c; - Alignment *AI, *AO; - int simI, simO; - - compound_score=declare_int (B->len_aln, 2); - ref_score=vcalloc (nl, sizeof (int)); - - result=declare_int (B->len_aln*A->nseq*A->nseq, 2); - result2=declare_int (B->len_aln*A->nseq*A->nseq, 2); - - for (n2=c=0; c< B->len_aln; c++) - { - - int sar1, sar2; - pp=tp=tn=fp=fn=0; - if (!M)M=read_matrice ("blosum62mt"); - for (n=0,a=0; anseq-1; a++) - { - for (b=a+1; bnseq;b++) - { - for (s=0,p=0; pseq_al[a][list[p]]; - r2=A->seq_al[b][list[p]]; - if ( !is_gap (r1) && !is_gap(r2))s+=M[r1-'A'][r2-'A']; - } - result2[n2][0]=result[n][0]=s; - - sar1=B->seq_al[a][c];sar2=B->seq_al[b][c]; - - if (sar1=='I' && sar1==sar2) - { - result2[n2][1]=result[n][1]=1; - pp++;pp2++; - n++;n2++; - } - else if ( sar1==sar2 && sar1=='O') - { - ; - } - else - { - result2[n2][1]=result[n][1]=0; - n++;n2++; - } - //else if ( s1==s2=='O')result[n][1]=-1; - } - } - - if (pp==0)continue; - sort_int_inv (result, 2, 0, 0, n-1); - - - for (tp=0,a=0; alen_aln-1); - - fp2=vfopen ("compound.fasta", "w"); - for (d=0; dnseq; a++) - for (b=0; bnseq; b++) - { - r1= A->seq_al[b][list[d]]; - r2= A->seq_al[b][list[d]]; - if (is_gap(r1) || is_gap(r2))continue; - else - { - ref_score[d]+=M[r1-'A'][r2-'A']; - n++; - } - } - ref_score[d]/=n; - } - AO=copy_aln (A, NULL); - AI=copy_aln (A,NULL); - AO->len_aln=AI->len_aln=nl; - for (a=0; anseq; a++)AO->seq_al[a][nl]=AI->seq_al[a][nl]='\0'; - - for (a=0; alen_aln; a++) - { - fprintf (stdout, "\n>%4d %4d ", compound_score[a][0], compound_score[a][1]); - for (b=0; bnseq; b++) fprintf (stdout, "%c", B->seq_al[b][compound_score[a][0]]); - fprintf ( stdout, "\n"); - - for (AI->nseq=0,b=0; bnseq; b++) - { - if (B->seq_al[b][compound_score[a][0]]=='O')continue; - fprintf ( stdout, "\n\t"); - for (c=0; cseq_al[b][list[c]]); - AI->seq_al[AI->nseq][c]=A->seq_al[b][list[c]]; - } - AI->nseq++; - } - fprintf ( stdout, "\n\t"); - for (d=0; dnseq; b++) - { - if (B->seq_al[b][compound_score[a][0]]=='O')continue; - for (c=0; cnseq; c++) - { - if (B->seq_al[c][compound_score[a][0]]=='O')continue; - { - int r1, r2; - - r1= A->seq_al[b][list[d]]; - r2= A->seq_al[b][list[d]]; - if (is_gap(r1) || is_gap(r2))continue; - else score+=M[r1-'A'][r2-'A']; - n++; - } - } - } - score/=n; - if ((float)score/(float)ref_score[d]>1.2)fprintf ( stdout, "*"); - else fprintf ( stdout, " "); - } - for (AO->nseq=0,b=0; bnseq; b++) - { - if (B->seq_al[b][compound_score[a][0]]=='I')continue; - fprintf ( stdout, "\n\t"); - for (c=0; cseq_al[AO->nseq][c]=A->seq_al[b][list[c]]; - fprintf ( stdout, "%c", A->seq_al[b][list[c]]); - } - AO->nseq++; - } - simI=aln2sim (AI, "blosum62mt"); simO=aln2sim (AO, "blosum62mt"); - fprintf ( stdout, "\nDELTA: I: %d O: %d %d",simI,simO, simI-simO); - delta+=simI-simO; - } - - for ( a=0; anseq; a++) - { - - fprintf ( fp2, ">%s\n", B->name[a]); - for (b=0; blen_aln/2; b++) - fprintf ( fp2, "%c", B->seq_al[a][compound_score[b][0]]); - fprintf (fp2, "\n"); - } - vfclose (fp2); - HERE ("OUTPUT compound.fasta"); - result=result2; - n=n2; - pp=pp2; - - sort_int_inv (result, 2, 0, 0, n-1); - - - for (tp=0,a=0; anseq; b++) - C->seq_al[b][a]=A->seq_al[b][list[a]]; - C->len_aln=nl; - array=vcalloc (C->len_aln, sizeof (int)); - explore_weight_matrix (C, B, 6,0, array); - */ - - return best_score; -} - - -void count_misc (Alignment *A, Alignment *B) -{ - int **done, a, b, c, d, e,f, g, *list, n, score; - double **slist, *r; - int *pos; - int w=1; - - search_best_combo (A,B); - exit (0); - pos=vcalloc (A->len_aln+1, sizeof (int)); - /* - pos[354]=1; - pos[362]=1; - pos[366]=1; - pos[398]=1; - pos[476]=1; - - - fprintf ( stdout, "\nR: %3f " ,(float)sar_aln2r(A,B,pos,1));exit (0); - */ - for (a=0; a< A->len_aln-w; a++) - { - for (c=0; clen_aln-1; a++) - { - pos[a-w]=0; - pos[a]=1; - fprintf ( stdout, "\nP: %3d W:2 R: %3f ",a, (float)sar_aln2r(A,B,pos,0)); - } - - exit (0); - pos[2]=1; - pos[3]=1; - - - - explore_weight_matrix (A, B,3, 0,pos); - exit (0); - - for (a=0; alen_aln; a++) - for ( b=0; blen_aln; b++) - for (c=0; clen_aln; c++) - for (d=0; dlen_aln; d++) - for (f=0; flen_aln; f++) - for (g=0; glen_aln; g++) - { - e=0; - pos[e++]=a; - pos[e++]=b; - pos[e++]=c; - pos[e++]=d; - pos[e++]=f; - pos[e++]=g; - pos[e++]=-1; - fprintf ( stdout, "\n%d %d %d %d %d %d %.3f", a, b,c,d,f, g, sar_aln2r(A,B, pos,0)); - - } - - exit (0); - - - slist=declare_double (A->nseq*A->nseq*10, 2); - done=declare_int (256, 256); - list=vcalloc ( A->nseq, sizeof (int)); - - for (a=0; alen_aln-1; a++) - { - for (b =0; b<256; b++)for (c=0; c<256; c++)done[b][c]=0; - - for (b=0; bnseq-1; b++) - { - int r1, r2; - r1=A->seq_al[b][a]; - r2=A->seq_al[b][a+1]; - if (done[r1][r2])continue; - n=0; - done[r1][r2]=1; - list[n++]=b; - fprintf ( stdout, "\n%3d %c%c: %s ",a+1, r1, r2, A->name[b]); - for ( c=b+1; cnseq; c++) - { - if (r1==A->seq_al[c][a] && r2==A->seq_al[c][a+1]) - { - fprintf ( stdout, "%s ", A->name[c]); - list[n++]=c; - } - - } - if (B && n>1) - { - for (e=0,score=0,c=0; cseq_al[list[c]], B->seq_al[list[d]]); - fprintf ( stdout, " Score=%d", score/e); - } - } - } - for (score=0,e=0,a=0; anseq-1; a++) - for (b=a+1; bnseq; b++,e++) - { - score+=get_sar_sim2(B->seq_al[a], B->seq_al[b]); - } - fprintf (stdout,"AVG=%d", score/e); - for (n=0,a=0; a< A->nseq-1; a++) - { - static int **M; - int sim; - if (!M)M=read_matrice ("blosum62mt"); - - - for (b=a+1; bnseq; b++) - { - int n11, n01, n10, n00, n1; - - for (sim=d=0;dlen_aln; d++) - { - int r1, r2; - r1=A->seq_al[a][d]; - r2=A->seq_al[b][d]; - sim+=(r1==r2)?1:0; - //sim +=(M[r1-'A'][r2-'A']>0)?1:0; - } - - sim=(100*sim)/(A->len_aln);//+rand()%10; - for (n1=n00=n11=n10=n01=score=0, d=0; dlen_aln; d++) - { - int r1, r2; - r1=B->seq_al[a][d]; - r2=B->seq_al[b][d]; - n11+=(r1=='I' && r2=='I'); - n00+=(r1=='O' && r2=='O'); - n10+=(r1=='I' && r2=='0'); - n01+=(r1=='O' && r2=='I'); - n1+=(r1=='I' || r2=='I'); - } - score =((n11+n00)*100)/B->len_aln; - - //score=get_sar_sim2(B->seq_al[a], B->seq_al[b]); - - fprintf ( stdout, "\nSIM: %d SC: %d", sim, score); - slist[n][0]=(double)sim; - slist[n][1]=(double)score; - n++; - } - } - r=return_r(slist, n); - fprintf ( stdout, "\nR= %.4f", (float)r[0]); - exit (0); -} - -int aln2ngap ( Alignment *A) -{ - int ngap=0, a, b; - for (a=0; a< A->len_aln; a++) - for (b=0; bnseq; b++) ngap+=is_gap (A->seq_al[b][a]); - return ngap; -} -int * count_in_aln ( Alignment *A, Alignment *ST, int value, int n_symbol,char **symbol_list, int *table) - { - int a, b, c=0, d; - int st; - - if (!table)table=vcalloc (n_symbol, sizeof (int)); - - A->residue_case=KEEP_CASE; - for ( a=0; a< A->nseq; a++) - { - if(value!=10 && ST)for ( c=0; c< ST->nseq; c++)if ( strm(ST->name[c], A->name[a]))break; - for ( b=0; b< A->len_aln; b++) - { - if ( value==10 || !ST)st=11; - else st=(isdigit(ST->seq_al[c][b]))?ST->seq_al[c][b]-'0':ST->seq_al[c][b]; - if ( st==value || value==-1) - { - for ( d=0; dseq_al[a][b], symbol_list[d]); - } - } - } - return table; - } - -char *dna_aln2cons_seq ( Alignment *A) - { - int a, b, best; - static int **column_count; - static int **old_tot_count; - static int **new_tot_count; - static char *string1, *string2; - int **count_buf; - char r1, r2,*seq; - int NA=0, NG=1, NC=2, NT=3, IGAP=4; - static int MAX_EST_SIZE=10000; - static int size_increment=1000; - static int first; - int overlap=0, best_overlap=0; - - - seq=vcalloc ( A->len_aln+1, sizeof (char)); - - if (!column_count ) - { - column_count=vcalloc(MAX_EST_SIZE, sizeof (int*)); - for ( a=0; a< MAX_EST_SIZE; a++) - column_count[a]=vcalloc (5, sizeof (int)); - - old_tot_count=vcalloc(MAX_EST_SIZE, sizeof (int*)); - new_tot_count=vcalloc(MAX_EST_SIZE, sizeof (int*)); - A->P=declare_profile( "agct-",MAX_EST_SIZE); - string1=vcalloc (MAX_EST_SIZE, sizeof (char)); - string2=vcalloc (MAX_EST_SIZE, sizeof (char)); - } - else if (A->len_aln>MAX_EST_SIZE) - { - if ( column_count) - { - for ( a=0; a< MAX_EST_SIZE; a++) - vfree(column_count[a]); - vfree(column_count); - vfree(old_tot_count); - vfree(new_tot_count); - vfree(string1); - vfree(string2); - } - - column_count=vcalloc(MAX_EST_SIZE+ size_increment, sizeof (int*)); - for ( a=0; a< MAX_EST_SIZE+ size_increment; a++) - column_count[a]=vcalloc (5, sizeof (int)); - - old_tot_count=vcalloc(MAX_EST_SIZE+ size_increment, sizeof (int*)); - new_tot_count=vcalloc(MAX_EST_SIZE+ size_increment, sizeof (int*)); - - for (a=0; a< MAX_EST_SIZE; a++) - { - old_tot_count[a]=*(column_count++); - for ( b=0; b<5; b++)old_tot_count[a][b]=(A->P)->count[b][a]; - } - free_int ( (A->P)->count, -1); - - (A->P)->count=declare_int (5, MAX_EST_SIZE+ size_increment); - (A->P)->max_len=MAX_EST_SIZE+ size_increment; - MAX_EST_SIZE+= size_increment; - string1=vcalloc (MAX_EST_SIZE, sizeof (char)); - string2=vcalloc (MAX_EST_SIZE, sizeof (char)); - } - - - sprintf ( string1, "%s",A->seq_al[0]); - sprintf ( string2, "%s",A->seq_al[1]); - - - string1=mark_internal_gaps(string1,'.'); - string2=mark_internal_gaps(string2,'.'); - - - - for (b=0,a=0; a< A->len_aln; a++) - { - r1=string1[a]; - r2=string2[a]; - - if ( r1==r2) - { - overlap++; - } - else - { - best_overlap=MAX(overlap, best_overlap); - overlap=0; - } - - - if (!is_gap(r1) && first==1)new_tot_count[a]=old_tot_count[b++]; - else if (is_gap(r1) || first==0){new_tot_count[a]=*column_count;column_count++;}; - - if ( first==0) - { - if(r1=='a') new_tot_count[a][NA]++; - else if ( r1=='g')new_tot_count[a][NG]++; - else if ( r1=='c')new_tot_count[a][NC]++; - else if ( r1=='t')new_tot_count[a][NT]++; - else if (is_gap(r1)); - else - { - new_tot_count[a][NA]++; - new_tot_count[a][NG]++; - new_tot_count[a][NC]++; - new_tot_count[a][NT]++; - } - } - if ( a> 0 && alen_aln-1 && r1=='.') - { - new_tot_count[a][IGAP]+=((new_tot_count[a-1][NA]+new_tot_count[a-1][NG]+new_tot_count[a-1][NC]+new_tot_count[a-1][NT])); - } - - - if(r2=='a') new_tot_count[a][NA]++; - else if ( r2=='g')new_tot_count[a][NG]++; - else if ( r2=='c')new_tot_count[a][NC]++; - else if ( r2=='t')new_tot_count[a][NT]++; - else if ( r2=='.')new_tot_count[a][IGAP]++; - else if ( r2=='-'); - else - { - new_tot_count[a][NA]++; - new_tot_count[a][NG]++; - new_tot_count[a][NC]++; - new_tot_count[a][NT]++; - } - (A->P)->count[0][a]=new_tot_count[a][NA]; - (A->P)->count[1][a]=new_tot_count[a][NG]; - (A->P)->count[2][a]=new_tot_count[a][NC]; - (A->P)->count[3][a]=new_tot_count[a][NT]; - (A->P)->count[4][a]=new_tot_count[a][IGAP]; - - best_int(4,1, &best,new_tot_count[a][NA], new_tot_count[a][NG],new_tot_count[a][NC],new_tot_count[a][NT]); - if( best==0) seq[a]='a'; - else if ( best==1)seq[a]='g'; - else if ( best==2)seq[a]='c'; - else if ( best==3)seq[a]='t'; - } - - first=1; - - seq[a]='\0'; - fprintf ( stderr, "[Best Overlap: %d Residues]", best_overlap); - count_buf=old_tot_count; - old_tot_count=new_tot_count; - new_tot_count=count_buf; - - return seq; - - } - -char *aln2cons_maj ( Alignment *A, int ns, int *ls, int n_groups, char **group_list) - { - char *seq; - int a, b; - int len; - int clean_ls=0; - static int *aa; - - if ( !aa) aa=vcalloc (1000, sizeof (int)); - - len=strlen (A->seq_al[ls[0]]); - seq=vcalloc (len+1, sizeof (char)); - - if ( ns==0) - { - ns=A->nseq; - ls=vcalloc ( A->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++)ls[a]=a; - clean_ls=1; - } - - for ( a=0; aseq_al[ls[b]][a]); - aa[r]++; - if (!is_gap(r) && aa[r]>best_s) - { - best_s=aa[r]; - best_aa=r; - } - seq[a]=best_aa; - } - for (best_s=0, best_aa=0,b=0; b< ns; b++) - { - aa[tolower(A->seq_al[ls[b]][a])]=0; - } - } - if ( clean_ls)vfree(ls); - seq[a]='\0'; - - return seq; - } - -char *aln2cons_seq ( Alignment *A, int ns, int *ls, int n_groups, char **group_list) - { - char *seq; - int a, b, c; - int best_group=0; - int aa_group=0; - int *group; - int len; - int clean_ls=0; - - len=strlen (A->seq_al[ls[0]]); - seq=vcalloc (len+1, sizeof (char)); - - if ( ns==0) - { - ns=A->nseq; - ls=vcalloc ( A->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++)ls[a]=a; - clean_ls=1; - } - - - if ( !group_list) - { - group_list=declare_char ( 26, 2); - for ( a=0; a<26; a++)group_list[a][0]=a+'a'; - n_groups=26; - aa_group=1; - } - - - for ( a=0; aseq_al[ls[b]][a])) - { - for (c=0; c< n_groups; c++) - if ( is_in_set (tolower(A->seq_al[ls[b]][a]), group_list[c])) - {group[c]++; - best_group=(group[c]>group[best_group])?c:best_group; - } - } - seq[a]=group_list[best_group][0]; - } - vfree (group); - } - seq[a]='\0'; - if ( aa_group) free_char (group_list, -1); - - if ( clean_ls)vfree(ls); - - return seq; - } - -Alignment *aln2conservation ( Alignment *A, int threshold,char *seq) -{ - int a, b, c, d, i, c1, c2; - int *pos; - float *eval; - float tot=0; - float tn=0; - int **sim; - int w=0; - - pos =vcalloc (A->len_aln, sizeof (int)); - eval=vcalloc (A->len_aln, sizeof (int)); - sim=aln2sim_mat (A, "idmat"); - if (seq)i=name_is_in_list (seq, A->name, A->nseq, 100); - else i=0; - - if ( i==-1) {HERE ("%s is an unknown:sequence [FATAL]"); exit (EXIT_FAILURE);} - - for (a=0; alen_aln; a++) - { - double s; - int e; - for (c=0,e=a-w; e<=a+w; e++) - { - if (e<0 || e==A->len_aln)continue; - c1=toupper (A->seq_al[i][e]); - for (b=0; bnseq; b++) - { - c2=toupper (A->seq_al[b][a]); - if (c1==c2) - { - c++; - s=(double)((double)sim[i][b]/(double)(100)); - - } - else - { - s=(double)(((double)100-(double)sim[i][b])/(double)(100)); - } - eval[a]+=(s==0)?0:log(s); - } - } - pos[a]=(c*100)/A->nseq; - if (!is_gap(c1)){tot+=pos[a]; tn++;} - - if (pos[a]>=threshold)A->seq_al[i][a]=toupper (A->seq_al[i][a]); - else A->seq_al[i][a]=tolower (A->seq_al[i][a]); - } - fprintf (stdout, ">%s %s [i=%d]\n%s\n", A->name[i],A->aln_comment[i],i, A->seq_al[i]); - tot=(tn>0)?(float)tot/(float)tn:0; - - for (d=0,a=0; alen_aln; a++) - { - fprintf (stdout, "# %c %4d", A->seq_al[i][a],pos[a]); - - - if ( !is_gap (A->seq_al[i][a])) - { - fprintf (stdout, " LogOdd: %6.2f ", (tot==0 || pos[a]==0)?0:(float)log((float)pos[a]/tot)); - fprintf ( stdout, " Pos: %5d E-Val: %9.2f", ++d, eval[a]/(A->nseq)); - } - fprintf ( stdout, "\n"); - } - fprintf ( stdout, "#average conservation: %.2f", tot); - exit (EXIT_SUCCESS); -} -char *aln2cons_seq_mat ( Alignment *A, char *mat_name) -{ - return sub_aln2cons_seq_mat (A, A->nseq, NULL, mat_name); -} -char *sub_aln2cons_seq_mat2 ( Alignment *A,int ns, char **ls, char *mat_name) -{ - char *cons; - int *list; - list=name_array2index_array(ls, ns, A->name, A->nseq); - cons=sub_aln2cons_seq_mat ( A,ns, list, mat_name); - vfree (list); - return cons; -} - -char *sub_aln2cons_seq_mat ( Alignment *A,int ns, int *ls, char *mat_name) -{ - int a, b, c, s; - char *seq, r1, r2; - int **mat; - int score=0, best_score=0, best_r=0; - int len; - int naa; - - mat=read_matrice (mat_name); - len=strlen ( A->seq_al[(ls==NULL)?0:ls[0]]); - seq=vcalloc (len+1, sizeof (char)); - for ( a=0; aseq_al[s][a]))continue; - else - { - naa++; - r2=A->seq_al[s][a]; - score+=mat[r1-'A'][r2-'A']; - } - } - if (naa==0)best_r='-'; - if ( b==0 || score>best_score){best_score=score; best_r=r1;} - } - seq[a]=best_r; - } - free_int (mat, -1); - return seq; -} - -int seq_list2in_file ( TC_method *M, Sequence *S, char *list, char *file) -{ - X_template *T=NULL; - - if ( !S)return 0; - else - { - int t; - t=tolower(M->seq_type[0]); - - if ( t=='s') - { - return seq_list2fasta_file ( S, list, file); - - } - else - { - FILE *fp, *fp2; - int a, n, s, c; - int *slist; - - - - fp=vfopen ( file, "w"); - slist=string2num_list (list); - n=slist[0]; - - if (strlen (M->seq_type) >1) - { - add_warning( stderr, "\nERROR: Mixed seq_type not supported for external methods\n[FATAL:%s]", PROGRAM); - } - - for ( a=2; aT[s])->P; - else if (t=='r')T=(S->T[s])->R; - else if (t=='g')T=(S->T[s])->G; - - if (!T && t=='r') - { - fprintf ( fp, ">%s\n%s%s", S->name[s], S->seq[s], LINE_SEPARATOR); - } - else if ( T && T->template_file && T->template_file[0]) - { - fp2=vfopen (T->template_file, "r"); - while ( (c=fgetc (fp2))!=EOF) - { - fprintf ( fp, "%c", c); - } - fprintf (fp, "%s", LINE_SEPARATOR); - vfclose (fp2); - } - } - - fprintf (fp, "TARGET_SEQ_NAME: "); - for (a=2; aname[slist[a]])); - fprintf ( fp, "%s", LINE_SEPARATOR); - - vfclose (fp); vfree (slist); - - } - - return 1; - } -} - -int seq_list2fasta_file( Sequence *S, char *list, char *file) - { - FILE *fp; - int n, a, s; - static char *buf; - static int blen; - int l; - - - /*Buf is used because cmalloced functions cannot go through strtok*/ - if ( !S)return 0; - else - { - fp=vfopen ( file, "w"); - if ( !list) - { - for ( a=0; anseq; a++) - { - fprintf ( fp, ">%s %s\n%s\n", decode_name (S->name[a], CODE),S->name[a], S->seq[a]); - } - } - else - { - l=strlen (list); - if ( l>blen) - { - if (buf)vfree(buf); - buf=vcalloc ( strlen (list)+1, sizeof (char)); - sprintf ( buf, "%s", list); - blen=l; - } - n=atoi(strtok (list,SEPARATORS)); - for ( a=0; a< n; a++) - { - s=atoi(strtok (NULL, SEPARATORS)); - fprintf ( fp, ">%s %s\n%s\n", decode_name (S->name[s], CODE), S->name[a],S->seq[s]); - } - } - vfclose (fp); - } - return 1; - } -Structure * seq2struc ( Sequence *S, Structure *ST) - { - int a, b; - - for ( a=0; a< S->nseq; a++) - for ( b=0; b< S->len[a]; b++) - ST->struc[a][b+1][ST->n_fields-1]=S->seq[a][b]; - return ST; - } - -void aln2struc (Alignment *A, Structure *ST) - { - int a, b, c; - - for ( a=0; a< A->nseq; a++) - for (c=0, b=0; b< A->len_aln; b++) - { - if ( !is_gap (A->seq_al[a][b])) - { - ST->struc[a][c][ST->n_fields-1]=A->seq_al[a][b]; - c++; - } - } - } -Alignment *stack_aln (Alignment *A, Alignment *B) - { - int a,b; - int max_len=0, max_nseq=0; - if ( B==NULL)return A; - if ( A==NULL)return B; - - max_nseq=A->nseq+B->nseq; - for (a=0; a< A->nseq; a++)max_len=MAX(strlen(A->seq_al[a]),max_len); - for (a=0; a< B->nseq; a++)max_len=MAX(strlen(B->seq_al[a]),max_len); - - A=realloc_aln2 ( A,max_nseq,max_len+1); - - for (a=A->nseq,b=0; b< B->nseq; b++, a++) - { - sprintf ( A->seq_comment[a] , "%s", B->seq_comment[b]); - sprintf ( A->aln_comment[a] , "%s", B->aln_comment[b]); - - sprintf ( A->seq_al [a] , "%s", B->seq_al [b]); - sprintf ( A->name [a] , "%s", B->name[b]); - sprintf ( A->file [a], "%s" , B->file[b]); - A->order[a][0]=B->order[b][0]; - A->order[a][1]=B->order[b][1]; - A->score_seq[a]=B->score_seq[b]; - A->len[a]=B->len[b]; - } - - A->len_aln=MAX(A->len_aln, B->len_aln); - A->nseq=A->nseq+B->nseq; - A->score_aln=A->score_aln+B->score_aln; - - A->finished=A->finished+B->finished; - return A; - } - -Alignment *chseqIaln(char *name, int seq_n, int start,int len,Sequence *S, int seqIaln, Alignment *A) - { - char *seq; - - seq=extract_char ( S->seq[seq_n], start, len); - A=realloc_aln2 (A, (A==NULL)?(seqIaln+1):MAX(A->nseq,seqIaln+1), ((A==NULL)?(strlen (seq)):MAX(strlen (seq),A->len_aln))+1); - - - sprintf ( A->seq_al[seqIaln], "%s",seq); - - - A->order[seqIaln][0]=seq_n; - A->order[seqIaln][1]=start; - sprintf ( A->name[seqIaln], "%s", name); - A->nseq=MAX(A->nseq, seqIaln+1); - A->len_aln=return_maxlen(A->seq_al, A->nseq); - A->S=S; - vfree (seq); - return A; - } - -Alignment * aln_gap2random_aa(Alignment *A) - { - int a, b,l; - char alp[200]; - - if (strm ( (A->S)->type, "PROTEIN")) - sprintf ( alp, "acefghiklmnpqrstuvwy"); - else if ( strm ( (A->S)->type, "DNA") ||strm ( (A->S)->type, "RNA") ) - sprintf ( alp, "agct"); - l=strlen (alp); - - - for (a=0; anseq; a++) - for ( b=0; blen_aln; b++) - if ( is_gap (A->seq_al[a][b]))A->seq_al[a][b]=alp[(int)rand()%(l)]; - return A; - } - -Alignment * make_random_aln(Alignment *A,int nseq, int len, char *alphabet) - { - int a; - - - A=realloc_aln2(A, nseq, len+1); - - A->nseq=0; - A->len_aln=len; - for ( a=0; a< A->nseq; a++)sprintf ( A->file[a], "random alignment"); - for ( a=0; a< nseq; a++) - A=add_random_sequence2aln(A,alphabet); - return A; - } -Alignment * add_random_sequence2aln( Alignment *A, char *alphabet) - { - int a, n; - - vsrand(0); - - n=strlen(alphabet); - A=realloc_alignment2 (A, A->nseq+1, A->len_aln+1); - - for ( a=0; a< A->len_aln; a++)A->seq_al[A->nseq][a]=alphabet[rand()%n]; - if (! A->name[A->nseq][0]) - { - for ( a=0; a<10; a++)A->name[A->nseq][a]=alphabet[rand()%n]; - A->name[A->nseq][a]='\0'; - } - - A->nseq++; - return A; - } - -Sequence *get_defined_residues( Alignment *A) - { - char *buf; - Sequence *S; - int a, b, s, l, r; - if ( !A || !A->S) return NULL; - - S=duplicate_sequence (A->S); - for ( a=0; a< S->nseq; a++) - for ( b=0; b< S->len[a]; b++)S->seq[a][b]=UNDEFINED_RESIDUE; - buf=vcalloc(A->len_aln+1,sizeof (char)); - for ( a=0; a< A->nseq; a++) - { - sprintf ( buf, "%s",A->seq_al[a]); - ungap(buf); - l=strlen (buf); - s=A->order[a][0]; - - for ( b=1; b<= l; b++) - { - r=A->seq_cache[s][b]; - - if ( r>=0)S->seq[s][r-1]=(A->S)->seq[s][r-1]; - } - } - vfree(buf); - return S; - } -Alignment *thread_defined_residues_on_aln ( Alignment *A, Sequence *S1) - { - int a, b; - int gap, r,s, r2; - for ( a=0; a< A->nseq; a++) - { - s=A->order[a][0]; - r=A->order[a][1]; - for (b=0;b< A->len_aln; b++) - { - gap=is_gap(A->seq_al[a][b]); - - if (!gap) - { - r+=!gap; - r2=A->seq_cache[s][r]-1; - - if (r2>=0 && S1->seq[s][r2]==UNDEFINED_RESIDUE) - A->seq_al[a][b]=UNDEFINED_RESIDUE; - } - } - } - return A; - } - -int ** trim_aln_borders (char **seq1, char **seq2, int nseq) - { - int a, b, c,l1,l2; - char *buf1; - char *buf2; - int max; - - - - - max=MAX(get_longest_string (seq1,-1, NULL, NULL),get_longest_string (seq2,-1, NULL, NULL))+1; - buf1=vcalloc ( max, sizeof(char)); - buf2=vcalloc ( max, sizeof(char)); - - for ( a=0; a< nseq; a++) - { - sprintf ( buf1, "%s", seq1[a]); - sprintf ( buf2, "%s", seq2[a]); - - - - ungap (buf1); - ungap (buf2); - - if (str_overlap ( buf1, buf2,'*')!=0) - { - l1=strlen ( seq1[a]); - l2=strlen ( seq2[a]); - for ( b=0,c=0; c< l1; c++) - if ( !is_gap(seq1[a][c]))seq1[a][c]=buf1[b++]; - seq1[a][c]='\0'; - for ( b=0,c=0; c< l2; c++) - if ( !is_gap(seq2[a][c]))seq2[a][c]=buf2[b++]; - seq2[a][c]='\0'; - } - } - vfree (buf1); - vfree (buf2); - return NULL; - - } -Sequence * merge_seq ( Sequence *IN, Sequence *OUT) - { - int a; - - if ( OUT==NULL)return duplicate_sequence (IN); - else - { - if ( IN && check_list_for_dup( IN->name, IN->nseq)) - { - fprintf ( stderr, "\nERROR: %s is duplicated in file %s[FATAL]\n", check_list_for_dup( IN->name, IN->nseq), IN->file[0]); - myexit (EXIT_FAILURE); - } - for ( a=0; a< IN->nseq; a++) - if ((OUT=add_sequence ( IN, OUT, a))==NULL)return NULL; - return OUT; - } - } - -Alignment *seq_name2removed_seq_name(Sequence *S, Alignment *NA, float **diff) -{ - int a, b, rb, s; - float min_diff; - for (a=0; a< S->nseq; a++) - { - if (name_is_in_list( S->name[a], NA->name, NA->nseq, 100)!=-1) continue; - for ( min_diff=100, s=0, b=0; b< NA->nseq; b++) - { - rb=name_is_in_list ( NA->name[b], S->name, S->nseq, 100); - if ( diff[a][rb]seq_comment[s], " "); - strcat ( NA->seq_comment[s], S->name[a]); - } - return NA; -} - - - - -int seq_name2index (char *name, Sequence *S) -{ - if ( !S) return -1; - else return name_is_in_list ( name, S->name, S->nseq, MAXNAMES+1); -} -char * seq_name2coor ( char *s, int *start, int *end, char sep) -{ - /*name|start|end */ - char n1[100], n2[100]; - int a=0, b=0, c=0; - - n1[0]=n2[0]='\0'; - start[0]=end[0]=0; - - while ( s[a]!=sep && s[a]!='\0')a++; - if ( s[a]=='\0')return s; - else - s[a++]='\0'; - - - - while ( s[a]!=sep && s[a]!='\0')n1[b++]=s[a++]; - - if ( s[a]=='\0'){n1[b]='\0';if ( n1[0])start[0]=atoi(n1);return s;} - else s[a++]=n1[b]='\0'; - - - while ( s[a]!=sep && s[a]!='\0')n2[c++]=s[a++]; - n2[c]='\0'; - - - if ( n1[0])start[0]=atoi(n1); - if ( n2[0])end[0]=atoi(n2); - - - return s; -} - -Sequence *extract_one_seq(char *n,int start, int end, Alignment *S, int keep_name) - { - - int seq, a; - FILE*fp; - char *name; - Sequence *OUT_S; - - - if ( n[0]=='#')seq=S->nseq; - else if ( (seq=name_is_in_list (n, S->name, S->nseq, 100)+1)!=0); - else if (is_number (n) && (seq=atoi(n))!=0) seq=atoi(n); - else - { - fprintf ( stderr, "\nCould not find Sequence %s [FATAL]", n); - myexit (EXIT_FAILURE); - } - seq--; - - name=vtmpnam ( NULL); - fp=vfopen ( name, "w"); - if ( start && end &&!keep_name)fprintf (fp, ">%s_%d_%d\n",S->name[seq],start, end); - else if ( start && end==0 && !keep_name)fprintf (fp, ">%s_%d_%d\n",S->name[seq],start,(int)strlen ( S->seq_al[seq])); - else fprintf (fp, ">%s\n", S->name[seq]); - - if ( start==0 && end==0){fprintf (fp, "%s\n", S->seq_al[seq]);} - else if (end==0){fprintf (fp, "%s\n", S->seq_al[seq]+start-1);} - else - { - for ( a=start-1; aseq_al[seq][a]);} - fprintf ( fp, "\n"); - } - - - vfclose (fp); - OUT_S=get_fasta_sequence_num (name, NULL); - - return OUT_S; - } - - - -Sequence * extract_sub_seq( Sequence *COOR, Sequence *S) - { - int a, b, c,s; - int start, end; - - for ( a=0; a< S->nseq; a++) - { - if ( (s=name_is_in_list ( S->name[a], COOR->name, COOR->nseq, 100))!=-1) - { - - sscanf ( COOR->seq_comment[s], "%d %d", &start, &end); - for (c=0,b=start-1; b< end; b++, c++)S->seq[a][c]=S->seq[a][b]; - S->seq[a][c]='\0'; - sprintf ( S->seq_comment[a], "%s",COOR->seq_comment[s]); - - } - } - S=reorder_seq ( S, COOR->name, COOR->nseq); - return S; - } - - - -char * aln_column2string (Alignment *A, int p) - { - char *s; - int a; - if (p>=A->len_aln) - { - HERE ("ERROR: index (p=%d) loger than aln (l=%d) [FATAL]", p, A->len_aln); - exit (EXIT_FAILURE); - } - else - { - s=vcalloc (A->nseq+1, sizeof (char)); - for (a=0; a< A->nseq; a++)s[a]=A->seq_al[a][p]; - } - return s; - } -Alignment * fix_aln_seq ( Alignment *A, Sequence *S) - { - int a, b, c; - char *buf1, *buf2; - int g0, g1, nr0, nr1; - int id, tot; - Alignment *B; - - - /*This function establishes the correspondance between every (1..N+1) residue of each aligned sequence - and its correspondance in S: - A->seq_cache[a][b]=x means that residue b of aligned sequence a corresponds to residue x of the sequence with tye same index in S - A->seq_cache[a][b]=0 means there is no correspondance. - a is the index of the sequence - Applying this function is needed for turning an alignment into a constraint list - */ - - - if ( S==NULL)return A; - - A->seq_cache=declare_int ( S->nseq, MAX((A->len_aln+1), S->max_len+1)); - - for (a=0; a< S->nseq; a++) - for ( b=0; b< A->len_aln; b++)A->seq_cache[a][b]=-1; - - buf1=buf2=NULL; - for ( a=0; a< S->nseq; a++) - { - for (b=0; b< A->nseq; b++) - { - if (strm ( S->name[a], A->name[b])) - { - A->order[b][0]=a; - - vfree (buf1); - buf1=vcalloc ( A->len_aln+1, sizeof (char)); - sprintf (buf1, "%s", A->seq_al[b]); - ungap (buf1); - upper_string (buf1); - - vfree(buf2); - buf2=vcalloc (strlen(S->seq[a])+1, sizeof (char)); - sprintf (buf2, "%s",S->seq[a]); - ungap (buf2); - upper_string (buf2); - - - - if ( strm (buf1,buf2)) - { - - for ( c=0; clen[a]; c++)A->seq_cache[a][c+1]=c+1; - } - else - { - - B=align_two_sequences (buf2,buf1,"blosum62mt",-4,-1, "myers_miller_pair_wise"); - if ( getenv ("DEBUG_RECONCILIATION")) - { - fprintf (stderr, "\n[DEBUG_RECONCILIATION:fix_aln_seq]\nReconciliation of %s\nA=Ref_sequence\nB=New_seq", S->name[a]); - print_aln (B); - } - - for (id=0, tot=0,nr0=0,nr1=0,c=0; clen_aln; c++) - { - g0=is_gap(B->seq_al[0][c]); - g1=is_gap(B->seq_al[1][c]); - nr0+=1-g0; - nr1+=1-g1; - if ( !g0 && !g1) - { - tot++; - id+=(B->seq_al[0][c]==B->seq_al[1][c])?1:0; - A->seq_cache[a][nr1]=nr0; - } - else if (g0 && !g1) - { - A->seq_cache[a][nr1]=0; - } - } - if ( ((id*100)/tot)<20) - { - print_aln (B); - fprintf ( stderr, "\nTwo different sequences have the same name: %s", S->name[a]); - fprintf ( stderr, "\nIf %s is a PDBID, Make sure it identifies the right chain (A, B, 1, 2...)", S->name[a]); - fprintf ( stderr, "\nChain number or index must be added to the PDB id (i.e. 1gowA)"); - fprintf ( stderr, "\nIf You want to use %s anyway, rename it with a non-PDB identifier such as seq_%s\n",S->name[a],S->name[a]); - myexit (EXIT_FAILURE); - } - - free_sequence ( B->S, -1); - free_aln (B); - } - - } - } - } - vfree(buf1);vfree(buf2); - return A; - } - -Sequence * add_prf2seq ( char *file, Sequence *S) - { - char **new_seq; - Sequence *NS; - - if ( !is_aln (file)&& !is_seq (file))return S; - else - { - X_template *R; - Alignment *A; - - - R=fill_R_template(file,file, S); - - A=(R->VR)->A; - ((R->VR)->A)->expand=1; - new_seq=declare_char (1,A->len_aln+1); - sprintf ( new_seq[0], "%s",aln2cons_seq_mat(A, "blosum62mt")); - - NS=fill_sequence_struc(1, new_seq,A->file); - S=add_sequence (NS, S, 0); - (S->T[S->nseq-1])->R=R; - - free_sequence (NS, NS->nseq); - free_char( new_seq, -1); - - return S; - } - } -int prf_in_seq ( Sequence *S) -{ - int a; - - if ( !S) return 0; - else - { - for ( a=0; a< S->nseq; a++) - if (seq2R_template_profile(S, a)) return 1; - } - return 0; -} -Sequence * add_sequence ( Sequence *IN, Sequence *OUT, int i) - { - int s, a; - - char *buf; - if (OUT==NULL) - { - - OUT=duplicate_sequence (IN); - return OUT; - } - for (a=0; anseq; a++) - { - Alignment *P; - P=seq2R_template_profile (OUT, a); - if (!P) continue; - else if (name_is_in_list (IN->name[i], P->name, P->nseq, 100)!=-1) return OUT; - } - - /*Adds sequence i of IN at the end of OUT*/ - - if ((s=name_is_in_list ( IN->name[i], OUT->name, OUT->nseq,STRING))==-1 ) - { - OUT=realloc_sequence (OUT, OUT->nseq+1, IN->len[i]); - sprintf ( OUT->name[OUT->nseq],"%s",IN->name[i]); - sprintf ( OUT->file[OUT->nseq],"%s",IN->file[i]); - sprintf ( OUT->seq_comment[OUT->nseq],"%s",IN->seq_comment[i]); - sprintf ( OUT->aln_comment[OUT->nseq],"%s",IN->aln_comment[i]); - - sprintf ( OUT->seq[OUT->nseq],"%s",IN->seq[i]); - OUT->len[OUT->nseq]=IN->len[i]; - OUT->T[OUT->nseq][0]=IN->T[i][0]; - OUT->nseq++; - return OUT; - } - else if ( s!=-1 && !case_insensitive_strcmp ( IN->seq[i], OUT->seq[s])) - { - - if ( getenv4debug("DEBUG_RECONCILIATION"))fprintf ( stderr,"[DEBUG_RECONCILIATION:add_sequence]\n%s\n%s\n", IN->seq[i], OUT->seq[s]); - - add_warning (stderr, "WARNING: DISCREPANCY:%s in [%s] and [%s]\n", IN->name[i], IN->file[i], OUT->file[s]); - - - if (((buf=build_consensus(IN->seq[i], OUT->seq[s],"cfasta_pair_wise" ))!=NULL)||((buf=build_consensus(IN->seq[i], OUT->seq[s],"myers_miller_pair_wise" ))!=NULL)) - { - - OUT->max_len=MAX(OUT->max_len, strlen(buf)); - OUT->min_len=MIN(OUT->min_len, strlen(buf)); - OUT->seq =realloc_char ( OUT->seq, -1, -1,OUT->nseq,OUT->max_len+1); - - sprintf ( OUT->seq[s],"%s",buf); - OUT->len[s]=strlen (buf); - vfree (buf); - return OUT; - } - else - { - fprintf ( stderr, "IMPOSSIBLE TO RECONCILIATE SOME SEQUENCES[FATAL:%s]\n", PROGRAM); - print_aln ( align_two_sequences (IN->seq[i], OUT->seq[s], "idmat", 0, 0, "fasta_pair_wise")); - myexit (EXIT_FAILURE); - return NULL; - } - - } - else - { - return OUT; - } - } - - -Sequence * trim_seq ( Sequence *A, Sequence *B) - { - int a; - Sequence *R; - - if (A->nseq>B->nseq) - { - Sequence *I; - I=A;A=B;B=I; - } - - R=declare_sequence (MIN(A->min_len,B->min_len), MAX(A->max_len, B->max_len), MIN(A->nseq, B->nseq)); - R->nseq=0; - - for (a=0; a< A->nseq; a++) - { - if ( name_is_in_list ( A->name[a], B->name, B->nseq,STRING+1)!=-1) - { - sprintf ( R->name[R->nseq], "%s", A->name[a]); - sprintf ( R->seq[R->nseq], "%s", A->seq[a]); - sprintf ( R->file[R->nseq], "%s", A->file[a]); - sprintf ( R->aln_comment[R->nseq], "%s", A->aln_comment[a]); - sprintf ( R->seq_comment[R->nseq], "%s", A->seq_comment[a]); - - R->len[R->nseq]=A->len[a]; - R->nseq++; - } - } - return R; - } - -Sequence * trim_aln_seq ( Alignment *A, Alignment *B) - { - int a; - static char **name_list; - int n=0; - Sequence *SA, *SB; - int **cache_A=NULL; - int **cache_B=NULL; - int * p; - - /*This function inputs two alignments A and B - It removes sequences that are not common to both of them - It rearange the sequences so that they are in the same order - A decides on the order - The Sequences (A->S) and (B->S) are treated the same way - Sequences are also merged in order to detects discrepencies. - A pointer to S is returned - */ - if (name_list)free_char (name_list, -1); - name_list=declare_char (MAX(A->nseq, B->nseq), STRING+1); - - for ( a=0; a< A->nseq; a++) - { - if ( name_is_in_list ( A->name[a], B->name, B->nseq,STRING)!=-1) - { - sprintf ( name_list[n++], "%s", A->name[a]); - } - } - - - - reorder_aln ( A, name_list, n); - if (A->seq_cache)cache_A=duplicate_int (A->seq_cache, -1, -1); - if (B->seq_cache)cache_B=duplicate_int (B->seq_cache, -1, -1); - reorder_aln ( B, name_list, n); - for ( a=0; a< n; a++) - { - if ( cache_A) - { - p=A->seq_cache[A->order[a][0]]; - A->seq_cache[A->order[a][0]]=cache_A[a]; - cache_A[a]=p; - } - if ( cache_B) - { - p=B->seq_cache[B->order[a][0]]; - B->seq_cache[B->order[a][0]]=cache_B[a]; - cache_B[a]=p; - } - A->order[a][0]=B->order[a][0]=a; - } - free_int(A->seq_cache, -1); - free_int(B->seq_cache, -1); - - A->seq_cache=cache_A; - B->seq_cache=cache_B; - - - - SA=aln2seq(A); - SB=aln2seq(B); - - A->S=B->S=merge_seq (SA, SB); - return A->S; - } -Sequence * trim_aln_seq_name ( Alignment *A, Alignment *B) - { - int a; - Sequence *S; - - /*This function inputs two alignments A and B - It removes sequences that are not common to both of them - It rearange the sequences so that they are in the same order - A decides on the order - */ - S=declare_sequence ( 1, 1, A->nseq+B->nseq); - S->nseq=0; - for ( a=0; a< A->nseq; a++) - { - if ( name_is_in_list ( A->name[a], B->name, B->nseq,STRING)!=-1) - { - sprintf ( S->name[S->nseq++], "%s", A->name[a]); - } - } - return S; - } - - - -char ** rm_name_tag (char **name, int nseq, char *tag) -{ - int a , b, ntag; - char **tag_list; - char *s; - char **template_list; - if ( !name )return NULL; - - tag_list=declare_char (10, 4); - - if ( tag) - { - ntag=1; sprintf ( tag_list[0], "%s", tag); - } - else - { - ntag=0; - sprintf ( tag_list[ntag++], "_S_"); - sprintf ( tag_list[ntag++], "_G_"); - } - template_list=declare_char (nseq, 100); - for ( a=0; a%s _%s_ %s", name[a], s+1, s+3); - break; - } - } - } - - free_char (tag_list, -1); - return template_list; -} -Sequence * swap_header ( Sequence *S, Sequence *H) -{ - int a, b, n; - - for ( a=0; a< S->nseq; a++) - { - if ( (n=name_is_in_list (S->name[a],H->name, H->nseq, 1000))!=-1) - { - char **list; - - - list=string2list (H->seq_comment[n]); - if ( list==NULL || atoi(list[0])==1)continue; - S->seq_comment[a]='\0'; - sprintf (S->name[a], "%s%s%s",H->name[n], list[1], list[2]); - vfree ( S->seq_comment[a]);S->seq_comment[a]=vcalloc ( strlen (H->seq_comment[n])+1, sizeof (char)); - for (b=3; b< atoi(list[0]); b++)S->seq_comment[a]=strcat (S->seq_comment[a], list[b]); - free_char (list, -1); - } - } - return S; -} - - -Sequence * profile_seq2template_seq ( Sequence *S, char *template_file, Fname *F) -{ - /*This function fetches potential templates associated with sequences within a profile*/ - int i; - Alignment *A; - char *tmp; - - if ( !check_file_exists (template_file)) return S; - tmp=vtmpnam (NULL); - for ( i=0; i< S->nseq; i++) - { - if ( (A=seq2R_template_profile (S, i))) - { - printf_system ("cp %s %s", template_file, tmp);//seq2template over-writes the temnplate file with a list of the templates effectively encounter - A->S=aln2seq (A); - A->S=seq2template_seq (A->S, tmp, F); - if (!A->S)return NULL; - } - } - - return S; -} - -Sequence * seq2template_type(Sequence *Seq) -{ - //add template - int a, e; - int s; - struct X_template *S=NULL; - struct X_template *P=NULL; - struct X_template *R=NULL; - struct X_template *G=NULL; - struct X_template *F=NULL; - struct X_template *T=NULL; - struct X_template *E=NULL; - struct X_template *U=NULL; - Alignment *A; - - - e=' '; - for (a=0; a< Seq->nseq; a++) - { - if (!Seq->T[a])continue; - //HERE ADD a Template - P=seq_has_template (Seq, a, "_P_"); - S=seq_has_template (Seq, a, "_S_"); - R=seq_has_template (Seq, a, "_R_"); - G=seq_has_template (Seq, a, "_G_"); - F=seq_has_template (Seq, a, "_F_"); - T=seq_has_template (Seq, a, "_T_"); - E=seq_has_template (Seq, a, "_E_"); - U=seq_has_template (Seq, a, "_U_"); - - s=(!P)?1:0; - sprintf ( (Seq->T[a])->seq_type, "%c%c%c%c%c%c%c%c", (P)?'P':e, (S)?'S':e, (S &&!P)?'s':e,(R)?'R':e, (G)?'G':e,(T)?'T':e,(E)?'E':e,(U)?'U':e); - - if (R && (A=seq2R_template_profile (Seq,a))) - { - - A->S=seq2template_type ( A->S); - } - } - return Seq; -} - -char * string_contains_template_tag (char *string_in) -{ - char string[100]; - - if ( strstr (string, "_P_"))return "_P_"; - if ( strstr (string, "_S_"))return "_S_"; - if ( strstr (string, "_R_"))return "_R_"; - if ( strstr (string, "_G_"))return "_G_"; - if ( strstr (string, "_F_"))return "_F_"; - if ( strstr (string, "_T_"))return "_T_"; - if ( strstr (string, "_E_"))return "_E_"; - if ( strstr (string, "_U_"))return "_U_"; - - return NULL; -} -static int check_blast_is_installed (char *server); - - - -static int check_blast_is_installed (char *server) -{ - if (strm (server, "EBI")); - else if ( strm (server, "NCBI")) - return check_program_is_installed (NCBIWEBBLAST_4_TCOFFEE,NULL, NULL,NCBIWEBBLAST_ADDRESS, INSTALL_OR_DIE); - else if ( strm (server, "LOCAL")) - return check_program_is_installed (NCBIBLAST_4_TCOFFEE,NULL, NULL,NCBIBLAST_ADDRESS, INSTALL_OR_DIE); - return 1; -} - - -Sequence * vremove_seq_template_files(Sequence *S) -{ - return handle_seq_template_file (S, "remove"); -} -Sequence * display_seq_template_files(Sequence *S) -{ - return handle_seq_template_file (S, "display"); -} -Sequence * handle_seq_template_file (Sequence *S, char *mode) -{ - int a; - Template *T; - - for (a=0; a< S->nseq; a++) - { - T=S->T[a]; - if (T) - { - handle_X_template_files (T->P, mode); - handle_X_template_files (T->F, mode); - handle_X_template_files (T->R, mode); - handle_X_template_files (T->T, mode); - handle_X_template_files (T->E, mode); - } - } - - return S; -} -int handle_X_template_files ( X_template *T, char *mode) - { - if (!T)return 0; - - if ( strm (mode, "remove")) - { - vremove (T->template_file); - vremove (T->template_name); - } - else if (strm (mode, "display")) - { - char buf[100]; - sprintf ( buf, "Template %s", template_type2type_name (T->template_type)); - if (check_file_exists (T->template_name))display_output_filename ( stdout,buf,T->template_format,T->template_name, STORE); - } - else - { - printf_exit (EXIT_FAILURE, stderr, "\nUnkonwn mode %s for template handling [FATAL:%s]", mode, PROGRAM); - } - return 1; - } -Sequence * seq2template_seq ( Sequence *S, char *template_list, Fname *F) -{ - /*Expected format for the template file: - >seq_name _X_ Target_template - X: S for Structures - G for genomes (Exoset) - When alternative templates are given for a sequence, the first one superseeds all the others - */ - - /*Fill the sequences*/ - /*1: No template*/ - char buf[1000]; - - int PmC,PmI,PMI; - int BmC,BmI,BMI; - char *server; - char *pdb_db,*prot_db; - - int remove_template_file=0; - - remove_template_file=get_int_variable ("remove_template_file"); - server=get_string_variable ("blast_server"); - pdb_db=get_string_variable ("pdb_db"); - prot_db=get_string_variable ("prot_db"); - - PmI=get_int_variable ("pdb_min_sim"); - PMI=get_int_variable ("pdb_max_sim"); - PmC=get_int_variable ("pdb_min_cov"); - - BmI=get_int_variable ("prot_min_sim"); - BMI=get_int_variable ("prot_max_sim"); - BmC=get_int_variable ("prot_min_cov"); - - if ( (template_list && template_list[0]=='\0') || strm ( template_list, "no_template")) - { - return S; - } - else if ( strstr (template_list, "MODE_"))//pre_set mode - { - return seq2template_seq ( S,template_list+strlen ("MODE_"),F); - } - else if ( strm ( template_list, "SSP")|| strm ( template_list, "GOR")) - { - - /*use GOR to Predict the secondary structure*/ - check_program_is_installed (GOR4_4_TCOFFEE,NULL, NULL,GOR4_ADDRESS, INSTALL_OR_DIE); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#ssp_template@seq#%s/%s@obs#%s/%s@cache#%s@type#_E_",get_mcoffee_4_tcoffee(), "New_KS.267.seq", get_mcoffee_4_tcoffee(), "New_KS.267.obs", get_cache_dir()); - S=seq2template_seq (S,buf, F); - return S; - } - else if ( strm ( template_list, "PSISSP") || strm (template_list, "PSIGOR")) - { - - /*Computes a GOR consensus on a psi-blast output*/ - check_program_is_installed (GOR4_4_TCOFFEE,NULL, NULL,GOR4_ADDRESS, INSTALL_OR_DIE); - check_blast_is_installed(server); - - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#psissp_template@seq#%s/%s@obs#%s/%s@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_E_",get_mcoffee_4_tcoffee(), "New_KS.267.seq", get_mcoffee_4_tcoffee(), "New_KS.267.obs", get_cache_dir(), BmI,BMI,BmC,server); - S=seq2template_seq (S,buf, F); - return S; - } - else if ( strm ( template_list, "TM")) - { - - /*predict transmembrane structure*/ - check_program_is_installed (HMMTOP_4_TCOFFEE,NULL, NULL,HMMTOP_ADDRESS, INSTALL_OR_DIE); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#tm_template@arch#%s/%s@psv#%s/%s@type#_T_",get_mcoffee_4_tcoffee(), "hmmtop.arch", get_mcoffee_4_tcoffee(), "hmmtop.psv"); - S=seq2template_seq (S,buf, F); - return S; - } - else if ( strm ( template_list, "PSITM")) - { - - /*predict transmembrane structure*/ - check_program_is_installed (HMMTOP_4_TCOFFEE,NULL, NULL,HMMTOP_ADDRESS, INSTALL_OR_DIE); - check_blast_is_installed(server); - - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#psitm_template@arch#%s/%s@psv#%s/%s@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_T_",get_mcoffee_4_tcoffee(), "hmmtop.arch", get_mcoffee_4_tcoffee(), "hmmtop.psv",get_cache_dir(), BmI,BMI,BmC,server); - S=seq2template_seq (S,buf, F); - return S; - } - - else if (strm ( template_list, "PSIBLAST")) - { - check_blast_is_installed(server); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#psiprofile_template@database#%s@method#psiblast@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_R_", prot_db,get_cache_dir(),BmI,BMI,BmC,server); - S=seq2template_seq (S,buf, F); - - return S; - } - else if (strm ( template_list, "BLAST") ) - { - check_blast_is_installed(server); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#profile_template@database#%s@method#blastp@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_R_", prot_db,get_cache_dir(),BmI,BMI,BmC,server); - S=seq2template_seq (S,buf, F); - - return S; - } - else if ( strm ( template_list, "EXPRESSO") || strm (template_list, "PDB")) - { - check_blast_is_installed(server); - - int isRNA = 0; - int i; - for (i= 0; i < S->len[0]; ++i) - { - isRNA = (isRNA || is_rna(S->seq[0][i])); - } - - if (isRNA) - { - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#pdb_template@database#%s@method#blastn@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_P_",pdb_db, get_cache_dir(),PmI,PMI,PmC, server); - } - else - { - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#pdb_template@database#%s@method#blastp@cache#%s@minid#%d@maxid#%d@mincov#%d@server#%s@type#_P_",pdb_db, get_cache_dir(),PmI,PMI,PmC, server); - } - return seq2template_seq (S,buf, F); - } - - else if ( strm (template_list, "RCOFFEE") || strm (template_list, "RNA")) - { - char *file_struc_clac = vtmpnam (NULL); - FILE* struc_calc_f =vfopen(file_struc_clac,"w"); - int i; - int j = 0; - for (i = 0; i< S->nseq; ++i) - { - if (S->T[i]->P) - { - ++j; - fprintf(struc_calc_f,"%s %s\n",S->name[i],S->T[i]->P->template_file); - } - } - - vfclose(struc_calc_f); - check_program_is_installed (RNAPLFOLD_4_TCOFFEE,NULL, NULL,RNAPLFOLD_ADDRESS, IS_FATAL); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#RNA_template@type#_F_"); - if (j > 0) - { - S = seq2template_seq (S,buf,F); - sprintf ( buf, "SCRIPT_tc_generic_method.pl@mode#calc_rna_template@pdbfile#%s@cache#%s@type#_F_", file_struc_clac,get_cache_dir()); - } -// printf("IN T_\n"); - return seq2template_seq (S,buf,F); - } - - /*2: Templates from seqnames (SELF) or named like the sequences (SEQFILE)*/ - else if ( strstr (template_list, "SELF_") ||strstr (template_list, "SEQFILE_") ) - { - int a; - char *p; - - //add template - for (a=0; a< S->nseq; a++) - { - - if ( (p=strstr (template_list,"SELF_")))p=S->name[a]; - else if ( strstr (template_list, "SEQFILE_"))p=template_list; - else - { - fprintf ( stderr, "\nUnkown mode for Template [FATAL:%s]\n", PROGRAM); - myexit (EXIT_FAILURE); - } - - if ( strstr (template_list, "_P_") && !(S->T[a])->P) - { - (S->T[a])->P =fill_P_template ( S->name[a], p,S);//PDB - - } - else if ( strstr (template_list, "_S_") && !(S->T[a])->S)(S->T[a])->S =fill_S_template ( S->name[a], p,S);//Sequence - else if ( strstr (template_list, "_R_" )&& !(S->T[a])->R)(S->T[a])->R =fill_R_template ( S->name[a], p,S);//pRofile - else if ( strstr (template_list, "_G_" )&& !(S->T[a])->G)(S->T[a])->G =fill_G_template ( S->name[a], p,S);//Genomic - else if ( strstr (template_list, "_F_" )&& !(S->T[a])->F)(S->T[a])->F =fill_F_template ( S->name[a], p,S);//Fold - else if ( strstr (template_list, "_T_" )&& !(S->T[a])->T)(S->T[a])->T =fill_T_template ( S->name[a], p,S);//Trans Membrane - else if ( strstr (template_list, "_E_" )&& !(S->T[a])->E)(S->T[a])->E =fill_E_template ( S->name[a], p,S);//Secondary Structure - else if ( strstr (template_list, "_U_" )&& !(S->T[a])->U)(S->T[a])->U =fill_U_template ( S->name[a], p,S);//unicode, list template - - } - return S; - } - - /*2: Templates comes in a template_file*/ - else if ( template_list==NULL || format_is_fasta (template_list)) - { - Sequence *T; - int a, i; - int ntemp=0; - T=(template_list!=NULL)?get_fasta_sequence (template_list, NULL):S; - for (a=0; a< T->nseq; a++) - { - - char *p; - if ((i=name_is_in_list(T->name[a], S->name, S->nseq, MAXNAMES))!=-1) - { - if ( (p=strstr (T->seq_comment[a], " _P_ ")) && !(S->T[i])->P &&( (S->T[i])->P=fill_P_template (S->name[i],p,S))) - { - ntemp++; - } - else if ( (p=strstr (T->seq_comment[a], " _F_ ")) && !(S->T[i])->F &&( (S->T[i])->F=fill_F_template (S->name[i],p,S)))ntemp++; - else if ( (p=strstr (T->seq_comment[a], " _S_ ")) && !(S->T[i])->S &&( (S->T[i])->S=fill_S_template (S->name[i],p,S)))ntemp++; - - else if ( (p=strstr (T->seq_comment[a], " _R_ ")) && !(S->T[i])->R &&( (S->T[i])->R=fill_R_template (S->name[i],p,S)))ntemp++; - else if ( (p=strstr (T->seq_comment[a], " _G_ ")) && !(S->T[i])->G &&( (S->T[i])->G=fill_G_template (S->name[i],p,S)))ntemp++; - else if ( (p=strstr (T->seq_comment[a], " _T_ ")) && !(S->T[i])->T &&( (S->T[i])->T=fill_T_template (S->name[i],p,S)))ntemp++; - else if ( (p=strstr (T->seq_comment[a], " _E_ ")) && !(S->T[i])->E &&( (S->T[i])->E=fill_E_template (S->name[i],p,S)))ntemp++; - else if ( (p=strstr (T->seq_comment[a], " _U_ ")) && !(S->T[i])->U &&( (S->T[i])->E=fill_U_template (S->name[i],p,S)))ntemp++; - - if (T!=S)strcat (S->seq_comment[i], T->seq_comment[a]); - } - } - - if (T!=S)free_sequence (T, -1); - - if ( remove_template_file==2 || ntemp==0) - { - vremove (template_list); - } - else - if (template_list)display_output_filename ( stdout, "Template_List","fasta_seq", template_list, STORE); - return S; - } - - /*3 Templates are generated with a script*/ - else if (strstr (template_list, "SCRIPT_") && get_string_variable ("multi_core") && strstr (get_string_variable ("multi_core"), "templates") && get_nproc()>1) - { - char *tmp1,*command; - Alignment *A; - char **temp_file,**seq_file; - int * pid_list, pid, npid, submited; - int nproc, max_nproc; - - char outfile[1000]; - static char *script; - static int ntemp; - char *p; - int z, i; - if (!script)script=vcalloc ( 1000, sizeof(char)); - - ntemp++; - - command=vcalloc ( 1000, sizeof (char)); - tmp1=vtmpnam (NULL); - - A=seq2aln (S,NULL, 0); - string_array_upper(A->seq_al, A->nseq); - output_fasta_seq (tmp1, A); - sprintf ( script, "%s", after_strstr (template_list, "SCRIPT_")); - - if ((p=strstr (template_list, "@type#"))) - p+=strlen ("@type#"); - if (F) - { - sprintf (outfile, "%s%s_%s%d.template_list", F->path,F->name,template_type2short_type_name(p),ntemp); - } - else - { - F=parse_fname (S->file[0]); - sprintf (outfile, "%s%s_%s%d.template_list",F->path, F->name,template_type2short_type_name(p),ntemp); - free_fname (F); - } - - nproc=get_nproc(); - max_nproc=2*nproc; - - script=substitute(script, "@", " -"); - script=substitute(script, "#", "="); - - temp_file=vcalloc ( A->nseq, sizeof (char*)); - seq_file =vcalloc (A->nseq, sizeof (char*)); - pid_list =vcalloc (MAX_N_PID, sizeof (int *)); - - fprintf ( stderr, "\n\t------ Fetch %Templates [Multi Core Mode %d CPUs]\n",get_nproc()); - for (npid=0, submited=0,i=0; inseq; i++) - { - FILE *fp2; - seq_file[i]=vtmpnam (NULL); - temp_file[i]=vtmpnam (NULL); - fp2=vfopen (seq_file[i], "w"); - fprintf ( fp2, ">%s\n%s\n", S->name[i], S->seq[i]); - vfclose (fp2); - - pid=vfork(); - if (pid==0) - { - initiate_vtmpnam (NULL); - if ( strstr (script, "tc_generic_method")) - { - //sprintf ( command, "%s -other_pg %s -infile=%s -outfile=%s -tmpdir=%s",get_string_variable ("t_coffee"),script,seq_file[i],temp_file[i],get_tmp_4_tcoffee()); - sprintf ( command, "%s -infile=%s -outfile=%s -tmpdir=%s",script,seq_file[i],temp_file[i],get_tmp_4_tcoffee()); - if (strstr (command, "EBI"))get_email (); - } - else - //sprintf ( command, "%s -other_pg %s -infile=%s -outfile=%s",get_string_variable("t_coffee"),script,seq_file[i],temp_file[i]); - sprintf ( command, "%s -infile=%s -outfile=%s",script,seq_file[i],temp_file[i]); - command=substitute(command, "@", " "); - my_system ( command); - exit (EXIT_SUCCESS); - } - else - { - pid_list[pid]=npid; - set_pid(pid); - npid++; - submited++; - submited=vwait_npid(submited,max_nproc,nproc); - } - } - - submited=vwait_npid(submited,0,0); - //Concatenate all the files - vremove (outfile); - for (i=0; iseq_al, A->nseq); - output_fasta_seq (tmp1, A); - sprintf ( script, "%s", after_strstr (template_list, "SCRIPT_")); - fprintf ( stderr, "\n"); - if ((p=strstr (template_list, "@type#"))) - p+=strlen ("@type#"); - if (F) - { - sprintf (outfile, "%s%s_%s%d.template_list", F->path,F->name,template_type2short_type_name(p),ntemp); - } - else - { - F=parse_fname (S->file[0]); - sprintf (outfile, "%s%s_%s%d.template_list",F->path, F->name,template_type2short_type_name(p),ntemp); - free_fname (F); - } - - script=substitute(script, "@", " -"); - script=substitute(script, "#", "="); - - if ( strstr (script, "tc_generic_method")) - { - sprintf ( command, "%s -other_pg %s -infile=%s -outfile=%s -tmpdir=%s",get_string_variable ("t_coffee"),script, tmp1,outfile,get_tmp_4_tcoffee()); - if (strstr (command, "EBI"))get_email (); - } - else sprintf ( command, "%s -other_pg %s -infile=%s -outfile=%s",get_string_variable("t_coffee"),script, tmp1, outfile); - - vremove (outfile); - command=substitute(command, "@", " "); - - my_system ( command); - - free_aln (A); - - if ( check_file_exists (outfile) && format_is_fasta(outfile)) - { - S=seq2template_seq (S, outfile, F); - } - else if (strstr (command, "webblast.pl"))return S; - else - { - - add_warning (stderr, "\nWARNING: Could not Run %s to find templates[%s]\n",command, PROGRAM); - return NULL; - } - - vfree (command); - return S; - } - - return S; -} - -char* seq2template_file (Sequence *S, char *file) -{ - Alignment *A; - int i; - - if (file==NULL)file=vtmpnam (NULL); - - seq2template_file2 (S, file, "w"); - for (i=0; inseq; i++) - if ( (A=seq2R_template_profile (S, i))) - { - seq2template_file2 (A->S, file, "a"); - } - return file; -} - -int seq2template_file2 (Sequence *S, char *file, char *mode) -{ - FILE *fp; - int i; - char buf1[10000]; - char buf2[10000]; - struct X_template *X; - - fp=vfopen ( file, mode); - for ( i=0; i< S-> nseq; i++) - { - buf1[0]=0; - if ( (X=(S->T[i])->P)){sprintf (buf2, " %s %s ", X->template_type, X->template_file);strcat (buf1, buf2);} - /*if ( (X=(S->T[i])->S)){sprintf (buf2, " %s %s ", X->template_type, X->template_file);strcat (buf1, buf2);}*/ - if ( (X=(S->T[i])->R)){sprintf (buf2, " %s %s ", X->template_type, X->template_file);strcat (buf1, buf2);} - if ( (X=(S->T[i])->G)){sprintf (buf2, " %s %s ", X->template_type, X->template_file);strcat (buf1, buf2);} - if (buf1[0])fprintf ( fp, ">%s %s\n", S->name[i], buf1); - } - vfclose (fp); - return EXIT_SUCCESS; -} - - - - -int seq2n_X_template ( Sequence *S, char *type) -{ - int a, n; - - for (n=0,a=0; a< S->nseq; a++) - { - if ( strm2 (type, "_P_","_*_") && (S->T[a])->P)n++; - if ( strm2 (type, "_F_","_*_") && (S->T[a])->F)n++; - if ( strm2 (type, "_S_","_*_") && (S->T[a])->S)n++; - if ( strm2 (type, "_R_","_*_") && (S->T[a])->R)n++; - if ( strm2 (type, "_G_","_*_") && (S->T[a])->G)n++; - } - return n; -} -struct X_template *fill_X_template ( char *name, char *p, char *token) -{ - struct X_template *X; - - - - - char *k; - - X=vcalloc (1, sizeof (X_template)); - sprintf ( X->seq_name, "%s", name); - if ( (k=strstr (p, token)))sscanf (k+strlen(token), "%s",X->template_name); - else sprintf (X->template_name, "%s", p); - - - /*Add a Structure HERE*/ - sprintf ( X->template_type, "%s", token); - if ( strm (token, "_P_"))X->VP=vcalloc (1, sizeof (P_template)); - if ( strm (token, "_F_"))X->VF=vcalloc (1, sizeof (F_template)); - - if ( strm (token, "_S_"))X->VS=vcalloc (1, sizeof (S_template)); - if ( strm (token, "_R_"))X->VR=vcalloc (1, sizeof (R_template)); - if ( strm (token, "_G_"))X->VG=vcalloc (1, sizeof (G_template)); - if ( strm (token, "_T_"))X->VT=vcalloc (1, sizeof (T_template)); - if ( strm (token, "_E_"))X->VE=vcalloc (1, sizeof (E_template)); - if ( strm (token, "_U_"))X->VU=vcalloc (1, sizeof (U_template)); - - return X; -} - -struct X_template* free_X_template ( struct X_template *X) -{ - if (X->VP) - { - vfree (X->VP); - } - if (X->VF) - { - vfree (X->VF); - } - if ( X->VS) - { - free_sequence ((X->VS)->S, -1); - vfree (X->VS); - } - if ( X->VR) - { - free_aln ((X->VR)->A); - vfree (X->VR); - } - if ( X->VG) - { - free_sequence ((X->VG)->S, -1); - vfree (X->VG); - } - - vfree (X); - return NULL; -} - -FILE * display_sequence_templates (Sequence *S,int i, FILE *io) -{ - - - io=display_X_template ( (S->T[i])->P, io); - - io=display_X_template ( (S->T[i])->F, io); - - io=display_X_template ( (S->T[i])->S, io); - - io=display_X_template ( (S->T[i])->R, io); - io=display_X_template ( (S->T[i])->G, io); - io=display_X_template ( (S->T[i])->T, io); - io=display_X_template ( (S->T[i])->E, io); - - return io; -} - -FILE * display_X_template (struct X_template *X, FILE *io) -{ - - if ( !X) return io; - if ( !strm (X->template_type, "_S_"))fprintf (io, "\n\t%s: Template=%s, File=%s",template_type2type_name (X->template_type), X->template_name,X->template_file); - return io; -} -char *template_type2short_type_name (char *type) -{ - //add_template - if (!type)return ""; - else if ( strstr (type, "_P_")) return "pdb"; - else if ( strstr (type, "_F_")) return "rfold"; - else if ( strstr (type, "_S_")) return "seq"; - else if ( strstr (type, "_R_")) return "prf"; - else if ( strstr (type, "_G_")) return "genome"; - else if ( strstr (type, "_E_")) return "ssp"; - else if ( strstr (type, "_T_")) return "tmp"; - else if ( strstr (type, "_U_")) return "unicode"; - else return type; -} -char *template_type2type_name (char *type) -{ - //add_template - if ( strstr (type, "_P_")) return "PDB struc"; - else if ( strstr (type, "_F_")) return "RNA Fold"; - else if ( strstr (type, "_S_")) return "Sequeence"; - else if ( strstr (type, "_R_")) return "Profile"; - else if ( strstr (type, "_G_")) return "Genomic"; - else if ( strstr (type, "_E_")) return "Protein Secondary Structure"; - else if ( strstr (type, "_T_")) return "Protein Trans Membrane Structure "; - else if ( strstr (type, "_U_")) return "Unicode and strings"; - - else return type; -} -struct X_template *fill_F_template ( char *name,char *p, Sequence *S) -{ - /*Profile template*/ - struct X_template *F; - - F=fill_X_template ( name, p, "_F_"); - sprintf (F->template_format , "TCOFFEE_LIBRARY"); - if (!F || !check_file_exists (F->template_name)) - { - fprintf ( stderr, "\nWARNING: Could Not Fill _F_ (Fold) template for sequence |%s|", name); - free_X_template (F); - return NULL; - } - else if ( check_file_exists (F->template_name)) - { - sprintf ( F->template_file, "%s", F->template_name); - } - - return F; - -} - - -struct X_template *fill_P_template ( char *name,char *p, Sequence *S) -{ - struct X_template *P; - Sequence *PS; - Alignment *A; - int sim, cov, i; - char *buf; - - - P=fill_X_template ( name, p, "_P_"); - sprintf (P->template_format , "pdb"); - - if (!P) - { - //fprintf ( stderr, "\nWARNING: Could Not Fill _P_ template for sequence |%s|", name); - free_X_template (P); - return NULL; - } - else if ( check_file_exists (P->template_name)) - { - - sprintf ( P->template_file, "%s", P->template_name); - buf=path2filename (P->template_name); - if (P->template_name!=buf) - { - sprintf ( P->template_name, "%s",buf ); - vfree (buf); - } - } - else - { - char *st; - - - st=is_pdb_struc (P->template_name); - if (st) - { - if (st!=P->template_file)sprintf ( P->template_file, "%s", st); - } - } - - /*Make a first run to fix relaxed PDB files*/ - buf=fix_pdb_file (P->template_file); - - if ( buf!=P->template_file) - { - - sprintf ( P->template_file, "%s",buf); - vfree (buf); - } - - /*Check the PDB FILE EXISTS*/ - if (!is_pdb_file (P->template_file)) - { - - add_warning(stderr, "\nWARNING: _P_ Template |%s| Could Not Be Found\n",p); - free_X_template (P); - return NULL; - } - else - { - buf= get_pdb_id (P->template_file); - if (buf!=(P->VP)->pdb_id) - { - sprintf ((P->VP)->pdb_id, "%s", buf); - vfree (buf); - } - } - - /*Check the target sequence is similar enough*/ - - PS=get_pdb_sequence (P->template_file); - - - if ( PS==NULL) - { - add_warning( stderr, "\nWARNING: _P_ Template |%s| Could Not be Used for Sequence |%s|: Structure Not Found", P->template_name, name); - free_X_template (P);P=NULL; - } - else - { - int minsim=get_int_variable ("pdb_min_sim"); - int mincov=get_int_variable ("pdb_min_cov"); - - - i=name_is_in_list (name, S->name, S->nseq, 100); - - A=align_two_sequences (S->seq[i], PS->seq[0],"idmat",-3,0, "fasta_pair_wise"); - cov=aln2coverage (A, 0); - sim=aln2sim (A, "idmat"); - - if (simtemplate_name,name, sim, minsim); - free_X_template (P); - P=NULL; - } - else if ( covtemplate_name,name, cov, mincov); - free_X_template (P);P=NULL; - } - free_aln(A); - free_sequence (PS, -1); - } - - return P; -} - -struct X_template *fill_S_template ( char *name,char *p, Sequence *Seq) -{ - struct X_template *S; - S=fill_X_template ( name, p, "_S_"); - if ( strm (name, p))sprintf ( S->template_file, "%s",output_fasta_seqX (NULL,"w",Seq,NULL, seq_name2index (name, Seq))); - (S->VS)->S=get_fasta_sequence (S->template_file, NULL); - return S; -} -struct X_template *fill_R_template ( char *name,char *p, Sequence *S) -{ - /*Profile template*/ - struct X_template *R; - - - R=fill_X_template ( name, p, "_R_"); - sprintf (R->template_format , "fasta_aln"); - - - if (!is_aln(R->template_name) && !is_seq (R->template_name)) - { - - add_warning ( stderr, "\nWARNING: _R_ Template %s Could Not Be Found\n",R->template_name); - free_X_template (R); - return NULL; - } - else - { - int s; - Sequence *S1; - Alignment *A1; - - (R->VR)->A=main_read_aln (R->template_name, NULL); - - if ( !S) - sprintf ( R->template_file, "%s", R->template_name); - else - { - s=name_is_in_list(name, S->name, S->nseq, 100); - if ( s!=-1) - { - S1=fill_sequence_struc (1, &S->seq[s], &S->name[s]); - A1=seq2aln (S1,NULL, RM_GAP); - - (R->VR)->A=trim_aln_with_seq (A1, (R->VR)->A); - - sprintf ( R->template_file, "%s", vtmpnam (NULL)); - output_clustal_aln (R->template_file, (R->VR)->A); - } - else - sprintf ( R->template_file, "%s", R->template_name); - } - (R->VR)->A=aln2profile ((R->VR)->A); - } - return R; -} - -struct X_template *fill_T_template ( char *name,char *p, Sequence *S) -{ - /*Profile template*/ - struct X_template *T; - - T=fill_X_template ( name, p, "_T_"); - sprintf (T->template_format , "fasta_seq"); - - if (!is_aln(T->template_name) && !is_seq (T->template_name)) - { - - add_warning ( stderr, "\nWARNING: _T_ Template %s Could Not Be Found\n",T->template_name); - free_X_template (T); - return NULL; - } - else - { - - (T->VT)->S=main_read_seq(T->template_name); - sprintf ( T->template_file, "%s", T->template_name); - } - return T; -} -//add template -struct X_template *fill_U_template ( char *name,char *p, Sequence *S) -{ - /*Profile template*/ - struct X_template *U; - - U=fill_X_template ( name, p, "_U_"); - sprintf (U->template_format , "string list"); - - if (!check_file_exists(U->template_name)) - { - add_warning ( stderr, "\nWARNING: _U_ Template %s Could Not Be Found\n",U->template_name); - free_X_template (U); - return NULL; - } - else - { - //(U->VU)->list=file2string(U->template_name); - sprintf ( U->template_file, "%s", U->template_name); - } - return U; -} -struct X_template *fill_E_template ( char *name,char *p, Sequence *S) -{ - /*Profile template*/ - struct X_template *E; - - - E=fill_X_template ( name, p, "_E_"); - sprintf (E->template_format , "fasta_seq"); - - if (!is_aln(E->template_name) && !is_seq (E->template_name)) - { - - add_warning ( stderr, "\nWARNING: _E_ Template %s Could Not Be Found\n",E->template_name); - free_X_template (E); - return NULL; - } - else - { - (E->VE)->S=main_read_seq (E->template_name); - sprintf ( E->template_file, "%s", E->template_name); - } - return E; -} -struct X_template *fill_G_template ( char *name,char *p, Sequence *S) -{ - struct X_template *G; - G=fill_X_template ( name, p, "_G_"); - sprintf (G->template_format , "fasta_seq"); - - /*1: Get the sequence from another file if needed*/ - if ( strm (name, p))sprintf ( G->template_file, "%s",output_fasta_seqX (NULL,"w",S,NULL, seq_name2index (name, S))); - else if ( strstr (p, "SEQFILE_")) - { - Sequence *ST; - int i2; - - - ST=main_read_seq (after_strstr ( p,"SEQFILE_G_")); - - i2=seq_name2index (name, ST); - if ( i2!=-1) - { - sprintf ( G->template_file, "%s",output_fasta_seqX (NULL,"w",ST,NULL, i2)); - sprintf ( G->template_name, "%s", name); - } - free_sequence (ST, -1); - } - else sprintf (G->template_file, "%s", G->template_name); - - - /*2: Put the template in VG->S*/ - if (!is_seq (G->template_file)) - { - add_warning ( stderr, "\nWARNING: _G_ Template %s Could Not Be Found \n",p); - - free_X_template (G); - return NULL; - } - else - { - (G->VG)->S=get_fasta_sequence (G->template_file, NULL); - } - return G; -} - - -char *seq2T_value ( Sequence *S, int n, char *value, char *type) -{ - static char *rv_buf; - X_template *X; - - if ( !rv_buf)rv_buf=vcalloc (100, sizeof(char)); - if (!(X=seq_has_template (S, n, type)))return NULL; - else - { - if (strm (value, "template_file"))return X->template_file; - else if ( strm (value, "template_name"))return X->template_name; - else if ( strm (value, "seq_name"))return X->seq_name; - else if (strm (type, "_P_")) - { - if ( strm (value, "pdb_id"))return (X->VP)->pdb_id; - } - else if ( strm (type, "_R_")) - { - if ( strm (value, "A")) - { - if ((X->VR)->A){sprintf ( rv_buf, "%d", (int)(X->VR)->A);return rv_buf;} - else return NULL; - } - } - - } - return NULL; -} -char *seq2P_pdb_id (Sequence *S, int n) -{ - if (!S->T || !S->T[n] || !(S->T[n])->P ) return NULL; - else return ((S->T[n])->P)->template_name; -} - - -char *seq2P_template_file(Sequence *S, int n) -{ - - return seq2T_value (S, n, "template_file", "_P_"); -} - -char *profile2P_template_file (Sequence *S, int n) -{ - Alignment *A; - int a; - char *p; - - if ( !(A=seq2R_template_profile (S, n)))return NULL; - for (a=0; anseq; a++) - { - if ((p=seq2P_template_file (A->S, a))!=NULL)return p; - } - return NULL; -} -Alignment * seq2R_template_profile (Sequence *S, int n) -{ - - - return (Alignment *)atop(seq2T_value (S, n, "A", "_R_")); -} -char * seq2E_template_string (Sequence *S, int n) -{ - struct X_template *T; - - if ( (T=seq_has_template (S, n, "_E_"))!=NULL) - return ((T->VE)->S)->seq[0]; - else - return NULL; -} -//add template -int* seq2U_template (Sequence *S, int n) -{ - struct X_template *T; - - if ( (T=seq_has_template (S, n, "_U_"))!=NULL) - return (T->VU)->list; - else - return NULL; -} -char * seq2T_template_string (Sequence *S, int n) -{ - struct X_template *T; - - if ( (T=seq_has_template (S, n, "_T_"))!=NULL) - return ((T->VT)->S)->seq[0]; - else - return NULL; -} - -struct X_template* seq_has_template ( Sequence *S, int n, char *mode) -{ - Template *T; - - if ( !S || !mode) return NULL; - else if ( n<0 || n>=S->nseq)return NULL; - else if ( !(S->T)) return NULL; - else if ( !(S->T[n]))return NULL; - - T=S->T[n]; - //ADD STRUCTURE - //add template - if ( strm (mode, "_P_"))return T->P; - else if ( strm (mode, "_F_"))return T->F; - else if ( strm (mode, "_S_"))return T->S; - else if ( strm (mode, "_R_"))return T->R; - else if ( strm (mode, "_T_"))return T->T; - else if ( strm (mode, "_E_"))return T->E; - else if ( strm (mode, "_U_"))return T->U; - else if ( strm (mode, "_G_"))return T->G; - else return NULL; -} - -char ** name2random_subset (char **in_name, int n_in, int n_out) -{ - char **out_name; - - int **list; - int a,max; - - - vsrand (0); - max=n_in*10000; - out_name=declare_char (n_out,MAXNAMES+1 ); - list=declare_int (n_in, 2); - - for (a=0; aname, A->nseq, A->nseq); - A=reorder_aln (A, name_list, A->nseq); - free_char (name_list, -1); - return A; -} -Alignment *aln2jacknife (Alignment *A, int nseq, int len) -{ - int a, b; - - if (nseq!=0 && nseqnseq) - { - char **name; - - name=name2random_subset (A->name, A->nseq, nseq); - A=reorder_aln (A, name, nseq); - free_char (name, -1); - } - - if (len!=0 && lenlen_aln) - { - int **l; - Alignment *B; - - l=declare_int (A->len_aln, 2); - for (a=0; a< A->len_aln; a++) - { - l[a][0]=a; - l[a][1]=rand()%(A->len_aln*1000); - } - sort_int ( l,2, 1, 0, A->len_aln-1); - B=copy_aln (A, NULL); - for ( a=0; a< len; a++) - { - for ( b=0; bnseq; b++) - { - A->seq_al[b][a]=B->seq_al[b][l[a][0]]; - } - } - for (b=0; bnseq; b++)A->seq_al[b][len]='\0'; - free_aln (B); - free_int (l, -1); - } - return A; -} -Alignment * aln2scramble_seq (Alignment *A) -{ - int **list; - char **name_list; - int a,max; - - max=100*A->nseq; - vsrand (0); - - list=declare_int (A->nseq, 2); - name_list=vcalloc (A->nseq, sizeof (char*)); - - - for (a=0; anseq; a++) - { - list[a][0]=a; - list[a][1]=rand ()%max; - } - sort_int ( list,2, 1, 0, A->nseq-1); - - for ( a=0; a< A->nseq; a++) - name_list[a]=A->seq_al[a]; - for (a=0; anseq; a++) - { - A->seq_al[a]=name_list[list[a][0]]; - } - vfree (name_list); - free_int (list, -1); - return aln2random_order (A); -} - - - -Alignment * reorder_aln ( Alignment *A, char **name, int nseq) - { - int a,sn; - Alignment *BUF; - int n=0; - int *tpp_int; - - if ( name==NULL)return aln2random_order(A); - - - BUF=copy_aln ( A,NULL); - for ( a=0; aname, A->nseq,STRING); - if ( sn==-1) - { - ; - } - else - { - - - SWAPP(A->order[n], BUF->order[sn], tpp_int); - sprintf ( A->name[n], "%s", BUF->name[sn]); - sprintf ( A->seq_al[n], "%s",BUF->seq_al[sn]); - sprintf ( A->seq_comment[n], "%s", BUF->seq_comment[sn]); - - n++; - - } - } - - for ( a=n; a< A->nseq; a++)A->name[a][0]=A->seq_al[a][0]='\0'; - A->nseq=n; - - if ( A->A)A->A=reorder_aln(A->A, name, nseq); - free_aln (BUF); - return A; - } -Sequence * reorder_seq_2 ( Sequence *A, int **order,int field, int nseq) - { - char **name; - int a; - - if (!A || !order) return A; - name=declare_char (A->nseq, 100); - for (a=0; aname[order[a][field]]); - A=reorder_seq (A, name,nseq); - free_char (name, -1); - return A; - } -Sequence * reorder_seq ( Sequence *A, char **name, int nseq) - { - int a,sn; - Sequence *nA; - - - nA=duplicate_sequence (A); - - - for ( a=0; a< nseq; a++) - { - sn=name_is_in_list (name[a] ,nA->name, nA->nseq, 100); - if (sn==-1)continue; - - if ( nA->file) sprintf ( A->file[a], "%s", nA->file[sn]); - - if ( nA->seq_comment)sprintf ( A->seq_comment[a], "%s", nA->seq_comment[sn]); - if ( nA->aln_comment)sprintf ( A->aln_comment[a], "%s", nA->aln_comment[sn]); - sprintf ( A->seq[a], "%s", nA->seq[sn]); - A->len[a]=nA->len[sn]; - sprintf ( A->name[a], "%s", nA->name[sn]); - A->T[a][0]=nA->T[sn][0]; - } - A->nseq=nseq; - free_sequence (nA, nA->nseq); - - return A; -} - -char * concatenate_seq ( Sequence *S, char *conc, int *order) - { - int a; - - vfree (conc); - conc=vcalloc ( S->nseq*S->max_len, sizeof (char)); - - for ( a=0; a< S->nseq; a++) - { - conc=strcat ( conc, S->seq[order[a]]); - } - return conc; - - } - - - - -Alignment * rotate_aln ( Alignment *A, char *name) -{ - Alignment *B; - int a, b; - - B=declare_aln2 (A->len_aln, A->nseq+1); - for ( a=0; a< A->nseq; a++) - for ( b=0; b< A->len_aln; b++) - { - B->seq_al[b][a]=A->seq_al[a][b]; - } - for (a=0; a< A->len_aln; a++) - if (name && name[0])sprintf ( B->name[a], "%s_%s%d", name, (a<9)?"0":"",a+1); - else - sprintf ( B->name[a], "%d", a+1); - - - for (a=0; a< A->len_aln; a++)B->seq_al[a][A->nseq]='\0'; - B->len_aln=A->nseq; - B->nseq=A->len_aln; - /*free_aln (A);*/ - return B; -} - -Alignment * invert_aln ( Alignment *A) -{ - char *buf; - int l, a, b, c; - - for ( a=0; a< A->nseq; a++) - { - l=strlen ( A->seq_al[a]); - buf=vcalloc ( l+1,sizeof (char) ); - - for ( c=l-1,b=0; b< l; b++, c--) - { - buf[c]=A->seq_al[a][b]; - } - buf[l]='\0'; - sprintf ( A->seq_al[a], "%s", buf); - } - vfree(buf); - return A; -} -char * complement_string (char *s) -{ - char *buf; - int l, a, b, c; - - l=strlen (s); - for ( b=0; b< l; b++) - { - char r; - r=s[b]; - if ( r=='a')r='t'; - else if (r=='A')r='T'; - else if (r=='t')r='a'; - else if (r=='T')r='A'; - else if (r=='g')r='c'; - else if (r=='G')r='C'; - else if (r=='c')r='g'; - else if (r=='C')r='G'; - s[b]=r; - } - - return invert_string (s); -} -Alignment * complement_aln ( Alignment *A) -{ - char *buf; - int l, a, b, c; - - for ( a=0; a< A->nseq; a++) - { - A->seq_al[a]=complement_string (A->seq_al[a]); - } - - return A; -} - -Alignment * extract_nol_local_aln(Alignment *A, int start, int max_end) - { - A=extract_aln ( A, start, max_end); - A=trunkate_local_aln (A); - return A; - } - -Alignment * alnpos_list2block (Alignment *A, int n, char **in_list) -{ - int *pos; - int a; - char **list; - int list_declared=0; - Alignment *B; - - if (check_file_exists (in_list[0])) - { - int mn; - char ***tmp_list; - - mn=count_n_line_in_file (in_list[0]); - list=declare_char (mn, 100); - list_declared=1; - tmp_list=file2list (in_list[0], " "); - a=0; - n=0; - while (tmp_list[a]) - { - if (tmp_list[a][1][0]!='!') - { - sprintf (list[n++], "%s", tmp_list[a][1]); - } - a++; - } - free_arrayN ((void **)tmp_list, 3); - } - else - { - list=in_list; - } - - - pos=vcalloc (A->len_aln, sizeof (int)); - for (a=0; a=end || end>A->len_aln+1) - { - add_warning ( stderr, "\nWARNING: Illegal coordinates in extract_pos_list [%s]", list[a]); - return A; - } - start--; end--; - for (a=start; aA->len_aln) - { - add_warning ( stderr, "\nWARNING: Illegal coordinates in extract_pos_list [%s]", list[a]); - } - p--; - pos[p]=1; - } - } - B=alnpos2block(A, pos, NULL); - vfree (pos); - if ( list_declared)free_char (list, -1); - - return B; -} -Alignment * aln2block (Alignment *A, int start, int end, Alignment *B) -{ - if ( !A || start<=0 || start>=end || end>A->len_aln+1) - { - add_warning ( stderr, "\nWARNING: Illegal coordinates in extract_block start=%d end=%d len=%d [Note : [start-end[, with [1...n]", start, end, A->len_aln); - return A; - } - else - { - int *pos, p; - start--; - end--; - pos=vcalloc (A->len_aln, sizeof (int)); - for (p=start;plen_aln=0; - for (a=0; a<=A->len_aln; a++) - { - if ( pos[a]!=0 || a==A->len_aln) - { - for ( b=0; bnseq; b++) - B->seq_al[b][B->len_aln]=A->seq_al[b][a]; - if ( a!=A->len_aln)B->len_aln++; - } - } - - return B; -} -Alignment * extract_aln ( Alignment *A, int start, int end) -{ - return extract_aln2 ( A, start, end, "cons"); -} - -Alignment * extract_aln2 ( Alignment *A, int in_start, int in_end, char *seq) - { - char *tmp; - FILE *fp; - - - tmp=vtmpnam (NULL); - fp=vfopen (tmp, "w"); - fprintf ( fp, "%s %d %d\n", seq, in_start, in_end); - vfclose (fp); - return extract_aln3 (A,tmp); - } -Alignment * extract_aln3 ( Alignment *B, char *file) - { - int a, b, c; - int start, end; - int n, i, s, nline=0; - FILE *fp; - Alignment *A=NULL; - int *col; - char name[MAXNAMES]; - char line[VERY_LONG_STRING]; - int *offset; - - /*Reads in a file - #comment - ! seq_name offset - seqname pos - OR - seqname start end[ - modifies the incoming alignment - */ - - offset=vcalloc ( B->nseq+1, sizeof (int)); - fp=vfopen (file,"r"); - while ( (c=fgetc(fp))!=EOF) - { - s=-1; - fgets ( line, VERY_LONG_STRING,fp); - if ( c=='!') - { - sscanf (line, "%s %d", name, &start); - s=name_is_in_list (name,B->name,B->nseq,MAXNAMES); - } - if (s!=-1) - offset[s]=start; - } - - vfclose (fp); - - A=copy_aln (B, A); - col=vcalloc ( A->len_aln, sizeof (int)); - - fp=vfopen ( file, "r"); - while ( (c=fgetc(fp))!=EOF) - { - nline++; - if ( c=='#' || c=='!')fgets ( line, VERY_LONG_STRING,fp); - else - { - ungetc(c, fp); - fgets ( line, VERY_LONG_STRING,fp); - - if (sscanf (line, "%s %d %d", name, &start, &end)==3); - else if (sscanf (line, "%s %d", name, &start)==2) - { - end=start+1; - } - else - { - add_warning ( stderr, "\nWARNING: wrong format in coordinate file (line=%d)\n", nline); - continue; - } - if ( end==0)end=A->len_aln+1; - - s=name_is_in_list (name,A->name,A->nseq,MAXNAMES); - - - if ( s==-1 && !strm (name, "cons")) - { - add_warning ( stderr, "\nWARNING: Seq %s does not belong to the alignment (line %d)\n", name,nline); - continue; - } - else if ( start>end) - { - add_warning ( stderr, "\nWARNING: Illegal coordinates [%s %d %d] (line %d)\n", name,start, end,nline); - continue; - } - else - { - int done=0; - if ( s!=-1) - { - start-=offset[s]-1; - end-=offset[s]-1; - } - for (n=0, a=0; done!=1 && a< A->len_aln; a++) - { - i=(strm (name, "cons"))?1:!is_gap(A->seq_al[s][a]); - - n+=i; - if (n>=start && n=end)done=1; - //if (n>=start && n=end)a=A->len_aln; - } - if ( done==0) - { - HERE ("Warning Missing positions in File %s",file ); - } - } - } - } - vfclose ( fp); - - - - /*Extract [start-end[*/ - for ( b=0,a=0; a< A->len_aln; a++) - { - if ( col[a]) - { - for (c=0; c< A->nseq; c++)A->seq_al[c][b]=A->seq_al[c][a]; - b++; - } - } - A->len_aln=b; - - for (c=0; c< A->nseq; c++)A->seq_al[c][A->len_aln]='\0'; - vfree (col); - - return A; - - } -Alignment * trunkate_local_aln ( Alignment *A) - { - int a, b; - int **pos; - int **cache; - int seq; - - - cache=declare_int (return_max_int (A->order,read_size_int ( A->order,sizeof (int*)),0)+1,return_max_int (A->order,read_size_int ( A->order,sizeof (int*)),1)+A->len_aln+1); - pos=aln2pos_simple(A,A->nseq); - - for ( b=0; blen_aln; b++) - for ( a=0; a< A->nseq; a++) - { - seq=A->order[a][0]; - if ( pos[a][b]<=0); - else if ( pos[a][b]>0) - { - - if (cache[seq][pos[a][b]]==0)cache[seq][pos[a][b]]++; - else if ( cache[seq][pos[a][b]]>=1) - { - cache[seq][pos[a][b]]++; - A->seq_al[a][b]='\0'; - } - } - } - - A->len_aln=get_shortest_string ( A->seq_al, A->nseq, NULL, NULL); - pad_string_array ( A->seq_al, A->nseq, A->len_aln, '-'); - - free_int (pos, -1); - free_int ( cache,-1); - - - return A; - } - -int get_nol_aln_border ( Alignment *A, int start, int direction) - { - int a, b; - int **pos; - int **cache; - int seq,end; - - /*This Function Returns the limit position for a non overlaping alignment*/ - - cache=declare_int (return_max_int (A->order,read_size_int ( A->order,sizeof (int*)),0)+1,return_max_int (A->order,read_size_int ( A->order,sizeof (int)),1)+A->len_aln+1); - pos=aln2pos_simple(A,A->nseq); - end=(direction==GO_RIGHT)?A->len_aln:-1; - - - for ( b=start; b!=end;b+=direction) - for ( a=0; a< A->nseq; a++) - { - seq=A->order[a][0]; - if ( pos[a][b]<=0); - else if ( pos[a][b]>0) - { - - if (cache[seq][pos[a][b]]==0)cache[seq][pos[a][b]]++; - else if ( cache[seq][pos[a][b]]>=1) - { - cache[seq][pos[a][b]]++; - free_int(cache, -1); - return b-direction; - } - } - } - - free_int ( cache,-1); - free_int (pos, -1); - return end-direction; - } - - - - - -char * extract_defined_seq ( char *in, int in_of, int in_start, int *aa_def, int dir, int *out_start, char *out) - { - int start=0, end,l; - int b, c, d; - - - - if ( dir==GO_LEFT){start=in_start-1;} - else if ( dir==GO_RIGHT){start=in_start+1;} - - end=start; - while (aa_def[end]!=UNDEFINED) - { - end+=dir; - } - end-=dir; - - if (end=start && c<=end) - { - if ( out_start[0]==-1)out_start[0]=c-!is_gap(in[b]); - out[d++]=in[b]; - } - } - out[d]='\0'; - - - return out; - } -Alignment * concatenate_aln ( Alignment *A1, Alignment *A2, char *spacer) -{ - Alignment *A; - int a, i; - - A=declare_aln2( A1->nseq+A2->nseq , A1->len_aln+A2->len_aln+1); - for ( a=0; a< A1->nseq; a++) - { - if ((i=name_is_in_list ( A1->name[a], A2->name, A2->nseq, 100))!=-1) - { - sprintf ( A->name[A->nseq], "%s", A1->name[a]); - sprintf (A->seq_al[A->nseq], "%s%s%s", A1->seq_al[a],(spacer)?spacer:"", A2->seq_al[i]); - A->nseq++; - } - else - { - char *buf; - buf=generate_string (A2->len_aln, '-'); - sprintf ( A->name[A->nseq], "%s", A1->name[a]); - sprintf (A->seq_al[A->nseq], "%s%s", A1->seq_al[a], buf); - A->nseq++; - vfree (buf); - } - } - for ( a=0; a< A2->nseq; a++) - { - if ((i=name_is_in_list ( A2->name[a], A1->name, A1->nseq, 100))==-1) - { - char *buf; - buf=generate_string (A1->len_aln, '-'); - sprintf ( A->name[A->nseq], "%s", A2->name[a]); - sprintf (A->seq_al[A->nseq], "%s%s", buf, A2->seq_al[a]); - A->nseq++; - vfree (buf); - } - } - A->len_aln=A1->len_aln+A2->len_aln; - return A; -} -Alignment * aln_cat ( Alignment *A, Alignment *B) - { - int a; - - if ( A->nseq!=B->nseq) - { - fprintf ( stderr, "\nERROR IN ALN CAT: DIFFERENT NSEQ\n"); - myexit(EXIT_FAILURE); - } - - A=realloc_alignment2(A, A->nseq,A->len_aln+B->len_aln+1); - - for ( a=0;a< A->nseq; a++) - { - strcat ( A->seq_al[a], B->seq_al[a]); - } - A->len_aln+=B->len_aln; - return A; - } -int verify_aln ( Alignment *A, Sequence *S, char *message) - { - int a, b, c,s,r; - - - for ( a=0;a< A->nseq; a++) - { - s=A->order[a][0]; - r=A->order[a][1]; - for ( b=0, c=0; b< A->len_aln; b++) - { - if ( !is_gap(A->seq_al[a][b])) - { - if (tolower(A->seq_al[a][b])!=tolower(S->seq[s][c+r])) - { - fprintf ( stderr, "\n%s\nResidue [%c %d, %c %d] line %d seq %d",message,A->seq_al[a][b], b,S->seq[s][c+r], c+r,a,s); - output_Alignment_with_res_number(A, stderr); - myexit(EXIT_FAILURE); - return 0; - } - c++; - } - } - } - return 1; - } - -Alignment *adjust_est_aln ( Alignment *PW, Alignment *M, int s) -{ - /*This function reajusts M, threading M onto PW - two seqences in PW - s+1 seq in M - - seq 0 PW ----> 0->s-1 in M - seq 1 PW ----> 1->s in M; - - */ - int a, b; - static char **array; - - - int top_M=0; - int bottom_M=0; - - - if ( array==NULL) - { - array=declare_char (500, 100000); - } - - for ( a=0; a< PW->len_aln; a++) - { - if ( is_gap(PW->seq_al[0][a])) - { - for ( b=0; b< s; b++) - array[b][a]='-'; - } - else - { - for ( b=0; b< s; b++) - array[b][a]=M->seq_al[b][top_M]; - top_M++; - } - - if ( is_gap(PW->seq_al[1][a])) - { - array[s][a]='-'; - } - else - { - - array[s][a]=M->seq_al[s][bottom_M]; - bottom_M++; - } - } - - M->len_aln=PW->len_aln; - for (a=0; alen_aln; b++) - M->seq_al[a][b]=array[a][b]; - M->seq_al[a][b]='\0'; - } - - - M->nseq=s+1; - - return M; -} - - -Alignment * rename_seq_in_aln (Alignment *A, char ***list) -{ - int n, i; - if ( !A)return A; - - - - n=0; - while ( list[n][0][0]) - { - if ( (i=name_is_in_list (list[n][0], A->name, A->nseq, 100))!=-1) - { - sprintf ( A->name[i], "%s", list[n][1]); - } - n++; - } - - A->S=rename_seq_in_seq (A->S, list); - return A; -} -Sequence * rename_seq_in_seq (Sequence *A, char ***list) -{ - int n, i; - if ( !A || !list)return A; - - n=0; - while ( list[n][0][0]) - { - if ( (i=name_is_in_list (list[n][0], A->name, A->nseq, 100))!=-1) - { - sprintf ( A->name[i], "%s", list[n][1]); - } - n++; - } - return A; -} -/********************************************************************/ -/* */ -/* FLOAT SIMILARITIES */ -/* */ -/* */ -/* */ -/********************************************************************/ -float get_seq_fsim ( char *string1, char *string2, char *ignore, char *similarity_set,int **matrix, int MODE ) - { - int len, a, r1, r2, nr1=0, nr2=0; - float pos=0, sim=0; - - - len=MIN((strlen (string1)),(strlen (string2))); - if ( len==0)return 0; - - for ( a=0; a< len; a++) - { - - r1=string1[a]; - r2=string2[a]; - nr1+=!is_gap(r1); - nr2+=!is_gap(r2); - - if ( !is_in_set (r1, ignore) && !is_in_set (r2, ignore)) - { - pos++; - if ( matrix)sim+=matrix[r1-'A'][r2-'A']; - else if (is_in_same_group_aa(r1,r2,0, NULL,similarity_set)) - { - sim++; - } - } - } - if ( MODE==UNGAPED_POSITIONS)return ( sim*100)/pos; - else if ( MODE==ALIGNED_POSITIONS)return (sim*100)/len; - else if ( MODE==AVERAGE_POSITIONS)return (sim*200)/(nr1+nr2); - else - { - return 0; - } - - } -float get_seq_fsim2 ( char *string1, char *string2, char *ignore, char *in_mode) - { - int len1; - int a; - int p1, p2; - int r1=0,r2=0; - char *p; - char mode[1000]; - float r=0, pos1, pos2, pos0, gap, sim; - - - sprintf ( mode, "%s", in_mode); - - /*mode: __ - mat: idscore to get the alignment done - any legal cw matrix - sim_mode: sim1->identities/matches - sim2->identities/min len - */ - - - if ( (p=strstr (mode, "_"))!=NULL) - { - p[0]='\0'; - p++; - } - - - if (strstr (mode, "idscore")) - { - static int **mat; - if (!mat) mat=read_matrice ("blosum62mt"); - return idscore_pairseq (string1, string2, -12, -1, mat,mode); - - } - - len1=strlen (string1); - for ( sim=pos1=pos2=pos0=gap=0,a=0; a< len1; a++) - { - r1=string1[a]; - r2=string2[a]; - p1=1-is_in_set (r1, ignore); - p2=1-is_in_set (r2, ignore); - pos1+=p1; pos2+=p2; - if (p1 && p2) - { - pos0++; - if (is_in_same_group_aa(r1,r2,0, NULL, mode)) - { - sim++; - } - } - else if (p1+p2==1) - { - gap++; - } - } - - if ( p==NULL || strm (p, "sim1") || strm (p, "sim")) - { - r=(pos0==0)?0:(sim*MAXID)/pos0; - } - else if ( strm (p, "sim2")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MIN(pos1,pos2); - } - else if ( strm (p, "sim3")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MAX(pos1,pos2); - } - else if ( strm (p, "gap1")) - { - r=(len1==0)?MAXID:(gap*MAXID)/len1; - r=MAXID-r; - } - else if ( strm (p, "logid")) - { - r=logid_score (pos0, sim); - } - - return r; - - } - -/********************************************************************/ -/* */ -/* ALIGNMENT ANALYSES */ -/* */ -/* */ -/* */ -/********************************************************************/ -int **dist_array2sim_array ( int **p, int max) -{ - int s1, s2, a, b; - s1=read_array_size ((void *)p, sizeof (void *)); - s2=read_array_size ((void*)p[0],sizeof (int)); - /* s2=read_array_size ((void*)p[0],sizeof (void *)); OLD before 64 BITS*/ - for ( a=0; a< s1; a++) - for ( b=0; b< s2; b++) - { - p[a][b]=max-p[a][b]; - } - return p; -} - -int **sim_array2dist_array ( int **p, int max) -{ - int s1, s2, a, b; - s1=read_array_size ((void *)p, sizeof (void *)); - s2=read_array_size ((void*)p[0],sizeof (int)); - - /*s2=read_array_size ((void*)p[0],sizeof (void *)); OLD before 64 Bits stuff*/ - for ( a=0; a< s1; a++) - for ( b=0; b< s2; b++) - { - p[a][b]=max-(int)p[a][b]; - } - return p; -} - -int **normalize_array (int **p, int max, int norm) -{ -int s1, s2, a, b; - s1=read_array_size ((void *)p, sizeof (void *)); - s2=read_array_size ((void*)p[0],sizeof (int)); - - /*s2=read_array_size ((void*)p[0],sizeof (void *)); OLD before 64 Bits stuff*/ - for ( a=0; a< s1; a++) - for ( b=0; b< s2; b++) - { - p[a][b]=(p[a][b]*norm)/max; - } - return p; -} - -int aln2most_similar_sequence ( Alignment *A, char *mode) -{ - int **w; - int a, b; - int avg, best_avg=0, best_seq=0; - char *buf; - int coverage; - - - if ( !A) return -1; - else if ( A->nseq==1)return 0; - else - { - buf=vcalloc ( A->len_aln+1, sizeof (char)); - w=get_sim_aln_array ( A, mode); - - for ( a=0; a< A->nseq; a++) - { - sprintf ( buf, "%s", A->seq_al[a]); - ungap(buf); - coverage=(strlen(buf)*MAXID)/A->len_aln; - - for ( avg=0,b=0; b< A->nseq; b++)avg+=w[a][b]*coverage; - if ( avg>best_avg){best_avg=avg; best_seq=a;} - } - free_int (w, -1); - vfree (buf); - return best_seq; - } - -} - - - -int aln2coverage ( Alignment *A, int ref_seq) -{ - int a,b; - int cov_pos=0, npos=0; - - for ( a=0; a< A->len_aln; a++) - { - if ( !is_gap ( A->seq_al[ref_seq][a])) - { - npos++; - for ( b=0; b< A->nseq; b++) - { - if ( b!=ref_seq && !is_gap ( A->seq_al[b][a])){cov_pos++;break;} - } - } - } - return (int) (npos==0)?0:(( MAXID*cov_pos)/A->len_aln); -} - - -int sub_aln2sim ( Alignment *A, int *ns, int **ls, char *mode) -{ - int a, b, n; - float avg; - - n=0; avg=0; - if (!A || (ns==NULL && A->nseq<2))return -1; - else if (ns==NULL) - { - for (a=0; a< A->nseq-1; a++) - for ( b=a+1; b< A->nseq;b++, n++) - avg+=generic_get_seq_sim (A->seq_al[a], A->seq_al[b], NULL, mode); - } - else - { - for (a=0; aseq_al[ls[0][a]], A->seq_al[ls[1][b]], NULL, mode); - } - } - return (int)(n==0)?0:((float)avg/(float)n); -} -int sub_aln2max_sim ( Alignment *A, int *ns, int **ls, char *mode) -{ - int a, b, n; - float avg; - - n=0; avg=0; - if (!A || (ns==NULL && A->nseq<2))return -1; - else if (ns==NULL) - { - for (a=0; a< A->nseq-1; a++) - for ( b=a+1; b< A->nseq;b++, n++) - avg=MAX(avg,generic_get_seq_sim (A->seq_al[a], A->seq_al[b], NULL, mode)); - } - else - { - for (a=0; aseq_al[ls[0][a]], A->seq_al[ls[1][b]], NULL, mode)); - } - } - return avg; -} - - -double aln2entropy (Alignment *A, int *in_ls, int in_ns, float gap_threshold) -{ - int ns, a, s, col, r,ncol; - int *ls; - double *count; - double entropy=0; - float ng; - - ls=vcalloc ( A->nseq, sizeof (int)); - count=vcalloc ( 26, sizeof (double)); - - - if ( in_ls) - { - ns=in_ns; - for ( a=0; a< ns; a++)ls[a]=in_ls[a]; - } - else - { - ns=A->nseq; - for ( a=0; a< ns; a++)ls[a]=a; - } - - if ( ns==0) - { - vfree(ls);vfree(count);return 0; - } - for (ncol=0,col=0; collen_aln; col++) - { - for (ng=0,a=0; a< ns; a++) - { - s=ls[a]; - ng+=is_gap(A->seq_al[s][col]); - } - ng/=ns; - if ( ng>gap_threshold)continue; - - ncol++; - - for ( a=0; aseq_al[s][col]); - if (!is_gap(r))count[r-'a']++; - } - for (a=0; a<26; a++) - { - if ( count[a]==0); - else - { - count[a]/=(double)ns; - - entropy+=count[a]*log(count[a]); - count[a]=0; - } - } - } - entropy/=-ncol; - vfree (ls); vfree(count); - - return entropy; -} -int aln2sim ( Alignment *A, char *mode) -{ - return sub_aln2sim ( A, NULL, NULL, mode); - /* - if ( !A || A->nseq<2) return -1; - w=get_sim_aln_array ( A, mode); - - for (c=0, a=0; a< A->nseq-1; a++) - for ( b=a+1; b< A->nseq; b++, c++) - { - avg+=(float)w[a][b]; - } - free_int (w, -1); - return (int)((float)avg/(float)c); - */ -} - -int aln_is_aligned ( Alignment *A) -{ - int a, b; - - if ( !A)return 0; - for (a=0; a< A->nseq; a++) - for ( b=A->len_aln-1; b>0; b--) - { - if (!is_gap(A->seq_al[a][b]) && is_gap(A->seq_al[a][b-1]))return 1; - } - return 0; -} - - -int seq2aln2sim_old ( char *seq1, char *seq2, char *mode_aln, char *mode_id) -{ - Alignment *A; - int sim; - - A=align_two_sequences (seq1, seq2, "pam250mt", -10, -1, mode_aln); - sim=aln2sim (A, mode_id); - free_aln (A); - return sim; -} -int seq2aln2sim ( char *seq1, char *seq2, char *mode_aln, char *mode_id) -{ - Alignment *A; - int sim; - static int gop; - - if (!gop) - { - int **m; - m=read_matrice ("blosum62mt"); - gop=get_avg_matrix_mm(m, AA_ALPHABET)*10; - free_int (m, -1); - } - - A=align_two_sequences (seq1, seq2, "blosum62mt",gop,-1, mode_aln); - sim=aln2sim (A, mode_id); - free_aln (A); - return sim; -} -int* get_cdna_seq_winsim ( int *cache, char *string1, char *string2, char *ignore, char *mode,int *w ) - { - int len1, len2; - int a, x; - - - len1=strlen (string1); - len2=strlen (string2); - - if ( len1!=len2) - { - fatal_exit( stderr,EXIT_FAILURE, "\nTHE TWO cDNAs DO NOT HAVE THE SAME LENGTH [FATAL:get_cdna_seq_sim:%s", PROGRAM); - } - - x=get_cdna_seq_sim(cache, string1, string2, ignore, ""); - for ( a=0; a< len1; a++) - w[a]=x; - - add_warning (stderr, "\nWARNING: winsim not implemented for cDNA"); - return w; - } - -int get_cdna_seq_sim ( int *cache, char *string1, char *string2, char *ignore, char *mode) - { - int len1; - int len2; - int a; - int pos=0; - int sim=0; - char r1=0, r2=0; - - len1=strlen (string1); - len2=strlen (string2); - - - - if ( len1!=len2) - { - fprintf ( stderr, "\nTHE TWO cDNAs DO NOT HAVE THE SAME LENGTH [FATAL:get_cdna_seq_sim:%s", PROGRAM); - crash(""); - } - - for ( a=0; a< len1;) - { - - if ( cache[a]==0){a++;continue;} - else if ( cache[a]==1) - { - - r1=translate_dna_codon (string1+a, 'x'); - r2=translate_dna_codon (string2+a, 'x'); - a+=3; - } - - if ( !is_in_set (r1, ignore) && !is_in_set (r2, ignore)) - { - pos++; - if (is_in_same_group_aa(r1,r2,0, NULL,mode+4)) - { - sim++; - } - } - } - - - - if (pos==0) - return 0; - else - return (int) (sim*MAXID)/pos; - - } - -int* get_seq_winsim ( char *string1, char *string2, char *ignore, char *mode, int*w) - { - int len1, len2, len; - int left, right; - int a,b; - int sim=0; - int window; - int r1, r2; - - len1=strlen (string1); - len2=strlen (string2); - window=atoi(mode); - len=2*window+1; - - if ( len1!=len2)return 0; - if (window==0 || (window*2+1)>=len1) - { - sim=get_seq_sim (string1, string2, ignore, ""); - for (a=0; a__ - mat: idscore to get the alignment done - any legal cw matrix - sim_mode: sim1->identities/matches - sim2->identities/min len - */ - - - if ( (p=strstr (mode, "_"))!=NULL) - { - p[0]='\0'; - p++; - } - - - if (strstr (mode, "idscore")) - { - static int **mat; - if (!mat) mat=read_matrice ("blosum62mt"); - return idscore_pairseq (string1, string2, -12, -1, mat,mode); - - } - len1=strlen (string1); - for ( sim=pos1=pos2=pos0=0,a=0; a< len1; a++) - { - r1=string1[a]; - r2=string2[a]; - p1=1-is_in_set (r1, ignore); - p2=1-is_in_set (r2, ignore); - - pos1+=p1; pos2+=p2; - if (p1 && p2) - { - pos0++; - if (is_in_same_group_aa(r1,r2,0, NULL, mode)) - { - sim++; - } - } - else if (p1+p2==1) - { - gap++; - } - } - - if ( strstr (mode, "cov")) - { - r=(pos0+gap==0)?0:(pos0*MAXID)/(pos0+gap); - } - else if ( p==NULL || strm (p, "sim1") || strm (p, "sim")) - { - r=(pos0==0)?0:(sim*MAXID)/pos0; - } - else if ( strm (p, "sim2")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MIN(pos1,pos2); - } - else if ( strm (p, "sim3")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MAX(pos1,pos2); - } - else if ( strm (p, "gap1")) - { - r=(len1==0)?MAXID:(gap*MAXID)/len1; - r=MAXID-r; - } - else if ( strm (p, "logid")) - { - r=logid_score (pos0, sim); - } - else if ( strstr (mode, "sim")) - { - r=(pos0==0)?0:(sim*MAXID)/pos0; - } - - - return r; - - } -int get_seq_sim_2 ( char *string1, char *string2, char *ignore, char **gr, int ng) - { - int len1; - int len2; - int a; - int pos=0; - int sim=0; - char r1, r2; - - - len1=strlen (string1); - len2=strlen (string2); - - if ( len1!=len2)return 0; - - for ( a=0; a< len1; a++) - { - r1=string1[a]; - r2=string2[a]; - if ( !is_in_set (r1, ignore) && !is_in_set (r2, ignore)) - { - pos++; - if (is_in_same_group_aa(r1,r2,ng, gr, NULL)) - { - sim++; - } - } - } - - if (pos==0) - return 0; - else - return (int) (sim*MAXID)/pos; - - } - -int get_seq_sim_3 ( char *string1, char *string2, char *ignore, int **mat) - { - int len1; - int len2; - int a; - - int sim=0; - char r1, r2; - - - len1=strlen (string1); - len2=strlen (string2); - - if ( len1!=len2)return 0; - - for ( a=0; a< len1; a++) - { - r1=string1[a]; - r2=string2[a]; - if ( !is_in_set (r1, ignore) && !is_in_set (r2, ignore)) - { - sim+=mat[r1-'A'][r2-'A']; - } - } - return sim; - - } -int * get_aln_col_weight ( Alignment *A, char *mode) - { - int a, b; - char *col; - int *weight; - - col=vcalloc ( A->nseq, sizeof (int)); - weight=vcalloc (A->len_aln, sizeof (int)); - - for (a=0; a< A->len_aln; a++) - { - for ( b=0; b< A->nseq; b++) - col[b]=A->seq_al[b][a]; - weight[a]=(find_group_aa_distribution (col, A->nseq,0,NULL,NULL, mode )*MAXID)/A->nseq; - } - vfree (col); - return weight; - - } - -int analyse_aln_column ( Alignment *B, int col) - { - - char r=' '; - int a, b, c=0; - static char *mat; - static int ng_cw_star; - static char **cw_star; - int *cw_star_count; - - static int ng_cw_col; - static char **cw_col; - int *cw_col_count; - - static int ng_cw_dot; - static char **cw_dot; - int *cw_dot_count; - - - - - - - if ( !B->S || !(B->S)->type)B= get_aln_type (B); - - if ( !mat)mat=vcalloc ( STRING, sizeof (char)); - - if ( !ng_cw_star) - { - cw_star=make_group_aa ( &ng_cw_star, strcpy ( mat,"idmat")); - cw_col=make_group_aa ( &ng_cw_col, strcpy (mat,"clustalw_col")); - cw_dot=make_group_aa ( &ng_cw_dot, strcpy (mat, "clustalw_dot")); - } - - cw_star_count=vcalloc (ng_cw_star, sizeof (int)); - cw_col_count=vcalloc ( ng_cw_col, sizeof (int)); - cw_dot_count=vcalloc (ng_cw_dot, sizeof (int)); - - for ( a=0; a< B->nseq; a++) - { - c=tolower (B->seq_al[a][col]); - if (is_gap(c)){r=' ';break;} - - for ( b=0; b< ng_cw_star; b++) - cw_star_count[b]+=is_in_set (c, cw_star[b]); - for ( b=0; b< ng_cw_col; b++) - cw_col_count[b]+=is_in_set (c, cw_col[b]); - for ( b=0; b< ng_cw_dot; b++) - cw_dot_count[b]+=is_in_set (c, cw_dot[b]); - } - - - - - - if ( !is_gap(c) && r==' ') - for ( b=0; b< ng_cw_star; b++)if ( cw_star_count[b]==B->nseq){r='*'; break;} - if ( !is_gap(c) && r==' ' && !(strm((B->S)->type, "DNA")||strm ((B->S)->type,"RNA"))) - for ( b=0; b< ng_cw_col ; b++)if ( cw_col_count [b]==B->nseq){r=':'; break;} - if ( !is_gap(c) && r==' ' && !(strm((B->S)->type, "DNA")||strm ((B->S)->type,"RNA"))) - for ( b=0; b< ng_cw_dot ; b++)if ( cw_dot_count [b]==B->nseq){r='.'; break;} - - - - vfree(cw_star_count); - vfree(cw_col_count); - vfree(cw_dot_count); - - return r; - } - - -int ** get_cov_aln_array ( Alignment *A, char *mode) -{ - int **w; - int a, b, c, t; - - w=declare_int ( A->nseq, A->nseq); - - - for ( a=0; a< A->nseq-1; a++) - { - w[a][a]=100; - for ( t=0,b=a+1; b< A->nseq; b++) - { - for ( c=0; c< A->len_aln; c++) - { - t+=(!is_gap(A->seq_al[a][c]) &&!is_gap(A->seq_al[b][c])); - } - w[a][b]=w[b][a]=(t*100)/A->len_aln; - } - } - return w; -} - -int ** get_cov_master_aln_array ( Alignment *A,int n, char *mode) -{ - int **w; - int b, c, t; - - w=declare_int ( A->nseq, A->nseq); - - - for (b=0; b< A->nseq; b++) - { - - for (t=0, c=0; c< A->len_aln; c++) - { - t+=(!is_gap(A->seq_al[n][c]) &&!is_gap(A->seq_al[n][c])); - } - w[n][b]=w[b][n]=(t*100)/A->len_aln; - } - - return w; -} -int ** get_sim_master_aln_array ( Alignment *A,int n, char *mode) - { - int **w; - int a; - - w=declare_int ( A->nseq, A->nseq); - - - for ( a=0; a< A->nseq; a++) - { - if ( strm (mode, "cdna")) - w[n][a]=w[a][n]=get_cdna_seq_sim ( A->cdna_cache[0], A->seq_al[a], A->seq_al[n],GAP_LIST, mode); - else - w[n][a]=w[a][n]=get_seq_sim ( A->seq_al[n], A->seq_al[a],GAP_LIST, mode); - } - return w; - } -int ** get_dist_aln_array ( Alignment *A, char *mode) -{ - - int **w; - - w=get_sim_aln_array ( A, mode); - return sim_array2dist_array(w,MAXID); -} -Sequence * seq2filter (Sequence *Sin, int min, int max) -{ - int *keep; - char *tmpfile; - Sequence *S, *Sout; - int a, b, sim; - int **M; - FILE *fp; - int n; - - S=duplicate_sequence (Sin); - for (a=0; anseq; a++)ungap(S->seq[a]); - keep=vcalloc (S->nseq, sizeof (int)); - M=read_matrice ("blossum62mt"); - for (a=0; anseq; a++) - { - output_completion ( stderr, a, S->nseq, 100, "Distance Matrix Computation: "); - for ( b=a+1; bnseq; b++) - { - - sim=idscore_pairseq(S->seq[a], S->seq[b],-10, -2,M, "sim"); - if ( sim>min && simnseq; a++) - if ( keep[a]) - { - fprintf ( fp, ">%s %s\n%s", S->name[a], S->seq_comment[a], S->seq[a]); - n++; - } - vfclose (fp); - if (n==0) return NULL; - Sout=main_read_seq(tmpfile); - free_int (M, -1); vfree (keep); free_sequence (S, -1); - return Sout; -} - -Alignment * grep_seq (Alignment *S,char *field, char *mode, char *string) -{ - int a; - FILE *fp; - char *tmp; - int n=0; - - tmp=vtmpnam (NULL); - fp=vfopen (tmp, "w"); - - if ( !strm(mode, "KEEP") && ! strm (mode, "REMOVE")) - { - add_warning ( stderr, "\nERROR: +grep [FATAL: %s]", PROGRAM); - myexit (EXIT_FAILURE); - } - else if ( !strm(field, "SEQ") && ! strm (field, "COMMENT") && ! strm(field, "NAME")) - { - add_warning ( stderr, "\nERROR: +grep [FATAL: %s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - - for (n=0, a=0; a< S->nseq; a++) - { - int found=0; - - if (strm(field, "NAME") && perl_strstr (S->name[a], string))found=1; - else if (strm(field, "COMMENT") && S->seq_comment[a][0] && perl_strstr (S->seq_comment[a], string) )found=1; - else if (strm(field, "SEQ") && perl_strstr (S->seq_al[a], string))found=1; - - if ( (strm (mode, "KEEP") && found) || (strm (mode, "REMOVE") && !found)) - { - n++; - fprintf (fp, ">%s", S->name[a]); - if (S->seq_comment[a][0])fprintf (fp, " %s", S->seq_comment[a]); - fprintf (fp, "\n%s\n", S->seq_al[a]); - } - } - - vfclose (fp); - - free_aln (S); - if ( n==0) return NULL; - else - return main_read_aln (tmp, NULL); -} - -Alignment * modify_seq (Alignment *S, char *field, char *string1, char *string2) -{ - int a; - FILE *fp; - char *tmp; - - tmp=vtmpnam (NULL); - fp=vfopen (tmp, "w"); - for ( a=0; a< S->nseq; a++) - { - if (strm(field, "NAME"))S->name[a]=substitute ( S->name[a], string1, string2); - else if (strm(field, "COMMENT"))S->seq_comment[a]=substitute ( S->seq_comment[a], string1, string2); - else if (strm(field, "SEQ"))S->seq_al[a]=substitute ( S->seq_al[a], string1, string2); - fprintf (fp, ">%s", S->name[a]); - if (S->aln_comment[a][0])fprintf (fp, " %s", S->aln_comment[a]); - fprintf (fp, "\n%s\n", S->seq_al[a]); - } - vfclose (fp); - free_aln (S); - S=main_read_aln (tmp, NULL); - return S; -} - -int ** seq2sim_mat (Sequence *S, char *mode) -{ - return seq2comp_mat ( S,mode, "sim"); -} -int ** seq2cov_mat (Sequence *S, char *mode) -{ - return seq2comp_mat ( S,mode, "cov"); -} - -int ** seq2comp_mat (Sequence *S, char *mode, char *comp_mode) -{ - int a, b; - int **sim; - char file[1000]; - Alignment *A; - char *name; - - - /*Use pre_computed value if available in the current dir*/ - - name=path2filename(S->file[0]); - sprintf ( file, "%s%s.%s.%s_file", get_cache_dir(),name, mode, comp_mode); - A=seq2aln(S,NULL, RM_GAP); - if ( check_file_exists (file) && is_distance_matrix_file (file) && (sim=input_similarities(file, A, NULL))!=NULL) - { - display_input_filename (stderr, "SIMILARITY_MATRIX", "SIMILARITY_MATRIX_FORMAT_01", file, CHECK); - fprintf ( stderr, "\n"); - } - else - { - char mode2[1000]; - int **M; - - M=read_matrice (mode); - sim=declare_int ( S->nseq, S->nseq); - for ( a=0; a< S->nseq; a++) - { - ungap (S->seq[a]); - sim[a][a]=100; - } - - for ( a=0; anseq-1; a++) - { - - output_completion4halfmat ( stderr, a, S->nseq, 100, "Similarity Matrix Computation: "); - for ( b=a+1; b< S->nseq; b++) - { - sim[a][b]=sim[b][a]=idscore_pairseq(S->seq[a], S->seq[b],-12, -1,M, comp_mode); - } - } - free_int (M,-1); - sprintf ( mode2, "_memory_%ld", (long int)sim); - output_similarities( file, A, mode2); - display_output_filename (stderr, "SIMILARITY_MATRIX", "SIMILARITY_MATRIX_FORMAT_01", file, CHECK); - fprintf ( stderr, "\n"); - } - free_aln (A); - return sim; -} - -int ** fast_aln2sim_list (Alignment *A, char *mode, int *ns, int **ls) -{ - int **simm; - int p1, p2, p3, r1, r2; - int gap,pos0,pos1,pos2,len,sim; - int a, b, c, m, s=0,s1, s2, n; - int free_ns=0; - - if (ns==NULL) - { - free_ns=1; - ns=vcalloc (2, sizeof (int)); - ns[0]=ns[1]=A->nseq; - ls=declare_int (2, A->nseq); - for ( a=0; a< 2; a++) - for (b=0; bnseq; b++) - ls[a][b]=b; - } - - - simm=declare_int (ns[0]*ns[1]+1, 3); - - if (strstr (mode, "sim1"))m=0; - else if (strstr (mode, "sim2"))m=1; - else if (strstr (mode, "sim3"))m=2; - else if (strstr (mode, "gap1"))m=3; - else if (strstr (mode, "cov1"))m=4; - else if (strstr (mode, "logid"))m=5; - else m=0; - - - - for (n=0,a=0; alen_aln; c++) - { - r1=tolower (A->seq_al[s1][c]); - r2=tolower (A->seq_al[s2][c]); - p1=(r1!='-')?1:0; - p2=(r2!='-')?1:0; - p3=p1+p2; - if ( p3==0)continue; - if ( p3==1)gap++; - if ( r1==r2)sim++; - pos1+=p1; - pos2+=p2; - pos0+=(p3==2)?1:0; - len++; - } - - if (m==0)s=(pos0==0)?0:(sim*MAXID)/pos0; //sim1 - else if (m==1) s=(MIN(pos1,pos2)==0)?0:(sim*MAXID)/MIN(pos1,pos2);//sim2 - else if (m==2) s=(MAX(pos1,pos2)==0)?0:(sim*MAXID)/MAX(pos1,pos2);//sim3 - else if (m==3) s=(len==0) ?0:((len-gap)*MAXID)/len;//gap1 - else if (m==4) s=(len==0) ?0:((pos0)*MAXID)/len; //cov - else if (m==5) - { - s=logid_score ( sim, len); - } - simm[n][0]=s1; - simm[n][1]=s2; - simm[n][2]=s; - } - } - - if ( free_ns) {vfree(ns); free_int (ls, -1);} - simm[n][0]=-1; - return simm; -} - -int ** fast_aln2sim_mat (Alignment *A, char *mode) -{ - int **simm; - int p1, p2, p3, r1, r2; - int gap,pos0,pos1,pos2,len,sim; - int a, b, c, m; - - simm=declare_int (A->nseq, A->nseq); - - - - if (strstr (mode, "sim1"))m=0; - else if (strstr (mode, "sim2"))m=1; - else if (strstr (mode, "sim3"))m=2; - else if (strstr (mode, "gap1"))m=3; - else if (strstr (mode, "cov1"))m=4; - else if (strstr (mode, "logid"))m=5; - else m=0; - - - - for ( a=0; a< A->nseq-1; a++) - { - simm[a][a]=MAXID; - for ( b=a+1; b< A->nseq; b++) - { - gap=pos0=pos1=pos2=len=sim=0; - - for ( c=0; c< A->len_aln; c++) - { - r1=tolower (A->seq_al[a][c]); - r2=tolower (A->seq_al[b][c]); - p1=(r1!='-')?1:0; - p2=(r2!='-')?1:0; - p3=p1+p2; - if ( p3==0)continue; - if ( p3==1)gap++; - if ( r1==r2)sim++; - pos1+=p1; - pos2+=p2; - pos0+=(p3==2)?1:0; - len++; - } - - if (m==0)simm[a][b]=simm[b][a]=(pos0==0)?0:(sim*MAXID)/pos0; //sim1 - else if (m==1) simm[a][b]=simm[b][a]=(MIN(pos1,pos2)==0)?0:(sim*MAXID)/MIN(pos1,pos2);//sim2 - else if (m==2) simm[a][b]=simm[b][a]=(MAX(pos1,pos2)==0)?0:(sim*MAXID)/MAX(pos1,pos2);//sim3 - else if (m==3) simm[a][b]=simm[b][a]=(len==0) ?0:((len-gap)*MAXID)/len;//gap1 - else if (m==4) simm[a][b]=simm[b][a]=(len==0) ?0:((pos0)*MAXID)/len; //cov - else if (m==5) - { - - //Inspired from Muscle +mafft 5 - simm[a][b]=simm[b][a]=logid_score ( sim, len); - } - } - } - return simm; -} -int logid_score ( int sim, int len) -{ - float score; - - if ( len==0)return (int)(0.33*(float)MAXID); - - score=(float)sim/(float)len; - if (score>0.9) score=1.0; - else score=-log10 (1.0-score); - - score=(score*MAXID); - return score; -} -int ** aln2sim_mat (Alignment *A, char*mode) -{ - - - if ( strstr (mode, "idmat"))return fast_aln2sim_mat(A, mode); - return get_sim_aln_array(A, mode); -} -int ** aln2cov (Alignment *A) -{ - int a, b, c; - int r1, r2, gr1, gr2, pos0, gap; - int **cov; - cov=declare_int (A->nseq, A->nseq); - - for (a=0; a< A->nseq-1; a++) - { - cov[a][a]=100; - for ( b=a+1; bnseq; b++) - { - for (gap=0,pos0=0,c=0;clen_aln; c++) - { - r1=A->seq_al[a][c]; - r2=A->seq_al[b][c]; - gr1=is_gap(r1); gr2=is_gap(r2); - if ( gr1+gr2==0)pos0++; - else if ( gr1+gr2<2)gap++; - } - cov[a][b]=cov[b][a]=((gap+pos0)==0)?0:((pos0*100)/(gap+pos0)); - } - } - return cov; -} -int ** get_raw_sim_aln_array (Alignment *A, char *mode) -{ - int **w; - int **M; - int a, b, c, r1, r2, set, max, min; - - w=declare_int (A->nseq, A->nseq); - if (strstr(mode, "sar"))M=NULL; - else M=read_matrice (mode); - - HERE ("RAW STUFF"); - - for ( set=0,a=0; a< A->nseq; a++) - for (b=a; bnseq; b++) - { - if (M) - { - for (c=0; clen_aln; c++) - { - r1=A->seq_al[a][c]; - r2=A->seq_al[b][c]; - - if ( !is_gap(r1) && !is_gap(r2)) - w[a][b]+=M[r1-'A'][r2-'A']; - } - } - else if ( strm (mode, "sarmat2")) - { - w[a][b]=get_sar_sim2 (A->seq_al[a], A->seq_al[b]); - } - else - { - HERE ("ERROR: %s is an unknown mode of raw_sim\n", mode); exit (0); - } - - w[b][a]=w[a][b]; - if (!set){min=max=w[a][b];set=1;} - min=MIN(min,w[a][b]); - max=MAX(max,w[a][b]); - } - for (a=0; anseq; a++) - for (b=a; bnseq; b++) - { - w[b][a]=((max-min)==0)?0:((w[b][a]-min)*100)/(max-min); - w[a][b]=w[b][a]; - } - free_int (M, -1); - return w; -} -int ** get_sim_aln_array ( Alignment *A, char *mode) - { - int **w; - int a, b; - - - w=declare_int ( A->nseq, A->nseq); - - for ( a=0; a< A->nseq-1; a++) - { - for ( b=a+1; b< A->nseq; b++) - { - - w[a][b]=w[b][a]=generic_get_seq_sim ( A->seq_al[a], A->seq_al[b], (A->cdna_cache)?A->cdna_cache[0]:NULL, mode); - } - } - return w; - } -int generic_get_seq_sim ( char *seq1, char *seq2, int*cache, char *mode) -{ - - - if ( strm (mode, "cdna")) - return get_cdna_seq_sim ( cache, seq1, seq2,GAP_LIST, mode); - else if ( strnm (mode, "ktup",4)) - return ktup_comparison (seq1, seq2,atoi(mode+4)); - else if ( strstr (mode, "sarmat2")) - { - - return get_sar_sim2 (seq1, seq2); - } - else if ( strstr (mode, "sarmat")) - return (int) get_sar_sim (seq1,seq2); - else - { - return get_seq_sim ( seq1,seq2,GAP_LIST, mode); - } -} -int *** get_winsim_aln_array ( Alignment *A,char *mode, int ***w) - { - int a, b; - for ( a=0; a< A->nseq; a++) - for ( b=0; b< A->nseq; b++) - { - if ( strm (mode, "cdna")) - w[a][b]=get_cdna_seq_winsim ( A->cdna_cache[0], A->seq_al[a], A->seq_al[b],GAP_LIST, mode, w[a][b]); - else - w[a][b]=get_seq_winsim ( A->seq_al[a], A->seq_al[b],GAP_LIST, mode, w[a][b]); - } - return w; - } - -Alignment * seq2profile (Sequence *S, int i) -{ - Alignment *A; - - if ((A=seq2R_template_profile (S, i))) - { - return A; - } - else - { - char *tmp; - FILE *fp; - tmp=vtmpnam (NULL); - fp=vfopen ( tmp, "w"); - fprintf (fp, ">%s\n%s\n", S->name[i], S->seq[i]); - vfclose (fp); - - (S->T[i])->R=fill_R_template (S->name[i], tmp, S); - - return seq2R_template_profile (S, i); - } -} - -Alignment* aln2sub_aln_file (Alignment *A, int n, char **string) -{ - char ***list; - int a; - - list=vcalloc (A->nseq, sizeof (char***)); - if ( n==0)return A; - else if (n>1) - { - int l; - char *buf; - - for (l=0,a=0; a< n; a++)l+=strlen (string[a]); - buf=vcalloc ( 2*n+l+1, sizeof (char)); - for (a=0; a< n; a++){buf=strcat (buf,string[a]), buf=strcat ( buf, " ");} - list[0]=string2list (buf); - vfree (buf); - } - else if ( file_exists (NULL,string[0])) - { - list=read_group (string[0]); - - } - else - { - fprintf (stderr, "\nERROR: file <%s> does not exist [FATAL:%s]\n",string[0], PROGRAM); - myexit (EXIT_FAILURE); - } - - - a=0; - while (list[a]) - { - int i, b; - FILE *fp; - n=atoi (list[a][0]); - fp=vfopen (list[a][1], "w"); - for (b=2; bname, A->nseq, MAXNAMES); - if (n==3)ungap (A->seq_al[i]); - fprintf (fp, ">%s\n%s\n", A->name[i], A->seq_al[i]); - } - vfclose (fp); - free_char (list[a], -1); - a++; - } - vfree(list); - return A; -} -Sequence *remove_empty_sequence (Sequence *S) -{ - int a, b; - char *c; - Sequence *NS; - - c=vcalloc ( S->max_len+1, sizeof (char)); - - for (a=0, b=0; a< S->nseq; a++) - { - sprintf ( c, "%s",S->seq[a]); - ungap (c); - if ( strlen (c)==0) - { - //vfree (S->seq[a]); - S->seq[a]=NULL; - add_warning ( stderr, "WARNING: Sequence %s does not contain any residue: automatically removed from the set [WARNING:%s]",S->name[a], PROGRAM); - } - } - NS=duplicate_sequence (S); - free_sequence (S, S->nseq); - vfree (c); - return NS; -} -Alignment* aln2sub_seq (Alignment *A, int n, char **string) -{ - char ***list; - int a; - Sequence *S=NULL; - - list=vcalloc (A->nseq, sizeof (char***)); - if ( n==0)return A; - else if (n>1) - { - int l; - char *buf; - - for (l=0,a=0; a< n; a++)l+=strlen (string[a]); - buf=vcalloc ( 2*n+l+1, sizeof (char)); - for (a=0; a< n; a++){buf=strcat (buf,string[a]), buf=strcat ( buf, " ");} - list[0]=string2list (buf); - vfree (buf); - } - else if ( file_exists (NULL,string[0])) - { - list=read_group (string[0]); - - } - else - { - fprintf (stderr, "\nERROR: file <%s> does not exist [FATAL:%s]\n",string[0], PROGRAM); - myexit (EXIT_FAILURE); - } - - - - a=0; - while (list[a]) - { - int t; - Alignment *B; - Sequence *subS; - - - B=main_read_aln (list[a][1], NULL); - t=aln2most_similar_sequence(B, "idmat"); - subS=extract_one_seq(B->name[t],0,0,B,KEEP_NAME); - S=add_sequence (subS,S,0); - free_aln (B);free_sequence (subS, -1); - vremove (list[a][1]); - a++; - } - vfree(list); - return seq2aln (S, NULL, RM_GAP); -} - -Alignment * aln2collapsed_aln (Alignment * A, int n, char **string) -{ - Alignment *B; - char ***list; - char **list2; - char *buf=NULL; - FILE *fp; - int a, b,c, ns, m, l; - int *collapsed; - - list=vcalloc (A->nseq, sizeof (char***)); - ns=0; - if ( n==0)return A; - else if (n>1) - { - for (l=0,a=0; a< n; a++)l+=strlen (string[a]); - buf=vcalloc ( 2*n+l+1, sizeof (char)); - for (a=0; a< n; a++){buf=strcat (buf,string[a]), buf=strcat ( buf, " ");} - - list[0]=string2list (buf);ns=1; - - } - else if ( file_exists (NULL,string[0])) - { - /*Format: Fasta like, the name fo the group followed with the name of the sequences - > .... - Groups must NOT be overlaping - */ - l=measure_longest_line_in_file (string[0])+1; - buf=vcalloc (l, sizeof (char)); - ns=0; - fp=vfopen (string[0], "r"); - while ((c=fgetc(fp))!=EOF) - { - buf=fgets (buf,l-1, fp); - if ( c=='>')list[ns++]=string2list (buf); - } - vfclose (fp); - } - else - { - fprintf (stderr, "\nERROR: file <%s> does not exist [FATAL:%s]\n",string[0], PROGRAM); - myexit (EXIT_FAILURE); - } - - vfree (buf); buf=NULL; - - /*Identify lost sequences*/ - collapsed=vcalloc (A->nseq, sizeof (int)); - for ( a=0; a< ns; a++) - { - m=atoi (list[a][0]); - for (b=2; bname, A->nseq, MAXNAMES); - if ( c>=0)collapsed[c]=1; - } - } - for ( a=0; a< A->nseq; a++) - { - if ( collapsed[a]==0) - { - list[ns]=declare_char (3, MAXNAMES); - sprintf ( list[ns][0], "3"); - sprintf ( list[ns][1], "%s", A->name[a]); - sprintf ( list[ns][2], "%s", A->name[a]); - ns++; - } - } - vfree (collapsed); - - - - - - list2=declare_char (A->nseq, 100); - /*1 Collapse the alignment*/ - for ( a=0; a< ns; a++) - { - sprintf ( list2[a], "%s", list[a][2]); - } - B=extract_sub_aln2 ( A, ns, list2); - /*2 Rename the sequences*/ - for ( a=0; a< ns; a++) - { - sprintf ( B->name[a], "%s", list[a][1]); - } - /*replace sequence with consensus*/ - - for ( a=0; a< ns; a++) - { - m=atoi (list[a][0]); - for (c=0, b=2; bseq_al[a], "%s", buf); - } - vfree (buf); - - free_aln (A); - B->S=aln2seq(B); - return B; -} -Alignment * aln2profile (Alignment * A) - { - Alignment *B=NULL; - char *cons; - - if (!A->P) - { - A->P=declare_profile (AA_ALPHABET,A->len_aln+1); - } - B=copy_aln (A, B); - free_int ((A->P)->count, -1); - free_int ((A->P)->count2, -1); - free_int ((A->P)->count3, -1); - (A->P)->count=aln2count_mat (A); - (A->P)->count2=aln2count_mat2 (A); - - cons=aln2cons_seq_mat (A, "blosum62mt"); - - sprintf (B->seq_al[0], "%s", cons); - B->nseq=1; - (A->P)->count3=aln2count_mat2 (B); - vfree (cons); - free_aln (B); - - - - return A; - - } - -int** aln2count_mat2 ( Alignment *A) -{ - return sub_aln2count_mat2 (A, 0, NULL); -} - -int sub_aln2nseq_prf ( Alignment *A, int ns, int *ls) -{ - - - int a, c, s; - Alignment *R; - int n; - int free_ls=0; - - - if ( ns==0) - { - n=ns=A->nseq; - ls=vcalloc (n, sizeof (int)); - for ( a=0; anseq; a++)ls[a]=a; - free_ls=1; - } - else - { - n=ns; - } - - for (c=0,a=0; aS && (R=seq2R_template_profile (A->S, A->order[s][0]))!=NULL) - { - n+=R->nseq; - } - else - { - ; - } - } - - if ( free_ls) vfree (ls); - return n; -} - -int** sub_aln2count_mat2 ( Alignment *A, int ns, int *ls) -{ - char **p; - int **count; - int a, b, c, s; - Alignment *R; - int n; - int free_ls=0; - - if ( ns==0) - { - n=ns=A->nseq; - p=vcalloc ( n, sizeof (char*)); - ls=vcalloc (n, sizeof (int)); - for ( a=0; anseq; a++)ls[a]=a; - free_ls=1; - } - else - { - n=ns; - p=vcalloc (n, sizeof (char*)); - } - - for (c=0,a=0; aS && (R=seq2R_template_profile (A->S, A->order[s][0]))!=NULL) - { - n+=R->nseq; - p=vrealloc (p, n*sizeof (char*)); - for (b=0; bnseq; b++) - { - p[c++]=R->seq_al[b]; - } - } - else - { - int w; - w=A->order[s][4]+1; - - for (b=0; bseq_al[s]; - } - } - count=sub_aln2count_mat3 (p,c); - vfree (p); - if ( free_ls) vfree (ls); - return count; -} -int** sub_aln2count_mat3 (char **al, int ns) -{ - int **count; - int used[1000]; - int a, b; - int r; - - int len; - int us; - - - /*count[x][0]=n symbols in column - count[x][1]=total_size of line - count[x][2]=Gap frequency - - count[x][n]=symbol n - count[x][n+1]=N occurence symbol n; - count[x][n+2]=N frequence symbol n*100; - - special multi-channeling - count[x][count[x][1]]=Nseq - count[x][count[x][1]+s]=residue col x, sequence s - */ - - - for (a=0; a< 1000; a++)used[a]=0; - len=strlen (al[0]); - - count=declare_int (len+2,100+ns+2); - count[len][0]=END_ARRAY; - count[len][1]=ns; - count[len][2]=len; - - - - for (a=0; anseq-us)*100/A->nseq;*/ - count[a][2]=ns-us; - - for (b=3; bnseq; - for (b=1; b<=A->nseq; b++) - count [a][count[a][1]+b]=(is_gap(A->seq_al[b-1][a]))?0:A->seq_al[b-1][a]; - */ - } -#ifdef XXXXXX - HERE ("Display "); - for (a=0; a< 5; a++) - { - fprintf ( stderr, "\n"); - for ( b=3; b< count[a][1]; b+=3) - { - fprintf ( stderr, "[%c %d]", count[a][b], count[a][b+1]); - } - fprintf ( stderr, "\n"); - for ( b=0; blen_aln); - - - for ( a=0; alen_aln; a++) - { - for ( b=0; b< A->nseq; b++) - { - if ( is_gap ( A->seq_al[b][a]))freq_mat[alp_size][a]++; - else - { - x=tolower(A->seq_al[b][a]); - freq_mat[x-'a'][a]++; - freq_mat[alp_size+1][a]++; - - } - } - } - - return freq_mat; - } -char *aln2random_seq (Alignment *A, int pn1, int pn2, int pn3, int gn) - { - - /* - - - Given the frequencies in A ( read as total counts of each Residue in - freq[A->nseq][A->len_aln], and pn1, pn2 and pn3: - - 1-Generate a new amino-acid at each position - 2-Insert Gaps, using a HMM. - - - pn3=Weight of the noise induced with sub mat. - - pn1=% noise type 1 ( Varies with entropi) - n1=Ratio noise type 1 - - T =Nseq - t1=Noise 1 expressed in Nseq - al=alphabet size; - ncat=number of non 0 cat for a given position - ICi initial count for residue i - - Ci=freq[seq][AA] - t1=T*n1*(1-1/ncat); - t2=T*n2; - - Ci= ICi*(T-(t1+t2))/T +(t1)/al+(t2)/al - - */ - - int **freq; - int **count; - float T, tot_t1, tot_t2,tot_t3, n1, n2, n3; - float ncat; - - double gf; - double *init_freq; - double *blur_freq; - double *t1, *t2,*t3; - int a, b, c, x; - char *seq; - int tot; - /*Viterbi Parameters */ - - int p; - int AL=0; /*Allowed Transition*/ - int F=-100000; /*Forbiden Transition*/ - - int GAP_TRANSITION; - int IGAP=0, IAA=1; - - int state,best_state=0, score, best_score=0; - int p_state; - int e=0; - int **score_tab; - int **state_tab; - int nstate=2; - int **transitions; - - int max; - - seq=vcalloc ( A->len_aln+1, sizeof (char)); - count=aln2count_mat(A); - freq=aln2count_mat(A); - - T=100; - - n1=(float)pn1/100; - n2=(float)pn2/100; - n3=(float)pn3/100; - - for ( a=0; a< A->len_aln; a++) - { - for ( b=0; b<26; b++) - freq[b][a]=freq[b][a]*((T)/(A->nseq-freq[26][a])); - freq[26][a]= (freq[26][a]*T)/A->nseq; - } - - - init_freq=vcalloc ( 26, sizeof (double)); - blur_freq=vcalloc ( 26, sizeof (double)); - - tot_t1=tot_t2=tot_t3=0; - - t1=vcalloc ( 27, sizeof (double)); - t2=vcalloc ( 27, sizeof (double)); - t3=vcalloc ( 27, sizeof (double)); - for (a=0; a< A->len_aln; a++) - { - - /*Compute Frequencies*/ - for (tot=0, b=0; b<26; b++) - { - if ( is_aa(b+'A')) - { - init_freq[b]=freq[b][a]; - tot+=freq[b][a]; - } - } - /*Count the number of different amino acids*/ - for ( ncat=0, b=0; b<=26; b++) - { - ncat+=(freq[b][a]!=0)?1:0; - } - /*Blurr the distribution using */ - blur_freq=compute_matrix_p (init_freq,tot); - - - /*compute noise 1: biased with blurred content * enthropy--> keeps prosite motifs*/ - tot_t1=T*n1*(1-1/ncat); - for ( b=0; b< 26; b++)if ( is_aa(b+'A')){t1[b]=blur_freq[b]*(1-1/ncat)*n1;} - - /*Compute noise 2: completely random*/ - tot_t2=T*n2; - for ( b=0; b< 26; b++)if ( is_aa(b+'A')){t2[b]=tot_t2/21;} - - /*compute noise 3: biased with the sole content(pam250mt)*/ - tot_t3=T*n3; - for ( b=0; b<26; b++)if ( is_aa(b+'A')){t3[b]=blur_freq[b]*n3;} - - for ( b=0; b<26; b++) - { - if ( is_aa('A'+b)) - freq[b][a]=freq[b][a]*(T-(tot_t1+tot_t2+(tot_t3)))/T+t1[b]+t2[b]+t3[b]; - } - - /*end of the loop that mutates position a*/ - } - - vfree (blur_freq); - vfree (init_freq); - vfree ( t3); - - /*1-Generate the amino acids of the new sequence new*/ - - - vsrand (0); - - for ( a=0; a< A->len_aln; a++) - { - - for (T=0,b=0; b<26; b++)T+=freq[b][a]; - x=rand ()%((int)T); - for (c=0,b=0; b<26; b++) - { - c+=freq[b][a]; - if ( c>=x) - { - seq[a]='A'+b; - c=-1; - break; - } - } - if ( c!=-1)seq[a]='-'; - } - seq[a]='\0'; - - - /*2 Generate the gaps in the new sequence*/ - - - - if ( gn<0); - else - { - - transitions=declare_int ( nstate, nstate); - score_tab=declare_int ( A->len_aln+2, nstate ); - state_tab=declare_int ( A->len_aln+2, nstate ); - - - - for (a=0; alen_aln; p++){for (state=0; state< nstate; state++){score_tab[p][state]=F;state_tab[p][state]=-1;} } - - for (p=1; p<= A->len_aln; p++) - { - for (max=0,a=0; a<26; a++)max=MAX(max, freq[a][p-1]); - max=(max*(A->nseq-count[26][p-1]))/A->nseq; - - for (state=0; state< nstate; state++) - { - - - gf=freq[26][p-1]; - if ( state==IGAP) e=gf-50; - else if ( state==IAA ) e=max-50; - for (p_state=0; p_statebest_score){ best_score=score;best_state=p_state;} - } - score_tab[p][state]=best_score; - state_tab[p][state]=best_state; - } - } - - for (state=0; statebest_score){best_score=score_tab[p-1][state]; best_state=state;} - } - - for (p=A->len_aln; p>0;) - { - if ( best_state==IGAP) - { - seq[p-1]='-'; - } - else if ( best_state==IAA) - { - seq[p-1]=seq[p-1]; - } - best_state=state_tab[p][best_state]; - p--; - } - } - - free_int (freq, -1); - return seq; - } - -/********************************************************************/ -/* */ -/* Weighting functions */ -/* */ -/* */ -/* */ -/********************************************************************/ -Alignment * master_trimseq( Alignment *A, Sequence *S,char *mode) - { - Alignment *NA; - char *p; - int a, b; - int use_aln=0, upper_sim=0, min_nseq=0, lower_sim=0; - float f_upper_sim, f_lower_sim; - char weight_mode[1000]; - char method[1000]; - int statistics=0; - int trim_direction=TOP; - float **sim_weight; - int *seq_list; - int table=0; - - - - - /* - mode: - (trim)__%_n_w - */ - - - - seq_list=vcalloc ( S->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++) - { - seq_list[a]=1; - } - - - use_aln=aln_is_aligned(A); - - if ( mode[0]=='\0') - { - - upper_sim=50; - lower_sim=0; - min_nseq=0; - sprintf (weight_mode, "pwsim"); - sprintf ( method, "clustering2"); - } - else - { - - upper_sim=lower_sim=min_nseq; - sprintf (weight_mode, "pwsim"); - sprintf ( method, "clustering2"); - } - - /* - U or % (deprecated) Upper bound for pairwise similarity - L or m (depercated) Lower bound for pairwise similarity - n max number of sequences - N max number of sequences as a fraction of thet total - S print Statistics - T print Table of distances - */ - - - - while ( (p=strtok(mode, "_"))) - { - mode=NULL; - if (strm (p, "seq"))use_aln=0; - else if ( strm(p,"aln"))use_aln=1; - else if (p[0]=='s')statistics=1; - else if (p[0]=='t')table=1; - else if (p[0]=='U')upper_sim=atoi(p+1); - else if (p[0]=='L')lower_sim=atoi(p+1); - else if (p[0]=='n')min_nseq=atoi(p+1); - else if (p[0]=='N')min_nseq=atoi(p+1)*-1; - else if (p[0]=='B')trim_direction=BOTTOM; - else if (p[0]=='T')trim_direction=TOP; - else if (p[0]=='W')sprintf (weight_mode, "%s", p+1); - else if (p[0]=='M')sprintf (method, "%s", p+1); - else if (p[0]=='K') - { - - while ((p=strtok(NULL, ":"))) - { - - if ( p[0]=='#') - { - seq_list[atoi(p+1)-1]=2; - } - else if ( (a=name_is_in_list (p, A->name, A->nseq, 100))!=-1) - - { - seq_list[a]=2; - } - } - } - } - - if ( !upper_sim && !min_nseq && !lower_sim)upper_sim=50; - - - - if (!S) - { - fprintf ( stderr, "\ntrimseq requires a set of sequences[FATAL:%s]\n", PROGRAM); - crash(""); - } - - else if ( min_nseq> S->nseq) - { - min_nseq=S->nseq; - } - else if ( min_nseq<0) - { - if ( min_nseq<-100) - { - add_warning ( stderr, "\nWARNING: trimseq: Nseq(N) max_val=100%% [Automatic reset]\n"); - min_nseq=-100; - } - - min_nseq=(int)((float)S->nseq*((float)min_nseq/100)*-1); - } - - - NA=seq2subseq3 (A, S,use_aln,lower_sim,upper_sim,min_nseq,trim_direction, weight_mode,&sim_weight, seq_list ); - - if ( table) - { - fprintf ( stderr, "\nSIMILARITY MATRIX\n"); - for ( a=0; a< A->nseq-1; a++) - for ( b=a+1; b< A->nseq; b++) - { - fprintf ( stderr, "%15s Vs %15s : %3.2f %% id\n", A->name[a], A->name[b], 100-sim_weight[a][b]); - } - } - if ( statistics) - { - f_upper_sim=(upper_sim>100)?((float)upper_sim/(float)100):upper_sim; - f_lower_sim=(upper_sim>100)?((float)lower_sim/(float)100):lower_sim; - - fprintf ( stderr, "\nTRIM Informations:\n"); - fprintf ( stderr, "\tUse...........: %s\n",(use_aln)?"multiple_aln":"pairwise_aln"); - fprintf ( stderr, "\tcluster_mode..: %s\n" ,method); - fprintf ( stderr, "\tsim_mode......: %s\n" ,weight_mode); - fprintf ( stderr, "\tlower_id_bound: %.2f%%\n" ,(f_lower_sim==0)?-1:f_lower_sim); - fprintf ( stderr, "\tupper_id_bound: %.2f%%\n",(f_upper_sim==0)?-1:f_upper_sim); - fprintf ( stderr, "\tnseq_kept.....: %d (out of %d)\n" ,NA->nseq, S->nseq); - fprintf ( stderr, "\treduction.....: %d%% of original set\n" ,(NA->nseq*100)/S->nseq); - fprintf ( stderr, "\tTrim_direction: From %s \n" ,(trim_direction==BOTTOM)?"Bottom":"Top"); - } - - return NA; - } - -Alignment *sim_filter (Alignment *A, char *in_mode, char *seq) -{ - int **sim, **cov; - int *list; - int *keep; - int maxnseq, nseq_ratio, nc; - int new_nseq; - int a, s, n, k; - Alignment *R; - char *mode; - int outlayers; - int direction=1;//remove the higher than - int coverage=0; //remove based on coverage - static char *field; - int maxsim, minsim, maxcov, mincov; - - if ( !field) field=vcalloc (1000, sizeof (char)); - - mode=vcalloc ( strlen (in_mode)+10, sizeof (char)); - sprintf ( mode, "_%s_", in_mode); - - strget_param ( mode, "_I", "100", "%d", &maxsim); - strget_param ( mode, "_i", "0", "%d", &minsim); - strget_param ( mode, "_C", "100", "%d", &maxcov); - strget_param ( mode, "_c", "0", "%d", &mincov); - - - - - - keep=vcalloc ( A->nseq, sizeof (int)); - list=vcalloc ( A->nseq, sizeof (int)); - - - - - - - if (!seq)s=0; - else s=name_is_in_list (seq, A->name, A->nseq, 100); - if (s==-1) - { - - if ( s==-1)printf_exit (EXIT_FAILURE, stderr, "ERROR: %s is not a valid sequence", seq); - } - else - keep[s]=1; - - //get the distances - if ( strstr (mode, "_seq_")) - { - char **seq; - int **M; - - M=read_matrice ("blosum62mt"); - seq=declare_char (A->nseq, A->len_aln+1); - for (a=0; anseq; a++) - { - sprintf ( seq[a], "%s", A->seq_al[a]); - ungap (seq[a]); - } - - sim=declare_int (A->nseq, A->nseq); - cov=declare_int (A->nseq, A->nseq); - - for (a=0; anseq; a++) - { - if ( s!=a) - { - sim[s][a]=sim[a][s]=idscore_pairseq(seq[s], seq[a],-12, -1,M,"sim"); - cov[s][a]=cov[a][s]=idscore_pairseq(seq[s], seq[a],-12, -1,M,"cov"); - - } - } - free_char (seq, -1); - free_int (M,-1); - } - else - { - sim=aln2sim_mat (A, "idmat"); - cov=aln2cov (A); - } - - for (a=0; a< A->nseq; a++) - { - if (a==s)continue; - else - { - if ( sim[s][a]>maxsim || sim[s][a]maxcov)keep[a]=-1; - else keep[a]=1; - } - } - - for ( n=0, a=0; a< A->nseq; a++) - { - if ( keep[a]!=-1) - { - list[n++]=a; - } - } - - R=extract_sub_aln (A, n, list); - free_int (sim, -1); free_int (cov, -1);vfree (list); - - return R; -} - - -static int find_worst_seq ( int **sim, int n, int *keep, int max, int direction); -Alignment *simple_trimseq (Alignment *A, Alignment *K, char *in_mode, char *seq_list) -{ - int **sim; - int *list; - int *keep; - int maxnseq, maxsim, nseq_ratio, nc; - int new_nseq; - int a,b, s, n, k; - Alignment *R; - char *mode; - int outlayers; - int direction=1;//remove the higher than - int coverage=0; //remove based on coverage - static char *field; - int *tot_avg; - - if ( !field) field=vcalloc (1000, sizeof (char)); - - mode=vcalloc ( strlen (in_mode)+10, sizeof (char)); - sprintf ( mode, "_%s_", in_mode); - - strget_param ( mode, "_%%", "0", "%d", &maxsim); - strget_param ( mode, "_n", "0", "%d", &maxnseq); - strget_param ( mode, "_N", "0", "%d", &nseq_ratio); - strget_param ( mode, "_F", "0", "%d", &nc); - strget_param ( mode, "_O", "0", "%d", &outlayers); - strget_param ( mode, "_f", "NAME", "%s", field); - - if ( strstr (mode, "_min"))direction=-1; - else direction=1; - - if ( strstr (mode, "_cov"))coverage=1; - else coverage=0; - - - if ( nseq_ratio) - { - maxnseq=(A->nseq*nseq_ratio)/100; - maxsim=0; - } - else if ( maxnseq) - { - maxsim=0; - } - else if ( !maxsim) - { - maxsim=100; - } - - - keep=vcalloc ( A->nseq, sizeof (int)); - list=vcalloc ( A->nseq, sizeof (int)); - - - - - /*Remove Sequences that do not have at least one residue in the first and last nc columns*/ - if ( nc) - { - int left, right, full_n,x, y; - int *full_list; - - Alignment *F; - - full_list=vcalloc ( A->nseq, sizeof (int)); - full_n=0; - for (x=0; x< A->nseq; x++) - { - for ( left=0,y=0; ylen_aln,nc); y++) - if (!is_gap(A->seq_al[x][y]))left=1; - - for ( right=0,y=MAX(0,(A->len_aln-nc)); ylen_aln; y++) - if (!is_gap(A->seq_al[x][y]))right=1; - - if ( left && right)full_list[full_n++]=x; - } - F=extract_sub_aln (A, full_n, full_list); - free_aln (A); - vfree (full_list); - A=F; - } - - /*Reorder the sequences according to the tree order: hopefully better phylogenetic coverage after trim*/ - if (strstr (mode, "_T")) - { - NT_node **T; - Sequence *O; - - sim=sim_array2dist_array ( sim, MAXID); - T=int_dist2nj_tree (sim, A->name, A->nseq, NULL); - O=tree2seq (T[3][0], NULL); - A=reorder_aln (A, O->name, O->nseq); - - free_int (sim, -1); - free_sequence (O, -1); - } - - if ( coverage==0) - { - if ( strstr (mode, "seq_"))sim=seq2comp_mat (aln2seq(A), "blosum62mt", "sim"); - else sim=aln2sim_mat (A, "idmat"); - } - else - { - int b; - if ( strstr (mode, "seq_"))sim=seq2comp_mat (aln2seq(A), "blosum62mt", "cov"); - else sim=aln2cov (A); - - } - - - if ( K && K->nseq>0) - { - for ( a=0; a< K->nseq; a++) - if ( (k=name_is_in_list (K->name[a], A->name, A->nseq, MAXNAMES+1))!=-1) - { - - keep[k]=1; - } - } - if ( seq_list) - { - for ( a=0; a< A->nseq; a++) - { - if (strstr (field, "NAME") && perl_strstr (A->name[a], seq_list)){keep[a]=1;} - else if (strstr (field, "COMMENT") && A->seq_comment && perl_strstr(A->seq_comment[a], seq_list)){keep[a]=1;} - else if (strstr (field, "SEQ") && perl_strstr((A->S)->seq[a], seq_list)){keep[a]=1;} - } - - - } - for ( a=0; a< A->nseq; a++) - if ( keep[a]) fprintf ( stderr, "\nFORCED KEEP %s", A->name[a]); - - new_nseq=A->nseq; - - - while ( (s=find_worst_seq (sim, A->nseq, keep, maxsim, direction))!=-1 && new_nseq>maxnseq) - { - for ( a=0; a< A->nseq; a++)sim[a][s]=sim[s][a]=-1; - keep[s]=-1; - new_nseq--; - } - - /*Trim Outlayers*/ - if (outlayers!=0) - { - int nn, b; - tot_avg=vcalloc ( A->nseq, sizeof (int)); - - for (a=0; anseq; a++) - { - if ( keep[a]==-1)tot_avg[a]=-1; - else - { - for (nn=0, b=0; b< A->nseq; b++) - { - if (a==b || keep[b]==-1)continue; - else - { - tot_avg[a]+=sim[a][b]; - nn++; - } - } - tot_avg[a]=(nn==0)?-1:(tot_avg[a])/nn; - } - } - for ( a=0; anseq; a++) - { - if (tot_avg[a]!=-1 && tot_avg[a]name[a]); - keep[a]=-1; - } - } - vfree ( tot_avg); - } - - for ( n=0, a=0; a< A->nseq; a++) - { - if ( keep[a]!=-1) - { - list[n++]=a; - } - } - - R=extract_sub_aln (A, n, list); - free_int (sim, -1); vfree (list); - - return R; -} - -int find_worst_seq ( int **sim, int n, int *keep,int max,int direction) -{ - int **sc; - int a, b, r=0; - int si; - - sc=declare_int (n, 2); - if (direction==-1)max=100-max; - - for ( a=0; a< n; a++) sc[a][0]=a; - for ( a=0; a< n-1; a++) - { - for ( b=a+1; b=0)si=(direction==-1)?100-sim[a][b]:sim[a][b]; - else si=sim[a][b]; - if ( si>max) - { - if ( keep[a]!=1)sc[a][1]+=si; - if ( keep[b]!=1)sc[b][1]+=si; - } - } - } - - sort_int_inv ( sc, 2, 1, 0, n-1); - if ( sc[0][1]>0)r=sc[0][0]; - else r=-1; - - free_int (sc, -1); - if (r!=-1 && keep && keep[r])return -1; - else return r; -} - -int find_worst_seq_old ( int **sim, int n, int *keep,int max,int direction) -{ - int **sc; - int a, b, r=0; - - sc=declare_int (n, 2); - - for ( a=0; a< n; a++) sc[a][0]=a; - for ( a=0; a< n-1; a++) - { - for ( b=a+1; bmax) - { - if ( keep[a]!=1)sc[a][1]+=sim[a][b]; - if ( keep[b]!=1)sc[b][1]+=sim[a][b]; - } - } - else if ( direction == -1) - { - if ( sim[a][b]=0) - { - if ( keep[a]!=1)sc[a][1]+=sim[a][b]; - if ( keep[b]!=1)sc[b][1]+=sim[a][b]; - } - } - } - } - - if ( direction ==1) //remove max - { - sort_int_inv ( sc, 2, 1, 0, n-1); - if ( sc[0][1]>0)r=sc[0][0]; - else r=-1; - - } - else if ( direction ==-1)//remove min - { - sort_int_inv ( sc, 2, 1, 0, n-1); - if ( sc[0][1]>=0)r=sc[0][0]; - else r=-1; - HERE ("** %d %d\n", r,sc[0][1]); - } - free_int (sc, -1); - if (r!=-1 && keep && keep[r])return -1; - else return r; -} - - -Alignment * trimseq( Alignment *A, Sequence *S,char *mode) - { - Alignment *NA; - char *p; - int a, b; - int use_aln=0, upper_sim=0, min_nseq=0, lower_sim=0; - char weight_mode[1000]; - char method[1000]; - int statistics=0; - int trim_direction=TOP; - float **sim_weight; - int *seq_list; - int table=0; - int print_name=0; - float f_lower_sim, f_upper_sim; - - - - /* - mode: - (trim)__%_n_w - */ - - - - seq_list=vcalloc ( S->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++) - { - seq_list[a]=1; - } - - - use_aln=aln_is_aligned(A); - - - if ( mode[0]=='\0') - { - - upper_sim=50; - lower_sim=0; - min_nseq=0; - sprintf (weight_mode, "pwsim_fragment"); - sprintf ( method, "clustering2"); - } - else - { - - upper_sim=lower_sim=min_nseq; - sprintf (weight_mode, "pwsim_fragment"); - sprintf ( method, "clustering2"); - } - - /* - U or % (deprecated) Upper bound for pairwise similarity - L or m (depercated) Lower bound for pairwise similarity - n max number of sequences - N max number of sequences as a fraction of thet total - S print Statistics - T print Table of distances - */ - - - - while ( (p=strtok(mode, "_"))) - { - mode=NULL; - if (strm (p, "seq"))use_aln=0; - else if ( strm(p,"aln"))use_aln=1; - else if (p[0]=='s')statistics=1; - else if (p[0]=='t')table=1; - else if (p[0]=='p')print_name=1; - else if (p[0]=='U')upper_sim=atoi(p+1); - else if (p[0]=='L')lower_sim=atoi(p+1); - else if (p[0]=='n')min_nseq=atoi(p+1); - else if (p[0]=='N')min_nseq=atoi(p+1)*-1; - else if (p[0]=='B')trim_direction=BOTTOM; - else if (p[0]=='T')trim_direction=TOP; - else if (p[0]=='W')sprintf (weight_mode, "%s", p+1); - else if (p[0]=='M')sprintf (method, "%s", p+1); - else if (p[0]=='K') - { - - while ((p=strtok(NULL, ":"))) - { - - if ( (a=name_is_in_list (p, A->name, A->nseq, 100))!=-1) - { - seq_list[a]=2; - } - } - } - } - - if ( !upper_sim && !min_nseq && !lower_sim)upper_sim=50; - - - - if (!S) - { - fprintf ( stderr, "\ntrimseq requires a set of sequences[FATAL:%s]\n", PROGRAM); - crash(""); - } - - else if ( min_nseq> S->nseq) - { - min_nseq=S->nseq; - } - else if ( min_nseq<0) - { - if ( min_nseq<-100) - { - add_warning ( stderr, "\nWARNING: trimseq: Nseq(N) max_val=100%% [Automatic reset]\n"); - min_nseq=-100; - } - - min_nseq=(int)((float)S->nseq*((float)min_nseq/100)*-1); - } - - - NA=seq2subseq2 (A, S,use_aln,lower_sim,upper_sim,min_nseq,trim_direction, weight_mode,&sim_weight, seq_list ); - - if ( table) - { - fprintf ( stderr, "\nSIMILARITY MATRIX\n"); - for ( a=0; a< A->nseq-1; a++) - for ( b=a+1; b< A->nseq; b++) - { - fprintf ( stderr, "%15s Vs %15s : %3.2f %% id\n", A->name[a], A->name[b], 100-sim_weight[a][b]); - } - } - - NA=seq_name2removed_seq_name(S, NA,sim_weight); - - if ( print_name) - { - fprintf ( stderr, "\nList of sequences with their closest removed neighbors\n"); - for ( a=0; a< NA->nseq; a++)fprintf ( stderr, "\n%s: %s\n", NA->name[a], NA->seq_comment[a]); - } - - if ( statistics) - { - f_lower_sim=(lower_sim>100)?(float)lower_sim/100:lower_sim; - f_upper_sim=(upper_sim>100)?(float)upper_sim/100:upper_sim; - - fprintf ( stderr, "\nTRIM seq Informations:\n"); - fprintf ( stderr, "\tUse...........: %s\n",(use_aln)?"multiple_aln":"pairwise_aln"); - fprintf ( stderr, "\tcluster_mode..: %s\n" ,method); - fprintf ( stderr, "\tsim_mode......: %s\n" ,weight_mode); - fprintf ( stderr, "\tlower_id_bound: %.2f%%\n" ,(f_lower_sim==0)?-1:f_lower_sim); - fprintf ( stderr, "\tupper_id_bound: %.2f%%\n",(f_upper_sim==0)?-1:f_upper_sim); - fprintf ( stderr, "\tnseq_kept.....: %d (out of %d)\n" ,NA->nseq, S->nseq); - fprintf ( stderr, "\treduction.....: %d%% of original set\n" ,(NA->nseq*100)/S->nseq); - fprintf ( stderr, "\tTrim_direction: From %s \n" ,(trim_direction==BOTTOM)?"Bottom":"Top"); - } - - return NA; - } - -Alignment * tc_trimseq( Alignment *A, Sequence *S,char *mode) - { - Alignment *NA; - Sequence *TS; - char *trimfile, *alnfile; - int *seq_list; - int a, nseq=0, sim=0; - char *p; - char command[100000]; - char keep_list[10000]; - - int top, bottom, middle, pmiddle; - - keep_list[0]='\0'; - - seq_list=vcalloc ( S->nseq, sizeof (int)); - for ( a=0; a< A->nseq; a++) - { - seq_list[a]=1; - } - - trimfile=vtmpnam (NULL); - alnfile=vtmpnam (NULL); - if ( !aln_is_aligned (A)) - { - fprintf ( stderr, "\ntrimTC: computation of an Approximate MSA ["); - A=compute_tcoffee_aln_quick ( A, NULL); - fprintf ( stderr, "DONE]\n"); - } - output_clustal_aln (alnfile, A); - - - while ( (p=strtok(mode, "#"))) - { - mode=NULL; - - - if (p[0]=='%' || p[0]=='S')sim=(p[1]=='%')?atoi(p+2):atoi(p+1); - else if (p[0]=='n' || p[0]=='N')nseq=atoi(p+1); - else if (p[0]=='K') - { - if ( (a=name_is_in_list (p+1, A->name, A->nseq, 100))!=-1) - { - seq_list[a]=2; - } - - } - } - if ( nseq ==0 && sim ==0) - { - fprintf ( stderr, "\nERROR: trimTC\nIndicate the maximum number of sequences Nnseq\nOR the maximum average similarity of the chosen sequencesSx\nEX: +trimTC S20 OR +trimTC N5"); - fprintf ( stderr, "\n[FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - for ( a=0; anseq; a++)if (seq_list[a]==2){strcat ( keep_list, A->name[a]);strcat ( keep_list," ");} - - if ( sim) - { - sprintf ( command , "%s -infile %s -trim -trimfile=%s -split_score_thres %d -convert -iterate 0 ",get_string_variable("t_coffee"), alnfile, trimfile,sim); - if ( keep_list[0]){strcat ( command, " -seq_to_keep ");strcat ( command, keep_list);} - my_system ( command); - TS=read_sequences (trimfile); - } - else if ( nseq && A->nseq>nseq) - { - - top=100;bottom=0; - pmiddle=0;middle=50; - - sprintf ( command , "%s -infile %s -trim -trimfile=%s -split_score_thres %d -convert -iterate 0",get_string_variable("t_coffee"), alnfile, trimfile,middle); - if ( keep_list[0]){strcat ( command, " -seq_to_keep ");strcat ( command, keep_list);} - my_system ( command); - - TS=read_sequences (trimfile); - fprintf ( stderr, "\n\tTrimTC: Sim %d Nseq %d\t",middle, TS->nseq); - - if ( TS->nseq>nseq)top=middle; - else if ( TS->nseqnseq!=nseq && pmiddle!=middle) - { - - sprintf ( command , "%s -infile %s -trim -trimfile=%s -split_score_thres %d -convert -iterate 0 ",get_string_variable("t_coffee"), alnfile, trimfile,middle); - if ( keep_list[0]){strcat ( command, " -seq_to_keep ");strcat ( command, keep_list);} - my_system ( command); - free_sequence (TS, -1); - TS=read_sequences (trimfile); - fprintf ( stderr, "\n\tTrimTC: Sim %d Nseq %d\t", middle, TS->nseq); - - if ( TS->nseq>nseq)top=middle; - else if ( TS->nseq100)?(float)int_lower_sim/100:int_lower_sim; - upper_sim=(int_upper_sim>100)?(float)int_upper_sim/100:int_upper_sim; - - sim_weight[0]=get_weight ((use_aln)?A:NULL, S, weight_mode); - - name=declare_char (S->nseq, (MAXNAMES+1)); - seq= declare_char (S->nseq, S->max_len+1); - - /* - Remove every sequence that is more than upper_sim and less than lower_sim similar to the master sequences - the master sequence(s) are those for which seq_list[x]==2 - */ - - - - - new_nseq=A->nseq; - - - for (a=0; a< A->nseq; a++) - { - if ( seq_list[a]==2) - { - - for ( b=0; b< A->nseq;b++) - { - sim=100-sim_weight[0][a][b]; - if (seq_list[b]==1 && (sim>upper_sim || simnseq; a++) - { - if ( seq_list[a]) - { - sprintf ( name[b], "%s", S->name[a]); - sprintf ( seq[b] , "%s",(use_aln)?A->seq_al[a]: S->seq[a] ); - b++; - } - } - - - NS=fill_sequence_struc (new_nseq,seq,name); - NA=seq2aln(NS,NULL,1); - - if ( use_aln && A) - { - NA=realloc_aln2 ( NA,A->max_n_seq,A->len_aln+1); - - for (b=0, a=0; anseq; a++) - { - if ( seq_list[a]) - { - sprintf ( NA->seq_al[b] , "%s",A->seq_al[a]); - b++; - } - } - - NA->len_aln=A->len_aln; - ungap_aln(NA); - } - - - return NA; -} -Alignment* seq2subseq2( Alignment *A, Sequence *S,int use_aln, int int_lower_sim,int int_upper_sim, int min_nseq, int trim_direction, char *weight_mode, float ***sim_weight, int *seq_list) -{ - int a, b; - int new_nseq; - int seq_index=0; - /*OUTPUT*/ - char **seq, **name; - Sequence *NS; - Alignment *NA; - float lower_sim, upper_sim; - - lower_sim=(int_lower_sim>100)?(float)int_lower_sim/100:int_lower_sim; - upper_sim=(int_upper_sim>100)?(float)int_upper_sim/100:int_upper_sim; - - - sim_weight[0]=get_weight ((use_aln)?A:NULL, S, weight_mode); - - name=declare_char (S->nseq, (MAXNAMES+1)); - seq= declare_char (S->nseq, S->max_len+1); - - /* - 1 REMOVE OUTLAYERS - 2 REMOVE CLOSELY RELATED SEQUENCES - 3 IF STILL TOO MANY SEQUENCES: - REMOVE THE MOST CLOSELY RELATED ONES - */ - - - /*1 Remove outlayers*/ - - new_nseq=A->nseq; - - - /*1 Remove outlayers*/ - while ( lower_sim && (extreme_seq(BOTTOM,A,sim_weight[0],seq_list, &seq_index) min_nseq) && seq_index!=-1) - { - - if ( seq_list[seq_index]==1) - { - seq_list[seq_index]=0; - new_nseq--; - } - } - /*2 Remove close relative*/ - - - while ( upper_sim && (extreme_seq(TOP, A,sim_weight[0],seq_list, &seq_index)>upper_sim) && ((new_nseq)>min_nseq)&& seq_index!=-1) - { - - if ( seq_list[seq_index]==1) - { - seq_list[seq_index]=0; - new_nseq--; - } - } - - - /*Remove extra sequences*/ - - while ( min_nseq>0 && new_nseq>min_nseq && seq_index!=-1) - { - - extreme_seq(trim_direction, A,sim_weight[0],seq_list, &seq_index); - - if ( seq_index==-1)break; - if ( seq_list[seq_index]==1) - { - seq_list[seq_index]=0; - new_nseq--; - } - } - - - /*Prepare the new sequence List*/ - - for (b=0, a=0; anseq; a++) - { - if ( seq_list[a]) - { - sprintf ( name[b], "%s", S->name[a]); - sprintf ( seq[b] , "%s",(use_aln)?A->seq_al[a]: S->seq[a] ); - b++; - } - } - - - NS=fill_sequence_struc (new_nseq,seq,name); - NA=seq2aln(NS,NULL,1); - - if ( use_aln && A) - { - NA=realloc_aln2 ( NA,A->max_n_seq,A->len_aln+1); - - for (b=0, a=0; anseq; a++) - { - if ( seq_list[a]) - { - sprintf ( NA->seq_al[b],"%s",A->seq_al[a]); - b++; - } - } - - NA->len_aln=A->len_aln; - ungap_aln(NA); - } - - - return NA; -} - -float extreme_seq (int direction, Alignment *A,float **sim_weight,int *seq_list, int *seq_index) -{ - - /*find the closest relative of each sequence - Return: - Direction= BOTTOM: the sequence whose closest relative is the most distant - Direction= TOP: the sequence whose closest relative is the closest - weight: different sequences=100 - similar sequences =0 - */ - int a, b; - - float top_sim,bottom_sim, best_sim, sim; - int top_seq, bottom_seq; - - bottom_seq=top_seq=seq_index[0]=-1; - top_sim=-1; - bottom_sim=101; - - for (a=0; a< A->nseq; a++) - { - if (seq_list[a]!=1)continue; - - for ( best_sim=0, b=0; b< A->nseq; b++) - { - if ( a==b || !seq_list[b])continue; - - sim=100-sim_weight[a][b]; - if (sim>best_sim) - { - best_sim=sim; - } - } - - if ( best_sim>top_sim) - { - top_seq=a; - top_sim=best_sim; - } - - if ( best_sim_%_n_w - */ - - sim_weight=get_weight ((use_aln)?A:NULL, S, weight_mode); - pw_weight=declare_float (S->nseq, S->nseq); - seq_weight=declare_float ( S->nseq, 2); - - - for (best_score=0,a=0; anseq; a++) - { - for ( b=0; bnseq; b++) - { - if ( a==b)continue; - seq_weight[a][0]+=sim_weight[a][b]; - } - seq_weight[a][0]=seq_weight[a][0]/(S->nseq-1); - score=seq_weight[a][0]=100-seq_weight[a][0]; - - if ( score>best_score) - { - best_seq=a; - best_score=score; - } - - } - for (a=0; anseq; a++) - { - for ( b=0; bnseq; b++) - { - if ( a==b)continue; - pw_weight[a][b]=sim_weight[a][b]*seq_weight[a][0]*seq_weight[b][0]/(100*100); - - } - } - - - seq_list=vcalloc ( S->nseq, sizeof (int)); - used_seq_list=vcalloc ( S->nseq, sizeof (int)); - - - - name=declare_char (S->nseq, (MAXNAMES+1)); - seq= declare_char (S->nseq, S->max_len+1); - - /*compute the normalization factor*/ - for (sum=0,d=0; d< S->nseq; d++) - { - for (score=0,c=0; cnseq; c++) - { - if ( c!=d) - score=MAX(score, 100-sim_weight[c][d]); - } - sum+=score; - } - sum=sum/S->nseq; - /*chose the first sequence */ - for ( best_score=0,a=0; a< S->nseq; a++) - { - for (score=0, b=0; b< S->nseq; b++) - { - score+=100-sim_weight[a][b]; - } - if ( score>best_score) - { - best_seq=a; - best_score=score; - } - - } - - - last_chosen=chosen=((best_score/S->nseq)*100)/sum; - nchosen=last_nchosen=1; - seq_list[0]=best_seq; - used_seq_list[best_seq]=1; - - sprintf ( name[0],"%s", S->name[seq_list[0]]); - sprintf ( seq[0],"%s", S->seq[seq_list[0]]); - nchosen=last_nchosen=1; - - - fprintf ( stderr, "\nTRIM:\n"); - fprintf ( stderr, "\n1-Chosen Sequences\n"); - /*Assemble the list of sequences*/ - for (a=1; a< S->nseq; a++) - { - for (best_score=0,b=0; b< S->nseq; b++) - { - if (used_seq_list[b]); - else - { - score=pw_weight[seq_list[0]][b]+1; - for (c=0; c=best_score) - { - best_seq=b; - best_score=score; - } - - } - } - seq_list[a]=best_seq; - used_seq_list[best_seq]=1; - - - - for ( chosen=0,d=0; d< S->nseq; d++) - { - for (score=0, c=0; c<=a; c++) - { - if ( seq_list[c]!=d) - score=MAX(score, 100-sim_weight[seq_list[c]][d]); - } - chosen+=score; - - } - - chosen=((chosen/S->nseq)*100)/sum; - nchosen=a+1; - - condition1= (int)chosen<=(int)percent || !percent; - condition2=(nchosen)<=max_nseq || !max_nseq; - - if (condition1 && condition2) - { - fprintf ( stderr, "\tADD %s (set score: %.2f %%)\n", S->name[seq_list[a]], chosen); - sprintf ( name[a],"%s", S->name[seq_list[a]]); - sprintf ( seq[a],"%s", S->seq[seq_list[a]]); - - } - else - { - break; - } - last_chosen=chosen; - last_nchosen=nchosen; - } - - NS=fill_sequence_struc (last_nchosen,seq,name); - NA=seq2aln(NS,NULL,1); - fprintf ( stderr, "\n2-Informations:\n"); - fprintf ( stderr, "\tUse...........: %s\n",(use_aln)?"multiple_aln":"pairwise_aln"); - fprintf ( stderr, "\tweight_mode...: %s\n" ,weight_mode); - fprintf ( stderr, "\tpercent_weight: %.2f%% (max=%d%%)\n",last_chosen,percent); - fprintf ( stderr, "\tn_seq.........: %d\n" ,NS->nseq); - fprintf ( stderr, "\treduction.....: %d%% of original set\n" ,(NS->nseq*100)/S->nseq); - - return NA; - } -float ** get_weight ( Alignment *A, Sequence *S, char *mode) -{ - char *aln_name; - char *weight_name; - char *seq_name; - char command[LONG_STRING]; - char program[LONG_STRING]; - float **weight; - FILE *fp; - int c; - - if ( !mode || !mode[0] || strm (mode, "msa")) - { - if ( getenv ( "SEQ2MSA_WEIGHT")==NULL)sprintf (program, "%s",SEQ2MSA_WEIGHT); - else sprintf ( program, "%s", (getenv ( "SEQ2MSA_WEIGHT"))); - } - else if ( strm(mode, "pwsim") ||strm(mode, "pwsim_fragment") ) - { - return seq2pwsim (A, S, mode); - } - else - { - if (getenv (mode))sprintf ( program, "%s", (getenv (mode))); - else fprintf ( stderr, "\nERROR: %s is not a valid mode for weight computation [FATAL:%s]", mode, PROGRAM); - } - - /*MSA weights*/ - seq_name=vtmpnam(NULL); - aln_name=vtmpnam(NULL); - weight_name=vtmpnam(NULL); - weight=declare_float (S->nseq+1, 2); - - - - if (A) - { - output_clustal_aln (seq_name,A); - output_fasta_seq (aln_name,A); - sprintf ( command, "%s %s -i %s -w %s", program, seq_name, aln_name, weight_name); - } - else - { - A=seq2aln(S,A,1); - output_fasta_seq (seq_name,A); - sprintf ( command, "%s %s -w %s", program, seq_name, weight_name); - } - - - my_system ( command); - - fp=vfopen( weight_name, "r"); - while ( (c=fgetc(fp))!='$'); - c=fgetc(fp); - c=0; - while ( (fscanf (fp, "%*s %f\n",&(weight[c][1])))==1) - {weight[c][0]=c;c++;} - vfclose (fp); - - - return weight; -} - -float **seq2pwsim ( Alignment *A, Sequence *S, char *mode) -{ - int a, b, c; - float d,t; - float **W; - Alignment *B; - W=declare_float (S->nseq, S->nseq); - - - - for (a=0; a< S->nseq; a++) - for ( b=a; bnseq; b++) - { - if ( a==b){d=1;} - else if (!A) - { - - B=align_two_sequences ((S)->seq[a], (S)->seq[b],"pam250mt", -10, -1, "fasta_pair_wise"); - for (t=0,d=0,c=0; clen_aln; c++) - { - d+=(B->seq_al[0][c]==B->seq_al[1][c] && !is_gap(B->seq_al[0][c])); - t+=(!is_gap(B->seq_al[0][c]) && !is_gap(B->seq_al[1][c])); - } - t=(strm ( mode, "pwsim_fragment"))?B->len_aln:t; - - d=d/((t==0)?1:t); - free_aln(B); - } - else - { - for (t=0,d=0,c=0; clen_aln; c++) - { - d+=(A->seq_al[a][c]==A->seq_al[b][c] && !is_gap(A->seq_al[a][c])); - t+=(!is_gap(A->seq_al[a][c]) && !is_gap(A->seq_al[b][c])); - } - d=d/((t==0)?1:t); - } - - - W[a][b]=W[b][a]=(1-d)*100; - } - - - return W; - -} - -float **seq2pwsim_fragment ( Alignment *A, Sequence *S, char *mode) -{ - - - int a, b, c; - float d,t; - float **W; - Alignment *B; - W=declare_float (S->nseq, S->nseq); - - - - - for (a=0; a< S->nseq; a++) - for ( b=a; bnseq; b++) - { - if ( a==b){d=1;} - else if (!A) - { - - B=align_two_sequences ((S)->seq[a], (S)->seq[b],"pam250mt", -10, -1, "fasta_pair_wise"); - for (t=0,d=0,c=0; clen_aln; c++) - { - d+=(B->seq_al[0][c]==B->seq_al[1][c] && !is_gap(B->seq_al[0][c])); - t+=(!is_gap(B->seq_al[0][c]) && !is_gap(B->seq_al[1][c])); - } - - d=d/((t==0)?1:t); - free_aln(B); - } - else - { - for (t=0,d=0,c=0; clen_aln; c++) - { - d+=(A->seq_al[a][c]==A->seq_al[b][c] && !is_gap(A->seq_al[a][c])); - t+=(!is_gap(A->seq_al[a][c]) && !is_gap(A->seq_al[b][c])); - } - d=d/((t==0)?1:t); - } - - - W[a][b]=W[b][a]=(1-d)*100; - } - - - return W; - -} - -/********************************************************************/ -/* */ -/* AMINO ACID FUNCTIONS */ -/* */ -/* */ -/* */ -/********************************************************************/ -//Builds an extended alphabet from a string -char** string2alphabet (char *string, int depth, int *falp_size) -{ - int max_s; - int a, b,c, l, n; - char buf[1000]; - char **alp; - int alp_size; - - char ***alp2; - int *alp2_size; - - int *array; - char **falp; - - - l=strlen (string); - array=vcalloc ( 256, sizeof (int)); - - - max_s=l+1; - falp_size[0]=0; - falp=declare_char (l+1, 2); - - alp=declare_char(l,2); - alp_size=0; - - array=vcalloc ( 256, sizeof (int)); - for (a=0;a0) - { - for ( c=0,b=0;b< 26; b++) - { - - if ( matrix[a][b]>0 && matrix[b][b]>0) - { - buf[c++]=b+'A'; - buf[c++]=b+'a'; - } - } - buf[c]='\0'; - for ( is_in=0,b=0; b< ngroup[0]; b++)if ( strcmp (buf, group_list[b])==0)is_in=1; - if (is_in==0)sprintf ( group_list[ngroup[0]++], "%s", buf); - - } - } - free_int (matrix, -1); - vfree (matrix_name); - - return group_list; - } -char** make_group_aa_upgma (char*matrix, int max_n) - { - char **group_list; - int **mat; - int *used; - int a, b, ba, bb, best, set, l, n; - l=26; - - group_list=declare_char (l+1, l+1); - for (a=0; amax_n) - { - for (set=0,a=0; abest) - { - best=mat[a][b]; - ba=a; - bb=b; - set=1; - } - } - - for (a=0; ac)?d[a]:c; - return c; - } - - - -int is_in_same_group_aa ( char r1, char r2, int n_group, char **gl, char *mode) - { - int a; - static char **lgl; - static int ln_group; - - char **gl2; - int n_group2; - - /*use mode=idmat for similarity based on id*/ - - r1=toupper(r1); - r2=toupper(r2); - if (mode==NULL)return (r1==r2)?1:0; - - if ( strm (mode, "clean")) - { - free_char (lgl, -1); - lgl=NULL; - ln_group=0; - return 0; - } - else if ( strstr (mode, "cov")) - { - return 1; - } - - if ( lgl==NULL) - { - lgl=make_group_aa ( &ln_group, mode); - } - - if ( gl==NULL) - { - gl2=lgl; - n_group2=ln_group; - } - else - { - gl2=gl; - n_group2=n_group; - } - - for ( a=0; a< n_group2; a++) - if ( is_in_set ( r1, gl2[a]) && is_in_set ( r2, gl2[a]))return 1; - return 0; - } - - -Alignment * gene2prot (Alignment *A){return A; } -char * test_gene2prot (Constraint_list *CL, int s1) - { - int a, b,q, nal; - int F=-10000000; /*FORBIDEN STATE*/ - int AL=0; /*ALLOWED STATE*/ - int SPLICE_PENALTY=1000; - int FRAME_PENALTY=1000; - - - int START, ORF1, ORF2, ORF3, s5NC; - int s3NC,ORF3_G1, ORF3_T2, ORF3_NC, ORF3_A3, ORF3_T4; - int U1_G1, U1_T2, U1_NC, U1_A3, U1_T4; - int U2_G1, U2_T2, U2_NC, U2_A3, U2_T4; - int U1, U2, U3, U4, U5, END; - - int nstate=0; - int **transitions; - int **v_tab; - int **v_tab_p; - int **last_coding; - int **last_t4; - int *potential; - int v; - - int orf1, orf2, orf3, ncp, p, state, pstate, e, best_state_p=0, best_state_v=0, best_pstate_p=0, best_pstate_v; - char *seq, *seq2, *seq3; - int l; - int *is_coding; - int *is_t4; - char *codon; - - static int *entry; - int tot=0; - - seq=vcalloc ( strlen ((CL->S)->seq[s1])+1, sizeof (char)); - seq2=vcalloc ( strlen ((CL->S)->seq[s1])+1, sizeof (char)); - seq3=vcalloc ( strlen ((CL->S)->seq[s1])+1, sizeof (char)); - sprintf ( seq, "%s", (CL->S)->seq[s1]); - ungap (seq); - - l=strlen (seq); - for ( a=0; a< l; a++) seq[a]=tolower ( seq[a]); - for ( a=0; a< l; a++) seq[a]=(seq[a]=='t')?'u': seq[a]; - - - potential=vcalloc (l+1, sizeof (int)); - CL=index_constraint_list ( CL); - for (nal=0, a=0; a<(CL->S)->nseq; a++) - for ( b=CL->start_index[s1][a]; b< CL->end_index[s1][a];b++) - { - entry=extract_entry(entry, b, CL); - if ( entry[SEQ1]==s1)potential[entry[R1]-1]+=entry[WE]; - else if ( entry[SEQ2]==s1)potential[entry[R2]-1]+=entry[WE]; - tot+=entry[WE]; - nal++; - } - - - SPLICE_PENALTY=10000; - FRAME_PENALTY=1000; - - - nstate=0; - START=nstate++; ORF1=nstate++; ORF2=nstate++; ORF3=nstate++; s5NC=nstate++; - s3NC=nstate++; - ORF3_G1=nstate++;U1_G1=nstate++;U2_G1=nstate++; - ORF3_T2=nstate++;U1_T2=nstate++;U2_T2=nstate++; - ORF3_NC=nstate++;U1_NC=nstate++;U2_NC=nstate++; - ORF3_A3=nstate++;U1_A3=nstate++;U2_A3=nstate++; - ORF3_T4=nstate++;U1_T4=nstate++;U2_T4=nstate++; - - - U1=nstate++; U2=nstate++; U3=nstate++; U4=nstate++; U5=nstate++; - END=nstate++; - - is_coding=vcalloc ( nstate, sizeof (int)); - is_coding[ORF1]=is_coding[ORF2]=is_coding[ORF3]=is_coding[U1]=is_coding[U2]=1; - is_coding[U3]=is_coding[U4]=is_coding[U5]=1; - - is_t4=vcalloc ( nstate, sizeof (int)); - is_t4[ORF3_T4]=is_t4[U1_T4]=is_t4[U2_T4]=1; - transitions=declare_int ( nstate, nstate); - for (a=0; a< nstate; a++) - for ( b=0; b< nstate; b++)transitions[a][b]=F; - - transitions[START][ORF1]=AL; - transitions[START][s5NC]=AL-FRAME_PENALTY; - transitions[s5NC][s5NC]=AL; - - transitions[s5NC][ORF1]=AL-FRAME_PENALTY; - - transitions[ORF1][ORF2]=AL; - transitions[ORF2][ORF3]=AL; - transitions[ORF3][U1]=AL; - transitions[ORF3][ORF1]=AL; - transitions[ORF3][ORF3_G1]=AL-SPLICE_PENALTY; - - - transitions[ORF3_G1][ORF3_T2]=AL; - transitions[ORF3_T2][ORF3_NC]=AL; - transitions[ORF3_NC][ORF3_NC]=AL; - transitions[ORF3_NC][ORF3_A3]=AL; - transitions[ORF3_A3][ORF3_T4]=AL; - transitions[ORF3_T4][ORF1]=AL-SPLICE_PENALTY; - - transitions[U1][U2]=AL; - transitions[U1][U1_G1]=AL-SPLICE_PENALTY; - transitions[U1_G1][U1_T2]=AL; - transitions[U1_T2][U1_NC]=AL; - transitions[U1_NC][U1_NC]=AL; - transitions[U1_NC][U1_A3]=AL; - transitions[U1_A3][U1_T4]=AL; - transitions[U1_T4][U3]=AL-SPLICE_PENALTY; - transitions[U3][U4]=AL; - transitions[U4][ORF1]=AL; - - transitions[U2][U2_G1]=AL-SPLICE_PENALTY; - transitions[U2_G1][U2_T2]=AL; - transitions[U2_T2][U2_NC]=AL; - transitions[U2_NC][U2_NC]=AL; - transitions[U2_NC][U2_A3]=AL; - transitions[U2_A3][U2_T4]=AL; - transitions[U2_T4][U5]=AL-SPLICE_PENALTY; - transitions[U5][ORF1]=AL; - - transitions[ORF3][s3NC]=AL-FRAME_PENALTY; - transitions[ORF3][END]=AL; - transitions[s3NC][END]=AL; - - - v_tab=declare_int ( l+1,nstate); - v_tab_p=declare_int ( l+1,nstate); - last_coding=declare_int ( l+1,nstate); - last_t4=declare_int ( l+1,nstate); - - for (a=0; a< l; a++) potential[a]-=200; - - codon=vcalloc ( 4, sizeof (char)); - best_pstate_p=START; - best_pstate_v=0; - nal=0; - for ( p=1; p<=l; p++) - { - if (translate_dna_codon (seq+(p-1), 'x')=='x' || p>(l-2))orf1=F; - else orf1=potential[p-1]; - - if (p<2 || translate_dna_codon (seq+(p-2), 'x')=='x' || p>(l-1))orf2=F; - else orf2=potential[p-1]; - - - if (p<3 || translate_dna_codon (seq+(p-3), 'x')=='x' || p>l)orf3=F; - else orf3=potential[p-1]; - - if ( best_int (3, 1, &a, orf1, orf2, orf3)!=F)ncp=-best_int (3, 1, &a, orf1, orf2, orf3); - else ncp=1000; - - for ( state=0; state< nstate; state++) - { - - if ( state==ORF1)e=orf1; - else if ( state==ORF2)e=orf2; - else if ( state==ORF3)e=orf3; - else if ( state>=U1 && state<=U3) - { - e=0; - } - else if ( state==U4) - { - codon[2]=seq[p-1]; - codon[1]=seq[last_coding[p-1][U3]-1]; - codon[0]=seq[last_coding[p-2][U1_T4]-1]; - if ( translate_dna_codon (codon, 'x')=='x')e=F; - else e=0; - } - else if ( state==U5) - { - codon[2]=seq[p-1]; - codon[1]=seq[last_coding[p-1][U2_T4]-1]; - q=seq[last_coding[p-1][U2_T4]]; - codon[0]=seq[last_coding[q-1][U1]-1]; - if ( translate_dna_codon (codon, 'x')=='x')e=F; - else e=0; - } - - else if (state>=ORF3_G1 && state<=U2_G1)e=(p=ORF3_T2 && state<=U2_T2) - { - e=(p>1 && seq[p-2]=='g' && seq[p-1]=='u')?ncp:F; - } - else if ( state>=ORF3_A3 && state<=U2_A3)e=(seq[p-1]=='a')?ncp:F; - else if ( state>=ORF3_T4 && state<=U2_T4)e=(seq[p-1]=='u')?ncp:F; - else e=ncp; - - for ( pstate=0; pstatebest_pstate_v) - {best_pstate_v=v;best_pstate_p=pstate;} - } - v_tab[p][state]=best_pstate_v; - v_tab_p[p][state]=best_pstate_p; - - if (!is_coding[state])last_coding[p][state]=last_coding[p-1][best_pstate_p]; - else if (is_coding[state])last_coding[p][state]=p; - - if (!is_t4[state]) - { - if (is_coding[state] && last_t4[p-1][best_pstate_p]==0)last_t4[p][state]=p; - else last_t4[p][state]=last_t4[p-1][best_pstate_p]; - } - else if (is_t4[state])last_t4[p][state]=p; - - if (state==0 ||best_pstate_v>best_state_v ){best_state_p=state; best_state_v=best_pstate_v;} - } - } - tot=0; - for ( p=l; p>0; p--) - { - if ( best_state_p>=ORF1 && best_state_p<=ORF3){seq2[tot++]=tolower (seq[p-1]);} - else if ( best_state_p>=U1 && best_state_p<=U5){seq2[tot++]=tolower (seq[p-1]);} - if (best_state_p==ORF1)seq[p-1]=toupper (seq[p-1]); - else if (best_state_p==ORF2 || best_state_p==ORF3)seq[p-1]=tolower (seq[p-1]); - else if ( best_state_p==ORF3_NC || best_state_p==U1_NC || best_state_p==U2_NC) seq[p-1]='.'; - else if ( best_state_p==U1 || best_state_p==U2 || best_state_p==U3 || best_state_p==U4 || best_state_p==U5) seq[p-1]=best_state_p-U1+'1'; - else seq[p-1]=toupper (seq[p-1]); - best_state_p=v_tab_p[p][best_state_p]; - } - - for ( a=0, b=tot-1; b>=0; b--, a++) - seq3[a]=seq2[b]; - - fprintf ( stderr, "\n%s\n", seq); - fprintf ( stderr, "\nN coding=%d\n", tot); - for ( a=0; a< tot; a+=3) - { - b=translate_dna_codon (seq3+a, 'x'); - fprintf ( stderr, "%c",b); - if ( b=='x'){fprintf ( stderr, "\n");myexit (EXIT_SUCCESS);} - } - - fprintf ( stderr, "\n"); - myexit (EXIT_SUCCESS); - return 0; - - - - } -Alignment * dna_aln2_3frame_cdna_aln(Alignment *A,int *ns,int **l_s) -{ - Alignment *B; - int a; - B=realloc_aln2 (NULL,6,strlen(A->seq_al[l_s[0][0]])+strlen(A->seq_al[l_s[1][0]])); - for ( a=0; a< 3; a++) - { - B->seq_al[a]=translate_dna_seq (A->seq_al[l_s[0][0]]+a, 0, 'o',B->seq_al[a]); - B->seq_al[a+3]=translate_dna_seq (A->seq_al[l_s[1][0]]+a, 0, 'o',B->seq_al[a+3]); - } - for ( a=1; a<3; a++) - { - if ( strlen(B->seq_al[a])seq_al[0])) B->seq_al[a]=strcat ( B->seq_al[a], "x"); - if ( strlen(B->seq_al[a+3])seq_al[3])) B->seq_al[a+3]=strcat ( B->seq_al[a+3], "x"); - } - - B->nseq=6; - B->len_aln=strlen (B->seq_al[0]); - return B; -} - -//JM_ADD -//For normal distribution scan -#ifndef PI -#define PI 3.141592653589793238462643 -#endif - -double normal(double x, double mean, double std) -{ - return (1/(std*sqrt(2.0*PI)))*exp((-0.5*(x-mean)*(x-mean))/(std*std)); -} - -int ** get_sim_aln_array_normal_distribution ( Alignment *A, char *mode, int *STD, int *CENTER) - { - int **w; - int a, b; - - - w=declare_int ( A->nseq, A->nseq); - - for ( a=0; a< A->nseq-1; a++) - { - for ( b=a+1; b< A->nseq; b++) - { - - w[a][b]=w[b][a]=generic_get_seq_sim_normal_distribution ( A->seq_al[a], A->seq_al[b], (A->cdna_cache)?A->cdna_cache[0]:NULL, mode, STD, CENTER); - } - } - return w; - } -int generic_get_seq_sim_normal_distribution ( char *seq1, char *seq2, int*cache, char *mode, int *STD, int *CENTER) -{ - return get_seq_sim_distribution ( seq1,seq2,GAP_LIST, mode, STD, CENTER); -} - -int get_seq_sim_distribution ( char *string1, char *string2, char *ignore, char *in_mode, int *STD, int *CENTER) - { - int len1; - int a; - int pos0, gap=0; - int p1, p2; - int r=0,r1=0,r2=0; - char *p; - char mode[1000]; - - double sim; - - - sprintf ( mode, "%s", in_mode); - - /*mode: __ - mat: idscore to get the alignment done - any legal cw matrix - sim_mode: sim1->identities/matches - sim2->identities/min len - */ - - - if ( (p=strstr (mode, "_"))!=NULL) - { - p[0]='\0'; - p++; - } - - - if (strstr (mode, "idscore")) - { - static int **mat; - if (!mat) mat=read_matrice ("blosum62mt"); - return idscore_pairseq (string1, string2, -12, -1, mat,mode); - } - - len1=strlen (string1); - for ( sim=pos0=0,a=0; a< len1; a++) - { - r1=string1[a]; - r2=string2[a]; - p1=1-is_in_set (r1, ignore); - p2=1-is_in_set (r2, ignore); - if (p1 && p2) - { - pos0++; - if (is_in_same_group_aa(r1,r2,0, NULL, mode)) - { - sim += normal(a, *CENTER, *STD); - } - } - else if (p1+p2==1) - { - gap++; - } - } - - if ( p==NULL || strm (p, "sim1") || strm (p, "sim")) - { - r=(pos0==0)?0:(sim*MAXID); - } -/* else if ( strm (p, "sim2")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MIN(pos1,pos2); - } - else if ( strm (p, "sim3")) - { - r=(pos1==0 || pos2==0)?0:(sim*MAXID)/MAX(pos1,pos2); - } - else if ( strm (p, "gap1")) - { - r=(len1==0)?MAXID:(gap*MAXID)/len1; - r=MAXID-r; - } - else if ( strm (p, "logid")) - { - r=logid_score (pos0, sim); - }*/ - return r; - - } - - -Alignment *aln2clean_pw_aln (Alignment *A, OveralnP *F)// char *mode, int t, int f, int p1,int p2, int p3, char *fsa_mode) -{ - int **C, **T; - int a, b, c; - Alignment *B; - - - if (F->t==0)F->t=2; - - C=declare_int ( A->nseq, A->len_aln); - T=declare_int ( A->nseq, A->len_aln); - B=copy_aln (A, NULL); - - for (a=0; a< A->nseq;a++) - { - for (b=0; bnseq; b++) - { - int *w; - w=pw_aln2clean_aln_weight (A->seq_al[a], A->seq_al[b], 1,F);//f,p1, p2, p3, fsa_mode); - for (c=0; clen_aln; c++) - { - if (A->seq_al[a][c]=='-')continue; - C[a][c]+=w[c]; - T[a][c]++; - } - vfree (w); - } - } - - - - for (a=0; anseq; a++) - { - for (b=0; blen_aln; b++) - { - int c; - c=A->seq_al[a][b]; - if ( c=='-'); - else if (T[a][b]==0); - else - { - int r; - r=(C[a][b]*10)/T[a][b]; - r=(r==10)?9:r; - if (!F->mode || strm (F->mode, "number")) - B->seq_al[a][b]='0'+r; - else if ( F->mode && strm (F->mode, "unalign")) - B->seq_al[a][b]='0'+r; - else if ( F->mode && strm (F->mode, "lower") ) - { - if (r<=F->t)B->seq_al[a][b]=tolower (B->seq_al[a][b]); - else B->seq_al[a][b]=toupper (B->seq_al[a][b]); - } - } - } - } - - if ( F->mode && strm (F->mode, "unalign")) - { - A=unalign_aln (A, B, F->t); - free_aln (B); - B=copy_aln (A, NULL); - } - - free_int (C, -1); - free_int (T, -1); - - return B; -} - -char **pw_aln2clean_pw_aln_fsa1 (char ** aln, OveralnP *F); -char **pw_aln2clean_pw_aln_fsa2 (char ** aln, OveralnP *F); - -int * pw_aln2clean_aln_weight ( char *seq1, char *seq2, int w, OveralnP *F) -{ - char **aln; - int *weight; - int l, a; - - if ( (l=strlen (seq1)) !=strlen (seq2)) - { - HERE ("\n%s\n%s\n", seq1, seq2); - printf_exit ( EXIT_FAILURE, stderr, "\nERROR: Comparing unaligned sequences [FATAL:%s]", PROGRAM); - - } - - aln=declare_char (2, l+1); - sprintf ( aln[0], "%s", seq1); - sprintf ( aln[1], "%s", seq2); - - - aln=pw_aln2clean_pw_aln (aln, F); - - weight=vcalloc (l+1, sizeof (int)); - for (a=0; amodel, "fsa2"))return pw_aln2clean_pw_aln_fsa2 (aln,F); - else if ( strm (F->model, "fsa1"))return pw_aln2clean_pw_aln_fsa1 (aln,F); - else return pw_aln2clean_pw_aln_fsa1 (aln,F); -} - -char **pw_aln2clean_pw_aln_fsa2 (char ** aln, OveralnP *FO) -{ - int a, b, c, d, l, id; - int c1, c2, e0, e1,tb, obs; - int T0, T1,T2; - int **mat, **tran, **p, **t, *s, *ids; - int ns, ps, cs; - int S, M1, M2, m1, m2,B1, B2,G1,G2, K; - int F=-9999999; - int MID_EXON_FACTOR=50; - int best; - static int **smat; - int model_type=1; - int *translate; - - if ( getenv ("MID_EXON_FACTOR"))MID_EXON_FACTOR=atoi (getenv ("MID_EXON_FACTOR")); - - - - if (!smat)smat=read_matrice ( "blosum62mt"); - - l=strlen (aln[0]); - - if ( l!=strlen (aln[1])) - { - printf_exit ( EXIT_FAILURE, stderr, "\nERROR: unaligned strings"); - } - - - - s=vcalloc (l, sizeof (int)); - ids=vcalloc (l, sizeof (int)); - - //record the id level of each posotion - for (b=0; b=2){id++; s[a]=1;} - else {s[a]=0;} - b++; - } - } - - if (b==0) - { - vfree(s);vfree (ids); - return aln; - } - - - - FO->p1=(FO->p1==0)?5:FO->p1; - FO->p2=(FO->p2==0)?15:FO->p2; - FO->p3=(FO->p3==0)?0:FO->p3; - FO->p4=(FO->p4==0)?100:FO->p4; - - - T1=100*(float)id/(float)b; - T2=(FO->f==0)?30:T1*(float)((float)FO->f/(float)100); - T2=MAX(T2,20); - - //0: unaligned - //1: aligned - //2: gap - //3: exon boundary - - ns=0; - S=ns++; - M1=ns++;//1 matched aligned - m1=ns++;//2 mmatched aligned - M2=ns++;//3 matched unaligned - m2=ns++;//4 mmatched unaligned - B1=ns++;//5 transition aligned - B2=ns++;//6 transition unaligned - - mat=declare_int (ns, 4); - tran=declare_int (ns, ns); - p=declare_int (l+1, ns); - t=declare_int (l+1, ns); - - //emission Values - mat[M1][0]=F; //non id - mat[M1][1]=T1;//id - mat[M1][2]=0; //gap - mat[M1][3]=F; //transition - - mat[M2][0]=F; - mat[M2][1]=T2; - mat[M2][2]=0; - mat[M2][3]=F; - - mat[m1][0]=100-T1; - mat[m1][1]=F; - mat[m1][2]=0; - mat[m1][3]=F; - - mat[m2][0]=100-T2; - mat[m2][1]=F; - mat[m2][2]=0; - mat[m1][3]=F; - - mat[B1][0]=F; - mat[B1][1]=F; - mat[B1][2]=F; - mat[B1][3]=0; - - mat[B2][0]=F; - mat[B2][1]=F; - mat[B2][2]=F; - mat[B2][3]=0; - - //transition values - tran[S][m1]=0; - tran[S][m2]=0; - tran[S][M1]=0; - tran[S][M2]=0; - tran[S][B1]=0; - tran[S][B2]=0; - - - tran[M1][m1]= 0; - tran[M1][m2]=-FO->p4; - tran[M1][M1]=+FO->p2; - tran[M1][M2]= F; - tran[M1][S ]= F; - tran[M1][B1]= 0; - tran[M1][B2]=-FO->p1; - - tran[M2][m1]= F; - tran[M2][m2]=+FO->p3; - tran[M2][M1]= F; - tran[M2][M2]= 0; - tran[M2][S] = F; - tran[M2][B1]= F; - tran[M2][B2]= 0; - - - tran[m1][m1]= 0; - tran[m1][m2]= F; - tran[m1][M1]= 0; - tran[m1][M2]= F; - tran[m1][S] = F; - tran[m1][B1]= 0; - tran[m1][B2]=-FO->p1; - - tran[m2][m1]= F; - tran[m2][m2]= 0; - tran[m2][M1]= -FO->p4; - tran[m2][M2]= +FO->p3; - tran[m2][S] = F; - tran[m2][B1]= F; - tran[m2][B2]= 0; - - tran[B1][m1]= 0; - tran[B1][m2]= F; - tran[B1][M1]= 0; - tran[B1][M2]= F; - tran[B1][S]= F; - tran[B1][B1]= F; - tran[B1][B2]= F; - - tran[B2][m1]= -FO->p1; - tran[B2][m2]= 0; - tran[B2][M1]= -FO->p1; - tran[B2][M2]= 0; - tran[B2][S]= F; - tran[B2][B1]= F; - tran[B2][B2]= F; - - translate=vcalloc (ns, sizeof (int)); - translate[M1]=1; - translate[m1]=1; - translate[M2]=0; - translate[m2]=0; - translate[B1]=1; - translate[B2]=0; - - for (a=1;a<=l; a++) - { - obs=s[a-1]; - - for (cs=0; cs=best){t[a][cs]=ps;best=p[a][cs]=c;} - } - - } - } - - - for (a=0; a=best){tb=a;best=p[l][a];} - } - - for (a=l; a>0; a--) - { - int v; - int p2; - - p2=a-1; - aln[0][p2]=aln[1][p2]=translate[tb]; - tb=t[a][tb]; - - } - - free_int (p, -1); - vfree(s); - free_int (t, -1); - free_int (mat, -1); - free_int (tran, -1); - vfree (translate); - return aln; -} -char **pw_aln2clean_pw_aln_fsa1 (char ** aln, OveralnP *FO) -{ - int a, b, c, d, l, id; - int c1, c2, e0, e1,tb, obs; - int T0, T1,T2; - int **mat, **tran, **p, **t, **s; - int ns, ps, cs; - int S, M1, M2, m1, m2, K; - int F=-9999999; - int best; - static int **smat; - int *translate; - - - if (!smat)smat=read_matrice ( "blosum62mt"); - - l=strlen (aln[0]); - - if ( l!=strlen (aln[1])) - { - printf_exit ( EXIT_FAILURE, stderr, "\nERROR: unaligned strings"); - } - - - s=declare_int (l+1, 2); - for (id=0,b=0,a=0;a=2){id++; s[b][0]=1;} - else {s[b][0]=0;} - s[b][1]=a; - b++; - - } - } - if (b==0) - { - free_int (s, -1); - return aln; - } - FO->f=(FO->f==0)?30:FO->f; - FO->p1=(FO->p1==0)?90:FO->p1; - FO->p2=(FO->p2==0)?15:FO->p2; - FO->p3=(FO->p3==0)?0:FO->p3; - - l=b;//length of the ungapped aln - T1=100*(float)id/(float)b; - T2=FO->f;//T1*f; - - - - //0: unaligned - //1: aligned - - - ns=0; - S=ns++; - M1=ns++;//1 matched aligned - m1=ns++;//2 mmatched aligned - M2=ns++;//3 matched unaligned - m2=ns++;//4 mmatched unaligned - - mat=declare_int (ns, 2); - tran=declare_int (ns, ns); - p=declare_int (l+1, ns); - t=declare_int (l+1, ns); - - - mat[M1][0]=F; - mat[M1][1]=T1; - - mat[M2][0]=F; - mat[M2][1]=T2; - - mat[m1][0]=100-T1; - mat[m1][1]=F; - - mat[m2][0]=100-T2; - mat[m2][1]=F; - - - tran[S][m1]=0; - tran[S][m2]=0; - tran[S][M1]=0; - tran[S][M2]=0; - - - tran[M1][m1]= 0; - tran[M1][m2]=-FO->p1;// -P; - tran[M1][M1]=+FO->p2; - tran[M1][M2]= F; - tran[M1][S] = F; - - tran[M2][m1]= F; - tran[M2][m2]=+FO->p3; - tran[M2][M1]= F; - tran[M2][M2]= 0; - tran[M2][S]= F; - - tran[m1][m1]= 0; - tran[m1][m2]= F; - tran[m1][M1]= 0; - tran[m1][M2]= F; - tran[m1][S]= F; - - tran[m2][m1]= F; - tran[m2][m2]= 0; - tran[m2][M1]=-FO->p1; - tran[m2][M2]=+FO->p3; - tran[m2][S]= F; - - translate=vcalloc (ns, sizeof (int)); - translate[M1]=1; - translate[m1]=1; - translate[M2]=0; - translate[m2]=0; - translate[S]=1; - - - for (a=1;a<=l; a++) - { - obs=s[a-1][0]; - - for (cs=0; cs=best){t[a][cs]=ps;best=p[a][cs]=c;} - } - - } - } - - - for (a=0; a=best){tb=a;best=p[l][a];} - } - for (a=l; a>0; a--) - { - int p2=s[a-1][1]; - aln[0][p2]=aln[1][p2]=translate[tb]; - - tb=t[a][tb]; - } - - - free_int (p, -1); - free_int (s, -1); - free_int (t, -1); - free_int (mat, -1); - free_int (tran, -1); - vfree (translate); - return aln; -} -float* analyze_overaln ( Alignment *iA, Alignment *iB, char *mode, int filter, int f, int p1,int p2, int p3) -{ - Alignment *C, *D; - Alignment *A, *B; - OveralnP *F; - - F=vcalloc (1, sizeof (OveralnP)); - F->p1=p1; - F->p2=p2; - F->p3=p3; - F->f=f; - F->t=filter; - sprintf (F->mode, "%s", mode); - - - float *r; - A=copy_aln (iA, NULL); - B=copy_aln (iB, NULL); - - C=aln2gap_cache (A,0); - A=filter_aln_upper_lower (A, C, 0, 0); - D=aln2clean_pw_aln (B, F); - r=aln2pred (A,D,mode); - free_aln (C); - free_aln (D); - free_aln (A); - free_aln (B); - return r; -} -float* aln2pred ( Alignment *A, Alignment*B, char *mode) -{ - int a, b, c, d, i, l, salp, s, n; - static char **list, *buf1, *buf2, *alp, *alp_lu; - static int ***r; - int T, N; - int fp, fn, tn, tp; - int tfp, tfn, ttn, ttp; - float sp, sn, sen2, best, result; - int print=1; - float *fresult; - - fresult=vcalloc ( 3, sizeof (float)); - - if ( mode && strstr (mode, "case")) - { - A=aln2case_aln (A,"u","l"); - B=aln2case_aln (B,"u","l"); - } - - if (mode && strstr (mode, "printaln")) - { - Sequence *S; - Alignment *C; - S=aln2seq (A); - C=copy_aln (B, NULL); - for (a=0; anseq; a++) - { - i=name_is_in_list (C->name[a], S->name, S->nseq, 100); - if ( i==-1) - for (b=0; blen_aln; b++) C->seq_al[a][b]='-'; - else - for (d=0,b=0; blen_aln; b++) - { - if ( !is_gap (C->seq_al[a][b])) - { - if (C->seq_al[a][b]==S->seq[i][d])C->seq_al[a][b]=toupper(C->seq_al[a][b]); - d++; - } - } - } - print_aln (C); - } - - vfree (alp);vfree (alp_lu); - alp=vcalloc ( 256, sizeof (char)); - alp_lu=vcalloc ( 256, sizeof (char)); - - for (c=0; c<2; c++) - { - Alignment *AL; - AL=(c==0)?A:B; - for (salp=0,a=0; anseq; a++) - { - for (b=0; blen_aln; b++) - { - c=AL->seq_al[a][b]; - if (!is_gap(c) && !alp[c]) - { - salp++; - alp_lu[salp]=c; - alp[c]=salp; - } - } - } - } - - vfree (buf1); vfree(buf2); - buf1=vcalloc ( A->len_aln+1, sizeof (char)); - buf2=vcalloc ( B->len_aln+1, sizeof (char)); - - free_arrayN ((void **)r, 3); - r=declare_arrayN(3, sizeof (int),A->nseq,salp+1,salp+1); - free_char ( list, -1); - list=declare_char ( A->nseq, 100); - for (n=0,a=0; a< A->nseq; a++) - { - for ( b=0; bnseq; b++) - { - if ( strm (A->name[a], B->name[b])) - { - sprintf ( buf1, "%s", A->seq_al[a]); - sprintf ( buf2, "%s", B->seq_al[b]); - ungap (buf1); ungap (buf2); - if ((l=strlen (buf1))!=strlen (buf2))continue; - else - { - sprintf ( list[n], "%s", A->name[a]); - for (c=0; c%s S=%c sp=%6.2f sn=%6.2f sen2=%6.2f best=%6.2f\n", list[a],alp_lu[s],sp, sn, sen2, best); - } - - rates2sensitivity (ttp, ttn, tfp, tfn, &sp, &sn, &sen2, &best); - if (mode && strstr (mode, "printstat"))fprintf ( stdout, ">TOT S=%c sp=%6.2f sn=%6.2f re=%6.2f best=%6.2f\n", alp_lu[s],sp, sn, sen2, best); - - if ( mode && strstr (mode, type)) - { - fresult[0]=sn; - fresult[1]=sp; - fresult[2]=sen2; - } - } - return fresult; -} - -Alignment * mark_exon_boundaries (Alignment *A, Alignment *E) -{ - char *buf, *buf2; - int a, b, c, i, l; - - buf2=vcalloc ( E->len_aln+1, sizeof (char)); - buf =vcalloc ( E->len_aln+1, sizeof (char)); - - for (a=0; a< A->nseq; a++) - { - i=name_is_in_list (A->name[a], E->name, E->nseq, 100); - if ( i==-1) continue; - sprintf (buf, "%s", E->seq_al[i]); - ungap (buf); - l=strlen (buf); - //clean buf2 - for (c=0, b=0; b=1)buf2[c-1]=tolower(buf2[c-1]); - else if (buf[b]=='j' &&clen_aln; b++) - { - if (!is_gap(A->seq_al[a][b])) - { - A->seq_al[a][b]=buf2[c++]; - } - } - } - vfree (buf); - vfree (buf2); - return A; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/define_header.h b/binaries/src/tcoffee/t_coffee_source/define_header.h deleted file mode 100644 index 64fbbf8..0000000 --- a/binaries/src/tcoffee/t_coffee_source/define_header.h +++ /dev/null @@ -1,702 +0,0 @@ -/*DEBUGGING*/ -/*#include "mshell.h"*/ -/*MEMORY MANAGEMENT*/ -#include -#define MY_EPS 1000*DBL_EPSILON -//Maximum number of tries for interactibve things -#define MAX_N_TRIES 3 - -//Maximum CACHE and Temporary file size and age (Mb and days, 0: unlimited) -#define TMP_MAX_SIZE 0 -#define TMP_MAX_KEEP 10 -#define CACHE_MAX_SIZE 2000 -#define CACHE_MAX_KEEP 180 -#define MAX_N_PID 65536 -//Importnat Values Affecting the Program Behavior -#define SCORE_K 10 -#define NORM_F 1000 -#define PAVIE_MAT_FACTOR 1000 -#define MAXID 100 -#define CLEAN_FUNCTION NULL -#define MINSIM_4_TCOFFEE 25 //The minimum similarity between a sequence and its PDB template -#define MINCOV_4_TCOFFEE 25 //The minimum similarity between a sequence and its PDB template - - -#define TRACE_TYPE int -#define MAX_LEN_FOR_DP 600 - - -#define GIVE_MEMORY_BACK 0 -#define MEMSET0 1 -#define NO_MEMSET0 0 -/*OUTPUT DEFINITIONS*/ -#define NO_COLOR_RESIDUE 127 -#define NO_COLOR_GAP 126 -#define CLOSE_HTML_SPAN -1 -/*SPECIAL_CODES*/ -#define GAP_CODE 60 -/*TYPE DEFINITIONS*/ - -//Formats -#define BLAST_XML 100 -#define BLAST_TXT 101 - -/*SWITCHES*/ - - -#define USED 1 -#define UNUSED 2 - - -#define TEMPLATES 1 -#define NOTEMPLATES 0 - -#define EXTEND 1 -#define RESIZE 2 - -#define SEN 0 -#define SPE 1 -#define REC 2 -#define SEN2 2 - -#define ALL 1 -#define SEGMENTS 2 -#define DIAGONALS 3 - -#define START_STATE 0 -#define END_STATE 1 - -#define KEEP_CASE 2 /*Hard set in several places*/ -#define LOWER_CASE 0 -#define UPPER_CASE 1 -#define CHANGE_CASE 3 -#define KEEP_GAP 0 -#define RM_GAP 1 - -#define KEEP_NAME 1 - -#define CHECK 0 -#define NO_CHECK 1 -#define FORCE 2 -#define STORE 3 -#define FLUSH 4 - - -#define ON 8 -#define OFF 9 -#define LOCKED_ON 10 -#define LOCKED_OFF 11 - -#define YES 12 -#define NO 13 -#define MAYBE 14 - -#define NEVER 15 -#define ALWAYS 16 -#define SOMETIMES 17 - -#define UPPER 18 -#define LOWER 19 -#define DELETE 20 -#define SWITCHCASE 21 - -#define VECTOR 22 -#define NON_VECTOR 23 -#define NON_PROFILE 24 -#define BOOTSTRAP 25 - -#define HEADER 26 -#define NO_HEADER 27 - -#define VERY_VERBOSE 28 -#define VERBOSE 29 -#define SHORT 30 -#define VERY_SHORT 31 - -#define OVERLAP 32 -#define NO_OVERLAP 33 - -#define PRINT 34 -#define NO_PRINT 35 - -#define FREE_ALN 36 -#define DECLARE_ALN 37 -#define EXTRACT_ALN 38 -#define CLEAN 39 -#define INTERACTIVE 40 -#define NON_INTERACTIVE 41 -#define PAD 42 -#define NO_PAD 43 - -#define SET 44 -#define UNSET 45 -#define RESET 48 -#define ISSET 49 -#define GET 50 - -#define ENV 52 - -#define GOP 0 -#define GCP 1 -#define GEP 2 - -#define BOTTOM 0 -#define TOP 1 - -#define FORWARD -1 -#define BACKWARD 1 - -#define GO_LEFT -1 -#define GO_RIGHT 1 - -#define LOCAL 1 -#define GLOBAL 2 -#define LALIGN 3 -#define MOCCA 4 - -#define TRUE 1 -#define FALSE 0 - -#define NEW 1 -#define OLD 0 - -#define RANDOM 0 -#define DETERMINISTIC 1 - -#define GREEDY 1 -#define NON_GREEDY 0 - -#define IS_FATAL 1 -#define IS_NOT_FATAL 0 -#define NO_REPORT 2 -#define INSTALL 3 -#define INSTALL_OR_DIE 4 - -#define OPTIONAL 1 -#define NON_OPTIONAL 0 - -#define GV_MAXIMISE 1 -#define GV_MINIMISE 0 - -#define MAXIMISE 1 -#define MINIMISE 0 - -#define ALLOWED 0 -#define FORBIDEN -99999999 -#define END_ARRAY -99999990 -#define SOFT_COPY 1 -#define HARD_COPY 2 - -#define VERY_SLOW 0 -#define SLOW 1 -#define FAST 2 -#define VERY_FAST 3 -#define SUPER_FAST 4 -#define ULTRA_FAST 5 - -#define CODE 1 -#define DECODE 2 -#define CODELIST 3 - -/*Identity measure*/ -#define UNGAPED_POSITIONS 1 -#define ALIGNED_POSITIONS 2 -#define AVERAGE_POSITIONS 3 -#define NOMATRIX NULL -#define NOGROUP NULL -#define NOALN NULL - -/*SIZE DEFINITIONS*/ -#define SIZE_OF_INT 10 -#define UNDEFINED FORBIDEN -#define UNDEFINED_INT UNDEFINED -#define UNDEFINED_FLOAT UNDEFINED -#define UNDEFINED_DOUBLE UNDEFINED -#define UNDEFINED_CHAR 125 -#define UNDEFINED_SHORT -125 -#define UNDEFINED_2 0 -#define UNDEFINED_RESIDUE '>' - - - -#define FACTOR 1 -#define MAX_N_SEQ 1 -#define MAX_N_ALN 1 -#define MAX_LEN_ALN 1 -#define MAX_N_LIST 100 - -#define COMMENT_SIZE 1000 -#define MAXNAMES 100 -#define FILENAMELEN 500 /* Max. file name length */ -#define MAX_N_PARAM 2000 -#define MAX_PARAM_LEN 200 -#define MAX_LINE_LENGTH 10000 -#define ALN_LINE_LENGTH 60 -#define SHORT_STRING 10 -#define STRING 300 -#define LONG_STRING 1000 -#define VERY_LONG_STRING 10000 - -#define AA_ALPHABET "acdefghiklmnpqrstvwy-ACDEFGHIKLMNPQRSTVWY" -#define DNA_ALPHABET "AGCTUNRYMKSWHBVD-agctunrymkswhbvd" -#define RNAONLY_ALPHABET "Uu" -#define BLAST_AA_ALPHABET "arndcqeghilkmfpstwyvbzx*" -#define NAMES_ALPHABET "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_|�-!%@&#-+=." - -#define SIZEOF_AA_MAT 60 -#define GAP_LIST "-.#*~" -#define SSPACE " " - -#define MATCH 1 -#define UNALIGNED 2 -#define GAP 3 - -#define MNE 3 -#define CODE4PROTEINS 10 -#define CODE4DNA 20 - -#define STOCKHOLM_CHAR 'z' -#define STOCKHOLM_STRING "z" - - -/*CODE SHORT CUTS*/ - -/*1-COMMAND LINE PROCESSING*/ -#define GET_COMMAND_LINE_INFO ((strncmp ( argv[1], "-h",2)==0)||(strncmp ( argv[1], "-man",4)==0)||(strncmp ( argv[1], "-",1)!=0)) -#define NEXT_ARG_IS_FLAG ((argc<=(a+1)) ||(( argv[a+1][0]=='-') && !(is_number(argv[a+1])))) - - -/*UTIL MACROS*/ -#define BORDER(p1,l1,p2,l2) ((p1==0 || p2==0 || p1==l1 || p2==l2)?1:0) -#define GET_CASE(f,c) ((f==UPPER_CASE)?toupper(c):((f==LOWER_CASE)?tolower(c):c)) - -#define SWAP(x,y) {x=x+y;y=x+y; x=y-x; y=y-2*x;} -#define SWAPP(x,y,tp) {tp=y;y=x;x=tp;} - -#define MAX(x, y) (((x) >(y)) ? (x):(y)) -#define MAX2(x, y) (((x) >(y)) ? (x):(y)) -#define MAX3(x,y,z) (MAX(MAX(x,y),z)) -#define MAX4(a,b,c,d) (MAX(MAX(a,b),MAX(c,d))) -#define MAX5(a,b,c,d,e) (MAX2((MAX3(a,b,c)),(MAX2(d,e)))) -#define MAX6(a,b,c,d,e,f) (MAX2((MAX3(a,b,c)),(MAX3(c,d,e)))) - -#define MIN(x, y) (((x) <(y)) ? (x):(y)) -#define FABS(x) ((x<0)?(-x):(x)) -#define is_defined(x) ((x==UNDEFINED)?0:1) -#define a_better_than_b(x,y,m) ((m==1)?(((x)>(y))?1:0):(((x)<(y))?1:0)) -#define is_in_range(x,min,max) ((x>=min && x<=max)?1:0) -/*#define bod_a_b(x,y,m) ((m==1)?(MAX((x),(y))):(MIN((x),(y)))) -#define bo_a_b(x,y,m) ((x==UNEFINED)?y:((y==UNDEFINED)?x:bod_a_b(y,y,m))) -#define best_of_a_b(x,y,m) ((x==UNDEFINED && y==UNDEFINED)?(UNDEFINED):(bo_a_b(x,y,m))) -*/ - - -#define DIE(x) HERE(x);exit(0); -#define best_of_a_b(x,y,m) ((m==1)?(MAX((x),(y))):(MIN((x),(y)))) - -#define strm(x,y) ((vstrcmp((x),(y))==0)?1:0) -#define strnm(x,y,n) ((vstrncmp((x),(y),(n))==0)?1:0) -#define strm2(a,b,c) (strm(a,b) || strm(a,c)) -#define strm3(a,b,c,d) (strm2(a,b,c) || strm(a,d)) -#define strm4(a,b,c,d,e) (strm2(a,b,c) || strm2(a,d,e)) -#define strm5(a,b,c,d,e,f) (strm2(a,b,c) || strm3(a,d,e,f)) -#define strm6(a,b,c,d,e,f,g) (strm3(a,b,c,d) || strm3(a,e,f,g)) -#define declare_name(x) (x=vcalloc (MAX(FILENAMELEN,L_tmpnam)+1, sizeof (char))) -#define is_parameter(x) (x[0]=='-' && !isdigit(x[1])) - -/*Freing functions*/ -#define free_2(a, b) free(a);free(b) -#define free_1(a) free(a) -#define free_3(a, b, c) free_2(a,b);free_1(c) -#define free_4(a, b, c,d) free_2(a,b);free_2(c,d) -#define free_5(a, b, c,d,e) free_3(a,b,e);free_2(c,d) -#define free_6(a, b, c,d,e,f) free_3(a,b,e);free_3(c,d,f) -#define free_7(a, b, c,d,e,f,g) free_3(a,b,e);free_4(c,d,f,g) -/*2-FILE PARSING*/ -#define SEPARATORS "\n \t,;" -#define LINE_SEPARATOR "\n#TC_LINE_SEPARATOR\n" -#define TC_REC_SEPARATOR "#### TC REC SEPARATOR ###" - -/*END 1-*/ - - -/*WIDOWS/UNIX DISTINCTIONS -#if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__) || defined(__MSDOS__) || defined(__DOS__) || defined(__NT__) || defined(__WIN32__) -#define WIN32 -#define TO_NULL_DEVICE " >nul" -#define NULL_DEVICE "nul" -#define CWF "/" -#else -#define TO_NULL_DEVICE " >/dev/null 2>&1" -#define NULL_DEVICE "/dev/null" -*/ - -#if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__) || defined(__MSDOS__) || defined(__DOS__) || defined(__NT__) || defined(__WIN32__) -#define WIN32 -#define TO_NULL_DEVICE " >>t_coffee.log" -#define NULL_DEVICE "t_coffee.log" -#define CWF "/" /*ClustalW Flag*/ -#else -#define TO_NULL_DEVICE " >>/dev/null 2>&1" -#define NULL_DEVICE "/dev/null" - - -#define CWF "-" /*ClustaW Flag*/ -#endif - -/*Generic Data*/ -#define EMAIL "cedric.notredame@europe.com" -#define URL "http://www.tcoffee.org" - -#define PERL_HEADER "#!/usr/bin/env perl" - -//Optimize the Score Computation in DP -#define TC_SCORE_2(x,y) (SCORE_K*CL->M[Aln->seq_al[l_s[0][0]][x]-'A'][Aln->seq_al[l_s[1][0]][y]-'A']-SCORE_K*CL->nomatch) -#define TC_SCORE_N(x,y) ((CL->get_dp_cost)(Aln, pos, ns[0], l_s[0], x, pos, ns[1], l_s[1], y, CL)) -#define TC_SCORE(x,y) ((CL->get_dp_cost==slow_get_dp_cost && CL->evaluate_residue_pair==evaluate_matrix_score && ns[0]+ns[1]==2 && x>=0 && j>=0)? (TC_SCORE_2(x,y)):(TC_SCORE_N(x,y))) - -#define NULL_2 NULL,NULL -#define NULL_3 NULL_2,NULL -#define NULL_4 NULL_2,NULL_2 -#define NULL_5 NULL_3,NULL_2 -#define NULL_6 NULL_4,NULL_2 -#define NULL_7 NULL_5,NULL_2 -/* PROGRAM PATH */ - -#define ADDRESS_BUILT_IN "built_in" -#define PROGRAM_BUILT_IN "t_coffee" -#define TEST_WWWSITE_4_TCOFFEE "www.google.com" -#define TCOFFEE_4_TCOFFEE "t_coffee" -#define TCOFFEE_type "sequence_multiple_aligner" -#define TCOFFEE_ADDRESS "http://www.tcoffee.org" -#define TCOFFEE_language "C" -#define TCOFFEE_language2 "C" -#define TCOFFEE_source "http://www.tcoffee.org/Packages/T-COFFEE_distribution.tar.gz" -#define TCOFFEE_update_action "always" -#define TCOFFEE_mode "tcoffee,mcoffee,rcoffee,expresso,3dcoffee" -#define CLUSTALW2_4_TCOFFEE "clustalw2" -#define CLUSTALW2_type "sequence_multiple_aligner" -#define CLUSTALW2_ADDRESS "http://www.clustal.org" -#define CLUSTALW2_language "C++" -#define CLUSTALW2_language2 "CXX" -#define CLUSTALW2_source "http://www.clustal.org/download/2.0.10/clustalw-2.0.10-src.tar.gz" -#define CLUSTALW2_mode "mcoffee,rcoffee" -#define CLUSTALW_4_TCOFFEE "clustalw" -#define CLUSTALW_type "sequence_multiple_aligner" -#define CLUSTALW_ADDRESS "http://www.clustal.org" -#define CLUSTALW_language "C" -#define CLUSTALW_language2 "C" -#define CLUSTALW_source "http://www.clustal.org/download/1.X/ftp-igbmc.u-strasbg.fr/pub/ClustalW/clustalw1.82.UNIX.tar.gz" -#define CLUSTALW_mode "mcoffee,rcoffee" -#define DIALIGNT_4_TCOFFEE "dialign-t" -#define DIALIGNT_type "sequence_multiple_aligner" -#define DIALIGNT_ADDRESS "http://dialign-tx.gobics.de/" -#define DIALIGNT_DIR "/usr/share/dialign-tx/" -#define DIALIGNT_language "C" -#define DIALIGNT_language2 "C" -#define DIALIGNT_source "http://dialign-tx.gobics.de/DIALIGN-TX_1.0.1.tar.gz" -#define DIALIGNT_mode "mcoffee" -#define DIALIGNT_binary "dialign-t" -#define DIALIGNTX_4_TCOFFEE "dialign-tx" -#define DIALIGNTX_type "sequence_multiple_aligner" -#define DIALIGNTX_ADDRESS "http://dialign-tx.gobics.de/" -#define DIALIGNTX_DIR "/usr/share/dialign-tx/" -#define DIALIGNTX_language "C" -#define DIALIGNTX_language2 "C" -#define DIALIGNTX_source "http://dialign-tx.gobics.de/DIALIGN-TX_1.0.1.tar.gz" -#define DIALIGNTX_mode "mcoffee" -#define DIALIGNTX_binary "dialign-tx" -#define POA_4_TCOFFEE "poa" -#define POA_type "sequence_multiple_aligner" -#define POA_ADDRESS "http://www.bioinformatics.ucla.edu/poa/" -#define POA_language "C" -#define POA_language2 "C" -#define POA_source "http://downloads.sourceforge.net/poamsa/poaV2.tar.gz" -#define POA_DIR "/usr/share/" -#define POA_FILE1 "blosum80.mat" -#define POA_mode "mcoffee" -#define POA_binary "poa" -#define PROBCONS_4_TCOFFEE "probcons" -#define PROBCONS_type "sequence_multiple_aligner" -#define PROBCONS_ADDRESS "http://probcons.stanford.edu/" -#define PROBCONS_language2 "CXX" -#define PROBCONS_language "C++" -#define PROBCONS_source "http://probcons.stanford.edu/probcons_v1_12.tar.gz" -#define PROBCONS_mode "mcoffee" -#define PROBCONS_binary "probcons" -#define MAFFT_4_TCOFFEE "mafft" -#define MAFFT_type "sequence_multiple_aligner" -#define MAFFT_ADDRESS "http://align.bmr.kyushu-u.ac.jp/mafft/online/server/" -#define MAFFT_language "C" -#define MAFFT_language "C" -#define MAFFT_source "http://align.bmr.kyushu-u.ac.jp/mafft/software/mafft-6.603-with-extensions-src.tgz" -#define MAFFT_windows "http://align.bmr.kyushu-u.ac.jp/mafft/software/mafft-6.603-mingw.tar" -#define MAFFT_mode "mcoffee,rcoffee" -#define MAFFT_binary "mafft.tar.gz" -#define MUSCLE_4_TCOFFEE "muscle" -#define MUSCLE_type "sequence_multiple_aligner" -#define MUSCLE_ADDRESS "http://www.drive5.com/muscle/" -#define MUSCLE_language "C++" -#define MUSCLE_language2 "GPP" -#define MUSCLE_source "http://www.drive5.com/muscle/downloads3.6/muscle3.6_src.tar.gz" -#define MUSCLE_windows "http://www.drive5.com/muscle/downloads3.6/muscle3.6_win32.zip" -#define MUSCLE_linux "http://www.drive5.com/muscle/downloads3.6/muscle3.6_linux_ia32.tar.gz" -#define MUSCLE_mode "mcoffee,rcoffee" -#define PCMA_4_TCOFFEE "pcma" -#define PCMA_type "sequence_multiple_aligner" -#define PCMA_ADDRESS "ftp://iole.swmed.edu/pub/PCMA/" -#define PCMA_language "C" -#define PCMA_language2 "C" -#define PCMA_source "ftp://iole.swmed.edu/pub/PCMA/pcma.tar.gz" -#define PCMA_mode "mcoffee" -#define KALIGN_4_TCOFFEE "kalign" -#define KALIGN_type "sequence_multiple_aligner" -#define KALIGN_ADDRESS "http://msa.cgb.ki.se" -#define KALIGN_language "C" -#define KALIGN_language2 "C" -#define KALIGN_source "http://msa.cgb.ki.se/downloads/kalign/current.tar.gz" -#define KALIGN_mode "mcoffee" -#define AMAP_4_TCOFFEE "amap" -#define AMAP_type "sequence_multiple_aligner" -#define AMAP_ADDRESS "http://bio.math.berkeley.edu/amap/" -#define AMAP_language "C++" -#define AMAP_language2 "CXX" -#define AMAP_source "http://baboon.math.berkeley.edu/amap/download/amap.2.2.tar.gz" -#define AMAP_mode "mcoffee" -#define PRODA_4_TCOFFEE "proda" -#define PRODA_type "sequence_multiple_aligner" -#define PRODA_ADDRESS "http://proda.stanford.edu" -#define PRODA_language "C++" -#define PRODA_language2 "CXX" -#define PRODA_source "http://proda.stanford.edu/proda_1_0.tar.gz" -#define PRODA_mode "mcoffee" -#define PRANK_4_TCOFFEE "prank" -#define PRANK_type "sequence_multiple_aligner" -#define PRANK_ADDRESS "http://www.ebi.ac.uk/goldman-srv/prank/" -#define PRANK_language "C++" -#define PRANK_language2 "CXX" -#define PRANK_source "http://www.ebi.ac.uk/goldman-srv/prank/src/old/prank.src.081202.tgz" -#define PRANK_mode "mcoffee" -#define SAP_4_TCOFFEE "sap" -#define SAP_type "structure_pairwise_aligner" -#define SAP_ADDRESS "http://mathbio.nimr.mrc.ac.uk/wiki/Software" -#define SAP_language "C" -#define SAP_language2 "C" -#define SAP_source "http://www.tcoffee.org/Packages/sap_distribution_TCC_0.6.tar.gz" -#define SAP_mode "expresso,3dcoffee" -#define TMALIGN_4_TCOFFEE "TMalign" -#define TMALIGN_type "structure_pairwise_aligner" -#define TMALIGN_ADDRESS "http://zhang.bioinformatics.ku.edu/TM-align/TMalign.f" -#define TMALIGN_language "Fortran" -#define TMALIGN_language2 "Fortran" -#define TMALIGN_source "http://zhang.bioinformatics.ku.edu/TM-align/TMalign.f" -#define TMALIGN_linux "http://zhang.bioinformatics.ku.edu/TM-align/TMalign_32.gz" -#define TMALIGN_mode "expresso,3dcoffee" -#define MUSTANG_4_TCOFFEE "mustang" -#define MUSTANG_type "structure_pairwise_aligner" -#define MUSTANG_ADDRESS "http://www.cs.mu.oz.au/~arun/mustang" -#define MUSTANG_language "C++" -#define MUSTANG_language2 "CXX" -#define MUSTANG_source "http://www.cs.mu.oz.au/~arun/mustang/mustang_v.3.tgz" -#define MUSTANG_mode "expresso,3dcoffee" -#define LSQMAN_4_TCOFFEE "lsqman" -#define LSQMAN_type "structure_pairwise_aligner" -#define LSQMAN_ADDRESS "empty" -#define LSQMAN_language "empty" -#define LSQMAN_language2 "empty" -#define LSQMAN_source "empty" -#define LSQMAN_update_action "never" -#define LSQMAN_mode "expresso,3dcoffee" -#define ALIGN_PDB_4_TCOFFEE "align_pdb" -#define ALIGN_PDB_type "structure_pairwise_aligner" -#define ALIGN_PDB_ADDRESS "empty" -#define ALIGN_PDB_language "empty" -#define ALIGN_PDB_language2 "empty" -#define ALIGN_PDB_source "empty" -#define ALIGN_PDB_update_action "never" -#define ALIGN_PDB_mode "expresso,3dcoffee" -#define FUGUE_4_TCOFFEE "fugueali" -#define FUGUE_type "structure_pairwise_aligner" -#define FUGUE_ADDRESS "http://www-cryst.bioc.cam.ac.uk/fugue/download.html" -#define FUGUE_language "empty" -#define FUGUE_language2 "empty" -#define FUGUE_source "empty" -#define FUGUE_update_action "never" -#define FUGUE_mode "expresso,3dcoffee" -#define DALILITEc_4_TCOFFEE "dalilite.pl" -#define DALILITEc_type "structure_pairwise_aligner" -#define DALILITEc_ADDRESS "built_in" -#define DALILITEc_ADDRESS2 "http://www.ebi.ac.uk/Tools/webservices/services/dalilite" -#define DALILITEc_language "Perl" -#define DALILITEc_language2 "Perl" -#define DALILITEc_source "empty" -#define DALILITEc_update_action "never" -#define DALILITEc_mode "expresso,3dcoffee" -#define PROBCONSRNA_4_TCOFFEE "probconsRNA" -#define PROBCONSRNA_type "RNA_multiple_aligner" -#define PROBCONSRNA_ADDRESS "http://probcons.stanford.edu/" -#define PROBCONSRNA_language "C++" -#define PROBCONSRNA_language2 "CXX" -#define PROBCONSRNA_source "http://probcons.stanford.edu/probconsRNA.tar.gz" -#define PROBCONSRNA_mode "mcoffee,rcoffee" -#define CONSAN_4_TCOFFEE "sfold" -#define CONSAN_type "RNA_pairwise_aligner" -#define CONSAN_ADDRESS "http://selab.janelia.org/software/consan/" -#define CONSAN_language "empty" -#define CONSAN_language2 "empty" -#define CONSAN_source "empty" -#define CONSAN_update_action "never" -#define CONSAN_mode "rcoffee" -#define RNAPLFOLD_4_TCOFFEE "RNAplfold" -#define RNAPLFOLD_type "RNA_secondarystructure_predictor" -#define RNAPLFOLD_ADDRESS "http://www.tbi.univie.ac.at/~ivo/RNA/" -#define RNAPLFOLD_language "C" -#define RNAPLFOLD_language2 "C" -#define RNAPLFOLD_source "http://www.tbi.univie.ac.at/~ivo/RNA/ViennaRNA-1.7.2.tar.gz" -#define RNAPLFOLD_mode "rcoffee" -#define HMMTOP_4_TCOFFEE "hmmtop" -#define HMMTOP_type "protein_secondarystructure_predictor" -#define HMMTOP_ADDRESS "www.enzim.hu/hmmtop/" -#define HMMTOP_language "C" -#define HMMTOP_language2 "C" -#define HMMTOP_source "empty" -#define HMMTOP_update_action "never" -#define HMMTOP_mode "tcoffee" -#define GOR4_4_TCOFFEE "gorIV" -#define GOR4_type "protein_secondarystructure_predictor" -#define GOR4_ADDRESS "http://mig.jouy.inra.fr/logiciels/gorIV/" -#define GOR4_language "C" -#define GOR4_language2 "C" -#define GOR4_source "http://mig.jouy.inra.fr/logiciels/gorIV/GOR_IV.tar.gz" -#define GOR4_update_action "never" -#define GOR4_mode "tcoffee" -#define EBIWUBLASTc_4_TCOFFEE "wublast.pl" -#define EBIWUBLASTc_type "protein_homology_predictor" -#define EBIWUBLASTc_ADDRESS "built_in" -#define EBIWUBLASTc_ADDRESS2 "http://www.ebi.ac.uk/Tools/webservices/services/wublast" -#define EBIWUBLASTc_language "Perl" -#define EBIWUBLASTc_language2 "Perl" -#define EBIWUBLASTc_source "empty" -#define EBIWUBLASTc_update_action "never" -#define EBIWUBLASTc_mode "psicoffee,expresso,3dcoffee" -#define EBIBLASTPGPc_4_TCOFFEE "blastpgp.pl" -#define EBIBLASTPGPc_type "protein_homology_predictor" -#define EBIBLASTPGPc_ADDRESS "built_in" -#define EBIBLASTPGPc_ADDRESS2 "http://www.ebi.ac.uk/Tools/webservices/services/blastpgp" -#define EBIBLASTPGPc_language "Perl" -#define EBIBLASTPGPc_language2 "Perl" -#define EBIBLASTPGPc_source "empty" -#define EBIBLASTPGPc_update_action "never" -#define EBIBLASTPGPc_mode "psicoffee,expresso,3dcoffee" -#define NCBIWEBBLAST_4_TCOFFEE "blastcl3" -#define NCBIWEBBLAST_type "protein_homology_predictor" -#define NCBIWEBBLAST_ADDRESS "ftp://ftp.ncbi.nih.gov/blast/executables/LATEST" -#define NCBIWEBBLAST_language "C" -#define NCBIWEBBLAST_language2 "C" -#define NCBIWEBBLAST_source "empty" -#define NCBIWEBBLAST_update_action "never" -#define NCBIWEBBLAST_mode "psicoffee,expresso,3dcoffee" -#define NCBIBLAST_4_TCOFFEE "blastpgp" -#define NCBIBLAST_type "protein_homology_predictor" -#define NCBIBLAST_ADDRESS "ftp://ftp.ncbi.nih.gov/blast/executables/LATEST" -#define NCBIBLAST_language "C" -#define NCBIBLAST_language2 "C" -#define NCBIBLAST_source "empty" -#define NCBIBLAST_update_action "never" -#define NCBIBLAST_mode "psicoffee,expresso,3dcoffee" -#define SOAPLITE_4_TCOFFEE "SOAP::Lite" -#define SOAPLITE_type "library" -#define SOAPLITE_ADDRESS "http://cpansearch.perl.org/src/MKUTTER/SOAP-Lite-0.710.08/Makefile.PL" -#define SOAPLITE_language "Perl" -#define SOAPLITE_language2 "Perl" -#define SOAPLITE_source "empty" -#define SOAPLITE_mode "psicoffee,expresso,3dcoffee" -//TclinkdbEnd -/*New Methods*/ -/********************************************/ -/* Various Methoids */ -/********************************************/ -#define METHODS_4_TCOFFEE "~/.t_coffee/methods/" -#define METHOD_4_MSA_WEIGHTS "petra_weight" -/********************************************/ -/* SEQAN LIBRARY */ -/********************************************/ -#define SEQAN_TCOFFEE_4_TCOFFEE "seqan_tcoffee" -/********************************************/ -/* REFORMATING AND UTILITIES */ -/********************************************/ -#define WGET_4_TCOFFEE "wget" -#define WGET_ADDRESS "http://www.gnu.org/software/wget/" - -#define CURL_4_TCOFFEE "curl" -#define CURL_ADDRESS "http://curl.haxx.se/" - -#define SEQ_REFORMAT_4_TCOFFEE "seq_reformat" -#define PS2PDF "ps2pdf" -#define EXTRACT_FROM_PDB_4_TCOFFEE "extract_from_pdb" -#define BLAST_ALN2FASTA_ALN "blast_aln2fasta_aln.pl" -#define FASTA_ALN2FASTA_ALN_UNIQUE_NAME "fasta_aln2fasta_aln_unique_name.pl" -#define MSF_ALN2FASTA_ALN "msf_aln2fasta_aln.pl" -#define SEQ2MSA_WEIGHT "seq2msa_weight" -/********************************************/ -/* DEPRECATED DEF */ -/********************************************/ -//Deprecated definitions -#define SIB_BLAST_4_TCOFFEE "blastall.remote" -#define LOCAL_BLAST_4_TCOFFEE "blastall" -#define BLAST_DB_4_TCOFFEE "nr" -#define NCBI_BLAST_4_TCOFFEE "" -/********************************************/ -/* PARAMETER_FILE */ -/********************************************/ - - - - -/* PARAMETER FILES */ -#define COLOR_FILE "seq_reformat.color" -/*This file specifies the 10 colors available to seq_reformat. -If the file is not on the system, hard coded defaults will be used. -The format is as follow: - -------------------------------------------------------------------------------------------- - -* - -------------------------------------------------------------------------------------------- -the RGB values are used for the post-script generation, the html code is used in html documents. -*/ -#define DATE "Tue Oct 27 10:10:30 WEST 2009" -#define PROGRAM "T-COFFEE" -#define VERSION "Version_8.14" -#define AUTHOR "Cedric Notredame " -#define DISTRIBUTION_ADDRESS "www.tcoffee.org/Packages/" -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev1.c b/binaries/src/tcoffee/t_coffee_source/dev1.c deleted file mode 100644 index 31d70b5..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev1.c +++ /dev/null @@ -1,133 +0,0 @@ -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -#include "dev1_lib_header.h" - -//Insert functions here -void aln2hitMat_help() -{ - fprintf ( stdout, "\n+aln2hitMat| _MODE_ : how to compare the two positions of the alignment (default:id)"); - fprintf ( stdout, "\n.................id : the sequence identity of those two positions"); - fprintf ( stdout, "\n.............pairscore : the pairwise score of the residues of those two positions"); - fprintf ( stdout, "\n+aln2hitMat| _MATRIX_ : matrix used for the comparison (idmat, blosum62mt, pam250mt.. default:blosum62mt)\n"); - exit (EXIT_SUCCESS); -} - -void aln2hitMat (Alignment *A, char *phitmat) -{ - float **ffpHitScoreMatrix; - int i, j, k, l, s; - int nl = A->len_aln; - int inseq = A->nseq; - int itmpScore; - char matrix[100]; - char mode[100]; - int isim_count, itotal_count, r1, r2; - -//Initialization for files - char *pcFileName = A->file[0]; - char prefix[200] ={0}; - char *hit_matrix_file = vcalloc(200, sizeof (char)); - char *hit_html_file = vcalloc(200, sizeof (char)); - int len = (strrchr(pcFileName,'.')?strrchr(pcFileName,'.')-pcFileName:strlen(pcFileName)); - - strncpy(prefix, pcFileName, len); - sprintf(hit_matrix_file, "%s%s", prefix, "_aln.hit_matrix"); - sprintf(hit_html_file, "%s%s", prefix, ".alnhit_html"); - - if ( phitmat && strstr ( phitmat, "help")) - aln2hitMat_help(); - - if(phitmat == NULL) phitmat = vcalloc(1, sizeof(char)); //such that program could get default value - - strget_param (phitmat, "_MODE_", "id", "%s", mode); - strget_param (phitmat, "_MATRIX_", "blosum62mt", "%s", matrix); - - fprintf ( stdout, "[START] aln to hit matrix\n"); - fprintf ( stdout, " Mode:%s\n", mode); - fprintf ( stdout, " Matrix:%s\n", matrix); - - int **mat = read_matrice(matrix); - - ffpHitScoreMatrix=vcalloc (nl, sizeof (float*)); - for(i = 0; i < nl; i++) - ffpHitScoreMatrix[i]=vcalloc (nl-i, sizeof (float)); - - fprintf (stdout, "Process positions\n", i); - for(i = 0; i < nl; i++) - { - fprintf (stdout, "%d, ", i); - for(j = i; j < nl; j++) - { - if(strm (mode, "id")) - ffpHitScoreMatrix[i][j-i]=generic_get_seq_sim (aln_column2string(A, i), aln_column2string(A, j), (A->cdna_cache)?A->cdna_cache[0]:NULL, matrix); - else if(strm (mode, "pairscore")) - { - isim_count = itotal_count = 0; - for (k=0; k< inseq; k++) - { - r1=tolower(A->seq_al[k][i]); - if (is_gap(r1))continue; - for (l=0; l< inseq; l++) - { - r2=tolower(A->seq_al[l][j]); - if (is_gap (r2))continue; - s=mat[r2-'A'][r1-'A']; - s=(s<=0)?0:1; - isim_count += s; - itotal_count++; - } - } - r1=(isim_count*100)/itotal_count; - ffpHitScoreMatrix[i][j-i] = r1; - } - else - aln2hitMat_help(); - } - } - fprintf (stdout, "\n"); - output_hit_matrix(hit_matrix_file, ffpHitScoreMatrix, nl); - -//Output Hit Score into color html - output_hit_color_html (A, ffpHitScoreMatrix, nl, hit_html_file); - vfree(ffpHitScoreMatrix); - vfree(hit_matrix_file); - vfree(hit_html_file); - fprintf ( stdout, "[END] aln to hit matrix\n"); -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev1_lib_header.h b/binaries/src/tcoffee/t_coffee_source/dev1_lib_header.h deleted file mode 100644 index d0bffa0..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev1_lib_header.h +++ /dev/null @@ -1,31 +0,0 @@ -//Insert function prototypes here -void aln2hitMat (Alignment *S, char *arg_list); -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev2.c b/binaries/src/tcoffee/t_coffee_source/dev2.c deleted file mode 100644 index 4bffd54..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev2.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -#include "dev2_lib_header.h" - - -//Insert functions here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev2_lib_header.h b/binaries/src/tcoffee/t_coffee_source/dev2_lib_header.h deleted file mode 100644 index 9ce384b..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev2_lib_header.h +++ /dev/null @@ -1,30 +0,0 @@ -//Insert function prototypes here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev3.c b/binaries/src/tcoffee/t_coffee_source/dev3.c deleted file mode 100644 index b8c9887..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev3.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -#include "dev3_lib_header.h" - -//Insert functions here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev3_lib_header.h b/binaries/src/tcoffee/t_coffee_source/dev3_lib_header.h deleted file mode 100644 index 9ce384b..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev3_lib_header.h +++ /dev/null @@ -1,30 +0,0 @@ -//Insert function prototypes here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev4.c b/binaries/src/tcoffee/t_coffee_source/dev4.c deleted file mode 100644 index 6be9724..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev4.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -#include "dev4_lib_header.h" - -//Insert functions here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dev4_lib_header.h b/binaries/src/tcoffee/t_coffee_source/dev4_lib_header.h deleted file mode 100644 index 9ce384b..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dev4_lib_header.h +++ /dev/null @@ -1,30 +0,0 @@ -//Insert function prototypes here -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/dp_lib_header.h b/binaries/src/tcoffee/t_coffee_source/dp_lib_header.h deleted file mode 100644 index 5196710..0000000 --- a/binaries/src/tcoffee/t_coffee_source/dp_lib_header.h +++ /dev/null @@ -1,839 +0,0 @@ -struct CL_node - { - - int copy_mode; - struct CL_node *c; - struct CL_node *p; - struct CL_node *l; - struct CL_node *r; - int seq; - int res; - int free; -}; - -typedef struct CL_node CL_node; -Alignment * add_constraint2aln ( Alignment *A, int s1, int r1, int s2, int r2); -Alignment * graph_aln (Alignment *A, Constraint_list *CL, Sequence *S); -Alignment* graph2aln (Alignment *A, CL_node *G, Sequence *S); -CL_node ***add_constraint2graph_aln (CL_node ***G, int s1, int r1, int s2, int r2); -CL_node * shift_segment ( CL_node *S, int segL, int shiftL); - -int is_graph_gap_column(CL_node *S); -CL_node * remove_graph_gap_column (CL_node *S); -CL_node * swap_gap_in_graph ( CL_node*S, CL_node *E); - -CL_node * declare_cl_nodes ( int len, int seq); -CL_node * insert_gap_columns (CL_node *S, int d); -int get_node_distance ( CL_node *S, CL_node *E); -CL_node ***aln2graph (Alignment *A); -CL_node *vfree_graph (CL_node *S); -CL_node *vfree_cl_node ( CL_node *N); - -int gotoh_pair_wise_lalign ( Alignment *A, int*ns, int **l_s,Constraint_list *CL); -Constraint_list * undefine_sw_aln ( Alignment *A, Constraint_list *CL); -Constraint_list * undefine_sw_pair ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int sw_pair_is_defined ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - -int gotoh_pair_wise_sw (Alignment *A,int*ns, int **l_s,Constraint_list *CL); - -Alignment * get_best_local_aln ( Alignment *IN,Constraint_list *CL,int gop, int gep, int sw_t, int sw_l, int sw_z, int greedy); -Alignment * get_best_nol_local_aln ( Alignment *IN, Constraint_list *CL, int gop, int gep,int sw_t,int sw_l, int sw_z, int mode); -double compute_penalty (Constraint_list *CL, char *mode, int len); -double compute_scale ( Constraint_list *CL,char *mode, int len); -int evaluate_penalty (Alignment *A, Constraint_list *CL, int *scale,char *scale_mode, int *penalty, char *penalty_mode, int len_seq); -Alignment ** t_coffee_lalign (Constraint_list *CL, int scale, int penalty,int maximise,Sequence *S, int sw_t, int sw_l, int sw_z,int *sw_n, int sw_io); -Alignment * add_seq2aln (Constraint_list *CL, Alignment *IN,Sequence *S); - - - - - - - -struct Dp_Model -{ - int *diag; - - int TG_MODE; - int F_TG_MODE; - int gop; - int gep; - int f_gop; - int f_gep; - int nstate; - int START; - int END; - - char**model_comments; - int **model; - int **model_properties; - int **bounded_model; - int (***model_emission_function)(Alignment*, int **, int, int*, int, int **, int, int*, int, struct Constraint_list *); - - int LEN_I; - int LEN_J; - int DELTA_I; - int DELTA_J; - int EMISSION; - int START_EMISSION; - int TERM_EMISSION; - - int ALN_TYPE; - Constraint_list *CL; - /*Associated Functions*/ - - /*To Deprecate*/ - int UM; - - int TYPE; - int F0; - int F1; - - - int NON_CODING; - int INSERTION; - int DELETION; - int CODING0; - int CODING1; - int CODING2; - - -}; -typedef struct Dp_Model Dp_Model; - -struct Dp_Result -{ - int *traceback; - int len; - int score; - Dp_Model *Dp_model; -}; -typedef struct Dp_Result Dp_Result; - -Dp_Result * make_fast_generic_dp_pair_wise (Alignment *A, int*ns, int **l_s,Dp_Model *M); - -Constraint_list* free_dp_model (Dp_Model *D); -Dp_Result * free_dp_result (Dp_Result *D ); - -typedef struct hseq* SeqHasch; - -typedef struct hseq -{ - SeqHasch hl[256]; - int n; - int *l; -} hseq; - -int ** ktup_dist_mat ( char **seq, int nseq, int ktup, char *type); -int ** evaluate_diagonals_for_two_sequences ( char *seq1, char *seq2,int maximise,Constraint_list *CL,int ktup); -int ** evaluate_diagonals ( Alignment *A, int *ns, int **l_s, Constraint_list *CL,int maximise,int n_groups, char **group_list,int ktup); -int ** evaluate_segments_with_ktup ( Alignment *A, int *ns, int **l_s, Constraint_list *CL,int maximise,int n_groups, char **group_list,int ktup); -int ** evaluate_diagonals_with_ktup ( Alignment *A, int *ns, int **l_s, Constraint_list *CL,int maximise,int n_groups, char **group_list,int ktup); - -int ** evaluate_diagonals_with_clist ( Alignment *A, int *ns, int **l_s, Constraint_list *CL,int maximise,int n_groups, char **group_list,int ktup); - -int * flag_diagonals (int l1, int l2, int **sorted_diag,float T, int window); -int * extract_N_diag (int l1, int l2, int **sorted_diag, int n_chosen_diag, int window); - -int hasch_seq(char *seq1, int **hs, int **lu,int ktup, char *alph); -int fasta_gotoh_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int cfasta_gotoh_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int very_fast_gotoh_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); - -int make_fasta_gotoh_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL, int *diag); -/*********************************************************************/ -/* */ -/* KTUP_DP */ -/* */ -/* */ -/*********************************************************************/ - -int precomputed_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int ktup_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int ktup_comparison ( char *seq1, char *seq2, int ktup); -HaschT* hasch_sequence ( char *seq1, int ktup); - -SeqHasch * seq2hasch (int i,char *seq, int ktup, SeqHasch *H); -Constraint_list * hasch2constraint_list (Sequence*S, Constraint_list *CL); -SeqHasch *cleanhasch (SeqHasch *H); -int hasch2sim (SeqHasch *H, int nseq); -int cfasta_gotoh_pair_wise_sw (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int fasta_gotoh_pair_wise_sw (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int make_fasta_gotoh_pair_wise_sw (Alignment *A,int*ns, int **l_s,Constraint_list *CL, int *diag); - -/*pair wise aln implementations*/ - -int idscore_pairseq (char *s1, char *s2, int gop, int gep, int **m, char *mode); -int idscore_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int gotoh_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int glocal_pair_wise ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); -int gotoh_pair_wise_lgp ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); -int test_pair_wise (Alignment *A, int *ns, int **l_s, Constraint_list *CL); - -int glocal2_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL); -int gotoh_pair_wise_lgp_sticky ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); -int linked_pair_wise ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); -int clinked_pair_wise ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); -void free_proba_pair_wise(); - -int subop1_pair_wise ( Alignment *A, int *ns, int **ls, Constraint_list *CL); -int subop2_pair_wise ( Alignment *A, int *ns, int **ls, Constraint_list *CL); -int proba_pair_wise ( Alignment *A, int *ns, int **ls, Constraint_list *CL); -int viterbi_pair_wise ( Alignment *A, int *ns, int **ls, Constraint_list *CL); -int biphasic_pair_wise ( Alignment *A, int *ns, int **l_s, Constraint_list *CL); - - - - - - - - -int cfasta_cdna_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -int fasta_cdna_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -Dp_Model* initialize_dna_dp_model (Constraint_list *CL); -Dp_Result * make_fast_dp_pair_wise (Alignment *A,int*ns, int **l_s, Constraint_list *CL,Dp_Model *M); -int make_fasta_cdna_pair_wise (Alignment *B,Alignment *A,int*ns, int **l_s,Constraint_list *CL, int *diag); - - - -int ** evaluate_diagonals_cdna ( Alignment *A, int *ns, int **l_s, Constraint_list *CL,int maximise,int n_groups, char **group_list, int ktup); -int cfasta_cdna_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL); -Alignment *clean_maln ( Alignment *A, Alignment *I, int T, int n_it); -Alignment *realign_segment (int seq, int start, int len,Alignment *A, Alignment *C); -Dp_Model * initialize_seg2prf_model(int left_tg_mode, int right_tg_mode, Constraint_list *CL); - -int get_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_start_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_term_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -Dp_Model * initialize_sseq_model(int left_tg_mode, int right_tg_mode, Constraint_list *CL); -int ssec_pwaln_maln (Alignment *A, int *ns, int **ls, Constraint_list *CL); - - -int get_turn_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_turn_start_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_turn_term_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int get_alpha_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_alpha_start_gep_cost(Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_alpha_term_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int get_beta_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_beta_start_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_beta_term_gep_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int get_alpha_sub_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_beta_sub_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_turn_sub_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int get_ssec_no_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int sim_pair_wise_lalign (Alignment *in_A, int *in_ns, int **in_l_s, Constraint_list *in_CL); - -/*pair wise aln implementations*/ -int myers_miller_pair_wise (Alignment *A, int *ns, int **l_s,Constraint_list *CL); -int diff (Alignment *A, int *ns, int **ls, int s1, int M,int s2, int N , int tb, int te, Constraint_list *CL, int **pos); -int evaluate_est_order (Sequence *S, char *concat, Constraint_list *CL, int ktuple); - -Constraint_list *prepare_cl_for_moca ( Constraint_list *CL); -Alignment ** moca_aln ( Constraint_list *CL); -Alignment * extract_domain ( Constraint_list *CL); -Alignment * interactive_domain_extraction ( Constraint_list *CL); -int print_moca_interactive_choices (); - -Alignment * approximate_domain ( int min_start, int max_start, int step_start,int min_len, int max_len, int step_len, int *best_start, int *best_len, int *best_score, Constraint_list *CL); - -int measure_domain_length ( Constraint_list *CL,Alignment *IN, int start, int min_size, int max_size, int step); -Alignment *extract_domain_with_coordinates ( Alignment *RESULT,int start, int len, Constraint_list *CL); -int get_starting_point ( Constraint_list *CL); - -Alignment * find_domain_coordinates (Constraint_list *CL, int *start, int *len); -Alignment * extend_domain ( Constraint_list *CL, int *start, int *len, int dstart, int dlen); -Alignment * modify_domain ( Constraint_list *CL, Alignment *IN, int *start, int *len, int dstart, int dlen); - -int * analyse_sequence ( Constraint_list *CL); - -/****************************************************************************/ -/* */ -/* */ -/* Alignment Methods */ -/* */ -/* */ -/****************************************************************************/ -Alignment * sorted_aln (Alignment *A, Constraint_list *CL); -Alignment * sorted_aln_seq (int seq, Alignment *A, Constraint_list *CL); -Alignment * full_sorted_aln (Alignment *A, Constraint_list *CL); - -/******************************************************************/ -/* MAIN DRIVER */ -/* */ -/* */ -/******************************************************************/ - -Constraint_list *profile2list ( Job_TC *job,int nprf); -Constraint_list *seq2list (Job_TC *Job); -Constraint_list *method2pw_cl (TC_method *M, Constraint_list *CL); -int method_uses_structure(TC_method *M); -int method_uses_profile(TC_method *M); - -/******************************************************************/ -/* MULTIPLE ALIGNMENTS */ -/* */ -/* */ -/******************************************************************/ -Alignment * compute_prrp_aln (Alignment *A, Constraint_list *CL); -Alignment * compute_clustalw_aln (Alignment *A, Constraint_list *CL); -Alignment * compute_tcoffee_aln_quick (Alignment *A, Constraint_list *CL); -Alignment * seq2clustalw_aln (Sequence *S); -Alignment * aln2clustalw_aln (Alignment *A, Constraint_list *CL); -Alignment * realign_block ( Alignment *A, int col1, int col2, char *pg); -/******************************************************************/ -/* DNA */ -/* */ -/* */ -/******************************************************************/ -Constraint_list * align_coding_nucleotides (char *seq, char *method, char *weight, char *mem_mode, Constraint_list *CL); -/******************************************************************/ -/* STRUCTURES */ -/* */ -/* */ -/******************************************************************/ -Constraint_list * seq_msa (TC_method *M , char *in_seq, Constraint_list *CL); - -Constraint_list *align_pdb_pair (char *seq_in, char *dp_mode,char *evaluate_mode, char *file, Constraint_list *CL, Job_TC *job); -Constraint_list * align_pdb_pair_2 (char *seq, Constraint_list *CL); - -Constraint_list * pdb_pair ( TC_method*M,char *seq, Constraint_list *CL); -Constraint_list * pdbid_pair ( TC_method*M,char *seq, Constraint_list *CL); -Constraint_list * profile_pair ( TC_method*M,char *seq, Constraint_list *CL); -Constraint_list * thread_pair ( TC_method*M,char *seq, Constraint_list *CL); -Constraint_list * thread_pair2 ( TC_method *M,int s1, int s2, Constraint_list *CL); -Constraint_list * sap_pair (char *seq, char *weight, Constraint_list *CL); -Constraint_list * lsqman_pair (char *seq, Constraint_list *CL); -Constraint_list * rna_pair (TC_method *M , char *in_seq, Constraint_list *CL); - -/******************************************************************/ -/* GENERIC PAIRWISE METHODS */ -/* */ -/* */ -/******************************************************************/ -Constraint_list *best_pair4prot (Job_TC *job); -Constraint_list *best_pair4rna (Job_TC *job); -Alignment * fast_pair (Job_TC *job); - -void toggle_case_in_align_two_sequences(int value); -Alignment * align_two_sequences ( char *seq1, char *seq2, char *matrix, int gop, int gep, char *align_mode); -Alignment * align_two_aln ( Alignment *A1, Alignment *A2, char *in_matrix, int gop, int gep, char *in_align_mode); -NT_node make_root_tree ( Alignment *A,Constraint_list *CL,int gop, int gep,Sequence *S, char *tree_file,int maximise); -NT_node ** make_tree ( Alignment *A,Constraint_list *CL,int gop, int gep,Sequence *S, char *tree_file, int maximise); -int ** get_pw_distances ( Alignment *A,Constraint_list *CL,int gop, int gep, char **out_seq, char **out_seq_name, int out_nseq, char *tree_file, char *tree_mode, int maximise); -Alignment *stack_progressive_nol_aln_with_seq_coor(Constraint_list *CL,int gop, int gep,Sequence *S, int **seq_coor, int nseq); -Alignment *stack_progressive_aln_with_seq_coor (Constraint_list*CL,int gop, int gep, Sequence *S, int **coor, int nseq); -Alignment *stack_progressive_aln(Alignment *A, Constraint_list *CL, int gop, int gep); -Alignment *est_progressive_aln(Alignment *A, Constraint_list *CL, int gop, int gep); -void analyse_seq ( Alignment *A, int s); - -char ** list_file2dpa_list_file (char **list_file, int *len,int maxnseq, Sequence *S); -Alignment * seq2aln_group (Alignment *A, int T, Constraint_list *CL); - -Alignment *profile_aln (Alignment *A, Constraint_list *CL); -Alignment * iterative_tree_aln (Alignment *A,int n, Constraint_list *CL); -Alignment * iterative_aln ( Alignment*A, int nseq, Constraint_list *CL); -Alignment * seq_aln ( Alignment*A, int nseq, Constraint_list *CL); -Alignment *tsp_aln (Alignment *A, Constraint_list *iCL, Sequence *S); -Alignment *iterate_aln ( Alignment*A, int nit, Constraint_list *CL); -Alignment *realign_aln ( Alignment*A, Constraint_list *CL); -Alignment *very_fast_aln (Alignment*A, int nseq, Constraint_list *CL); -Alignment *simple_progressive_aln (Sequence *S, NT_node **T, Constraint_list *CL, char *mat); -Alignment *frame_aln (Alignment *A, int n,Constraint_list *CL); -Alignment *dpa_aln (Alignment *A, Constraint_list *CL); -Alignment *new_dpa_aln (Alignment *A, Constraint_list *CL); -Alignment * make_delayed_tree_aln (Alignment *A,int n, Constraint_list *CL); - -NT_node* delayed_tree_aln ( NT_node LT, NT_node RT, Alignment*A, int nseq, Constraint_list *CL); -int node2seq_list (NT_node P, int *ns, int *ls); -Alignment* delayed_tree_aln1 ( NT_node P,Alignment*A,Constraint_list *CL, int threshold); -Alignment* delayed_tree_aln2 ( NT_node P,Alignment*A,Constraint_list *CL, int threshold); - -NT_node* tree2ao (NT_node LT, NT_node RT,Alignment *A, int nseq,Constraint_list *CL);//tree2align_order -NT_node* tree_aln ( NT_node LT, NT_node RT, Alignment*A, int nseq, Constraint_list *CL); -NT_node* local_tree_aln ( NT_node LT, NT_node RT, Alignment*A, int nseq, Constraint_list *CL); -NT_node* seqan_tree_aln ( NT_node LT, NT_node RT, Alignment*A, int nseq, Constraint_list *CL); - - -NT_node* tree_realn ( NT_node LT, NT_node RT, Alignment*A, int nseq, Constraint_list *CL); - -int split_condition (int nseq, int score, Constraint_list *CL); - -int profile_pair_wise (Alignment *A, int n1, int *l1, int n2, int *l2, Constraint_list *CL); -int pair_wise (Alignment *A, int*ns, int **l_s,Constraint_list *CL ); - -int empty_pair_wise ( Alignment *A, int *ns, int **l_s, Constraint_list *CL, int glocal); - - -Pwfunc get_pair_wise_function (Pwfunc func, char *dp_mode, int *glocal); - - - -char *build_consensus ( char *seq1, char *seq2, char *dp_mode); -int fastal (int argv, char **arg); - -int domain_pair_wise (Alignment *A,int*ns, int **l_s,Constraint_list *CL ); -Alignment *domain_match_list2aln ( Alignment *A,int *ns,int **l_s,int **ml, int nseq, int len); -Alignment * domain_seq2domain (Constraint_list *CL,int scale,int gop,int gep,Alignment *SEQ_DOMAIN, Alignment *TARGET); - - -int custom_pair_score_function1 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function2 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function3 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function4 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function5 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function6 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function7 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function8 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function9 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int custom_pair_score_function10 (Constraint_list *CL, int s1, int r1, int s2, int r2); -int apdb (int argc, char *argv[]); - -Constraint_list * set_constraint_list4align_pdb (Constraint_list *inCL,int seq, char *dp_mode, char *hasch_mode, char *param_file); -int evaluate_ca_trace_sap2_bubble (Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_ca_trace_nb (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_bubble (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_sap1_bubble (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_3D_bubble (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_transversal (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_bubble_2 (Constraint_list *CL, int s1, int s2, int r1, int r2); -int evaluate_ca_trace_bubble_3 (Constraint_list *CL, int s1, int s2, int r1, int r2); - - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR COMPARING TWO NEIGHBORHOODS:START */ -/* */ -/*********************************************************************************************/ -float matrix_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2); -float transversal_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2); -float neighborhood_match (Constraint_list *CL, int s1, int s2, int r1, int r2,Struct_nb *nbs1, Struct_nb *nbs2); -float sap1_neighborhood_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2); -float sap2_neighborhood_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2); - - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR COMPARING TWO NEIGHBORHOODS:END */ -/* */ -/*********************************************************************************************/ -Alignment * analyse_pdb ( Alignment *A, Alignment *ST, char *filename); -Alignment * msa2struc_dist ( Alignment *A, Alignment *ST, char *filename); -float **** analyse_pdb_residues ( Alignment *A, Constraint_list *CL, Pdb_param *pdb_param); - -float square_atom ( Atom *X); -Atom* reframe_atom ( Atom *X, Atom*Y, Atom *Z, Atom *IN, Atom *R); -Atom* add_atom ( Atom *A, Atom*B, Atom *R); -Atom* diff_atom ( Atom *A, Atom*B, Atom *R); -Atom * copy_atom ( Atom *A, Atom*R); -/************************************************************************/ -/* */ -/* NUSSINOV */ -/* */ -/************************************************************************/ -char *nussinov (char *S, int min_dist); -char * rna_struc2rna_lib ( char *seq_name, char *seq, char *name); -int display_rna_ss ( int pos, char *seq, char *struc, FILE *fp); -int evaluate_aln_gibbs ( Alignment *A, Constraint_list *CL); -int evaluate_moca_domain ( Alignment *A, Constraint_list *CL); -int moca_residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int moca_evaluate_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int moca_slow_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int **cache_cl_with_moca_domain (Alignment *A, Constraint_list *CL); -Alignment *make_moca_nol_aln ( Alignment *A, Constraint_list *CL); -/*********************************************************************************************/ -/* */ -/* DOMAIN Z SCORE EVALUATION */ -/* */ -/*********************************************************************************************/ - -int evaluate_domain_aln_z_score (Alignment *A, int start, int end,Constraint_list *CL, char *alphabet); -int evaluate_domain_aln ( Alignment *A, int start, int end,Constraint_list *CL); - - - -int unpack_seq_residues ( int *s1, int *r1, int *s2, int *r2, int **packed_seq_lu); -Alignment * unpack_seq_aln ( Alignment *A,Constraint_list *C); -typedef struct -{ - int N_COMPONENT; - double *double_logB_alpha; - double *exponant_list; - double **ALPHA; - double *DM_Q; - double *alpha_tot; - int n_aa; - int tot_n; -} -Mixture; - -double int_logB (int *i, int n); -double float_logB (float *i, int n); -double double_logB (double *x, int n); -double *** make_lup_table ( Mixture *D); -double double_logB2(int j, double *n,Mixture *D); -double compute_exponant ( double *n, int j, Mixture *D); - -double *compute_matrix_p ( double *n,int Nseq); -double* compute_dirichlet_p ( double *n,int Nseq); -void precompute_log_B ( double *table,Mixture *D); -double compute_X (double *n,int i,Mixture *D); -Mixture *read_dirichlet ( char *name); -int dirichlet_code( char aa); - -double lgamma2 ( double x); -double lgamma_r(double x, int *signgamp); -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR EVALUATING THE CONSISTENCY BETWEEN ALN AND CL */ -/* */ -/*********************************************************************************************/ -Alignment * overlay_alignment_evaluation ( Alignment *I, Alignment *O); -Alignment * main_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL, const char *mode ); -int aln2ecl_raw_score (Alignment *A, Constraint_list *C); -int sub_aln2ecl_raw_score (Alignment *A, Constraint_list *CL, int ns, int *ls); -int sub_aln2sub_aln_raw_score ( Alignment *IN,Constraint_list *CL, const char *mode, int *ns, int **ls); -int node2sub_aln_score(Alignment *A,Constraint_list *CL, char *mode, NT_node T); -int sub_aln2sub_aln_score ( Alignment *IN,Constraint_list *CL, const char *mode, int *ns, int **ls); -Alignment * main_coffee_evaluate_output_sub_aln ( Alignment *IN,Constraint_list *CL, const char *mode, int *ns, int **ls); - -Alignment * categories_evaluate_output ( Alignment *IN,Constraint_list *CL); -Alignment * matrix_evaluate_output ( Alignment *IN,Constraint_list *CL); -Alignment * sar_evaluate_output ( Alignment *IN,Constraint_list *CL); -Alignment * boxshade_evaluate_output ( Alignment *IN,Constraint_list *CL, int T); - -Alignment * fast_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL); - -int slow_coffee_evaluate_sub_aln ( Alignment *IN,int *ns, int **ls, Constraint_list *CL); -Alignment * slow_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL); -Alignment * non_extended_t_coffee_evaluate_output( Alignment *IN,Constraint_list *CL); -Alignment * heuristic_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL); -/*Old Function: To deprecate*/ -Alignment * coffee_evaluate_output ( Alignment *IN,Constraint_list *CL); - -/*********************************************************************************************/ -/* */ -/* PROFILE/PRofile Functions */ -/* */ -/*********************************************************************************************/ -Profile_cost_func get_profile_mode_function (char *name, Profile_cost_func func); -int generic_evaluate_profile_score (Constraint_list *CL,Alignment *Prf1, int s1, int r1, Alignment *Prf2, int s2, int r2, Profile_cost_func prf_prf); -int cw_profile_profile (int *prf1, int *prf2, Constraint_list *CL); -int muscle_profile_profile (int *prf1, int *prf2, Constraint_list *CL); - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR GETING THE COST : (Sequences) ->evaluate_residue_pair */ -/* */ -/*********************************************************************************************/ -int evaluate_blast_profile_score (Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_aln_profile_score (Constraint_list *CL, int s1, int r1, int s2, int r2); - -int evaluate_profile_score ( Constraint_list *CL,Alignment *Prf1, int s1, int r1, Alignment *Prf2, int s2, int r2); -int evaluate_cdna_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_diaa_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_monoaa_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_tm_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_ssp_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_curvature_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); - -int evaluate_combined_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int evaluate_physico_score ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_non_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - -int residue_pair_extended_list4rna1 ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list4rna2 ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list4rna3 ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list4rna4 ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list4rna ( Constraint_list *CL, Constraint_list *R, int s1, int r1, int s2, int r2); - -int residue_pair_extended_list_raw ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list_pc ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - - - -int residue_pair_extended_list_g_coffee_quadruplet ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list_g_coffee ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list_quadruplet ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_extended_list_mixt ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int residue_pair_test_function ( Constraint_list *CL, int s1, int r1, int s2, int r2); -int extend_residue_pair ( Constraint_list *CL, int s1, int r1, int s2, int r2); - -int residue_pair_relative_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ); -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR GETTING THE PW COST : CL->get_dp_cost */ -/* */ -/*********************************************************************************************/ -int get_dp_cost_blosum_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_dp_cost_pam_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_dp_cost_pw_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int get_cdna_best_frame_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_dp_cost_quadruplet ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - - -int very_fast_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int cw_profile_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int cw_profile_get_dp_cost_window ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int consensus_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int fast_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int fast_get_dp_cost_2 ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int fast_get_dp_cost_3 ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int fast_get_dp_cost_quadruplet ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int check_fast_profile_mode (Alignment *A, int ns1,int *list1,int ns2, int *list2, Constraint_list *CL); -int check_fast_mode (Alignment *A, int ns1,int *list1,int ns2, int *list2, Constraint_list *CL); - - -int slow_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int slow_get_dp_cost_pc ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int slow_get_dp_cost_test ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); - -int sw_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL); -int get_domain_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2,Constraint_list *CL , int scale , int gop, int gep); - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR ANALYSING AL OR MATRIX */ -/* */ -/*********************************************************************************************/ -float ** initialise_aa_physico_chemical_property_table (int *n); -int aln2n_res ( Alignment *A, int start, int end); -float get_gop_scaling_factor ( int **matrix,float id, int l1, int l2); -float get_avg_matrix_mm ( int **matrix, char *alphabet); -float get_avg_matrix_match ( int **matrix, char *alphabet); -float get_avg_matrix_diff ( int **matrix1,int **matrix2, char *alphabet); -float measure_matrix_enthropy (int **matrix,char *alphabet); -float measure_matrix_pos_avg (int **matrix,char *alphabet); -float evaluate_random_match (char *matrix, int n, int len,char *alp); -float compare_two_mat (char *mat1,char*mat2, int n, int len,char *alp); -float compare_two_mat_array (int **matrix1,int **matrix2, int n, int len,char *alp); -int ** rescale_two_mat (char *mat1,char*mat2, int n, int len,char *alp); -int ** rescale_matrix ( int **mat, float lambda, char *alp); -int **mat2inverted_mat (int **matrix, char *alp); -void output_matrix_header ( char *name, int **matrix, char *alp); -float evaluate_random_match2 (int **matrix, int n, int len,char *alp); -float measure_lambda2(char *mat1,char*mat2, int n, int len,char *alp); -float measure_lambda(char *mat1,char*mat2, int n, int len,char *alp); -Constraint_list * choose_extension_mode ( char *extend_mode, Constraint_list *CL); -int ** combine_two_matrices ( int **mat1, int **mat2); -/*********************************************************************************************/ -/* */ -/* OFF THE SHELVES EVALUATION */ -/* */ -/*********************************************************************************************/ -float sum_pair ( Alignment*A,char *mat_name, int gap_op, int gap_ext); -int lat_sum_pair (Alignment *A, char *mat); -int ** show_pair(int istart, int iend, int jstart, int jend, int *seqlen_array, char **seq_array, int dna_ktup, int dna_window, int dna_wind_gap, int dna_signif,int prot_ktup, int prot_window,int prot_wind_gap,int prot_signif, int nseqs,int dnaflag, int max_aa, int max_aln_length ); -/*By convention, 0: START, 1: END*/ - -struct Hmm -{ - - double freeT; /*Free transition*/ - double forbiden; /*Forbiden transition*/ - int start; /*start, by convention: 0*/ - int end; /*end, by convention: 1*/ - - int nS; /*Number of states*/ - int order; - struct HmmState **S; /*State List*/ - - /*Bounded HMM*/ - double **T; /*Transition matrix*/ - int **fromM; /*For any sate s, fromM[0]->number of states leading to s*/ - int **toM; /*For any sate s, toM[0]->number of s can go to*/ - /*End and Start are NOT included in toM and FromM*/ - - -}; -typedef struct Hmm Hmm; - -struct HmmAln -{ - Hmm *H; - int *state_list; -}; -typedef struct HmmAln HmmAln; - -typedef double (*Generic_em_func)(struct Hmm*, struct HmmState*, int); - -struct HmmState -{ -char name[100]; -int state; -int DJ; -int DI; - - /*Pair HMM*/ -double em; -Col_cost_func em_func; - - /*Linear HMM*/ -double *em2; -Generic_em_func em_func2; -int nT; -struct StateTrans **T; -}; -typedef struct HmmState HmmState; - -struct StateTrans -{ - char name[101]; - double tr; -}; -typedef struct StateTrans StateTrans; - -struct MatState -{ - int i; - int j; - int st; - int pst; - double sc; - struct MatState *n; - struct MatState *p; - struct MatState *m; /*memory*/ - struct MatState *s; /*memory of the start point*/ - /*Heap Mamagement: Never copy*/ - struct MatState *Hn;/*Heap Next*/ - struct MatState *Hp;/*Heap Previous*/ - - struct MatState *Mn;/*Marked Heap section*/ - struct MatState *Mp;/*Marked Heap Section*/ - int free; -}; -typedef struct MatState MatState; - - -/*********************************************************************************/ -/* */ -/* */ -/* simple HMM: Viterbi */ -/* */ -/* */ -/*********************************************************************************/ -int seq_viterbi_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL); - -/*********************************************************************************/ -/* */ -/* */ -/* HMM: Viterbi */ -/* */ -/* */ -/*********************************************************************************/ - -int viterbi_pair_wise_OLD (Alignment *A,int*ns, int **ls,Constraint_list *CL); -Alignment * viterbipath2aln (Alignment *A, int *ns,int **ls,int *tb, Hmm *H); -double*** viterbi_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL); -int * viterbi2path (int l1,int l2, Hmm *H, double ***M); -/*********************************************************************************/ -/* */ -/* */ -/* HMM modeling */ -/* */ -/* */ -/*********************************************************************************/ -int viterbiL_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL); -MatState* RviterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E); -MatState* viterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S, MatState *E); - -int viterbiD_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL); -double lu_RviterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); -MatState* RviterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); -MatState* viterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S, MatState *E, int **seg_list); -int **seglist2table ( int **seglist,int l1, int l2); -int *seglist2line ( int **seglist, int line, int start, int end); -int * traceback (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); - -int viterbiDGL_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL); -double lu_RviterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); -MatState* RviterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); -MatState* viterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list); - - -/*********************************************************************************/ -/* */ -/* */ -/* HMM modeling */ -/* */ -/* */ -/*********************************************************************************/ -int MatStateAreIdentical (MatState*I, MatState*O); -int MaxDeltaMatState (MatState*I, MatState*O); -int MinDeltaMatState (MatState*I, MatState*O); - -MatState * ManageMatState(int Mode, MatState *C); -MatState* CopyMatState ( MatState*I, MatState*O); - -Hmm* read_hmm(char *file); -Hmm* declare_hmm(int n); -Hmm* free_Hmm(Hmm*H); -void DisplayHmm ( Hmm *H); - -/*********************************************************************************/ -/* */ -/* */ -/* HMM Models */ -/* */ -/* */ -/*********************************************************************************/ -Hmm* define_two_mat_model(Constraint_list *CL); -Hmm* define_probcons_model(Constraint_list *CL); -Hmm* define_simple_model(Constraint_list *CL); - -Hmm * bound_hmm ( Hmm *H); -Sequence *pavie_seq2random_seq (Sequence *S, char *subst); -double **pavie_seq2pavie_aln(Sequence *S,char *mat, char *mode); -Alignment *pavie_seq2pavie_sort ( Sequence *S, char *mat, char *mode); -Alignment* pavie_seq2pavie_msa ( Sequence *S, char *mat, char *mode); -NT_node pavie_seq2pavie_tree ( Sequence *S, char *mat, char *mode); -int **pavie_seq2trained_pavie_mat(Sequence *S, char *param); -int pavie_pair_wise (Alignment *A,int *ns, int **l_s,Constraint_list *CL ); -Sequence *pavie_seq2noisy_seq (Sequence *S, int val,char *subst); -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/evaluate.c b/binaries/src/tcoffee/t_coffee_source/evaluate.c deleted file mode 100644 index df57c51..0000000 --- a/binaries/src/tcoffee/t_coffee_source/evaluate.c +++ /dev/null @@ -1,5053 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - -#include "dp_lib_header.h" -float compute_lambda (int **matrix,char *alphabet); -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR EVALUATING THE CONSISTENCY BETWEEN ALN AND CL */ -/* */ -/*********************************************************************************************/ - -/*Fast: score= extended_res/max_extended_residue_for the whole aln - slow: score= extended_res/sum all extended score for that residue - non_extended score= non_ext /sum all non extended score for that residue - heuristic score= extended /sum of extended score of all pairs in the library - (i.e. Not ALL the possible pairs) -*/ -Alignment * main_coffee_evaluate_output2 ( Alignment *IN,Constraint_list *CL, const char *mode ); -int sub_aln2ecl_raw_score (Alignment *A, Constraint_list *CL, int ns, int *ls) -{ - int **pos; - int p1,r1, r2, s1, s2; - int score=0; - - if ( !A) return 0; - A=reorder_aln (A, (CL->S)->name,(CL->S)->nseq); - pos=aln2pos_simple ( A,A->nseq); - - CL=index_res_constraint_list (CL, CL->weight_field); - - for (p1=0; p1len_aln; p1++) - { - for (s1=0; s10 && r2>0) - { - score+= residue_pair_extended_list_pc (CL,ls[s1], r1, ls[s2], r2)*SCORE_K; - } - } - } - } - free_int (pos, -1); - return score; - return (score/(((ns*ns)-ns)/2))/A->len_aln; -} -int aln2ecl_raw_score (Alignment *A, Constraint_list *CL) -{ - int **pos; - int p1,r1, r2, s1, s2; - int score=0; - if ( !A) return 0; - A=reorder_aln (A, (CL->S)->name,(CL->S)->nseq); - pos=aln2pos_simple ( A,A->nseq); - - CL=index_res_constraint_list (CL, CL->weight_field); - - for (p1=0; p1len_aln; p1++) - { - for (s1=0; s1nseq-1; s1++) - { - for (s2=s1+1; s2nseq; s2++) - { - - r1=pos[s1][p1]; - r2=pos[s2][p1]; - if (r1>0 && r2>0)score+= residue_pair_extended_list_pc (CL,s1, r1, s2, r2); - } - } - } - free_int (pos, -1); - return score; - return (score/(((A->nseq*A->nseq)-A->nseq)/2))/A->len_aln; -} -int node2sub_aln_score (Alignment *A,Constraint_list *CL, char *mode, NT_node T) -{ - if ( !T || !T->right ||!T->left)return 0; - else - { - int *ns; - int **ls; - ns=vcalloc (2, sizeof (int)); - ls=vcalloc (2, sizeof (int*)); - ns[0]= (T->left)->nseq; - ns[1]=(T->right)->nseq; - ls[0]= (T->left)->lseq; - ls[1]=(T->right)->lseq; - - return sub_aln2sub_aln_score (A, CL, mode, ns, ls); - } - return -1; -} -int sub_aln2sub_aln_score ( Alignment *A,Constraint_list *CL, const char *mode, int *ns, int **ls) -{ - /*Warning: Does Not Take Gaps into account*/ - - int **pos; - int a; - float score=0; - - /*Make sure evaluation functions update their cache if needed*/ - A=update_aln_random_tag (A); - pos=aln2pos_simple ( A, -1, ns, ls); - for (a=0; a< A->len_aln; a++) - score+=CL->get_dp_cost (A, pos, ns[0], ls[0], a, pos, ns[1],ls[1], a, CL); - free_int (pos, -1); - - score=(int)(((float)score)/(A->len_aln*SCORE_K)); - score=(int)(CL->L && CL->normalise)?((score*MAXID)/(CL->normalise)):(score); - return (int)score; -} -int sub_aln2sub_aln_raw_score ( Alignment *A,Constraint_list *CL, const char *mode, int *ns, int **ls) -{ - /*Warning: Does Not Take Gaps into account*/ - - int **pos; - int a; - float score=0; - - /*Make sure evaluation functions update their cache if needed*/ - A=update_aln_random_tag (A); - pos=aln2pos_simple ( A, -1, ns, ls); - for (a=0; a< A->len_aln; a++) - score+=CL->get_dp_cost (A, pos, ns[0], ls[0], a, pos, ns[1],ls[1], a, CL); - free_int (pos, -1); - return (int) score; -} - -Alignment* main_coffee_evaluate_output_sub_aln ( Alignment *A,Constraint_list *CL, const char *mode, int *n_s, int **l_s) -{ - Alignment *SUB1, *SUB2, *SUB3; - int a, b, c,*list_seq; - - - if (strm ( CL->evaluate_mode, "no"))return NULL; - else - { - list_seq=vcalloc (n_s[0]+n_s[1], sizeof (int)); - for (b=0, a=0; a< 2; a++){for (c=0;c< n_s[a]; c++)list_seq[b++]=l_s[a][c];} - - - SUB1=copy_aln (A, NULL); - SUB2=extract_sub_aln (SUB1,n_s[0]+n_s[1],list_seq); - SUB3=main_coffee_evaluate_output (SUB2,CL,CL->evaluate_mode); - free_aln (SUB1); - free_aln (SUB2); - vfree (list_seq); - - return SUB3; - } -} -Alignment * overlay_alignment_evaluation ( Alignment *I, Alignment *O) -{ - int a, b, c, r, i; - int *buf; - - if ( !I || !O) return O; - if ( I->len_aln!=O->len_aln)printf_exit (EXIT_FAILURE, stderr, "ERROR: Incompatible alignments in overlay_alignment_evaluation"); - - buf=vcalloc ( MAX(I->len_aln, O->len_aln), sizeof (int)); - - for (a=0; anseq; a++) - { - if (!strm (I->name[a], O->name[a]))printf_exit (EXIT_FAILURE, stderr, "ERROR: Incompatible alignments in overlay_alignment_evaluation"); - for (b=0; blen_aln; b++) - { - r=I->seq_al[a][b]; - if ( islower(r))O->seq_al[a][b]=0; - else if (r<=9 || (r>='0' && r<='9'))O->seq_al[a][b]=I->seq_al[a][b]; - } - } - return O; -} - -Alignment * main_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL, const char *mode ) -{ - - Alignment *TopS=NULL, *LastS=NULL, *CurrentS=NULL; - - - if ( IN->A)IN=IN->A; - while (IN) - { - - CurrentS= main_coffee_evaluate_output2(IN, CL, mode); - if (!TopS)LastS=TopS=CurrentS; - else - { - LastS->A=CurrentS; - LastS=CurrentS; - } - IN=IN->A; - } - return TopS; -} - -Alignment * main_coffee_evaluate_output2 ( Alignment *IN,Constraint_list *CL, const char *mode ) -{ - - /*Make sure evaluation functions update their cache if needed*/ - IN=update_aln_random_tag (IN); - - if ( CL->evaluate_residue_pair==evaluate_matrix_score || CL->ne==0 ||strm ( mode , "categories") || strm ( mode , "matrix")|| strm(mode, "sar")|| strstr (mode, "boxshade") ) - { - - if ( strm ( mode , "categories")) return categories_evaluate_output (IN, CL); - else if ( strm ( mode , "matrix"))return matrix_evaluate_output (IN, CL); - else if ( strm ( mode, "sar"))return sar_evaluate_output (IN, CL); - else if ( strstr ( mode, "boxshade"))return boxshade_evaluate_output (IN, CL, atoi (strstr(mode, "_")+1)); - - else if ( CL->evaluate_residue_pair==evaluate_matrix_score) return matrix_evaluate_output (IN, CL); - else if ( CL->ne==0) return matrix_evaluate_output (IN, CL); - } - else if ( strm (mode, "no"))return NULL; - else if ( strm4 ( mode, "t_coffee_fast","tcoffee_fast","fast_tcoffee", "fast_t_coffee")) - { - return fast_coffee_evaluate_output ( IN,CL); - } - else if ( strm4 ( mode, "t_coffee_slow","tcoffee_slow","slow_tcoffee","slow_t_coffee" )) - { - return slow_coffee_evaluate_output ( IN,CL); - } - - else if ( strm4 ( mode, "tcoffee_non_extended","t_coffee_non_extended","non_extended_tcoffee","non_extended_t_coffee")) - { - return non_extended_t_coffee_evaluate_output ( IN,CL); - } - else if ( strm5 ( mode, "tcoffee_heuristic","t_coffee_heuristic","heuristic_tcoffee","heuristic_t_coffee", "dali")) - { - return heuristic_coffee_evaluate_output ( IN,CL); - } - else - { - fprintf ( stderr, "\nUNKNOWN MODE FOR ALIGNMENT EVALUATION: *%s* [FATAL:%s]",mode, PROGRAM); - crash (""); - return NULL; - } - return IN; -} - - - -Alignment * coffee_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - fprintf ( stderr, "\n[WARNING:%s]THE FUNCTION coffee_evaluate_output IS NOT ANYMORE SUPPORTED\n", PROGRAM); - fprintf ( stderr, "\n[WARNING]fast_coffee_evaluate_output WILL BE USED INSTEAD\n"); - - return fast_coffee_evaluate_output (IN,CL); - } -Alignment * matrix_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c,r, s, r1, r2; - Alignment *OUT=NULL; - - double **tot_res; - double **max_res; - - double **tot_seq; - double **max_seq; - - double **tot_col; - double **max_col; - - double max_aln=0; - double tot_aln=0; - - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - - - if ( !CL->M)CL->M=read_matrice ("blosum62mt"); - - OUT=copy_aln (IN, OUT); - - - tot_res=declare_double ( IN->nseq, IN->len_aln); - max_res=declare_double ( IN->nseq, IN->len_aln); - - tot_seq=declare_double ( IN->nseq, 1); - max_seq=declare_double ( IN->nseq, 1); - tot_col=declare_double ( IN->len_aln,1); - max_col=declare_double ( IN->len_aln,1); - - max_aln=tot_aln=0; - - for (a=0; a< IN->len_aln; a++) - { - for ( b=0; b< IN->nseq; b++) - { - r1=tolower(IN->seq_al[b][a]); - if ( is_gap(r1))continue; - r= CL->M[r1-'A'][r1-'A']; - r= 1; - for ( c=0; cnseq; c++) - { - r2=tolower(IN->seq_al[c][a]); - if (b==c || is_gap (r2))continue; - - s=CL->M[r2-'A'][r1-'A']; - s=(s<=0)?0:1; - - tot_res[b][a]+=s; - max_res[b][a]+=r; - - tot_col[a][0]+=s; - max_col[a][0]+=r; - - tot_seq[b][0]+=s; - max_seq[b][0]+=r; - - tot_aln+=s; - max_aln+=r; - } - } - } - - - for ( a=0; a< IN->nseq; a++) - { - if ( !max_seq[a][0])continue; - - OUT->score_seq[a]=(tot_seq[a][0]*100)/max_seq[a][0]; - for (b=0; b< IN->len_aln; b++) - { - r1=IN->seq_al[a][b]; - if ( is_gap(r1) || !max_res[a][b])continue; - - r1=(tot_res[a][b]*10)/max_res[a][b]; - r1=(r1>=10)?9:r1; - r1=r1<0?0:r1; - (OUT)->seq_al[a][b]=r1+'0'; - } - } - - for ( a=0; a< IN->len_aln; a++) - { - r1=(max_col[a][0]==0)?0:((tot_col[a][0]*10)/max_col[a][0]); - r1=(r1>=10)?9:r1; - (OUT)->seq_al[OUT->nseq][a]=r1+'0'; - } - sprintf ( OUT->name[IN->nseq], "cons"); - if (max_aln)OUT->score_seq[OUT->nseq]=OUT->score_aln=(100*tot_aln)/max_aln; - - - free_double (tot_res,-1); - free_double (max_res,-1); - - free_double (tot_seq,-1); - free_double (max_seq,-1); - - return OUT; - } - -Alignment * sar_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c,r, s, r1, r2; - Alignment *OUT=NULL; - - double **tot_res; - double **max_res; - - double **tot_seq; - double **max_seq; - - double **tot_col; - double **max_col; - - double max_aln=0; - double tot_aln=0; - - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - - - if ( !CL->M)CL->M=read_matrice ("blosum62mt"); - - OUT=copy_aln (IN, OUT); - - - tot_res=declare_double ( IN->nseq, IN->len_aln); - max_res=declare_double ( IN->nseq, IN->len_aln); - - tot_seq=declare_double ( IN->nseq, 1); - max_seq=declare_double ( IN->nseq, 1); - tot_col=declare_double ( IN->len_aln,1); - max_col=declare_double ( IN->len_aln,1); - - max_aln=tot_aln=0; - - for (a=0; a< IN->len_aln; a++) - { - for (b=0; b< IN->nseq; b++) - { - r1=tolower(IN->seq_al[b][a]); - for (c=0; cnseq; c++) - { - r2=tolower(IN->seq_al[c][a]); - if (b==c)continue; - - if ( is_gap(r1) && is_gap(r2))s=0; - else s=(r1==r2)?1:0; - - r=1; - - - tot_res[b][a]+=s; - max_res[b][a]+=r; - - tot_col[a][0]+=s; - max_col[a][0]+=r; - - tot_seq[b][0]+=s; - max_seq[b][0]+=r; - - tot_aln+=s; - max_aln+=r; - } - } - } - - for ( a=0; a< IN->nseq; a++) - { - if ( !max_seq[a][0])continue; - OUT->score_seq[a]=(max_seq[a][0]*100)/max_seq[a][0]; - for (b=0; b< IN->len_aln; b++) - { - r1=IN->seq_al[a][b]; - if ( is_gap(r1) || !max_res[a][b])continue; - r1=(tot_res[a][b]*10)/max_res[a][b]; - r1=(r1>=10)?9:r1; - r1=r1<0?0:r1; - (OUT)->seq_al[a][b]=r1+'0'; - } - } - - for ( a=0; a< IN->len_aln; a++) - { - r1=(max_col[a][0]==0)?0:((tot_col[a][0]*10)/max_col[a][0]); - r1=(r1>=10)?9:r1; - (OUT)->seq_al[OUT->nseq][a]=r1+'0'; - } - sprintf ( OUT->name[IN->nseq], "cons"); - if (max_aln)OUT->score_aln=(100*tot_aln)/max_aln; - - - free_double (tot_res,-1); - free_double (max_res,-1); - - free_double (tot_seq,-1); - free_double (max_seq,-1); - - return OUT; - } -Alignment * boxshade_evaluate_output ( Alignment *IN,Constraint_list *CL, int T) - { - Alignment *OUT=NULL; - int **aa; - int r,br, bs, a, b; - float f; - - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - - - OUT=copy_aln (IN, OUT); - aa=declare_int (26, 2); - - for ( a=0; a< OUT->len_aln; a++) - { - for ( b=0; b< 26; b++){aa[b][1]=0;aa[b][0]='a'+b;} - for ( b=0; b< OUT->nseq; b++) - { - r=tolower(OUT->seq_al[b][a]); - if ( !is_gap(r))aa[r-'a'][1]++; - } - sort_int ( aa, 2, 1, 0,25); - f=(aa[25][1]*100)/OUT->nseq; - - if (fnseq; b++) - { - r=tolower(OUT->seq_al[b][a]); - if (r==br && bs>'1')OUT->seq_al[b][a]=bs; - } - OUT->seq_al[b][a]=bs; - } - } - sprintf ( OUT->name[IN->nseq], "cons"); - - return OUT; - } - -Alignment * categories_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - - Alignment *OUT=NULL; - int a, b, r; - int *aa; - float score, nseq2, tot_aln; - float n; - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - OUT=copy_aln (IN, OUT); - aa=vcalloc ( 26, sizeof (int)); - nseq2=IN->nseq*IN->nseq; - - for (tot_aln=0, a=0; a< IN->len_aln; a++) - { - for (n=0,b=0; b< IN->nseq; b++) - { - r=IN->seq_al[b][a]; - - if ( is_gap(r))n++; - else - { - aa[tolower(r)-'a']++; - n++; - } - } - n=n*n; - for ( score=0,b=0; b< 26; b++){score+=aa[b]*aa[b];aa[b]=0;} - /*score/=nseq2;*/ - score=(n==0)?0:score/n; - tot_aln+=score; - r=score*10; - r=(r>=10)?9:r; - (OUT)->seq_al[OUT->nseq][a]='0'+r; - } - OUT->score_aln=(tot_aln/OUT->len_aln)*100; - sprintf ( OUT->name[IN->nseq], "cons"); - vfree(aa); - return OUT; - } - -Alignment * categories_evaluate_output_old ( Alignment *IN,Constraint_list *CL) - { - - Alignment *OUT=NULL; - int nc,a, b, r; - int *aa, ng; - float score, nseq2, tot_aln, min=0; - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - OUT=copy_aln (IN, OUT); - aa=vcalloc ( 26, sizeof (int)); - nseq2=IN->nseq*IN->nseq; - - for (tot_aln=0, a=0; a< IN->len_aln; a++) - { - for (ng=0,b=0; b< IN->nseq; b++) - { - r=IN->seq_al[b][a]; - - if ( is_gap(r))ng++; - else - { - aa[tolower(r)-'a']++; - } - } - for (nc=0, b=0; b<26; b++) - { - if ( aa[b])nc++; - aa[b]=0; - } - if (nc>9)score=0; - else score=9-nc; - - score=(2*min)/IN->nseq; - - tot_aln+=score; - r=score*10; - r=(r>=10)?9:r; - (OUT)->seq_al[OUT->nseq][a]='0'+r; - } - - OUT->score_aln=(tot_aln/OUT->len_aln)*100; - sprintf ( OUT->name[IN->nseq], "cons"); - vfree(aa); - return OUT; - } - -Alignment * fast_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c, m,res, s, s1, s2, r1, r2; - Alignment *OUT=NULL; - int **pos, **pos2; - - double score_col=0, score_aln=0, score_res=0; - double max_col, max_aln; - double *max_seq, *score_seq; - int local_m; - int local_nseq; - - - /*NORMALIZE: with the highest scoring pair found in the multiple alignment*/ - - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair; } - - OUT=copy_aln (IN, OUT); - pos=aln2pos_simple(IN, IN->nseq); - pos2=aln2defined_residues (IN, CL); - - max_seq=vcalloc ( IN->nseq, sizeof (double)); - score_seq=vcalloc ( IN->nseq, sizeof (double)); - - - - /*1: Identify the highest scoring pair within the alignment*/ - - for ( m=0, a=0; a< IN->len_aln; a++) - { - for ( b=0; b< IN->nseq; b++) - { - s1=IN->order[b][0]; - r1=pos[b][a]; - - - for ( c=0; c< IN->nseq; c++) - { - s2=IN->order[c][0]; - r2=pos[c][a]; - if ( s1==s2 && !CL->do_self)continue; - - if ( s1< s2)s=(CL->evaluate_residue_pair)( CL, s1, r1, s2, r2); - else s=(CL->evaluate_residue_pair)( CL, s2, r2, s1, r1); - - s=(s!=UNDEFINED)?s:0; - m=MAX(m, s); - } - } - } - - local_m=m; - - sprintf ( OUT->name[IN->nseq], "cons"); - for ( max_aln=0,score_aln=0,a=0; a< IN->len_aln; a++) - { - OUT->seq_al[IN->nseq][a]=NO_COLOR_RESIDUE; - for ( local_nseq=0,b=0; bnseq; b++){local_nseq+=(pos[b][a]>0 && pos2[b][a])?1:0;} - local_m=m*(local_nseq-1); - - for ( max_col=0, score_col=0,b=0; b< IN->nseq; b++) - { - OUT->seq_al[b][a]=NO_COLOR_RESIDUE; - s1=IN->order[b][0]; - r1=pos[b][a]; - - if (r1<=0 || !pos2[b][a]) - { - continue; - } - - for ( score_res=0,c=0; c< IN->nseq; c++) - { - s2=IN->order[c][0]; - r2=pos[c][a]; - - if ((s1==s2 && !CL->do_self) || r2<=0 || !pos2[c][a]){continue;} - max_col +=m; - max_seq[b]+=m; - max_aln +=m; - - if ( s1< s2)s=(CL->evaluate_residue_pair)( CL, s1, r1, s2, r2); - else s=(CL->evaluate_residue_pair)( CL, s2, r2, s1, r1); - s=(s!=UNDEFINED)?s:0; - - score_res+=s; - score_col+=s; - score_seq[b]+=s; - score_aln+=s; - } - - res=(local_m==0)?NO_COLOR_RESIDUE:((score_res*10)/local_m); - (OUT)->seq_al[b][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res,9)); - - - } - - res=(max_col==0)?NO_COLOR_RESIDUE:((score_col*10)/max_col); - OUT->seq_al[IN->nseq][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res,9)); - - } - - IN->score_aln=OUT->score_aln=(max_aln==0)?0:((score_aln*100)/max_aln); - for ( a=0; a< OUT->nseq; a++) - { - OUT->score_seq[a]=(max_seq[a]==0)?0:((score_seq[a]*100)/max_seq[a]); - } - - free_int (pos , -1); - free_int (pos2, -1); - - vfree ( score_seq); - vfree ( max_seq); - return OUT; - } - - - -Alignment * slow_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c,res, s, s1, s2, r1, r2; - Alignment *OUT=NULL; - int **pos, **pos2; - double max_score_r, score_r, max; - double score_col=0, score_aln=0; - double max_score_col, max_score_aln; - double *max_score_seq, *score_seq; - int ***res_extended_weight; - int n_res_in_col; - - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - - - - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair; } - - - OUT=copy_aln (IN, OUT); - pos=aln2pos_simple(IN, IN->nseq); - pos2=aln2defined_residues (IN, CL); - - max_score_seq=vcalloc ( IN->nseq, sizeof (double)); - score_seq=vcalloc ( IN->nseq, sizeof (double)); - res_extended_weight=declare_arrayN(3,sizeof(int), (CL->S)->nseq, (CL->S)->max_len+1, 2); - max=(CL->normalise)?(100*CL->normalise)*SCORE_K:100; - - for (a=0; a< IN->len_aln; a++) - { - for ( b=0; b< IN->nseq-1; b++) - { - s1=IN->order[b][0]; - r1=pos[b][a]; - for ( c=b+1; c< IN->nseq; c++) - { - s2=IN->order[c][0]; - r2=pos[c][a]; - if ( s1==s2 && !CL->do_self)continue; - else if ( r1<=0 || r2<=0) continue; - else - { - s=(CL->evaluate_residue_pair)( CL, s1, r1, s2, r2); - res_extended_weight[s1][r1][0]+=s*100; - res_extended_weight[s2][r2][0]+=s*100; - res_extended_weight[s1][r1][1]+=max; - res_extended_weight[s2][r2][1]+=max; - } - } - } - } - - - sprintf ( OUT->name[IN->nseq], "cons"); - for ( max_score_aln=0,score_aln=0,a=0; a< IN->len_aln; a++) - { - OUT->seq_al[IN->nseq][a]=NO_COLOR_RESIDUE; - for ( n_res_in_col=0,b=0; bnseq; b++){n_res_in_col+=(pos[b][a]>0 && pos2[b][a]>0)?1:0;} - for ( max_score_col=0, score_col=0,b=0; b< IN->nseq; b++) - { - OUT->seq_al[b][a]=NO_COLOR_RESIDUE; - s1=IN->order[b][0]; - r1=pos[b][a]; - if (r1<=0 || pos2[b][a]<1)continue; - else - { - max_score_r =res_extended_weight[s1][r1][1]; - score_r =res_extended_weight[s1][r1][0]; - if ( max_score_r==0 && n_res_in_col>1)res=0; - else if ( n_res_in_col==1)res=NO_COLOR_RESIDUE; - else res=((score_r*10)/max_score_r); - - - (OUT)->seq_al[b][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res, 9)); - max_score_col+=max_score_r; - score_col+=score_r; - max_score_seq[b]+=max_score_r; - score_seq[b]+=score_r; - max_score_aln+=max_score_r; - score_aln+=score_r; - } - if ( max_score_col==0 && n_res_in_col>1)res=0; - else if ( n_res_in_col<2)res=NO_COLOR_RESIDUE; - else res=((score_col*10)/max_score_col); - - OUT->seq_al[IN->nseq][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res,9)); - } - } - IN->score_aln=OUT->score_aln=(max_score_aln==0)?0:((score_aln*100)/max_score_aln); - for ( a=0; a< OUT->nseq; a++) - { - OUT->score_seq[a]=(max_score_seq[a]==0)?0:((score_seq[a]*100)/max_score_seq[a]); - } - - - vfree ( score_seq); - vfree ( max_score_seq); - free_arrayN((void*)res_extended_weight, 3); - - - free_int (pos, -1); - free_int (pos2, -1); - return OUT; - } - - -Alignment * heuristic_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c,res, s, s1, s2, r1, r2; - Alignment *OUT=NULL; - int **pos; - int max_score_r, score_r; - double score_col=0, score_aln=0; - int max_score_col, max_score_aln; - double *max_score_seq, *score_seq; - int **tot_extended_weight; - int **res_extended_weight; - int n_res_in_col; - - /* - Residue x: sum of observed extended X.. /sum of possible X.. - */ - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair; } - - OUT=copy_aln (IN, OUT); - pos=aln2pos_simple(IN, IN->nseq); - - - max_score_seq=vcalloc ( IN->nseq, sizeof (double)); - score_seq=vcalloc ( IN->nseq, sizeof (double)); - - tot_extended_weight=list2residue_partial_extended_weight(CL); - res_extended_weight=declare_int ((CL->S)->nseq, (CL->S)->max_len+1); - - for (a=0; a< IN->len_aln; a++) - { - for ( b=0; b< IN->nseq-1; b++) - { - s1=IN->order[b][0]; - r1=pos[b][a]; - for ( c=b+1; c< IN->nseq; c++) - { - s2=IN->order[c][0]; - r2=pos[c][a]; - if ( s1==s2 && !CL->do_self)continue; - else if ( r1<=0 || r2<=0) continue; - else - { - if ( s1< s2)s=(CL->evaluate_residue_pair)( CL, s1, r1, s2, r2); - else s=(CL->evaluate_residue_pair)( CL, s2, r2, s1, r1); - res_extended_weight[s1][r1]+=s; - res_extended_weight[s2][r2]+=s; - } - } - } - } - - - sprintf ( OUT->name[IN->nseq], "cons"); - for ( max_score_aln=0,score_aln=0,a=0; a< IN->len_aln; a++) - { - OUT->seq_al[IN->nseq][a]=NO_COLOR_RESIDUE; - for ( n_res_in_col=0,b=0; bnseq; b++){n_res_in_col+=(pos[b][a]>0)?1:0;} - for ( max_score_col=0, score_col=0,b=0; b< IN->nseq; b++) - { - OUT->seq_al[b][a]=NO_COLOR_RESIDUE; - s1=IN->order[b][0]; - r1=pos[b][a]; - if (r1<=0)continue; - else - { - max_score_r =tot_extended_weight[s1][r1]; - score_r=res_extended_weight[s1][r1]; - res=(max_score_r==0 ||n_res_in_col<2 )?NO_COLOR_RESIDUE:((score_r*10)/max_score_r); - (OUT)->seq_al[b][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res, 9)); - max_score_col+=max_score_r; - score_col+=score_r; - max_score_seq[b]+=max_score_r; - score_seq[b]+=score_r; - max_score_aln+=max_score_r; - score_aln+=score_r; - } - res=(max_score_col==0 || n_res_in_col<2)?NO_COLOR_RESIDUE:((score_col*10)/max_score_col); - OUT->seq_al[IN->nseq][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res,9)); - } - } - IN->score_aln=OUT->score_aln=MIN(100,((max_score_aln==0)?0:((score_aln*100)/max_score_aln))); - for ( a=0; a< OUT->nseq; a++) - { - OUT->score_seq[a]=MIN(100,((max_score_seq[a]==0)?0:((score_seq[a]*100)/max_score_seq[a]))); - } - - - vfree ( score_seq); - vfree ( max_score_seq); - - free_int (tot_extended_weight, -1); - free_int (res_extended_weight, -1); - free_int (pos, -1); - - return OUT; - } -Alignment * non_extended_t_coffee_evaluate_output ( Alignment *IN,Constraint_list *CL) - { - int a,b, c,res, s1, s2, r1, r2; - Alignment *OUT=NULL; - int **pos; - int max_score_r, score_r; - double score_col=0, score_aln=0; - int max_score_col, max_score_aln; - double *max_score_seq, *score_seq; - int local_nseq; - int **tot_non_extended_weight; - int **res_non_extended_weight; - int *l; - CLIST_TYPE *entry=NULL; - int p; - int max_score=0; - - entry=vcalloc (CL->entry_len, CL->el_size); - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair; } - - OUT=copy_aln (IN, OUT); - pos=aln2pos_simple(IN, IN->nseq); - - - max_score_seq=vcalloc ( IN->nseq, sizeof (double)); - score_seq=vcalloc ( IN->nseq, sizeof (double)); - - tot_non_extended_weight=list2residue_total_weight(CL); - res_non_extended_weight=declare_int ((CL->S)->nseq, (CL->S)->max_len+1); - - for (a=0; a< IN->len_aln; a++) - { - for ( b=0; b< IN->nseq-1; b++) - { - s1=IN->order[b][0]; - r1=pos[b][a]; - for ( c=b+1; c< IN->nseq; c++) - { - s2=IN->order[c][0]; - r2=pos[c][a]; - if ( s1==s2 && !CL->do_self)continue; - else if ( r1<=0 || r2<=0) continue; - else - { - entry[SEQ1]=s1; - entry[SEQ2]=s2; - entry[R1]=r1; - entry[R2]=r2; - if ((l=main_search_in_list_constraint (entry,&p,4,CL))!=NULL) - { - res_non_extended_weight[s1][r1]+=l[WE]; - res_non_extended_weight[s2][r2]+=l[WE]; - } - entry[SEQ1]=s2; - entry[SEQ2]=s1; - entry[R1]=r2; - entry[R2]=r1; - if ((l=main_search_in_list_constraint (entry,&p,4,CL))!=NULL) - { - res_non_extended_weight[s1][r1]+=l[WE]; - res_non_extended_weight[s2][r2]+=l[WE]; - } - max_score=MAX(max_score,res_non_extended_weight[s1][r1]); - max_score=MAX(max_score,res_non_extended_weight[s2][r2]); - - } - } - } - } - - sprintf ( OUT->name[IN->nseq], "cons"); - for ( max_score_aln=0,score_aln=0,a=0; a< IN->len_aln; a++) - { - OUT->seq_al[IN->nseq][a]=NO_COLOR_RESIDUE; - for ( local_nseq=0,b=0; bnseq; b++){local_nseq+=(pos[b][a]>0)?1:0;} - - for ( max_score_col=0, score_col=0,b=0; b< IN->nseq; b++) - { - OUT->seq_al[b][a]=NO_COLOR_RESIDUE; - s1=IN->order[b][0]; - r1=pos[b][a]; - if (r1<=0)continue; - else - { - max_score_r =max_score;/*tot_non_extended_weight[s1][r1];*/ - score_r=res_non_extended_weight[s1][r1]; - res=(max_score_r==0 || local_nseq<2 )?NO_COLOR_RESIDUE:((score_r*10)/max_score_r); - - (OUT)->seq_al[b][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res, 9)); - max_score_col+=max_score_r; - score_col+=score_r; - max_score_seq[b]+=max_score_r; - score_seq[b]+=score_r; - max_score_aln+=max_score_r; - score_aln+=score_r; - } - res=(max_score_col==0 || local_nseq<2)?NO_COLOR_RESIDUE:((score_col*10)/max_score_col); - OUT->seq_al[IN->nseq][a]=(res==NO_COLOR_RESIDUE)?res:(MIN(res,9)); - } - } - IN->score_aln=OUT->score_aln=(max_score_aln==0)?0:((score_aln*100)/max_score_aln); - for ( a=0; a< OUT->nseq; a++) - { - OUT->score_seq[a]=(max_score_seq[a]==0)?0:((score_seq[a]*100)/max_score_seq[a]); - OUT->score_seq[a]=(OUT->score_seq[a]>100)?100:OUT->score_seq[a]; - } - OUT->score_aln=(OUT->score_aln>100)?100:OUT->score_aln; - - vfree ( score_seq); - vfree ( max_score_seq); - - free_int (tot_non_extended_weight, -1); - free_int (res_non_extended_weight, -1); - vfree(entry); - free_int (pos, -1); - - return OUT; - } - - -/*********************************************************************************************/ -/* */ -/* PROFILE/PRofile Functions */ -/* */ -/*********************************************************************************************/ -int channel_profile_profile (int *prf1, int *prf2, Constraint_list *CL); - -Profile_cost_func get_profile_mode_function (char *name, Profile_cost_func func) -{ - int a; - static int nfunc; - static Profile_cost_func *flist; - static char **nlist; - - - - /*The first time: initialize the list of pairwse functions*/ - /*If func==NULL:REturns a pointer to the function associated with a name*/ - /*If name is empty:Prints the name of the function associated with name*/ - - if ( nfunc==0) - { - flist=vcalloc ( 100, sizeof (Pwfunc)); - nlist=declare_char (100, 100); - - flist[nfunc]=cw_profile_profile; - sprintf (nlist[nfunc], "cw_profile_profile"); - nfunc++; - - flist[nfunc]=muscle_profile_profile; - sprintf (nlist[nfunc], "muscle_profile_profile"); - nfunc++; - - flist[nfunc]=channel_profile_profile; - sprintf (nlist[nfunc], "channel_profile_profile"); - nfunc++; - } - - for ( a=0; a0 && r2>0) - { - r1--; - r2--; - - prf1=(Profile1)?(Profile1->P)->count2[r1]:NULL; - prf2=(Profile2)?(Profile2->P)->count2[r2]:NULL; - - if (!prf1) {prf1=dummy; prf1[3]=(CL->S)->seq[s1][r1];} - else if (!prf2){prf2=dummy; prf2[3]=(CL->S)->seq[s2][r2];} - - score=((prf_prf==NULL)?cw_profile_profile:prf_prf) (prf1, prf2, CL); - return score; - } - else - return 0; - } - -int cw_profile_profile_count (int *prf1, int *prf2, Constraint_list *CL) - { - /*see function aln2count2 for prf structure*/ - int a, b, n; - int res1, res2; - double score=0; - - - for ( n=0,a=3; aM[res1-'A'][res2-'A']; - n+=prf1[a+1]*prf2[b+1]; - } - - - score=(score*SCORE_K)/n; - return score; - } -int muscle_profile_profile (int *prf1, int *prf2, Constraint_list *CL) - { - /*see function aln2count2 for prf structure*/ - int a, b; - int res1, res2; - double score=0, fg1, fg2, fi, fj, m; - static double *exp_lu; - if (exp_lu==NULL) - { - exp_lu=vcalloc ( 10000, sizeof (double)); - exp_lu+=2000; - for ( a=-1000; a<1000; a++) - exp_lu[a]=exp((double)a); - } - - - - for (a=3; aM[res1-'A'][res2-'A']);*/ - m=exp_lu[CL->M[res1-'A'][res2-'A']]; - score+=m*fi*fj; - } - } - - fg1=(double)prf1[2]/100; - fg2=(double)prf2[2]/100; - score=(score==0)?0:log(score)*(1-fg1)*(1-fg2); - score=(score*SCORE_K); - /*if ( score<-100)fprintf ( stderr, "\nSCORE %d %d", (int)score, cw_profile_profile(prf1, prf2, CL));*/ - - return (int)score; - } -int cw_profile_profile (int *prf1, int *prf2, Constraint_list *CL) - { - /*see function aln2count2 for prf structure*/ - int a, b, n,p; - int res1, res2; - double score=0; - - - for ( n=0,a=3; aM[res1-'A'][res2-'A']; - } - score=(score*SCORE_K)/((double)(n==0)?1:n); - return score; - } -int cw_profile_profile_old (int *prf1, int *prf2, Constraint_list *CL) - { - /*see function aln2count2 for prf structure*/ - int a, b, n,p; - int res1, res2; - double score=0; - - - - for ( n=0,a=3; aM[res1-'A'][res2-'A']; - } - score=(score*SCORE_K)/((double)(n==0)?1:n); - return score; - } -int channel_profile_profile ( int *prf1, int *prf2, Constraint_list *CL) -{ - - int score=0; - - prf1+=prf1[1]; - prf2+=prf2[1]; - - - if (prf1[0]!=prf1[0]){fprintf ( stderr, "\nERROR: Inconsistent number of channels [channel_profile_profile::FATAL%s]", PROGRAM);} - else - { - int a, n; - for (a=1, n=0; a<=prf1[0]; a++) - { - if (prf1[a]>0 && prf2[a]>0) - { - n++;score+=CL->M[prf1[a]-'A'][prf2[a]-'A']; - - } - } - - if ( n==0)return 0; - - score=(n==0)?0:(score*SCORE_K)/n; - - } - return score; -} - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR GETING THE COST : (Sequences) ->evaluate_residue_pair */ -/* */ -/*********************************************************************************************/ -int evaluate_blast_profile_score (Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - Alignment *PRF1; - Alignment *PRF2; - - - PRF1=(Alignment*)atop(seq2T_value (CL->S, s1, "A", "_RB_")); - PRF2=(Alignment*)atop(seq2T_value (CL->S, s2, "A", "_RB_")); - - return generic_evaluate_profile_score (CL,PRF1,s1, r1, PRF2,s2, r2, CL->profile_mode); -} - -int evaluate_aln_profile_score (Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - - return generic_evaluate_profile_score (CL,seq2R_template_profile((CL->S),s1),s1, r1, seq2R_template_profile(CL->S,s2),s2, r2, CL->profile_mode); -} - - -int evaluate_profile_score (Constraint_list *CL,Alignment *Prf1, int s1, int r1, Alignment *Prf2,int s2, int r2) -{ - - return generic_evaluate_profile_score (CL, Prf1, s1,r1,Prf2, s2,r2,CL->profile_mode); -} - -int evaluate_cdna_matrix_score (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - char a1, a2; - - if (r1>0 && r2>0) - { - r1--; - r2--; - - a1=translate_dna_codon((CL->S)->seq[s1]+r1,'x'); - a2=translate_dna_codon((CL->S)->seq[s2]+r2,'x'); - - - - if (a1=='x' || a2=='x')return 0; - else return CL->M[a1-'A'][a2-'A']*SCORE_K; - } - else - { - return 0; - } - } -int evaluate_physico_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - int a, b, p; - double tot; - static float **prop_table; - static int n_prop; - static double max; - if (r1<0 || r2<0)return 0; - if ( !prop_table) - { - prop_table= initialise_aa_physico_chemical_property_table(&n_prop); - for (p=0; p< n_prop; p++)max+=100; - max=sqrt(max); - } - a=tolower (( CL->S)->seq[s1][r1]); - b=tolower (( CL->S)->seq[s2][r2]); - - for (tot=0,p=0; p< n_prop; p++) - { - tot+=(double)(prop_table[p][a]-prop_table[p][b])*(prop_table[p][a]-prop_table[p][b]); - } - - tot=(sqrt(tot)/max)*10; - - return (int) tot*SCORE_K; -} - - - -int evaluate_diaa_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) - { - - static int ****m; - static int *alp; - - if (m==NULL) - { - FILE *fp; - char k1[2], k2[2]; - int v1, v2, c; - char *buf=NULL; - int a; - - m=declare_arrayN(4, sizeof (int), 26, 26, 26, 26); - fp=vfopen ("diaa_mat.mat", "r"); - while ((c=fgetc (fp))!=EOF) - { - - ungetc (c, fp); - buf=vfgets(buf, fp); - - if (c=='#'); - else - { - sscanf (buf, "%s %s %d %d", k1, k2, &v1, &v2); - - m[k1[0]-'a'][k1[1]-'a'][k2[0]-'a'][k2[1]-'a']=v1; - m[k2[0]-'a'][k2[1]-'a'][k1[0]-'a'][k1[1]-'a']=v1; - } - } - vfclose (fp); - alp=vcalloc (256, sizeof (int)); - for (a=0; a<26; a++)alp[a+'a']=1; - alp['b']=0; - alp['j']=0; - alp['o']=0; - alp['u']=0; - alp['x']=0; - alp['z']=0; - } - - - if (r1>0 && r2>0) - { - int s=0, n=0; - char aa1, aa2, aa3, aa4, u; - - r1--; - r2--; - - if (r1>0 && r2>0) - { - aa1=tolower((CL->S)->seq[s1][r1-1]); - aa2=tolower((CL->S)->seq[s1][r1]); - aa3=tolower((CL->S)->seq[s2][r2-1]); - aa4=tolower((CL->S)->seq[s2][r2]); - u=alp[(int)aa1];u+=alp[(int)aa2];u+=alp[(int)aa3];u+=alp[(int)aa4]; - if (u==4) - { - s+=m[aa1-'a'][aa2-'a'][aa3-'a'][aa4-'a']; - n++; - } - } - - aa1=tolower((CL->S)->seq[s1][r1]); - aa2=tolower((CL->S)->seq[s1][r1+1]); - aa3=tolower((CL->S)->seq[s2][r2]); - aa4=tolower((CL->S)->seq[s2][r2+1]); - u=alp[(int)aa1];u+=alp[(int)aa2];u+=alp[(int)aa3];u+=alp[(int)aa4]; - if (u==4) - { - s+=m[aa1-'a'][aa2-'a'][aa3-'a'][aa4-'a']; - n++; - } - if (n)return (s*SCORE_K)/n; - else return 0; - } - return 0;} -int evaluate_monoaa_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) - { - - static int **m; - static int *alp; - - if (m==NULL) - { - FILE *fp; - char k1[2], k2[2]; - int v1, v2, c; - char *buf=NULL; - int a; - - m=declare_arrayN(2, sizeof (int), 26, 26); - fp=vfopen ("monoaa_mat.mat", "r"); - while ((c=fgetc (fp))!=EOF) - { - - ungetc (c, fp); - buf=vfgets(buf, fp); - - if (c=='#'); - else - { - sscanf (buf, "%s %s %d %d", k1, k2, &v1, &v2); - - m[k1[0]-'a'][k2[0]-'a']=v1; - m[k2[0]-'a'][k1[0]-'a']=v1; - } - } - vfclose (fp); - alp=vcalloc (256, sizeof (int)); - for (a=0; a<26; a++)alp[a+'a']=1; - alp['b']=0; - alp['j']=0; - alp['o']=0; - alp['u']=0; - alp['x']=0; - alp['z']=0; - } - - - if (r1>0 && r2>0) - { - int s=0, n=0; - char aa1, aa3, u; - - r1--; - r2--; - - if (r1>0 && r2>0) - { - aa1=tolower((CL->S)->seq[s1][r1]); - aa3=tolower((CL->S)->seq[s2][r2]); - u=alp[(int)aa1];u+=alp[(int)aa3]; - if (u==2) - { - s+=m[aa1-'a'][aa3-'a']; - n++; - } - } - - if (n)return (s*SCORE_K)/n; - else return 0; - } - return 0;} -int evaluate_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) - { - - if ( seq2R_template_profile (CL->S,s1) ||seq2R_template_profile (CL->S,s2)) - { - return evaluate_aln_profile_score ( CL, s1,r1, s2, r2); - } - - if (r1>0 && r2>0) - { - r1--; - r2--; - - return CL->M[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K; - } - else - return 0; - } -int *get_curvature ( int s1, Constraint_list *CL); -int evaluate_curvature_score( Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - static int **st; - int score; - CL->gop=0; - CL->gep=0; - - if (!st) st= vcalloc ((CL->S)->nseq, sizeof (char*)); - if (!st[s1]) - { - st[s1]=get_curvature (s1, CL); - } - if (!st[s2]) - { - st[s2]=get_curvature (s2, CL); - } - - if (r1>0 && r2>0) - { - char p1, p2; - - r1--; - r2--; - - p1=st[s1][r1]; - p2=st[s2][r2]; - - score=p1-p2; - score=FABS(score); - score=20-score; - //HERE ("%d", score); - //if (score<0)HERE ("%d", score); - return score; - } - else - { - return 0; - } - -} -int *get_curvature ( int s1, Constraint_list *CL) -{ - int *array, n=0, a; - char c; - FILE *fp; - char name [1000], b1[100], b2[100]; - float f; - sprintf ( name, "%s.curvature", (CL->S)->name[s1]); - array=vcalloc (strlen ((CL->S)->seq[s1]), sizeof (int)); - fp=vfopen ( name, "r"); - while ( fscanf (fp, "%s %d %c %f\n",b1, &a, &c,&f )==4) - { - if ( c!=(CL->S)->seq[s1][n]){HERE ("ERROR: %c %c", c,(CL->S)->seq[s1][n] );exit (0);} - else array[n++]=(int)(float)100*(float)f; - } - vfclose (fp); - return array; -} -int evaluate_tm_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - static char **st; - static int **tmat; - - - if (!tmat) - { - tmat=read_matrice ("blosum62mt"); - } - - if (!st) st= vcalloc ((CL->S)->nseq, sizeof (char*)); - if (!st[s1])st[s1]=seq2T_template_string((CL->S),s1); - if (!st[s2])st[s2]=seq2T_template_string((CL->S),s2); - - - - if (r1>0 && r2>0) - { - int p1, p2; - - r1--; - r2--; - p1=p2=-1; - - if (st[s1])p1=tolower (st[s1][r1]); - if (st[s2])p2=tolower (st[s2][r2]); - - if ( p1=='h' && p2=='h')return tmat[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K; - //else if (p1=='h' || p2=='h' ) return -100*SCORE_K; - else return CL->M[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K; - - } - else - { - return 0; - } -} -int evaluate_ssp_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - static char **st; - static int **alpha, **beta, **coil; - - - if (!alpha) - { - beta=read_matrice ("beta_mat"); - alpha=read_matrice ("alpha_mat"); - coil=read_matrice ("coil_mat"); - } - - if (!st) st= vcalloc ((CL->S)->nseq, sizeof (char*)); - if (!st[s1])st[s1]=seq2E_template_string((CL->S),s1); - if (!st[s2])st[s2]=seq2E_template_string((CL->S),s2); - - - if ( !st[s1])HERE ("1******"); - if ( !st[s2])HERE ("2******"); - - if (r1>0 && r2>0) - { - char p1, p2; - float F; - - int score=0; - p1=p2=-1; - r1--; - r2--; - - if (st[s1])p1=tolower (st[s1][r1]); - if (st[s2])p2=tolower (st[s2][r2]); - - if (p1!=-1 && p1==p2)F=1.3; - else F=1; - - - score= CL->M[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*F*SCORE_K; - - - return score; - } - - else - { - return 0; - } -} - - -int evaluate_combined_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) - { - /* - function documentation: start - - int evaluate_matrix_score ( Constraint_list *CL, int s1, int s2, int r1, int r2) - - this function evaluates the score for matching residue S1(r1) wit residue S2(r2) - using Matrix CL->M; - - function documentation: end - */ - - if ( seq2R_template_profile (CL->S,s1) ||seq2R_template_profile (CL->S,s2)) - { - return evaluate_aln_profile_score ( CL, s1,r1, s2, r2); - } - - if (r1>0 && r2>0) - { - r1--; - r2--; - if (r1==0 || r2==0)return CL->M[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K; - else - { - int A1, A2, B1, B2, a2, b2; - int score; - - A1=toupper((CL->S)->seq[s1][r1-1]); - A2=toupper((CL->S)->seq[s1][r1]); - B1=toupper((CL->S)->seq[s2][r2-1]); - B2=toupper((CL->S)->seq[s2][r2]); - - a2=tolower(A2); - b2=tolower(B2); - A1-='A';A2-='A';B1-='A'; B2-='A';a2-='A';b2-='A'; - - score=CL->M[a2][b2]-FABS((CL->M[A1][A2])-(CL->M[B1][B2])); - score*=SCORE_K; - return score; - } - } - else - return 0; - } - -int residue_pair_non_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - - /* - This is the generic Function->works with everything - - int residue_pair_non_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2, int field ); - - Computes the non extended score for aligning residue seq1(r1) Vs seq2(r2) - - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - function documentation: end - */ - - int p; - - - static int *entry; - int *r; - int field; - - field = CL->weight_field; - - - if ( r1<=0 || r2<=0)return 0; - else if ( !CL->extend_jit) - { - if ( !entry) entry=vcalloc (LIST_N_FIELDS , sizeof (int)); - entry[SEQ1]=s1; - entry[SEQ2]=s2; - entry[R1]=r1; - entry[R2]=r2; - if ( r1==r2 && s1==s2) return UNDEFINED; - r=main_search_in_list_constraint( entry,&p,4,CL); - if (r==NULL)return 0; - else return r[field]*SCORE_K; - } - else - return UNDEFINED;/*ERROR*/ - - - } - - - -int residue_pair_extended_list_mixt (Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - int score=0; - - score+= residue_pair_extended_list_quadruplet(CL, s1, r1, s2, r2); - score+= residue_pair_extended_list (CL, s1, r1, s2, r2); - - return score*SCORE_K; - } - -int residue_pair_extended_list_quadruplet (Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - double score=0; - - int t_s, t_r, t_w, q_s, q_r, q_w; - int a, b; - static int **hasch; - - int field; - /* This measure the quadruplets cost on a pair of residues*/ - - - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch) - { - hasch=vcalloc ( (CL->S)->nseq, sizeof (int*)); - for ( a=0; a< (CL->S)->nseq; a++)hasch[a]=vcalloc ( (CL->S)->len[a]+1, sizeof (int)); - } - - CL=index_res_constraint_list ( CL, field); - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - t_w=CL->residue_index[s1][r1][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - q_w=CL->residue_index[t_s][t_r][b+2]; - if (CL-> seq_for_quadruplet[q_s]) - hasch[q_s][q_r]=MIN(q_w,t_w); - - } - } - } - - - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - t_w=CL->residue_index[s2][r2][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - q_w=CL->residue_index[t_s][t_r][b+2]; - if (hasch[q_s][q_r] && CL->seq_for_quadruplet[q_s]) - score+=MIN(hasch[q_s][q_r],MIN(q_w,t_w)); - } - } - } - - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - t_w=CL->residue_index[s1][r1][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - hasch[q_s][q_r]=0; - } - } - } - - return (int)(score*SCORE_K); - } - - -Constraint_list * R_extension ( Constraint_list *CL, Constraint_list *R); -int residue_pair_extended_list4rna4 (Constraint_list *CL,int s1, int r1, int s2, int r2 ) -{ - static int rna_lib; - - if (!rna_lib) - { - sprintf ( CL->rna_lib, "%s", seq2rna_lib (CL->S, NULL)); - rna_lib=1; - } - return residue_pair_extended_list4rna2 (CL, s1, r1, s2,r2); -} -int residue_pair_extended_list4rna1 (Constraint_list *CL, int s1, int r1, int s2, int r2 ) -{ - static Constraint_list *R; - if (!R)R=read_rna_lib (CL->S, CL->rna_lib); - return residue_pair_extended_list4rna (CL, R, s1, r1, s2, r2); -} - -int residue_pair_extended_list4rna3 (Constraint_list *CL,int s1, int r1, int s2, int r2 ) -{ - static Constraint_list *R; - if (!R) - { - R=read_rna_lib (CL->S, CL->rna_lib); - rna_lib_extension (CL,R); - } - return residue_pair_extended_list (CL, s1,r1, s2,r2); -} - -int residue_pair_extended_list4rna2 (Constraint_list *CL,int s1, int r1, int s2, int r2 ) -{ - static Constraint_list *R; - - - if (!R) - { - - R=read_rna_lib (CL->S, CL->rna_lib); - rna_lib_extension (CL,R); - - } - - return residue_pair_extended_list4rna (CL, R, s1, r1, s2, r2); -} -int residue_pair_extended_list4rna ( Constraint_list *CL,Constraint_list *R, int s1, int r1, int s2, int r2 ) -{ - - int a, b, n1, n2; - int list1[100]; - int list2[100]; - int score=0, score2; - - - - if ( r1<0 || r2<0)return 0; - n1=n2=0; - - list1[n1++]=r1; - for (a=1; aresidue_index[s1][r1][0]; a+=3) - { - list1[n1++]=R->residue_index[s1][r1][a+1]; - } - - - list2[n2++]=r2; - for (a=1; aresidue_index[s2][r2][0]; a+=3) - { - list2[n2++]=R->residue_index[s2][r2][a+1]; - } - - - score=residue_pair_extended_list ( CL, s1,list1[0], s2,list2[0]); - - for (score2=0,a=1; arna_lib, &n); - - R=declare_constraint_list ( CL->S,NULL, NULL, 0,NULL, NULL); - - for (a=0; a< n; a++) - { - R=read_constraint_list_file (R, list[a]); - } - R=index_res_constraint_list (R, CL->weight_field); - - } - - if ( r1<0 || r2<0)return 0; - n1=n2=0; - - list1[n1++]=r1; - for (a=1; aresidue_index[s1][r1][0]; a+=3) - { - list1[n1++]=R->residue_index[s1][r1][a+1]; - } - - - list2[n2++]=r2; - for (a=1; aresidue_index[s2][r2][0]; a+=3) - { - list2[n2++]=R->residue_index[s2][r2][a+1]; - } - - - score=residue_pair_extended_list ( CL, s1,list1[0], s2,list2[0]); - - for (score2=0,a=1; aweight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - /* Check matches for R1 in the indexed lib*/ - hasch[s1][r1]=FORBIDEN; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - /*Check Matches for r1 <-> r2 in the indexed lib */ - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - - - if (hasch[t_s][t_r]) - { - if (hasch[t_s][t_r]==FORBIDEN) - { - score+=CL->residue_index[s2][r2][a+2]; - } - else - { - delta=MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2]); - score+=delta; - } - } - } - - clean_residue_pair_hasch ( s1, r1,s2, r2, hasch, CL); - return score; - } -int residue_pair_extended_list_pc ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - double score=0; - - - - int a, t_s, t_r; - static int **hasch; - static int max_len; - int field; - double delta; - - /* - - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - /* Check matches for R1 in the indexed lib*/ - hasch[s1][r1]=FORBIDEN; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - /*Check Matches for r1 <-> r2 in the indexed lib */ - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - - - if (hasch[t_s][t_r]) - { - if (hasch[t_s][t_r]==FORBIDEN) - { - score+=((float)CL->residue_index[s2][r2][a+2]/NORM_F); - } - else - { - //delta=((float)hasch[t_s][t_r]/NORM_F)*((float)CL->residue_index[s2][r2][a+2]/NORM_F); - delta=MIN((((float)hasch[t_s][t_r]/NORM_F)),(((float)CL->residue_index[s2][r2][a+2]/NORM_F))); - score+=delta; - } - } - } - - clean_residue_pair_hasch ( s1, r1,s2, r2, hasch, CL); - score/=(CL->S)->nseq; - return score*NORM_F; - } - - -int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - double score=0; - double max_score=0; - double max_val=0; - - int a, t_s, t_r; - static int **hasch; - static int max_len; - int field; - - /* - new function: self normalized - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - /* Check matches for R1 in the indexed lib*/ - hasch[s1][r1]=FORBIDEN; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - max_score+=CL->residue_index[s1][r1][a+2]; - } - - /*Check Matches for r1 <-> r2 in the indexed lib */ - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - - - if (hasch[t_s][t_r]) - { - if (hasch[t_s][t_r]==FORBIDEN) - { - score+=CL->residue_index[s2][r2][a+2]; - max_score+=CL->residue_index[s2][r2][a+2]; - } - else - { - double delta; - delta=MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2]); - - score+=delta; - max_score-=hasch[t_s][t_r]; - max_score+=delta; - max_val=MAX(max_val,delta); - } - } - else - { - max_score+=CL->residue_index[s2][r2][a+2]; - } - } - - max_score-=hasch[s2][r2]; - clean_residue_pair_hasch ( s1, r1,s2, r2, hasch, CL); - - - if ( max_score==0)score=0; - else if ( CL->normalise) - { - score=((score*CL->normalise)/max_score)*SCORE_K; - if (max_val> CL->normalise) - { - score*=max_val/(double)CL->normalise; - } - } - return (int) score; - } -int ** clean_residue_pair_hasch (int s1, int r1, int s2, int r2,int **hasch, Constraint_list *CL) - { - int a, t_s, t_r; - if ( !hasch) return hasch; - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - return hasch; - } -int residue_pair_extended_list_old ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - double score=0; - - int a, t_s, t_r; - static int **hasch; - static int max_len; - - int field; - /* - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - if (hasch[t_s][t_r]) - { - if (field==WE) - { - - score+=MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2]); - } - } - } - - - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - - - return (int)(score*SCORE_K); - } -int residue_pair_test_function ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - double score=0; - - int a, t_s, t_r; - static int **hasch; - static int max_len; - int cons1; - int cons2; - - int field; - /* - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - - CL->weight_field=WE; - field=CL->weight_field; - - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - hasch[s1][r1]=1000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - if (hasch[t_s][t_r]) - { - cons1=hasch[t_s][t_r]; - cons2=CL->residue_index[s2][r2][a+2]; - score +=MIN(cons1,cons2); - } - } - - - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - - - return (int)(score*SCORE_K); - } - -int residue_pair_relative_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - int a, t_s, t_r; - static int **hasch; - static int max_len; - int score=0; - int total_score=0; - int field; - /* - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch || max_len!=(CL->S)->max_len) - { - max_len=(CL->S)->max_len; - if ( hasch) free_int ( hasch, -1); - hasch=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - } - - CL=index_res_constraint_list ( CL, field); - - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - total_score+=CL->residue_index[s1][r1][a+2]; - } - - - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - total_score+=CL->residue_index[s1][r1][a+2]; - if (hasch[t_s][t_r]) - { - if (field==WE){score+=2*MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2]);} - } - } - - score=((CL->normalise*score)/total_score); - - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - - return score*SCORE_K; - } -int residue_pair_extended_list_g_coffee_quadruplet ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) -{ - int t_s, t_r, t_w, q_s, q_r, q_w; - int a, b; - static int **hasch; - int score=0, s=0; - - int field; - /* This measure the quadruplets cost on a pair of residues*/ - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch) - { - hasch=vcalloc ( (CL->S)->nseq, sizeof (int*)); - for ( a=0; a< (CL->S)->nseq; a++)hasch[a]=vcalloc ( (CL->S)->len[a]+1, sizeof (int)); - } - - CL=index_res_constraint_list ( CL, field); - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - t_w=CL->residue_index[s1][r1][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - if (CL-> seq_for_quadruplet[q_s]) - { - - hasch[q_s][q_r]=MIN(CL->residue_index[t_s][t_r][b+2],t_w); - } - } - } - } - - - for (s=0,score=0,a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - t_w=CL->residue_index[s2][r2][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - q_w=CL->residue_index[t_s][t_r][b+2]; - if (hasch[q_s][q_r] && CL->seq_for_quadruplet[q_s]) - s=MIN(hasch[q_s][q_r],MIN(CL->residue_index[t_s][t_r][b+2],q_w)); - score=MAX(score, s); - } - } - } - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - t_w=CL->residue_index[s1][r1][a+2]; - if ( CL->seq_for_quadruplet[t_s]) - { - for ( b=1; bresidue_index[t_s][t_r][0]; b+=3) - { - q_s=CL->residue_index[t_s][t_r][b]; - q_r=CL->residue_index[t_s][t_r][b+1]; - hasch[q_s][q_r]=0; - } - } - } - - return score*SCORE_K; - } -int residue_pair_extended_list_g_coffee ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - int a, t_s, t_r; - static int **hasch; - int score=0,s; - - int field; - /* - function documentation: start - - int residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2); - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - - function documentation: end - */ - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - if ( !hasch) - { - hasch=vcalloc ( (CL->S)->nseq, sizeof (int*)); - for ( a=0; a< (CL->S)->nseq; a++)hasch[a]=vcalloc ( (CL->S)->len[a]+1, sizeof (int)); - } - - CL=index_res_constraint_list ( CL, field); - - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - - for (s=0, score=0,a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - - if (hasch[t_s][t_r]) - { - if (field==WE) - {s=MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2]); - score=MAX(s,score); - } - } - } - - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - - return score*SCORE_K; - } - -int extend_residue_pair ( Constraint_list *CL, int s1, int r1, int s2, int r2) - { - double score=0; - - int a, t_s, t_r, p; - static int **hasch; - - static int *entry; - int *r; - int field; - - - - /* - This is the generic Function->works with everything - should be gradually phased out - - - int extend_residue_pair ( Constraint_list *CL, int s1, int r1, int s2, int r2, int field ) - - Computes the extended score for aligning residue seq1(r1) Vs seq2(r2) - Computes: matrix_score - non extended score - extended score - - The extended score depends on the function index_res_constraint_list. - This function can compare a sequence with itself. - - Associated functions: See util constraint list, list extention functions. - function documentation: end - */ - - - field=CL->weight_field; - - if ( r1<=0 || r2<=0)return 0; - else if ( !CL->L && CL->M) - { - return evaluate_matrix_score (CL, s1,r1, s2, r2); - } - - else if ( !CL->extend_jit) - { - if ( !entry) entry=vcalloc (LIST_N_FIELDS , sizeof (int)); - entry[SEQ1]=s1; - entry[SEQ2]=s2; - entry[R1]=r1; - entry[R2]=r2; - r=main_search_in_list_constraint( entry,&p,4,CL); - if (r==NULL)return 0; - else return r[field]; - } - else - { - if ( !hasch) - { - hasch=vcalloc ( (CL->S)->nseq, sizeof (int*)); - for ( a=0; a< (CL->S)->nseq; a++)hasch[a]=vcalloc ( (CL->S)->len[a]+1, sizeof (int)); - } - - CL=index_res_constraint_list ( CL, field); - - hasch[s1][r1]=100000; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=CL->residue_index[s1][r1][a+2]; - } - - - for (a=1; a< CL->residue_index[s2][r2][0]; a+=3) - { - t_s=CL->residue_index[s2][r2][a]; - t_r=CL->residue_index[s2][r2][a+1]; - if (hasch[t_s][t_r]) - { - if (field==WE)score+=MIN(hasch[t_s][t_r],CL->residue_index[s2][r2][a+2] ); - - } - } - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - for (a=1; a< CL->residue_index[s1][r1][0]; a+=3) - { - t_s=CL->residue_index[s1][r1][a]; - t_r=CL->residue_index[s1][r1][a+1]; - hasch[t_s][t_r]=0; - } - hasch[s1][r1]=hasch[s2][r2]=0; - - return (int)(score*SCORE_K); - } - } -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR GETTING THE PW COST : CL->get_dp_cost */ -/* */ -/*********************************************************************************************/ -int get_dp_cost_blosum_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - int s1, r1, s2, r2; - static int **matrix; - - if (!matrix) matrix=read_matrice ("blosum62mt"); - s1=A->order[list1[0]][0]; - s2=A->order[list2[0]][0]; - r1=pos1[list1[0]][col1]; - r2=pos2[list2[0]][col2]; - - /*dp cost function: works only with two sequences*/ - - if ( seq2R_template_profile (CL->S,s1) ||seq2R_template_profile (CL->S,s2)) - return evaluate_aln_profile_score ( CL, s1,r1, s2, r2) -CL->nomatch*SCORE_K; - else if (r1>0 && r2>0) - { - r1--; - r2--; - - - return matrix [(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K -CL->nomatch*SCORE_K; - - } - else - return -CL->nomatch*SCORE_K ; -} -int get_dp_cost_pam_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - int s1, r1, s2, r2; - static int **matrix; - - if (!matrix) matrix=read_matrice ("pam250mt"); - s1=A->order[list1[0]][0]; - s2=A->order[list2[0]][0]; - r1=pos1[list1[0]][col1]; - r2=pos2[list2[0]][col2]; - - /*dp cost function: works only with two sequences*/ - - - if ( seq2R_template_profile (CL->S,s1) ||seq2R_template_profile (CL->S,s2)) - return evaluate_aln_profile_score ( CL, s1,r1, s2, r2) -CL->nomatch*SCORE_K; - else if (r1>0 && r2>0) - { - r1--; - r2--; - - - return matrix [(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K -CL->nomatch*SCORE_K; - - } - else - return -CL->nomatch*SCORE_K ; -} - -int get_dp_cost_pw_matrix (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - int s1, r1, s2, r2; - - s1=A->order[list1[0]][0]; - s2=A->order[list2[0]][0]; - r1=pos1[list1[0]][col1]; - r2=pos2[list2[0]][col2]; - - /*dp cost function: works only with two sequences*/ - if ( seq2R_template_profile (CL->S,s1) ||seq2R_template_profile (CL->S,s2)) - return evaluate_aln_profile_score ( CL, s1,r1, s2, r2) -CL->nomatch*SCORE_K; - else if (r1>0 && r2>0) - { - r1--; - r2--; - - - return CL->M[(CL->S)->seq[s1][r1]-'A'][(CL->S)->seq[s2][r2]-'A']*SCORE_K -CL->nomatch*SCORE_K; - - } - else - return -CL->nomatch*SCORE_K ; -} - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR GETTING THE COST : CL->get_dp_cost */ -/* */ -/*********************************************************************************************/ - - - -int get_cdna_best_frame_dp_cost (Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - int a, b; - int n=4; - int s; - char a1, a2; - static int l1, l2; - static Alignment *B; - static int **score; - - if ( !score)score=declare_int(3, 2); - - if (!A) - { - free_aln(B); - B=NULL; - return UNDEFINED; - } - if (!B) - { - if (ns1+ns2>2){fprintf ( stderr, "\nERROR: get_cdna_dp_cost mode is only for pair-wise ALN [FATAL]\n");crash("");} - free_aln (B); - B=copy_aln (A, NULL); - - l1=(int)strlen ( A->seq_al[list1[0]]); - for ( b=0; bseq_al[list1[0]][b]=translate_dna_codon (A->seq_al[list1[0]]+b, 'x'); - l2=(int)strlen ( A->seq_al[list2[0]]); - for ( b=0; bseq_al[list2[0]][b]=translate_dna_codon (A->seq_al[list2[0]]+b, 'x'); - } - -/*Set the frame*/ - - for ( a=0; a< 3; a++)score[a][0]=score[a][1]=0; - for ( a=col1-(n*3),b=col2-(n*3); a=l1 || b>=l2)continue; - - a1=tolower(B->seq_al[list1[0]][a]); - a2=tolower(B->seq_al[list2[0]][b]); - - score[a%3][0]+=(a1=='x' || a2=='x')?0:CL->M[a1-'A'][a2-'A']; - score[a%3][1]++; - } - - for ( a=0; a< 3; a++)score[a][0]=(score[a][1]>0)?(score[a][0]/score[a][1]):0; - if ( score[0][0]>score[1][0] && score[0][0]>score[2][0]) - s=score[0][0]; - else if ( score[1][0]>score[0][0] && score[1][0]>score[2][0]) - s=score[1][0]; - else s=score[2][0]; - - return s*SCORE_K; - - } - -int get_dp_cost_quadruplet ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - int score; - - - if ( ns1==1 || ns2==1) - score=slow_get_dp_cost ( A, pos1, ns1, list1,col1, pos2, ns2, list2, col2, CL); - else - score=fast_get_dp_cost_quadruplet ( A, pos1, ns1, list1,col1, pos2, ns2, list2, col2, CL); - - return (score==UNDEFINED)?UNDEFINED:(score-SCORE_K*CL->nomatch); - } -int get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - int MODE=0; - int score; - - - - if (A==NULL)return 0; - - if (MODE!=2 || MODE==0 || (!CL->L && CL->M) || (!CL->L && CL->T)|| ns1==1 || ns2==1) - score=slow_get_dp_cost ( A, pos1, ns1, list1,col1, pos2, ns2, list2, col2, CL); - else if (MODE==1 || MODE==2) - score=fast_get_dp_cost ( A, pos1, ns1, list1,col1, pos2, ns2, list2, col2, CL); - else - score=0; - - - - return (score==UNDEFINED)?UNDEFINED:(score-SCORE_K*CL->nomatch); - } -int ***make_cw_lu (int **cons, int l, Constraint_list *CL); -int ***make_cw_lu (int **cons, int l, Constraint_list *CL) -{ - int ***lu; - int p, a,r; - - lu=declare_arrayN(3, sizeof (int),l,26, 2); - for ( p=0; pM[r][cons[p][a]-'A']; - lu[p][r][1]+=cons[p][a+1]; - } - } - } - return lu; -} - -int cw_profile_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - static int last_tag; - static int *pr, ***lu; - int score; - static int *list[2], ns[2], **cons[2], ref; - int eva_col,ref_col, a, p, r; - float t1, t2; - - - - - if (last_tag!=A->random_tag) - { - int n1, n2; - - last_tag=A->random_tag; - list[0]=list1;ns[0]=ns1; - list[1]=list2;ns[1]=ns2; - free_int (cons[0],-1);free_int (cons[1],-1);free_arrayN((void*)lu,3); - cons[0]=NULL;cons[1]=NULL;lu=NULL; - - n1=sub_aln2nseq_prf (A, ns[0], list[0]); - n2=sub_aln2nseq_prf (A, ns[1], list[1]); - if ( n1>1 || n2>1) - { - cons[0]=sub_aln2count_mat2 (A, ns[0], list[0]); - cons[1]=sub_aln2count_mat2 (A, ns[1], list[1]); - ref=(ns[0]>ns[1])?0:1; - lu=make_cw_lu(cons[ref],(int)strlen(A->seq_al[list[ref][0]]), CL); - } - } - - if (!lu) - { - char r1, r2; - r1=A->seq_al[list1[0]][col1]; - r2=A->seq_al[list2[0]][col2]; - if ( r1!='-' && r2!='-') - return CL->M[r1-'A'][r2-'A']*SCORE_K -SCORE_K*CL->nomatch; - else - return -SCORE_K*CL->nomatch; - } - else - { - eva_col= (ref==0)?col2:col1; - ref_col= (ref==0)?col1:col2; - pr=cons[1-ref][eva_col]; - t1=t2=0; - for (a=3; a< pr[1]; a+=3) - { - r=tolower(pr[a]); - p= pr[a+1]; - - t1+=lu[ref_col][r-'a'][0]*p; - t2+=lu[ref_col][r-'a'][1]*p; - } - score=(t2==0)?0:(t1*SCORE_K)/t2; - score -=SCORE_K*CL->nomatch; - return score; - } -} -int cw_profile_get_dp_cost_old ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - static int last_tag; - static int **cons1, **cons2; - int score; - - - if (last_tag!=A->random_tag) - { - last_tag=A->random_tag; - free_int (cons1,-1);free_int (cons2,-1); - cons1=sub_aln2count_mat2 (A, ns1, list1); - cons2=sub_aln2count_mat2 (A, ns2, list2); - } - score=cw_profile_profile (cons1[col1], cons2[col2], CL)-SCORE_K*CL->nomatch; - return score; -} - -int cw_profile_get_dp_cost_window ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - static int last_tag; - static int **cons1, **cons2; - int a, score, window_size=5, n, p1, p2; - - - if (last_tag!=A->random_tag) - { - last_tag=A->random_tag; - free_int (cons1,-1);free_int (cons2,-1); - cons1=sub_aln2count_mat2 (A, ns1, list1); - cons2=sub_aln2count_mat2 (A, ns2, list2); - } - - for (n=0,score=0,a=0; anomatch; - n++; - } - if (n>0)score/=n; - - return score; - } - -int consensus_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - static int last_tag; - static char *seq1, *seq2; - - - /*Works only with matrix*/ - if (last_tag !=A->random_tag) - { - int ls1, ls2, lenls1, lenls2; - - last_tag=A->random_tag; - vfree (seq1);vfree (seq2); - seq1=sub_aln2cons_seq_mat (A, ns1, list1, "blosum62mt"); - seq2=sub_aln2cons_seq_mat (A, ns2, list2, "blosum62mt"); - ls1=list1[ns1-1];ls2=list2[ns2-1]; - lenls1=(int)strlen (A->seq_al[ls1]); lenls2=(int)strlen (A->seq_al[ls2]); - } - - return (CL->M[seq1[col1]-'A'][seq2[col2]-'A']*SCORE_K)-SCORE_K*CL->nomatch; - } - -int fast_get_dp_cost_quadruplet ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - /*WARNING: WORKS ONLY WITH List to Extend*/ - /*That function does a quruple extension beween two columns by pooling the residues together*/ - - double score=0; - - int a,b, c; - int n_gap1=0; - int n_gap2=0; - - int s1, rs1, r1, t_r, t_s,t_w, q_r, q_s, q_w, s2, rs2, r2; - int **buf_pos, buf_ns, *buf_list, buf_col; - - static int **hasch1; - static int **hasch2; - - static int **n_hasch1; - static int **n_hasch2; - - static int **is_in_col1; - static int **is_in_col2; - - - if (ns2>ns1) - { - buf_pos=pos1; - buf_ns=ns1; - buf_list=list1; - buf_col=col1; - - pos1=pos2; - ns1=ns2; - list1=list2; - col1=col2; - - pos2=buf_pos; - ns2=buf_ns; - list2=buf_list; - col2=buf_col; - } - - CL=index_res_constraint_list ( CL, WE); - if ( !hasch1) - { - - hasch1=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - hasch2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - n_hasch1=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - n_hasch2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - is_in_col1=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - is_in_col2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - } - - for ( a=0; a< ns1; a++) - { - rs1= list1[a]; - s1=A->order[rs1][0]; - r1=pos1[rs1][col1]; - - if (r1<0)n_gap1++; - else - { - is_in_col1[s1][r1]=1; - for (b=1; b< CL->residue_index[s1][r1][0]; b+=3) - { - t_s=CL->residue_index[s1][r1][b]; - t_r=CL->residue_index[s1][r1][b+1]; - t_w=CL->residue_index[s1][r1][b+2]; - for ( c=1; c< CL->residue_index[t_s][t_r][0]; c+=3) - { - q_s=CL->residue_index[t_s][t_r][c]; - q_r=CL->residue_index[t_s][t_r][c+1]; - q_w=CL->residue_index[t_s][t_r][c+2]; - hasch1[q_s][q_r]+=MIN(q_w, t_w); - n_hasch1[q_s][q_r]++; - } - } - } - } - - for ( a=0; a< ns2; a++) - { - rs2=list2[a]; - s2=A->order[rs2][0]; - r2=pos2[rs2][col2]; - - if (r2<0)n_gap2++; - else - { - is_in_col2[s2][r2]=1; - for (b=1; b< CL->residue_index[s2][r2][0]; b+=3) - { - t_s=CL->residue_index[s2][r2][b]; - t_r=CL->residue_index[s2][r2][b+1]; - t_w=CL->residue_index[s2][r2][b+2]; - for ( c=1; c< CL->residue_index[t_s][t_r][0]; c+=3) - { - q_s=CL->residue_index[t_s][t_r][c]; - q_r=CL->residue_index[t_s][t_r][c+1]; - q_w=CL->residue_index[t_s][t_r][c+2]; - hasch2[q_s][q_r]+=MIN(t_w, q_w); - n_hasch2[q_s][q_r]++; - } - } - } - } - - - for ( a=0; a< ns2; a++) - { - rs2=list2[a]; - s2=A->order[rs2][0]; - r2=pos1[rs2][col2]; - - if (r2<0); - else - { - for (b=1; b< CL->residue_index[s2][r2][0]; b+=3) - { - t_s=CL->residue_index[s2][r2][b]; - t_r=CL->residue_index[s2][r2][b+1]; - - for ( c=1; c< CL->residue_index[t_s][t_r][0]; c+=3) - { - q_s=CL->residue_index[t_s][t_r][c]; - q_r=CL->residue_index[t_s][t_r][c+1]; - if ( hasch2[q_s][q_r] && hasch1[q_s][q_r]&& !(is_in_col1[q_s][q_r] || is_in_col2[q_s][q_r])) - { - score+=MIN(hasch2[q_s][q_r]*(n_hasch1[q_s][q_r]),hasch1[q_s][q_r]*(n_hasch2[q_s][q_r])); - } - else if ( hasch2[q_s][q_r] && is_in_col1[q_s][q_r]) - { - score+=hasch2[q_s][q_r]*(n_hasch1[q_s][q_r]+1); - } - else if (hasch1[q_s][q_r] && is_in_col2[q_s][q_r]) - { - score+=hasch1[q_s][q_r]*(n_hasch2[q_s][q_r]+1); - } - hasch2[q_s][q_r]=0; - n_hasch2[q_s][q_r]=0; - } - } - hasch2[s2][r2]=0; - is_in_col2[s2][r2]=0; - } - } - - - for ( a=0; a< ns1; a++) - { - rs1= list1[a]; - s1=A->order[rs1][0]; - r1=pos1[rs1][col1]; - - if (r1<0); - else - { - is_in_col1[s1][r1]=0; - hasch1[s1][r1]=0; - for (b=1; b< CL->residue_index[s1][r1][0]; b+=3) - { - t_s=CL->residue_index[s1][r1][b]; - t_r=CL->residue_index[s1][r1][b+1]; - for ( c=1; c< CL->residue_index[t_s][t_r][0]; c+=3) - { - q_s=CL->residue_index[t_s][t_r][c]; - q_r=CL->residue_index[t_s][t_r][c+1]; - hasch1[q_s][q_r]=0; - n_hasch1[q_s][q_r]=0; - } - } - } - } - - - score=(score*SCORE_K)/((ns1-n_gap1)*(ns2-n_gap2)); - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - - return (int)(score-SCORE_K*CL->nomatch); - } - - -int fast_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - /*WARNING: WORKS ONLY WITH List to Extend*/ - - double score=0; - - int a,b; - int n_gap1=0; - int n_gap2=0; - - int s1, rs1, r1, t_r, t_s, s2, rs2, r2; - static int **hasch1; - static int **hasch2; - - static int **n_hasch1; - static int **n_hasch2; - - static int **is_in_col1; - static int **is_in_col2; - - - - CL=index_res_constraint_list ( CL, WE); - if ( !hasch1) - { - - hasch1=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - hasch2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - n_hasch1=declare_int ( (CL->S)->nseq, (CL->S)->max_len+1); - n_hasch2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - is_in_col1=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - is_in_col2=declare_int( (CL->S)->nseq, (CL->S)->max_len+1); - } - - for ( a=0; a< ns1; a++) - { - rs1= list1[a]; - s1=A->order[rs1][0]; - r1=pos1[rs1][col1]; - - if (r1<0)n_gap1++; - else - { - is_in_col1[s1][r1]=1; - for (b=1; b< CL->residue_index[s1][r1][0]; b+=3) - { - t_s=CL->residue_index[s1][r1][b]; - t_r=CL->residue_index[s1][r1][b+1]; - hasch1[t_s][t_r]+=CL->residue_index[s1][r1][b+2]; - n_hasch1[t_s][t_r]++; - } - } - } - - - for ( a=0; a< ns2; a++) - { - rs2=list2[a]; - s2=A->order[rs2][0]; - r2=pos2[rs2][col2]; - - if (r2<0)n_gap2++; - else - { - is_in_col2[s2][r2]=1; - for (b=1; b< CL->residue_index[s2][r2][0]; b+=3) - { - t_s=CL->residue_index[s2][r2][b]; - t_r=CL->residue_index[s2][r2][b+1]; - - hasch2[t_s][t_r]+=CL->residue_index[s2][r2][b+2]; - n_hasch2[t_s][t_r]++; - } - } - } - /*return 2;*/ - - if ( ns2order[rs2][0]; - r2=pos1[rs2][col2]; - - if (r2<0); - else - { - for (b=1; b< CL->residue_index[s2][r2][0]; b+=3) - { - t_s=CL->residue_index[s2][r2][b]; - t_r=CL->residue_index[s2][r2][b+1]; - - if ( hasch2[t_s][t_r] && hasch1[t_s][t_r]&& !(is_in_col1[t_s][t_r] || is_in_col2[t_s][t_r])) - { - score+=MIN(hasch2[t_s][t_r]*(n_hasch1[t_s][t_r]),hasch1[t_s][t_r]*(n_hasch2[t_s][t_r])); - } - else if ( hasch2[t_s][t_r] && is_in_col1[t_s][t_r]) - { - score+=hasch2[t_s][t_r]*(n_hasch1[t_s][t_r]+1); - } - else if (hasch1[t_s][t_r] && is_in_col2[t_s][t_r]) - { - score+=hasch1[t_s][t_r]*(n_hasch2[t_s][t_r]+1); - } - hasch2[t_s][t_r]=0; - n_hasch2[t_s][t_r]=0; - } - hasch2[s2][r2]=0; - is_in_col2[s2][r2]=0; - } - } - - - for ( a=0; a< ns1; a++) - { - rs1= list1[a]; - s1=A->order[rs1][0]; - r1=pos1[rs1][col1]; - - if (r1<0); - else - { - is_in_col1[s1][r1]=0; - hasch1[s1][r1]=0; - for (b=1; b< CL->residue_index[s1][r1][0]; b+=3) - { - t_s=CL->residue_index[s1][r1][b]; - t_r=CL->residue_index[s1][r1][b+1]; - - hasch1[t_s][t_r]=0; - n_hasch1[t_s][t_r]=0; - } - } - } - } - else - { - for ( a=0; a< ns1; a++) - { - rs1=list1[a]; - s1=A->order[rs1][0]; - r1=pos1[rs1][col1]; - - if (r1<0); - else - { - for (b=1; b< CL->residue_index[s1][r1][0]; b+=3) - { - t_s=CL->residue_index[s1][r1][b]; - t_r=CL->residue_index[s1][r1][b+1]; - - if ( hasch1[t_s][t_r] && hasch2[t_s][t_r]&& !(is_in_col2[t_s][t_r] || is_in_col1[t_s][t_r])) - { - score+=MIN(hasch1[t_s][t_r]*(n_hasch2[t_s][t_r]),hasch2[t_s][t_r]*(n_hasch1[t_s][t_r])); - } - else if ( hasch1[t_s][t_r] && is_in_col2[t_s][t_r]) - { - score+=hasch1[t_s][t_r]*(n_hasch2[t_s][t_r]+1); - } - else if (hasch2[t_s][t_r] && is_in_col1[t_s][t_r]) - { - score+=hasch2[t_s][t_r]*(n_hasch1[t_s][t_r]+1); - } - hasch1[t_s][t_r]=0; - n_hasch1[t_s][t_r]=0; - } - hasch1[s1][r1]=0; - is_in_col1[s1][r1]=0; - } - } - - - for ( a=0; a< ns2; a++) - { - rs2= list2[a]; - s2=A->order[rs2][0]; - r2=pos1[rs2][col2]; - - if (r2<0); - else - { - is_in_col2[s2][r2]=0; - hasch1[s2][r2]=0; - for (b=1; b< CL->residue_index[s2][r2][0]; b+=3) - { - t_s=CL->residue_index[s2][r2][b]; - t_r=CL->residue_index[s2][r2][b+1]; - - hasch2[t_s][t_r]=0; - n_hasch2[t_s][t_r]=0; - } - } - } - } - score=(score*SCORE_K)/((ns1-n_gap1)*(ns2-n_gap2)); - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - - return (int)(score-SCORE_K*CL->nomatch); - } - -int fast_get_dp_cost_2 ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - double score=0; - - int a, b, s1, s2,r1, r2; - static int n_pair; - - int s; - int res_res=0; - int rs1, rs2; - static int last_ns1; - static int last_ns2; - static int last_top1; - static int last_top2; - static int **check_list; - - - /*New heuristic get dp_cost on a limited number of pairs*/ - /*This is the current default*/ - - - if ( last_ns1==ns1 && last_top1==list1[0] && last_ns2==ns2 && last_top2==list2[0]); - else - { - - - last_ns1=ns1; - last_ns2=ns2; - last_top1=list1[0]; - last_top2=list2[0]; - if ( check_list) free_int (check_list, -1); - check_list=declare_int ( (CL->S)->nseq*(CL->S)->nseq, 3); - - for ( n_pair=0,a=0; a< ns1; a++) - { - s1 =list1[a]; - rs1=A->order[s1][0]; - for ( b=0; b< ns2; b++, n_pair++) - { - s2 =list2[b]; - rs2=A->order[s2][0]; - check_list[n_pair][0]=s1; - check_list[n_pair][1]=s2; - check_list[n_pair][2]=(!CL->DM)?0:(CL->DM)->similarity_matrix[rs1][rs2]; - } - sort_int ( check_list, 3, 2, 0, n_pair-1); - } - } - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair;} - - - for ( a=n_pair-1; a>=0; a--) - { - s1= check_list[a][0]; - rs1=A->order[s1][0]; - r1 =pos1[s1][col1]; - - s2= check_list[a][1]; - rs2=A->order[s2][0]; - r2 =pos2[s2][col2]; - - if ( r1>0 && r2 >0) - {res_res++;} - if ( rs1>rs2) - { - SWAP (rs1, rs2); - SWAP (r1, r2); - } - - if ((s=(CL->evaluate_residue_pair)(CL, rs1, r1, rs2, r2))!=UNDEFINED) score+=s; - else - { - - return UNDEFINED; - } - if ( res_res>=CL->max_n_pair && CL->max_n_pair!=0)a=0; - } - - score=(res_res==0)?0:( (score)/res_res); - score=score-SCORE_K*CL->nomatch; - - return (int)score; - } - -int fast_get_dp_cost_3 ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) -{ - static int last_tag; - static Constraint_list *NCL; - int score; - - if ( ns1==1 && ns2==1) - { - return slow_get_dp_cost( A,pos1, ns1,list1, col1, pos2, ns2, list2, col2,CL); - } - - if ( last_tag !=A->random_tag) - { - int *ns, **ls; - - last_tag=A->random_tag; - ns=vcalloc (2, sizeof (int));ns[0]=ns1; ns[1]=ns2; - ls=vcalloc (2, sizeof (int*));ls[0]=list1; ls[1]=list2; - - NCL=progressive_index_res_constraint_list ( A, ns, ls, CL); - vfree (ls); vfree (ns); - } - score=residue_pair_extended_list ( NCL,list1[0],col1, list2[0], col2); - score=(CL->normalise)?((score*CL->normalise)/CL->max_ext_value):score; - score=(score-SCORE_K*CL->nomatch); - return score; -} - - - -int slow_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - double score=0; - - int a, b, s1, s2,r1, r2; - int s; - int gap_gap=0; - int gap_res=0; - int res_res=0; - int rs1, rs2; - static int last_tag; - static int *dummy; - - if (col1<0 || col2<0) return 0; - if ( last_tag !=A->random_tag) - { - last_tag=A->random_tag; - if (!dummy) - { - dummy=vcalloc (10, sizeof(int)); - dummy[0]=1;/*Number of Amino acid types on colum*/ - dummy[1]=5;/*Length of Dummy*/ - dummy[3]='\0';/*Amino acid*/ - dummy[4]=1; /*Number of occurences*/ - dummy[5]=100; /*Frequency in the MSA column*/ - } - } - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair;} - - for ( a=0; a< ns1; a++) - { - for ( b=0; border[s1][0]; - r1 =pos1[s1][col1]; - - s2 =list2[b]; - rs2=A->order[s2][0]; - r2 =pos2[s2][col2]; - - if ( rs1>rs2) - { - SWAP (rs1, rs2); - SWAP (r1, r2); - } - - if (r1==0 && r2==0)gap_gap++; - else if ( r1<0 || r2<0) gap_res++; - else - { - res_res++; - if ((s=(CL->evaluate_residue_pair)(CL, rs1, r1, rs2, r2))!=UNDEFINED) score+=s; - else - { - - return UNDEFINED; - } - } - - } - } - - - score=(res_res==0)?0:( (score)/res_res); - - return score-SCORE_K*CL->nomatch; - - } -int slow_get_dp_cost_pc ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - double score=0; - - int a, b, s1, s2,r1, r2; - int s; - int gap_gap=0; - int gap_res=0; - int res_res=0; - int rs1, rs2; - static int last_tag; - static int *dummy; - - if (col1<0 || col2<0) return 0; - if ( last_tag !=A->random_tag) - { - last_tag=A->random_tag; - if (!dummy) - { - dummy=vcalloc (10, sizeof(int)); - dummy[0]=1;/*Number of Amino acid types on colum*/ - dummy[1]=5;/*Length of Dummy*/ - dummy[3]='\0';/*Amino acid*/ - dummy[4]=1; /*Number of occurences*/ - dummy[5]=100; /*Frequency in the MSA column*/ - } - } - - if ( !CL->evaluate_residue_pair){fprintf ( stderr, "\nWARNING: CL->evaluate_residue_pair Not set\nSet to: extend_residue_pair\n");CL->evaluate_residue_pair= extend_residue_pair;} - - for ( a=0; a< ns1; a++) - { - for ( b=0; border[s1][0]; - r1 =pos1[s1][col1]; - - s2 =list2[b]; - rs2=A->order[s2][0]; - r2 =pos2[s2][col2]; - - if ( rs1>rs2) - { - SWAP (rs1, rs2); - SWAP (r1, r2); - } - - if (r1==0 && r2==0)gap_gap++; - else if ( r1<0 || r2<0) gap_res++; - else - { - res_res++; - if ((s=residue_pair_extended_list_pc(CL, rs1, r1, rs2, r2))!=UNDEFINED) score+=s; - else - { - - return UNDEFINED; - } - } - - } - } - - - score=(res_res==0)?0:( (score)/res_res); - - return score; - - } -int slow_get_dp_cost_test ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - double score=0; - - int a, b, s1, s2,r1, r2; - int gap_gap=0, gap_res=0, res_res=0, rs1, rs2; - - for ( a=0; a< ns1; a++) - { - for ( b=0; border[s1][0]; - r1 =pos1[s1][col1]; - - s2 =list2[b]; - rs2=A->order[s2][0]; - r2 =pos2[s2][col2]; - - if ( rs1>rs2) - { - SWAP (rs1, rs2); - SWAP (r1, r2); - } - - if (r1==0 && r2==0)gap_gap++; - else if ( r1<0 || r2<0) gap_res++; - else - { - res_res++; - score+=residue_pair_extended_list_raw (CL, rs1, r1, rs2, r2); - } - } - } - - return (int)(score*10)/(ns1*ns2); - } - -int sw_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - int a, b; - int s1,r1,rs1; - int s2,r2,rs2; - - - - - for ( a=0; a< ns1; a++) - { - s1 =list1[a]; - rs1=A->order[s1][0]; - r1 =pos1[s1][col1]; - if ( r1<=0)continue; - for ( b=0; b< ns2; b++) - { - - - s2 =list2[b]; - rs2=A->order[s2][0]; - r2 =pos2[s2][col2]; - - if (r2<=0)continue; - - - if (sw_pair_is_defined (CL, rs1, r1, rs2, r2)==UNDEFINED)return UNDEFINED; - } - } - - return slow_get_dp_cost ( A, pos1, ns1, list1, col1, pos2, ns2, list2,col2, CL); - - } - - - - - - - - -int get_domain_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2,Constraint_list *CL , int scale , int gop, int gep) - - { - int a, b, s1, s2,r1, r2; - static int *entry; - int *r; - int score=0; - int gap_gap=0; - int gap_res=0; - int res_res=0; - int rs1, rs2; - int flag_list_is_aa_sub_mat=0; - int p; - -/*Needs to be cleanned After Usage*/ - - - - if ( entry==NULL) entry=vcalloc (LIST_N_FIELDS , sizeof (int)); - - for (a=0; a< ns1; a++) - { - s1=list1[a]; - rs1=A->order[s1][0]; - for ( b=0; border[s2][0]; - - entry[SEQ1]=rs1; - entry[SEQ2]=rs2; - r1=entry[R1]=pos1[s1][col1]; - r2=entry[R2]=pos2[s2][col2]; - - if ( !flag_list_is_aa_sub_mat) - { - if ( r1==r2 && rs1==rs2) - { - - return UNDEFINED; - } - else if (r1==0 && r2==0) - { - gap_gap++; - } - else if ( r1<=0 || r2<=0) - { - gap_res++; - } - else if ((r=main_search_in_list_constraint ( entry,&p,4,CL))!=NULL) - { - res_res++; - - if (r[WE]!=UNDEFINED) - { - score+=(r[WE]*SCORE_K)+scale; - } - else - { - fprintf ( stderr, "**"); - return UNDEFINED; - } - } - } - } - } - return score; - score=((res_res+gap_res)==0)?0:score/(res_res+gap_res); - return score; - } - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR ANALYSING AL OR MATRIX */ -/* */ -/*********************************************************************************************/ - -int aln2n_res ( Alignment *A, int start, int end) - { - int a, b; - int score=0; - - for ( a=start; anseq; b++)score+=!is_gap(A->seq_al[b][a]); - return score; - } - -float get_gop_scaling_factor ( int **matrix,float id, int l1, int l2) - { - return id* get_avg_matrix_mm(matrix, AA_ALPHABET); - } - -float get_avg_matrix_mm ( int **matrix, char *alphabet) - { - int a, b; - float naa; - float gop; - int l; - - - l=MIN(20,(int)strlen (alphabet)); - for (naa=0, gop=0,a=0; a=0){naa++;tot+=matrix[alphabet[a]-'A'][alphabet[b]-'A'];} - - } - return tot/naa; -} - -float measure_matrix_enthropy (int **matrix,char *alphabet) - { - - int a, b; - double s, p, q, h=0, tq=0; - float lambda; - float *frequency; - /*frequencies tqken from psw*/ - - frequency=set_aa_frequencies (); - - - lambda=compute_lambda(matrix,alphabet); - fprintf ( stderr, "\nLambda=%f", (float)lambda); - - for ( a=0; a< 20; a++) - for ( b=0; b<=a; b++) - { - s=matrix[alphabet[a]-'A'][alphabet[b]-'A']; - - - p=frequency[alphabet[a]-'A']*frequency[alphabet[b]-'A']; - - if ( p==0)continue; - - q=exp(lambda*s+log(p)); - - tq+=q; - h+=q*log(q/p)*log(2); - - } - - fprintf ( stderr,"\ntq=%f\n", (float)tq); - - return (float) h; - } -float compute_lambda (int **matrix,char *alphabet) -{ - - int a, b; - double lambda, best_lambda=0, delta, best_delta=0, p, tq,s; - static float *frequency; - - if ( !frequency)frequency=set_aa_frequencies (); - - for ( lambda=0.001; lambda<1; lambda+=0.005) - { - tq=0; - for ( a=0; a< 20; a++) - for ( b=0; b<20; b++) - { - p=frequency[alphabet[a]-'A']*frequency[alphabet[b]-'A']; - s=matrix[alphabet[a]-'A'][alphabet[b]-'A']; - tq+=exp(lambda*s+log(p)); - } - delta=fabs(1-tq); - if (lambda==0.001) - { - best_delta=delta; - best_lambda=lambda; - } - else - { - if (delta1)break; - } - fprintf ( stderr, "\nRESULT: %f %f ", best_lambda, best_delta); - return (float) best_lambda; -} - - - -float evaluate_random_match (char *mat, int n, int len,char *alp) -{ - int **matrix; - matrix=read_matrice ( mat); - fprintf ( stderr, "Matrix=%15s ", mat); - return evaluate_random_match2 (matrix, n,len,alp); - -} - -float evaluate_random_match2 (int **matrix, int n, int len,char *alp) -{ - int a, b, c, d, c1, c2, tot; - static int *list; - static float *freq; - float score_random=0; - float score_id=0; - float score_good=0; - float tot_len=0; - float tot_try=0; - - - if ( !list) - { - vsrand(0); - freq=set_aa_frequencies (); - list=vcalloc ( 10000, sizeof (char)); - } - - for (tot=0,c=0,a=0;a<20; a++) - { - b=freq[alp[a]-'A']*1000; - tot+=b; - for (d=0; d=0){score_good+=matrix[list[c1]-'A'][list[c2]-'A']; tot_len++;} - } - - - score_random=score_random/tot_len; - score_id=score_id/tot_len; - score_good=score_good/tot_len; - - fprintf ( stderr, "Random=%8.3f Id=%8.3f Good=%8.3f [%7.2f]\n",score_random, score_id, score_good, tot_len/tot_try); - - return score_random; -} -float compare_two_mat (char *mat1,char*mat2, int n, int len,char *alp) -{ - int **matrix1, **matrix2; - - evaluate_random_match (mat1, n, len,alp); - evaluate_random_match (mat2, n, len,alp); - matrix1=read_matrice ( mat1); - matrix2=read_matrice ( mat2); - matrix1=rescale_matrix(matrix1, 10, alp); - matrix2=rescale_matrix(matrix2, 10, alp); - compare_two_mat_array(matrix1,matrix2, n, len,alp); - return 0; -} - - -int ** rescale_two_mat (char *mat1,char*mat2, int n, int len,char *alp) -{ - float lambda; - int **matrix1, **matrix2; - - lambda=measure_lambda2 (mat1, mat2, n, len, alp)*10; - - fprintf ( stderr, "\nLambda=%.2f", lambda); - matrix2=read_matrice(mat2); - matrix2=neg_matrix2pos_matrix(matrix2); - matrix2=rescale_matrix( matrix2, lambda,"abcdefghiklmnpqrstvwxyz"); - - matrix1=read_matrice(mat1); - matrix1=neg_matrix2pos_matrix(matrix1); - matrix1=rescale_matrix( matrix1,10,"abcdefghiklmnpqrstvwxyz"); - - output_matrix_header ( "stdout", matrix2, alp); - evaluate_random_match2(matrix1, 1000, 100, alp); - evaluate_random_match2(matrix2, 1000, 100, alp); - compare_two_mat_array(matrix1,matrix2, n, len,alp); - - return matrix2; -} -float measure_lambda2(char *mat1,char*mat2, int n, int len,char *alp) -{ - int **m1, **m2; - float f1, f2; - - m1=read_matrice (mat1); - m2=read_matrice (mat2); - - m1=neg_matrix2pos_matrix(m1); - m2=neg_matrix2pos_matrix(m2); - - f1=measure_matrix_pos_avg( m1, alp); - f2=measure_matrix_pos_avg( m2, alp); - - return f1/f2; -} - - -float measure_lambda (char *mat1,char*mat2, int n, int len,char *alp) -{ - int c; - int **matrix1, **matrix2, **mat; - float a; - float best_quality=0, quality=0, best_lambda=0; - - matrix1=read_matrice ( mat1); - matrix2=read_matrice ( mat2); - matrix1=rescale_matrix(matrix1, 10, alp); - matrix2=rescale_matrix(matrix2, 10, alp); - - for (c=0, a=0.1; a< 2; a+=0.05) - { - fprintf ( stderr, "Lambda=%.2f\n", a); - mat=duplicate_int (matrix2,-1,-1); - mat=rescale_matrix(mat, a, alp); - quality=compare_two_mat_array(matrix1,mat, n, len,alp); - quality=MAX((-quality),quality); - - if (c==0 || (best_quality>quality)) - { - c=1; - fprintf ( stderr, "*"); - best_quality=quality; - best_lambda=a; - } - - - evaluate_random_match2(mat, 1000, 100, alp); - evaluate_random_match2(matrix1, 1000, 100, alp); - free_int (mat, -1); - } - - return best_lambda; - -} - -float compare_two_mat_array (int **matrix1,int **matrix2, int n, int len,char *alp) -{ - int a, b, c, d, c1, c2, tot; - static int *list; - static float *freq; - float delta_random=0; - float delta2_random=0; - - float delta_id=0; - float delta2_id=0; - - float delta_good=0; - float delta2_good=0; - - float delta; - - float tot_len=0; - float tot_try=0; - - - - if ( !list) - { - vsrand(0); - freq=set_aa_frequencies (); - list=vcalloc ( 10000, sizeof (char)); - } - - for (tot=0,c=0,a=0;a<20; a++) - { - b=freq[alp[a]-'A']*1000; - tot+=b; - for (d=0; d=0 || matrix2[list[c1]-'A'][list[c2]-'A'] ) - { - delta=matrix1[list[c1]-'A'][list[c2]-'A']-matrix2[list[c1]-'A'][list[c2]-'A']; - delta_good+=delta; - delta2_good+=MAX(delta,(-delta)); - tot_len++; - } - } - - - delta_random=delta_random/tot_len; - delta2_random=delta2_random/tot_len; - - - delta_id=delta_id/tot_len; - delta2_id=delta2_id/tot_len; - - delta_good=delta_good/tot_len; - delta2_good=delta2_good/tot_len; - - - fprintf ( stderr, "\tRand=%8.3f %8.3f\n\tId =%8.3f %8.3f\n\tGood=%8.3f %8.3f\n",delta_random, delta2_random, delta_id,delta2_id, delta_good,delta2_good); - - return delta_good; -} - - - -int ** rescale_matrix ( int **matrix, float lambda, char *alp) -{ - int a, b; - - - for ( a=0; a< 20; a++) - for ( b=0; b< 20; b++) - { - matrix[alp[a]-'A'][alp[b]-'A']= matrix[alp[a]-'A'][alp[b]-'A']*lambda; - } - return matrix; -} -int **mat2inverted_mat (int **matrix, char *alp) -{ - int a, b, min, max, v,l; - int c1,c2, C1, C2; - - l=(int)strlen (alp); - min=max=matrix[alp[0]-'A'][alp[0]-'A']; - for ( a=0; amax)?p[a][b]:max; - } - for (b='a'; b<='z'; b++) - { - p[a][b]=((p[a][b]-min)/(max-min))*10; - - } - } - - return p; -} -Constraint_list * choose_extension_mode ( char *extend_mode, Constraint_list *CL) -{ - if ( !CL) - { - fprintf ( stderr, "\nWarning: CL was not set"); - return CL; - } - else if ( strm ( extend_mode, "rna0")) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "rna1") || strm (extend_mode, "rna")) - { - CL->evaluate_residue_pair=residue_pair_extended_list4rna1; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "rna2")) - { - CL->evaluate_residue_pair=residue_pair_extended_list4rna2; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "rna3")) - { - CL->evaluate_residue_pair=residue_pair_extended_list4rna3; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "rna4")) - { - CL->evaluate_residue_pair=residue_pair_extended_list4rna4; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "pc") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list_pc; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =get_dp_cost; - } - else if ( strm ( extend_mode, "relative_triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_relative_extended_list; - CL->get_dp_cost =fast_get_dp_cost_2; - } - else if ( strm ( extend_mode, "g_coffee") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list_g_coffee; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "g_coffee_quadruplets") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list_g_coffee_quadruplet; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "fast_triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =fast_get_dp_cost; - } - else if ( strm ( extend_mode, "test_triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =fast_get_dp_cost_3; - } - else if ( strm ( extend_mode, "very_fast_triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =fast_get_dp_cost_2; - } - else if ( strm ( extend_mode, "slow_triplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list; - CL->get_dp_cost =slow_get_dp_cost; - } - else if ( strm ( extend_mode, "mixt") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list_mixt; - CL->get_dp_cost=slow_get_dp_cost; - } - else if ( strm ( extend_mode, "quadruplet") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_extended_list_quadruplet; - CL->get_dp_cost =get_dp_cost_quadruplet; - } - else if ( strm ( extend_mode, "test") && !CL->M) - { - CL->evaluate_residue_pair=residue_pair_test_function; - CL->get_dp_cost =slow_get_dp_cost_test; - } - else if ( strm ( extend_mode, "ssp")) - { - - CL->evaluate_residue_pair=evaluate_ssp_matrix_score; - CL->get_dp_cost=slow_get_dp_cost; - CL->normalise=1; - } - else if ( strm ( extend_mode, "tm")) - { - - CL->evaluate_residue_pair=evaluate_tm_matrix_score; - CL->get_dp_cost=slow_get_dp_cost; - CL->normalise=1; - } - else if ( strm ( extend_mode, "matrix")) - { - - CL->evaluate_residue_pair=evaluate_matrix_score; - CL->get_dp_cost=cw_profile_get_dp_cost; - CL->normalise=1; - } - else if ( strm ( extend_mode, "curvature")) - { - CL->evaluate_residue_pair=evaluate_curvature_score; - CL->get_dp_cost=slow_get_dp_cost; - CL->normalise=1; - } - else if ( CL->M) - { - CL->evaluate_residue_pair=evaluate_matrix_score; - CL->get_dp_cost=cw_profile_get_dp_cost; - CL->normalise=1; - } - else - { - fprintf ( stderr, "\nERROR: %s is an unknown extend_mode[FATAL:%s]\n", extend_mode, PROGRAM); - myexit (EXIT_FAILURE); - } - return CL; -} -int ** combine_two_matrices ( int **mat1, int **mat2) -{ - int naa, re1, re2, Re1, Re2, a, b, u, l; - - naa=(int)strlen (BLAST_AA_ALPHABET); - for ( a=0; a< naa; a++) - for ( b=0; b< naa; b++) - { - re1=BLAST_AA_ALPHABET[a]; - re2=BLAST_AA_ALPHABET[b]; - if (re1=='*' || re2=='*'); - else - { - - Re1=toupper(re1);Re2=toupper(re2); - re1-='A';re2-='A';Re1-='A';Re2-='A'; - - l=mat1[re1][re2]; - u=mat2[re1][re2]; - mat1[re1][re2]=mat2[re1][re2]=l; - mat2[Re1][Re2]=mat2[Re1][Re2]=u; - } - } - return mat1; -} - -/* Off the shelves evaluations */ -/*********************************************************************************************/ -/* */ -/* OFF THE SHELVES EVALUATION */ -/* */ -/*********************************************************************************************/ - - -int lat_sum_pair (Alignment *A, char *mat) -{ - int a,b,c, tot=0, v1, v2, score; - int **matrix; - - matrix=read_matrice (mat); - - for (a=0; anseq; a++) - for ( b=0; bnseq; b++) - { - for (c=1; clen_aln; c++) - { - char r11, r12; - - r11=A->seq_al[a][c-1]; - r12=A->seq_al[a][c]; - if (is_gap(r11) || is_gap(r12))continue; - else v1=matrix[r11-'A'][r12-'A']; - - r11=A->seq_al[b][c-1]; - r12=A->seq_al[b][c]; - if (is_gap(r11) || is_gap(r12))continue; - else v2=matrix[r11-'A'][r12-'A']; - - score+=(v1-v2)*(v1-v2); - tot++; - } - } - score=(100*score)/tot; - return (float)score; -} - - - -/* Off the shelves evaluations */ -/*********************************************************************************************/ -/* */ -/* OFF THE SHELVES EVALUATION */ -/* */ -/*********************************************************************************************/ - -int comp_pair ( int len,char *sa, char *sb, int seqA, int seqB,int *tgp_a, int *tgp_b,int gap_op,int gap_ex, int start, int end,int **matrix,int MODE); -int score_gap ( int len, char *sa, char *sb,int seqA, int seqB,int *tgp_a, int *tgp_b, int op, int ex, int start, int end, int MODE); -void evaluate_tgp_decoded_chromosome ( Alignment *A,int **TGP,int start, int end,int MODE); -int gap_type ( char a, char b); - - - -float sum_pair ( Alignment*A,char *mat_name, int gap_op, int gap_ex) - { - int a,b; - float pscore=0; - - int start, end; - static int **tgp; - double score=0; - int MODE=1; - int **matrix; - - matrix=read_matrice (mat_name); - matrix=mat2inverted_mat (matrix, "acdefghiklmnpqrstvwy"); - - start=0; - end=A->len_aln-1; - - if ( tgp==NULL) - tgp= declare_int (A->nseq,2); - - evaluate_tgp_decoded_chromosome ( A,tgp,start, end,MODE); - - for ( a=0; a< A->nseq-1; a++) - for (b=a+1; bnseq; b++) - { - pscore= comp_pair (A->len_aln,A->seq_al[a], A->seq_al[b],a, b,tgp[a], tgp[b],gap_op,gap_ex, start, end,matrix, MODE); - score+=pscore*100; - /*score+=(double)pscore*(int)(PARAM->OFP)->weight[A->order[a][0]][A->order[b][0]];*//*NO WEIGHTS*/ - } - - score=score/(A->nseq*A->nseq); - - return (float)score; - } - -int comp_pair ( int len,char *sa, char *sb, int seqA, int seqB,int *tgp_a, int *tgp_b,int gap_op,int gap_ex, int start, int end,int **matrix,int MODE) - { - int score=0, a, ex; - - - - if ( end-start>=0) - score+= score_gap (len, sa,sb, seqA, seqB,tgp_a, tgp_b, gap_op,gap_ex, start, end,MODE); - - ex=gap_ex; - - - for (a=start; a<=end; a++) - { - if ( is_gap(sa[a]) || is_gap(sb[a])) - { - if (is_gap(sa[a]) && is_gap(sb[a])); - else - { - - score +=ex; - } - } - else - { - score += matrix [sa[a]-'A'][sb[a]-'A']; - - } - } - return score; - } -int score_gap ( int len, char *sa, char *sb,int seqA, int seqB,int *tgp_a, int *tgp_b, int op, int ex, int start, int end, int MODE) - { - int a,b; - int ga=0,gb=0; - int score=0; - - - int right_gap, left_gap; - - - - - - int type; - int flag1=0; - int flag2=0; - int continue_loop; - int sequence_pattern[2][3]; - int null_gap; - int natural_gap=1; - - /*op= gor_gap_op ( 0,seqA, seqB, PARAM); - ex= gor_gap_ext ( 0, seqA, seqB, PARAM);*/ - - - - for (a=start; a<=end; ++a) - { - - type= gap_type ( sa[a], sb[a]); - - if ( type==2 && ga<=gb) - {++ga; - gb=0; - score += op; - } - else if (type==1 && ga >=gb) - { - ++gb; - ga=0; - score +=op; - } - else if (type==0) - { - ga++; - gb++; - } - - else if (type== -1) - ga=gb=0; - - - if (natural_gap==0) - { - if ( type== -1) - flag1=flag2=0; - else if ( type==0) - flag2=1; - else if ( (type==flag1) && flag2==1) - { - score+=op; - flag2=0; - } - else if ( (type!=flag1) && flag2==1) - { - flag1=type; - flag2=0; - } - else if ( flag2==0) - flag1=type; - } - } - /*gap_type -/-:0, X/X:-1 X/-:1, -/X:2*/ -/*evaluate the pattern of gaps*/ - - continue_loop=1; - sequence_pattern[0][0]=sequence_pattern[1][0]=0; - for ( a=start; a<=end && continue_loop==1; a++) - { - left_gap= gap_type ( sa[a], sb[a]); - if ( left_gap!= 0) - { - if ( left_gap==-1) - { - sequence_pattern[0][0]=sequence_pattern[1][0]=0; - continue_loop=0; - } - else - { - null_gap=0; - for (b=a; b<=end && continue_loop==1; b++) - {type=gap_type( sa[b], sb[b]); - if (type==0) - null_gap++; - if ( type!=left_gap && type !=0) - { - continue_loop=0; - sequence_pattern[2-left_gap][0]= b-a-null_gap; - sequence_pattern [1-(2-left_gap)][0]=0; - } - } - if ( continue_loop==1) - { - continue_loop=0; - sequence_pattern[2-left_gap][0]= b-a-null_gap; - sequence_pattern [1-(2-left_gap)][0]=0; - } - } - } - } - - sequence_pattern[0][2]=sequence_pattern[1][2]=1; - for ( a=start; a<=end; a++) - { - if ( !is_gap(sa[a])) - sequence_pattern[0][2]=0; - if ( !is_gap(sb[a])) - sequence_pattern[1][2]=0; - - } - continue_loop=1; - sequence_pattern[0][1]=sequence_pattern[1][1]=0; - for ( a=end; a>=start && continue_loop==1; a--) - { - right_gap= gap_type ( sa[a], sb[a]); - if ( right_gap!= 0) - { - if ( right_gap==-1) - { - sequence_pattern[0][1]=sequence_pattern[1][1]=0; - continue_loop=0; - } - else - { - null_gap=0; - for (b=a; b>=start && continue_loop==1; b--) - {type=gap_type( sa[b], sb[b]); - if ( type==0) - null_gap++; - if ( type!=right_gap && type !=0) - { - continue_loop=0; - sequence_pattern[2-right_gap][1]= a-b-null_gap; - sequence_pattern [1-(2-right_gap)][1]=0; - } - } - if ( continue_loop==1) - { - continue_loop=0; - sequence_pattern[2-right_gap][1]= a-b-null_gap; - sequence_pattern [1-(2-right_gap)][1]=0; - } - } - } - } - -/* -printf ( "\n*****************************************************"); -printf ( "\n%c\n%c", sa[start],sb[start]); -printf ( "\n%d %d %d",sequence_pattern[0][0] ,sequence_pattern[0][1], sequence_pattern[0][2]); -printf ( "\n%d %d %d",sequence_pattern[1][0] ,sequence_pattern[1][1], sequence_pattern[1][2]); -printf ( "\n*****************************************************"); -*/ - -/*correct the scoring*/ - - - if ( MODE==0) - { - if ( FABS(tgp_a[0])>1 && (FABS(tgp_a[0])>FABS( tgp_b[0]))) - score-= (sequence_pattern[0][0]>0)?op:0; - if ( FABS(tgp_b[0])>1 && (FABS(tgp_b[0])> FABS(tgp_a[0]))) - score-= (sequence_pattern[1][0]>0)?op:0; - } - else if ( MODE ==1 || MODE ==2) - { - if ( FABS(tgp_a[0])>1 && (FABS(tgp_a[0])>FABS( tgp_b[0])) && (tgp_a[1]!=1 || sequence_pattern[0][2]==0)) - score-= (sequence_pattern[0][0]>0)?op:0; - if ( FABS(tgp_b[0])>1 && (FABS(tgp_b[0])> FABS(tgp_a[0])) && (tgp_b[1]!=1 || sequence_pattern[1][2]==0)) - score-= (sequence_pattern[1][0]>0)?op:0; - - - if ( tgp_a[0]>=1 && tgp_a[0]==tgp_b[0]) - score -=(sequence_pattern[0][0]>0)?op:0; - if ( tgp_b[0]>=1 && tgp_a[0]==tgp_b[0]) - score-= (sequence_pattern[1][0]>0)?op:0; - - - if ( tgp_a[1]==1 && sequence_pattern[0][2]==0) - score -= ( sequence_pattern[0][1]>0)?op:0; - else if ( tgp_a[1]==1 && sequence_pattern[0][2]==1 && tgp_a[0]<=0) - score -= ( sequence_pattern[0][1]>0)?op:0; - - - if ( tgp_b[1]==1 && sequence_pattern[1][2]==0) - score -= ( sequence_pattern[1][1]>0)?op:0; - else if ( tgp_b[1]==1 && sequence_pattern[1][2]==1 && tgp_b[0]<=0) - score -= ( sequence_pattern[1][1]>0)?op:0; - - if ( MODE==2) - { - if ( tgp_a[0]>0) - score -=sequence_pattern[0][0]*ex; - if ( tgp_b[0]>0) - score -= sequence_pattern[1][0]*ex; - if ( tgp_a[1]>0) - score-=sequence_pattern[0][1]*ex; - if ( tgp_b[1]>0) - score-=sequence_pattern[1][1]*ex; - } - } - - - return score; - - - - } -void evaluate_tgp_decoded_chromosome ( Alignment *A,int **TGP,int start, int end,int MODE) - { - int a,b; - int continue_loop; - - - - if (MODE==11 || MODE==13|| MODE==14) - { - if ( start==0)for ( a=0; anseq; a++)TGP[a][0]=-1; - else for ( a=0; anseq; a++)TGP[a][0]=(is_gap(A->seq_al[a][start-1])==1)?0:1; - - if ( end==A->len_aln-1)for ( a=0; anseq; a++)TGP[a][1]=-1; - else for ( a=0; anseq; a++)TGP[a][1]=(is_gap(A->seq_al[a][start-1])==1)?0:1; - } - else - { - /* 0: in the middle of the alignement - 1: natural end - 2: q left gap is the continuation of another gap that was open outside the bloc ( don't open it) - */ - - for ( a=0; a< A->nseq; a++) - { - TGP[a][0]=1; - TGP[a][1]=1; - for ( b=0; b< start; b++) - if ( !is_gap(A->seq_al[a][b])) - TGP[a][0]=0; - if ( start>0 ) - { - if (is_gap(A->seq_al[a][start-1]) && TGP[a][0]!=1) - {TGP[a][0]=-1; - continue_loop=1; - for ( b=(start-1); b>=0 && continue_loop==1; b--) - {TGP[a][0]-= ( is_gap(A->seq_al[a][b])==1)?1:0; - continue_loop= (is_gap(A->seq_al[a][b])==1)?continue_loop:0; - } - } - } - else if (is_gap(A->seq_al[a][start-1]) && TGP[a][0]==1) - { - TGP[a][0]=1; - continue_loop=1; - for ( b=(start-1); b>=0 && continue_loop==1; b--) - {TGP[a][0]+= ( is_gap(A->seq_al[a][b])==1)?1:0; - continue_loop= (is_gap(A->seq_al[a][b])==1)?continue_loop:0; - } - } - for ( b=(A->len_aln-1); b>end; b--) - if ( !is_gap(A->seq_al[a][b])) - TGP[a][1]=0; - } - } - } -int gap_type ( char a, char b) - { - /*gap_type -/-:0, X/X:-1 X/-:1, -/STAR:2*/ - - if ( is_gap(a) && is_gap(b)) - return 0; - else if ( !is_gap(a) && !is_gap(b)) - return -1; - else if ( !is_gap(a)) - return 1; - else if ( !is_gap(b)) - return 2; - else - return -1; - } - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/evaluate_dirichlet.c b/binaries/src/tcoffee/t_coffee_source/evaluate_dirichlet.c deleted file mode 100644 index 960c142..0000000 --- a/binaries/src/tcoffee/t_coffee_source/evaluate_dirichlet.c +++ /dev/null @@ -1,599 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -static float dm[]={ -0.178091, -1.18065, 0.270671, 0.039848, 0.017576, 0.016415, 0.014268, 0.131916, 0.012391, 0.022599, 0.020358, 0.030727, 0.015315, 0.048298, 0.053803, 0.020662, 0.023612, 0.216147, 0.147226, 0.065438, 0.003758, 0.009621, -0.056591, -1.35583, 0.021465, 0.0103, 0.011741, 0.010883, 0.385651, 0.016416, 0.076196, 0.035329, 0.013921, 0.093517, 0.022034, 0.028593, 0.013086, 0.023011, 0.018866, 0.029156, 0.018153, 0.0361, 0.07177, 0.419641, -0.0960191, -6.66436 ,0.561459, 0.045448, 0.438366, 0.764167, 0.087364, 0.259114, 0.21494, 0.145928, 0.762204, 0.24732, 0.118662, 0.441564, 0.174822, 0.53084, 0.465529, 0.583402, 0.445586, 0.22705, 0.02951, 0.12109, -0.078123, -2.08141, 0.070143, 0.01114, 0.019479, 0.094657, 0.013162, 0.048038, 0.077, 0.032939, 0.576639, 0.072293, 0.02824, 0.080372, 0.037661, 0.185037, 0.506783, 0.073732, 0.071587, 0.042532, 0.011254, 0.028723, -0.0834977, -2.08101, 0.041103, 0.014794, 0.00561, 0.010216, 0.153602, 0.007797, 0.007175, 0.299635, 0.010849, 0.999446, 0.210189, 0.006127, 0.013021, 0.019798, 0.014509, 0.012049, 0.035799, 0.180085, 0.012744, 0.026466, -0.0904123, -2.56819, 0.115607, 0.037381, 0.012414, 0.018179, 0.051778, 0.017255, 0.004911, 0.796882, 0.017074, 0.285858, 0.075811, 0.014548, 0.015092, 0.011382, 0.012696, 0.027535, 0.088333, 0.94434, 0.004373, 0.016741, -0.114468, -1.76606, 0.093461, 0.004737, 0.387252, 0.347841, 0.010822, 0.105877, 0.049776, 0.014963, 0.094276, 0.027761, 0.01004, 0.187869, 0.050018, 0.110039, 0.038668, 0.119471, 0.065802, 0.02543, 0.003215, 0.018742, -0.0682132, -4.98768, 0.452171, 0.114613, 0.06246, 0.115702, 0.284246, 0.140204, 0.100358, 0.55023, 0.143995, 0.700649, 0.27658, 0.118569, 0.09747, 0.126673, 0.143634, 0.278983, 0.358482, 0.66175, 0.061533, 0.199373, -0.234585, -0.0995, 0.005193, 0.004039, 0.006722, 0.006121, 0.003468, 0.016931, 0.003647, 0.002184, 0.005019, 0.00599, 0.001473, 0.004158, 0.009055, 0.00363, 0.006583, 0.003172, 0.00369, 0.002967, 0.002772,0.002686}; - -double int_logB (int *i, int n) - { - static double *array; - int a; - - if ( array==NULL)array=vcalloc ( 1000, sizeof (double)); - - for ( a=0; a< n; a++) - array[a]=(double)i[a]; - return double_logB(array, n); - } -double float_logB (float *i, int n) - { - static double *array; - int a; - - if ( array==NULL)array=vcalloc ( 1000, sizeof (double)); - for ( a=0; a< n; a++) - array[a]=(double)i[a]; - return double_logB(array, n); - } - -double double_logB (double *x, int n) - { - double vx=0; - double result=0; - int i; - - - for ( i=0; iALPHA[a][b]+c); - - return lup; - } - -double double_logB2(int j, double *n,Mixture *D) - { - double vx=0; - double result=0; - int i; - - static double ***lup; - - - - if ( lup==NULL)lup=make_lup_table (D); - - - - for ( i=0; in_aa; i++)vx+=(double)n[i]+D->ALPHA[j][i]; - for ( i=0; in_aa; i++) - { - - - result+=lup[j][i][(int)n[i]]; - } - return result-lgamma2(vx); - } - -double compute_exponant ( double *n, int j, Mixture *D) - { - - if ( j>=9)fprintf ( stderr, "\nPB: j=%d", j); - - return double_logB2(j, n,D)-D->double_logB_alpha[j]; - } - - -double *compute_matrix_p ( double *n,int Nseq) - { - - /* - reads in a frquency list of various amino acids: - - sum freq(aa)=1 (gaps are ignored) - - aa[1]=x1 - aa[2]=x2 - .... - - Outputs a similar list with frequencies 'Blurred' using a pam250 mt - */ - - - - static int **matrix; - double *R; - int a, b; - double v,min, tot; - - - if ( !matrix) - { - matrix=read_matrice ( "pam250mt"); - } - - R=vcalloc ( 26, sizeof (double)); - - - for ( a=0; a<26; a++) - { - if (!is_aa(a+'a'))continue; - if ( n[a]==0)continue; - - for ( b=0; b< 26; b++) - { - if (!is_aa(b+'a'))continue; - v=n[a]*(matrix[a][b]); - if ( v>0) - { - R[b]+=v+(10*n[a]); - } - } - } - - min=R[0]; - for ( min=R[0],a=0; a< 26; a++)min=MIN(min,R[a]); - for ( tot=0, a=0; a< 26; a++) {R[a]-=min;tot+=R[a];} - for ( a=0; a< 26; a++)if ( is_aa(a+'a')){R[a]=R[a]*((float)(100)/(float)tot);} - return R; - } - - -double *compute_dirichlet_p ( double *n,int Nseq) - { - /* - Given a list of frequenceies measured for the residues, this function returns - the p_values associated with each residue in the column - */ - - int a, b; - double X_LIST[100]; - double sum, log_sum, max; - static Mixture *D; - static double *R; - - - - if (!D) - { - D=read_dirichlet (NULL); - - D->n_aa=20; - R=vcalloc ( D->n_aa, sizeof (double)); - D->double_logB_alpha=vcalloc (D->N_COMPONENT , sizeof (double)); - - D->exponant_list=vcalloc (D->N_COMPONENT , sizeof (double)); - precompute_log_B ( D->double_logB_alpha,D); - D->alpha_tot=vcalloc (D->N_COMPONENT , sizeof (double)); - for ( a=0; aN_COMPONENT; a++) - for ( b=0; b< D->n_aa; b++) - D->alpha_tot[a]+=D->ALPHA[a][b]; - } - - - - for ( D->tot_n=0,a=0; a< D->n_aa; a++)D->tot_n+=(double)n[a]; - max=D->exponant_list[0]=compute_exponant ( n, 0, D); - for ( a=1; aN_COMPONENT; a++) - { - D->exponant_list[a]=compute_exponant ( n, a,D); - max= ( max< D->exponant_list[a])?D->exponant_list[a]:max; - } - for ( a=1; aN_COMPONENT; a++)D->exponant_list[a]=D->exponant_list[a]-max; - - - for ( sum=0,log_sum=0,a=0; a< D->n_aa; a++) - { - sum+=X_LIST[a]=compute_X (n, a,D); - } - log_sum=log(sum); - - - for (a=0; an_aa; a++) - { - R[a]=(log(X_LIST[a])-log_sum); - } - - - /* - printf ( "\n["); - for ( a=0;a< n_aa; a++)printf ("%d ", n[a]); - printf ("] score=%f",(float) result ); - - fprintf ( stderr, "\nRESULT=%f", (float)result); - exit(0); - */ - return R; - - } - -void precompute_log_B ( double *table,Mixture *D) - { - int a; - for ( a=0; a< D->N_COMPONENT; a++) - { - table[a]=double_logB ( D->ALPHA[a], D->n_aa); - } - } -double compute_X (double *n,int i,Mixture *D) - { - int j; - double term1, term2,result; - double **alpha; - double *q; - - - - alpha=D->ALPHA; - q=D->DM_Q; - - for (result=0, j=0; jN_COMPONENT; j++) - { - term1=exp (D->exponant_list[j])*q[j]; - term2=(alpha[j][i]+(double)n[i])/(D->alpha_tot[j]+D->tot_n); - result+=term1*term2; - } - return result; - } -Mixture * read_dirichlet ( char *name) - { - FILE *fp; - int a,b, c; - float f; - Mixture *D; - - - D=vcalloc ( 1, sizeof (Mixture)); - - - D->N_COMPONENT=9; - D->ALPHA=vcalloc (9, sizeof (double*)); - for ( a=0; a< 9; a++) - D->ALPHA[a]=vcalloc (20, sizeof (double)); - D->DM_Q=vcalloc (9, sizeof (double)); - - if (name!=NULL) - { - fp=vfopen ( name, "r"); - for ( a=0; a< 9; a++) - { - fscanf(fp, "%f\n", &f); - D->DM_Q[a]=(double)f; - fscanf(fp, "%f", &f); - - for ( b=0; b<20; b++) - { - fscanf(fp, "%f", &f); - D->ALPHA[a][b]=(double)f; - } - fscanf(fp, "\n"); - } - for ( a=0; a< 9; a++) - { - fprintf(stderr, "\n%f\n",(float)D->DM_Q[a] ); - - for ( b=0; b<20; b++) - { - fprintf(stderr, "%f ", (float)D->ALPHA[a][b]); - } - fprintf(stderr, "\n"); - } - fprintf ( stderr, "\nN_C=%d",D->N_COMPONENT ); - vfclose ( fp); - } - else - { - for (c=0, a=0; a< 9;a++) - { - D->DM_Q[a]=dm[c++]; - for (b=0; b<20; b++) - D->ALPHA[a][b]=dm[c++]; - } - } - - return D; - } -int dirichlet_code( char aa) - { - - char x; - - x=tolower (aa); - - if ( (x<'a') || (x>'z')) - crash ( "CODE UNDEFINED"); - else if ( x<='a') - return x-'a'; - else if ( x<='i') - return x-('a'+1); - else if ( x<= 'n') - return x-('a'+2); - else if ( x<='t') - return x-('a'+3); - else if ( x<='w') - return x-('a'+4); - else if ( x=='y') - return x-('a'+5); - else - { - crash ("ERROR in dirichlet_code"); - return 0; - } - return 0; - - } - - -static const double -two52= 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ -half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ -one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ -pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ -a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */ -a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */ -a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */ -a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */ -a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */ -a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */ -a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */ -a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */ -a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */ -a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */ -a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */ -a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */ -tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */ -tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */ -/* tt = -(tail of tf) */ -tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */ -t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */ -t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */ -t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */ -t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */ -t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */ -t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */ -t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */ -t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */ -t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */ -t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */ -t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */ -t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */ -t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */ -t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */ -t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */ -u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ -u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */ -u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */ -u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */ -u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */ -u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */ -v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */ -v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */ -v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */ -v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */ -v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */ -s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ -s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */ -s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */ -s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */ -s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */ -s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */ -s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */ -r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */ -r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */ -r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */ -r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */ -r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */ -r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */ -w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */ -w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */ -w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */ -w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */ -w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */ -w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */ -w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */ - -static const double zero= 0.00000000000000000000e+00; - -static double sin_pi(double x) -{ - double y,z; - int n,ix; - - ix=(*(long long *)&x)>>32; - ix &= 0x7fffffff; - - if(ix<0x3fd00000) return sin(pi*x); - y = -x; /* x is assume negative */ - - /* - * argument reduction, make sure inexact flag not raised if input - * is an integer - */ - z = floor(y); - if(z!=y) { /* inexact anyway */ - y *= 0.5; - y = 2.0*(y - floor(y)); /* y = |x| mod 2.0 */ - n = (int) (y*4.0); - } else { - if(ix>=0x43400000) { - y = zero; n = 0; /* y must be even */ - } else { - if(ix<0x43300000) z = y+two52; /* exact */ - n=(*(long long *)&x); - n &= 1; - y = n; - n<<= 2; - } - } - switch (n) { - case 0: y = sin(pi*y); break; - case 1: - case 2: y = cos(pi*(0.5-y)); break; - case 3: - case 4: y = sin(pi*(one-y)); break; - case 5: - case 6: y = -cos(pi*(y-1.5)); break; - default: y = sin(pi*(y-2.0)); break; - } - return -y; -} - -double lgamma2 ( double x) -{ - int s; - return lgamma_r ( x, &s); -} -double lgamma_r(double x, int *signgamp) -{ - double t,y,z,nadj=0,p,p1,p2,p3,q,r,w; - int i,hx,lx,ix; - - hx=(*(long long *)&x)>>32; - lx=(*(long long *)&x); - - /* purge off +-inf, NaN, +-0, and negative arguments */ - *signgamp = 1; - ix = hx&0x7fffffff; - if(ix>=0x7ff00000) return x*x; - if((ix|lx)==0) return one/fabs(x); - if(ix<0x3b900000) { /* |x|<2**-70, return -log(|x|) */ - if(hx<0) { - *signgamp = -1; - return -log(-x); - } else return -log(x); - } - if(hx<0) { - if(ix>=0x43300000) /* |x|>=2**52, must be -integer */ - return x/zero; - t = sin_pi(x); - if(t==zero) return one/fabs(t); /* -integer */ - nadj = log(pi/fabs(t*x)); - if(t=0x3FE76944) {y = one-x; i= 0;} - else if(ix>=0x3FCDA661) {y= x-(tc-one); i=1;} - else {y = x; i=2;} - } else { - r = zero; - if(ix>=0x3FFBB4C3) {y=2.0-x;i=0;} /* [1.7316,2] */ - else if(ix>=0x3FF3B4C4) {y=x-tc;i=1;} /* [1.23,1.73] */ - else {y=x-one;i=2;} - } - switch(i) { - case 0: - z = y*y; - p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); - p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); - p = y*p1+p2; - r += (p-0.5*y); break; - case 1: - z = y*y; - w = z*y; - p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ - p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); - p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); - p = z*p1-(tt-w*(p2+y*p3)); - r += (tf + p); break; - case 2: - p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); - p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); - r += (-0.5*y + p1/p2); - } - } - else if(ix<0x40200000) { /* x < 8.0 */ - i = (int)x; - t = zero; - y = x-(double)i; - p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); - q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); - r = half*y+p/q; - z = one; /* lgamma(1+s) = log(s) + lgamma(s) */ - switch(i) { - case 7: z *= (y+6.0); /* FALLTHRU */ - case 6: z *= (y+5.0); /* FALLTHRU */ - case 5: z *= (y+4.0); /* FALLTHRU */ - case 4: z *= (y+3.0); /* FALLTHRU */ - case 3: z *= (y+2.0); /* FALLTHRU */ - r += log(z); break; - } - /* 8.0 <= x < 2**58 */ - } else if (ix < 0x43900000) { - t = log(x); - z = one/x; - y = z*z; - w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); - r = (x-half)*(t-one)+w; - } else - /* 2**58 <= x <= inf */ - r = x*(log(x)-one); - if(hx<0) r = nadj - r; - return r; -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/evaluate_for_domain.c b/binaries/src/tcoffee/t_coffee_source/evaluate_for_domain.c deleted file mode 100644 index 6f53a12..0000000 --- a/binaries/src/tcoffee/t_coffee_source/evaluate_for_domain.c +++ /dev/null @@ -1,311 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - -#include "dp_lib_header.h" - - - - - -int evaluate_moca_domain ( Alignment *A, Constraint_list *CL) - { - /* - function documentation: start - int evaluate_moca_domain ( Alignment *A, Constraint_list *CL) - - This function evaluates a multiple local alignment - If the alignmnent is to be accepted, return score - Else return UNDEFINED - - function documentation: end - */ - - - int score=0; - int start, end, a, b; - Alignment *B=NULL; - char alp[200]; - - - score=UNDEFINED; - end=0; - start=0; - - sprintf ( alp, "acefghiklmnpqrstuvwy"); - - if ( A->len_aln>0) - { - score=(int)(output_maln_pval ( "/dev/null", A)*-100); - return score; - } - else - return 0; - - - - - while ((end+1)!=A->len_aln) - { - end=get_nol_aln_border (A,start,GO_RIGHT); - if ( end==start)break; - fprintf ( stderr, "\n**%d %d (%d)",start, end, A->len_aln); - B=copy_aln (A, B); - B=extract_aln (B,start,end); - for (a=0; anseq; a++) - for ( b=0; blen_aln; b++) - if ( is_gap (B->seq_al[a][b]))B->seq_al[a][b]=alp[(int)rand()%(strlen (alp))]; - - - start=end; - fprintf ( stderr, "==>%d",(int)(output_maln_pval ( "/dev/null", B)*-100) ); - if ( score==UNDEFINED)score=(int)(output_maln_pval ( "/dev/null", B)*-100); - else - score=MAX(score,(int)(output_maln_pval ( "/dev/null", B)*-100)); - - - } - free_aln (B); - return score; - } - - -int moca_slow_get_dp_cost ( Alignment *A, int**pos1, int ns1, int*list1, int col1, int**pos2, int ns2, int*list2, int col2, Constraint_list *CL) - { - int s; - - s=slow_get_dp_cost ( A, pos1, ns1, list1, col1, pos2, ns2, list2, col2, CL); - - - if ( s==UNDEFINED)return UNDEFINED; - else return s+(CL->moca)->moca_scale; - - } -int moca_evaluate_matrix_score ( Constraint_list *CL, int s1, int r1, int s2, int r2) -{ - /* - function documentation: start - int moca_residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - - THIS FUNCTION RETURNS THE EXTENDED SCORE OF A PAIR OF RESIDUES - it is meant to work with local aln pair_wise routines, by using (CL->moca)->forbiden_residues - a constant value is substracted from the extended score. - - This function is meant toi be used with omain_dp, therefore, it allows the match of identical residues. - - function documentation: end - */ - - if (unpack_seq_residues ( &s1, &r1, &s2, &r2, CL->packed_seq_lu)==UNDEFINED)return UNDEFINED; - else if ( (CL->moca)->forbiden_residues && ((CL->moca)->forbiden_residues[s1][r1]==UNDEFINED ||(CL->moca)->forbiden_residues[s2][r2]==UNDEFINED))return UNDEFINED; - else if ( s1==s2 && r1 == r2) return UNDEFINED; - else return evaluate_matrix_score(CL, s1, r1, s2, r2); - } - - - - -int moca_residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - { - /* - function documentation: start - int moca_residue_pair_extended_list ( Constraint_list *CL, int s1, int r1, int s2, int r2 ) - - THIS FUNCTION RETURNS THE EXTENDED SCORE OF A PAIR OF RESIDUES - it is meant to work with local aln pair_wise routines, by using (CL->moca)->forbiden_residues - a constant value is substracted from the extended score. - - This function is meant toi be used with omain_dp, therefore, it allows the match of identical residues. - - function documentation: end - */ - - if (unpack_seq_residues ( &s1, &r1, &s2, &r2, CL->packed_seq_lu)==UNDEFINED)return UNDEFINED; - else if ( (CL->moca)->forbiden_residues && ((CL->moca)->forbiden_residues[s1][r1]==UNDEFINED ||(CL->moca)->forbiden_residues[s2][r2]==UNDEFINED))return UNDEFINED; - else if ( s1==s2 && r1 == r2) return UNDEFINED; - else return residue_pair_extended_list (CL, s1, r1, s2, r2); - - - } - -int **cache_cl_with_moca_domain (Alignment *A, Constraint_list *CL) - { - /* - function documentation: start - int **cache_cl_with_moca_domain (Alignment *A, Constraint_list *CL) - - Read a multiple alignmnent - Given all the residues (CL->S)->seq[x][y] contained in the maln - Set (CL->moca)->forbiden_residues[x][y] to UNDEFINED - return (CL->moca)->forbiden_residues - - WARNING - You must make sure that the evalation strategy uses (CL->moca)->forbiden_residues - (CL->moca)->forbiden_residues[0][1]->first residue(1) of First sequence(0) - function documentation: end - */ - - int **pos; - int a, b; - - pos=aln2pos_simple(A, A->nseq); - - if ( !(CL->moca)->forbiden_residues)(CL->moca)->forbiden_residues=declare_int ((CL->S)->nseq, strlen ((CL->S)->seq[0])+1); - - for ( a=0; anseq;a++) - for ( b=0; b< A->len_aln; b++) - (CL->moca)->forbiden_residues[A->order[a][0]][pos[a][b]]=UNDEFINED; - - free_int (pos, -1); - return (CL->moca)->forbiden_residues; - } -Alignment *make_moca_nol_aln ( Alignment *A, Constraint_list *CL) -{ - - return A; -} - -/*********************************************************************************************/ -/* */ -/* DOMAIN Z SCORE EVALUATION */ -/* */ -/*********************************************************************************************/ - -int evaluate_domain_aln_z_score (Alignment *A, int start, int end,Constraint_list *CL, char *alphabet) - { - int a; - static Alignment *B; - double score, ref_score; - double N_EVAL=1000; - double sum=0, sum2=0; - - - if ( A==NULL || A->nseq==0 || A->len_aln==0)return 0; - ref_score=(double)evaluate_domain_aln (A,start, end,CL); - for (sum=0, sum2=0,a=0;anseq, end-start, alphabet); - score=(double)evaluate_domain_aln (B,0,B->len_aln,CL); - sum+=score; - sum2+=score*score; - } - score=(return_z_score(ref_score, sum, sum2, N_EVAL)*100)/A->len_aln; - - return(int) score; - } - -int evaluate_domain_aln ( Alignment *A, int start, int end,Constraint_list *CL) - { - int a, b, c; - int score, c1, c2; - static int **mat; - - /* - function documentation: start - - This function uses a pam250 to evaluate the sum of pairs score of A, - between position start(included) to position end (exluded), - - the numbering starts 0 - function documentation: end - */ - - if ( !mat)mat=read_matrice ( "pam250mt"); - - for ( c=start, score=0; cnseq-1; a++) - for ( b=a+1; b< A->nseq; b++) - { - c1=tolower(A->seq_al[a][c]); - c2=tolower(A->seq_al[b][c]); - - if ( !is_gap (c1) && !is_gap(c2))score+=mat[c1-'A'][c2-'A']; - } - } - return score; - } - -int unpack_seq_residues ( int *s1, int *r1, int *s2, int *r2, int **packed_seq_lu) - { - /* Given a series of sequences concatenated (packed), and the coordinates of two residues - This function translates the coordinates into the real ones and allows evaluation - Note for this function residues go from [1->N], sequences from [0->N[ - This is true for in and out comming residues number - NOTE: The sequence cannot be guessed when the residues r1 or r2 are GAPS, therefore UNDEFINED is returned - NOTE: Concatenated sequences are separated with X, such residues cause an UNDEFINED to be returned - */ - - if ( packed_seq_lu==NULL)return 1; - else if ( s1[0]!=s2[0])return 1; - else if ( r1[0]<=0 || r2[0]<=0)return UNDEFINED; - else if ( packed_seq_lu[r1[0]][0]==UNDEFINED || packed_seq_lu[r2[0]][0]==UNDEFINED)return UNDEFINED; - else - { - s1[0]=packed_seq_lu[r1[0]][0]; - r1[0]=packed_seq_lu[r1[0]][1]; - - s2[0]=packed_seq_lu[r2[0]][0]; - r2[0]=packed_seq_lu[r2[0]][1]; - } - return 1; - } - -Alignment * unpack_seq_aln ( Alignment *A,Constraint_list *CL) - { - int a, b, r_seq, r_start, r_len; - - - if (!CL->packed_seq_lu) return A; - - for (a=0; a< A->nseq; a++) - { - r_seq =CL->packed_seq_lu[A->order[a][1]+1][0]; - r_start=CL->packed_seq_lu[A->order[a][1]+1][1]; - - A->order[a][0]=r_seq; - A->order[a][1]=r_start-1; - - for ( r_len=0,b=0; b< A->len_aln; b++)r_len+=!is_gap(A->seq_al[a][b]); - sprintf ( A->name[a],"%s_%d_%d", (A->S)->name[r_seq], r_start, r_start+r_len-1); - } - - return A; - } - - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/evaluate_for_struc.c b/binaries/src/tcoffee/t_coffee_source/evaluate_for_struc.c deleted file mode 100644 index 1292642..0000000 --- a/binaries/src/tcoffee/t_coffee_source/evaluate_for_struc.c +++ /dev/null @@ -1,2674 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -void print_atom ( Atom*A); - -float **** quantile_apdb_filtration ( Alignment *A, float ****residues, Constraint_list *CL,Pdb_param *PP, FILE *fp); -float **** irmsdmin_apdb_filtration ( Alignment *A, float ****residues, Constraint_list *CL,Pdb_param *PP, FILE *fp); -int apdb ( int argc, char *argv[]) - { - - Constraint_list *CL=NULL; - Sequence *S=NULL; - Alignment *A=NULL; - Alignment *EA=NULL; - Pdb_param *pdb_param; - - Fname *F=NULL; - char *file_name; - int a,c; - - int n_pdb; - -/*PARAMETERS VARIABLES*/ - int garbage; - char *parameters; - FILE *fp_parameters; - - int quiet; - char *se_name; - FILE *le=NULL; - - char **list_file; - int n_list; - char **struc_to_use; - int n_struc_to_use; - - char *aln; - char *repeat_seq; - char *repeat_pdb; - - char *color_mode; - char *comparison_io; - - int n_excluded_nb; - - float maximum_distance; - float similarity_threshold; - float md_threshold; - - - int print_rapdb; - - char *outfile; - char *run_name; - - char *apdb_outfile; - char *cache; - - char **out_aln_format; - int n_out_aln_format; - - char *output_res_num; - char *local_mode; - float filter; - int filter_aln; - int irmsd_graph; - int nirmsd_graph; - int n_template_file; - char **template_file_list; - char *mode; - int prot_min_sim; - int prot_max_sim; - int prot_min_cov; - int pdb_min_sim; - int pdb_max_sim; - int pdb_min_cov; - - - - char *prot_blast_server; - char *pdb_blast_server; - - - char *pdb_db; - char *prot_db; - - - argv=standard_initialisation (argv, &argc); - -/*PARAMETER PROTOTYPE: READ PARAMETER FILE */ - declare_name (parameters); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-parameters" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "R_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Read the files in the parameter file" ,\ - /*Parameter*/ ¶meters ,\ - /*Def 1*/ "NULL" ,\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - if ( parameters && parameters[0]) - { - argv[argc]=vcalloc ( VERY_LONG_STRING, sizeof(char)); - a=0; - fp_parameters=vfopen (parameters, "r"); - while ((c=fgetc (fp_parameters))!=EOF)argv[1][a++]=c; - vfclose (fp_parameters); - argv[argc][a]='\0'; - argc++; - argv=break_list ( argv, &argc, "=:;, \n"); - } -/*PARAMETER PROTOTYPE*/ - declare_name (se_name); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-quiet" ,\ - /*Flag*/ &quiet ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &se_name ,\ - /*Def 1*/ "stderr" ,\ - /*Def 2*/ "/dev/null" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - le=vfopen ( se_name, "w"); - fprintf ( le, "\nPROGRAM: %s\n",argv[0]); - -/*PARAMETER PROTOTYPE: IN */ - list_file=declare_char ( 200, STRING); - n_list=get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-in" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 200 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ list_file ,\ - /*Def 1*/ "",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: IN */ - struc_to_use=declare_char ( 200, STRING); - n_struc_to_use=get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-struc_to_use" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 200 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ struc_to_use ,\ - /*Def 1*/ "",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: COMPARISON IO */ - declare_name (comparison_io); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-io_format" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 200 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &comparison_io,\ - /*Def 1*/ "hsgd0123456",\ - /*Def 2*/ "" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: ALN */ - declare_name (aln); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-aln" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &aln,\ - /*Def 1*/ "",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: ALN */ - - declare_name (repeat_seq); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-repeat_seq" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &repeat_seq,\ - /*Def 1*/ "",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: ALN */ - declare_name (repeat_pdb); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-repeat_pdb" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &repeat_pdb,\ - /*Def 1*/ "",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: Nb to exclude */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-n_excluded_nb" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Exclude the N Nb on each side of the central residue. -1 triggers an automatic setting equal to the window size corresponding to the sphere" ,\ - /*Parameter*/ &n_excluded_nb ,\ - /*Def 1*/ "-1" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: diatances to count */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-similarity_threshold" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &similarity_threshold,\ - /*Def 1*/ "70" ,\ - /*Def 2*/ "70" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: diatances to count */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-filter" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Filter by only keeping the best quantile" ,\ - /*Parameter*/ &filter,\ - /*Def 1*/ "1.00" ,\ - /*Def 2*/ "1.00" ,\ - /*Min_value*/ "-1.00" ,\ - /*Max Value*/ "1.00" \ - ); -/*PARAMETER PROTOTYPE: diatances to count */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-filter_aln" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Lower Case For Residues Filtered Out" ,\ - /*Parameter*/ &filter_aln,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "0" ,\ - /*Max Value*/ "1" \ - ); -/*PARAMETER PROTOTYPE: diatances to count */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-irmsd_graph" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Outputs the irmsd, position/position" ,\ - /*Parameter*/ &irmsd_graph,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "0" ,\ - /*Max Value*/ "1" \ - ); -/*PARAMETER PROTOTYPE: diatances to count */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-nirmsd_graph" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Outputs the NIRMSD VS N Removed Residues Curve" ,\ - /*Parameter*/ &nirmsd_graph,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "0" ,\ - /*Max Value*/ "1" \ - ); -/*PARAMETER PROTOTYPE: -rmsd_threshold */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-md_threshold" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &md_threshold ,\ - /*Def 1*/ "1" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: -maximum distances */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-maximum_distance" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &maximum_distance ,\ - /*Def 1*/ "10" ,\ - /*Def 2*/ "10" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - -/*PARAMETER PROTOTYPE: -print_rapdb */ - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-print_rapdb" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Prints the neighborhood of each pair of aligned residues, along with the associated local score" ,\ - /*Parameter*/ &print_rapdb ,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "1" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: RUN_NAME */ - declare_name (run_name); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-run_name" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &run_name ,\ - /*Def 1*/ "default" ,\ - /*Def 2*/ "" ,\ - /*Min_value*/ "default" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: OUTFILE */ -/*PARAMETER PROTOTYPE: OUTFILE */ - declare_name ( outfile); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-outfile" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &outfile ,\ - /*Def 1*/ "no" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "default" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: OUTFILE */ - declare_name ( apdb_outfile); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-apdb_outfile" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &apdb_outfile ,\ - /*Def 1*/ "stdout" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: OUTPUT_FORMAT */ - out_aln_format=declare_char ( 200, STRING); - n_out_aln_format=get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-output" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 200 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ out_aln_format,\ - /*Def 1*/ "score_html" ,\ - /*Def 2*/ "" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - - -/*PARAMETER PROTOTYPE: INFILE */ - declare_name (color_mode); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-color_mode" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &color_mode ,\ - /*Def 1*/ "apdb" ,\ - /*Def 2*/ "irmsd" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -/*PARAMETER PROTOTYPE: INFILE */ - declare_name (output_res_num); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-seqnos" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/ &output_res_num ,\ - /*Def 1*/ "off" ,\ - /*Def 2*/ "on" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - declare_name (cache); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-cache" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "use,ignore,update,local, directory name" ,\ - /*Parameter*/ &cache ,\ - /*Def 1*/ "use" ,\ - /*Def 2*/ "update" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - declare_name (local_mode); - get_cl_param( \ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-local_mode" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Mode for choosing the Neighborhood (bubble or window)\nWhen selecting window, maximum distance becomes the window 1/2 size, in residues\nWhen using sphere, maximum_distance is the sphere radius in Angstrom" ,\ - /*Parameter*/ &local_mode ,\ - /*Def 1*/ "sphere" ,\ - /*Def 2*/ "window" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - -/*PARAMETER PROTOTYPE: IN */ - template_file_list=declare_char (100, STRING); - n_template_file=get_cl_param( \ - /*argc*/ argc , \ - /*argv*/ argv , \ - /*output*/ &le ,\ - /*Name*/ "-template_file" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1000 ,\ - /*DOC*/ "List of templates file for the sequences",\ - /*Parameter*/ template_file_list , \ - /*Def 1*/ "_SELF_P_",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - /*PARAMETER PROTOTYPE: MODE */ - declare_name (mode); - get_cl_param( \ - /*argc*/ argc , \ - /*argv*/ argv , \ - /*output*/ &le ,\ - /*Name*/ "-mode" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "S" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Mode: irmsd, ",\ - /*Parameter*/ &mode , \ - /*Def 1*/ "irmsd",\ - /*Def 2*/ "stdin" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - - - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-prot_min_sim" ,\ - /*Flag*/ &prot_min_sim ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Minimum similarity between a sequence and its PDB target" ,\ - /*Parameter*/ &prot_min_sim ,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "20" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - set_int_variable ("prot_min_sim", prot_min_sim); - -get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-prot_max_sim" ,\ - /*Flag*/ &prot_max_sim ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Maximum similarity between a sequence and its BLAST relatives" ,\ - /*Parameter*/ &prot_max_sim ,\ - /*Def 1*/ "90" ,\ - /*Def 2*/ "100" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - set_int_variable ("prot_max_sim", prot_max_sim); - -get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-prot_min_cov" ,\ - /*Flag*/ &prot_min_cov ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Minimum coverage of a sequence by its BLAST relatives" ,\ - /*Parameter*/ &prot_min_cov ,\ - /*Def 1*/ "0" ,\ - /*Def 2*/ "0" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -set_int_variable ("prot_min_cov", prot_min_cov); - -get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-pdb_min_sim" ,\ - /*Flag*/ &pdb_min_sim ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Minimum similarity between a sequence and its PDB target" ,\ - /*Parameter*/ &pdb_min_sim ,\ - /*Def 1*/ "35" ,\ - /*Def 2*/ "35" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - - set_int_variable ("pdb_min_sim", pdb_min_sim); - get_cl_param( \ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-pdb_max_sim" ,\ - /*Flag*/ &pdb_max_sim ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Maximum similarity between a sequence and its PDB target" ,\ - /*Parameter*/ &pdb_max_sim ,\ - /*Def 1*/ "100" ,\ - /*Def 2*/ "0" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - set_int_variable ("pdb_max_sim", pdb_max_sim); - get_cl_param( \ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-pdb_min_cov" ,\ - /*Flag*/ &pdb_min_cov ,\ - /*TYPE*/ "D" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Minimum coverage of a sequence by its PDB target" ,\ - /*Parameter*/ &pdb_min_cov ,\ - /*Def 1*/ "50" ,\ - /*Def 2*/ "25" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -set_int_variable ("pdb_min_cov", pdb_min_cov); - - - -declare_name (pdb_blast_server); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-pdb_blast_server" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/&pdb_blast_server ,\ - /*Def 1*/ "EBI" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); -declare_name (prot_blast_server); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-blast" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/&prot_blast_server ,\ - /*Def 1*/ "" ,\ - /*Def 2*/ "" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - //make sure that -blast and -blast_server are both supported blast>blast_server - if ( !prot_blast_server[0]) - { - get_cl_param( \ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-blast_server" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/&prot_blast_server ,\ - /*Def 1*/ "EBI" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - } - set_string_variable ("blast_server", prot_blast_server); - - - - declare_name (pdb_db); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-pdb_db" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "Non Redundant PDB database" ,\ - /*Parameter*/&pdb_db ,\ - /*Def 1*/ "pdb" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - set_string_variable ("pdb_db", pdb_db); - - -declare_name (prot_db); - get_cl_param(\ - /*argc*/ argc ,\ - /*argv*/ argv ,\ - /*output*/ &le ,\ - /*Name*/ "-protein_db" ,\ - /*Flag*/ &garbage ,\ - /*TYPE*/ "W_F" ,\ - /*OPTIONAL?*/ OPTIONAL ,\ - /*MAX Nval*/ 1 ,\ - /*DOC*/ "ND" ,\ - /*Parameter*/&prot_db ,\ - /*Def 1*/ "uniprot" ,\ - /*Def 2*/ "default" ,\ - /*Min_value*/ "any" ,\ - /*Max Value*/ "any" \ - ); - // set the correct mode: - if ( strm (argv[0], "trmsd"))sprintf (mode, "trmsd"); - - set_string_variable ("prot_db", prot_db); - - - if (argc==1){myexit (EXIT_SUCCESS);} - - if ( strm (outfile,"no"))n_out_aln_format=0; - - get_cl_param( argc, argv,&le, NULL,NULL,NULL,0,0,NULL); - prepare_cache (cache); - - - if (strm ( aln, "")) - sprintf ( aln, "%s", argv[1]); - - if (!is_aln (aln)) - { - printf_exit (EXIT_FAILURE, stderr, "\n\n---- ERROR: File %s must be a valid alignment [FATAL:%s-%s]\n\n",aln,argv[0], PROGRAM); - } - - pdb_param=vcalloc ( 1, sizeof(Pdb_param)); - - pdb_param->similarity_threshold=similarity_threshold; - - pdb_param->md_threshold=md_threshold; - pdb_param->maximum_distance=maximum_distance; - - if ( n_excluded_nb>0) - pdb_param->n_excluded_nb=n_excluded_nb; - else if ( n_excluded_nb==-1) - pdb_param->n_excluded_nb=(int)((float)maximum_distance/(float)1.57); - /* Exclude all the nb within the bubble at +1, +2, +n*/ - pdb_param->print_rapdb=print_rapdb; - pdb_param->comparison_io=comparison_io; - - pdb_param->local_mode=local_mode; - pdb_param->color_mode=lower_string (color_mode); - pdb_param->filter=filter; - pdb_param->filter_aln=filter_aln; - pdb_param->irmsd_graph=irmsd_graph; - pdb_param->nirmsd_graph=nirmsd_graph; - - sprintf ( list_file[n_list++], "S%s", aln); - - - if (!strm (repeat_seq, "")) - { - - sprintf ( template_file_list[0], "%s", process_repeat (list_file[0], repeat_seq, repeat_pdb)); - fprintf ( le, "\n##Turn a repeat List into a Template File\n"); - le=display_file_content (le,template_file_list[0]); - fprintf ( le, "\n\n"); - } - S=read_seq_in_n_list (list_file, n_list, NULL, NULL); - - le=display_sequences_names ( S,le,0, 0); - - if ( n_template_file) - { - fprintf ( le, "\nLooking For Sequence Templates:\n"); - for ( a=0; a< n_template_file; a++) - { - fprintf ( le, "\n\tTemplate Type: [%s] Mode Or File: [%s] [Start", template_type2type_name(template_file_list[a]), template_file_list[a]); - S=seq2template_seq(S, template_file_list[a], F); - fprintf ( le, "]"); - } - } - - if ( !strm (run_name, "default")) - { - F=parse_fname(run_name); - sprintf (F->name, "%s", F->full); - } - else - { - F=parse_fname (aln); - } - - for ( a=0; a< S->nseq; a++) - { - char *p; - - p=seq2T_value (S, a, "template_file", "_P_"); - - if (p)sprintf (S->file[a], "%s",p); - } - - CL=declare_constraint_list ( S,NULL, NULL, 0,NULL, NULL); - CL->T=vcalloc (S->nseq,sizeof (Ca_trace*)); - - - for ( n_pdb=0,a=0; anseq; a++) - { - if ( !is_pdb_file ( S->file[a])){CL->T[a]=NULL;continue;} - CL->T[a]=read_ca_trace (S->file[a], "ATOM"); - CL->T[a]=trim_ca_trace (CL->T[a], S->seq[a]); - (CL->T[a])->pdb_param=pdb_param; - n_pdb++; - } - - A=declare_aln (S); - - - A->residue_case=KEEP_CASE; - A=main_read_aln(aln, A); - EA=copy_aln (A, EA); - A->CL=CL; - - if ( strm (apdb_outfile, "default")) - sprintf ( apdb_outfile, "%s.apdb_result", F->name); - - if ( n_pdb<2) - { - FILE *fp; - fp=vfopen (apdb_outfile, "w"); - fprintf (fp, "\nYour Alignment Does Not Contain Enough Sequences With a known Structure\n"); - fprintf (fp, "To Use APDB, your alignment must include at least TWO sequences with a known structure.\n"); - fprintf (fp, "These sequences must be named according to their PDB identifier, followed by the chain index (if any) ex: 1fnkA\n"); - fprintf (fp, "[FATAL:%s]\n", PROGRAM); - vfclose (fp); - } - else if ( strm (mode, "irmsd")) - { - EA=analyse_pdb ( A, EA, apdb_outfile); - } - else if ( strm (mode, "msa2tree") || strm (mode, "trmsd")) - { - EA=msa2struc_dist ( A, EA,F->name); - } - le=display_output_filename ( le, "APDB_RESULT", "APDB_RESULT_FORMAT_01", apdb_outfile, CHECK); - - if ( n_pdb>=2) - { - declare_name (file_name); - for ( a=0; a< n_out_aln_format; a++) - { - if ( strm2( outfile, "stdout", "stderr"))sprintf (file_name, "%s", outfile); - else if ( strm (outfile, "default")) - sprintf (file_name, "%s.%s",F->name, out_aln_format[a]); - else - sprintf (file_name, "%s.%s",outfile,out_aln_format[a]); - - output_format_aln (out_aln_format[a],A,EA,file_name); - le=display_output_filename ( le, "MSA", out_aln_format[a], file_name, CHECK); - } - } - return EXIT_SUCCESS; - } - - - -Constraint_list * set_constraint_list4align_pdb (Constraint_list *CL,int seq, char *dp_mode, char *local_mode, char *param_file) -{ - static Constraint_list *PWCL; - static Pdb_param *pdb_param; - char **x; - int n; - - if ( !CL) - { - free_constraint_list (PWCL); - return NULL; - } - else if ( !PWCL) - { - PWCL=declare_constraint_list ( CL->S,NULL, NULL, 0,NULL, NULL); - - pdb_param=vcalloc ( 1, sizeof(Pdb_param)); - pdb_param->N_ca=0; - pdb_param->max_delta=2.0; - pdb_param->maximum_distance=14; - declare_name (pdb_param->local_mode); - sprintf (pdb_param->local_mode, "%s", local_mode); - pdb_param->scale=50; - - PWCL->pw_parameters_set=1; - PWCL->S=CL->S; - PWCL->lalign_n_top=10; - PWCL->sw_min_dist=10; - - PWCL->T=vcalloc ( (PWCL->S)->nseq, sizeof (Ca_trace*)); - - PWCL->extend_jit=0; - PWCL->maximise=1; - /*PWCL->gop=-40;*/ - PWCL->gop=-50; - PWCL->gep=-20; - sprintf (CL->matrix_for_aa_group, "vasiliky"); - PWCL->use_fragments=0; - PWCL->ktup=0; - PWCL->TG_MODE=1; - } - - - if ( param_file && check_file_exists ( param_file) ) - { - if ( (x=get_parameter ( "-nca", &n, param_file))!=NULL){pdb_param->N_ca=atoi(x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-max_delta", &n, param_file))!=NULL){pdb_param->max_delta=atof(x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-maximum_distance", &n, param_file))!=NULL){pdb_param->maximum_distance=atoi(x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-local_mode", &n, param_file))!=NULL){sprintf (pdb_param->local_mode, "%s",x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-scale", &n, param_file))!=NULL){pdb_param->scale=atoi(x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-gapopen", &n, param_file))!=NULL){PWCL->gop=atoi(x[0]);free_char (x, -1);} - if ( (x=get_parameter ( "-gapext" , &n, param_file))!=NULL){PWCL->gep=atof(x[0]);free_char (x, -1);} - - } - - - - - sprintf ( PWCL->dp_mode, "%s", dp_mode); - - if (strm (PWCL->dp_mode, "lalign"))sprintf (PWCL->dp_mode,"sim_pair_wise_lalign"); - else if (strm (PWCL->dp_mode, "sw"))sprintf (PWCL->dp_mode,"gotoh_pair_wise_sw"); - - local_mode=pdb_param->local_mode; - if ( strm ( local_mode, "hasch_ca_trace_nb")) PWCL->evaluate_residue_pair=evaluate_ca_trace_nb; - else if ( strm ( local_mode, "hasch_ca_trace_bubble")) PWCL->evaluate_residue_pair=evaluate_ca_trace_bubble; - else if ( strm ( local_mode, "hasch_ca_trace_sap1_bubble")) PWCL->evaluate_residue_pair=evaluate_ca_trace_sap1_bubble; - else if ( strm ( local_mode, "hasch_ca_trace_sap2_bubble")) PWCL->evaluate_residue_pair=evaluate_ca_trace_sap2_bubble; - - else if ( strm ( local_mode, "hasch_ca_trace_transversal")) PWCL->evaluate_residue_pair=evaluate_ca_trace_transversal; - else if ( strm ( local_mode, "hasch_ca_trace_bubble_2")) PWCL->evaluate_residue_pair=evaluate_ca_trace_bubble_2; - else if ( strm ( local_mode, "hasch_ca_trace_bubble_3")) PWCL->evaluate_residue_pair=evaluate_ca_trace_bubble_3; - else if ( strm ( local_mode, "custom_pair_score_function1")) PWCL->evaluate_residue_pair=custom_pair_score_function1; - else if ( strm ( local_mode, "custom_pair_score_function2")) PWCL->evaluate_residue_pair=custom_pair_score_function2; - else if ( strm ( local_mode, "custom_pair_score_function3")) PWCL->evaluate_residue_pair=custom_pair_score_function3; - else if ( strm ( local_mode, "custom_pair_score_function4")) PWCL->evaluate_residue_pair=custom_pair_score_function4; - else if ( strm ( local_mode, "custom_pair_score_function5")) PWCL->evaluate_residue_pair=custom_pair_score_function5; - else if ( strm ( local_mode, "custom_pair_score_function6")) PWCL->evaluate_residue_pair=custom_pair_score_function6; - else if ( strm ( local_mode, "custom_pair_score_function7")) PWCL->evaluate_residue_pair=custom_pair_score_function7; - else if ( strm ( local_mode, "custom_pair_score_function8")) PWCL->evaluate_residue_pair=custom_pair_score_function8; - else if ( strm ( local_mode, "custom_pair_score_function9")) PWCL->evaluate_residue_pair=custom_pair_score_function9; - else if ( strm ( local_mode, "custom_pair_score_function10")) PWCL->evaluate_residue_pair=custom_pair_score_function10; - - - else - { - fprintf ( stderr, "\n%s is an unknown hasch mode, [FATAL]\n", local_mode); - myexit (EXIT_FAILURE); - } - - if ( PWCL->T[seq]); - else - { - PWCL->T[seq]=read_ca_trace (is_pdb_struc((CL->S)->name[seq]), "ATOM"); - (PWCL->T[seq])->pdb_param=pdb_param; - PWCL->T[seq]=trim_ca_trace (PWCL->T[seq], (CL->S)->seq[seq]); - PWCL->T[seq]=hasch_ca_trace(PWCL->T[seq]); - - } - - - return PWCL; -} - - - -int evaluate_ca_trace_nb (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - - return (int)(neighborhood_match(CL, s1,r1, s2, r2, (CL->T[s1])->Chain,(CL->T[s2])->Chain )); - } -int evaluate_ca_trace_sap2_bubble (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - - - - return sap2_neighborhood_match (CL, s1, r1, s2, r2, (CL->T[s1])->Bubble,(CL->T[s2])->Bubble ); - - } -int evaluate_ca_trace_sap1_bubble (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - /* - Function documentation: start - - int evaluate_ca_trace_sap1_bubble (Constraint_list *CL, int s1, int s2, int r1, int r2) - This function evaluates the cost for matching two residues: - - a1 is the cost for matching the two neighborood ( bubble type), using sap - a1: [0,+100], +100 is the best possible match. - a2 is the residue type weight: - min=worst substitution value - best=best of r1/r1, r2/r2-min - - a2=(r1/r2 -min)/best --> a1:[0, 100] - - score=a1*a2-->[-inf, +10000]; - */ - - - - float a1; - - - a1=(int) sap1_neighborhood_match (CL, s1, r1, s2, r2, (CL->T[s1])->Bubble,(CL->T[s2])->Bubble ); - - return (int)a1; - - - } -int evaluate_ca_trace_bubble (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - /* - Function documentation: start - - int evaluate_ca_trace_bubble (Constraint_list *CL, int s1, int s2, int r1, int r2) - This function evaluates the cost for matching two residues: - - a1 is the cost for matching the two neighborood ( bubble type) - a1: [-inf,+100-scale], +100-scale is the best possible match. - - */ - - - - float a1; - - - - a1=(int) neighborhood_match (CL, s1, r1, s2, r2, (CL->T[s1])->Bubble,(CL->T[s2])->Bubble )-((CL->T[s1])->pdb_param)->scale; - - return a1; - - - } -int evaluate_ca_trace_transversal (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - return (int)(transversal_match (CL, s1, r1, s2, r2, (CL->T[s1])->Transversal,(CL->T[s2])->Transversal )); - } - -int evaluate_ca_trace_bubble_3 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - /*This Mode evaluates : - - 1-The Bubble - 2-The Match of the transversal residues - */ - - int a1, l1; - int a2, l2; - int a; - - l1=MAX(( (CL->T[s1])->Chain )->nb[r1][0] ,((CL->T[s2])->Chain )->nb[r2][0]); - l2=MAX(( (CL->T[s1])->Bubble)->nb[r1][0], ((CL->T[s2])->Bubble)->nb[r2][0]); - - a1=(int)(neighborhood_match (CL, s1, r1, s2, r2, (CL->T[s1])->Bubble,(CL->T[s2])->Bubble )); - a2=(int)(transversal_match (CL, s1, r1, s2, r2, (CL->T[s1])->Transversal,(CL->T[s2])->Transversal )); - - if ( !l1 && !l2)return 0; - a=(a1+a2)/2; - return a; - } -int evaluate_ca_trace_bubble_2 (Constraint_list *CL, int s1, int r1, int s2, int r2) - { - /*This Mode evaluates : - 1-The Ca neighborhood - 2-The Bubble - */ - - - return (int)((neighborhood_match (CL, s1, r1, s2, r2, (CL->T[s1])->Chain,(CL->T[s2])->Chain ))); - } - - -/*********************************************************************************************/ -/* */ -/* FUNCTIONS FOR COMPARING TWO NEIGHBORHOODS:START */ -/* */ -/*********************************************************************************************/ -float matrix_match (Constraint_list *CL, int s1, int r1, int s2, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - - { - /* - Function documentation: start - - float matrix_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - This function evaluates the matrix for matching two residues: - - min=worst substitution value - best=best of r1/r1, r2/r2-min - - a2=(r1/r2 -min)/best --> a1:[0, 100] - - score=a1*a2-->[-inf, +10000]; - */ - - - - float a2; - float m1, m2, m; - static float min=0; - int a, b; - - if ( !CL->M) - { - CL->M=read_matrice ( "pam250mt"); - min=CL->M[0][0]; - for ( a=0; a< 26; a++) - for ( b=0; b< 26; b++)min=MIN(min, CL->M[a][b]); - } - - if ( r1<=0 || r2<=0)return 0; - m1=CL->M[(CL->S)->seq[s1][r1-1]-'A'][(CL->S)->seq[s1][r1-1]-'A']-min; - m2=CL->M[(CL->S)->seq[s2][r2-1]-'A'][(CL->S)->seq[s2][r2-1]-'A']-min; - m=MAX(m1, m2); - a2=(CL->M[(CL->S)->seq[s1][r1-1]-'A'][(CL->S)->seq[s2][r2-1]-'A']-min)/m; - - return a2; - } - - -float transversal_match (Constraint_list *CL, int s1, int r1, int s2, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - { - int a, l1, l2; - float score=0; - float delta, max_delta; - float max; - Pdb_param*PP; - - PP=(CL->T[s1])->pdb_param; - max_delta=PP->max_delta; - - l1=nbs1->nb[r1][0]; - l2=nbs2->nb[r2][0]; - - if ( l1!=l2 || l1<(PP->N_ca)) return 0; - - - max=MAX(l1, l2)*max_delta; - for ( delta=0,a=0; a< l2 ; a++) - { - - delta+=max_delta-FABS((nbs1->d_nb[r1][a]-nbs2->d_nb[r2][a])); - } - score=(delta*100)/max; - - - - return score; - } - -float neighborhood_match (Constraint_list *CL, int s1, int r1, int s2, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - { - static float **table; - static int table_size; - int a, b, l1, l2; - float score=0; - float ins, del, sub; - float delta, max_delta; - float max; - Pdb_param*PP; - - - PP=(CL->T[s1])->pdb_param; - max_delta=PP->max_delta; - - - if ( r1> 0 && r2 >0) {r1--; r2--;} - else return 0; - - l1=nbs1->nb[r1][0]; - l2=nbs2->nb[r2][0]; - - if (table_size< (MAX(l1, l2)+1)) - { - table_size=MAX(l1, l2)+1; - if ( table)free_float (table, -1); - table=NULL; - } - if ( !table) table=declare_float (table_size, table_size); - - - max=MAX(l1, l2)*max_delta; - if ( max==0)return 0; - - - table[0][0]=0; - for ( b=1; b<=l2; b++) - { - table[0][b]=0; - } - for ( a=1; a<=l1; a++) - { - table[a][0]=0; - for ( b=1; b<=l2 ; b++) - { - - delta=max_delta-FABS((nbs1->d_nb[r1][a]-nbs2->d_nb[r2][b])); - - del=table[a-1][b]; - ins=table[a][b-1]; - sub= table[a-1][b-1]+delta; - - if ( del >= ins && del >= sub)score=del; - else if ( ins >= del && ins >= sub) score=ins; - else score=sub; - table[a][b]=score; - } - } - - - score=((((score)*100)/max)); - - - return score; - } - -float sap1_neighborhood_match (Constraint_list *CL, int s1, int r1, int s2, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - { - /* - Function documentation: start - - float sap1_neighborhood_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - This function is adapted from Taylor, Orengo, Protein Structure Alignment JMB 1989, (208)1-22 - It is the first function where - score= A/(|dra-drb|+b) - - Function documentation: end - */ - - static float **table; - static int table_size; - int a, b, l1, l2; - float score=0; - float ins, del, sub; - float delta; - float max; - - int A=50; - int B=5; - - - - - - - if ( r1> 0 && r2 >0) {r1--; r2--;} - else return 0; - - l1=nbs1->nb[r1][0]; - l2=nbs2->nb[r2][0]; - - if (table_size< (MAX(l1, l2)+1)) - { - table_size=MAX(l1, l2)+1; - if ( table)free_float (table, -1); - table=NULL; - } - if ( !table) table=declare_float (table_size, table_size); - - - max=MAX(l1, l2)*(A/B); - if ( max==0)return 0; - - - table[0][0]=0; - for ( b=1; b<=l2; b++) - { - table[0][b]=0; - } - for ( a=1; a<=l1; a++) - { - table[a][0]=0; - for ( b=1; b<=l2 ; b++) - { - - delta=A/(FABS((nbs1->d_nb[r1][a]-nbs2->d_nb[r2][b]))+B); - - del=table[a-1][b]; - ins=table[a][b-1]; - sub= table[a-1][b-1]+delta; - if ( del >= ins && del >= sub)score=del; - else if ( ins >= del && ins >= sub) score=ins; - else score=sub; - table[a][b]=score; - } - } - - - score=((score*100))/(max); - - - return score; - } - -float sap2_neighborhood_match (Constraint_list *CL, int s1, int r1, int s2, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - { - /* - Function documentation: start - - float sap1_neighborhood_match (Constraint_list *CL, int s1, int s2, int r1, int r2, Struct_nb *nbs1, Struct_nb *nbs2) - This function is adapted from Taylor, Orengo, Protein Structure Alignment JMB 1989, (208)1-22 - It is the first function where - score= A/(|dra-drb|+b) - - Function documentation: end - */ - - static float **table; - static int table_size; - int a, b, l1, l2; - float score=0; - float ins, del, sub; - float delta; - float max; - - Amino_acid **pep1; - Amino_acid **pep2; - static Atom *vX_1, *vY_1, *vZ_1; - static Atom *vX_2, *vY_2, *vZ_2; - static Atom *ca1, *ca2; - float val; - - int A=50; - int B=2; - - - - - if ( r1> 0 && r2 >0) {r1--; r2--;} - else return 0; - - /*Make up the referencial*/ - pep1=(CL->T[s1])->peptide_chain; - pep2=(CL->T[s2])->peptide_chain; - - /*Get Referencial for CA1*/ - if ( (pep1[r1])->C)vX_1 =diff_atom(pep1[r1]->C,pep1[r1]->CA, vX_1); - if ( (pep1[r1])->N)vY_1 =diff_atom(pep1[r1]->N,pep1[r1]->CA, vY_1); - if ( (pep1[r1])->CB)vZ_1=diff_atom(pep1[r1]->CB,(pep1[r1])->CA,vZ_1); - else vZ_1=add_atom (vX_1, vY_1, vZ_1); - - - - - - /*Get Referencial for CA2*/ - if ( (pep2[r2])->C)vX_2 =diff_atom((pep2[r2])->C,(pep2[r2])->CA, vX_2); - if ( (pep2[r2])->N)vY_2 =diff_atom((pep2[r2])->N,(pep2[r2])->CA, vY_2); - if ( (pep2[r2])->CB)vZ_2=diff_atom((pep2[r2])->CB,(pep2[r2])->CA, vZ_2); - else vZ_2=add_atom (vX_2, vY_2, vZ_2); - - - - - /*END OF GETTING REFERENCIAL*/ - - /*Test - if ( r1>1 && r2>1) - { - fprintf (stdout,"\n\t*******"); - - fprintf (stdout, "RESIDUE %d %c", r1, (CL->S)->seq[s1][r1]); - if ( (pep1[r1])->CA)fprintf (stdout,"\n\tCA ");print_atom (pep1[r1]->CA ); - if ( (pep1[r1])->C)fprintf (stdout,"\n\tC ");print_atom (pep1[r1]->C ); - if ( (pep1[r1])->N)fprintf (stdout,"\n\tN ");print_atom (pep1[r1]->N ); - if ( (pep1[r1])->CB)fprintf (stdout,"\n\tCB ");print_atom (pep1[r1]->CB ); - fprintf (stdout,"\n\t*******"); - fprintf (stdout,"\n\tvX ");print_atom ( vX_1); - fprintf (stdout,"\n\tvY ");print_atom ( vY_1); - fprintf (stdout,"\n\tvZ ");print_atom ( vZ_1); - - ca1= copy_atom ((pep1[r1-1])->CA, ca1); - ca1 =diff_atom(ca1,(pep1[r1])->CA, ca1); - fprintf (stdout,"\n\tca ");print_atom ( ca1); - fprintf ( stdout, "\n\tSQ1=%d ", (int)square_atom(ca1)); - ca1=reframe_atom(vX_1, vY_1, vZ_1, ca1, ca1); - fprintf ( stdout, "\n\tSQ2=%d ", (int)square_atom(ca1)); - fprintf (stdout,"\n\tca ");print_atom ( ca1); - fprintf (stdout,"\n\n"); - } - */ - - l1=nbs1->nb[r1][0]; - l2=nbs2->nb[r2][0]; - - if (table_size< (MAX(l1, l2)+1)) - { - table_size=MAX(l1, l2)+1; - if ( table)free_float (table, -1); - table=NULL; - } - if ( !table) table=declare_float (table_size, table_size); - - - max=MAX(l1, l2)*(A/B); - - if ( max==0)return 0; - - - table[0][0]=0; - for ( b=1; b<=l2; b++) - { - table[0][b]=0; - } - - for ( a=1; a<=l1; a++) - { - ca1=copy_atom ((CL->T[s1])->structure[nbs1->nb[r1][a]], ca1); - ca1=diff_atom(ca1,(pep1[r1])->CA, ca1); - ca1=reframe_atom(vX_1, vY_1, vZ_1, ca1, ca1); - - table[a][0]=0; - for ( b=1; b<=l2 ; b++) - { - ca2 =copy_atom((CL->T[s2])->structure[nbs2->nb[r2][b]], ca2); - ca2 =diff_atom(ca2,(pep2[r2])->CA, ca2); - ca2 =reframe_atom(vX_2, vY_2, vZ_2, ca2, ca2); - - ca2=diff_atom(ca2,ca1,ca2); - val=square_atom (ca2); - - val=(float)sqrt ((double)val); - - delta=A/(val+B); - - - del=table[a-1][b]; - ins=table[a][b-1]; - sub= table[a-1][b-1]+delta; - - if ( del >= ins && del >= sub)score=del; - else if ( ins >= del && ins >= sub) score=ins; - else score=sub; - table[a][b]=score; - } - } - - - score=(((score*100))/(max)-50); - - - return score; - } - -/*********************************************************************************************/ -/* */ -/* APDB */ -/* */ -/*********************************************************************************************/ -float **** irmsdmin_apdb_filtration ( Alignment *A, float ****residues, Constraint_list *CL, Pdb_param *PP, FILE *fp) -{ - int s1, s2, a,col1, n,n2=0, t,flag; - int **pos, **list; - float nirmsd, min_nirmsd,max_nirmsd,ref_sum, sum, sum2; - float **normalized_len; - - normalized_len=declare_float (A->nseq+1, A->nseq+1); - for (s1=0; s1nseq; s1++) - { - int l1, l2, r1, r2, p; - for (s2=0; s2nseq; s2++) - { - for ( l1=l2=p=0; p< A->len_aln; p++) - { - r1=A->seq_al[s1][p]; - r2=A->seq_al[s2][p]; - if (!is_gap(r1) && isupper(r1))l1++; - if (!is_gap(r2) && isupper(r2))l2++; - } - normalized_len[s1][s2]=MIN(l1,l2); - } - } - - pos=aln2pos_simple (A, A->nseq); - for ( s1=0; s1< A->nseq; s1++) - for ( s2=0; s2nseq; s2++) - { - if ( s1==s2) continue; - else if (!(CL->T[A->order[s1][0]]) || !(CL->T[A->order[s2][0]]))continue; - - list=declare_int (A->len_aln, 2); - - for ( sum=0,n=0,col1=0; col1< A->len_aln; col1++) - { - if ( islower (A->seq_al[s1][col1]) || islower ( A->seq_al[s2][col1]))continue; - else if ( pos[s1][col1]<=0 || pos[s2][col1]<=0 ) continue; - else if ( residues[s1][s2][pos[s1][col1]-1][0]==0)continue; - - list[n][0]=pos[s1][col1]-1; - list[n][1]=(int)100000*residues[s1][s2][pos[s1][col1]-1][4]; - sum2+=residues[s1][s2][pos[s1][col1]-1][4]; - n++; - } - - if (n==0)return residues; - - sort_int_inv (list, 2, 1,0, n-1); - for (sum=0,a=0; a=max_nirmsd) && flag==1)break; - n2=a; - } - - sum=ref_sum; - for (a=0; anirmsd_graph) - { - fprintf ( stdout, "\n_NIRMSD_GRAPH %s %s POS: %4d Removed: %4d NiRMSD: %.2f", A->name[s1], A->name[s2], list[a][0],a,(nirmsd/100000)*normalized_len[s1][s2]); - } - } - } - - if ( PP->print_rapdb) - { - for ( a=0; a0 && a<=t)fprintf ( stdout, "\nRAPDB QUANTILE REMOVE S1: %3d S2: %3d COL: %3d SCORE*100: %d", s1, s2, list[a][0], list[a][1]); - else if ( list[a][1]>0 && a>t)fprintf ( stdout, "\nRAPDB QUANTILE KEEP S1: %3d S2: %3d COL: %3d SCORE*100: %d", s1, s2, list[a][0], list[a][1]); - } - } - - fprintf ( stdout, "\n# MINIMISATION FILTER ON: NiRMSD minimsation resulted in the removal of %d [out of %d] Columns On the alignment %s Vs %s\n", t, n, A->name[s1], A->name[s2]); - for ( a=0; a<=t; a++) - { - - residues[s1][s2][list[a][0]][0]=0; - residues[s1][s2][list[a][0]][1]=0; - residues[s1][s2][list[a][0]][2]=0; - residues[s1][s2][list[a][0]][3]=0; - residues[s1][s2][list[a][0]][4]=-1; - - } - - free_int (list, -1); - } - free_float (normalized_len, -1); - return residues; -} -float **** quantile_apdb_filtration ( Alignment *A, float ****residues, Constraint_list *CL, Pdb_param *PP,FILE *fp) -{ - int s1, s2, a,col1, n, t; - int **pos, **list; - - pos=aln2pos_simple (A, A->nseq); - for ( s1=0; s1< A->nseq; s1++) - for ( s2=0; s2nseq; s2++) - { - if ( s1==s2) continue; - else if (!(CL->T[A->order[s1][0]]) || !(CL->T[A->order[s2][0]]))continue; - - list=declare_int (A->len_aln, 2); - - for ( n=0,col1=0; col1< A->len_aln; col1++) - { - if ( islower (A->seq_al[s1][col1]) || islower ( A->seq_al[s2][col1]))continue; - else if ( pos[s1][col1]<=0 || pos[s2][col1]<=0 ) continue; - - list[n][0]=pos[s1][col1]-1; - list[n][1]=(int)100*residues[s1][s2][pos[s1][col1]-1][4]; - n++; - - } - - sort_int_inv (list, 2, 1,0, n-1); - - t=quantile_rank ( list,1, n,PP->filter); - - if ( PP->print_rapdb) - { - for ( a=0; a0 && a0 && a>t)fprintf ( stdout, "\nRAPDB QUANTILE KEEP S1: %3d S2: %3d COL: %3d SCORE*100: %d", s1, s2, list[a][0], list[a][1]); - } - } - - for ( a=0; aCL; - - for ( s1=0; s1< (A->S)->nseq; s1++) - if ( CL->T[s1]){PP=(CL->T[s1])->pdb_param;break;} - - if (PP->irmsd_graph)irmsd_graph =vfopen ((irmsd_file =vtmpnam (NULL)),"w"); - - fprintf ( fp, "\nAPDB_RESULT_FORMAT_02\n"); - residues=analyse_pdb_residues ( A, A->CL,PP); - if ( PP->filter>=0)residues=quantile_apdb_filtration (A, residues, A->CL,PP, fp); - else if ( PP->filter<0)residues=irmsdmin_apdb_filtration (A, residues, A->CL,PP, fp); - - pos=aln2pos_simple (A, A->nseq); - - - - - - /*Compute the alignment length for normalization*/ - normalize_len=declare_float (A->nseq+1, A->nseq+1); - for (s1=0; s1nseq; s1++) - { - int l1, l2, r1, r2; - for (s2=0; s2nseq; s2++) - { - for ( l1=l2=p=0; p< A->len_aln; p++) - { - r1=A->seq_al[s1][p]; - r2=A->seq_al[s2][p]; - if (!is_gap(r1) && isupper(r1))l1++; - if (!is_gap(r2) && isupper(r2))l2++; - } - normalize_len[s1][s2]=MIN(l1,l2); - } - } - - msa_len=msa_tot=msa_m1=msa_m2=msa_m3=msa_m4=msa_m5=0; - - for ( s1=0; s1< A->nseq; s1++) - { - if ( !(CL->T[A->order[s1][0]]))continue; - seq_len=seq_tot=seq_m1=seq_m2=seq_m3=seq_m4=seq_m5=0; - for ( s2=0; s2< A->nseq; s2++) - { - if ( s1==s2)continue; - if ( !(CL->T[A->order[s2][0]]))continue; - pair_tot=pair_m1=pair_m2=pair_m3=pair_m4=pair_m5=0; - for ( p=0; p< A->len_aln; p++) - { - r1=A->seq_al[s1][p]; - r2=A->seq_al[s2][p]; - b=pos[s1][p]-1; - - - if (PP->filter_aln) - { - if (is_gap(r1) || is_gap(r2) || residues[s1][s2][b][0]==0) - { - A->seq_al[s1][p]=tolower(r1); - A->seq_al[s2][p]=tolower(r2); - } - else - { - A->seq_al[s1][p]=toupper(r1); - A->seq_al[s2][p]=toupper(r2); - } - - } - - if ( PP->irmsd_graph && ( is_gap(r1) || is_gap(r2) || residues[s1][s2][b][0]==0)) - { - - fprintf ( irmsd_graph, "\n_IRMSD_GRAPH %10s %10s ALN: %c%c iRMSD: -1.00", A->name[s1], A->name[s2],A->seq_al[s1][p], A->seq_al[s2][p]); - } - - if (is_gap(r1) || is_gap(r2) || residues[s1][s2][b][0]==0)continue; - pair_tot++; - - /*APDB*/ - m2=(residues[s1][s2][b][2]*100)/residues[s1][s2][b][0]; - if (m2>PP->similarity_threshold){pair_m3++;} - - /*iRMSD*/ - - m4=residues[s1][s2][b][4]; - - if ( PP->irmsd_graph ) - { - fprintf ( irmsd_graph, "\nIRMSD_GRAPH %10s %10s ALN: %c%c iRMSD: %.2f", A->name[s1], A->name[s2],A->seq_al[s1][p], A->seq_al[s2][p], m4); - } - pair_m4+=m4; - } - pair_len=normalize_len[s1][s2]; - if ( s1>s2) - { - - fprintf ( pairwise, "\n\n#PAIRWISE: %s Vs %s",A->name[s1], A->name[s2]); - fprintf ( pairwise, "\n\tPAIRWISE EVALUATED: %6.2f %% [%s Vs %s] ", (pair_len==0)?-1:(pair_tot*100)/pair_len,A->name[s1], A->name[s2]); - fprintf ( pairwise, "\n\tPAIRWISE APDB: %6.2f %% [%s Vs %s] ", (pair_tot==0)?-1:(pair_m3*100)/pair_tot,A->name[s1], A->name[s2]); - fprintf ( pairwise, "\n\tPAIRWISE iRMSD: %6.2f Angs [%s Vs %s]", (pair_tot==0)?-1:pair_m4/pair_tot,A->name[s1], A->name[s2]); - fprintf ( pairwise, "\n\tPAIRWISE NiRMSD: %6.2f Angs [%s Vs %s] [%d pos]", (pair_tot==0)?-1:(pair_m4*pair_len)/(pair_tot*pair_tot), A->name[s1], A->name[s2], (int)pair_tot); - fprintf ( pairwise, "\n\tRAPDB PAIRS PAIRWISE N_NONEMPTY_PAIRS %d N_MAXIMUM_PAIRS %d",(int) pair_tot, (int)pair_len); - msa_m3+=pair_m3; - msa_m4+=pair_m4; - msa_tot+=pair_tot; - msa_len+=pair_len; - } - seq_m3+=pair_m3; - seq_m4+=pair_m4; - seq_tot+=pair_tot; - seq_len+=pair_len; - - } - - fprintf ( average, "\n\n#AVERAGE For Sequence %s", A->name[s1]); - fprintf ( average, "\n\tAVERAGE EVALUATED: %6.2f %% [%s]", (seq_len==0)?-1:(seq_tot*100)/seq_len, A->name[s1]); - fprintf ( average, "\n\tAVERAGE APDB: %6.2f %% [%s]", (seq_tot==0)?-1:(seq_m3*100)/seq_tot, A->name[s1]); - fprintf ( average, "\n\tAVERAGE iRMSD: %6.2f Angs [%s]", (seq_tot==0)?-1:seq_m4/seq_tot, A->name[s1]); - fprintf ( average, "\n\tAVERAGE NiRMS: %6.2f Angs [%s]", (seq_tot==0)?-1:(seq_m4*seq_len)/(seq_tot*seq_tot), A->name[s1]); - if ( strm (PP->color_mode, "apdb"))ST->score_seq[s1]=(seq_tot==0)?-1:(seq_m3*100)/pair_tot; - if (PP->print_rapdb)fprintf (average, "\n\tRAPDB PAIRS AVERAGE N_NONEMPTY_PAIRS %d N_MAXIMUM_PAIRS %d", (int)pair_tot, (int)pair_len); - - if ( strm (PP->color_mode, "irmsd"))ST->score_seq[s1]=(seq_tot==0)?-1:10*((seq_m4*pair_len)/(seq_tot*seq_tot)); - - } - fprintf ( total, "\n\n#TOTAL for the Full MSA"); - fprintf ( total, "\n\tTOTAL EVALUATED: %6.2f %% ", (msa_len==0)?-1:(msa_tot*100)/msa_len); - fprintf ( total, "\n\tTOTAL APDB: %6.2f %% ", (msa_tot==0)?-1:(msa_m3*100)/msa_tot); - fprintf ( total, "\n\tTOTAL iRMSD: %6.2f Angs", (msa_tot==0)?-1:msa_m4/msa_tot); - fprintf ( total, "\n\tTOTAL NiRMSD: %6.2f Angs", (msa_tot==0)?-1:(msa_m4*msa_len)/(msa_tot*msa_tot)); - if (PP->print_rapdb)fprintf (total, "\n\tRAPDB PAIRS TOTAL N_NONEMPTY_PAIRS: %d N_MAXIMUM_PAIRS %d", (int)msa_tot, (int)msa_len); - - if ( strm (PP->color_mode, "apdb")) ST->score_aln=ST->score=A->score_aln=A->score=(msa_tot==0)?-1:(msa_m3*100)/msa_tot; - if ( strm (PP->color_mode, "irmsd"))ST->score_aln=ST->score=A->score_aln=A->score=(msa_tot==0)?-1:10*((msa_m4*msa_len)/(msa_tot*msa_tot)); - - vfclose (average);vfclose (total); vfclose (pairwise);if (PP->irmsd_graph)vfclose (irmsd_graph); - fp=display_file_content (fp, pairwise_file); - fp=display_file_content (fp, average_file); - fp=display_file_content (fp, total_file); - if ( PP->irmsd_graph)fp=display_file_content (fp, irmsd_file); - - fprintf ( fp, "\n\n# EVALUATED: Fraction of Pairwise Columns Evaluated\n"); - fprintf ( fp, "# APDB: Fraction of Correct Columns according to APDB\n"); - fprintf ( fp, "# iRMDS: Average iRMSD over all evaluated columns\n"); - fprintf ( fp, "# NiRMDS: iRMSD*MIN(L1,L2)/Number Evaluated Columns\n"); - fprintf ( fp, "# Main Parameter: -maximum_distance %.2f Angstrom\n", PP->maximum_distance); - - fprintf ( fp, "# Undefined values are set to -1 and indicate LOW Alignment Quality\n"); - fp=print_program_information (fp, NULL); - - - - - /*Color Output*/ - for (iRMSD_max=0,iRMSD_min=10000,s1=0; s1nseq; s1++) - for ( s2=0; s2< A->nseq; s2++) - for (p=0; plen_aln; p++) - { - if ( residues[s1][s2][p][4]>0) - { - iRMSD_max=MAX(iRMSD_max, residues[s1][s2][p][4]); - iRMSD_min=MAX(iRMSD_min, residues[s1][s2][p][4]); - } - - } - iRMSD_unit=iRMSD_max/8; - - for (p=0; p< A->len_aln; p++) - for ( s1=0; s1< A->nseq; s1++) - { - - for ( p=0; p< A->len_aln; p++) - { - r1=A->seq_al[s1][p]; - b=pos[s1][p]-1; - if ( is_gap(r1) || !(CL->T[A->order[s1][0]])) - ST->seq_al[s1][p]=NO_COLOR_RESIDUE; - else - { - float tot_m2=0, tot_m4=0, v=0; - seq_m2=seq_m4=0; - - for (s2=0; s2< A->nseq; s2++) - { - r2=A->seq_al[s1][p]; - if ( s1==s2) continue; - if (is_gap(r2) || !(CL->T[A->order[s1][0]]) || residues[s1][s2][b][0]==0)continue; - - seq_m2+=m2=(residues[s1][s2][b][2]*100)/residues[s1][s2][b][0]; - tot_m2++; - - m4=residues[s1][s2][b][4]; - if (m4>=0) - { - seq_m4+=m4; - tot_m4++; - } - } - - if (strm ( PP->color_mode, "apdb")) - { - if (tot_m2==0)v=NO_COLOR_RESIDUE; - else v=MIN((seq_m2/(10*tot_m2)),9); - } - else if ( strm (PP->color_mode, "irmsd")) - { - if ( tot_m4==0)v=NO_COLOR_RESIDUE; - else v=(8-(int)((seq_m4/(iRMSD_unit*tot_m4))))+1; - } - ST->seq_al[s1][p]=v; - - } - } - } - for ( p=0; plen_aln; p++) ST->seq_al[A->nseq][p]=NO_COLOR_RESIDUE; - - - ST->generic_comment=vcalloc ( 100, sizeof (int)); - if ( strm (PP->color_mode, "apdb")) - { - sprintf ( ST->generic_comment, "# APDB Evaluation: Color Range Blue-[0 %% -- 100 %%]-Red\n# Sequence Score: APDB\n# Local Score: APDB\n\n"); - } - else if ( strm (PP->color_mode, "irmsd")) - { - sprintf ( ST->generic_comment, "\n# iRMSD Evaluation:\n# Sequence score: NiRMSD (Angstrom*10)\n# Local Score: iRMSD, Blue-[%.2f Ang. -- 0.00 Ang.]-Red \n", iRMSD_max); - } - - fprintf ( fp, "\n"); - vfclose (fp); - free_int (pos, -1); - return ST; - } -float **** analyse_pdb_residues ( Alignment *A, Constraint_list *CL, Pdb_param *pdb_param) - { - - int **pos; - int s1, s2, rs1, rs2; - int col1, col2; - float ****distances; - - /*Distances[Nseq][len_aln][4] - distances...[0]: Number of residues within the bubble - distances...[1]: Absolute difference of distance of residues within Bubble - distances...[2]: Number of residues within the bubble with Delta dist < md_threshold - distances ..[3]: Sum of squared difference of distances - distances ..[4]: iRMSD - */ - float d1, d2,delta; - int wd1, wd2; - int in_bubble=0; - int real_res1_col1=0; - int real_res1_col2; - int real_res2_col1; - int real_res2_col2; - Pdb_param *PP; - int print_rapdb; - float nrapdb, rapdb; - Alignment *BA=NULL; - - PP=pdb_param; - print_rapdb=PP->print_rapdb; - - distances=declare_arrayN(4, sizeof (float), A->nseq, A->nseq, 0, 0); - - /*Pre-computation of the internal distances----> T[seq]->ca_dist[len][len]*/ - /*Can be avoided if distance_on_request set to 1 */ - - for ( s1=0; s1< A->nseq; s1++) - { - rs1=A->order[s1][0]; - if (CL->T[rs1] && !(CL->T[rs1])->ca_dist)(CL->T[rs1])->ca_dist=measure_ca_distances(CL->T[rs1]); - for ( s2=0; s2< A->nseq; s2++) - { - distances[s1][s2]=declare_float ( A->len_aln, 6); - } - } - pos=aln2pos_simple (A, A->nseq); - - for ( s1=0; s1< A->nseq; s1++) - for ( col1=0; col1< A->len_aln; col1++) - for ( s2=0; s2nseq; s2++) - { - rs1=A->order[s1][0]; - rs2=A->order[s2][0]; - rapdb=0; - nrapdb=0; - if ( s1==s2) continue; - else if (!(CL->T[rs1]) || !(CL->T[rs2]))continue; - else if ( islower (A->seq_al[s1][col1]) || islower ( A->seq_al[s2][col1]))continue; - else if ( pos[s1][col1]<=0 || pos[s2][col1]<=0 ) continue; - - if ( print_rapdb && s2>s1) - { - - fprintf ( stdout, "RAPDB S1: %s S2: %s POS %d %d %c %d %c ", A->name[s1], A->name[s2], col1+1, pos[s1][col1],A->seq_al[s1][col1], pos[s2][col1],A->seq_al[s2][col1]); - BA=copy_aln (A, BA); - lower_string (BA->seq_al[s1]); - lower_string (BA->seq_al[s2]); - BA->seq_al[s1][col1]=toupper (BA->seq_al[s1][col1]); - BA->seq_al[s2][col1]=toupper (BA->seq_al[s2][col1]); - } - - for ( col2=0; col2len_aln; col2++) - { - - if (pos[s1][col2]<=0 || pos[s2][col2]<=0 )continue; - else if ( FABS((pos[s1][col2]-pos[s1][col1]))<=PP->n_excluded_nb)continue; - else if ( FABS((pos[s2][col2]-pos[s2][col1]))<=PP->n_excluded_nb)continue; - else if ( islower (A->seq_al[s1][col2]) || islower ( A->seq_al[s2][col2]))continue; - - real_res1_col1=pos[s1][col1]-1; - real_res1_col2=pos[s1][col2]-1; - - real_res2_col1=pos[s2][col1]-1; - real_res2_col2=pos[s2][col2]-1; - - d1=(CL->T[rs1])->ca_dist[real_res1_col1][real_res1_col2]; - d2=(CL->T[rs2])->ca_dist[real_res2_col1][real_res2_col2]; - - if ( d1==UNDEFINED || d2 == UNDEFINED) continue; - - - - if ( strm ( PP->local_mode, "sphere")) - { - in_bubble= (d1maximum_distance && d2maximum_distance)?1:0; ; - } - else if ( strm ( PP->local_mode, "window")) - { - wd1=FABS((pos[s1][col2]-pos[s1][col1])); - wd2=FABS((pos[s2][col2]-pos[s2][col1])); - in_bubble= (wd1maximum_distance && wd2maximum_distance)?1:0; ; - } - - if (in_bubble) - { - if ( print_rapdb && s2 >s1) - { - fprintf ( stdout, "NB %d %d %c %d %c ", col2, pos[s1][col2], A->seq_al[s1][col2], pos[s2][col2], A->seq_al[s2][col2]); - BA->seq_al[s1][col2]=toupper (BA->seq_al[s1][col2]); - BA->seq_al[s2][col2]=toupper (BA->seq_al[s2][col2]); - } - delta=FABS((d1-d2)); - if (deltamd_threshold) - distances[s1][s2][real_res1_col1][2]++; - distances[s1][s2][real_res1_col1][1]+=delta; - distances[s1][s2][real_res1_col1][0]++; - distances[s1][s2][real_res1_col1][3]+=delta*delta; - nrapdb++; - rapdb+=delta*delta; - } - } - - if ( nrapdb==0)distances[s1][s2][real_res1_col1][4]=-1; - else distances[s1][s2][real_res1_col1][4]=(float)sqrt((double)(rapdb/nrapdb)); - - if ( print_rapdb && s2>s1) - { - if (nrapdb==0) - { - fprintf ( stdout, "APDB: UNDEFINED\n"); - } - else - { - - fprintf ( stdout, " APDB: %.2f ",(float)sqrt((double)(rapdb/nrapdb))); - BA->residue_case=KEEP_CASE;unalign_residues (BA, s1, s2); - fprintf ( stdout,"SEQ1: %s %s SEQ2: %s %s\n", BA->name[s1], BA->seq_al[s1], BA->name[s2], BA->seq_al[s2]); - } - } - - } - - free_aln (BA); - free_int (pos, -1); - return distances; - } - - - -Alignment * msa2struc_dist ( Alignment *A, Alignment *ST, char *results) - { - - int **pos, c; - FILE *tl; - int s1, s2, rs1, rs2; - int col1, col2; - float ****distances; - float **dm; - int **count; - int **dm_int; - float min, max; - - /*Distances[Nseq][len_aln][4] - distances...[0]: Number of residues within the bubble - distances...[1]: Absolute difference of distance of residues within Bubble - distances...[2]: Number of residues within the bubble with Delta dist < md_threshold - distances ..[3]: Sum of squared difference of distances - distances ..[4]: iRMSD - */ - Pdb_param *pdb_param; - Constraint_list *CL; - int a, b, ncol; - float d1, d2,delta; - int wd1, wd2; - int in_bubble=0; - int real_res1_col1=0; - int real_res1_col2; - int real_res2_col1; - int real_res2_col2; - Pdb_param *PP; - int print_rapdb; - float nrapdb, rapdb; - Alignment *BA=NULL; - NT_node *T0,*T1,*T2,*PT, *POS; - NT_node BT0, BT10,BT50, BT100,RBT; - char **pair_pos_list; - - int ntree=0, ntree2; - - Alignment *B; - char *pos_list; - char *tot_pos_list; - char *struc_tree10; - char *struc_tree100; - char *struc_tree50; - char *struc_tree0; - - char *color_struc_tree; - int **score; - int proceed=1; - - - - declare_name(tot_pos_list); - sprintf ( tot_pos_list, "%s.tot_pos_list", results); - - declare_name(pos_list); - sprintf ( pos_list, "%s.pos_list", results); - - declare_name(struc_tree0); - sprintf ( struc_tree0, "%s.struc_tree_full",results); - - declare_name(struc_tree10); - sprintf ( struc_tree10, "%s.struc_tree10",results); - - declare_name(struc_tree100); - sprintf ( struc_tree100, "%s.struc_tree100",results); - - declare_name(struc_tree50); - sprintf ( struc_tree50, "%s.struc_tree50",results); - - declare_name(color_struc_tree); - sprintf ( color_struc_tree, "%s.struc_tree.html", results); - - pair_pos_list=declare_char (A->len_aln*A->len_aln+1, 100); - T1=vcalloc (A->len_aln*A->len_aln+1, sizeof (NT_node)); - T2=vcalloc (A->len_aln+1, sizeof (NT_node)); - - PT=vcalloc (A->len_aln*A->len_aln+1, sizeof (NT_node)); - POS=vcalloc (A->len_aln+1, sizeof (NT_node)); - - CL=A->CL; - - //Check all sequences have a PDB structure - for (a=0; anseq; a++) - { - if ( ! seq2P_template_file(A->S,a)) - { - fprintf ( stderr, "\n--- ERROR: %s has no structural template. All sequence in the MSA must have a known structure [FATAL]\n", (A->name[a])); - proceed=0; - } - } - if (!proceed) - printf_exit (EXIT_FAILURE, stderr, "\n\n---- ERROR: All provided sequences must have a valid PDB identifier [FATAL:tRMSD-%s]\n\n", PROGRAM); - - for ( s1=0; s1< (A->S)->nseq; s1++) - if ( CL->T[s1]){PP=(CL->T[s1])->pdb_param;break;} - - for ( s1=0; s1< A->nseq; s1++) - { - rs1=A->order[s1][0]; - if (CL->T[rs1] && !(CL->T[rs1])->ca_dist)(CL->T[rs1])->ca_dist=measure_ca_distances(CL->T[rs1]); - } - pos=aln2pos_simple (A, A->nseq); - dm=declare_float (A->nseq, A->nseq); - dm_int=declare_int (A->nseq, A->nseq); - count=declare_int (A->nseq, A->nseq); - PP->maximum_distance=10000; - - tl=vfopen (tot_pos_list, "w"); - for (ncol=0,ntree=0, col1=0; col1< A->len_aln; col1++) - { - int tree, cont; - output_completion (stderr, col1, A->len_aln,1, "Sample Columns"); - for (cont=1,s1=0; s1nseq; s1++)if ( is_gap (A->seq_al[s1][col1]))cont=0;//Stop if gap in column 1 - - if ( cont==0)continue; - - for (s1=0; s1nseq; s1++)for ( s2=0; s2nseq; s2++){count[s1][s2]=0;dm[s1][s2]=0;} - - for ( ntree2=0,col2=0; col2len_aln; col2++) - { - for (s1=0; s1< A->nseq-1; s1++) - { - for ( s2=s1+1; s2nseq; s2++) - { - rs1=A->order[s1][0]; - rs2=A->order[s2][0]; - cont=1; - - if ( s1==s2){dm[s1][s2]=0;continue;} - else if (!(CL->T[rs1]) || !(CL->T[rs2])){cont=0;} - else if ( islower (A->seq_al[s1][col1]) || islower ( A->seq_al[s2][col1])){cont=0;} - else if ( pos[s1][col1]<=0 || pos[s2][col1]<=0 ){cont=0;} - if (pos[s1][col2]<=0 || pos[s2][col2]<=0 ){cont=0;}//stop if Gap in Column 2 - else if ( FABS((pos[s1][col2]-pos[s1][col1]))<=PP->n_excluded_nb){cont=0;} - else if ( FABS((pos[s2][col2]-pos[s2][col1]))<=PP->n_excluded_nb){cont=0;} - else if ( islower (A->seq_al[s1][col2]) || islower ( A->seq_al[s2][col2])){cont=0;} - if ( cont==0){continue;} - - - real_res1_col1=pos[s1][col1]-1; - real_res1_col2=pos[s1][col2]-1; - - real_res2_col1=pos[s2][col1]-1; - real_res2_col2=pos[s2][col2]-1; - - d1=(CL->T[rs1])->ca_dist[real_res1_col1][real_res1_col2]; - d2=(CL->T[rs2])->ca_dist[real_res2_col1][real_res2_col2]; - - if ( d1==UNDEFINED || d2 == UNDEFINED) continue; - - if ( strm ( PP->local_mode, "sphere")) - { - in_bubble= (d1maximum_distance && d2maximum_distance)?1:0; ; - } - else if ( strm ( PP->local_mode, "window")) - { - wd1=FABS((pos[s1][col2]-pos[s1][col1])); - wd2=FABS((pos[s2][col2]-pos[s2][col1])); - in_bubble= (wd1maximum_distance && wd2maximum_distance)?1:0; ; - } - if (in_bubble) - { - delta=FABS((d1-d2)); - //delta=delta*delta; - dm[s1][s2]=dm[s2][s1]+=delta; - count[s1][s2]++; - count[s2][s1]++; - } - } - } - } - - - min=max=-1; - for (tree=1,s1=0; s1nseq-1; s1++) - for (s2=s1+1; s2nseq; s2++) - { - if ( count [s1][s2])dm[s1][s2]=dm[s2][s1]=dm[s1][s2]/(float)count[s1][s2]; - else - { - tree=0; - } - if (s1==0 && s2==1)min=max=dm[s1][s2]; - min=MIN(dm[s1][s2], min); - max=MAX(dm[s1][s2], max); - } - if (!tree || min==-1)continue; - for (s1=0; s1nseq-1; s1++) - for (s2=s1+1; s2nseq; s2++) - { - dm_int[s1][s2]=dm_int[s2][s1]=((dm[s1][s2])/(max))*100; - } - POS[col1]=T1[ntree]=compute_std_tree_2 ( A, dm_int, "_TMODE_upgma"); - fprintf (tl, "\n>Tree_%d Column\n", col1+1); - print_tree (T1[ntree], "newick", tl); - ntree++; - } - - vfclose (tl); - if (!ntree) - { - fprintf ( stderr, "\nERROR: No suitable pair of column supporting a tree [FATAL]\n", (A->name[a])); - exit (EXIT_SUCCESS); - } - - score=treelist2avg_treecmp (T1, NULL); - - display_output_filename( stdout,"TreeList","newick",tot_pos_list, CHECK); - - if ((BT10=treelist2filtered_bootstrap (T1, NULL,score, 0.1))) - { - vfclose (print_tree (BT10,"newick", vfopen (struc_tree10, "w"))); - display_output_filename( stdout,"Tree","newick",struc_tree10, CHECK); - } - - if ((BT50=treelist2filtered_bootstrap (T1, NULL, score,0.5))) - { - vfclose (print_tree (BT50,"newick", vfopen (struc_tree50, "w"))); - display_output_filename( stdout,"Tree","newick",struc_tree50, CHECK); - } - - if ((BT100=treelist2filtered_bootstrap (T1, NULL,score, 1.0))) - { - vfclose (print_tree (BT100,"newick", vfopen (struc_tree100, "w"))); - display_output_filename( stdout,"Tree","newick",struc_tree100, CHECK); - } - - - RBT=BT100; - if (RBT) - { - B=copy_aln (A, NULL); - for (a=0; alen_aln; a++) - { - int score; - Tree_sim *S; - - if (POS[a]) - { - S=tree_cmp (POS[a], RBT); - score=S->uw/10; - vfree (S); - } - else - { - score=NO_COLOR_RESIDUE; - } - - for (b=0; bnseq; b++) - { - if ( is_gap (B->seq_al[b][a]) || score == NO_COLOR_RESIDUE) - { - B->seq_al[b][a]=NO_COLOR_RESIDUE; - } - else - { - B->seq_al[b][a]=S->uw/10; - } - } - } - - output_format_aln ("score_html", A,B,color_struc_tree); - display_output_filename( stdout,"Colored MSA","score_html",color_struc_tree, CHECK); - free_aln (BA); - } - free_int (pos, -1); - exit (EXIT_SUCCESS); - return NULL; - } - -float square_atom ( Atom *X) -{ - - return X->x*X->x + X->y*X->y + X->z*X->z; -} -Atom* reframe_atom ( Atom *X, Atom*Y, Atom *Z, Atom *IN, Atom *R) - { - float new_x, new_y, new_z; - - if ( R==NULL)R=vcalloc ( 1, sizeof (Atom)); - - - new_x= X->x*IN->x + Y->x*IN->y +Z->x*IN->z; - new_y= X->y*IN->x + Y->y*IN->y +Z->y*IN->z; - new_z= X->z*IN->x + Y->z*IN->y +Z->z*IN->z; - - R->x=new_x; - R->y=new_y; - R->z=new_z; - return R; - } - -Atom* add_atom ( Atom *A, Atom*B, Atom *R) -{ - if ( R==NULL)R=vcalloc ( 1, sizeof (Atom)); - - R->x=A->x+B->x; - R->y=A->y+B->y; - R->z=A->z+B->z; - - return R; -} -Atom* diff_atom ( Atom *A, Atom*B, Atom *R) -{ - if ( R==NULL)R=vcalloc ( 1, sizeof (Atom)); - - R->x=A->x-B->x; - R->y=A->y-B->y; - R->z=A->z-B->z; - - return R; -} - -Atom * copy_atom ( Atom *A, Atom*R) -{ - if ( R==NULL)R=vcalloc ( 1, sizeof (Atom)); - R->num=A->num; - R->res_num=A->res_num; - R->x=A->x; - R->y=A->y; - R->z=A->z; - - sprintf( R->type, "%s", A->type); - return R; -} - void print_atom (Atom *A) -{ - fprintf ( stdout, "%.2f %.2f %.2f", A->x, A->y, A->z); -} -/************************************************************************/ -/* */ -/* NUSSINOV */ -/* */ -/************************************************************************/ - -/*---------prototypes ----------*/ -static void computeBasePairMatrix(int**M,char*S,int l, int T); -static int backtrack(int a,int b,int**M,char*S,char*P, int T); - - - -static int basePair(char x, char y) -{ - static short **mat; - - if (!mat) - { - char alp[20]; - int a, b, c1, c2, lc1, lc2; - mat=declare_short (256, 256); - sprintf ( alp, "AGCTUagctu"); - for (a=0; amax ){ - max = numBasePairs[i][j-1]; - index = n; - // j not basepaired with some k such that i max ){ - max = val; - index=i; - } - for(k=i; k<=j-THRESHOLD; k++){ - val = basePair(S[k],S[j]) + numBasePairs[i][k-1] - + numBasePairs[k+1][j-1]; - if (val > max) { - max = val; - index=k; - } - } - numBasePairs[i][j]=max; - if (index -#include -#include -// #include -#include -// #include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -#include "fastal_lib_header.h" -#include "fast_tree_header.h" - - -//TODO: seq_pair2diagonal delete num points from parameters -//TODO: reuse list - - -//Fastal_param *param_set; - - -/*! \mainpage T-Coffee Index Page - * - * \section intro_sec Introduction - * - * This is the introduction. - * - * \section install_sec Installation - * - * \subsection step1 Step 1: Opening the box - * - * etc... - * \section fastal_sec Fastal - * - * This program is a very fast aligner. It is capable of aligning huge sets of sequences because it keeps as much as necessary on hard disk. - */ - - - - - - - -/*! - * \file fastal.c - * \brief Source code for the fastal algorithm - */ - - -/** - * \brief Calculates scores for diagonal segments. - * - * \param seq1 Sequence 1 - * \param seq2 Sequence 2 - * \param *diagonals The diagonals. Three consecutive entries belong togehter. 1. pos in \a seq1 , 2. pos in \a seq2 and 3. length of diagonal - * \param num_diagonals Number of diagonals - * \param s1_length Length of \a seq1 - * \param list length of list. - * \param list An 2-dim array to save the scores in. - * \return new list - */ -int ** -diag2pair_list(char* seq1, - char* seq2, - int *diagonals, - int num_diagonals, - int ***list_in, - int *current_length, - int *current_num_points, - int additional_needed, - Fastal_param *param_set) -{ - int **mat = param_set->M; - int i, j, diag_length, pos1, pos2; - int **list = list_in[0]; - -// printf("NUM: %i\n",num_diagonals); - - int l1 = strlen(seq1), l2 = strlen(seq2); - int x = *current_num_points; - - - int s1_length = strlen(seq1); - int mini; - for (i = 0; i < num_diagonals; ++i) - { - pos1 = diagonals[i*3]; - pos2 = diagonals[i*3+1]; - diag_length = diagonals[i*3+2]; - mini = MIN(pos1, pos2); - pos1 -= mini; - pos2 -= mini; - while ((pos1 < l1) && (pos2 < l2)) - { - if (x==*current_length) - { - *current_length+=1000; - list=vrealloc (list,(*current_length)*sizeof(int*)); - } - if (!list[x]) - list[x]=vcalloc (7, sizeof (int)); - list[x][0] = pos1+1; - list[x][1] = pos2+1; - list[x][2] = mat[toupper(seq1[pos1])-'A'][toupper(seq2[pos2])-'A']; - - ++x; - ++pos1; - ++pos2; - } - } - *current_num_points = x; - list_in[0]=list; -} - -void -guessalignment(Fastal_profile prf) -{ - -} - -int -fastal_compare (const void * a, const void * b) -{ - return (*(int*)a - *(int*)b); -} - -int ** -diagonals2int(int *diagonals, - int num_diagonals, - char *seq1, - char *seq2, - int *num_points, - Fastal_param *param_set) -{ - int l1 = strlen(seq1); - int l2 = strlen(seq2); - int gep = param_set->gep; - - int current_size = l2+l1; - - int **list = vcalloc(current_size, sizeof(int*)); - int *diags = vcalloc(num_diagonals, sizeof(int)); - int i; -// printf("SEQ: %s\nSEQ:%s\n",seq1, seq2); -// printf("X: %i\n",num_diagonals); - for (i = 0; i < num_diagonals; ++i) - { - diags[i] = l1 - diagonals[i*3] + diagonals[i*3+1]; - } - - qsort (diags, num_diagonals, sizeof(int), fastal_compare); - - int *diagx = vcalloc(num_diagonals, sizeof(int)); - int *diagy = vcalloc(num_diagonals, sizeof(int)); - int *old_pos = vcalloc(num_diagonals, sizeof(int)); - - //+1 because diagonals start here at position 1, like in "real" dynamic programming - int a = 0, b = -1; - for (i = 0; i < num_diagonals; ++i) - { - - if (diags[i] < l1) - { - diagx[i] = l1 - diags[i]; - diagy[i] = 0; - a= i; - } - else - break; - } - ++a; - b=a-1; - for (; i < num_diagonals; ++i) - { - diagx[i] = 0; - diagy[i] = diags[i]-l1; - b = i; - } - - int tmpy_pos; - int tmpy_value; - int **M = param_set->M; - int *last_y = vcalloc(l2+1, sizeof(int)); - int *last_x = vcalloc(l1+1, sizeof(int)); - last_y[0] = 0; - - last_x[0] = 0; - list[0] = vcalloc(6, sizeof(int)); - - int list_pos = 1; - int dig_num = l1; - int tmp_l2 = l2 + 1; - - //left border - for (; list_pos < tmp_l2; ++list_pos) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = 0; - list[list_pos][1] = list_pos; - last_y[list_pos] = list_pos; - list[list_pos][2] = list_pos*gep; - list[list_pos][4] = list_pos-1; - } - - int pos_x = 0; - int diags_old = l2; - - int tmp = l1; - int y; - int tmp_l1 = l1-1; - while (pos_x < tmp_l1) - { - if (list_pos + num_diagonals+2 > current_size) - { - current_size += num_diagonals*1000; - list = vrealloc(list, current_size * sizeof(int*)); - } - //upper border - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = ++pos_x; - list[list_pos][1] = 0; - list[list_pos][2] = pos_x * gep; - list[list_pos][3] = last_y[0]; - tmpy_value = list_pos; - tmpy_pos = 0; - last_x[pos_x] = list_pos; - ++list_pos; - - //diagonals - for (i = a; i <= b; ++i) - { - list[list_pos] = vcalloc(6, sizeof(int)); - - list[list_pos][0] = ++diagx[i]; - - list[list_pos][1] = ++diagy[i]; - list[list_pos][3] = last_y[diagy[i]]; - list[list_pos][4] = list_pos-1; - list[list_pos][5] = last_y[diagy[i]-1]; - list[list_pos][2] = M[toupper(seq1[diagx[i]-1])-'A'][toupper(seq2[diagy[i]-1])-'A']; - last_y[tmpy_pos] = tmpy_value; - tmpy_value = list_pos; - tmpy_pos = diagy[i]; - - ++list_pos; - } - last_y[tmpy_pos] = tmpy_value; - - - //lower border - if (list[list_pos-1][1] != l2) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = pos_x; - list[list_pos][1] = l2; - list[list_pos][3] = last_y[l2]; - - list[list_pos][2] = -1000; - list[list_pos][4] = list_pos-1; - if (pos_x > l2) - list[list_pos][5] = last_x[pos_x-l2]; - else - list[list_pos][5] = l2-pos_x; - last_y[l2] = list_pos; - ++list_pos; - - } - - - if ((b >= 0) && (diagy[b] == l2)) - --b; - - if ((a >0) && (diagx[a-1] == pos_x)) - --a; - } - - - dig_num = -1; - if (list_pos + l2+2 > current_size) - { - current_size += list_pos + l2 + 2; - list = vrealloc(list, current_size * sizeof(int*)); - } - - -// right border - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = l1; - list[list_pos][1] = 0; - list[list_pos][3] = last_x[l1-1]; - list[list_pos][2] = -1000; - ++list_pos; - - - - for (i = 1; i <= l2; ++i) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = l1; - list[list_pos][1] = i; - list[list_pos][3] = last_y[i]; - list[list_pos][4] = list_pos-1; - y = last_y[i-1]; - if ((list[y][0] == l1-1) && (list[y][1] == i-1)) - { - list[list_pos][5] = y; - list[list_pos][2] = M[toupper(seq1[l1-1])-'A'][toupper(seq2[i-1])-'A']; - } - else - { - if (i <= l1) - { - list[list_pos][5] = last_x[l1-i]; - } - else - { - list[list_pos][5] = i-l1; - } - list[list_pos][2] = -1000; - } - ++list_pos; - } - - list[list_pos - l2][2] = -1000; - - *num_points = list_pos; - - -// int blb; -// for (blb = 0; blb gep; - - int current_size = l2+l1; - int **list = vcalloc(current_size, sizeof(int*)); - int *diags = vcalloc(num_diagonals, sizeof(int)); - int i; - for (i = 0; i < num_diagonals; ++i) - { - diags[i] = l1 - diagonals[i*3] + diagonals[i*3+1]; - - } - - qsort (diags, num_diagonals, sizeof(int), fastal_compare); - - int *diagx = vcalloc(num_diagonals, sizeof(int)); - int *diagy = vcalloc(num_diagonals, sizeof(int)); - int *old_pos = vcalloc(num_diagonals, sizeof(int)); - - //+1 because diagonals start here at position 1, like in "real" dynamic programming - int a = 0, b = -1; - for (i = 0; i < num_diagonals; ++i) - { - - if (diags[i] < l1) - { - - diagx[i] = l1 - diags[i]; - diagy[i] = 0; - - a= i; - } - else - break; - } - ++a; - b=a-1; - for (; i < num_diagonals; ++i) - { - diagx[i] = 0; - diagy[i] = diags[i]-l1; - b = i; - - } - - int tmpy_pos; - int tmpy_value; - int **M = param_set->M; - - int *last_y = vcalloc(l2+1, sizeof(int)); - int *last_x = vcalloc(l1+1, sizeof(int)); - last_y[0] = 0; - - last_x[0] = 0; - list[0] = vcalloc(6, sizeof(int)); -// list[0][3] = l1; - int list_pos = 1; - int dig_num = l1; - int tmp_l2 = l2 + 1; - - //left border - for (; list_pos < tmp_l2; ++list_pos) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = 0; - list[list_pos][1] = list_pos; - last_y[list_pos] = list_pos; - list[list_pos][2] = list_pos*gep; - list[list_pos][3] = ++dig_num; - list[list_pos][5] = list_pos-1; - } - - int pos_x = 0; - int diags_old = l2; - - int bla; - int bla2, bla3, tmp_x; - - int tmp = l1; - int y; - int tmp_l1 = l1-1; - while (pos_x < tmp_l1) - { - if (list_pos + num_diagonals+2 > current_size) - { - current_size += num_diagonals*50; - list = vrealloc(list, current_size * sizeof(int*)); - } - //upper border - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = ++pos_x; - list[list_pos][1] = 0; - list[list_pos][2] = pos_x * gep; - list[list_pos][3] = --tmp; - list[list_pos][4] = last_y[0]; - tmpy_value = list_pos; - tmpy_pos = 0; - last_x[pos_x] = list_pos; - ++list_pos; - - //diagonals - for (i = a; i <= b; ++i) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = ++diagx[i]; - list[list_pos][1] = ++diagy[i]; - list[list_pos][3] = diags[i]; - - list[list_pos][4] = last_y[diagy[i]]; - list[list_pos][5] = list_pos-1; - list[list_pos][6] = last_y[diagy[i]-1]; - - list[list_pos][2] = 0; - - bla3 = 0; - bla2 = 0; - tmp_x = 0; - for (bla = 0; bla<10; ++bla) - { - - for (bla2 = 0; bla2<10; ++bla2) - { - bla3 += prf2->prf[bla2][diagy[i]-1] * prf1->prf[bla][diagx[i]-1]; - tmp_x += prf2->prf[bla2][diagy[i]-1] * prf1->prf[bla][diagx[i]-1] * M[pos2char[bla]-'A'][pos2char[bla2] -'A']; - - } - } - list[list_pos][2] = (int)tmp_x / bla3; - -// for (bla = 0; bla<10; ++bla) -// bla2 += prf2->prf[bla][diagy[i]-1]; -// bla2 = bla2/prf2->num_sequences; -// -// for (bla = 0; bla<10; ++bla) -// bla3 += prf1->prf[bla][diagy[i]-1]; -// -// bla3 = bla3/prf1->num_sequences; -// -// -// if ((bla2 > 0.7) && (bla3 > 0.7)) -// list[list_pos][2] = M[toupper(seq1[diagx[i]-1])-'A'][toupper(seq2[diagy[i]-1])-'A']; -// else if ((bla< 0.7) && (bla3 < 0.7)) -// list[list_pos][2] = M[toupper(seq1[diagx[i]-1])-'A'][toupper(seq2[diagy[i]-1])-'A'] = 3; -// else -// list[list_pos][2] = M[toupper(seq1[diagx[i]-1])-'A'][toupper(seq2[diagy[i]-1])-'A'] * ((bla< 0.7) && (bla3 < 0.7)); -// list[list_pos][2] = M[toupper(seq1[diagx[i]-1])-'A'][toupper(seq2[diagy[i]-1])-'A'];//* ((bla2+bla3)/2); - last_y[tmpy_pos] = tmpy_value; - tmpy_value = list_pos; - tmpy_pos = diagy[i]; - - ++list_pos; - } - last_y[tmpy_pos] = tmpy_value; - - - //lower border - if (list[list_pos-1][1] != l2) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = pos_x; - list[list_pos][1] = l2; - list[list_pos][4] = last_y[l2]; - - list[list_pos][2] = -1000; - list[list_pos][3] = l1 - pos_x + l2; - list[list_pos][5] = list_pos-1; - if (pos_x > l2) - list[list_pos][6] = last_x[pos_x-l2]; - else - list[list_pos][6] = l2-pos_x; - last_y[l2] = list_pos; - ++list_pos; - } - - - if ((b >= 0) && (diagy[b] == l2)) - --b; - - if ((a >0) && (diagx[a-1] == pos_x)) - --a; - } - - - dig_num = -1; - if (list_pos + l2+2 > current_size) - { - current_size += list_pos + l2 + 2; - list = vrealloc(list, current_size * sizeof(int*)); - } - - -// right border - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = l1; - list[list_pos][1] = 0; - list[list_pos][3] = ++dig_num; - list[list_pos][4] = last_x[l1-1]; - list[list_pos][2] = -1000; - ++list_pos; - - for (i = 1; i <= l2; ++i) - { - list[list_pos] = vcalloc(6, sizeof(int)); - list[list_pos][0] = l1; - list[list_pos][1] = i; - list[list_pos][3] = ++dig_num; - list[list_pos][4] = last_y[i]; - list[list_pos][5] = list_pos-1; - y = last_y[i-1]; - if ((list[y][0] == l1-1) && (list[y][1] == i-1)) - { - list[list_pos][6] = y; - list[list_pos][2] = M[toupper(seq1[l1-1])-'A'][toupper(seq2[i-1])-'A']; - } - else - { - if (i <= l1) - { - list[list_pos][6] = last_x[l1-i]; - } - else - { - list[list_pos][6] = i-l1; - } - list[list_pos][2] = -1000; - } - ++list_pos; - } - - list[list_pos - l2][2] = -1000; - - *num_points = list_pos; - - return list; -} - - - - -//************************** sparse dynamic aligning ********************************************************** - - -void -combine_profiles2file(int **prf1, - int **prf2, - int pos1, - int pos2, - Fastal_param *param_set, - FILE *prof_f, - char state) -{ - int alphabet_size = param_set->alphabet_size; - char *pos2aa = &(param_set->pos2char[0]); - int i; - int x = 0; - if (state == 'M') - { - for (i = 0; i < alphabet_size; ++i) - if (prf1[i][pos1] + prf2[i][pos2] > 0) - { - if (x) - fprintf(prof_f," %c%i", pos2aa[i],prf1[i][pos1]+prf2[i][pos2]); - else - fprintf(prof_f,"%c%i", pos2aa[i],prf1[i][pos1]+prf2[i][pos2]); - x = 1; - } - fprintf(prof_f,"\n"); - } - else if (state == 'D') - { - for (i = 0; i < alphabet_size; ++i) - if (prf2[i][pos2] > 0) - { - if (x) - fprintf(prof_f," %c%i", pos2aa[i],prf2[i][pos2]); - else - fprintf(prof_f,"%c%i", pos2aa[i],prf2[i][pos2]); - x = 1; - } - fprintf(prof_f,"\n"); - } - else - { - for (i = 0; i < alphabet_size; ++i) - if (prf1[i][pos1] > 0) - { - if (x) - fprintf(prof_f," %c%i", pos2aa[i],prf1[i][pos1]); - else - fprintf(prof_f,"%c%i", pos2aa[i],prf1[i][pos1]); - x = 1; - } - fprintf(prof_f,"\n"); - } -} - - - -#define LIN(a,b,c) a[b*5+c] -/** - * Calculates a fast and sparse dynamic programming matrix - * - * \param prf1 Profile of first sequence. - * \param prf2 Profile of second sequence. - * \param param_set The parameter for the alignment. - * \param list The list of diagonals. - * \param n number of dots. - * \param edit_f File to save the edit information. - * \param prof_f File to save the profile. - * \param node_number Number of the new profile. - */ -int -list2linked_pair_wise_fastal(Fastal_profile *prf1, - Fastal_profile *prf2, - Fastal_param *param_set, - int **list, - int n, - FILE *edit_f, - FILE *prof_f, - int node_number) -{ - int a,b,c, i, j, LEN=0, start_trace; - int pi, pj,ij, delta_i, delta_j, prev_i, prev_j; - static int **slist; - static long *MI, *MJ, *MM,*MT2; - static int *sortseq; - static int max_size; - int gop, gep, igop, igep; - int l1, l2, l, ls; - char **al; - char **aln,*char_buf; - int ni=0, nj=0; - long score; - int nomatch = param_set->nomatch; - - l1=prf1->length; - l2=prf2->length; - - al=declare_char (2,l1+l2+1); - - - - igop=param_set->gop; - gep=igep=param_set->gep; - if (n>max_size) - { - max_size=n; - - vfree (MI);vfree (MJ); vfree (MM); - free_int (slist, -1); - - slist=declare_int (n,3); - - MI=vcalloc (5*n, sizeof (long)); - MJ=vcalloc (5*n, sizeof (long)); - MM=vcalloc (5*n, sizeof (long)); - - } - else - { - for (a=0; a1 && (ls=list[a][0]-list[ij][0])==(list[a][1]-list[ij][1])) - { - LIN(MM,a,0)=MAX3(LIN(MM,ij,0),LIN(MI,ij,0),LIN(MJ,ij,0))+list[a][2]-(ls*nomatch); - - LIN(MM,a,1)=ij; - LIN(MM,a,2)=ls; - LIN(MM,a,3)=ls; - if ( LIN(MM,ij,0)>=LIN(MI,ij,0) && LIN(MM,ij,0)>=LIN(MJ,ij,0))LIN(MM,a,4)='m'; - else if ( LIN(MI,ij,0) >= LIN(MJ,ij,0))LIN(MM,a,4)='i'; - else LIN(MM,a,4)='j'; - - } - else - { - LIN(MM,a,0)=UNDEFINED; - LIN(MM,a,1)=-1; - } - } - - a=start_trace; - if (LIN(MM,a,0)>=LIN(MI,a,0) && LIN(MM,a,0) >=LIN(MJ,a,0))MT2=MM; - else if ( LIN(MI,a,0)>=LIN(MJ,a,0))MT2=MI; - else MT2=MJ; - - score=MAX3(LIN(MM,a,0), LIN(MI,a,0), LIN(MJ,a,0)); - - i=l1; - j=l2; - - - while (!(i==0 &&j==0)) - { - int next_a; - l=MAX(LIN(MT2,a,2),LIN(MT2,a,3)); - // HERE ("%c from %c %d %d SCORE=%d [%d %d] [%2d %2d]", T2[a][5],T2[a][4], T2[a][2], T2[a][3], T2[a][0], gop, gep, i, j); - if (i==0) - { - while ( j>0) - { - al[0][LEN]=0; - al[1][LEN]=1; - j--; LEN++; - } - } - else if (j==0) - { - while ( i>0) - { - al[0][LEN]=1; - al[1][LEN]=0; - i--; LEN++; - } - } - - else if (l==0) {HERE ("L=0 i=%d j=%d",l, i, j);exit (0);} - else - { - for (b=0; bprf_number, prf2->prf_number, prf1->is_leaf, prf2->is_leaf); - fprintf(prof_f, "%i\n0\n%i\n1\n", node_number,LEN); - - char statec[] = {'M','D','I'}; - int num = 0; - int state = 0; - i = 0; - j = 0; - - for ( b=0; b< LEN; b++) - { - if ((al[0][b]==1) && (al[1][b]==1)) - { - - combine_profiles2file(prf1->prf, prf2->prf, i, j, param_set, prof_f, 'M'); - ++i; - ++j; - if (state != 0) - { - fprintf(edit_f, "%c%i\n",statec[state], num); - num =1; - state = 0; - } - else - ++num; - } - else if (al[0][b]==1) - { -// prf1->prf[param_set->alphabet_size-1] += prf2->num_sequences; - combine_profiles2file(prf1->prf, prf2->prf, i, j, param_set, prof_f, 'I'); - ++i; - if (state != 2) - { - fprintf(edit_f, "%c%i\n",statec[state], num); - num =1; - state = 2; - } - else - ++num; - } - else if (al[1][b]==1) - { -// prf2->prf[param_set->alphabet_size-1] += prf1->num_sequences; - combine_profiles2file(prf1->prf, prf2->prf, i, j, param_set, prof_f, 'D'); - ++j; - if (state != 1) - { - fprintf(edit_f, "%c%i\n",statec[state], num); - num =1; - state = 1; - } - else - ++num; - } - } - - - fprintf(edit_f, "%c%i\n",statec[state], num); - num =1; - state = 1; - - - fprintf(edit_f,"*\n"); - fprintf(prof_f,"*\n"); - free_char (al, -1); -// exit(0); - return LEN; -} - - - - - - -/** - * \brief Tuns a profile into a consensus sequence. - * - * The character with the highest number of occurences is used as consensus. Gaps are not included. For example: 10 '-' and one 'A' would give 'A' as consensus. - * \param profile The profile. - * \param file_name Name of the file to save the consensus sequence in. - * \param param_set The parameter of the fastal algorithm. - * \return the sequence - */ -char* -profile2consensus(Fastal_profile *profile, char *file_name, Fastal_param *param_set) -{ - FILE *cons_f = fopen(file_name,"w"); - fprintf(cons_f, ">%i\n", profile->prf_number); - char* seq = vcalloc(profile->length+1, sizeof(char)); - int i, j; - int most_pos, most; - int alphabet_size = param_set->alphabet_size; - int **prf = profile->prf; - char *pos2char = param_set->pos2char; - for (i = 0; i < profile->length; ++i) - { - most = -1; - for (j = 0; j < alphabet_size; ++j) - { - if (prf[j][i] > most) - { - most = prf[j][i]; - most_pos = j; - } - } - seq[i] = pos2char[most_pos]; - fprintf(cons_f, "%c",pos2char[most_pos]); - } - seq[i] = '\0'; - fprintf( cons_f, "\n"); - fclose(cons_f); - return seq; -} - - - - -/** - * \brief Calculates the diagonals between two sequences. - * - * Uses bl2seq to calculate the diagonals. - * \param seq_file1 File with sequence 1. - * \param seq_file2 File with sequence 2. - * \param diagonals An array where the diagonal points will be stored. - * \param dig_length length of \a diagonals . - * \param num_points Number of points in all diagonals. - * \return number of diagonals; - */ -int -seq_pair2blast_diagonal(char *seq_file_name1, - char *seq_file_name2, - int **diagonals, - int *dig_length, - int l1, - int l2, - int is_dna) -{ - int *diag = vcalloc(l1 + l2, sizeof(int)); - char *out_file = vtmpnam(NULL); - char blast_command[600]; - - if (is_dna) - sprintf(blast_command, "bl2seq -p blastn -i %s -j %s -D 1 -g F -o %s", seq_file_name1, seq_file_name2, out_file); - else - sprintf(blast_command, "bl2seq -p blastp -i %s -j %s -D 1 -g F -o %s", seq_file_name1, seq_file_name2, out_file); - system(blast_command); - - int *diags = diagonals[0]; - FILE *diag_f = fopen(out_file,"r"); - char line[300]; - fgets(line, 300, diag_f); - fgets(line, 300, diag_f); - fgets(line, 300, diag_f); - - - char delims[] = "\t"; - char *result = NULL; - int length, pos_q, pos_d, i; - int current_pos = 0; - while (fgets(line, 300, diag_f) != NULL) - { - strtok(line, delims); - strtok(NULL, delims); - strtok(NULL, delims); - length = atoi(strtok(NULL, delims)); - strtok(NULL, delims); - strtok(NULL, delims); - pos_q = atoi(strtok(NULL, delims))-1; - strtok(NULL, delims); - pos_d = atoi(strtok(NULL, delims))-1; - - if (current_pos >= *dig_length) - { - (*dig_length) += 90; - diags = vrealloc(diags, sizeof(int)*(*dig_length)); - } - if (diag[l1-pos_q+pos_d] == 0) - { - diag[l1-pos_q+pos_d] =1; - diags[current_pos++] = pos_q; - diags[current_pos++] = pos_d; - diags[current_pos++] = length; - } - } - vfree(diag); - fclose(diag_f); - diagonals[0] = diags; - return current_pos/3; -} - - - - -//******************************* OTHER STUFF *********************** - -/** - * \brief Reads the sequence from a given position in a fasta file and turns it into a profile. - * - * \param seq_file The file where the sequence is stored. - * \param off_set The off_set from the beginning of the file to the position of the sequence name. - * \param profile The profile where the sequence will be stored into. - * \param prf_number The number of this profile. - */ -void -file_pos2profile(FILE *seq_file, //File with sequences - long off_set, //offset of sequence from the beginning of file point to the sequence name, not to the sequence itself - Fastal_profile *profile, //profile to save into - int prf_number, //number of the profile - Fastal_param *param_set) -{ - int alphabet_size = param_set->alphabet_size; - profile->is_leaf = 1; - int *aa2pos = &(param_set->char2pos[0]); - const int LINE_LENGTH = 500; - char line[LINE_LENGTH]; - profile->num_sequences = 1; - profile->prf_number = prf_number; - fseek (seq_file , off_set , SEEK_SET ); - - fgets (line, LINE_LENGTH , seq_file); - int seq_length = 0; - int i, j; - - while(fgets(line, LINE_LENGTH, seq_file)!=NULL) - { - if (line[0] != '>') - { - - line[LINE_LENGTH-1] = '\n'; - if (seq_length + LINE_LENGTH >= profile->allocated_memory) - { - for (i = 0; i < alphabet_size; ++i) - { - profile->prf[i] = vrealloc(profile->prf[i], (profile->allocated_memory+PROFILE_ENLARGEMENT)*sizeof(int)); - } - profile->allocated_memory += PROFILE_ENLARGEMENT; - } - - i = 0; - while (line[i] != '\n') - { - for(j = 0; jprf[j][seq_length+i] = 0; - profile->prf[aa2pos[toupper(line[i])-'A']][seq_length+i] = 1; - ++i; - } - seq_length += i; - - } - else - break; - } - profile->length = seq_length; -} - - - -/** -* constructs index of fasta_file -*/ -int -make_index_of_file(char *file_name, //file with sequences - long **file_positions) //array to save the positions -{ - const int LINE_LENGTH = 150; - (*file_positions) = vcalloc(ENLARGEMENT_PER_STEP, sizeof(long)); - - int current_size = ENLARGEMENT_PER_STEP; - int current_pos = 0; - - FILE *file = fopen(file_name,"r"); - - char *sequence = vcalloc(3*LINE_LENGTH,sizeof(char)); - int seq_length=0; - int allocated_length=3*LINE_LENGTH; - char line[LINE_LENGTH]; - - int num_of_sequences = 0; - int mem_for_pos = ENLARGEMENT_PER_STEP; - - if (file == NULL) - { - printf("FILE NOT FOUND\n"); - exit(1); - } - else - { - (*file_positions)[num_of_sequences] = ftell(file); - while(fgets(line, LINE_LENGTH , file)!=NULL) - { - int length = strlen(line); - if (line[0] == '>') - { - ++num_of_sequences; - - if (num_of_sequences == mem_for_pos) - { - (*file_positions) = vrealloc((*file_positions),(ENLARGEMENT_PER_STEP+mem_for_pos) * sizeof(long)); - mem_for_pos += ENLARGEMENT_PER_STEP; - } - } - (*file_positions)[num_of_sequences] = ftell(file); - } - } - fclose(file); - return num_of_sequences; -} - - -/** -* reads a profile from a profile_file -*/ -profile_file2profile(Fastal_profile *prof, //structure to save the profile in - FILE *profile_f, //file where the profile is stored - long position, //position in profile_f where the profile is stored - Fastal_param *param_set) -{ - - int alphabet_size = param_set->alphabet_size; - - int *aa2pos = &(param_set->char2pos[0]); - - - fseek(profile_f,position,SEEK_SET); - const int LINE_LENGTH = 500; - char line[500]; - - fgets(line, LINE_LENGTH, profile_f); - - prof->prf_number = atoi(line); -// fgets(line, LINE_LENGTH, profile_f); -// prof->num_sequences = atoi(line); -// fgets(line, LINE_LENGTH, profile_f); //is-dna is already known - fgets(line, LINE_LENGTH, profile_f); - prof->is_leaf = atoi(line); - - fgets(line, LINE_LENGTH, profile_f); - prof->length = atoi(line); - fgets(line, LINE_LENGTH, profile_f); - prof->weight = atoi(line); - int i,j; - if (prof->length > prof->allocated_memory) - for (i = 0;i < alphabet_size; ++i) - { - prof->prf[i] = vrealloc(prof->prf[i],prof->length*sizeof(int)); - } - - char delims[] = " "; - char *result = NULL; - char *result_num = NULL; - - int length = prof->length; - - for (i = 0; i < length; ++i) - { - for(j = 0; jprf[j][i] = 0; - fgets(line, LINE_LENGTH , profile_f); - result = strtok( line, delims ); - - while( result != NULL) - { - result_num = &result[1]; - prof->prf[aa2pos[result[0]-'A']][i] = atoi(result_num); - result = strtok( NULL, delims ); - } - } -} - - - -/** -* writes a profile into a file -*/ -void -profile2file(Fastal_profile *profile, //the profile to save - FILE* file, //file to save in - Fastal_param *param_set) -{ - int alphabet_size = param_set->alphabet_size; - - char *pos2aa = &(param_set->pos2char[0]); - - fseek(file,0,SEEK_SET); - - fprintf(file,"%i\n", profile->prf_number); -// fprintf(file,"%i\n", profile->num_sequences); - - fprintf(file,"%i\n", profile->is_leaf); - fprintf(file,"%i\n", profile->length); - fprintf(file,"%i\n", profile->weight); - int i = 0, j = 0; - int max = profile->length; - int x= 0; - --alphabet_size; - while (i < max) - { - for (j = 0; j < alphabet_size; ++j) - if (profile->prf[j][i] > 0) - { - if (x) - fprintf(file," %c%i", pos2aa[j],profile->prf[j][i]); - else - fprintf(file,"%c%i", pos2aa[j],profile->prf[j][i]); - x = 1; - } - if (profile->prf[j][i] > 0) - if (x) - fprintf(file," %c%i", pos2aa[j],profile->prf[j][i]); - else - fprintf(file,"%c%i", pos2aa[j],profile->prf[j][i]); - x = 1; - x = 0; - fprintf(file,"\n"); - ++i; - } - fprintf(file,"*\n"); -} - - - -/** -* Reads the profile out of an alignment -*/ -void -file2profile(FILE* profile_f, //file to read the profile of - Fastal_profile *prof, //profile saved in here - int prf_number, //number of the profile - Fastal_param *param_set) -{ - int alphabet_size = param_set->alphabet_size; - - int *aa2pos = &(param_set->char2pos[0]); - - - fseek(profile_f,0,SEEK_SET); - const int LINE_LENGTH = 500; - char line[500]; - - fgets(line, LINE_LENGTH, profile_f); - prof->prf_number = atoi(line); -// fgets(line, LINE_LENGTH, profile_f); //is-dna is already known - fgets(line, LINE_LENGTH, profile_f); - prof->is_leaf = atoi(line); - - fgets(line, LINE_LENGTH, profile_f); - prof->length = atoi(line); - - fgets(line, LINE_LENGTH, profile_f); - prof->weight = atoi(line); - int i,j; - if (prof->length > prof->allocated_memory) - for (i = 0;i < alphabet_size; ++i) - { - prof->prf[i] = vrealloc(prof->prf[i],prof->length*sizeof(int)); - } - - char delims[] = " "; - char *result = NULL; - char *result_num = NULL; - - int length = prof->length; - - for (i = 0; i < length; ++i) - { - for(j = 0; jprf[j][i] = 0; - fgets(line, LINE_LENGTH , profile_f); - result = strtok( line, delims ); - - while( result != NULL) - { - result_num = &result[1]; - prof->prf[aa2pos[result[0]-'A']][i] = atoi(result_num); - result = strtok( NULL, delims ); - } - } -} - - - -/** -* This method takes a profile and turns it into a sumed up version of same size. -*/ -int** -sumup_profile(Fastal_profile *profile, //profile to sum-up - int **sumup, - Fastal_param *param_set) //summed_up_profile -{ - - char *pos2aa = &(param_set->pos2char[0]); - int alphabet_size = param_set->alphabet_size; - int **M = param_set->M; - int prof_length = profile->length; - - int i,j,k; - - for (i = 0; i < prof_length; ++i) - { - sumup[alphabet_size][i] = 0; - for (k = 0; k < alphabet_size; ++k) - { - sumup[k][i] = 0; - sumup[alphabet_size][i] += profile->prf[k][i]; - for (j = 0; j < alphabet_size; ++j) - { - sumup[k][i] += profile->weight * profile->prf[j][i] * M[pos2aa[j]-'A'][pos2aa[k]-'A']; - } - } - } - - return sumup; -} - - - -/** -* Turns the dynamic programming matrix into a editfile and calculates the new profile -*/ -int -nw_matrix2edit_file(double **prog_matrix, //dynamic programming matrix - Fastal_profile *prf1, //profile of dim1 - Fastal_profile *prf2, //profile of dim2 - FILE *edit_f, //file to safe the edit in - int **prf_field, //space to safe the new profile - int *field_length, - Fastal_param *param_set) //length of prf_field -{ - int **M = param_set->M; - int alphabet_size = param_set->alphabet_size; - double gap_cost = param_set -> gop; - fprintf(edit_f, "%i\n%i\n%i\n%i\n",prf1->prf_number, prf2->prf_number, prf1->is_leaf, prf2->is_leaf); - int sum[] = {0,0,0}; - char sumc[] = {'M','I','D'}; - int last = 0; - int n = 0; - int m = 0; - int field_pos = 0; - int i; - int prf1_length = prf1->length; - int prf2_length = prf2->length; - while ((n < prf1_length) && (m < prf2_length)) - { - //if necesarry allocate more memory for result - if ((*field_length)-alphabet_size < field_pos) - { - (*field_length) += ENLARGEMENT_PER_STEP; - - for (i = 0; i prf[i][n]; - } - ++n; - ++ field_pos; - - if (last != 1) - { - fprintf(edit_f,"%c%i\n",sumc[last],sum[last]); - sum[last] = 0; - } - last = 1; - ++sum[last]; - } - else if (prog_matrix[n][m] == (prog_matrix[n][m+1] +gap_cost)) - { - - for (i = 0; iprf[i][m]; - } - ++m; - ++ field_pos; - if (last != 2) - { - fprintf(edit_f,"%c%i\n",sumc[last],sum[last]); - sum[last] = 0; - } - last = 2; - ++sum[last]; - } - else - { - for (i = 0; iprf[i][n] + prf2->prf[i][m]; - } - ++n; - ++m; - ++ field_pos; - if (last != 0) - { - fprintf(edit_f,"%c%i\n",sumc[last],sum[last]); - sum[last] = 0; - } - last = 0; - ++sum[last]; - } - } - fprintf(edit_f,"%c%i\n",sumc[last],sum[last]); - - //gaps in prf2 - last = 0; - while (n < prf1_length) - { - for (i = 0; iprf[i][n]; - } - ++n; - ++ field_pos; - ++last; - } - if (last > 0) - fprintf(edit_f,"I%i\n",last); - - //gaps in prf1 - last = 0; - while (m < prf2_length) - { - for (i = 0; iprf[i][m]; - } - ++m; - ++ field_pos; - ++last; - } - if (last > 0) - fprintf(edit_f,"D%i\n",last); - fprintf(edit_f,"*\n"); - return field_pos; -} - - - - -/** - * \brief Pairwise alignments of profile is done here. - * - * \param profile1 Profile of sequence 1 - * \param profile2 Profile of sequence 2 - * \param prog_matrix Matrix for dynamic programming - * \param edit_file_name The edit_file_name - * \param sumup_prf The sumup version of profile 1, which later contains the aligned profile. - * \param sumup_length Contains the length of the aligned profile. - * \return length of the aligned profile - */ -int -prf_nw(Fastal_profile *profile1, //profile of sequence 1 - Fastal_profile *profile2, //profile of sequence 2 - double **prog_matrix, //matrix for dynamic programming (at least as long as necessary for alignment) - FILE *edit_file_name, //name of edit file - int **sumup_prf, //sum_up - int *sumup_length, - Fastal_param *param_set) //sum_up length -{ - int alphabet_size = param_set->alphabet_size; - double gap_cost = param_set->gop; - - int i; - if (*sumup_length < profile1->length) - { - for (i = 0; i < alphabet_size+1; ++i) - { - sumup_prf[i] = vrealloc(sumup_prf[i], profile1->length*sizeof(int)); - } - *sumup_length = profile1->length; - } - sumup_prf = sumup_profile(profile1, sumup_prf, param_set); - - - - int j,k; - int prof1_length = profile1->length; - int prof2_length = profile2->length; - - int** M = param_set->M; - double match_score; - int amino_counter; - int residue_pairs = 0; - - for (i = prof2_length; i > 0; --i) - { - prog_matrix[prof1_length][i] = gap_cost * (prof2_length-i); - } - - i = prof1_length-1; - prog_matrix[prof1_length][prof2_length] = 0.0; - while (i >=0) - { - j = prof2_length-1; - - prog_matrix[i][prof2_length] = gap_cost*(prof1_length-i); - while (j >=0) - { - match_score = 0.0; - residue_pairs = 0; - for (k = 0; k < alphabet_size; ++k) - { - residue_pairs += profile2->prf[k][j]; - match_score += (profile2->prf[k][j] * sumup_prf[k][i]); - } - match_score /= (residue_pairs * sumup_prf[alphabet_size][i]); - prog_matrix[i][j] = MAX3(prog_matrix[i+1][j+1]+match_score, prog_matrix[i+1][j]+gap_cost, prog_matrix[i][j+1]+gap_cost); - - --j; - } - --i; - } - return nw_matrix2edit_file(prog_matrix, profile1, profile2, edit_file_name, sumup_prf, sumup_length, param_set); -} - - - -/** - * \brief Writes the sequence into the alignment_file. - * - * \param aligned_sequence Pattern of aligned sequence. - * \param sequence_file File with sequences. - * \param sequence_position Positions of sequences in \a sequence_file. - * \param alignment_file The file to write the sequence into. - * -*/ -void -edit_seq2aligned_seq(char *aligned_sequence, //pattern for aligned sequence - FILE *sequence_file, //file with all the sequences - long sequence_position, //position in sequence file with the correct sequence - FILE *alignment_file) //file to write the alignment into -{ - fseek(sequence_file, sequence_position, SEEK_SET); - const int LINE_LENGTH = 300; - char line[LINE_LENGTH]; - fgets (line, LINE_LENGTH , sequence_file); - fprintf(alignment_file,"%s", line); //writing of sequence name - int pos = 0; - int i = 0; - while(fgets(line, LINE_LENGTH, sequence_file)!=NULL) - { - if (line[0] != '>') - { - line[LINE_LENGTH-1] = '\n'; - i = 0; - while (line[i] != '\n') - { - while (aligned_sequence[pos] == '-') - { - fprintf(alignment_file,"-"); - ++pos; - } - fprintf(alignment_file,"%c",line[i]); - ++i; - ++pos; - } - } - else - break; - } - while (aligned_sequence[pos] != '\n') - { - fprintf(alignment_file,"-"); - ++pos; - } - fprintf(alignment_file,"\n"); -} - - - -/** - * \brief Recursive function to turn the edit_file into the alignment. - * - * \param sequence_file File with all sequences. - * \param sequence_position The array of sequence positions in \a sequence_file - * \param edit_file File to safe the edit profiles in. - * \param edit_positions Array saving the coorespondence between edit profile and position in \a edit_file - * \param node_number The current node. - * \param number_of_sequences The number of sequences. - * \param aligned_sequence The sequence that is edited. - * \param alignment_length The length of the alignment. - * \param edit_seq_file File that saves the edited_sequences of the internal nodes. - * \param offset Saves the size of the edited_sequences. - * \param alignment_file File where the alignment is saved. - * - */ -void -edit2alignment(FILE *sequence_file, //sequence file - long *seq_positions, //sequence positions - FILE *edit_file, //file saving the edit profiles - long *edit_positions, //array saving the correspondence between edit profile and position in edit_file - int node_number, //the current node - int number_of_sequences, //number of sequences - char *aligned_sequence, //the sequence that is edited - int alignment_length, //length of the alignment - and thus of aligned_sequence - FILE *edit_seq_file, //file saving the edited_sequences of the internal nodes - int offset, //saves the size of the edited_sequence - FILE* alignment_file) //file saving the alignments -{ - fseek(edit_file, edit_positions[node_number-number_of_sequences], SEEK_SET); - const LINE_LENGTH = 50; - char line[LINE_LENGTH]; - fgets(line, LINE_LENGTH , edit_file); - int child1 = atoi(line); - fgets(line, LINE_LENGTH , edit_file); - int child2 = atoi(line); - fgets(line, LINE_LENGTH , edit_file); - int is_leaf1 = atoi(line); - fgets(line, LINE_LENGTH , edit_file); - int is_leaf2 = atoi(line); - - static char seq_line[10]; - - char x; - int number; - int pos = 0; - - //first child - while(fgets(line, LINE_LENGTH , edit_file)!=NULL) - { - x = line[0]; - if (x == '*') - break; - number = atoi(&line[1]); - if (x == 'M') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - --number; - ++pos; - } - } - else if (x == 'I') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - --number; - ++pos; - } - } - else if (x == 'D') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - { - aligned_sequence[pos] = '-'; - --number; - } - ++pos; - } - } - } - - if (is_leaf1) - { - edit_seq2aligned_seq(aligned_sequence, sequence_file, seq_positions[child1], alignment_file); - } - else - { - fprintf(edit_seq_file, "%s", aligned_sequence); - edit2alignment(sequence_file, seq_positions, edit_file, edit_positions, child1, number_of_sequences, aligned_sequence, alignment_length, edit_seq_file, offset, alignment_file); - } - - //second child - fseek(edit_seq_file, offset, SEEK_CUR); - fgets(aligned_sequence, alignment_length+3, edit_seq_file); - fseek(edit_seq_file, offset, SEEK_CUR); - - pos = 0; - fseek(edit_file, edit_positions[node_number-number_of_sequences], SEEK_SET); - while(fgets(line, LINE_LENGTH , edit_file)!=NULL) - { - x = line[0]; - if (x == '*') - break; - number = atoi(&line[1]); - if (x == 'M') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - --number; - ++pos; - } - } - else if (x == 'I') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - { - aligned_sequence[pos] = '-'; - --number; - } - ++pos; - } - } - else if (x == 'D') - { - while (number > 0) - { - if (aligned_sequence[pos] == 'X') - --number; - ++pos; - } - } - } - - if (is_leaf2) - { - edit_seq2aligned_seq(aligned_sequence, sequence_file, seq_positions[child2], alignment_file); - } - else - { - fprintf(edit_seq_file, "%s", aligned_sequence); - edit2alignment(sequence_file, seq_positions, edit_file, edit_positions, child2, number_of_sequences, aligned_sequence, alignment_length, edit_seq_file, offset, alignment_file); - } -} - - - - -// * The file has the follwing format (# and text behind are only comments and not included into the file): -// * 1 # Number of profile. -// * 1 # is DNA or not. -// * 5 # Number of columns in the profile. -// * 4A 1C # In this column are 4 'A' and 1 'C' -// * 3G # In this column are 3 'G' -// * 5A # In this column are 5 'A' -// * 2A 3C # In this column are 2 'A' and 3 'C' -// * 5C # In this column are 5 'C' -// * * # Marks the end of this profile - - - -/** - * \brief Writes a profile to a file. - * - * \param sumup_prf The profile array, not a real profile. - * \param length The length of the profile. - * \param file The FILE object to write the the profile into. - * \param is_dna The type of sequence. - * \param number The number of the profile. - */ -void -write2file(int **sumup_prf, - int length, - FILE *file, - int number, - Fastal_param *param_set) -{ - char *pos2aa = &(param_set->pos2char[0]); - fprintf(file,"%i\n0\n%i\n1\n",number, length ); - int i, j; - int alphabet_size = param_set->alphabet_size; - - i = 0; - int x = 0; - while (i < length) - { - for (j = 0; j < alphabet_size; ++j) - if (sumup_prf[j][i] > 0) - { - if (x) - fprintf(file," %c%i", pos2aa[j],sumup_prf[j][i]); - else - fprintf(file,"%c%i", pos2aa[j],sumup_prf[j][i]); - x = 1; - } -// x = 1; - x = 0; - fprintf(file,"\n"); - ++i; - } - fprintf(file,"*\n"); -} - - - - - - - - - -/** -* main of the fastal algorithm -*/ -int -fastal(int argc, //number of arguments - char **argv) //arguments first = fastal, second = tree -{ - - int test; - for (test = 0; test < argc; ++test) - { - printf("%s\n",argv[test]); - } - - struct fastal_arguments arguments; - - arguments.output_file = "out.aln"; - arguments.tree_file = NULL; - arguments.gep = -1; - arguments.gop = -10; - arguments.method = "fast"; - -// argp_parse (&argp, argc, argv, 0, 0, &arguments); - - Fastal_param *param_set = vcalloc(1,sizeof(Fastal_param)); - fill_parameters(arguments.is_dna, param_set, arguments.method); - param_set->gep = arguments.gep; - param_set->gop = arguments.gop; - - - int alphabet_size = param_set->alphabet_size; - - //sequence file management - char **seq_name; - long *file_positions = NULL; - long **tmp = &file_positions; - int number_of_sequences = make_index_of_file(arguments.sequence_file, tmp); - FILE *seq_file = fopen(arguments.sequence_file,"r"); - - - //edit file management - FILE *edit_file = fopen("edit_tmp","w+"); - long current_edit_pos; - long *edit_positions = vcalloc(number_of_sequences,sizeof(long)); - - - //profile management - Fastal_profile **profiles = vcalloc(3,sizeof(Fastal_profile*)); - initiate_profiles(profiles, param_set); - FILE * prof_file = fopen("prf_tmp","w+"); - long* profile_positions = vcalloc(4,sizeof(long*)); - int max_prof = 4; - int saved_prof = 0; - - - //dynamic programming matrix - double ** dyn_matrix = vcalloc(1,sizeof(double*)); - dyn_matrix[0] = vcalloc(1,sizeof(double)); - int *length1 = vcalloc(1,sizeof(int)); - int *length2 = vcalloc(1,sizeof(int)); - *length1 = 1; - *length2 = 2; - int i; - int **sumup_prf = vcalloc(alphabet_size+1,sizeof(int*)); - for (i = 0; i < alphabet_size+1; ++i) - sumup_prf[i] = vcalloc(1,sizeof(int)); - int *sumup_length = vcalloc(1,sizeof(int)); - *sumup_length = 1; - - - - if (arguments.tree_file == NULL) - { - arguments.tree_file = "HUMAN.tree"; - printf("CONSTRUCT TREE\n"); - make_partTree(arguments.sequence_file, arguments.tree_file, 4, 20); - } - - - printf("CONSTRUCT ALIGNMENT\n"); - //tree file management - FILE *tree_file = fopen(arguments.tree_file,"r"); - const int LINE_LENGTH = 100; - char line[LINE_LENGTH]; - char delims[] = " "; - int node[3]; - char *result = NULL; - int j; - int alignment_length; - - - //memory for sparse dynamic - int *diagonals = vcalloc(3,sizeof(int)); - int *dig_length = vcalloc(1,sizeof(int)); - *dig_length = 3; - int **list = NULL;//vcalloc(1,sizeof(int*)); -// list[0] = vcalloc(7,sizeof(int)); - int *list_length = vcalloc(1,sizeof(int)); - - *list_length = 0; - int ***list_p = vcalloc(1,sizeof(int**)); - - - - //bottom-up traversal - while(fgets(line, LINE_LENGTH, tree_file)!=NULL) - { - //read profiles - node[0] = atoi(strtok(line,delims)); - node[1] = atoi(strtok(NULL,delims)); - node[2] = atoi(strtok(NULL,delims)); - //getting profile of second child - if (node[1] < number_of_sequences) - { - file_pos2profile(seq_file, file_positions[node[1]], profiles[1], node[1], param_set); //profile to save into - } - else - { - profile_file2profile(profiles[1], prof_file, profile_positions[--saved_prof], param_set); - fseek (prof_file , profile_positions[saved_prof] , SEEK_SET); - } - - //getting profile of first child - if (node[0] < number_of_sequences) - { - file_pos2profile(seq_file, file_positions[node[0]], profiles[0], node[0], param_set); //profile to save into - } - else - { - profile_file2profile(profiles[0], prof_file, profile_positions[--saved_prof], param_set); - fseek (prof_file , profile_positions[saved_prof] , SEEK_SET); - } - if (saved_prof == max_prof) - { - max_prof += 5; - profile_positions = vrealloc(profile_positions, max_prof*sizeof(long)); - } - edit_positions[node[2]-number_of_sequences] = ftell(edit_file); - profile_positions[saved_prof] = ftell(prof_file); - ++saved_prof; - if (!strcmp(param_set->method,"nw")) - { - dyn_matrix = resize_dyn_matrix(dyn_matrix, length1, length2, profiles[0]->length+1, profiles[1]->length+1); - alignment_length = prf_nw(profiles[0], profiles[1], dyn_matrix, edit_file, sumup_prf, sumup_length, param_set); - write2file(sumup_prf, alignment_length, prof_file, node[2], param_set); - } - else if (!strcmp(param_set->method, "fast")) - { - char *file_name1 = vtmpnam(NULL); - char *file_name2 = vtmpnam(NULL); - char *seq1 = profile2consensus(profiles[0], file_name1, param_set); - char *seq2 = profile2consensus(profiles[1], file_name2, param_set); - int **diagonals_p = &diagonals; - int num_diagonals = seq_pair2blast_diagonal(file_name1, file_name2, diagonals_p, dig_length, strlen(seq1),strlen(seq2), arguments.is_dna); - diagonals = diagonals_p[0]; - char *p = ¶m_set->pos2char[0]; - list = diagonals2int(diagonals, num_diagonals, seq1, seq2, list_length, param_set);//, profiles[0], profiles[1], p); - alignment_length = list2linked_pair_wise_fastal(profiles[0], profiles[1], param_set, list, *list_length, edit_file, prof_file, node[2]); - int x; - - for (x = 0; x < *list_length; ++x) - { - vfree(list[x]); - } - vfree(list); - list = NULL; - vfree(seq1); - vfree(seq2); - } - } - - //free_memory & close files - vfree(diagonals); - fclose(tree_file); - fclose(prof_file); - free_fastal_profile(profiles[0], alphabet_size); - free_fastal_profile(profiles[1], alphabet_size); - vfree(profiles); - vfree(profile_positions); - free_dyn_matrix(*length1,dyn_matrix); - for (i = 0; i <= alphabet_size; ++i) - { - vfree(sumup_prf[i]); - } - vfree(sumup_prf); - vfree(param_set); - - //bottom-down traversal (edit_files --> alignment) - char file_name[FILENAMELEN]; - sprintf(file_name,arguments.output_file); - - FILE *alignment_file = fopen(file_name, "w"); - FILE *edit_seq_file = fopen("edit_seq.tmp","w+"); - - char *aligned_sequence = vcalloc(alignment_length+3, sizeof(char)); - - - long offset = ftell(edit_seq_file); - for (i = 0; i < alignment_length; ++i) - { - fprintf(edit_seq_file, "X"); - aligned_sequence[i] = 'X'; - } - aligned_sequence[i]= '\n'; - aligned_sequence[i+1]= '\0'; - fprintf(edit_seq_file, "\n"); - offset = (ftell(edit_seq_file) - offset)*-1; - - - edit2alignment(seq_file, file_positions, edit_file, edit_positions, node[2], number_of_sequences, aligned_sequence, alignment_length, edit_seq_file, offset, alignment_file); - - - //free_memory & close files - - vfree(edit_positions); - fclose(edit_file); - fclose(seq_file); - - return 0; -} - - - - -//****************** toolbox *************************** - - -/** -* enlargement of the dynamic programming matrix in case it is to small. -*/ -double** -resize_dyn_matrix(double **dyn_matrix, //the dynamic programming matrix - int *old_length1, //old length of dimension 1 - int *old_length2, //old length of dimension 2 - int length1, //new minimum length of dimension 1 - int length2) //new maximum length of dimension 2 -{ - int i; - if (*old_length1 < length1) - { - dyn_matrix = vrealloc(dyn_matrix,length1*sizeof(double*)); - for (i = *old_length1; i < length1; ++i) - dyn_matrix[i] = vcalloc(*old_length2,sizeof(double)); - *old_length1 = length1; - } - if (*old_length2 < length2) - { - for (i = 0;i<*old_length1; ++i) - dyn_matrix[i] = vrealloc(dyn_matrix[i], length2*sizeof(double)); - *old_length2 = length2; - } - return dyn_matrix; -} - - - -/** -* frees the memory of a dynamic programming matrix -*/ -void -free_dyn_matrix(int length1, //length of first dimension - double **dyn_matrix) //dynamic matrix -{ - int i = 0; - for (; ialphabet_size; - int i,j; - for (i =0; i < 3; ++i) - { - profiles[i] = vcalloc(1,sizeof(Fastal_profile)); - profiles[i]->weight = 1; - profiles[i]->is_leaf = 1; - profiles[i]->prf = vcalloc(alphabet_size, sizeof(int*)); - for (j = 0; j < alphabet_size; ++j) - { - profiles[i]->prf[j] = vcalloc(PROFILE_ENLARGEMENT, sizeof(int)); - } - profiles[i]->allocated_memory = PROFILE_ENLARGEMENT; - } -} - - -/** -* initalises the files where the profiles are temporarly stored. -*/ -void -initiate_profile_files(FILE **profile_files) -{ - char names[10]; - int i = 0; - for (;i < 4; ++i) - { - sprintf(names,"tmp_prf_%i",i); - profile_files[i] = fopen(names,"w+"); - } -} - - - -/** - * frees all memory occupied by the profile - */ -void -free_fastal_profile(Fastal_profile* profile, int alphabet_size) -{ - --alphabet_size; - for (;alphabet_size >= 0; --alphabet_size) - vfree(profile->prf[alphabet_size]); - vfree(profile->prf); -} - - -/** -* initialize the parameters -*/ -void -fill_parameters(int is_dna, Fastal_param *param_set, char *method) -{ - sprintf(param_set->method,"%s",method); - int i; - if (is_dna) - { - param_set->alphabet_size = 10; - char tmp1[] = {'A','C','G','T','N','R','Y','D','M','W'}; - int tmp2[] = { 0, -1, 1, 7, -1, -1, 2, -1, -1, -1, -1, -1, 8, 4, -1, -1, -1, 5, -1, 3, -1, -1, 9, -1, 6, -1}; - for (i = 0; ialphabet_size; ++i) - param_set->pos2char[i] = tmp1[i]; - for (i = 0; i<26; ++i) - param_set->char2pos[i] = tmp2[i]; - param_set->M = read_matrice("dna_idmat"); - } - else - { - param_set->alphabet_size = 24; - char tmp1[] = {'A','C','G','T','F','D','H','I','K','L','M','N','P','Q','R','S','E','V','W','Y','B','J','X','Z'}; - int tmp2[] = { 0, 20, 1, 5, 16, 4, 2, 6, 7, 21, 8, 9, 10, 11, -1, 12, 13, 14, 15, 3, -1, 17, 18,22, 19,23}; - for (i = 0; ialphabet_size; ++i) - param_set->pos2char[i] = tmp1[i]; - for (i = 0; i<26; ++i) - param_set->char2pos[i] = tmp2[i]; - param_set->M = read_matrice("blosum62mt"); - } -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/fastal_lib_header.h b/binaries/src/tcoffee/t_coffee_source/fastal_lib_header.h deleted file mode 100644 index ab60176..0000000 --- a/binaries/src/tcoffee/t_coffee_source/fastal_lib_header.h +++ /dev/null @@ -1,213 +0,0 @@ - - -#define ENLARGEMENT_PER_STEP 50 -#define PROFILE_ENLARGEMENT 550 - -// static char pos2aa[] = {'A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y'}; - - -/** - * \brief Struct to save all informations of a profile. - * - */ -typedef struct -{ - /// Number of sequences in this profile - int num_sequences; - /// number of the profile - int prf_number; - ///0 = combination of two profiles, 1 = profile of a single sequence -> name1 = seq_name - int is_leaf; - ///length of the profile - int length; - ///weight of the sequence - int weight; - ///saves the amount of allocated memory - int allocated_memory; - ///the profile itself [alphabet_size][profile_length] - int **prf; -} -Fastal_profile; - -/** - * \brief Struct to save all parameters for fastal. - * - */ -typedef struct -{ - /// size of alphabet_size - int alphabet_size; - /// converting char2position (for profile) - int char2pos[26]; - /// converting pos2char (for profile) - char pos2char[26]; - /// gap opening costs - int gop; - /// gap extension costs - int gep; - /// nomatch??? - int nomatch; - ///method to align profile - char method[20]; - ///scoring Matrix; - int **M; -} -Fastal_param; - - - -//tree -void generate_random_tree(int number); - - -Fastal_profile* make_profile_of_sequence(char *seq_name, char *sequence, int number); - - - -//Definite use - -//********************* input/output ********************************** -void file2profile(FILE* profile_f, Fastal_profile *profile, int prf_number, Fastal_param *param_set); -void file_pos2profile(FILE *seq_file, long off_set, Fastal_profile *profile, int prf_number, Fastal_param *param_set); -void profile2file(Fastal_profile *profile, FILE* prf_f, Fastal_param *param_set); - -//index -int make_index_of_file(char *file_name, long **result); - - -//********************* pairwise alignment methods ************************ - - //Needleman-Wunsch - int prf_nw(Fastal_profile *profile1, Fastal_profile *profile2, double **prog_matrix, FILE *edit_file_name, int **sumup_prf, int *sumup_length, Fastal_param *param_set); - int nw_matrix2edit_file(double **prog_matrix, Fastal_profile *profile1, Fastal_profile *profile2, FILE *edit_f, int **prf_field, int *field_length, Fastal_param *param_set); - int** sumup_profile(Fastal_profile *profile, int **sumup_prf, Fastal_param *param_set); - void write2file(int **sumup_prf, int length, FILE *file, int number, Fastal_param *param_set); - - - //Sparse dynamic programming - int seq_pair2blast_diagonal(char *seq_file_name1, char *seq_file_name2, int **diagonals, int *dig_length, int l1, int l2, int is_dna); - - - - - - - - -//edit_files 2 alignment - void edit2alignment(FILE *sequence_file, long *seq_positions, FILE *edit_file, long *edit_positions, int node_number, int number_of_sequences, char *aligned_sequence, int alignment_length, FILE *edit_seq_file, int offset, FILE* alignment_file); -void edit_seq2aligned_seq(char *aligned_sequence, FILE *sequence_file, long sequence_position, FILE *alignment_file); - - -//main -int fastal(int argc, char **argv); - -//toolbox -void initiate_profile_files(FILE **profile_files); -void initiate_profiles(Fastal_profile **profiles, Fastal_param *param_set); -void free_fastal_profile(Fastal_profile *profile, int alphabet_size); -double **resize_dyn_matrix(double **dyn_matrix, int *old_length1, int *old_length2, int length1, int length2); -void free_dyn_matrix(int length1, double **dyn_matrix); -void fill_parameters(int is_dna, Fastal_param *param_set, char *method); - -struct fastal_arguments -{ -// char *args[2]; - char *method; - char *sequence_file; - char *tree_file; - char *output_file; - int is_dna; - int gop; - int gep; -}; - -// static char fastal_doc[] = "Fastal -- a program to align sequences with little memory"; -// // static char args_doc[] = "ARG1 ARG2"; -// static void* fastal_options[]= -// { -// {"in", 'i', "FILE", 0, "Sequence file (FASTA format)" }, -// {"output", 'o', "FILE", 0, "Output to FILE" }, -// {"tree", 't', "FILE", 0, "Tree file" }, -// {"method", 'm', "METHOD", 0, "Methods:\n fast (sparse dynamic),\n nw (Needleman-Wunsch) "}, -// {"is_dna", 'd', 0, 0, "Sequences are DNA"}, -// {"is_aa", 'a', 0, 0, "Sequences are AminoAcids"}, -// {"gop", 'g', "VALUE", 0, "Gap opening costs"}, -// {"gep", 'e', "VALUE", 0, "Gap extension costs"}, -// { 0 } -// }; - - - - - -/* -void -fastal_parse_opt (int key, char *arg) -{ -// struct fastal_arguments *arguments = state->input; - - switch (key) - { - case 'o': - arguments->output_file = arg; - break; - case 't': - arguments->tree_file = arg; - break; - case 'i': - arguments->sequence_file = arg; - break; - case 'm': - arguments->method = arg; - break; - case 'g': - arguments->gop = atoi(arg); - break; - case 'e': - arguments->gep = atoi(arg); - break; - case 'd': - arguments->is_dna = 1; - break; - case 'a': - arguments->is_dna = 0; - break; - default: - printf("UNKNOWN OPTION key"); - exit(1); - } - return 0; -}*/ -// -// -// static struct argp argp = { fastal_options, fastal_parse_opt,/* fastal_args_doc,*/ fastal_doc}; -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/fsa_dp.c b/binaries/src/tcoffee/t_coffee_source/fsa_dp.c deleted file mode 100644 index c51d5ec..0000000 --- a/binaries/src/tcoffee/t_coffee_source/fsa_dp.c +++ /dev/null @@ -1,2541 +0,0 @@ -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" - -#define hmm_add(x,y) ((x==UNDEFINED || y==UNDEFINED)?UNDEFINED:(x+y)) -#define MAX_EMISSION 256 - -/*********************************************************************************/ -/* */ -/* */ -/* Procons dp */ -/* */ -/* */ -/*********************************************************************************/ -char alphabetDefault[] = "ARNDCQEGHILKMFPSTWYV"; -double emitPairsDefault[20][20] = { - {0.02373072f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00244502f, 0.01775118f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00210228f, 0.00207782f, 0.01281864f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00223549f, 0.00161657f, 0.00353540f, 0.01911178f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00145515f, 0.00044701f, 0.00042479f, 0.00036798f, 0.01013470f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00219102f, 0.00253532f, 0.00158223f, 0.00176784f, 0.00032102f, 0.00756604f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00332218f, 0.00268865f, 0.00224738f, 0.00496800f, 0.00037956f, 0.00345128f, 0.01676565f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00597898f, 0.00194865f, 0.00288882f, 0.00235249f, 0.00071206f, 0.00142432f, 0.00214860f, 0.04062876f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00114353f, 0.00132105f, 0.00141205f, 0.00097077f, 0.00026421f, 0.00113901f, 0.00131767f, 0.00103704f, 0.00867996f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00318853f, 0.00138145f, 0.00104273f, 0.00105355f, 0.00094040f, 0.00100883f, 0.00124207f, 0.00142520f, 0.00059716f, 0.01778263f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00449576f, 0.00246811f, 0.00160275f, 0.00161966f, 0.00138494f, 0.00180553f, 0.00222063f, 0.00212853f, 0.00111754f, 0.01071834f, 0.03583921f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00331693f, 0.00595650f, 0.00257310f, 0.00252518f, 0.00046951f, 0.00312308f, 0.00428420f, 0.00259311f, 0.00121376f, 0.00157852f, 0.00259626f, 0.01612228f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00148878f, 0.00076734f, 0.00063401f, 0.00047808f, 0.00037421f, 0.00075546f, 0.00076105f, 0.00066504f, 0.00042237f, 0.00224097f, 0.00461939f, 0.00096120f, 0.00409522f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00165004f, 0.00090768f, 0.00084658f, 0.00069041f, 0.00052274f, 0.00059248f, 0.00078814f, 0.00115204f, 0.00072545f, 0.00279948f, 0.00533369f, 0.00087222f, 0.00116111f, 0.01661038f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00230618f, 0.00106268f, 0.00100282f, 0.00125381f, 0.00034766f, 0.00090111f, 0.00151550f, 0.00155601f, 0.00049078f, 0.00103767f, 0.00157310f, 0.00154836f, 0.00046718f, 0.00060701f, 0.01846071f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00631752f, 0.00224540f, 0.00301397f, 0.00285226f, 0.00094867f, 0.00191155f, 0.00293898f, 0.00381962f, 0.00116422f, 0.00173565f, 0.00250962f, 0.00312633f, 0.00087787f, 0.00119036f, 0.00180037f, 0.01346609f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0.00389995f, 0.00186053f, 0.00220144f, 0.00180488f, 0.00073798f, 0.00154526f, 0.00216760f, 0.00214841f, 0.00077747f, 0.00248968f, 0.00302273f, 0.00250862f, 0.00093371f, 0.00107595f, 0.00147982f, 0.00487295f, 0.01299436f, 0.0f, 0.0f, 0.0f}, - {0.00039119f, 0.00029139f, 0.00021006f, 0.00016015f, 0.00010666f, 0.00020592f, 0.00023815f, 0.00038786f, 0.00019097f, 0.00039549f, 0.00076736f, 0.00028448f, 0.00016253f, 0.00085751f, 0.00015674f, 0.00026525f, 0.00024961f, 0.00563625f, 0.0f, 0.0f}, - {0.00131840f, 0.00099430f, 0.00074960f, 0.00066005f, 0.00036626f, 0.00070192f, 0.00092548f, 0.00089301f, 0.00131038f, 0.00127857f, 0.00219713f, 0.00100817f, 0.00054105f, 0.00368739f, 0.00047608f, 0.00102648f, 0.00094759f, 0.00069226f, 0.00999315f, 0.0f}, - {0.00533241f, 0.00169359f, 0.00136609f, 0.00127915f, 0.00119152f, 0.00132844f, 0.00178697f, 0.00194579f, 0.00071553f, 0.01117956f, 0.00914460f, 0.00210897f, 0.00197461f, 0.00256159f, 0.00135781f, 0.00241601f, 0.00343452f, 0.00038538f, 0.00148001f, 0.02075171f} -}; - -static void DisplayMatState ( MatState *S, char *s); - - - - - - -void check_viterbiL ( Alignment *A,int *ns, int **ls, Constraint_list *CL); -MatState *viterbi2path2 ( double ***Sc, int ***St, Hmm *H, MatState *S, MatState *E); -void testfunc ( MatState *S, char *s); - -#ifdef IN_PGROGRESS -/*********************************************************************************/ -/* */ -/* */ -/* MSA Analyzer */ -/* */ -/* */ -/*********************************************************************************/ -Alignment * analyze_alignment ( Alignment *A) -{ - evaluate_alignment (A); - H=define_msa_model (-100); - M=seq_viterbi_hmm (A->seq_al[0], H); - path=seq_viterbi2path ( seq, H, M); -} - - -Hmm* define_msa_model(double penalty) -{ - Hmm *H; - double freeT=0; - int n=0; - HmmState *S; - - - H=declare_hmm(2); - H->freeT=freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - /*define START*/ - S=H->S[n]; - sprintf (S->name, "START"); S->state=n; - - S->DI=0; - S->DJ=0; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "C") ;(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "W");(S->T[S->nT])->tr=freeT ;S->nT++; - n++; - /*define END*/ - S=H->S[n]; - sprintf (S->name, "END"); S->state=n; - S->DI=0; - S->DJ=0; - S->em=freeT; - n++; - - /*define Correct*/ - S=H->S[n]; - sprintf (S->name, "C"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=H->forbiden; - S->em_func=em_correct_msa; - - sprintf ( (S->T[S->nT])->name, "C") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "W");(S->T[S->nT])->tr=penalty ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - n++; - - /*define Wrong*/ - S=H->S[n]; - sprintf (S->name, "INSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=H->forbiden; - S->em_func=em_wrong_msa; - sprintf ( (S->T[S->nT])->name, "C") ; (S->T[S->nT])->tr=penalty;S->nT++; - sprintf ( (S->T[S->nT])->name, "W"); (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=-gop;S->nT++; - n++; - - /*define LInsert*/ - S=H->S[n]; - sprintf (S->name, "LINSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=lgep; - - sprintf ( (S->T[S->nT])->name, "INSERT") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LINSERT");(S->T[S->nT])->tr=freeT;S->nT++; - n++; - - H=bound_hmm ( H); - return H; -} -#endif -/*********************************************************************************/ -/* */ -/* */ -/* simple HMM: Viterbi */ -/* */ -/* */ -/*********************************************************************************/ -double pavie_em_func (Hmm*H, HmmState *S, int v); -Hmm* define_full_model(int nstate,char **state_list, char *model_name,Generic_em_func evaluation_func ); -char **produce_state_name (int nstate,char **list, char *model_name, Hmm* H); -double** seq_viterbi_hmm (char *seq, Hmm *H); -int * seq_viterbi2path (char *s, Hmm *H, double **M); -double analyze_sequence ( char *seq, Hmm*H); - -double pavie_emission (Hmm*H, HmmState *S, int v) -{ - char *n; - - - n=S->name; - - if ( v==n[0] || ( v=='*' && n[0]=='E')) return H->freeT; - return H->forbiden; -} -Hmm* define_full_model(int nstate, char **list, char *model_name, Generic_em_func emission_function) -{ - /*list: a list of the state names: does not include START or END*/ - /*model_name: a string that will be appended to the names in list*/ - - Hmm *H; - int a,n; - HmmState *S; - - - H=declare_hmm(nstate+2); - H->freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - list=produce_state_name (nstate,list, model_name, H); - nstate+=2; - - for (n=0; nS[n]; - S->state=n; - sprintf ( S->name, "%s", list[n]); - S->em_func2=emission_function; - if (n==H->end || n==H->start){S->DI=0;S->DJ=0;} - else S->DI=1;S->DJ=0; - - /*Emmissions*/ - S->em_func2=emission_function; - for (a=0; a< MAX_EMISSION; a++)S->em2[a]=H->freeT; - - for (a=0; aend; a++) - { - if (a!=H->start && !(n==H->start && a==H->end) ) - { - sprintf ( (S->T[S->nT])->name, "%s", list[a]); - (S->T[S->nT])->tr=H->freeT; - S->nT++; - } - } - } - return H; -} - -char **produce_state_name (int nstate,char **list, char *model_name, Hmm* H) -{ - int a,b,c; - char **new_list; - nstate+=2; - - new_list=declare_char ( nstate, 100); - for ( a=0, b=0, c=0; a< nstate; a++) - { - if ( a==H->start)sprintf ( new_list[a], "START"); - else if ( a==H->end)sprintf ( new_list[a], "END"); - else if ( list==NULL){sprintf ( new_list[a], "%c%s", 'a'+b, (model_name)?model_name:"");b++;} - else {sprintf ( new_list[a], "%c%s", list[a][c], (model_name)?model_name:"");c++;} - } - return new_list; -} - -int seq_viterbi_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL) -{ - ungap(A->seq_al[0]); - analyze_sequence (A->seq_al[0], NULL); - myexit (EXIT_FAILURE); - return 1; -} -double analyze_sequence ( char *seq, Hmm *H) -{ - - double **M; - int *path; - - if ( H==NULL) - { - H=define_full_model(5, NULL,"_first", pavie_emission); - H=bound_hmm(H); - DisplayHmm (H); - } - M=seq_viterbi_hmm (seq, H); - path=seq_viterbi2path (seq, H, M); - return M[H->end][strlen (seq)]; -} - - -double** seq_viterbi_hmm (char *seq, Hmm *H) -{ - /*Given a model H and a sequence seq*/ - double **M; - double e, v, max; - int i,pi, bestk, s, k, l1; - HmmState *S1, *S2; - - - l1=strlen (seq); - M=declare_double (H->nS*2,l1+2); - - /*Handle the start*/ - M[H->start][0]=0; - for ( i=0; i<=l1; i++) - { - for ( s=0; s< H->nS; s++) - { - S1=H->S[s]; - pi=i-S1->DI; - max=H->forbiden; - bestk=H->forbiden; - if ( pi<0){M[s][i]=H->forbiden;}/*Boundary*/ - else - { - if (pi==0) {max=H->T[(int)H->start][s];bestk=H->start;}/*Start*/ - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - if ( S2->state==H->start || S2->state==H->end)continue; - v=hmm_add((M[S2->state][pi]),(H->T[S2->state][S1->state])); - if ( v!=H->forbiden && (max==H->forbiden || v>max)){max=v;bestk=S2->state;} - } - } - if (S1->em2)e=S1->em2[(int)seq[pi]]; - else e=S1->em_func2(H,S1, (int)seq[pi]); - - e=hmm_add (e,max); - - M[s][i]=e; - M[s+H->nS][i]=bestk; - } - } - } - /*Terminate viterbi: connect the path to the END state*/ - max=UNDEFINED; - bestk=UNDEFINED; - for (k=0; k< H->nS; k++) - { - if (k==H->start || k==H->end); - else - { - v=(M[k][l1]==H->forbiden || H->T[k][H->end]==H->forbiden)?H->forbiden:M[k][l1]+H->T[k][H->end]; - if ( max==H->forbiden || v>max){bestk=k;max=v;} - } - } - M[H->end][l1]=max; - M[H->nS+H->end][l1]=bestk; - return M; -} - -int * seq_viterbi2path (char *s, Hmm *H, double **M) -{ - int i,l,l1; - int *path; - HmmState *S1; - int cs; - - l1=strlen (s); - path=vcalloc (l1+1, sizeof (int)); - i=l1; - l=0; - cs=M[H->nS+H->end][i]; - - while (i>0) - { - - S1=H->S[cs]; - path[l++]=cs; - - cs=M[H->nS+cs][i]; - i-=S1->DI; - /*fprintf ( stderr, "%d", cs);*/ - } - invert_list_int (path, l); - path[l++]=H->forbiden; - - return path; -} - -/*********************************************************************************/ -/* */ -/* */ -/* pairHMM: Viterbi */ -/* */ -/* */ -/*********************************************************************************/ -Hmm* define_mnm_model(Constraint_list *CL); -int viterbi_pair_wise_OLD (Alignment *A,int*ns, int **ls,Constraint_list *CL) -{ - int l1, l2, a; - double ***M; - int *path; - Hmm * H; - - A->pos=aln2pos_simple( A, -1, ns, ls); - - // H=define_mnm_model (CL); - H=define_two_mat_model (CL); - - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - M=viterbi_hmm (A, ns, ls, H, CL); - path=viterbi2path (l1,l2, H,M); - A=viterbipath2aln (A,ns,ls,path, H); - A->score=A->score_aln=M[H->end][l1][l2]; - for ( a=0; a< H->nS*2; a++)free_double (M[a], -1); - vfree (M); - free_int (A->pos, -1); - A->pos=NULL; - - free_Hmm (H); - vfree (path); - - return A->score_aln; -} - -Alignment * viterbipath2aln (Alignment *A, int *ns,int **ls,int *tb, Hmm *H) -{ - char **aln; - char *char_buf; - int a, b, c, len, ch; - HmmState *S; - int l[2]; - - len=0;while (tb[len]!=H->forbiden)len++; - - if ( A->declared_len<=len)A=realloc_aln2 ( A,A->max_n_seq,2*len); - aln=A->seq_al; - - char_buf=vcalloc (len+1, sizeof (char)); - l[0]=strlen ( A->seq_al[ls[0][0]]); - l[1]=strlen ( A->seq_al[ls[1][0]]); - - for ( c=0; c< 2; c++) - for ( a=0; a< ns[c]; a++) - { - for (ch=0, b=0; bS[tb[b]]; - if ( (c==0 && S->DI)|| (c==1 && S->DJ) ) - char_buf[b]=aln[ls[c][a]][ch++]; - else - char_buf[b]='-'; - } - char_buf[b]='\0'; - sprintf (aln[ls[c][a]],"%s", char_buf); - if ( l[c]!=ch){fprintf (stderr, "\nERROR: Wrong Size Of Alignmnent (Real %d, Observed %d)[FATAL:%s]",l[c], ch, PROGRAM);} - } - A->len_aln=len; - A->nseq=ns[0]+ns[1]; - - vfree(char_buf); - return A; -} - -double*** viterbi_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL) -{ - double ***M; - double e, v, max; - int a, i,pi, bestk,j,pj, s, k, l1, l2; - HmmState *S1, *S2; - - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - - M=vcalloc (H->nS*2, sizeof (double**)); - for ( a=0; anS*2; a++)M[a]=declare_double (l1+2, l2+2); - - /*Handle the start*/ - - M[H->start][0][0]=0; - for ( i=0; i<=l1; i++) - for ( j=0; j<=l2; j++) - { - for ( s=0; s< H->nS; s++) - { - S1=H->S[s]; - pi=i-S1->DI; - pj=j-S1->DJ; - max=H->forbiden; - bestk=H->forbiden; - if ( pi<0 ||pj<0){M[s][i][j]=H->forbiden;}/*Boundary*/ - else - { - if (pi+pj==0) {max=H->T[H->start][s];bestk=H->start;}/*Start*/ - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - if ( S2->state==H->start || S2->state==H->end)continue; - v=(M[S2->state][pi][pj]==H->forbiden)?H->forbiden:(M[S2->state][pi][pj]+H->T[S2->state][S1->state]); - if ( v!=H->forbiden && (max==H->forbiden || v>max)){max=v;bestk=S2->state;} - } - } - - e=(S1->em==H->forbiden)?S1->em_func (A, A->pos, ns[0], ls[0],i-1, A->pos,ns[1], ls[1], j-1, CL):S1->em; - e=(max==H->forbiden || e==H->forbiden)?H->forbiden:e+max; - - M[s][i][j]=e; - M[s+H->nS][i][j]=bestk; - } - } - } - - /*Terminate viterbi: connect the path to the END state*/ - max=UNDEFINED; - bestk=UNDEFINED; - for (k=0; k< H->nS; k++) - { - if (k==H->start || k==H->end); - else - { - v=(M[k][l1][l2]==H->forbiden || H->T[k][H->end]==H->forbiden)?H->forbiden:M[k][l1][l2]+H->T[k][H->end]; - if ( max==H->forbiden || v>max){bestk=k;max=v;} - } - } - M[H->end][l1][l2]=max; - M[H->nS+H->end][l1][l2]=bestk; - - return M; -} - -/*********************************************************************************/ -/* */ -/* */ -/* HMM: Decode/Traceback */ -/* */ -/* */ -/*********************************************************************************/ -int * traceback (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list) - -{ - int *path; - int l=0; - MatState *N; - int l1, l2; - - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - path=vcalloc ( l1+l2+1, sizeof (int)); - - while ( S->st!=H->end) - { - DisplayMatState (S, "\n\tTraceback"); - N=S->n; - if ( N && S && (((N->i-S->i)>1) ||((N->j-S->j)>1))) - { - RviterbiD_hmm (A,ns,ls,H,CL,S,N,seg_list); - N=S->n; - } - - path[l++]=S->st; - ManageMatState (FREE,S); - S=N; - } - - path[l]=H->forbiden; - return path; -} - -int * viterbi2path (int l1,int l2, Hmm *H, double ***M) -{ - int i, j,l; - int *path; - HmmState *S1; - int cs; - - l=0; - path=vcalloc (l1+l2+1, sizeof (int)); - i=l1;j=l2; - l=0; - cs=M[H->nS+H->end][i][j]; - - while (i>0|| j>0) - { - - S1=H->S[cs]; - path[l++]=cs; - - cs=M[H->nS+cs][i][j]; - i-=S1->DI; - j-=S1->DJ; - /*fprintf ( stderr, "%d", cs);*/ - } - invert_list_int (path, l); - path[l++]=H->forbiden; - - return path; -} - -/*********************************************************************************/ -/* */ -/* */ -/* HMM Viterbi Linear */ -/* */ -/* */ -/*********************************************************************************/ - - -int viterbiL_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL) -{ - int l1, l2; - int *path; - Hmm * H; - MatState *Start; - MatState *End; - - A->pos=aln2pos_simple( A, -1, ns, ls); - Start=ManageMatState ( DECLARE, NULL); - End=ManageMatState ( DECLARE, NULL); - H=define_simple_model (CL); - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - - - - Start->i=0 ;Start->j=0 ; Start->st=H->start;Start->sc=0; - End->i =l1; End->j=l2; End ->st=H->end; - Start=RviterbiL_hmm (A, ns, ls, H, CL, Start,End); - path=traceback (A, ns, ls, H, CL, Start,NULL, NULL); - - A=viterbipath2aln (A,ns,ls,path, H); - - free_Hmm (H); - free_int (A->pos, -1); - A->pos=NULL; - - return A->score_aln; -} - - -MatState* RviterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E) -{ - MatState *MS, *ME; - MS=S; - ME=E; - - viterbiL_hmm (A,ns, ls,H, CL, S, E); - - - if ( S->n==E)return S; - if ( E->sc==H->forbiden) - { - DisplayHmm (H); - fprintf ( stderr, "\nERROR: The Requested Model (Cf Above) Cannot Produce the Pair-Alignment\nYou must allow extra possible transitions\n[FATAL:%s]", PROGRAM); - myexit ( EXIT_FAILURE); - } - E=S->n; - - while (S!=ME) - { - int d1, d2, align; - d1=MinDeltaMatState(S,E); - d2=MaxDeltaMatState(S,E); - align=((d1==1 && d2==1) || ( d1==0))?0:1; - if (align)RviterbiL_hmm (A,ns, ls,H, CL,S,E); - S=E; - E=S->n; - } - return MS; -} - -#define Dim(i,j) (i*LenJ+j) -MatState* viterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S,MatState *E) -{ - int current, previous,row, prow; - double v; - int a,i,j,pi,pj, s, k; - int start_i, start_j, end_i, end_j, l1, l2; - HmmState *S1, *S2; - MatState *CC, *PCC,*tS, *tE, *mark=NULL; - int midpoint; - - - static MatState ***M; - - - static int LenJ, LenI; - int MaxDelta=50, DeltaI, DeltaJ; - - - - DisplayMatState (S, "\n\tS"); - DisplayMatState (E, "\n\tE"); - - - if ( A==NULL) - { - for ( a=0; a<2; a++)memset(M[a],0,LenJ*LenI*sizeof (MatState*)); - free_arrayN((void **)M, 3);M=NULL; - ManageMatState ( FREE_ALL, NULL); - return NULL; - } - - - if ( MatStateAreIdentical ( S, E))return NULL; - l1=strlen (A->seq_al[ls[0][0]]);l2=strlen (A->seq_al[ls[1][0]]); - - midpoint=S->i+((E->i-S->i)/2); - DeltaI=E->i-S->i; - DeltaJ=E->j-S->j; - - start_i=S->i;end_i=E->i;start_j=S->j;end_j=E->j; - current=0;previous=1; - - - if ( !M) - { - LenI=l2+1; - LenJ=H->nS; - M=declare_arrayN(3, sizeof ( MatState),2,LenI*LenJ,0); - } - - - /*MAKE THE VITERBI FROM S(tart) to E(nd)*/ - mark=ManageMatState ( MARK, mark); - for (i=start_i; i<=end_i; i++) - { - row=current; - for ( j=start_j; j<=end_j; j++) - { - DeltaJ=((FABS(j-i))nS-1;s>=0; s--) - { - S1=H->S[s];pi=i-S1->DI;prow=S1->DI;pj=j-S1->DJ; - - CC=M[row][Dim(j,s)]=CopyMatState(NULL, M[row][Dim(j,s)]); - CC->i=i; CC->j=j; CC->st=s;PCC=NULL; - - if (i==start_i && j==start_j && s==S->st){CC=CopyMatState(S,CC);} - else if ( i==end_i && j==end_j && E->st!=H->end && s!=E->st)CC->sc=H->forbiden; - else if ( pisc=H->forbiden;} - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - PCC=M[prow][Dim((j-S1->DJ),(S2->state))]; - - if ( !PCC)PCC=NULL; - else if ( pi+pj!=0 && S2->state==H->start); - else if ( !(pi==l1 && pj==l2) && s==H->end); - else - { - - v=hmm_add(CC->sc,H->T[PCC->st][CC->st]); - - v=lu_RviterbiD_hmm(A,ns, ls, H, CL,PCC,CC, NULL); - if ( v!=H->forbiden && (CC->sc==H->forbiden || v> CC->sc)){CC->sc=v; CC->pst=S2->state;CC->p=PCC;} - } - } - } - if (CC->sc==H->forbiden); - else if (i==midpoint || DeltaI<=MaxDelta||DeltaJ<=MaxDelta ||(i==start_i && j==start_j && s==S->st) ) - { - CC->m=(CC->p)?(CC->p)->m:NULL; - PCC=CopyMatState(CC,NULL); - PCC->m=CC->m;CC->m=PCC; - } - else CC->m=(CC->p)?(CC->p)->m:NULL; - } - } - prow=previous; - for ( j=start_j; j<=end_j && i!=end_i; j++) - { - for ( s=H->nS-1;s>=0; s--) - { - - CC=(M[prow][Dim(j,s)]);M[prow][Dim(j,s)]=M[row][Dim(j,s)];M[row][Dim(j,s)]=CC; - if (M[prow][Dim(j,s)]) M[row ][Dim(j,s)]=CopyMatState ( M[prow][Dim(j,s)], M[row][Dim(j,s)]); - - } - } - - } - - mark=ManageMatState ( MARK,mark); - row=current; - - - if ( E->st==H->end || E->st==H->forbiden){E=CopyMatState ((M[row][Dim(end_j,E->st)]),E);} - - - - - PCC=CopyMatState (M[row][Dim(end_j,E->st)], NULL); - - if ( MatStateAreIdentical(PCC,PCC->m))PCC=PCC->m; - tS=tE=PCC; - while (PCC->m) - { - tS=CopyMatState (PCC->m,NULL); tS->n=PCC; PCC->p=tS;PCC=tS; - } - - if (tS==tE); - else - { - S->n=tS->n; (S->n)->p=S; - E->p=tE->p; (E->p)->n=E; - } - for ( a=0; a<2; a++)memset(M[a],0,LenJ*LenI*sizeof (MatState*)); - ManageMatState ( FREE_MARK,mark); - - - while (S && S->p!=E){S->m=NULL;S=S->n;}/*Clean the memory of the rturned Cells*/ - return NULL; -} - -/*********************************************************************************/ -/* */ -/* */ -/* HMM Viterbi Diagonals */ -/* */ -/* */ -/*********************************************************************************/ -int viterbiD_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL) -{ - int l1, l2; - int *path; - Hmm * H; - MatState *Start; - MatState *End; - int **seg_list; - int a, b, c; - int main_i; - int main_j; - - - A->pos=aln2pos_simple( A, -1, ns, ls); - - Start=ManageMatState ( DECLARE, NULL); - End=ManageMatState ( DECLARE, NULL); - H=define_simple_model (CL); - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - - main_i=MAX(1,(l2-l1)+1); - main_j=MAX(1,(l1-l2)+1); - - seg_list=declare_arrayN(2, sizeof (int), l1+l2+3, 3); - seg_list[0][0]=DIAGONALS; - - - c=1; - for ( b=1,a=l1; a>= 1; a--) - { - if (a<50 || (b==main_i && a==main_j)) - { - seg_list[c][0]=a; - seg_list[c][1]=b; - seg_list[c][2]=MIN((l1-a), (l2-b)); - c++; - } - } - - - for ( b=2,a=1; b<= l2; b++, c++) - { - if (b<50 || (b==main_i && a==main_j)) - { - seg_list[c][0]=a; - seg_list[c][1]=b; - seg_list[c][2]=MIN((l1-a), (l2-b)); - } - } - - - seg_list[c][0]=FORBIDEN; - - Start->i=0 ;Start->j=0 ; Start->st=H->start;Start->sc=0; - End->i =l1; End->j=l2; End ->st=H->end; - Start=RviterbiD_hmm (A, ns, ls, H, CL, Start,End,seg_list); - - - path=traceback (A, ns, ls, H, CL, Start,NULL, NULL); - - - - A=viterbipath2aln (A,ns,ls,path, H); - - viterbiD_hmm (NULL, ns, ls, H, CL, Start,End, seg_list); - free_Hmm (H); - free_int (A->pos, -1); - free_arrayN((void **)seg_list, 2); - - A->pos=NULL; - return A->score_aln; -} - - -double lu_RviterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list) -{ - HmmState *S1; - double sc, sc2,e, t; - static MatState *cS=NULL, *cE=NULL; - double min, max; - max=MAX((E->i-S->i), (E->j-S->j)); - min=MIN((E->i-S->i), (E->j-S->j)); - - - if ( S->sc==H->forbiden) return H->forbiden; - else if (min==0) - { - e=hmm_add(S->sc,H->T[S->st][E->st]); - if ( H->T[E->st][E->st]!=H->forbiden)e=hmm_add(e, (max-1)*H->T[E->st][E->st]); - if ( (H->S[E->st])->em!=H->forbiden) e=hmm_add(e, max *(H->S[E->st])->em ); - return e; - } - else if ( min>0 && max>1) - { - - fprintf ( stderr, "\nWarning: Disjoined Diagonals"); - DisplayMatState (S, "\n\tS"); - DisplayMatState (E, "\n\tE"); - - - cS=CopyMatState ( S,cS); - cE=CopyMatState ( E,cE); - cE->sc=H->forbiden; - viterbiD_hmm (A,ns,ls, H,CL,cS, cE, NULL); - sc2=cE->sc; - - return sc2; - } - else - { - S1=H->S[E->st]; - t=H->T[S->st][E->st]; - e=(S1->em==H->forbiden)?S1->em_func (A, A->pos, ns[0], ls[0],E->i-1, A->pos,ns[1], ls[1], E->j-1, CL):S1->em; - sc=hmm_add(S->sc,t); - sc=hmm_add(sc,e); - return sc; - } - return H->forbiden; -} - - -MatState* RviterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list) -{ - MatState *MS, *ME; - MS=S; - ME=E; - - viterbiD_hmm (A,ns, ls,H, CL, S, E, seg_list); - - - if ( S->n==E)return S; - if ( E->sc==H->forbiden) - { - DisplayHmm (H); - fprintf ( stderr, "\nERROR: The Requested Model (Cf Above) Cannot Produce the Pair-Alignment\nYou must allow extra possible transitions\n[FATAL:%s]", PROGRAM); - myexit ( EXIT_FAILURE); - } - E=S->n; - - while (S!=ME) - { - int d1, d2, align; - d1=MinDeltaMatState(S,E); - d2=MaxDeltaMatState(S,E); - align=((d1==1 && d2==1) || ( d1==0))?0:1; - if (align)RviterbiD_hmm (A,ns, ls,H, CL,S,E, seg_list); - S=E; - E=S->n; - } - return MS; -} - -#define Dim(i,j) (i*LenJ+j) -MatState* viterbiD_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S,MatState *E, int **seg_list) -{ - int current, previous,row, prow; - double v; - int a,b,i,j,pi,pj, s, k; - int start_i, start_j, end_i, end_j, l1, l2; - HmmState *S1, *S2; - MatState *CC, *PCC,*tS, *tE, *mark=NULL; - int midpoint; - - int dj; - int dc; - int *jlist=NULL; - static int **main_jlist; - static MatState ***M; - static int *toclean; - int ntoclean; - static int LenJ, LenI; - int MaxDelta=50, DeltaI, DeltaJ; - int mode; - - DisplayMatState (S, "\n\tS"); - DisplayMatState (E, "\n\tE"); - - - if ( A==NULL) - { - free_arrayN((void **)main_jlist, 2);main_jlist=NULL; - - for ( a=0; a<2; a++)memset(M[a],0,LenJ*LenI*sizeof (MatState*)); - free_arrayN((void **)M, 3);M=NULL; - vfree (toclean); - ManageMatState ( FREE_ALL, NULL); - return NULL; - } - - - if ( MatStateAreIdentical ( S, E))return NULL; - l1=strlen (A->seq_al[ls[0][0]]);l2=strlen (A->seq_al[ls[1][0]]); - - midpoint=S->i+((E->i-S->i)/2); - DeltaI=E->i-S->i; - - - start_i=S->i;end_i=E->i;start_j=S->j;end_j=E->j; - current=0;previous=1; - - - if ( !M) - { - LenI=l2+1; - LenJ=H->nS; - M=declare_arrayN(3, sizeof ( MatState),2,LenI*LenJ,0); - toclean=vcalloc ( LenI*LenJ, sizeof (int)); - } - - if ( !main_jlist)main_jlist= seglist2table(seg_list, l1, l2); - - - /*MAKE THE VITERBI FROM S(tart) to E(nd)*/ - mark=ManageMatState ( MARK, mark); - mode=(!seg_list)?ALL:seg_list[0][0]; - - for (ntoclean=0,i=start_i; i<=end_i; i++) - { - row=current; - - if ( mode==ALL)jlist=main_jlist[0]; - else if ( mode==DIAGONALS)jlist=(i==0)?main_jlist[0]:main_jlist[1]; - else if ( mode==SEGMENTS) jlist=main_jlist[i+2]; - - - for ( dj=1; dj<=jlist[0]; dj++) - { - DeltaJ=((FABS(dj-i))end_j)continue; - for ( s=H->nS-1;s>=0; s--) - { - S1=H->S[s];pi=i-S1->DI;prow=S1->DI; - - if ( S1->DI && S1->DJ){pj=j-S1->DJ;} - else if ( !S1->DJ)pj=j; - else if ( dj>1)pj=jlist[dj-S1->DJ]+dc; - else pj=-1; - - if (!M[row][Dim(j,s)])toclean[ntoclean]=Dim(j,s); - - CC=M[row][Dim(j,s)]=CopyMatState(NULL, M[row][Dim(j,s)]); - CC->i=i; CC->j=j; CC->st=s;PCC=NULL; - - if (i==start_i && j==start_j && s==S->st){CC=CopyMatState(S,CC);} - else if ( i==end_i && j==end_j && E->st!=H->end && s!=E->st)CC->sc=H->forbiden; - else if ( pisc=H->forbiden;} - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - - if ( S1->DI && S1->DJ)PCC=M[prow][Dim((j-S1->DJ),(S2->state))]; - else PCC=M[prow][Dim((jlist[dj-S1->DJ]+dc),(S2->state))]; - - if ( !PCC)PCC=NULL; - else if ( pi+pj!=0 && S2->state==H->start); - else if ( !(pi==l1 && pj==l2) && s==H->end); - else - { - v=lu_RviterbiD_hmm(A,ns, ls, H, CL,PCC,CC, NULL); - if ( v!=H->forbiden && (CC->sc==H->forbiden || v> CC->sc)){CC->sc=v; CC->pst=S2->state;CC->p=PCC;} - } - } - } - if (CC->sc==H->forbiden); - else if (i==midpoint || DeltaI<=MaxDelta||DeltaJ<=MaxDelta ||(i==start_i && j==start_j && s==S->st) ) - { - CC->m=(CC->p)?(CC->p)->m:NULL; - PCC=CopyMatState(CC,NULL); - PCC->m=CC->m;CC->m=PCC; - } - else CC->m=(CC->p)?(CC->p)->m:NULL; - } - } - prow=previous; - for ( dj=1; dj<=jlist[0] && i!=end_i; dj++) - { - dc=(mode==DIAGONALS && dj!=1)?i:0; - j=jlist[dj]+dc; - if ( jend_j)continue; - - for ( s=H->nS-1;s>=0; s--) - { - - CC=(M[prow][Dim(j,s)]);M[prow][Dim(j,s)]=M[row][Dim(j,s)];M[row][Dim(j,s)]=CC; - if (!M[row][Dim(j,s)])toclean[ntoclean++]=Dim(j,s); - if (M[prow][Dim(j,s)]) M[row ][Dim(j,s)]=CopyMatState ( M[prow][Dim(j,s)], M[row][Dim(j,s)]); - - } - } - - } - - mark=ManageMatState ( MARK,mark); - row=current; - - - if ( E->st==H->end || E->st==H->forbiden){E=CopyMatState ((M[row][Dim(end_j,E->st)]),E);} - - - - - PCC=CopyMatState (M[row][Dim(end_j,E->st)], NULL); - - if ( MatStateAreIdentical(PCC,PCC->m))PCC=PCC->m; - tS=tE=PCC; - while (PCC->m) - { - tS=CopyMatState (PCC->m,NULL); tS->n=PCC; PCC->p=tS;PCC=tS; - } - - if (tS==tE); - else - { - S->n=tS->n; (S->n)->p=S; - E->p=tE->p; (E->p)->n=E; - } - - ManageMatState ( FREE_MARK,mark); - - - for ( a=0; ap!=E){S->m=NULL;S=S->n;}/*Clean the memory of the rturned Cells*/ - return NULL; -} - -/*********************************************************************************/ -/* */ -/* */ -/* HMM Viterbi Diagonals GLOBAL/LOCAL */ -/* */ -/* */ -/*********************************************************************************/ - -int viterbiDGL_pair_wise (Alignment *A,int*ns, int **ls,Constraint_list *CL) -{ - int l1, l2; - int *path; - Hmm * H; - MatState *Start; - MatState *End; - int **seg_list; - int a, b, c; - int main_i; - int main_j; - - - A->pos=aln2pos_simple( A, -1, ns, ls); - - Start=ManageMatState ( DECLARE, NULL); - End=ManageMatState ( DECLARE, NULL); - H=define_simple_model (CL); - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - - main_i=MAX(1,(l2-l1)+1); - main_j=MAX(1,(l1-l2)+1); - - seg_list=declare_arrayN(2, sizeof (int), l1+l2+3, 3); - seg_list[0][0]=DIAGONALS; - - - c=1; - for ( b=1,a=l1; a>= 1; a--) - { - if (a<50 || (b==main_i && a==main_j)) - { - seg_list[c][0]=a; - seg_list[c][1]=b; - seg_list[c][2]=MIN((l1-a), (l2-b)); - c++; - } - } - - - for ( b=2,a=1; b<= l2; b++, c++) - { - if (b<50 || (b==main_i && a==main_j)) - { - seg_list[c][0]=a; - seg_list[c][1]=b; - seg_list[c][2]=MIN((l1-a), (l2-b)); - } - } - - - seg_list[c][0]=FORBIDEN; - - Start->i=0 ;Start->j=0 ; Start->st=H->start;Start->sc=0; - End->i =l1; End->j=l2; End ->st=H->end; - Start=RviterbiDGL_hmm (A, ns, ls, H, CL, Start,End,seg_list); - - - path=traceback (A, ns, ls, H, CL, Start,NULL, NULL); - - - - A=viterbipath2aln (A,ns,ls,path, H); - - viterbiD_hmm (NULL, ns, ls, H, CL, Start,End, seg_list); - free_Hmm (H); - free_int (A->pos, -1); - free_arrayN((void **)seg_list, 2); - - A->pos=NULL; - return A->score_aln; -} - - -double lu_RviterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list) -{ - HmmState *S1; - double sc, sc2,e, t; - static MatState *cS=NULL, *cE=NULL; - double min, max; - max=MAX((E->i-S->i), (E->j-S->j)); - min=MIN((E->i-S->i), (E->j-S->j)); - - - - - if ( S==NULL || E==NULL || S->sc==H->forbiden) return H->forbiden; - else if ( S->st==H->start) return 0; - else if ( E->st==H->end) return S->sc; - else if (min==0) - { - e=hmm_add(S->sc,H->T[S->st][E->st]); - if ( H->T[E->st][E->st]!=H->forbiden)e=hmm_add(e, (max-1)*H->T[E->st][E->st]); - if ( (H->S[E->st])->em!=H->forbiden) e=hmm_add(e, max *(H->S[E->st])->em ); - return e; - } - else if ( min>0 && max>1) - { - - fprintf ( stderr, "\nWarning: Disjoined Diagonals"); - DisplayMatState (S, "\n\tS"); - DisplayMatState (E, "\n\tE"); - - - cS=CopyMatState ( S,cS); - cE=CopyMatState ( E,cE); - cE->sc=H->forbiden; - viterbiD_hmm (A,ns,ls, H,CL,cS, cE, NULL); - sc2=cE->sc; - - return sc2; - } - else - { - S1=H->S[E->st]; - t=H->T[S->st][E->st]; - e=(S1->em==H->forbiden)?S1->em_func (A, A->pos, ns[0], ls[0],E->i-1, A->pos,ns[1], ls[1], E->j-1, CL):S1->em; - sc=hmm_add(S->sc,t); - sc=hmm_add(sc,e); - return sc; - } - return H->forbiden; -} - - -MatState* RviterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E, int **seg_list) -{ - MatState *MS, *ME; - MS=S; - ME=E; - - viterbiDGL_hmm (A,ns, ls,H, CL, S, E, seg_list); - - - if ( S->n==E)return S; - if ( E->sc==H->forbiden) - { - DisplayHmm (H); - fprintf ( stderr, "\nERROR: The Requested Model (Cf Above) Cannot Produce the Pair-Alignment\nYou must allow extra possible transitions\n[FATAL:%s]", PROGRAM); - myexit ( EXIT_FAILURE); - } - E=S->n; - - while (S!=ME) - { - int d1, d2, align; - d1=MinDeltaMatState(S,E); - d2=MaxDeltaMatState(S,E); - align=((d1==1 && d2==1) || ( d1==0))?0:1; - if (align)RviterbiDGL_hmm (A,ns, ls,H, CL,S,E, seg_list); - S=E; - E=S->n; - } - return MS; -} - - -#define Dim(i,j) (i*LenJ+j) -MatState* viterbiDGL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S,MatState *E, int **seg_list) -{ - int current, previous,row, prow; - double v; - int a,i,j,pi,pj, s, k; - int start_i, start_j, end_i, end_j, l1, l2; - HmmState *S1, *S2; - MatState *CC, *PCC,*tS, *tE,*bestE,*bestS, *mark=NULL; - int midpoint; - - int dj; - int dc; - int *jlist=NULL; - static int **main_jlist; - static MatState ***M; - static int *toclean; - int ntoclean; - static int LenJ, LenI; - int MaxDelta=50, DeltaI, DeltaJ; - int mode; - - - - DisplayMatState (S, "\n\tS"); - DisplayMatState (E, "\n\tE"); - - - if ( A==NULL) - { - free_arrayN((void **)main_jlist, 2);main_jlist=NULL; - - for ( a=0; a<2; a++)memset(M[a],0,LenJ*LenI*sizeof (MatState*)); - free_arrayN((void **)M, 3);M=NULL; - vfree (toclean); - ManageMatState ( FREE_ALL, NULL); - return NULL; - } - - - if ( MatStateAreIdentical ( S, E))return NULL; - l1=strlen (A->seq_al[ls[0][0]]);l2=strlen (A->seq_al[ls[1][0]]); - - midpoint=S->i+((E->i-S->i)/2); - DeltaI=E->i-S->i; - - - start_i=S->i;end_i=E->i;start_j=S->j;end_j=E->j; - current=0;previous=1; - - - if ( !M) - { - LenI=l2+1; - LenJ=H->nS; - M=declare_arrayN(3, sizeof ( MatState),2,LenI*LenJ,0); - toclean=vcalloc ( LenI*LenJ, sizeof (int)); - } - - if ( !main_jlist)main_jlist= seglist2table(seg_list, l1, l2); - - - /*MAKE THE VITERBI FROM S(tart) to E(nd)*/ - mark=ManageMatState ( MARK, mark); - mode=(!seg_list)?ALL:seg_list[0][0]; - bestE=CopyMatState (E, NULL); - bestS=CopyMatState (NULL, NULL); - for (ntoclean=0,i=start_i; i<=end_i; i++) - { - row=current; - - if ( mode==ALL)jlist=main_jlist[0]; - else if ( mode==DIAGONALS)jlist=(i==0)?main_jlist[0]:main_jlist[1]; - else if ( mode==SEGMENTS) jlist=main_jlist[i+2]; - - - for ( dj=1; dj<=jlist[0]; dj++) - { - DeltaJ=(FABS(dj-i)end_j)continue; - for ( s=H->nS-1;s>=0; s--) - { - if ( s==S->st)continue; - S1=H->S[s];pi=i-S1->DI;prow=S1->DI; - - if ( S1->DI && S1->DJ){pj=j-S1->DJ;} - else if ( !S1->DJ)pj=j; - else if ( dj>1)pj=jlist[dj-S1->DJ]+dc; - else pj=-1; - - if (!M[row][Dim(j,s)])toclean[ntoclean]=Dim(j,s); - - CC=M[row][Dim(j,s)]=CopyMatState(NULL, M[row][Dim(j,s)]); - CC->i=i; CC->j=j; CC->st=s;PCC=NULL; - - if (i==start_i && j==start_j && s==S->st){CC=CopyMatState(S,CC);} - else if ( s==S->st); - else if ( i==end_i && j==end_j && E->st!=H->end && s!=E->st)CC->sc=H->forbiden; - - else if ( pisc=H->forbiden;} - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - - if ( S1->DI && S1->DJ)PCC=M[prow][Dim((j-S1->DJ),(S2->state))]; - else PCC=M[prow][Dim((jlist[dj-S1->DJ]+dc),(S2->state))]; - - if ( S2->state==H->start){PCC=bestS;PCC->st=0;PCC->sc=0;PCC->m=PCC->n=PCC->p=NULL;} - - v=lu_RviterbiDGL_hmm(A,ns, ls, H, CL,PCC,CC, NULL); - if ( v!=H->forbiden && (CC->sc==H->forbiden || v> CC->sc)){CC->sc=v; CC->pst=S2->state;CC->p=PCC;} - } - } - if ( CC->sc==H->forbiden); - else if ( bestE->sc==H->forbiden || bestE->sc>CC->sc) - { - bestE=CopyMatState(CC, bestE); - bestE->m=(CC->p)->m; - } - else if (CC->p && (CC->p)->st==H->start) - { - CC->m=CopyMatState (CC->p, NULL); - } - else if (i==midpoint || DeltaI<=MaxDelta||DeltaJ<=MaxDelta ||(i==start_i && j==start_j && s==S->st) ) - { - CC->m=(CC->p)?(CC->p)->m:NULL; - PCC=CopyMatState(CC,NULL); - PCC->m=CC->m;CC->m=PCC; - } - else CC->m=(CC->p)?(CC->p)->m:NULL; - } - } - prow=previous; - for ( dj=1; dj<=jlist[0] && i!=end_i; dj++) - { - dc=(mode==DIAGONALS && dj!=1)?i:0; - j=jlist[dj]+dc; - if ( jend_j)continue; - - for ( s=H->nS-1;s>=0; s--) - { - - CC=(M[prow][Dim(j,s)]);M[prow][Dim(j,s)]=M[row][Dim(j,s)];M[row][Dim(j,s)]=CC; - /*if (!M[row][Dim(j,s)])toclean[ntoclean++]=Dim(j,s);*/ - if (M[prow][Dim(j,s)]) M[row ][Dim(j,s)]=CopyMatState ( M[prow][Dim(j,s)], M[row][Dim(j,s)]); - - } - } - - } - - mark=ManageMatState ( MARK,mark); - row=current; - - - if ( E->st==H->end || E->st==H->forbiden){E=CopyMatState ((M[row][Dim(end_j,E->st)]),E);} - PCC=CopyMatState (bestE, NULL); - - if ( MatStateAreIdentical(PCC,PCC->m))PCC=PCC->m; - tS=tE=PCC; - while (PCC->m) - { - tS=CopyMatState (PCC->m,NULL); tS->n=PCC; PCC->p=tS;PCC=tS; - } - - if (tS==tE); - else - { - CopyMatState ( tS, S); - CopyMatState ( tE, E); - } - ManageMatState ( FREE_MARK,mark); - - for ( a=0; a<2; a++)memset(M[a],0,LenJ*LenI*sizeof (MatState*)); - - while (S && S->p!=E){S->m=NULL;S=S->n;}/*Clean the memory of the rturned Cells*/ - return NULL; -} - - -/*********************************************************************************/ -/* */ -/* */ -/* HMM Viterbi Diagonals PROCESSING */ -/* */ -/* */ -/*********************************************************************************/ -int **seglist2table ( int **seglist,int l1, int l2) - { - int **valuesT; - int *bvalues; - int line, a,si, sj, ei, j, c; - - /*All: 0*/ - valuesT=vcalloc ((l1+2)+3, sizeof (int*)); - valuesT[0]=vcalloc (l2+2, sizeof (int)); - for (a=0; a<=l2; a++)valuesT[0][++valuesT[0][0]]=a; - - if ( !seglist) return valuesT; - /*Diagonals: 1*/ - valuesT[1]=vcalloc (l1+l2+2, sizeof (int)); - bvalues=vcalloc (l1+l2+2, sizeof (int)); - c=1; - while (seglist[c][0]!=FORBIDEN) - { - - si=seglist[c][0]; - sj=seglist[c][1]; - - bvalues[(sj-si)+l1]=1; - c++; - } - valuesT[1][++valuesT[1][0]]=0; - for (a=0; a<=(l1+l2); a++) - { - if (bvalues[a]) - { - valuesT[1][++valuesT[1][0]]=a-l1; - } - - } - vfree (bvalues); - - /*Segments: 2*/ - valuesT[2]=vcalloc (l2+2, sizeof (int)); - for (a=0; a<=l2; a++)valuesT[2][++valuesT[2][0]]=a; - - bvalues=vcalloc (l2+2, sizeof (int)); - for ( line=1; line<=l1; line++) - { - bvalues[0]=c=0; - bvalues[++bvalues[0]]=0; - while (seglist[c][0]!=FORBIDEN) - { - si=seglist[c][0]; - ei=si+seglist[c][2]; - sj=seglist[c][1]; - j=sj+(line-si); - if ( lineei); - else if (j>=0 && j<=l2 && seglist[c][2]) - { - bvalues[++bvalues[0]]=j; - } - c++; - } - valuesT[line+2]=vcalloc (bvalues[0]+1, sizeof (int)); - for ( a=0; a<=bvalues[0]; a++) valuesT[line+2][a]=bvalues[a]; - } - vfree (bvalues); - return valuesT; - } - - - -/*********************************************************************************/ -/* */ -/* */ -/* HMM modeling */ -/* */ -/* */ -/*********************************************************************************/ - -Hmm* declare_hmm(int n) - { - Hmm *H; - int a, b; - - H=vcalloc (1, sizeof (Hmm)); - H->nS=n; - H->S=vcalloc (H->nS, sizeof (HmmState*)); - for (a=0; anS; a++) - { - H->S[a]=vcalloc (1, sizeof (HmmState)); - (H->S[a])->em2=vcalloc (MAX_EMISSION, sizeof (double)); - - (H->S[a])->T=vcalloc ( H->nS, sizeof (StateTrans*)); - for ( b=0; b< H->nS; b++) - (H->S[a])->T[b]=vcalloc (1, sizeof (StateTrans)); - } - return H; - } - -Hmm* free_Hmm(Hmm*H) - { - int a, b; - - H=vcalloc (1, sizeof (Hmm)); - free_double (H->T, -1); - free_int ( H->fromM, -1); - free_int ( H->toM, -1); - - for (a=0; a< H->nS; a++) - { - - for ( b=0; b< H->nS; b++) - { - vfree ((H->S[a])->em2); - vfree((H->S[a])->T[b]); - } - vfree((H->S[a])->T); - vfree(H->S[a]); - } - vfree (H->S); - vfree (H); - return NULL; - } - -void DisplayHmm ( Hmm *H) -{ - int a, b; - HmmState *S1, *S2; - - for ( a=0; a< H->nS; a++) - { - S1=H->S[a]; - fprintf ( stderr, "\nSTATE %d: %s\n",S1->state,S1->name); - fprintf ( stderr, "\n\tDI %d", S1->DI); - fprintf ( stderr, "\n\tDJ %d", S1->DJ); - fprintf ( stderr, "\n\tE %f", (float)S1->em); - - fprintf ( stderr, "\nReached FROM: "); - for ( b=1; b<=H->fromM[a][0]; b++) - { - S2=H->S[H->fromM[a][b]]; - fprintf ( stderr, "[ %s %f ] ", S2->name, H->T[S2->state][S1->state]); - } - fprintf ( stderr, "\nGoes TO: "); - for ( b=1; b<=H->toM[a][0]; b++) - { - S2=H->S[H->toM[a][b]]; - fprintf ( stderr, "[ %s %f ] ", S2->name, H->T[S1->state][S2->state]); - } - } - return; -} -Hmm * bound_hmm ( Hmm *H) -{ - int a, b, c; - char **name; - HmmState *S; - - name=declare_char(H->nS, 100); - H->T=declare_double ( H->nS, H->nS); - - for ( a=0; a< H->nS; a++) - { - sprintf ( name[a], "%s", (H->S[a])->name); - H->order=MAX(H->order, (H->S[a])->DI); - H->order=MAX(H->order, (H->S[a])->DJ); - } - - for ( a=0; a< H->nS; a++)for (b=0; bnS; b++)H->T[a][b]=H->forbiden; - for (a=0; a< H->nS; a++) - { - S=H->S[a]; - for ( b=0; b< S->nT; b++) - { - c=name_is_in_list ((S->T[b])->name, name, H->nS, 100); - if ( c!=-1)H->T[a][c]=(S->T[b])->tr; - } - } - - /*Bound the model: - bM[state][0]=n_allowed transitions - bM[state][1]=first allowed transition - */ - - H->toM=declare_int ( H->nS, H->nS); - H->fromM=declare_int ( H->nS, H->nS); - - for ( a=0; a< H->nS; a++) - for ( b=0; b< H->nS; b++) - { - if ( H->T[a][b]!=H->forbiden ) - { - {H->fromM[b][0]++; H->fromM[b][H->fromM[b][0]]=a;} - {H->toM[a][0]++; H->toM[a][H->toM[a][0]]=b;} - } - } - for ( a=0; a< H->nS; a++) - { - if (( H->S[a])->em!=H->forbiden)( H->S[a])->em*=SCORE_K; - for ( b=0; b< H->nS; b++) - if ( H->T[a][b]!=H->forbiden)H->T[a][b]*=SCORE_K; - } - free_arrayN((void**)name, 2); - return H; -} - -/*********************************************************************************/ -/* */ -/* */ -/* Memory Management */ -/* */ -/* */ -/*********************************************************************************/ - -MatState * ManageMatState(int Mode, MatState *C) -{ - static MatState *Fheap; - static MatState *Aheap; - MatState *Cmark, *Pmark; - static int alloc, free; - if (!Fheap || Fheap->Hp==NULL) - { - int c=0; - int extension=1000; - if (!Fheap){Fheap=vcalloc (1, sizeof (MatState));Fheap->free=1;free++;} - if (!Aheap)Aheap=vcalloc (1, sizeof (MatState)); - while ( c!=extension) - { - C=vcalloc ( 1, sizeof (MatState)); - C->free=1;Fheap->Hn=C;C->Hp=Fheap; - Fheap=C; - c++; - free++; - } - } - - if ( Mode==DECLARE) - { - - C=Fheap; - Fheap=Fheap->Hp; - C->Hn=C->Hp=NULL; - if ( Aheap){Aheap->Hn=C;C->Hp=Aheap;Aheap=C;} - else Aheap=C; - alloc++; - free--; - C->free=0; - C=CopyMatState(NULL, C); - return C; - } - else if ( Mode==FREE) - { - if ( !C || C->free==1); - else - { - C=CopyMatState(NULL, C); - C->free=1; - if (C->Hp==NULL && C==Aheap)crash (""); - if (C==Aheap)Aheap=C->Hp; - if (C->Hn){(C->Hn)->Hp=C->Hp;} - if (C->Hp){(C->Hp)->Hn=C->Hn;} - C->Hp=C->Hn=NULL; - Fheap->Hn=C;C->Hp=Fheap; - Fheap=C; - alloc--; - free++; - } - return NULL; - } - else if ( Mode==FREE_ALL) - { - while ( Aheap) - { - C=Aheap->Hp; - vfree (Aheap); - Aheap=C; - } - while ( Fheap) - { - C=Fheap->Hp; - vfree (Fheap); - Fheap=C; - } - } - else if ( Mode==INFO) - { - fprintf ( stderr, "\nAllocated: %d Free %d", alloc, free); - } - else if ( Mode==MARK) - { - - if (C==NULL); - else {C->Mn=Aheap;Aheap->Mp=C;} - - return Aheap; - } - else if ( Mode==UNMARK) - { - Pmark=Cmark=NULL; - } - else if ( Mode == FREE_MARK) - { - Cmark=C; - Pmark=C->Mp; - - if ( Cmark==Pmark)return NULL; - else if ( Cmark==Aheap) - {Aheap=Pmark;C=Pmark->Hn;Pmark->Hn=NULL;} - else - { - (Cmark->Hn)->Hp=Pmark; - C=Pmark->Hn; - Pmark->Hn=Cmark->Hn; - } - - Fheap->Hn=C; - C->Hp=Fheap; - Fheap=Cmark; - Fheap->Hn=NULL; - - C=Fheap; - while (C && !C->free) - { - free++;alloc--; - C->free=1; - C=C->Hp; - } - - } - return NULL; -} - - -MatState* CopyMatState ( MatState*I, MatState*O) -{ - if (O==NULL || O->free==1) O=ManageMatState(DECLARE, NULL); - if (I==NULL || I->free==1)I=NULL; - O->i =(I)?I->i:0; - O->j =(I)?I->j:0; - O->st =(I)?I->st:FORBIDEN; - O->pst=(I)?I->pst:FORBIDEN; - O->sc =(I)?I->sc:FORBIDEN; - O->n =(I)?I->n:NULL; - O->p =(I)?I->p:NULL; - O->m =(I)?I->m:NULL; - O->s =(I)?I->m:NULL; - - return O; -} - -/*********************************************************************************/ -/* */ -/* */ -/* Comparisons */ -/* */ -/* */ -/*********************************************************************************/ -int MaxDeltaMatState (MatState*S, MatState*E) -{ - if ( !S || !E) return -1; - else return MAX((E->i-S->i),(E->j-S->j)); -} -int MinDeltaMatState (MatState*S, MatState*E) -{ - if ( !S || !E) return -1; - else return MIN((E->i-S->i),(E->j-S->j)); -} -int MatStateAreIdentical (MatState*I, MatState*O) -{ - if ( !I || !O)return 0; - - if ( I->i!=O->i)return 0; - if ( I->j!=O->j)return 0; - if ( I->st!=O->st)return 0; - return 1; -} - - - -Hmm* define_probcons_model(Constraint_list *CL) -{ - Hmm *H; - double gop=-10; - double gep=-1; - double lgop=-100; - double lgep=-100; - double freeT=0; - int n=0; - HmmState *S; - - - H=declare_hmm(7); - H->freeT=freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - /*define START*/ - S=H->S[n]; - sprintf (S->name, "START"); S->state=n; - - S->DI=0; - S->DJ=0; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=freeT ;S->nT++; - - n++; - /*define END*/ - S=H->S[n]; - sprintf (S->name, "END"); S->state=n; - S->DI=0; - S->DJ=0; - S->em=freeT; - n++; - - /*define Match*/ - S=H->S[n]; - sprintf (S->name, "MATCH"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=H->forbiden; - S->em_func=CL->get_dp_cost; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define Insert*/ - S=H->S[n]; - sprintf (S->name, "INSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=gep; - sprintf ( (S->T[S->nT])->name, "MATCH") ; (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT"); (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LINSERT");(S->T[S->nT])->tr=lgop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=-gop;S->nT++; - - n++; - - /*define LInsert*/ - S=H->S[n]; - sprintf (S->name, "LINSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=lgep; - - sprintf ( (S->T[S->nT])->name, "INSERT") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LINSERT");(S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - - /*define Delete*/ - S=H->S[n]; - sprintf (S->name, "DELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=gep; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LDELETE") ;(S->T[S->nT])->tr=lgop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=-gop;S->nT++; - - n++; - - /*define LDelete*/ - S=H->S[n]; - sprintf (S->name, "LDELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=lgep; - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LDELETE");(S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - - H=bound_hmm ( H); - return H; -} - -Hmm* define_mnm_model(Constraint_list *CL) -{ - Hmm *H; - double gop=20; - - - - double freeT=0; - int n=0; - HmmState *S; - - - H=declare_hmm(6); - H->freeT=freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - /*define START*/ - S=H->S[n]; - sprintf (S->name, "START"); S->state=n; - - S->DI=0; - S->DJ=0; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "NOMATCH");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=freeT ;S->nT++; - - n++; - /*define END*/ - S=H->S[n]; - sprintf (S->name, "END"); S->state=n; - S->DI=0; - S->DJ=0; - S->em=freeT; - n++; - - /*define Match*/ - S=H->S[n]; - sprintf (S->name, "MATCH"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=H->forbiden; - S->em_func=CL->get_dp_cost; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "NOMATCH");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define NOMatch*/ - S=H->S[n]; - sprintf (S->name, "NOMATCH"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=freeT; - S->em_func=NULL; - - sprintf ( (S->T[S->nT])->name, "NOMATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - /*define Insert*/ - S=H->S[n]; - sprintf (S->name, "INSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=freeT; - sprintf ( (S->T[S->nT])->name, "NOMATCH") ; (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT") ; (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define Delete*/ - S=H->S[n]; - sprintf (S->name, "DELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "NOMATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - - H=bound_hmm ( H); - return H; -} - -Hmm* define_simple_model(Constraint_list *CL) -{ - Hmm *H; - double gop=-10; - double gep=-1; - double freeT=0; - int n=0; - HmmState *S; - - - H=declare_hmm(5); - H->freeT=freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - /*define START*/ - S=H->S[n]; - sprintf (S->name, "START"); S->state=n; - - S->DI=0; - S->DJ=0; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=freeT ;S->nT++; - - n++; - /*define END*/ - S=H->S[n]; - sprintf (S->name, "END"); S->state=n; - S->DI=0; - S->DJ=0; - S->em=freeT; - n++; - - /*define Match*/ - S=H->S[n]; - sprintf (S->name, "MATCH"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=H->forbiden; - S->em_func=CL->get_dp_cost; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define Insert*/ - S=H->S[n]; - sprintf (S->name, "INSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=gep; - sprintf ( (S->T[S->nT])->name, "MATCH") ; (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT"); (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE"); (S->T[S->nT])->tr=freeT;S->nT++; - - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=-gop;S->nT++; - - n++; - - - /*define Delete*/ - S=H->S[n]; - sprintf (S->name, "DELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=gep; - - sprintf ( (S->T[S->nT])->name, "MATCH") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT"); (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=-gop;S->nT++; - - n++; - - H=bound_hmm ( H); - return H; -} - -Hmm* define_two_mat_model(Constraint_list *CL) -{ - Hmm *H; - double gop=-15; - double gep=-2; - double lgop=-6; - double lgep=-1; - double freeT=0; - int n=0; - HmmState *S; - - - H=declare_hmm(8); - H->freeT=freeT=0; - - H->forbiden=FORBIDEN; - H->start=START_STATE; - H->end=END_STATE; - - /*define START*/ - S=H->S[n]; - sprintf (S->name, "START"); S->state=n; - - S->DI=0; - S->DJ=0; - S->em=freeT; - - sprintf ( (S->T[S->nT])->name, "MATCH1") ;(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "MATCH2") ;(S->T[S->nT])->tr=freeT ;S->nT++; - - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=freeT ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=freeT ;S->nT++; - - n++; - /*define END*/ - S=H->S[n]; - sprintf (S->name, "END"); S->state=n; - S->DI=0; - S->DJ=0; - S->em=freeT; - n++; - - /*define Match*/ - S=H->S[n]; - sprintf (S->name, "MATCH1"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=H->forbiden; - S->em_func=get_dp_cost_pam_matrix; - - sprintf ( (S->T[S->nT])->name, "MATCH1") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define Match*/ - S=H->S[n]; - sprintf (S->name, "MATCH2"); S->state=n; - S->DI=1; - S->DJ=1; - S->em=H->forbiden; - S->em_func=get_dp_cost_blosum_matrix; - - sprintf ( (S->T[S->nT])->name, "MATCH2") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "INSERT");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "DELETE");(S->T[S->nT])->tr=gop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - /*define Insert*/ - S=H->S[n]; - sprintf (S->name, "INSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=gep; - sprintf ( (S->T[S->nT])->name, "MATCH2") ; (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "MATCH1") ; (S->T[S->nT])->tr=freeT;S->nT++; - - sprintf ( (S->T[S->nT])->name, "INSERT"); (S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LINSERT");(S->T[S->nT])->tr=lgop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END"); (S->T[S->nT])->tr=-gop;S->nT++; - - n++; - - /*define LInsert*/ - S=H->S[n]; - sprintf (S->name, "LINSERT"); S->state=n; - S->DI=1; - S->DJ=0; - S->em=lgep; - - sprintf ( (S->T[S->nT])->name, "INSERT") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LINSERT");(S->T[S->nT])->tr=freeT;S->nT++; - - n++; - - - /*define Delete*/ - S=H->S[n]; - sprintf (S->name, "DELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=gep; - - sprintf ( (S->T[S->nT])->name, "MATCH2") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "MATCH1") ;(S->T[S->nT])->tr=freeT;S->nT++; - - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LDELETE") ;(S->T[S->nT])->tr=lgop ;S->nT++; - sprintf ( (S->T[S->nT])->name, "END") ;(S->T[S->nT])->tr=-gop;S->nT++; - n++; - - /*define LDelete*/ - S=H->S[n]; - sprintf (S->name, "LDELETE"); S->state=n; - S->DI=0; - S->DJ=1; - S->em=lgep; - sprintf ( (S->T[S->nT])->name, "DELETE") ;(S->T[S->nT])->tr=freeT;S->nT++; - sprintf ( (S->T[S->nT])->name, "LDELETE");(S->T[S->nT])->tr=freeT;S->nT++; - n++; - - if ( n!=H->nS) - { - fprintf ( stderr, "\nERROR in HMM definition [FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - H=bound_hmm ( H); - return H; -} -void DisplayMatState ( MatState *S, char *s) -{ - if ( S==NULL)fprintf ( stderr, "%s: Cell is undefined", s); - else fprintf ( stderr, "%s: i=%d j=%d st=%d pst=%d sc=%d Free %d", s, S->i, S->j, S->st, S->pst, (int)S->sc, S->free); -} -void testfunc ( MatState *S, char *s) -{ - if ( S==NULL)return; - fprintf ( stderr, "\n#### %s ", s); - while ( S){DisplayMatState ( S,"\n\t");S=S->n;} - fprintf ( stderr, "\n"); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#ifdef BACKHERE - - if ( i>0 && j>0) - m=emit_pair_default[alphabetDefault[seq1[a]]][alphabetDefault[seq2[a]]]; - /*Match*/ - F[M][i][j]=F[M][i-1][j-1]; - - - - M[Match][i][j]=m+log_add3( M[Match][i-step_i][j-step_j],M[I][i-step_i][j],M[D][i][j-step_j]); - M[D ][i][j]=log_add3(gep,M[Match][i ][j-step_j]+gop,M[D][i ][j-step_j]); - M[I ][i][j]=log_add3(gep,M[Match][i-step_i][j ]+gop,M[I][i-step_i][j ]); - - /*Long gaps - M[Match][i][j]=log_add3(M[Match][i][j], M[LI][i-step_i][j],M[LD][i][j-step_j]); - M[LI ][i][j]=log_add3(lgep, M[I][i-step_i][j ]+lgop,M[LI][i-step_i][j ]); - M[LD ][i][j]=log_add3(lgep, M[D][i ][j-step_j]+lgop,M[LD][i ][j-step_j]); - */ - - } - } - retun M; -MatState* RviterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL,MatState *S, MatState *E) -{ - MatState *Mid; - Mid=viterbiL_hmm (A,ns, ls,H, CL, S, E); - - if (!Mid) - { - return S; - } - else if ( Mid->n) - { - return Mid; - } - - else - { - Mid->p=S;S->n=Mid; - Mid->n=E;E->p=Mid; - RviterbiL_hmm (A,ns, ls,H, CL,S, Mid); - RviterbiL_hmm (A,ns, ls,H, CL,Mid, E); - return S; - } -} - -MatState* viterbiL_hmm (Alignment *A,int *ns, int **ls, Hmm *H, Constraint_list *CL, MatState *S,MatState *E) -{ - int current,memory, dim; - double e, v,t; - int i,j,pi,pj, s, k; - int start_i, start_j, end_i, end_j, l1, l2; - HmmState *S1, *S2; - static MatState ****M; - static int maxl; - MatState *Mid=NULL; - - MatState *CC, *PCC; - int midpoint; - int Delta; - - - if ( MatStateAreIdentical ( S, E))return NULL; - - l1=strlen (A->seq_al[ls[0][0]]); - l2=strlen (A->seq_al[ls[1][0]]); - - midpoint=S->i+(E->i-S->i)/2; - Delta=E->i-S->i; - - start_i=S->i;end_i=E->i; - start_j=S->j;end_j=E->j; - - dim=H->order+2;current=0;memory=H->order+1; - if (!M || (l2+1)>maxl) - { free_arrayN((void **)M, 4); - M=declare_arrayN(4, sizeof ( MatState), dim, maxl=(l2+1), H->nS,1); - } - - /*MAKE THE VITERBI FROM S(tart) to E(nd)*/ - for ( i=start_i; i<=end_i; i++) - { - M= (MatState****)recycle ( (void **)M,H->order+1,1); - for ( j=start_j; j<=end_j; j++) - { - for ( s=H->nS-1;s>=0; s--) - { - - S1=H->S[s]; - pi=i-S1->DI;pj=j-S1->DJ; - CC=M[current][j][s]; - CC->i=i; CC->j=j; CC->st=s;CC->sc=H->forbiden;CC->p=CC->n=CC->m=NULL;CC->sc=H->forbiden; - if (i==start_i && j==start_j && s==S->st) {CopyMatState(S,CC);} - else if ( i==end_i && j==end_j && s==E->st && s!=H->end) - { - S2=H->S[E->pst]; - CopyMatState(E,CC); - CC->p=M[S1->DI][j-S1->DJ][S2->state]; - } - else if ( pisc=H->forbiden;} - else - { - for (k=1; k<=H->fromM[S1->state][0]; k++) - { - S2=H->S[H->fromM[s][k]]; - PCC=M[S1->DI][j-S1->DJ][S2->state]; - - if ( pi+pj!=0 && S2->state==H->start) {t=H->forbiden;} - else if ( !(pi==l1 && pj==l2) && s==H->end){t=H->forbiden;} - else t=H->T[S2->state][S1->state]; - - v=hmm_add(t,PCC->sc); - if ( v!=H->forbiden && (CC->sc==H->forbiden || v> CC->sc)){CC->sc=v; CC->pst=S2->state;CC->p=PCC;} - } - - e=(S1->em==H->forbiden)?S1->em_func (A, A->pos, ns[0], ls[0],i-1, A->pos,ns[1], ls[1], j-1, CL):S1->em; - CC->sc=hmm_add(CC->sc,e); - } - - if (i==midpoint)CC->m=CopyMatState(CC, M[memory][j][s]); - else if (i>midpoint && CC->sc!=H->forbiden) CC->m=(M[S1->DI][j-S1->DJ][CC->pst])->m; - } - } - } - - if ( E->st==H->end)CopyMatState ((M[current][end_j][E->st]),E); - - if ( Delta>1) - { - Mid=CopyMatState ((M[current][end_j][E->st])->m,NULL); - } - else if ( Delta==1) - { - CC=M[current][E->j][E->st]; - Mid=E; - while (!MatStateAreIdentical (CC->p, S) ) - { - Mid->p=CopyMatState(CC->p,NULL); - (Mid->p)->n=Mid; - Mid=Mid->p;CC=CC->p; - } - Mid->p=S; - S->n=Mid; - Mid=S; - } - - return Mid; -} -#endif -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centre National de la Recherche Scientifique (CNRS) */ -/*and */ -/*Please Cite: Notredame*/ -/*Mon May 17 20:15:35 MDT 2004. */ -/*All rights reserved.*/ -/*NOTICE: |*/ -/* This file is an integral part of the */ -/* ALIGN_TWO_SEQ Software. */ -/* Its content is protected and all */ -/* the conditions mentioned in the licensing */ -/* agreement of the software apply to this file.*/ -/*............................................... |*/ -/* If you need some more information, or if you */ -/* wish to obtain a full license, please contact: */ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/header_list b/binaries/src/tcoffee/t_coffee_source/header_list deleted file mode 100644 index eabfac3..0000000 --- a/binaries/src/tcoffee/t_coffee_source/header_list +++ /dev/null @@ -1,13 +0,0 @@ -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/define_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev1_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev2_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev3_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev4_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dp_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/fast_tree_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/fastal_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/io_lib_header.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/matrices.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/perl_header_lib.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/t_coffee.h -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_lib_header.h diff --git a/binaries/src/tcoffee/t_coffee_source/hsearch.c b/binaries/src/tcoffee/t_coffee_source/hsearch.c deleted file mode 100644 index 72dd76f..0000000 --- a/binaries/src/tcoffee/t_coffee_source/hsearch.c +++ /dev/null @@ -1,290 +0,0 @@ - -#include -#include -#include -#include - - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - -HaschT * hcreate ( int n_elements,struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - { - HaschT *T; - int a; - - n_elements=n_elements*2+1; - - T=vcalloc ( 1, sizeof (HaschT)); - T->ne=n_elements; - T->p=vcalloc (n_elements,sizeof ( Hasch_entry*)); - for ( a=0; ap[a]=allocate_hasch_entry(NULL,DECLARE,declare_data, free_data); - } - return T; - } -HaschT *hdestroy (HaschT *T,struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - - - { - int a; - Hasch_entry *p, *pp; - - if ( T==NULL)return NULL; - - for (a=0; a< T->ne; a++) - { - p=T->p[a]; - while (p) - { - pp=p; - p=p->n; - allocate_hasch_entry(pp,FREE, declare_data, free_data); - } - } - vfree (T->p); - vfree ( T); - return NULL; - } - - -Hasch_entry* hsearch (HaschT *T, int k, int action, struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - - - { - /*action: FIND,ADD, REMOVE*/ - Hasch_entry *p, *pi; - int h; - - - - /* find the key: k->h*/ - - h=k%T->ne; - - - if ( action==ADD || action==FIND) - { - p=pi=T->p[h]; - while (p && p->k!=k){p=p->n;} - if (action==ADD && !p) - { - p=insert_hasch_entry_in_list (pi, NULL, NULL, declare_data, free_data); - p->k=k; - } - else if (action==FIND && !p)p=NULL; - return p; - } - else if ( action==REMOVE) - { - allocate_hasch_entry(hsearch ( T, k, FIND, declare_data, free_data), FREE, declare_data, free_data); - return NULL; - } - return NULL; - } - - -Hasch_entry * extract_hasch_entry_from_list (Hasch_entry *e, struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - - - { - /*extracts entry e and returns p, or next if is NULL*/ - Hasch_entry *p=NULL, *n=NULL; - - if (!e); - else - { - p=e->p; - n=e->n; - - if (p)p->n=n; - if (n)n->p=p; - e->p=e->n=NULL; - } - return e; - } - -Hasch_entry * insert_hasch_entry_in_list (Hasch_entry *p, Hasch_entry *e, Hasch_entry *n, struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - - -{ - /*inserts entry e between entry p and entry n and returns e*/ - - if (!e)e=allocate_hasch_entry (NULL,DECLARE, declare_data, free_data); - - - - if (!p && !n); - else if ( !p)p=n->p; - else if ( !n)n=p->n; - - e->p=p; - if (p)p->n=e; - - e->n=n; - if (n)n->p=e; - - return e; - } - -Hasch_entry * allocate_hasch_entry (Hasch_entry *e, int action,struct Hasch_data * declare_data(struct Hasch_entry *), struct Hasch_data *free_data(struct Hasch_data *) ) - - -{ - static Hasch_entry *s; - Hasch_entry *ns; - - if ( !s)s=vcalloc ( 1, sizeof (Hasch_entry)); - - if ( action==DECLARE) - { - ns=s->p; - e=extract_hasch_entry_from_list (s, declare_data, free_data); - if ( e->free_data)(e->free_data)(e->data); - e->declare_data=declare_data; - e->free_data=free_data; - e->declare_data (e); - e->k=UNDEFINED; - s=ns; - } - else if ( action==FREE) - { - extract_hasch_entry_from_list (e,declare_data, free_data ); - e->k=UNDEFINED; - if ( e->free_data)e->data=(e->free_data)(e->data); - e->free_data=NULL; - e->declare_data=NULL; - s=insert_hasch_entry_in_list (s, e, NULL, declare_data, free_data); - - } - else if ( action==FREE_STACK) - { - while (s) - { - e=s->p; - allocate_hasch_entry (s, FREE, declare_data,free_data); - vfree (s); - s=e; - } - } - else crash ("Unknown MODE for allocate_hasch_entry\n"); - return e; - } - -/*********************************************************************/ -/* */ -/* Get string key */ -/* */ -/* */ -/*********************************************************************/ - - -int string2key (char *s, Char_node *n) -{ - static Char_node *root; - - if ( !root)root=declare_char_node (DECLARE); - - if ( n==NULL && s==NULL) - { - declare_char_node (FREE_STACK); - } - else if (n==NULL) - { - return string2key(s, root); - } - else if ( s[0]=='\0') - { - return n->key; - } - else - { - return string2key(s+1, (n->c[(int)s[0]])?(n->c[(int)s[0]]):(n->c[(int)s[0]]=declare_char_node (DECLARE))); - } - return 0; -} - -Char_node * declare_char_node (int action) -{ -static struct Char_node **heap; -static int heap_size, free_heap, a; -static int key; - if ( action==DECLARE) - { - if ( free_heap==0) - { - free_heap=100; - - heap=vrealloc (heap,(heap_size+free_heap)*sizeof (struct Char_node *)); - for ( a=heap_size; ac=vcalloc ( 256, sizeof (Char_node*)); - (heap[a])->key=key++; - } - heap_size+=free_heap; - } - return heap[heap_size-(free_heap--)]; - } - else if ( action==FREE_STACK) - { - for (a=0; a< heap_size; a++) - { - heap[a]->key=key++; - vfree ( heap[a]->c); - (heap[a])->c=vcalloc ( 256, sizeof (Char_node*)); - } - free_heap=heap_size; - return NULL; - } - return NULL; -} - -/* old declare_char_node (too hungry) -Char_node * declare_char_node (int action) -{ - static int key; - Char_node *cn; - static Char_node *root; - - if ( action==DECLARE) - { - cn=vcalloc (1, sizeof (Char_node)); - cn->key=++key; - cn->c=vcalloc (256, sizeof (Char_node *)); - - } - return cn; -} -*/ -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/io_func.c b/binaries/src/tcoffee/t_coffee_source/io_func.c deleted file mode 100644 index 44ff9e4..0000000 --- a/binaries/src/tcoffee/t_coffee_source/io_func.c +++ /dev/null @@ -1,1492 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "matrices.h" - -#define DEFAULT_COLOR -1 -#define GAP_COLOR -2 -#define INK_COLOR -3 - -Sequence * cw_read_sequences ( char *seq_name) - { - Sequence *S; - - - char **seq=NULL; - char **name=NULL; - int *len=NULL; - int nseq=0; - int min_len=0; - int max_len=0; - int a; - - get_sequence ( seq_name, &nseq, &seq, &name, &len, &min_len, &max_len); - - S=declare_sequence ( min_len, max_len, nseq); - for ( a=0; a< nseq; a++)sprintf ( S->file[a], "%s", seq_name); - - for ( a=0; anseq; a++) - { - S->len[a]=len[a]; - sprintf ( S->name[a],"%s", name[a]); - vfree ( name[a]); - sprintf ( S->seq[a], "%s", seq[a]); - vfree ( seq[a]); - } - vfree (seq); - vfree (name); - vfree (len); - S=get_sequence_type ( S); - return S; - } -char * get_string_type (char *S) - { - int a, l; - int protein=0, dna=0,rna=0, tot=0; - char *type; - static char *ltype; - static int warning; - - if ( !ltype) - declare_name(ltype); - - declare_name(type); - l=(int)strlen (S); - - if (l==0) - { - sprintf ( type, "UNKNOWN"); - return type; - } - - for ( a=0; a98 && rna>10)sprintf ( type, "RNA"); - else if ( dna>98)sprintf ( type, "DNA"); - else sprintf ( type, "PROTEIN"); - - sprintf ( ltype, "%s", type); - return type; - } - -Alignment* get_aln_type (Alignment *A) - { - if ( !A) return A; - - if ( A->S && !(A->S)->type)(A->S)->type=vcalloc (30, sizeof (char)); - - if ( A->S && (A->S)->type[0]!='\0') - { - ; - } - else if (A->S!=NULL && (A->S)->type[0]=='\0') - { - A->S=get_sequence_type (A->S); - } - else if (A->S==NULL) - { - A->S=aln2seq (A); - A->S=get_sequence_type(A->S); - } - return A; - } - - - -char *unset_mode () -{ - return set_mode (UNSET, NULL); -} -char *store_mode (char *val) -{ - return set_mode (SET, val); -} -char *retrieve_mode () -{ - return set_mode (GET,NULL); -} -char *set_mode (int mode, char *val) -{ - static char type[100]; - if (mode==SET) - { - if (!val)printf_exit (EXIT_FAILURE, stderr, "Error: programme mode unset in io_func.c:set_seq_type"); - sprintf ( type,"%s", val); - } - else if ( mode==GET) - { - ; - } - else if ( mode==UNSET) - { - type[0]='\0'; - } - else - { - printf_exit (EXIT_FAILURE, stderr, "Error: unknown mode in function io_func.c:set_seq_type, use SET, GET or UNSET"); - } - return type; -} -/************************************************************/ - - - -char *unset_seq_type () -{ - return set_seq_type (UNSET, NULL); -} -char *store_seq_type (char *val) -{ - return set_seq_type (SET, val); -} -char *retrieve_seq_type () -{ - return set_seq_type (GET,NULL); -} -char *set_seq_type (int mode, char *val) -{ - static char type[100]; - if (mode==SET) - { - if (!val)printf_exit (EXIT_FAILURE, stderr, "Error: sequence type unset in io_func.c:set_seq_type"); - sprintf ( type,"%s", val); - } - else if ( mode==GET) - { - ; - } - else if ( mode==UNSET) - { - type[0]='\0'; - } - else - { - printf_exit (EXIT_FAILURE, stderr, "Error: unknown mode in function io_func.c:set_seq_type, use SET, GET or UNSET"); - } - return type; -} -char * get_array_type (int n, char **seq) -{ - char *buf, *buf2; - int a, tot=0; - buf2=vcalloc ( 100, sizeof (char)); - - - for ( tot=0,a=0; atype, "%s", get_array_type (S->nseq, S->seq)); - return S; -} - - -void get_sequence (char *seq_file,int *NSEQ, char ***SEQ, char ***SN, int **sl, int *min, int *max) - { - int a,b; - int min_len; - int max_len; - int nseq; - - int **SL; - - nseq=NSEQ[0]= readseqs ( seq_file, SEQ, SN, &SL); - sl[0]=vcalloc ( nseq, sizeof (int)); - - - min_len= max_len= (SL)[0][0]; - for ( a=0; a (SL)[a][0])?(SL)[a][0]:min_len; - max_len= ( max_len < (SL)[a][0])?(SL)[a][0]:max_len; - } - min[0]=min_len; - max[0]=max_len; - } - -int ** get_matrix ( char *name, char *format) - { - - if ( strm ( "blast", format))return read_blast_matrix ( name); - else if ( strm ( "clustalw", format))return read_matrice(name); - else - { - fprintf ( stderr, "\nError:\nUnknowm Format %s for Matrix %s[FATAL]", format, name); - myexit (EXIT_FAILURE); - } - return NULL; - } -void display_matrix (int **mat); -int ** read_matrice (char *mat_name_in) - { - int a,b,c, l; - - char AA[]="abcdefghiklmnpqrstvwxyz"; - FILE *fp; - int **matrice; - int **matrix2; - char mat_name[200]; - int *vector=NULL; - - l=strlen(AA); - - - - - if ( strm2 (mat_name_in, "pam", "PAM"))sprintf ( mat_name, "pam250mt"); - else if (strm2 (mat_name_in, "blosum", "BLOSUM"))sprintf ( mat_name, "blosum62mt"); - else if (strm3 (mat_name_in, "id", "ID", "idmat"))sprintf ( mat_name, "idmat"); - else sprintf ( mat_name, "%s", mat_name_in); - - /*Read Header Matrices*/ - if (strm(mat_name, "pam250mt"))vector=pam250mt; - else if (strm(mat_name, "idmat"))vector=idmat; - else if (strm(mat_name, "dna_idmat"))vector=idmat; - else if (strm(mat_name, "est_idmat"))vector=est_idmat; - else if (strm(mat_name, "md_350mt"))vector=md_350mt; - else if (strm(mat_name, "md_250mt"))vector=md_250mt; - else if (strm(mat_name, "md_120mt"))vector=md_120mt; - else if (strm(mat_name, "md_40mt" ))vector= md_40mt; - else if (strm(mat_name, "pam350mt" ))vector=pam350mt; - else if (strm(mat_name, "pam160mt" ))vector=pam160mt; - else if (strm(mat_name, "pam120mt" ))vector=pam120mt; - - else if (strm(mat_name, "blosum80mt" ))vector=blosum80mt; - else if (strm(mat_name, "blosum62mt" ))vector=blosum62mt; - else if (strm(mat_name, "exon2mt" ))vector=blosum62mt; - else if (strm(mat_name, "blosum62mt3" ))vector=blosum62mt3; - - else if (strm(mat_name, "blosum62mt2" ))vector=blosum62mt2; - else if (strm(mat_name, "blosum55mt" ))vector=blosum55mt; - else if (strm(mat_name, "blosum50mt" ))vector=blosum50mt; - else if (strm(mat_name, "blosum45mt" ))vector=blosum45mt; - - else if (strm(mat_name, "blosum40mt" ))vector=blosum40mt; - else if (strm(mat_name, "blosum30mt" ))vector=blosum30mt; - else if (strm(mat_name, "beta_mat" ))vector=beta_mat; - else if (strm(mat_name, "alpha_mat" ))vector=alpha_mat; - else if (strm(mat_name, "coil_mat" ))vector=coil_mat; - - else if (strm(mat_name, "rblosum80mt" ))vector=rblosum80mt; - else if (strm(mat_name, "rblosum62mt" ))vector=rblosum62mt; - else if (strm(mat_name, "rblosum30mt" ))vector=rblosum30mt; - - else if (strm(mat_name, "rpam250mt" ))vector=rpam250mt; - else if (strm(mat_name, "rpam350mt" ))vector=rpam350mt; - else if (strm(mat_name, "rpam160mt" ))vector=rpam160mt; - else if (strm(mat_name, "rpam120mt" ))vector=rpam120mt; - - else if (strm(mat_name, "tmpam250mt" ))vector=tmpam250mt; - else if (strm(mat_name, "rtmpam250mt" ))vector=rtmpam250mt; - - else if (strm(mat_name, "rbeta_mat" ))vector=rbeta_mat; - else if (strm(mat_name, "ralpha_mat" ))vector=ralpha_mat; - else if (strm(mat_name, "rcoil_mat" ))vector=rcoil_mat; - else if (strm (mat_name, "jtttm250mt"))vector=jtttm250mt; - - /*Header Matrices*/ - if(vector) - { - matrice=declare_int ( 256, 256); - for (a=0; a0)return matrix; - else - { - for ( b=0; br; - g=&C->g; - b=&C->b; - - if ( val==10)val--; - sprintf ( C->html_color_class, "value%d",val); - - - if (val<=9 && val>=0) - { - - sprintf ( C->html_color, "%s", html_code[val]); - r[0]=ps_code[val][0]; - g[0]=ps_code[val][1]; - b[0]=ps_code[val][2]; - } - - else if (val==DEFAULT_COLOR || val==NO_COLOR_RESIDUE || val==NO_COLOR_GAP || (val>'A' && val<'z')) - { - C->html_color[0]='\0'; - sprintf ( C->html_color_class, "valuedefault"); - r[0]=1.; - g[0]=1; - b[0]=1; - - } - else if (val==GAP_COLOR) - { - C->html_color[0]='\0'; - sprintf ( C->html_color_class, "valuegap"); - r[0]=1.; - g[0]=1; - b[0]=1; - } - else if (val==INK_COLOR ) - { - sprintf ( C->html_color, "000000"); - sprintf ( C->html_color_class, "valueink"); - r[0]=0.; - g[0]=0; - b[0]=0; - } - return; - - - } -int output_color_format ( Alignment *B,Alignment *Sin,char *name, \ -FILE_format *(*vfopen_format) ( char *),\ -FILE_format *(*print_format_string) ( char * ,Color *, Color *, FILE_format*),\ -FILE_format *(*print_format_char) ( int ,Color *, Color *, FILE_format*),\ -void (*get_rgb_values_format) ( int ,Color *),\ -FILE_format* (*vfclose_format) ( FILE_format *)) - { - int a, b, c; - int max_name_len=15; - int max_len=0; - char *buf2, *buf3; - - static char *buf; - int s; - int *n_residues; - static FILE_format *fps; - Color *ink; - Color *box_c; - Color *white; - Alignment *S; - - - S=copy_aln (B, NULL); - - buf2=vcalloc (Sin->len_aln+1, sizeof (char)); - buf3=vcalloc ( B->len_aln+1, sizeof (char)); - for ( a=0; anseq; a++) - { - int i,n, r; - - i=name_is_in_list ( B->name[a], Sin->name, Sin->nseq, -1); - if (i==-1)continue; - sprintf (buf2, "%s", Sin->seq_al[i]);ungap(buf2); - sprintf (buf3, "%s", S->seq_al[a]);ungap(buf3); - - if ( strlen (buf2) !=strlen(buf3)) - { - - fprintf ( stderr, "\nERROR: Incompatible cache ON sEQ: %s\n", S->name[a]); - fprintf ( stderr, "\n%s\n%s", buf2, buf3); - fprintf ( stderr, "\n\n%s\n%s", Sin->seq_al[i],S->seq_al[a]); exit (EXIT_FAILURE); - } - - for (n=0,b=0;blen_aln; b++) - { - r=S->seq_al[a][b]; - if (!is_gap(r)) - { - S->seq_al[a][b]=buf2[n++]; - } - } - } - - S=aln2number(S); - vfree (buf2); - - box_c=vcalloc ( 1, sizeof (Color)); - get_rgb_values_format (DEFAULT_COLOR, (white=vcalloc ( 1, sizeof (Color)))); - get_rgb_values_format (INK_COLOR, (ink =vcalloc ( 1, sizeof (Color)))); - - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; anseq; a++)n_residues[a]=B->order[a][1]; - - fps=vfopen_format( name); - if ( buf==NULL) - { - buf=vcalloc (10000, sizeof (int)); - } - - if ( max_len==0) - { - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - } - if ( max_len>max_name_len)max_len=max_name_len; - - sprintf (buf, "\n%s, %s(%s)\n%s\n",PROGRAM,VERSION,DATE, AUTHOR); - fps=print_format_string ( buf,white, ink, fps); - - fps=print_format_string ( "\n\n",white,ink, fps); - - fps->line-=max_len; - fps->line=fps->line-fps->line%3; - - - - - for (a=0; alen_aln; a+=fps->line) - { - - if ( (fps->n_line+(B->nseq+4))>fps->max_line_ppage && !((B->nseq+4)>fps->max_line_ppage)) - { - fps=print_format_char ( fps->eop,white, ink, fps); - } - - for (b=0; b<=B->nseq; b++) - { - sprintf (buf,"%-*.*s ",max_len+2, max_len,(b==B->nseq)?"":S->name[b]); - fps=print_format_string ( buf,white, ink, fps); - if(B->output_res_num) - { - sprintf (buf, " %4d ", n_residues[b]+1); - fps=print_format_string ( buf,white, ink, fps); - } - - for (fps->in_seq=1,c=a;cline && clen_aln;c++) - { - if (b==B->nseq) - { - n_residues[b]++; - get_rgb_values_format (DEFAULT_COLOR,box_c); - s=analyse_aln_column ( B, c); - } - else - { - n_residues[b]+=!is_gap(B->seq_al[b][c]); - s=B->seq_al[b][c]; - if (!is_gap(s) && S->seq_al[b][c]!=NO_COLOR_RESIDUE ) - { - get_rgb_values_format ( S->seq_al[b][c], box_c); - } - else - { - get_rgb_values_format (GAP_COLOR, box_c); - } - } - fps=print_format_char ( s,box_c, ink,fps); - } - fps->in_seq=0; - - if(B->output_res_num) - { - sprintf (buf, " %4d ", n_residues[b]); - fps=print_format_string ( buf,white, ink, fps); - } - - fps=print_format_char ( '\n', white, ink, fps); - - } - fps=print_format_string ( "\n\n",white, ink, fps); - } - fps=print_format_string ( "\n\n\n",white, ink,fps); - - - vfclose_format( fps); - free_aln (S); - vfree (n_residues); - return 1; - - } - -int output_reliability_format ( Alignment *B,Alignment *S,char *name, \ -FILE_format *(*vfopen_format) ( char *),\ -FILE_format *(*print_format_string) ( char * ,Color *, Color *, FILE_format*),\ -FILE_format *(*print_format_char) ( int ,Color *, Color *, FILE_format*),\ -void (*get_rgb_values_format) ( int ,Color *),\ -FILE_format* (*vfclose_format) ( FILE_format *)) - { - int a, b, c,l; - int max_name_len=15; - int max_len=0; - static char *buf,*buf2; - int s; - static FILE_format *fps; - Color *ink; - Color *box_c; - Color *white; - int *n_residues; - - - box_c=vcalloc ( 1, sizeof (Color)); - get_rgb_values_format (DEFAULT_COLOR, (white=vcalloc ( 1, sizeof (Color)))); - get_rgb_values_format (INK_COLOR, (ink =vcalloc ( 1, sizeof (Color)))); - - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; anseq; a++)n_residues[a]=B->order[a][1]; - - - fps=vfopen_format( name); - if ( buf==NULL) - { - buf=vcalloc (10000, sizeof (int)); - buf2=vcalloc (10000, sizeof (int)); - } - - if ( max_len==0) - { - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - } - - if ( vfopen_format==vfopen_ascii) - { - fps->line+= max_len; - } - else if ( max_len>max_name_len)max_len=max_name_len; - - - - sprintf (buf, "%s, %s(%s)\n%s\nCPU TIME:%d sec.\n%s",PROGRAM,VERSION,DATE, AUTHOR, (B->cpu+get_time())/1000, (S->generic_comment)?S->generic_comment:""); - fps=print_format_string ( buf,white, ink, fps); - sprintf (buf, "SCORE=%d\n*\n", S->score_aln); - fps=print_format_string ( buf,white, ink, fps); - - sprintf ( buf2, " BAD AVG GOOD"); - l=strlen(buf2); - get_rgb_values_format ( DEFAULT_COLOR, box_c); - fps=print_format_char ( buf2[0],box_c, ink, fps); - for ( a=1; ascore_seq && a< B->nseq; a++) - { - get_rgb_values_format (S->score_seq[a]/10, box_c); - sprintf ( buf, "%-*.*s ", max_len+2,max_len, S->name[a]); - fps=print_format_string ( buf,box_c, ink,fps); - sprintf ( buf, ": %3d\n", S->score_seq[a]); - fps=print_format_string ( buf,white, ink,fps); - } - //Print the Consensus score - get_rgb_values_format (S->score_aln/10, box_c); - sprintf ( buf, "%-*.*s ", max_len+2,max_len, S->name[S->nseq]); - fps=print_format_string ( buf,box_c, ink,fps); - sprintf ( buf, ": %3d\n", S->score_aln); - fps=print_format_string ( buf,white, ink,fps); - - fps=print_format_string ( "\n",white, ink,fps); - - - - fps->line-=max_len; - fps->line=fps->line-(fps->line%3); - - for (a=0; alen_aln; a+=fps->line) - { - - if ( (fps->n_line+(B->nseq+4))>fps->max_line_ppage && !((B->nseq+4)>fps->max_line_ppage)) - { - fps=print_format_char ( fps->eop,white, ink, fps); - } - - for (b=0; b<=S->nseq; b++) - { - if ( b==S->nseq && print_format_string !=print_ascii_string) fps=print_format_string ( "\n",white, ink, fps); - sprintf (buf,"%-*.*s ",max_len+2,max_len,S->name[b]); - fps=print_format_string ( buf,white, ink, fps); - if(B->output_res_num) - { - sprintf (buf, " %4d ", n_residues[b]+1); - fps=print_format_string ( buf,white, ink, fps); - } - - for (fps->in_seq=1,c=a;cline && clen_aln;c++) - { - if (b==S->nseq) - { - - if (S->score_seq) - { - int s; - s=S->seq_al[b][c]; - if ( s>='0' && s<='9')s-='0'; - get_rgb_values_format (s,box_c); - } - else get_rgb_values_format (DEFAULT_COLOR,box_c); - n_residues[b]++; - s=analyse_aln_column ( B, c); - } - else - { - n_residues[b]+=!is_gap(B->seq_al[b][c]); - //s=toupper(B->seq_al[b][c]); - s=B->seq_al[b][c]; - if (!is_gap(s) && S->seq_al[b][c]!=NO_COLOR_RESIDUE ) - { - get_rgb_values_format ( S->seq_al[b][c], box_c); - - } - else - { - get_rgb_values_format (GAP_COLOR, box_c); - - } - - } - fps=print_format_char ( s,box_c, ink,fps); - } - fps->in_seq=0; - - if(B->output_res_num) - { - sprintf (buf, " %4d ",n_residues[b]); - fps=print_format_string ( buf,white, ink, fps); - } - - fps=print_format_char ( '\n', white, ink, fps); - - } - fps=print_format_string ( "\n\n",white, ink, fps); - } - fps=print_format_string ( "\n\n\n",white, ink,fps); - vfclose_format( fps); - return 1; - - } - - -/*****************************************************************************/ -/* PDF FUNCTIONS */ -/* */ -/*****************************************************************************/ -int output_color_pdf ( Alignment *B,Alignment *S, char *name) - { - char *tmp_name; - char command[LONG_STRING]; - - -#ifndef PS2PDF - fprintf (stderr, "\nPDF FORMAT IS NOT SUPPORTED: INSTALL THE PROGRAM PS2PDF\n"); - myexit (EXIT_FAILURE); -#else - tmp_name=vtmpnam(NULL); - - output_color_ps (B, S, tmp_name); - sprintf ( command, "%s %s %s", PS2PDF, tmp_name, name); - my_system ( command); - vremove ( tmp_name); -#endif - - - return 1; - } -int output_reliability_pdf ( Alignment *B,Alignment *S, char *name) - { - char *tmp_name; - char command[LONG_STRING]; - - - -#ifndef PS2PDF - fprintf (stderr, "\nPDF FORMAT IS NOT SUPPORTED: INSTALL THE PROGRAM PS2PDF\n"); - myexit (EXIT_FAILURE); -#else - tmp_name=vtmpnam(NULL); - - output_reliability_ps (B, S, tmp_name); - sprintf ( command, "%s %s %s", PS2PDF, tmp_name, name); - my_system ( command); - vremove ( tmp_name); -#endif - - - return 1; - } -/*****************************************************************************/ -/* POST SCRIPT FUNCTIONS */ -/* */ -/*****************************************************************************/ -int output_color_ps ( Alignment *B,Alignment *S, char *name) - { - output_color_format (B, S, name, vfopen_ps,print_ps_string,print_ps_char,get_rgb_values_ps, vfclose_ps); - return 1; - } -int output_reliability_ps ( Alignment *B,Alignment *S, char *name) - { - output_reliability_format (B, S, name, vfopen_ps,print_ps_string,print_ps_char,get_rgb_values_ps, vfclose_ps); - return 1; - } -FILE_format *print_ps_string( char *s, Color *box, Color *ink, FILE_format *fps) - { - int l; - int a; - - l=strlen (s); - - for ( a=0; a< l; a++) - { - fps=print_ps_char (s[a], box, ink, fps); - } - return fps; - } - - -FILE_format * print_ps_char ( int c, Color *box, Color *ink, FILE_format *f) - { - - int ch; - int cw; - - ch=f->font+3; - cw=f->font-2; - - if ( c=='(' || c==')')return f; - else if (c!='\n' && c!=f->eop) - { - fprintf(f->fp,"%d %d moveto\n", f->x,f->y); - fprintf(f->fp,"0 %d rlineto\n%d 0 rlineto\n0 -%d rlineto\nclosepath\n",ch,cw,ch ); - fprintf(f->fp,"%3.1f %3.1f %3.1f setrgbcolor\nfill\n%3.1f %3.1f %3.1f setrgbcolor\n", box->r,box->g,box->b, ink->r, ink->g, ink->b); - fprintf(f->fp,"%d %d moveto\n(%c) show\n", f->x+1,f->y+3, c); - - f->x+=cw; - } - else - { - f->n_line++; - if ( f->n_line==f->max_line_ppage || c==f->eop) - { - - f->n_line=0; - f->x=f->x0; - f->y=f->y0; - fprintf(f->fp,"showpage\n"); - f->n_pages++; - fprintf ( f->fp, "%c%cPage: %d %d\n",'%', '%', f->n_pages, f->n_pages); - } - else - { - f->x=f->x0; - f->y-=ch; - } - } - return f; - } -void get_rgb_values_ps ( int val, Color *C) - { - get_rgb_values ( val, C); - } - - - -FILE_format* vfopen_ps ( char *name) - { - FILE_format*fps; - - fps=vcalloc ( 1, sizeof ( FILE_format)); - fps->font=9; - fps->max_line_ppage=60; - fps->line=get_msa_line_length (0, 0);/*N char per line*/ - fps->x0=15; - fps->y0=750; - fps->eop='^'; - - fps->fp=vfopen ( name, "w"); - fprintf(fps->fp,"%%!PS-Adobe-2.0\n/Courier findfont\n%d scalefont\nsetfont\n",fps->font); - fprintf(fps->fp, "%%%%Pages: (atend)\n"); - fprintf(fps->fp,"newpath\n"); - ++(fps->n_pages); - fprintf (fps->fp, "%%%%Page: %d %d\n", fps->n_pages, fps->n_pages); - fprintf (fps->fp,"%d %d translate\n",fps->x0, fps->y0); - return fps; - } - -FILE_format* vfclose_ps ( FILE_format *fps) - { - - fprintf(fps->fp,"showpage\n"); - fprintf ( fps->fp, "%%%%Pages: %d\n", fps->n_pages); - fprintf(fps->fp,"%%%%EOF"); - fprintf(fps->fp,"%%%%\n"); - vfclose ( fps->fp); - vfree (fps); - return NULL; - } -/*****************************************************************************/ -/* HTML FUNCTIONS */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -//JM_ADD -/*****************************************************************************/ -void output_hit_matrix(char *fileName, float **ffpHitScoreMatrix, int nl) -{ - int i, j; - FILE *fp; - - fp=vfopen(fileName, "w"); - for(i = 0; i < nl; i++) - { - for(j = 0; j < i; j++) - fprintf(fp, "%6.2f ", ffpHitScoreMatrix[j][i-j]); - for(j = i; j < nl; j++) - fprintf(fp, "%6.2f ", ffpHitScoreMatrix[i][j-i]); - fprintf(fp, "\n"); - } - vfclose(fp); -} - -int output_hit_color_html (Alignment *B, float **ffPScoreTable, int nl, char *name) -{ - output_hit_color_format (B, ffPScoreTable, nl, name, vfopen_html,print_html_string,print_html_char,get_rgb_values_html, vfclose_html); - return 1; -} - -int output_hit_color_format (Alignment *B, float **ffPScoreTable, int nl, char *name, \ -FILE_format *(*vfopen_format) ( char *),\ -FILE_format *(*print_format_string) ( char * ,Color *, Color *, FILE_format*),\ -FILE_format *(*print_format_char) ( int ,Color *, Color *, FILE_format*),\ -void (*get_rgb_values_format) ( int ,Color *),\ -FILE_format* (*vfclose_format) ( FILE_format *)) -{ - int a, b; - int max_name_len=15; - int max_len=0; - - static char *buf; - static FILE_format *fps; - Color *ink; - Color *box_c; - Color *white; - - box_c=vcalloc ( 1, sizeof (Color)); - get_rgb_values_format (DEFAULT_COLOR, (white=vcalloc ( 1, sizeof (Color)))); - get_rgb_values_format (INK_COLOR, (ink =vcalloc ( 1, sizeof (Color)))); - - if ( max_len==0) - { - for ( a=0; a< B->nseq; a++) - { - if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - } - if ( max_len>max_name_len)max_len=max_name_len; - - if ( buf==NULL) - buf=vcalloc (10000, sizeof (int)); - int iEmptyChr = 32; //SPACE ASCIICODE - int iColorValue; - fps=vfopen_format(name); - for (a=0; a < nl; a++) - { - sprintf (buf,"%*d ", max_len+2, a); - fps=print_format_string ( buf,white, ink, fps); - for(b = 0; b < a; b++) - { - iColorValue = (int)((ffPScoreTable[b][a-b]*9)/100); - get_rgb_values_format (iColorValue, box_c); - fps=print_format_char (iEmptyChr,box_c, ink,fps); - } - for(b = a; b < nl; b++) - { - iColorValue = (int)((ffPScoreTable[a][b-a]*9)/100); - get_rgb_values_format (iColorValue, box_c); - fps=print_format_char (iEmptyChr,box_c, ink,fps); - } - fps=print_format_char ('\n', white, ink, fps); - } - vfclose_format(fps); - vfree(buf); - vfree(box_c); - return 1; -} - -/*****************************************************************************/ - -int output_color_html ( Alignment *B,Alignment *S, char *name) - { - output_color_format (B, S, name, vfopen_html,print_html_string,print_html_char,get_rgb_values_html, vfclose_html); - return 1; - } -int output_reliability_html ( Alignment *B,Alignment *S, char *name) - { - output_reliability_format (B, S, name, vfopen_html,print_html_string,print_html_char,get_rgb_values_html, vfclose_html); - return 1; - } -FILE_format *print_html_string( char *s, Color *box, Color *ink, FILE_format *fhtml) - { - int l; - int a; - - l=strlen (s); - - for ( a=0; a< l; a++) - { - fhtml=print_html_char (s[a], box, ink, fhtml); - } - fhtml=print_html_char (CLOSE_HTML_SPAN,NULL,NULL,fhtml); - return fhtml; - } - - -FILE_format * print_html_char ( int c, Color *box, Color *ink, FILE_format *f) - { - char html_color[100]; - int in_span, new_color; - char string[1000]; - - - if (c==CLOSE_HTML_SPAN) - { - if (f->in_html_span)fprintf ( f->fp, ""); - f->in_html_span=0; - return f; - } - - - in_span=f->in_html_span; - new_color=1-(strm (box->html_color_class, f->previous_html_color)); - - - - sprintf (f->previous_html_color, "%s", box->html_color_class); - sprintf ( html_color, "class=%s", box->html_color_class); - - - if ( c!=' ')sprintf ( string, "%c", c); - else sprintf ( string, " "); - - if ( !in_span && c!='\n' && c!=f->eop) - { - fprintf ( f->fp, "%s",html_color,string ); - f->in_html_span=1; - } - else if (in_span && !new_color && c!='\n' && c!=f->eop) - { - - fprintf ( f->fp, "%s",string); - } - else if (in_span && new_color && c!='\n' && c!=f->eop) - { - fprintf ( f->fp, "%s",html_color,string); - } - else if ( c=='\n') - { - if ( f->in_html_span)fprintf ( f->fp, ""); - fprintf ( f->fp, "
"); - sprintf ( f->previous_html_color, "no_color_set"); - f->in_html_span=0; - f->n_line++; - } - - - - - - return f; - } - -void get_rgb_values_html ( int val, Color *C) - { - get_rgb_values ( val, C); - } - -FILE_format* vfopen_html ( char *name) - { - FILE_format*fhtml; - Color *color; - int a; - - color=vcalloc ( 1, sizeof (Color)); - - fhtml=vcalloc ( 1, sizeof ( FILE_format)); - fhtml->font=11; - fhtml->max_line_ppage=100000; - fhtml->line=get_msa_line_length (0, 0);/*N char per line*/ - fhtml->x0=15; - fhtml->y0=800; - fhtml->eop='^'; - sprintf ( fhtml->previous_html_color, "no_value_set"); - fhtml->fp=vfopen ( name, "w"); - - fprintf(fhtml->fp,"\n"); - fprintf(fhtml->fp,""); - - return fhtml; - } -FILE_format* vfclose_html ( FILE_format *fhtml) - { - if ( fhtml->in_html_span)fprintf(fhtml->fp,""); - fprintf(fhtml->fp,"\n"); - vfclose ( fhtml->fp); - vfree (fhtml); - return NULL; - } -/*****************************************************************************/ -/* ascii FUNCTIONS */ -/* */ -/*****************************************************************************/ -int output_color_ascii ( Alignment *B,Alignment *S, char *name) - { - output_color_format (B, S, name, vfopen_ascii,print_ascii_string,print_ascii_char,get_rgb_values_ascii, vfclose_ascii); - return 1; - } -int output_reliability_ascii ( Alignment *B,Alignment *S, char *name) - { - output_reliability_format (B, S, name, vfopen_ascii,print_ascii_string,print_ascii_char,get_rgb_values_ascii, vfclose_ascii); - return 1; - } - -FILE_format *print_ascii_string( char *s, Color *box, Color *ink, FILE_format *fascii) - { - int l; - int a; - - l=strlen (s); - - for ( a=0; a< l; a++) - { - fascii=print_ascii_char (s[a], box, ink, fascii); - } - return fascii; - } - - -FILE_format * print_ascii_char ( int c, Color *box, Color *ink, FILE_format *f) - { - if (box->ascii_value>=0 && f->in_seq)fprintf ( f->fp, "%c", box->ascii_value); - else fprintf ( f->fp, "%c",c); - return f; - } - - -void get_rgb_values_ascii ( int val, Color *C) - { - - if ( val==NO_COLOR_RESIDUE)C->ascii_value='-'; - else if ( val==NO_COLOR_GAP)C->ascii_value='*'; - else if ( val>9)C->ascii_value='#'; - else if ( val>=0 && val<=9) C->ascii_value=val+'0'; - else C->ascii_value=val; - } - -FILE_format* vfopen_ascii ( char *name) - { - FILE_format*fascii; - fascii=vcalloc ( 1, sizeof ( FILE_format)); - fascii->font=11; - fascii->max_line_ppage=100000; - fascii->line=get_msa_line_length (0,0);/*N char per line*/ - fascii->x0=15; - fascii->y0=800; - fascii->eop='^'; - fascii->fp=vfopen ( name, "w"); - - - return fascii; - } -FILE_format* vfclose_ascii ( FILE_format *fascii) - { - vfclose ( fascii->fp); - vfree (fascii); - return NULL; - } - - -/*****************************************************************************/ -/* seq_score output */ -/* */ -/*****************************************************************************/ - -int output_seq_reliability_ascii ( Alignment *B,Alignment *S, char *name) -{ - FILE *fp; - int a; - int max_len=0; - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - - fp=vfopen ( name, "w"); - fprintf ( fp, "ALN_SCORE %d\n", S->score_aln); - for ( a=0; a< S->nseq; a++)fprintf (fp, "SEQ_SCORE %*.*s %3d\n", max_len+2,max_len,S->name[a],S->score_seq[a]); - vfclose (fp); - - return 1; -} - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/io_lib_header.h b/binaries/src/tcoffee/t_coffee_source/io_lib_header.h deleted file mode 100644 index 45be7a4..0000000 --- a/binaries/src/tcoffee/t_coffee_source/io_lib_header.h +++ /dev/null @@ -1,1095 +0,0 @@ -/*DEBUGGING*/ -/*#include "mshell.h"*/ -/*MEMORY MANAGEMENT*/ -#include -#define MY_EPS 1000*DBL_EPSILON -//Maximum number of tries for interactibve things -#define MAX_N_TRIES 3 - -//Maximum CACHE and Temporary file size and age (Mb and days, 0: unlimited) -#define TMP_MAX_SIZE 0 -#define TMP_MAX_KEEP 10 -#define CACHE_MAX_SIZE 2000 -#define CACHE_MAX_KEEP 180 -#define MAX_N_PID 65536 -//Importnat Values Affecting the Program Behavior -#define SCORE_K 10 -#define NORM_F 1000 -#define PAVIE_MAT_FACTOR 1000 -#define MAXID 100 -#define CLEAN_FUNCTION NULL -#define MINSIM_4_TCOFFEE 25 //The minimum similarity between a sequence and its PDB template -#define MINCOV_4_TCOFFEE 25 //The minimum similarity between a sequence and its PDB template - - -#define TRACE_TYPE int -#define MAX_LEN_FOR_DP 600 - - -#define GIVE_MEMORY_BACK 0 -#define MEMSET0 1 -#define NO_MEMSET0 0 -/*OUTPUT DEFINITIONS*/ -#define NO_COLOR_RESIDUE 127 -#define NO_COLOR_GAP 126 -#define CLOSE_HTML_SPAN -1 -/*SPECIAL_CODES*/ -#define GAP_CODE 60 -/*TYPE DEFINITIONS*/ - -//Formats -#define BLAST_XML 100 -#define BLAST_TXT 101 - -/*SWITCHES*/ - - -#define USED 1 -#define UNUSED 2 - - -#define TEMPLATES 1 -#define NOTEMPLATES 0 - -#define EXTEND 1 -#define RESIZE 2 - -#define SEN 0 -#define SPE 1 -#define REC 2 -#define SEN2 2 - -#define ALL 1 -#define SEGMENTS 2 -#define DIAGONALS 3 - -#define START_STATE 0 -#define END_STATE 1 - -#define KEEP_CASE 2 /*Hard set in several places*/ -#define LOWER_CASE 0 -#define UPPER_CASE 1 -#define CHANGE_CASE 3 -#define KEEP_GAP 0 -#define RM_GAP 1 - -#define KEEP_NAME 1 - -#define CHECK 0 -#define NO_CHECK 1 -#define FORCE 2 -#define STORE 3 -#define FLUSH 4 - - -#define ON 8 -#define OFF 9 -#define LOCKED_ON 10 -#define LOCKED_OFF 11 - -#define YES 12 -#define NO 13 -#define MAYBE 14 - -#define NEVER 15 -#define ALWAYS 16 -#define SOMETIMES 17 - -#define UPPER 18 -#define LOWER 19 -#define DELETE 20 -#define SWITCHCASE 21 - -#define VECTOR 22 -#define NON_VECTOR 23 -#define NON_PROFILE 24 -#define BOOTSTRAP 25 - -#define HEADER 26 -#define NO_HEADER 27 - -#define VERY_VERBOSE 28 -#define VERBOSE 29 -#define SHORT 30 -#define VERY_SHORT 31 - -#define OVERLAP 32 -#define NO_OVERLAP 33 - -#define PRINT 34 -#define NO_PRINT 35 - -#define FREE_ALN 36 -#define DECLARE_ALN 37 -#define EXTRACT_ALN 38 -#define CLEAN 39 -#define INTERACTIVE 40 -#define NON_INTERACTIVE 41 -#define PAD 42 -#define NO_PAD 43 - -#define SET 44 -#define UNSET 45 -#define RESET 48 -#define ISSET 49 -#define GET 50 - -#define ENV 52 - -#define GOP 0 -#define GCP 1 -#define GEP 2 - -#define BOTTOM 0 -#define TOP 1 - -#define FORWARD -1 -#define BACKWARD 1 - -#define GO_LEFT -1 -#define GO_RIGHT 1 - -#define LOCAL 1 -#define GLOBAL 2 -#define LALIGN 3 -#define MOCCA 4 - -#define TRUE 1 -#define FALSE 0 - -#define NEW 1 -#define OLD 0 - -#define RANDOM 0 -#define DETERMINISTIC 1 - -#define GREEDY 1 -#define NON_GREEDY 0 - -#define IS_FATAL 1 -#define IS_NOT_FATAL 0 -#define NO_REPORT 2 -#define INSTALL 3 -#define INSTALL_OR_DIE 4 - -#define OPTIONAL 1 -#define NON_OPTIONAL 0 - -#define GV_MAXIMISE 1 -#define GV_MINIMISE 0 - -#define MAXIMISE 1 -#define MINIMISE 0 - -#define ALLOWED 0 -#define FORBIDEN -99999999 -#define END_ARRAY -99999990 -#define SOFT_COPY 1 -#define HARD_COPY 2 - -#define VERY_SLOW 0 -#define SLOW 1 -#define FAST 2 -#define VERY_FAST 3 -#define SUPER_FAST 4 -#define ULTRA_FAST 5 - -#define CODE 1 -#define DECODE 2 -#define CODELIST 3 - -/*Identity measure*/ -#define UNGAPED_POSITIONS 1 -#define ALIGNED_POSITIONS 2 -#define AVERAGE_POSITIONS 3 -#define NOMATRIX NULL -#define NOGROUP NULL -#define NOALN NULL - -/*SIZE DEFINITIONS*/ -#define SIZE_OF_INT 10 -#define UNDEFINED FORBIDEN -#define UNDEFINED_INT UNDEFINED -#define UNDEFINED_FLOAT UNDEFINED -#define UNDEFINED_DOUBLE UNDEFINED -#define UNDEFINED_CHAR 125 -#define UNDEFINED_SHORT -125 -#define UNDEFINED_2 0 -#define UNDEFINED_RESIDUE '>' - - - -#define FACTOR 1 -#define MAX_N_SEQ 1 -#define MAX_N_ALN 1 -#define MAX_LEN_ALN 1 -#define MAX_N_LIST 100 - -#define COMMENT_SIZE 1000 -#define MAXNAMES 100 -#define FILENAMELEN 500 /* Max. file name length */ -#define MAX_N_PARAM 2000 -#define MAX_PARAM_LEN 200 -#define MAX_LINE_LENGTH 10000 -#define ALN_LINE_LENGTH 60 -#define SHORT_STRING 10 -#define STRING 300 -#define LONG_STRING 1000 -#define VERY_LONG_STRING 10000 - -#define AA_ALPHABET "acdefghiklmnpqrstvwy-ACDEFGHIKLMNPQRSTVWY" -#define DNA_ALPHABET "AGCTUNRYMKSWHBVD-agctunrymkswhbvd" -#define RNAONLY_ALPHABET "Uu" -#define BLAST_AA_ALPHABET "arndcqeghilkmfpstwyvbzx*" -#define NAMES_ALPHABET "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_|�-!%@&#-+=." - -#define SIZEOF_AA_MAT 60 -#define GAP_LIST "-.#*~" -#define SSPACE " " - -#define MATCH 1 -#define UNALIGNED 2 -#define GAP 3 - -#define MNE 3 -#define CODE4PROTEINS 10 -#define CODE4DNA 20 - -#define STOCKHOLM_CHAR 'z' -#define STOCKHOLM_STRING "z" - - -/*CODE SHORT CUTS*/ - -/*1-COMMAND LINE PROCESSING*/ -#define GET_COMMAND_LINE_INFO ((strncmp ( argv[1], "-h",2)==0)||(strncmp ( argv[1], "-man",4)==0)||(strncmp ( argv[1], "-",1)!=0)) -#define NEXT_ARG_IS_FLAG ((argc<=(a+1)) ||(( argv[a+1][0]=='-') && !(is_number(argv[a+1])))) - - -/*UTIL MACROS*/ -#define BORDER(p1,l1,p2,l2) ((p1==0 || p2==0 || p1==l1 || p2==l2)?1:0) -#define GET_CASE(f,c) ((f==UPPER_CASE)?toupper(c):((f==LOWER_CASE)?tolower(c):c)) - -#define SWAP(x,y) {x=x+y;y=x+y; x=y-x; y=y-2*x;} -#define SWAPP(x,y,tp) {tp=y;y=x;x=tp;} - -#define MAX(x, y) (((x) >(y)) ? (x):(y)) -#define MAX2(x, y) (((x) >(y)) ? (x):(y)) -#define MAX3(x,y,z) (MAX(MAX(x,y),z)) -#define MAX4(a,b,c,d) (MAX(MAX(a,b),MAX(c,d))) -#define MAX5(a,b,c,d,e) (MAX2((MAX3(a,b,c)),(MAX2(d,e)))) -#define MAX6(a,b,c,d,e,f) (MAX2((MAX3(a,b,c)),(MAX3(c,d,e)))) - -#define MIN(x, y) (((x) <(y)) ? (x):(y)) -#define FABS(x) ((x<0)?(-x):(x)) -#define is_defined(x) ((x==UNDEFINED)?0:1) -#define a_better_than_b(x,y,m) ((m==1)?(((x)>(y))?1:0):(((x)<(y))?1:0)) -#define is_in_range(x,min,max) ((x>=min && x<=max)?1:0) -/*#define bod_a_b(x,y,m) ((m==1)?(MAX((x),(y))):(MIN((x),(y)))) -#define bo_a_b(x,y,m) ((x==UNEFINED)?y:((y==UNDEFINED)?x:bod_a_b(y,y,m))) -#define best_of_a_b(x,y,m) ((x==UNDEFINED && y==UNDEFINED)?(UNDEFINED):(bo_a_b(x,y,m))) -*/ - - -#define DIE(x) HERE(x);exit(0); -#define best_of_a_b(x,y,m) ((m==1)?(MAX((x),(y))):(MIN((x),(y)))) - -#define strm(x,y) ((vstrcmp((x),(y))==0)?1:0) -#define strnm(x,y,n) ((vstrncmp((x),(y),(n))==0)?1:0) -#define strm2(a,b,c) (strm(a,b) || strm(a,c)) -#define strm3(a,b,c,d) (strm2(a,b,c) || strm(a,d)) -#define strm4(a,b,c,d,e) (strm2(a,b,c) || strm2(a,d,e)) -#define strm5(a,b,c,d,e,f) (strm2(a,b,c) || strm3(a,d,e,f)) -#define strm6(a,b,c,d,e,f,g) (strm3(a,b,c,d) || strm3(a,e,f,g)) -#define declare_name(x) (x=vcalloc (MAX(FILENAMELEN,L_tmpnam)+1, sizeof (char))) -#define is_parameter(x) (x[0]=='-' && !isdigit(x[1])) - -/*Freing functions*/ -#define free_2(a, b) free(a);free(b) -#define free_1(a) free(a) -#define free_3(a, b, c) free_2(a,b);free_1(c) -#define free_4(a, b, c,d) free_2(a,b);free_2(c,d) -#define free_5(a, b, c,d,e) free_3(a,b,e);free_2(c,d) -#define free_6(a, b, c,d,e,f) free_3(a,b,e);free_3(c,d,f) -#define free_7(a, b, c,d,e,f,g) free_3(a,b,e);free_4(c,d,f,g) -/*2-FILE PARSING*/ -#define SEPARATORS "\n \t,;" -#define LINE_SEPARATOR "\n#TC_LINE_SEPARATOR\n" -#define TC_REC_SEPARATOR "#### TC REC SEPARATOR ###" - -/*END 1-*/ - - -/*WIDOWS/UNIX DISTINCTIONS -#if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__) || defined(__MSDOS__) || defined(__DOS__) || defined(__NT__) || defined(__WIN32__) -#define WIN32 -#define TO_NULL_DEVICE " >nul" -#define NULL_DEVICE "nul" -#define CWF "/" -#else -#define TO_NULL_DEVICE " >/dev/null 2>&1" -#define NULL_DEVICE "/dev/null" -*/ - -#if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__) || defined(__MSDOS__) || defined(__DOS__) || defined(__NT__) || defined(__WIN32__) -#define WIN32 -#define TO_NULL_DEVICE " >>t_coffee.log" -#define NULL_DEVICE "t_coffee.log" -#define CWF "/" /*ClustalW Flag*/ -#else -#define TO_NULL_DEVICE " >>/dev/null 2>&1" -#define NULL_DEVICE "/dev/null" - - -#define CWF "-" /*ClustaW Flag*/ -#endif - -/*Generic Data*/ -#define EMAIL "cedric.notredame@europe.com" -#define URL "http://www.tcoffee.org" - -#define PERL_HEADER "#!/usr/bin/env perl" - -//Optimize the Score Computation in DP -#define TC_SCORE_2(x,y) (SCORE_K*CL->M[Aln->seq_al[l_s[0][0]][x]-'A'][Aln->seq_al[l_s[1][0]][y]-'A']-SCORE_K*CL->nomatch) -#define TC_SCORE_N(x,y) ((CL->get_dp_cost)(Aln, pos, ns[0], l_s[0], x, pos, ns[1], l_s[1], y, CL)) -#define TC_SCORE(x,y) ((CL->get_dp_cost==slow_get_dp_cost && CL->evaluate_residue_pair==evaluate_matrix_score && ns[0]+ns[1]==2 && x>=0 && j>=0)? (TC_SCORE_2(x,y)):(TC_SCORE_N(x,y))) - -#define NULL_2 NULL,NULL -#define NULL_3 NULL_2,NULL -#define NULL_4 NULL_2,NULL_2 -#define NULL_5 NULL_3,NULL_2 -#define NULL_6 NULL_4,NULL_2 -#define NULL_7 NULL_5,NULL_2 -typedef struct - { - char *mode; - char *comments; - int nseq; - char **seq_name; - float **PW_SD; - float **PW_ID; - float *SEQ_W; - }Weights; - -typedef struct - { - int **list; - int tot_list; - int **stem; - int tot_stem; - int n_fields; - int nseq; - int *len; - int ***struc; - struct Sequence *S; - }Structure; - -struct Sequence - { - char **file; /* file[Nseq][FILENAMELEN] name of the file that contributed each sequence*/ - char **seq_comment; /* seq_comment[Nseq][LONG_STRING] comment read in the file */ - char **aln_comment; /*id*/ - char **seq; /*seq[Nseq][sequence] sequences*/ - int *len; /*len[Nseq] length of each sequence*/ - int max_len; /*Lenght of the longest seq */ - int min_len; /*Length of the shortest seq*/ - int nseq; /*nseq*/ - int max_nseq; /*Maximum number of sequences in the datastruct*/ - char **name; /*name[Nseq][MAXNAMELEN]*/ - int **dc; /*coordinates on the disk. Coordinates set if seq[i]==NULL -/*Constraint list*/ - struct Constraint_list *CL; - int contains_gap; /*set to 1 if gaps are to be kept*/ - char *type; /*PROTEIN, DNA*/ - Weights *W; /*Associated weights*/ - char template_file[FILENAMELEN+1]; - struct Template **T; - -}; -typedef struct Sequence Sequence; - -//_E_ -struct Template -{ - char seq_type[10]; - struct X_template *P;//PDB structure - struct X_template *F;//RNA secondary structure - struct X_template *S;//sequence - struct X_template *R;//Profile - struct X_template *G;//Genomic structure - struct X_template *T;//transmembrane - struct X_template *E;//secondary structure - struct X_template *U;//Unicode, strings - - struct X_template *RB; -}; -typedef struct Template Template; -//_E_ -struct X_template -{ - char seq_name[FILENAMELEN+1]; - char template_type[FILENAMELEN+1]; - char template_format[100]; - char template_name[FILENAMELEN+1]; - char template_file[FILENAMELEN+1]; - - struct P_template *VP; - struct F_template *VF; - struct S_template *VS; - struct R_template *VR; - struct G_template *VG; - struct T_template *VT; - struct E_template *VE; - struct U_template *VU; - - -}; -typedef struct X_template X_template; - -// -struct P_template -{ - char pdb_id[100]; -}; -typedef struct P_template P_template; - -//RNA secondary Structure -struct F_template -{ - int l; -}; -typedef struct F_template F_template; - - -struct S_template -{ - Sequence *S; -}; -typedef struct S_template S_template; - -//Prile associated with a sequence -struct R_template -{ - struct Alignment *A; -}; -typedef struct R_template R_template; - -//Genomic Information -struct G_template -{ - Sequence *S; -}; -typedef struct G_template G_template; - - -struct T_template -{ - Sequence *S; -}; -typedef struct T_template T_template; - -//_E_ -struct E_template -{ - Sequence *S; -}; -typedef struct E_template E_template; - -struct U_template -{ - int *list; -}; -typedef struct U_template U_template; - - -typedef struct - { - int max_len; - int alp_size; - char *alphabet; - int **count3; - int **count; - int **count2; - }Profile; - -struct Alignment - { -/*Size*/ - int max_len; - int min_len; - int * len; - //int *weight; - int declared_len; - int max_n_seq; - int nseq; - int len_aln; -/*Generic Information*/ - char *generic_comment; -/*Sequence Information*/ - char **file; - char **seq_comment; - char **aln_comment; - char **name; - - char **expanded_order; - char **tree_order; - char **seq_al; - - int **order; - Profile *P; - Sequence *S; - struct Dp_Result *Dp_result; - struct Constraint_list *CL; - - int **seq_cache; /*Contains the index of the residues: - The sequence Numbering is relative to the sequences, and not to the alignmnent - - seq_cache[0][1]=3 - indicates that in the aln residue (0)1 corresponds to [order[0][0]][3] - residues: 1...N - Sequences 0...M - */ - int **cdna_cache; /*Contains the information about wheather a nucleotide is coding or not*/ - /*Only defined if used */ - - - -/*Score*/ - int * score_seq; - int ** score_res; - int score_aln; - int score; - - int cpu; - int finished; - -/*Input/Output Options*/ - int output_res_num; - int residue_case; /*1 for lower, 0 for Upper, 2 for keeping unchanged*/ - int expand; -/*Must Not be copied*/ - int used; - int num; - int **pos; -/*For linked lists*/ - struct Alignment * A; - /*Misc*/ - int random_tag; - - }; - -typedef struct Alignment Alignment; -typedef struct - { - int in_seq; - FILE *fp; - int font; - int x0; - int y0; - int x; - int y; - int n_pages; - int max_line_ppage; - int n_line; - int line; - int eop; - int in_html_span; - char previous_html_color[100]; - - } -FILE_format; - -typedef struct - { - float r; - float g; - float b; - char html_color[30]; - char html_color_class[30]; - int ascii_value; - } -Color; - - -Sequence * fill_sequence_struc ( int nseq, char **sequences, char **seq_name); -Sequence * cw_read_sequences ( char *seq_name); -Sequence * get_sequence_type (Sequence *S); -char * get_array_type (int n, char **s); -Alignment* get_aln_type (Alignment *A); - -char * get_string_type (char *string); - -char *store_mode (char *val); -char *retrieve_mode (); -char *unset_mode (); -char *set_mode (int mode, char *val); - -char *store_seq_type (char *val); -char *retrieve_seq_type (); -char *unset_seq_type (); -char *set_seq_type (int mode, char *val); - -void get_sequence (char *seq_file,int *NSEQ, char ***SEQ, char ***SN, int **sl, int *min, int *max); - -int ** get_matrix ( char *name, char *format); -int ** read_matrice (char *mat_name); -int **neg_matrix2pos_matrix ( int **matrix); - - -void print_aln ( Alignment *B); - -int output_reliability_ps ( Alignment *B,Alignment *S, char *name); -int output_reliability_pdf ( Alignment *B,Alignment *S, char *name); -int output_reliability_html ( Alignment *B,Alignment *S, char *name); -int output_color_ps ( Alignment *B,Alignment *S, char *name); -int output_color_pdf ( Alignment *B,Alignment *S, char *name); -int output_color_html ( Alignment *B,Alignment *S, char *name); -int output_hit_color_html (Alignment *B, float **ffPScoreTable, int nl, char *name); //JM_ADD -void output_hit_matrix(char *fileName, float **ffpHitScoreMatrix, int nl); //JM_ADD -void get_rgb_values(int val, Color *C); -int output_reliability_format ( Alignment *B,Alignment *S, char *name, \ -FILE_format *(*vfopen_format) ( char *),\ -FILE_format *(*print_format_string) ( char * ,Color *, Color *, FILE_format*),\ -FILE_format *(*print_format_char) ( int ,Color *, Color *, FILE_format*),\ -void (*get_rgb_values_format) ( int ,Color *),\ -FILE_format* (*vfclose_format) ( FILE_format *)); -int output_score_format ( Alignment *B,Alignment *S, char *name, \ -FILE_format *(*vfopen_format) ( char *),\ -FILE_format *(*print_format_string) ( char * ,Color *, Color *, FILE_format*),\ -FILE_format *(*print_format_char) ( int ,Color *, Color *, FILE_format*),\ -void (*get_rgb_values_format) ( int ,Color *),\ -FILE_format* (*vfclose_format) ( FILE_format *)); - - -FILE_format * print_ps_string ( char *s , Color *box, Color *ink, FILE_format *f); -FILE_format * print_ps_char ( int c, Color *box, Color *ink, FILE_format *f); - - - -void get_rgb_values_ps ( int val, Color *C); -FILE_format* vfopen_ps ( char *name); -FILE_format* vfclose_ps ( FILE_format *fps); - -FILE_format *print_html_string( char *s, Color *box, Color *ink, FILE_format *fhtml); -FILE_format * print_html_char ( int c, Color *box, Color *ink, FILE_format *f); -void get_rgb_values_html ( int val, Color *C); -FILE_format* vfopen_html ( char *name); -FILE_format* vfclose_html ( FILE_format *fhtml); - -int output_reliability_ascii ( Alignment *B,Alignment *S, char *name); -int output_color_ascii ( Alignment *B,Alignment *S, char *name); - -FILE_format *print_ascii_string( char *s, Color *box, Color *ink, FILE_format *fascii); -FILE_format * print_ascii_char ( int c, Color *box, Color *ink, FILE_format *f); -void get_rgb_values_ascii ( int val, Color *C); - -FILE_format* vfopen_ascii ( char *name); -FILE_format* vfclose_ascii ( FILE_format *fascii); -int output_seq_reliability_ascii ( Alignment *B,Alignment *S, char *name); -/*********************CLUSTALW.H*********************************************/ -/****************************************************************************/ - - /* - Main header file for ClustalW. Uncomment ONE of the following 4 lines - depending on which compiler you wish to use. - */ - -#define VMS 1 /*VAX or ALPHA VMS */ - -/*#define MAC 1 Think_C for MacIntosh */ - -/*#define MSDOS 1 Turbo C for PC's */ - -/*#define UNIX 1 Ultrix/Decstation, Gnu C for - Sun, IRIX/SGI, OSF1/ALPHA */ - -/***************************************************************************/ -/***************************************************************************/ - - - - - -#define MAXTITLES 60 /* Title length */ - - -#define UNKNOWN 0 -#define EMBLSWISS 1 -#define PIR 2 -#define PEARSON 3 -#define GDE 4 -#define CLUSTAL 5 /* DES */ -#define MSF 6 /* DES */ -#define USER 7 /* DES */ - -#define PAGE_LEN 22 /* Number of lines of help sent to screen */ - -#ifdef VMS /* Defaults for VAX VMS */ -#define DIRDELIM ']' /* Last character before file name in full file - specs */ -#define SEQ_MAX_LEN 10000 /* Max Sequence Length */ -#define MAXN 500 /* Max Number of Sequences */ -#define FSIZE 25000 /* Work space for pairwise alignments */ -#define MAXTREE 5000 /* Max Nodes for phylogenetic tree */ -#define LINELENGTH 60 /* Output line length */ -#define GCG_LINELENGTH 50 /* Output line length for GCG output */ - -#elif MAC -#define DIRDELIM ':' -#define SEQ_MAX_LEN 1000 -#define MAXN 30 -#define FSIZE 5000 -#define MAXTREE 1000 -#define LINELENGTH 50 -#define GCG_LINELENGTH 50 - - -#elif MSDOS -#define DIRDELIM '\\' -#define SEQ_MAX_LEN 1300 -#define MAXN 30 -#define FSIZE 5000 -#define MAXTREE 1000 -#define LINELENGTH 50 -#define GCG_LINELENGTH 50 - -#elif UNIX -#define DIRDELIM '/' -#define SEQ_MAX_LEN 10000 -#define MAXN 500 -#define FSIZE 25000 -#define MAXTREE 5000 -#define LINELENGTH 60 -#define GCG_LINELENGTH 50 -#endif - -#define NUMRES 26 /* max size of comparison matrix */ - -#define INPUT 0 -#define ALIGNED 1 - -#define LEFT 1 -#define RIGHT 2 - -#define NODE 0 -#define LEAF 1 - -#define GAPCOL 32 /* position of gap open penalty in profile */ -#define LENCOL 33 /* position of gap extension penalty in profile */ - -typedef struct node { /* phylogenetic tree structure */ - struct node *left; - struct node *right; - struct node *parent; - float dist; - int leaf; - int order; - char name[64]; -} stree, *treeptr; - -void *ckalloc(size_t); -void * ckvrealloc(void *,size_t); -void ckfree(void *); - -int readseqs(char *saga_file,char ***SAGA_SEQ, char*** SAGA_NAMES, int ***SAGA_LEN) ;/*first_seq is the #no. of the first seq. to read */ - - -typedef struct treesim{ - float w; - float uw; - float d; - - float max_w; - float max_uw; - float max_d; - - int rf; - int n;//n nodes; - int nseq;// nseq in the common subset - }Tree_sim; - - -typedef struct tnode *NT_node; - -/** -* Node of a tree -*/ -typedef struct tnode{ - int visited; - char *name; - char *file; - - ///The parent node - NT_node parent; - ///Left child node - NT_node left; - ///Right child node - NT_node right; - NT_node bot; - /// is leaf? - int isseq; - int seq; - int maxnseq; - int nseq; - - ///contains a list of the sequences - int *lseq; - ///contains a coded version of the node: 10010101 - int *lseq2; - ///contains distances to the root, in nodes - int *idist; - ///contains real distances *1000 - int *ldist; - float dist; - float bootstrap; - float dp; - int order; - int aligned; - ///Number of leave below the considered node - int leaf; - ///Number of nodes below the considered node - int node; - int group; - float score; - int align; - char *seqal; - int index; - int fork; - }Treenode; - -typedef struct split_struc Split; - -typedef struct split_struc{ - char *split; - int n; - int tot; - float score; - char **tlist;//Not used yet - Sequence *S; - NT_node *L; -}Split_struc; - -NT_node main_prune_tree ( NT_node T, Sequence *S); -NT_node prune_tree ( NT_node T, Sequence *S); -/*********************************************************************/ -/* */ -/* dpa_tree_manipulation */ -/* */ -/* */ -/*********************************************************************/ -char *tree2Ngroup (Alignment *A, NT_node T, int max_n, char *fname, char *mat4dist); -int tree2group_file ( NT_node T,Sequence *S, int maxnseq, int minsim, char *name); - -NT_node seq2dpa_tree (Sequence *S, char *align_mode); -NT_node tree2dpa_tree (NT_node T, Alignment *A, char *matrix4distance); -FILE * tree2group ( NT_node T,Sequence *S,int maxnseq, int mindist,char *name, FILE *fp); - - -NT_node tree2collapsed_tree (NT_node T, int n, char **string); - -/*********************************************************************/ -/* */ -/* tree comparison */ -/* */ -/* */ -/*********************************************************************/ -int main_compare_cog_tree (NT_node T1, char *cogfile); -int main_compare_aln_tree (NT_node T1, Alignment *A, FILE *fp); -int compare_aln_tree (NT_node T, Alignment *A, int *n, FILE *fp); - -int main_compare_splits (NT_node T1, NT_node T2, char *mode, FILE *fp); -Tree_sim * tree_cmp( NT_node T1, NT_node T2); -NT_node tree_scan (Alignment *A,NT_node RT, char *pscan, char *ptree); - - -NT_node main_compare_trees ( NT_node T1, NT_node T2, FILE *fp); -float compare_trees ( NT_node T1, NT_node T2, int nseq, int mode); -float search_node ( NT_node B, NT_node T, int nseq, int mode); -float evaluate_node_similarity ( NT_node B, NT_node T, int nseq, int mode); - -int compare_node ( int *b1, int *b2, int n); -void display_node (NT_node N, char *string,int nseq); -NT_node index_tree_node (NT_node T); -NT_node simple_recode_tree (NT_node T, int nseq); -NT_node recode_tree ( NT_node T, Sequence *S); -int compare_branch2 ( int *b1, int *b2, int n); - -/*********************************************************************/ -/* */ -/* FJ_tree Computation */ -/* */ -/* */ -/*********************************************************************/ -NT_node similarities_file2tree (char *mat); -NT_node tree_compute ( Alignment *A, int n, char ** arg_list); -static NT_node compute_std_tree (Alignment *A, int n, char **arg_list); -NT_node compute_std_tree_2 (Alignment *A, int **s, char *arg_list); -NT_node aln2fj_tree(NT_node T, Alignment *A, int limit,char* mode); -Alignment * filter_aln4tree (Alignment *A, int n,int fg,char* mode); - -/*********************************************************************/ -/* */ -/* Tree Filters and MAnipulation */ -/* */ -/* */ -/*********************************************************************/ -int tree2star_nodes (NT_node R, int n_max); -NT_node aln2tree (Alignment *A); -NT_node reset_boot_tree ( NT_node R, int n); -NT_node tree_dist2normalized_tree_dist ( NT_node R, float max); -NT_node reset_dist_tree ( NT_node R, float n); -NT_node* free_treelist ( NT_node *R); -NT_node free_tree ( NT_node R); -NT_node realloc_tree( NT_node R, int n); -NT_node free_tree_node ( NT_node R); - -Sequence * tree2seq (NT_node R, Sequence *S); -NT_node rename_seq_in_tree ( NT_node R, char ***list); - -NT_node balance_tree (NT_node); -int tree2nseq ( NT_node R); -int tree_file2nseq ( char *file); - -int tree2nleaf ( NT_node R); -int tree2nnode ( NT_node R); -int tree2_nnode_unresolved (NT_node R, int *l); - -FILE* display_tree ( NT_node R, int n, FILE *fp); -void clear_tree (NT_node T); -int display_leaf ( NT_node T, FILE *fp); -int display_leaf_below_node ( NT_node T, FILE *fp); -NT_node display_leaf_nb (NT_node T, int n, FILE *fp, char *name); -NT_node display_splits (NT_node T,Sequence *S, FILE *fp); -int tree2split_list (NT_node T, int nseq, int **split_list, int *n); - -NT_node reroot_tree ( NT_node TREE, NT_node T); -NT_node straighten_tree ( NT_node P, NT_node C, float new_dist); -NT_node unroot_tree ( NT_node T); -FILE* print_tree_list ( NT_node *T,char *format, FILE *fp); -FILE* print_tree ( NT_node T,char *format, FILE *fp); -char *tree2string (NT_node T); -char *tree2file (NT_node T, char *name, char *mode); - -int print_newick_tree ( NT_node T, char *name); -FILE * rec_print_tree ( NT_node T, FILE *fp); - - -NT_node find_longest_branch ( NT_node T, NT_node L); -NT_node shift_root ( NT_node R); - -int ** tree2cluster (NT_node T, float thres); -int ** make_sub_tree_list ( NT_node **T, int nseq, int n_node); -void make_all_sub_tree_list ( NT_node N, int **list, int *n); -void make_one_sub_tree_list ( NT_node T, int *list); -NT_node main_read_tree(char *treefile); - -NT_node new_read_tree ( char *teefile); -NT_node new_get_node (NT_node T, FILE *fp); - - -NT_node** simple_read_tree(char *treefile); -void free_read_tree (NT_node **BT); -NT_node** read_tree(char *treefile, int *nnodes,int nseq, char **seq_names); -FILE * create_linear_tree ( char **name, int n, FILE *fp); -FILE * create_tree(NT_node ptree, NT_node parent,int *numseq,int *ntotal,int *nnodes,NT_node **lu, FILE *fp); -NT_node declare_tree_node (int nseq); -void set_info(NT_node p, NT_node parent, int pleaf, char *pname, float pdist, float bootstrap); -NT_node insert_tree_node(NT_node pptr); -FILE * skip_space(FILE *fd); -void create_tree_node(NT_node pptr, NT_node parent); -float calc_mean(NT_node nptr, float *maxdist, int nseq,NT_node **lu); -NT_node insert_root(NT_node p, float diff); -float calc_root_mean(NT_node root, float *maxdist, int neq, NT_node **lu); -NT_node reroot(NT_node ptree, int nseq, int ntotal, int nnodes, NT_node **lu); - - -Alignment *seq2seq_chain (Alignment *A,Alignment *B, char *arg); - -float display_avg_bootstrap ( NT_node T); -float tree2tot_dist ( NT_node T, int mode); -int tree2n_branches(NT_node T, int mode); -int **display_tree_from_node (NT_node T, int up, int down, int **array); -NT_node tree2node ( char *name, NT_node T); -NT_node * tree2node_list (NT_node T, NT_node *L); -NT_node tree2root ( NT_node T); -int new_tree_sort ( char *name, NT_node T); - - -NT_node split2tree ( NT_node RT,Sequence *LIST, char *param); -NT_node * read_tree_list (Sequence *S); - -int count_groups( Sequence *S, char *s); - -Split ** count_splits( NT_node RT, Sequence *S, char *s); -NT_node *treelist2prune_treelist (Sequence *S, Sequence *TS, FILE *out); -int** treelist2groups (Sequence *S, Sequence *ST, char *depth, FILE *out); -int treelist2splits (Sequence *S, Sequence *ST); -int treelist2leafgroup ( Sequence *S, Sequence *TS, char *taxon); -int ***tree2dist ( NT_node T, Sequence *S, int ***d); -int treelist2frame (Sequence *S, Sequence *TS); -int** treelist2lti ( Sequence *S, Sequence *TS, int nb, FILE *out); - -float simple_tree_cmp (NT_node T1, NT_node T2,Sequence *S, int mode); - -int treelist2dmat ( Sequence *S); -NT_node new_declare_tree_node (); -int count_tree_groups( Sequence *LIST, char *group_file); -int node_sort ( char *name, NT_node T); -int treelist2n (NT_node *L); -int ** treelist2avg_treecmp (NT_node *L, char *file); -NT_node treelist2bootstrap ( NT_node *L, char *file); -NT_node treelist2filtered_bootstrap ( NT_node *L, char *file, int **score,float f); - -Sequence * treelist2seq ( Sequence *S); -Sequence * treelist2sub_seq ( Sequence *S, int f); - -/* General purpose header file - rf 12/90 */ - -#ifndef _H_general -#define _H_general - - - -#define pint int /* cast ints in printf statements as pint */ -typedef int Boolean; /* Is already defined in THINK_C */ - -#undef TRUE -#undef FALSE -#define TRUE 1 -#define FALSE 0 - -#define EOS '\0' /* End-Of-String */ -#define MAXLINE 512 /* Max. line length */ - - -#endif /* ifndef _H_general */ -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/makefile b/binaries/src/tcoffee/t_coffee_source/makefile deleted file mode 100644 index 4c17909..0000000 --- a/binaries/src/tcoffee/t_coffee_source/makefile +++ /dev/null @@ -1,11 +0,0 @@ - -t_coffee: util_constraints_list.o util_job_handling.o util_dps.o util_domain_constraints_list.o util_analyse_constraints_list.o util_aln_analyze.o aln_convertion_util.o util_declare.o hsearch.o random.o util_make_tree.o util.o reformat_struc.o reformat.o aln_compare.o io_func.o pb_util_read_sequence.o pb_util_read_seq_util.o tree_util.o util_graph_maln.o util_dp_clean_maln.o util_dp_ssec_pwaln.o util_dp_sim.o util_dp_mm_nw.o util_dp_gotoh_nw.o util_dp_suboptimal_nw.o util_dp_cdna_fasta_nw.o util_dp_generic_fasta_nw.o util_dp_fasta_nw.o util_dp_fasta_sw.o util_dp_gotoh_sw.o util_dp_est.o util_domain_dp_drivers.o util_dp_drivers.o util_domain_dp.o CUSTOM_evaluate_for_struc.o evaluate_for_struc.o evaluate_for_domain.o evaluate_dirichlet.o evaluate.o showpair.o fsa_dp.o pavie_dp.o dev1.o dev2.o dev3.o dev4.o fastal.o parttree.o t_coffee.o - $(CC) $(CFLAGS) -o t_coffee util_constraints_list.o util_job_handling.o util_dps.o util_domain_constraints_list.o util_analyse_constraints_list.o util_aln_analyze.o aln_convertion_util.o util_declare.o hsearch.o random.o util_make_tree.o util.o reformat_struc.o reformat.o aln_compare.o io_func.o pb_util_read_sequence.o pb_util_read_seq_util.o tree_util.o util_graph_maln.o util_dp_clean_maln.o util_dp_ssec_pwaln.o util_dp_sim.o util_dp_mm_nw.o util_dp_gotoh_nw.o util_dp_suboptimal_nw.o util_dp_cdna_fasta_nw.o util_dp_generic_fasta_nw.o util_dp_fasta_nw.o util_dp_fasta_sw.o util_dp_gotoh_sw.o util_dp_est.o util_domain_dp_drivers.o util_dp_drivers.o util_domain_dp.o CUSTOM_evaluate_for_struc.o evaluate_for_struc.o evaluate_for_domain.o evaluate_dirichlet.o evaluate.o showpair.o fsa_dp.o pavie_dp.o dev1.o dev2.o dev3.o dev4.o fastal.o parttree.o t_coffee.o -lm - -all: t_coffee TMalign - -clean: - rm *.o - -TMalign: - $(FCC) TMalign.f -o TMalign diff --git a/binaries/src/tcoffee/t_coffee_source/matrices.h b/binaries/src/tcoffee/t_coffee_source/matrices.h deleted file mode 100644 index 8340059..0000000 --- a/binaries/src/tcoffee/t_coffee_source/matrices.h +++ /dev/null @@ -1,960 +0,0 @@ - -char *amino_acid_order = "ABCDEFGHIKLMNPQRSTVWXYZ"; - -//Jones Taylor Thornton, tm matrix, -//H JOND940101 -//D The 250 PAM transmembrane protein exchange matrix (Jones et al., 1994) -//R LIT:2006072 PMID:8112466 -//A Jones, D.T., Taylor, W.R. and Thornton, J.M. -//T A mutation data matrix for transmembrane proteins -//J FEBS Lett. 339, 269-275 (1994) -int jtttm250mt[]={ - 2, - 0, 0, - 0, 0, 6, - 0, 0, -3, 12, - 0, 0, -3, 8, 13, - -2, 0, 1, -6, -6, 5, - 1, 0, -1, 3, 3, -4, 6, - -3, 0, -1, 3, 2, -3, -3, 11, - 0, 0, -1, -3, -4, -1, -2, -4, 2, - -2, 0, -3, 3, 1, -5, -1, 4, -4, 12, - -2, 0, -1, -5, -5, 1, -4, -4, 1, -4, 3, - -1, 0, -1, -3, -3, 0, -3, -3, 1, -1, 1, 3, - -1, 0, -1, 6, 1, -4, -2, 3, -3, 5, -4, -2, 11, - 0, 0, -4, -2, -3, -4, -2, -4, -3, -4, -1, -3, -2, 11, - -2, 0, -3, 2, 7, -4, -1, 7, -4, 6, -2, -2, 3, 0, 11, - -1, 0, -1, 1, 2, -4, 0, 5, -3, 9, -3, 0, 2, -3, 6, 7, - 2, 0, 1, 0, 0, -1, 1, -2, -1, -1, -2, -2, 2, -1, -1, -1, 3, - 1, 0, 0, 0, -1, -2, 0, -2, 0, -2, -1, 0, 1, -1, -2, -1, 2, 3, - 0, 0, 0, -3, -2, -1, -1, -4, 2, -4, 0, 1, -3, -3, -4, -2, -1, 0, 2, - -4, 0, 1, -4, -3, -3, -2, -1, -3, 3, -2, -2, -3, -6, 0, 5, -3, -4, -2, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 3, -2, -5, 2, -5, 6, -4, 1, -3, -3, -1, -5, 0, -1, 0, -3, -4, -2, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - - -int blosum30mt[]={ - 4, - 0, 5, - -3, -2, 17, - 0, 5, -3, 9, - 0, 0, 1, 1, 6, - -2, -3, -3, -5, -4, 10, - 0, 0, -4, -1, -2, -3, 8, - -2, -2, -5, -2, 0, -3, -3, 14, - 0, -2, -2, -4, -3, 0, -1, -2, 6, - 0, 0, -3, 0, 2, -1, -1, -2, -2, 4, - -1, -1, 0, -1, -1, 2, -2, -1, 2, -2, 4, - 1, -2, -2, -3, -1, -2, -2, 2, 1, 2, 2, 6, - 0, 4, -1, 1, -1, -1, 0, -1, 0, 0, -2, 0, 8, - -1, -2, -3, -1, 1, -4, -1, 1, -3, 1, -3, -4, -3, 11, - 1, -1, -2, -1, 2, -3, -2, 0, -2, 0, -2, -1, -1, 0, 8, - -1, -2, -2, -1, -1, -1, -2, -1, -3, 1, -2, 0, -2, -1, 3, 8, - 1, 0, -2, 0, 0, -1, 0, -1, -1, 0, -2, -2, 0, -1, -1, -1, 4, - 1, 0, -2, -1, -2, -2, -2, -2, 0, -1, 0, 0, 1, 0, 0, -3, 2, 5, - 1, -2, -2, -2, -3, 1, -3, -3, 4, -2, 1, 0, -2, -4, -3, -1, -1, 1, 5, - -5, -5, -2, -4, -1, 1, 1, -5, -3, -2, -2, -3, -7, -3, -1, 0, -3, -5, -3, 20, - 0, -1, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -2, -1, - -4, -3, -6, -1, -2, 3, -3, 0, -1, -1, 3, -1, -4, -2, -1, 0, -2, -1, 1, 5, -1, 9, - 0, 0, 0, 0, 5, -4, -2, 0, -3, 1, -1, -1, -1, 0, 4, 0, -1, -1, -3, -1, 0, -2, 4}; - -int blosum40mt[]={ - 5, - -1, 5, - -2, -2, 16, - -1, 6, -2, 9, - -1, 1, -2, 2, 7, - -3, -3, -2, -4, -3, 9, - 1, -1, -3, -2, -3, -3, 8, - -2, 0, -4, 0, 0, -2, -2, 13, - -1, -3, -4, -4, -4, 1, -4, -3, 6, - -1, 0, -3, 0, 1, -3, -2, -1, -3, 6, - -2, -3, -2, -3, -2, 2, -4, -2, 2, -2, 6, - -1, -3, -3, -3, -2, 0, -2, 1, 1, -1, 3, 7, - -1, 4, -2, 2, -1, -3, 0, 1, -2, 0, -3, -2, 8, - -2, -2, -5, -2, 0, -4, -1, -2, -2, -1, -4, -2, -2, 11, - 0, 0, -4, -1, 2, -4, -2, 0, -3, 1, -2, -1, 1, -2, 8, - -2, -1, -3, -1, -1, -2, -3, 0, -3, 3, -2, -1, 0, -3, 2, 9, - 1, 0, -1, 0, 0, -2, 0, -1, -2, 0, -3, -2, 1, -1, 1, -1, 5, - 0, 0, -1, -1, -1, -1, -2, -2, -1, 0, -1, -1, 0, 0, -1, -2, 2, 6, - 0, -3, -2, -3, -3, 0, -4, -4, 4, -2, 2, 1, -3, -3, -3, -2, -1, 1, 5, - -3, -4, -6, -5, -2, 1, -2, -5, -3, -2, -1, -2, -4, -4, -1, -2, -5, -4, -3, 19, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -2, -1, -1, 0, 0, -1, -2, -1, - -2, -3, -4, -3, -2, 4, -3, 2, 0, -1, 0, 1, -2, -3, -1, -1, -2, -1, -1, 3, -1, 9, - -1, 2, -3, 1, 5, -4, -2, 0, -4, 1, -2, -2, 0, -1, 4, 0, 0, -1, -3, -2, -1, -2, 5}; - -int blosum45mt[]={ - 5, - -1, 4, - -1, -2, 12, - -2, 5, -3, 7, - -1, 1, -3, 2, 6, - -2, -3, -2, -4, -3, 8, - 0, -1, -3, -1, -2, -3, 7, - -2, 0, -3, 0, 0, -2, -2, 10, - -1, -3, -3, -4, -3, 0, -4, -3, 5, - -1, 0, -3, 0, 1, -3, -2, -1, -3, 5, - -1, -3, -2, -3, -2, 1, -3, -2, 2, -3, 5, - -1, -2, -2, -3, -2, 0, -2, 0, 2, -1, 2, 6, - -1, 4, -2, 2, 0, -2, 0, 1, -2, 0, -3, -2, 6, - -1, -2, -4, -1, 0, -3, -2, -2, -2, -1, -3, -2, -2, 9, - -1, 0, -3, 0, 2, -4, -2, 1, -2, 1, -2, 0, 0, -1, 6, - -2, -1, -3, -1, 0, -2, -2, 0, -3, 3, -2, -1, 0, -2, 1, 7, - 1, 0, -1, 0, 0, -2, 0, -1, -2, -1, -3, -2, 1, -1, 0, -1, 4, - 0, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 2, 5, - 0, -3, -1, -3, -3, 0, -3, -3, 3, -2, 1, 1, -3, -3, -3, -2, -1, 0, 5, - -2, -4, -5, -4, -3, 1, -2, -3, -2, -2, -2, -2, -4, -3, -2, -2, -4, -3, -3, 15, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -2, -1, - -2, -2, -3, -2, -2, 3, -3, 2, 0, -1, 0, 0, -2, -3, -1, -1, -2, -1, -1, 3, -1, 8, - -1, 2, -3, 1, 4, -3, -2, 0, -3, 1, -2, -1, 0, -1, 4, 0, 0, -1, -3, -2, -1, -2, 4}; - -int blosum50mt[] = { - 5, - -2, 5, - -1, -3, 13, - -2, 5, -4, 8, - -1, 1, -3, 2, 6, - -3, -4, -2, -5, -3, 8, - 0, -1, -3, -1, -3, -4, 8, - -2, 0, -3, -1, 0, -1, -2, 10, - -1, -4, -2, -4, -4, 0, -4, -4, 5, - -1, 0, -3, -1, 1, -4, -2, 0, -3, 6, - -2, -4, -2, -4, -3, 1, -4, -3, 2, -3, 5, - -1, -3, -2, -4, -2, 0, -3, -1, 2, -2, 3, 7, - -1, 4, -2, 2, 0, -4, 0, 1, -3, 0, -4, -2, 7, - -1, -2, -4, -1, -1, -4, -2, -2, -3, -1, -4, -3, -2, 10, - -1, 0, -3, 0, 2, -4, -2, 1, -3, 2, -2, 0, 0, -1, 7, - -2, -1, -4, -2, 0, -3, -3, 0, -4, 3, -3, -2, -1, -3, 1, 7, - 1, 0, -1, 0, -1, -3, 0, -1, -3, 0, -3, -2, 1, -1, 0, -1, 5, - 0, 0, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 2, 5, - 0, -4, -1, -4, -3, -1, -4, -4, 4, -3, 1, 1, -3, -3, -3, -3, -2, 0, 5, - -3, -5, -5, -5, -3, 1, -3, -3, -3, -3, -2, -1, -4, -4, -1, -3, -4, -3, -3, 15, - -1, -1, -2, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, 0, -1, -3, -1, - -2, -3, -3, -3, -2, 4, -3, 2, -1, -2, -1, 0, -2, -3, -1, -1, -2, -2, -1, 2, -1, 8, - -1, 2, -3, 1, 5, -4, -2, 0, -3, 1, -3, -1, 0, -1, 4, 0, 0, -1, -3, -2, -1, -2, 5}; - - -int blosum55mt[]={ - 5, - -2, 5, - 0, -4, 13, - -2, 5, -4, 8, - -1, 1, -4, 2, 7, - -3, -5, -3, -5, -4, 9, - 0, -1, -3, -2, -3, -4, 8, - -2, 0, -4, -1, -1, -1, -2, 11, - -2, -4, -2, -4, -4, 0, -5, -4, 6, - -1, 0, -4, -1, 1, -4, -2, 0, -4, 6, - -2, -4, -2, -5, -4, 1, -5, -3, 2, -3, 6, - -1, -3, -2, -4, -3, 0, -3, -2, 2, -2, 3, 8, - -2, 4, -3, 2, 0, -4, 0, 1, -4, 0, -4, -3, 8, - -1, -2, -3, -2, -1, -5, -3, -3, -3, -1, -4, -3, -2, 10, - -1, 0, -4, 0, 2, -4, -2, 1, -4, 2, -3, 0, 0, -1, 7, - -2, -1, -4, -2, 0, -3, -3, 0, -4, 3, -3, -2, -1, -3, 1, 8, - 2, 0, -1, 0, 0, -3, 0, -1, -3, 0, -3, -2, 1, -1, 0, -1, 5, - 0, -1, -1, -1, -1, -3, -2, -2, -1, -1, -2, -1, 0, -1, -1, -1, 2, 6, - 0, -4, -1, -4, -3, -1, -4, -4, 4, -3, 1, 1, -4, -3, -3, -3, -2, 0, 5, - -4, -5, -4, -5, -3, 2, -3, -3, -3, -4, -3, -2, -5, -5, -2, -3, -4, -3, -4, 15, - -1, -1, -2, -2, -1, -2, -2, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -3, -1, - -2, -3, -3, -3, -2, 4, -4, 2, -1, -2, -1, -1, -2, -4, -1, -2, -2, -2, -2, 3, -1, 9, - -1, 2, -4, 1, 5, -4, -3, 0, -4, 1, -3, -2, 0, -1, 4, 0, 0, -1, -3, -3, -1, -2, 5}; - -int blosum62mt[]={ - 4, - -2, 4, - 0, -3, 9, - -2, 4, -3, 6, - -1, 1, -4, 2, 5, - -2, -3, -2, -3, -3, 6, - 0, -1, -3, -1, -2, -3, 6, - -2, 0, -3, -1, 0, -1, -2, 8, - -1, -3, -1, -3, -3, 0, -4, -3, 4, - -1, 0, -3, -1, 1, -3, -2, -1, -3, 5, - -1, -4, -1, -4, -3, 0, -4, -3, 2, -2, 4, - -1, -3, -1, -3, -2, 0, -3, -2, 1, -1, 2, 5, - -2, 3, -3, 1, 0, -3, 0, 1, -3, 0, -3, -2, 6, - -1, -2, -3, -1, -1, -4, -2, -2, -3, -1, -3, -2, -2, 7, - -1, 0, -3, 0, 2, -3, -2, 0, -3, 1, -2, 0, 0, -1, 5, - -1, -1, -3, -2, 0, -3, -2, 0, -3, 2, -2, -1, 0, -2, 1, 5, - 1, 0, -1, 0, 0, -2, 0, -1, -2, 0, -2, -1, 1, -1, 0, -1, 4, - 0, -1, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 1, 5, - 0, -3, -1, -3, -2, -1, -3, -3, 3, -2, 1, 1, -3, -2, -2, -3, -2, 0, 4, - -3, -4, -2, -4, -3, 1, -2, -2, -3, -3, -2, -1, -4, -4, -2, -3, -3, -2, -3, 11, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, 0, 0, -1, -2, -1, - -2, -3, -2, -3, -2, 3, -3, 2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, 2, -1, 7, - -1, 1, -3, 1, 4, -3, -2, 0, -3, 1, -3, -1, 0, -1, 3, 0, 0, -1, -2, -3, -1, -2, 4}; - -int blosum62mt3[]={ - 0, - -2, 0, - 0, -3, 0, - -2, 4, -3, 0, - -1, 1, -4, 2, 0, - -2, -3, -2, -3, -3, 0, - 0, -1, -3, -1, -2, -3, 0, - -2, 0, -3, -1, 0, -1, -2, 0, - -1, -3, -1, -3, -3, 0, -4, -3, 0, - -1, 0, -3, -1, 1, -3, -2, -1, -3, 0, - -1, -4, -1, -4, -3, 0, -4, -3, 2, -2, 0, - -1, -3, -1, -3, -2, 0, -3, -2, 1, -1, 2, 0, - -2, 3, -3, 1, 0, -3, 0, 1, -3, 0, -3, -2, 0, - -1, -2, -3, -1, -1, -4, -2, -2, -3, -1, -3, -2, -2, 0, - -1, 0, -3, 0, 2, -3, -2, 0, -3, 1, -2, 0, 0, -1, 0, - -1, -1, -3, -2, 0, -3, -2, 0, -3, 2, -2, -1, 0, -2, 1, 0, - 1, 0, -1, 0, 0, -2, 0, -1, -2, 0, -2, -1, 1, -1, 0, -1, 0, - 0, -1, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 1, 0, - 0, -3, -1, -3, -2, -1, -3, -3, 3, -2, 1, 1, -3, -2, -2, -3, -2, 0, 0, - -3, -4, -2, -4, -3, 1, -2, -2, -3, -3, -2, -1, -4, -4, -2, -3, -3, -2, -3, 0, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, 0, 0, -1, -2, 0, - -2, -3, -2, -3, -2, 3, -3, 2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, 2, -1, 0, - -1, 1, -3, 1, 4, -3, -2, 0, -3, 1, -3, -1, 0, -1, 3, 0, 0, -1, -2, -3, -1, -2, 0}; - -int blosum62mt2[]={ - 0, - -2, 4, - 0, -3, 0, - -2, 4, -3, 2, - -1, 1, -4, 2, 2, - -2, -3, -2, -3, -3, 3, - 0, -1, -3, -1, -2, -3, 0, - -2, 0, -3, -1, 0, -1, -2, 2, - -1, -3, -1, -3, -3, 0, -4, -3, 2, - -1, 0, -3, -1, 1, -3, -2, -1, -3, 2, - -1, -4, -1, -4, -3, 0, -4, -3, 2, -2, 1, - -1, -3, -1, -3, -2, 0, -3, -2, 1, -1, 2, 0, - -2, 3, -3, 1, 0, -3, 0, 1, -3, 0, -3, -2, 0, - -1, -2, -3, -1, -1, -4, -2, -2, -3, -1, -3, -2, -2, 0, - -1, 0, -3, 0, 2, -3, -2, 0, -3, 1, -2, 0, 0, -1, 2, - -1, -1, -3, -2, 0, -3, -2, 0, -3, 2, -2, -1, 0, -2, 1, 0, - 1, 0, -1, 0, 0, -2, 0, -1, -2, 0, -2, -1, 1, -1, 0, -1, 1, - 0, -1, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 1, 1, - 0, -3, -1, -3, -2, -1, -3, -3, 3, -2, 1, 1, -3, -2, -2, -3, -2, 0, 1, - -3, -4, -2, -4, -3, 1, -2, -2, -3, -3, -2, -1, -4, -4, -2, -3, -3, -2, -3, 1, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, 0, 0, -1, -2, -1, - -2, -3, -2, -3, -2, 3, -3, 2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, 2, -1, 3, - -1, 1, -3, 1, 4, -3, -2, 0, -3, 1, -3, -1, 0, -1, 3, 0, 0, -1, -2, -3, -1, -2, 4}; - - -int blosum80mt[]={ - 7, - -3, 6, - -1, -6, 13, - -3, 6, -7, 10, - -2, 1, -7, 2, 8, - -4, -6, -4, -6, -6, 10, - 0, -2, -6, -3, -4, -6, 9, - -3, -1, -7, -2, 0, -2, -4, 12, - -3, -6, -2, -7, -6, -1, -7, -6, 7, - -1, -1, -6, -2, 1, -5, -3, -1, -5, 8, - -3, -7, -3, -7, -6, 0, -7, -5, 2, -4, 6, - -2, -5, -3, -6, -4, 0, -5, -4, 2, -3, 3, 9, - -3, 5, -5, 2, -1, -6, -1, 1, -6, 0, -6, -4, 9, - -1, -4, -6, -3, -2, -6, -5, -4, -5, -2, -5, -4, -4, 12, - -2, -1, -5, -1, 3, -5, -4, 1, -5, 2, -4, -1, 0, -3, 9, - -3, -2, -6, -3, -1, -5, -4, 0, -5, 3, -4, -3, -1, -3, 1, 9, - 2, 0, -2, -1, -1, -4, -1, -2, -4, -1, -4, -3, 1, -2, -1, -2, 7, - 0, -1, -2, -2, -2, -4, -3, -3, -2, -1, -3, -1, 0, -3, -1, -2, 2, 8, - -1, -6, -2, -6, -4, -2, -6, -5, 4, -4, 1, 1, -5, -4, -4, -4, -3, 0, 7, - -5, -8, -5, -8, -6, 0, -6, -4, -5, -6, -4, -3, -7, -7, -4, -5, -6, -5, -5, 16, - -1, -3, -4, -3, -2, -3, -3, -2, -2, -2, -2, -2, -2, -3, -2, -2, -1, -1, -2, -5, -2, - -4, -5, -5, -6, -5, 4, -6, 3, -3, -4, -2, -3, -4, -6, -3, -4, -3, -3, -3, 3, -3, 11, - -2, 0, -7, 1, 6, -6, -4, 0, -6, 1, -5, -3, -1, -2, 5, 0, -1, -2, -4, -5, -1, -4, 6}; - -int pam120mt[]={ - 3, - 0, 4, - -3, -6, 9, - 0, 4, -7, 5, - 0, 3, -7, 3, 5, - -4, -5, -6, -7, -7, 8, - 1, 0, -4, 0, -1, -5, 5, - -3, 1, -4, 0, -1, -3, -4, 7, - -1, -3, -3, -3, -3, 0, -4, -4, 6, - -2, 0, -7, -1, -1, -7, -3, -2, -3, 5, - -3, -4, -7, -5, -4, 0, -5, -3, 1, -4, 5, - -2, -4, -6, -4, -3, -1, -4, -4, 1, 0, 3, 8, - -1, 3, -5, 2, 1, -4, 0, 2, -2, 1, -4, -3, 4, - 1, -2, -4, -3, -2, -5, -2, -1, -3, -2, -3, -3, -2, 6, - -1, 0, -7, 1, 2, -6, -3, 3, -3, 0, -2, -1, 0, 0, 6, - -3, -2, -4, -3, -3, -5, -4, 1, -2, 2, -4, -1, -1, -1, 1, 6, - 1, 0, 0, 0, -1, -3, 1, -2, -2, -1, -4, -2, 1, 1, -2, -1, 3, - 1, 0, -3, -1, -2, -4, -1, -3, 0, -1, -3, -1, 0, -1, -2, -2, 2, 4, - 0, -3, -3, -3, -3, -3, -2, -3, 3, -4, 1, 1, -3, -2, -3, -3, -2, 0, 5, - -7, -6, -8, -8, -8, -1, -8, -3, -6, -5, -3, -6, -4, -7, -6, 1, -2, -6, -8, 12, - -1, -1, -4, -2, -1, -3, -2, -2, -1, -2, -2, -2, -1, -2, -1, -2, -1, -1, -1, -5, -2, - -4, -3, -1, -5, -5, 4, -6, -1, -2, -5, -2, -4, -2, -6, -5, -5, -3, -3, -3, -2, -3, 8, - -1, 2, -7, 3, 4, -6, -2, 1, -3, -1, -3, -2, 0, -1, 4, -1, -1, -2, -3, -7, -1, -5, 4}; - -int pam160mt[]={ - 2, - 0, 3, - -2, -4, 9, - 0, 3, -5, 4, - 0, 2, -5, 3, 4, - -3, -4, -5, -6, -5, 7, - 1, 0, -3, 0, 0, -4, 4, - -2, 1, -3, 0, 0, -2, -3, 6, - -1, -2, -2, -3, -2, 0, -3, -3, 5, - -2, 0, -5, 0, -1, -5, -2, -1, -2, 4, - -2, -4, -6, -4, -3, 1, -4, -2, 2, -3, 5, - -1, -3, -5, -3, -2, 0, -3, -3, 2, 0, 3, 7, - 0, 2, -4, 2, 1, -3, 0, 2, -2, 1, -3, -2, 3, - 1, -1, -3, -2, -1, -4, -1, -1, -2, -2, -3, -2, -1, 5, - -1, 1, -5, 1, 2, -5, -2, 2, -2, 0, -2, -1, 0, 0, 5, - -2, -1, -3, -2, -2, -4, -3, 1, -2, 3, -3, -1, -1, -1, 1, 6, - 1, 0, 0, 0, 0, -3, 1, -1, -2, -1, -3, -2, 1, 1, -1, -1, 2, - 1, 0, -2, -1, -1, -3, -1, -2, 0, 0, -2, -1, 0, 0, -1, -1, 1, 3, - 0, -2, -2, -3, -2, -2, -2, -2, 3, -3, 1, 1, -2, -2, -2, -3, -1, 0, 4, - -5, -5, -7, -6, -7, -1, -7, -3, -5, -4, -2, -4, -4, -5, -5, 1, -2, -5, -6, 12, - 0, -1, -3, -1, -1, -3, -1, -1, -1, -1, -2, -1, 0, -1, -1, -1, 0, 0, -1, -4, -1, - -3, -3, 0, -4, -4, 5, -5, 0, -2, -4, -2, -3, -2, -5, -4, -4, -3, -3, -3, -1, -3, 8, - 0, 2, -5, 2, 3, -5, -1, 1, -2, 0, -3, -2, 1, -1, 3, 0, -1, -1, -2, -6, -1, -4, 3}; - -int pam250mt[]={ - 2, - 0, 3, - -2, -4, 12, - 0, 3, -5, 4, - 0, 3, -5, 3, 4, - -3, -4, -4, -6, -5, 9, - 1, 0, -3, 1, 0, -5, 5, - -1, 1, -3, 1, 1, -2, -2, 6, - -1, -2, -2, -2, -2, 1, -3, -2, 5, - -1, 1, -5, 0, 0, -5, -2, 0, -2, 5, - -2, -3, -6, -4, -3, 2, -4, -2, 2, -3, 6, - -1, -2, -5, -3, -2, 0, -3, -2, 2, 0, 4, 6, - 0, 2, -4, 2, 1, -3, 0, 2, -2, 1, -3, -2, 2, - 1, -1, -3, -1, -1, -5, 0, 0, -2, -1, -3, -2, 0, 6, - 0, 1, -5, 2, 2, -5, -1, 3, -2, 1, -2, -1, 1, 0, 4, - -2, -1, -4, -1, -1, -4, -3, 2, -2, 3, -3, 0, 0, 0, 1, 6, - 1, 0, 0, 0, 0, -3, 1, -1, -1, 0, -3, -2, 1, 1, -1, 0, 2, - 1, 0, -2, 0, 0, -3, 0, -1, 0, 0, -2, -1, 0, 0, -1, -1, 1, 3, - 0, -2, -2, -2, -2, -1, -1, -2, 4, -2, 2, 2, -2, -1, -2, -2, -1, 0, 4, - -6, -5, -8, -7, -7, 0, -7, -3, -5, -3, -2, -4, -4, -6, -5, 2, -2, -5, -6, 17, - 0, -1, -3, -1, -1, -2, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, -1, -4, -1, - -3, -3, 0, -4, -4, 7, -5, 0, -1, -4, -1, -2, -2, -5, -4, -4, -3, -3, -2, 0, -2, 10, - 0, 2, -5, 3, 3, -5, 0, 2, -2, 0, -3, -2, 1, 0, 3, 0, 0, -1, -2, -6, -1, -4, 3}; - -int pam350mt[]={ - 2, - 1, 3, - -2, -5, 18, - 1, 3, -6, 4, - 1, 3, -6, 4, 4, - -4, -5, -5, -6, -6, 13, - 2, 1, -4, 1, 1, -6, 5, - -1, 1, -4, 1, 1, -2, -2, 7, - 0, -2, -3, -2, -2, 2, -2, -2, 5, - -1, 1, -6, 1, 0, -6, -1, 1, -2, 5, - -2, -4, -7, -4, -4, 3, -4, -2, 4, -3, 8, - -1, -2, -6, -3, -2, 1, -3, -2, 3, 0, 5, 6, - 0, 2, -4, 2, 2, -4, 1, 2, -2, 1, -3, -2, 2, - 1, 0, -3, 0, 0, -5, 0, 0, -2, -1, -3, -2, 0, 6, - 0, 2, -6, 2, 3, -5, -1, 3, -2, 1, -2, -1, 1, 1, 4, - -1, 0, -4, -1, 0, -5, -2, 2, -2, 4, -3, 0, 1, 0, 2, 7, - 1, 1, 0, 1, 0, -4, 1, -1, -1, 0, -3, -2, 1, 1, 0, 0, 1, - 1, 0, -2, 0, 0, -3, 1, -1, 0, 0, -2, -1, 1, 1, 0, -1, 1, 2, - 0, -2, -2, -2, -2, -1, -1, -2, 4, -2, 3, 2, -2, -1, -2, -3, -1, 0, 5, - -7, -6,-10, -8, -8, 1, -8, -3, -6, -4, -2, -5, -5, -7, -5, 4, -3, -6, -7, 27, - 0, 0, -3, -1, 0, -2, -1, 0, 0, -1, -1, 0, 0, 0, 0, -1, 0, 0, 0, -5, -1, - -4, -4, 1, -5, -5, 11, -6, 0, 0, -5, 0, -2, -3, -6, -5, -5, -3, -3, -2, 1, -2, 14, - 0, 2, -6, 3, 3, -6, 0, 2, -2, 1, -3, -2, 2, 0, 3, 1, 0, 0, -2, -7, 0, -5, 3}; - -int md_40mt[]={ - 9, - 0, 0, - -7, 0, 16, - -6, 0,-13, 11, - -5, 0,-15, 3, 11, --11, 0, -5,-15,-16, 13, - -3, 0, -7, -4, -4,-15, 10, - -9, 0, -6, -4, -8, -7,-10, 14, - -6, 0,-11,-12,-12, -5,-13,-11, 11, - -8, 0,-12, -8, -3,-16, -9, -6,-11, 11, - -9, 0,-10,-14,-13, -1,-14, -7, -1,-12, 9, - -6, 0, -9,-12,-11, -7,-12, -9, 1, -7, 1, 14, - -6, 0, -8, 1, -5,-12, -5, 0, -8, -1,-12, -9, 12, - -2, 0,-11,-11,-11,-11, -9, -4,-11,-10, -5,-10, -9, 12, - -7, 0,-12, -6, 0,-14, -9, 2,-12, -1, -6, -8, -5, -3, 12, - -7, 0, -5,-10, -8,-15, -4, 0,-10, 3, -9, -8, -6, -6, 0, 11, - 0, 0, -2, -6, -8, -6, -2, -6, -8, -7, -7, -8, 1, -1, -7, -5, 9, - 1, 0, -7, -8, -8,-11, -7, -7, -2, -5, -9, -2, -2, -4, -7, -6, 1, 10, - -1, 0, -7, -9, -8, -6, -8,-12, 4,-12, -2, 0,-10, -9,-11,-11, -7, -4, 10, --14, 0, -4,-15,-15, -7, -7,-13,-13,-13, -8,-11,-14,-14,-11, -4, -9,-12,-10, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --13, 0, -2, -8,-14, 2,-13, 2, -9,-13, -9,-11, -6,-13, -9,-10, -7,-10,-11, -6, 0, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -int md_120mt[]={ - 6, - 0, 0, - -3, 0, 14, - -2, 0, -7, 8, - -2, 0, -8, 5, 8, - -6, 0, -2, -9,-10, 11, - 0, 0, -3, 0, -1, -9, 8, - -4, 0, -2, -1, -3, -2, -4, 11, - -1, 0, -5, -7, -7, -1, -6, -6, 7, - -4, 0, -6, -2, 0, -9, -4, -1, -6, 8, - -4, 0, -5, -8, -8, 2, -8, -4, 2, -6, 7, - -2, 0, -5, -7, -6, -2, -6, -5, 3, -4, 3, 10, - -1, 0, -3, 3, -1, -6, -1, 2, -4, 1, -6, -5, 8, - 0, 0, -5, -5, -5, -5, -4, -1, -5, -4, -2, -5, -3, 9, - -3, 0, -6, -1, 2, -7, -4, 4, -6, 2, -3, -4, -1, 0, 9, - -3, 0, -2, -4, -3, -8, -1, 2, -6, 4, -5, -4, -2, -2, 2, 8, - 2, 0, 0, -2, -3, -3, 0, -2, -3, -3, -3, -3, 2, 1, -3, -2, 5, - 2, 0, -3, -3, -4, -6, -2, -3, 0, -2, -4, 0, 1, 0, -3, -3, 2, 6, - 1, 0, -3, -5, -5, -2, -4, -6, 5, -6, 1, 2, -5, -4, -6, -6, -3, 0, 7, - -8, 0, 0, -9, -9, -3, -3, -6, -7, -6, -4, -6, -8, -8, -6, -1, -5, -7, -6, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -7, 0, 2, -4, -7, 5, -8, 4, -5, -7, -4, -6, -2, -7, -4, -5, -3, -6, -6, -2, 0, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -int md_250mt[]={ - 2, - 0, 0, - -1, 0, 11, - -1, 0, -3, 5, - -1, 0, -4, 4, 5, - -3, 0, 0, -5, -5, 8, - 1, 0, -1, 1, 1, -5, 5, - -2, 0, 0, 0, 0, 0, -2, 6, - 0, 0, -2, -3, -3, 0, -3, -3, 4, - -1, 0, -3, 0, 1, -5, -1, 1, -3, 5, - -1, 0, -2, -4, -4, 2, -4, -2, 2, -3, 5, - 0, 0, -2, -3, -3, 0, -3, -2, 3, -2, 3, 6, - 0, 0, -1, 2, 1, -3, 0, 1, -2, 1, -3, -2, 3, - 1, 0, -2, -2, -2, -2, -1, 0, -2, -1, 0, -2, -1, 6, - -1, 0, -3, 0, 2, -4, -1, 3, -3, 2, -2, -2, 0, 0, 5, - -1, 0, -1, -1, 0, -4, 0, 2, -3, 4, -3, -2, 0, -1, 2, 5, - 1, 0, 1, 0, -1, -2, 1, -1, -1, -1, -2, -1, 1, 1, -1, -1, 2, - 2, 0, -1, -1, -1, -2, 0, -1, 1, -1, -1, 0, 1, 1, -1, -1, 1, 2, - 1, 0, -2, -3, -2, 0, -2, -3, 4, -3, 2, 2, -2, -1, -3, -3, -1, 0, 4, - -4, 0, 1, -5, -5, -1, -1, -3, -4, -3, -2, -3, -4, -4, -3, 0, -3, -4, -3, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 2, -2, -4, 5, -4, 4, -2, -3, -1, -3, -1, -3, -2, -2, -1, -3, -3, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -int md_350mt[]={ - 1, - 0, 0, - 0, 0, 9, - 0, 0, -2, 3, - 0, 0, -2, 3, 3, - -2, 0, 1, -3, -4, 6, - 1, 0, 0, 1, 1, -3, 4, - -1, 0, 0, 0, 0, 0, -1, 3, - 0, 0, -1, -2, -2, 1, -2, -2, 3, - -1, 0, -1, 0, 1, -3, 0, 1, -2, 3, - -1, 0, -1, -3, -3, 2, -2, -1, 2, -2, 3, - 0, 0, -1, -2, -2, 1, -2, -1, 2, -2, 2, 3, - 0, 0, -1, 1, 1, -2, 0, 1, -1, 1, -2, -1, 2, - 1, 0, -1, -1, -1, -2, -1, 0, -1, -1, 0, -1, 0, 4, - -1, 0, -2, 1, 1, -2, 0, 2, -2, 2, -1, -1, 0, 0, 3, - -1, 0, 0, 0, 0, -3, 0, 1, -2, 3, -2, -1, 0, 0, 2, 3, - 1, 0, 0, 0, 0, -1, 1, 0, -1, 0, -1, -1, 1, 1, 0, 0, 1, - 1, 0, 0, 0, -1, -1, 0, -1, 0, 0, -1, 0, 0, 1, -1, 0, 1, 1, - 0, 0, -1, -2, -2, 0, -1, -2, 2, -2, 1, 2, -1, -1, -2, -2, 0, 0, 2, - -3, 0, 1, -4, -3, 0, -1, -2, -3, -2, -1, -2, -3, -3, -2, 0, -2, -3, -2, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 2, -2, -2, 5, -3, 3, -1, -2, 0, -1, -1, -2, -1, -1, -1, -2, -2, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -int idmat[]={ -10, - 0, 10, - 0, 0, 10, - 0, 0, 0, 10, - 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10}; - -int dna_idmat[]={ -10, - -1, 10, - -1, -1, 10, - -1, -1, -1, 10, - -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,10}; - -int est_idmat[]={ -10, - -10, 10, - -10, -10, 10, - -10, -10, -10, 10, - -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, 10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,10}; - -/*These are the three structure specific matrices descibed by Luthy, R., McLachlan, A.D. and Eisenberg, D. - in Proteins 10, 229-239 (1991), taken from http://www.genome.ad.jp/dbget/dbget2.html - ID: coil :LUTR910107 - ID: alpha:LUTR910108 - ID: beta :LUTR910109 -*/ -int coil_mat []={ - 11, - 0, 0, - 3, 0, 108, - 2, 0, -5, 27, - 2, 0, 7, -9, 15, --15, 0, 3, -11, -4, 83, - 1, 0, 4, -15, -4, 2, 41, - 5, 0, 4, 108, -6, -13, -3, 55, - 27, 0, -11, 3, -2, -14, 0, -1, 49, - -9, 0, 3, 4, -21, -2, -3, -4, -7, 38, - -5, 0, 14, 7, -5, 2, 2, -6, -3, 1, 48, - -9, 0, 3, 4, -6, -16, -23, -9, -7, -1, 7, 52, - 28, 0, 1, 2, 27, 7, -5, -9, -9, 108, -15, 3, 10, -108, 0, 8, 14, 41, 0, -2, -4, -10, -3, 1, -15, 4, 58, - 10, 0, 3, -9, 3, -4, 3, 3, 8, 6, -15, 15, 5, -6, 14, - 1, 0, 10, 3, 1, 108, 5, 27, -5, -9, -9, -15, 2, 3, 2, 28, - 3, 0, -15, 3, -3, -8, -12, -5, -6, -9, -19, -14, 4, 4, -2, 7, 19, - 7, 0, 6, 3, 0, -7, 55, -18, -8, -7, 6, -20, -11, 2, -5, 4, 3, 31, --11, 0, -6, -15, -23, -6, -4, -3, 19, -15, -6, -22, 3, -11, -4, 14, -1, -7, 37, - 4, 0, 15, 3, 2, -8, -1, -12, -22, -2, 5, -19, 14, 4, -21, 4, 0, -9, -1, 129, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, -4, 8, -3, -30, -6, 49, -10, -7, -12, -18, 3, 3, -6, -11, 3, 2, 2, -5, 0, 59, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - -int alpha_mat []={ - 23, - 0, 0, - 5, 0, 51, - 1, 0, 4, 28, - 0, 0, 5, 1, 23, - -4, 0, 5, 1, 3, 88, - 3, 0, 5, -4, 2, 4, 37, - 7, 0, 6, 51, 3, 5, -6, 52, - 28, 0, 1, 1, 6, -21, 2, -6, 38, - 1, 0, 0, 5, 4, -2, 3, -7, -10, 34, - 4, 0, 11, 5, 4, 3, 5, -6, -19, -6, 45, - 1, 0, 4, 6, 3, -23, -5, -12, -14, -4, 9, 40, - 19, 0, 3, 0, 28, 5, 4, 1, 1, 51, -4, 1, 13, - 51, 0, 10, 11, 37, 1, 1, -6, -8, -5, 2, -22, 5, 59, - 13, 0, 1, 1, 0, 2, 4, 5, 10, 7, -5, 23, 7, 3, 11, - -1, 0, 13, 5, 3, 51, 7, 28, 4, 1, 1, -4, 1, 1, 0, 19, - 1, 0, -5, 0, -6, 2, -1, -10, -14, -9, -6, -22, 6, 3, 6, 5, 17, - 5, 0, 7, 4, 2, 3, 52, -8, -18, 3, 4, -24, 1, 4, 4, 5, 2, 14, - 1, 0, 3, -5, -5, 5, -7, -19, 7, -6, -2, -28, 4, 7, 3, 11, 2, -38, 40, - 5, 0, 23, 5, 5, 5, -6, -9, -19, -2, 3, -4, 11, 5, 4, 6, 2, -43, -8, 162, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 2, 10, 3, -2, -6, 38, -14, -7, -1, -19, 0, 5, 3, 1, 4, -29, -6, -19, 0, 97, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - -int beta_mat []={ - 23, - 0, 0, - 4, 0, 97, - 1, 0, -5, 49, - -1, 0, 9, -5, 31, --16, 0, 8, -11, 6, 57, - 2, 0, 7, -16, 12, 8, 54, - 13, 0, 9, 97, 2, -30, -4, 55, - 49, 0, -11, 0, 0, -22, 2, -7, 28, --19, 0, 0, 7, -18, 2, 17, -12, -10, 34, - -5, 0, 31, 9, 1, 7, 13, -9, -7, -3, 34, - -5, 0, 2, 9, 4, -9, -12, -17, -13, 1, 14, 25, - 40, 0, 2, -1, 49, 9, -5, -19, -5, 97, -16, 0, 15, - 97, 0, 17, 31, 54, 5, 5, -13, -34, -2, 8, -11, 7, 78, - 15, 0, 0, -19, 0, 12, 2, 8, 17, 11, -21, 31, 13, 2, 31, - -2, 0, 15, 4, 2, 97, 13, 49, -5, -5, -19, -16, 1, 0, -1, 40, - 0, 0, -21, 0, -4, -6, -5, -13, -12, -5, -23, -9, 9, 7, 0, 9, 26, - 9, 0, 11, 2, 2, 2, 55, -11, -14, -28, 12, -21, -11, 1, 1, 7, 4, 21, --11, 0, 2, -21, -12, -2, -12, -7, 13, 2, -1, -13, 2, -10, 6, 31, 2, -22, 23, - 7, 0, 31, 8, 13, -7, -7, -15, -15, -3, 10, -31, 31, 6, -18, 9, 6, -17, -5, 133, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 12, 17, 17, -12, -9, 28, -13, -3, 0, -12, 0, 8, 4, -11, 2, -5, -5, -5, 0, 47, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/*EXPERIMENTAL MATRICES: Blosum Series*/ -/*Blosum Series rescaled on blosum62mt, -Lambda Blosum30mt=17 -Lambda Blosum62mt=10 -Lambda Blosum80mt=4.5 -*/ - -int rblosum30mt []={ - 52, - 33, 56, - 18, 23, 113, - 33, 56, 18, 75, - 33, 33, 37, 37, 61, - 23, 18, 18, 9, 14, 80, - 33, 33, 14, 28, 23, 18, 71, - 23, 23, 9, 23, 33, 18, 18, 99, - 33, 23, 23, 14, 18, 33, 28, 23, 61, - 33, 33, 18, 33, 42, 28, 28, 23, 23, 52, - 28, 28, 33, 28, 28, 42, 23, 28, 42, 23, 52, - 37, 23, 23, 18, 28, 23, 23, 42, 37, 42, 42, 61, - 33, 52, 28, 37, 28, 28, 33, 28, 33, 33, 23, 33, 71, - 28, 23, 18, 28, 37, 14, 28, 37, 18, 37, 18, 14, 18, 85, - 37, 28, 23, 28, 42, 18, 23, 33, 23, 33, 23, 28, 28, 33, 71, - 28, 23, 23, 28, 28, 28, 23, 28, 18, 37, 23, 33, 23, 28, 47, 71, - 37, 33, 23, 33, 33, 28, 33, 28, 28, 33, 23, 23, 33, 28, 28, 28, 52, - 37, 33, 23, 28, 23, 23, 23, 23, 33, 28, 33, 33, 37, 33, 33, 18, 42, 56, - 37, 23, 23, 23, 18, 37, 18, 18, 52, 23, 37, 33, 23, 14, 18, 28, 28, 37, 56, - 9, 9, 23, 14, 28, 37, 37, 9, 18, 23, 23, 18, 0, 18, 28, 33, 18, 9, 18, 128, - 0, -1, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -2, -1, - -4, -3, -6, -1, -2, 3, -3, 0, -1, -1, 3, -1, -4, -2, -1, 0, -2, -1, 1, 5, -1, 9, - 0, 0, 0, 0, 5, -4, -2, 0, -3, 1, -1, -1, -1, 0, 4, 0, -1, -1, -3, -1, 0, -2, 4, - - -}; - - - -int rblosum62mt[]={ - 80, - 20, 80, - 40, 10, 130, - 20, 80, 10, 100, - 30, 50, 0, 60, 90, - 20, 10, 20, 10, 10, 100, - 40, 30, 10, 30, 20, 10, 100, - 20, 40, 10, 30, 40, 30, 20, 120, - 30, 10, 30, 10, 10, 40, 0, 10, 80, - 30, 40, 10, 30, 50, 10, 20, 30, 10, 90, - 30, 0, 30, 0, 10, 40, 0, 10, 60, 20, 80, - 30, 10, 30, 10, 20, 40, 10, 20, 50, 30, 60, 90, - 20, 70, 10, 50, 40, 10, 40, 50, 10, 40, 10, 20, 100, - 30, 20, 10, 30, 30, 0, 20, 20, 10, 30, 10, 20, 20, 110, - 30, 40, 10, 40, 60, 10, 20, 40, 10, 50, 20, 40, 40, 30, 90, - 30, 30, 10, 20, 40, 10, 20, 40, 10, 60, 20, 30, 40, 20, 50, 90, - 50, 40, 30, 40, 40, 20, 40, 30, 20, 40, 20, 30, 50, 30, 40, 30, 80, - 40, 30, 30, 30, 30, 20, 20, 20, 30, 30, 30, 30, 40, 30, 30, 30, 50, 90, - 40, 10, 30, 10, 20, 30, 10, 10, 70, 20, 50, 50, 10, 20, 20, 10, 20, 40, 80, - 10, 0, 20, 0, 10, 50, 20, 20, 10, 10, 20, 30, 0, 0, 20, 10, 10, 20, 10, 150, - 0, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, 0, 0, -1, -2, -1, - -2, -3, -2, -3, -2, 3, -3, 2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, 2, -1, 7, - -1, 1, -3, 1, 4, -3, -2, 0, -3, 1, -3, -1, 0, -1, 3, 0, 0, -1, -2, -3, -1, -2, 4, - - }; -int rblosum80mt[]={ -77, - 25, 72, - 36, 10, 108, - 25, 72, 5, 93, - 31, 46, 5, 51, 82, - 20, 10, 20, 10, 10, 93, - 41, 31, 10, 25, 20, 10, 87, - 25, 36, 5, 31, 41, 31, 20, 103, - 25, 10, 31, 5, 10, 36, 5, 10, 77, - 36, 36, 10, 31, 46, 15, 25, 36, 15, 82, - 25, 5, 25, 5, 10, 41, 5, 15, 51, 20, 72, - 31, 15, 25, 10, 20, 41, 15, 20, 51, 25, 56, 87, - 25, 67, 15, 51, 36, 10, 36, 46, 10, 41, 10, 20, 87, - 36, 20, 10, 25, 31, 10, 15, 20, 15, 31, 15, 20, 20, 103, - 31, 36, 15, 36, 56, 15, 20, 46, 15, 51, 20, 36, 41, 25, 87, - 25, 31, 10, 25, 36, 15, 20, 41, 15, 56, 20, 25, 36, 25, 46, 87, - 51, 41, 31, 36, 36, 20, 36, 31, 20, 36, 20, 25, 46, 31, 36, 31, 77, - 41, 36, 31, 31, 31, 20, 25, 25, 31, 36, 25, 36, 41, 25, 36, 31, 51, 82, - 36, 10, 31, 10, 20, 31, 10, 15, 62, 20, 46, 46, 15, 20, 20, 20, 25, 41, 77, - 15, 0, 15, 0, 10, 41, 10, 20, 15, 10, 20, 25, 5, 5, 20, 15, 10, 15, 15, 124, - -1, -3, -4, -3, -2, -3, -3, -2, -2, -2, -2, -2, -2, -3, -2, -2, -1, -1, -2, -5, -2, - -4, -5, -5, -6, -5, 4, -6, 3, -3, -4, -2, -3, -4, -6, -3, -4, -3, -3, -3, 3, -3, 11, - -2, 0, -7, 1, 6, -6, -4, 0, -6, 1, -5, -3, -1, -2, 5, 0, -1, -2, -4, -5, -1, -4, 6, -}; -int rpam120mt[]={ - 52, - 38, 57, - 24, 9, 81, - 38, 57, 4, 62, - 38, 52, 4, 52, 62, - 19, 14, 9, 4, 4, 77, - 43, 38, 19, 38, 33, 14, 62, - 24, 43, 19, 38, 33, 24, 19, 72, - 33, 24, 24, 24, 24, 38, 19, 19, 67, - 28, 38, 4, 33, 33, 4, 24, 28, 24, 62, - 24, 19, 4, 14, 19, 38, 14, 24, 43, 19, 62, - 28, 19, 9, 19, 24, 33, 19, 19, 43, 38, 52, 77, - 33, 52, 14, 48, 43, 19, 38, 48, 28, 43, 19, 24, 57, - 43, 28, 19, 24, 28, 14, 28, 33, 24, 28, 24, 24, 28, 67, - 33, 38, 4, 43, 48, 9, 24, 52, 24, 38, 28, 33, 38, 38, 67, - 24, 28, 19, 24, 24, 14, 19, 43, 28, 48, 19, 33, 33, 33, 43, 67, - 43, 38, 38, 38, 33, 24, 43, 28, 28, 33, 19, 28, 43, 43, 28, 33, 52, - 43, 38, 24, 33, 28, 19, 33, 24, 38, 33, 24, 33, 38, 33, 28, 28, 48, 57, - 38, 24, 24, 24, 24, 24, 28, 24, 52, 19, 43, 43, 24, 28, 24, 24, 28, 38, 62, - 4, 9, 0, 0, 0, 33, 0, 24, 9, 14, 24, 9, 19, 4, 9, 43, 28, 9, 0, 96, - -1, -1, -4, -2, -1, -3, -2, -2, -1, -2, -2, -2, -1, -2, -1, -2, -1, -1, -1, -5, -2, - -4, -3, -1, -5, -5, 4, -6, -1, -2, -5, -2, -4, -2, -6, -5, -5, -3, -3, -3, -2, -3, 8, - -1, 2, -7, 3, 4, -6, -2, 1, -3, -1, -3, -2, 0, -1, 4, -1, -1, -2, -3, -7, -1, -5, 4, -}; -int rpam160mt[]={ - 47, - 36, 52, - 26, 15, 83, - 36, 52, 10, 57, - 36, 47, 10, 52, 57, - 20, 15, 10, 5, 10, 73, - 41, 36, 20, 36, 36, 15, 57, - 26, 41, 20, 36, 36, 26, 20, 68, - 31, 26, 26, 20, 26, 36, 20, 20, 62, - 26, 36, 10, 36, 31, 10, 26, 31, 26, 57, - 26, 15, 5, 15, 20, 41, 15, 26, 47, 20, 62, - 31, 20, 10, 20, 26, 36, 20, 20, 47, 36, 52, 73, - 36, 47, 15, 47, 41, 20, 36, 47, 26, 41, 20, 26, 52, - 41, 31, 20, 26, 31, 15, 31, 31, 26, 26, 20, 26, 31, 62, - 31, 41, 10, 41, 47, 10, 26, 47, 26, 36, 26, 31, 36, 36, 62, - 26, 31, 20, 26, 26, 15, 20, 41, 26, 52, 20, 31, 31, 31, 41, 68, - 41, 36, 36, 36, 36, 20, 41, 31, 26, 31, 20, 26, 41, 41, 31, 31, 47, - 41, 36, 26, 31, 31, 20, 31, 26, 36, 36, 26, 31, 36, 36, 31, 31, 41, 52, - 36, 26, 26, 20, 26, 26, 26, 26, 52, 20, 41, 41, 26, 26, 26, 20, 31, 36, 57, - 10, 10, 0, 5, 0, 31, 0, 20, 10, 15, 26, 15, 15, 10, 10, 41, 26, 10, 5, 99, - 0, -1, -3, -1, -1, -3, -1, -1, -1, -1, -2, -1, 0, -1, -1, -1, 0, 0, -1, -4, -1, - -3, -3, 0, -4, -4, 5, -5, 0, -2, -4, -2, -3, -2, -5, -4, -4, -3, -3, -3, -1, -3, 8, - 0, 2, -5, 2, 3, -5, -1, 1, -2, 0, -3, -2, 1, -1, 3, 0, -1, -1, -2, -6, -1, -4, 3, -}; -int rpam250mt[]={ - 42, - 34, 47, - 25, 17, 85, - 34, 47, 12, 51, - 34, 47, 12, 47, 51, - 21, 17, 17, 8, 12, 72, - 38, 34, 21, 38, 34, 12, 55, - 30, 38, 21, 38, 38, 25, 25, 60, - 30, 25, 25, 25, 25, 38, 21, 25, 55, - 30, 38, 12, 34, 34, 12, 25, 34, 25, 55, - 25, 21, 8, 17, 21, 42, 17, 25, 42, 21, 60, - 30, 25, 12, 21, 25, 34, 21, 25, 42, 34, 51, 60, - 34, 42, 17, 42, 38, 21, 34, 42, 25, 38, 21, 25, 42, - 38, 30, 21, 30, 30, 12, 34, 34, 25, 30, 21, 25, 34, 60, - 34, 38, 12, 42, 42, 12, 30, 47, 25, 38, 25, 30, 38, 34, 51, - 25, 30, 17, 30, 30, 17, 21, 42, 25, 47, 21, 34, 34, 34, 38, 60, - 38, 34, 34, 34, 34, 21, 38, 30, 30, 34, 21, 25, 38, 38, 30, 34, 42, - 38, 34, 25, 34, 34, 21, 34, 30, 34, 34, 25, 30, 34, 34, 30, 30, 38, 47, - 34, 25, 25, 25, 25, 30, 30, 25, 51, 25, 42, 42, 25, 30, 25, 25, 30, 34, 51, - 8, 12, 0, 4, 4, 34, 4, 21, 12, 21, 25, 17, 17, 8, 12, 42, 25, 12, 8, 107, - 0, -1, -3, -1, -1, -2, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, -1, -4, -1, - -3, -3, 0, -4, -4, 7, -5, 0, -1, -4, -1, -2, -2, -5, -4, -4, -3, -3, -2, 0, -2, 10, - 0, 2, -5, 3, 3, -5, 0, 2, -2, 0, -3, -2, 1, 0, 3, 0, 0, -1, -2, -6, -1, -4, 3, -}; -int rpam350mt[]={ - 39, - 36, 43, - 26, 16, 92, - 36, 43, 13, 46, - 36, 43, 13, 46, 46, - 19, 16, 16, 13, 13, 76, - 39, 36, 19, 36, 36, 13, 49, - 29, 36, 19, 36, 36, 26, 26, 56, - 33, 26, 23, 26, 26, 39, 26, 26, 49, - 29, 36, 13, 36, 33, 13, 29, 36, 26, 49, - 26, 19, 9, 19, 19, 43, 19, 26, 46, 23, 59, - 29, 26, 13, 23, 26, 36, 23, 26, 43, 33, 49, 53, - 33, 39, 19, 39, 39, 19, 36, 39, 26, 36, 23, 26, 39, - 36, 33, 23, 33, 33, 16, 33, 33, 26, 29, 23, 26, 33, 53, - 33, 39, 13, 39, 43, 16, 29, 43, 26, 36, 26, 29, 36, 36, 46, - 29, 33, 19, 29, 33, 16, 26, 39, 26, 46, 23, 33, 36, 33, 39, 56, - 36, 36, 33, 36, 33, 19, 36, 29, 29, 33, 23, 26, 36, 36, 33, 33, 36, - 36, 33, 26, 33, 33, 23, 36, 29, 33, 33, 26, 29, 36, 36, 33, 29, 36, 39, - 33, 26, 26, 26, 26, 29, 29, 26, 46, 26, 43, 39, 26, 29, 26, 23, 29, 33, 49, - 9, 13, 0, 6, 6, 36, 6, 23, 13, 19, 26, 16, 16, 9, 16, 46, 23, 13, 9, 122, - 0, 0, -3, -1, 0, -2, -1, 0, 0, -1, -1, 0, 0, 0, 0, -1, 0, 0, 0, -5, -1, - -4, -4, 1, -5, -5, 11, -6, 0, 0, -5, 0, -2, -3, -6, -5, -5, -3, -3, -2, 1, -2, 14, - 0, 2, -6, 3, 3, -6, 0, 2, -2, 1, -3, -2, 2, 0, 3, 1, 0, 0, -2, -7, 0, -5, 3, -}; -int ralpha_mat []={ - 42, - 27, 27, - 31, 27, 60, - 28, 27, 30, 46, - 27, 27, 31, 28, 42, - 25, 27, 31, 28, 29, 84, - 29, 27, 31, 25, 29, 30, 51, - 32, 27, 31, 60, 29, 31, 23, 61, - 46, 27, 28, 28, 31, 14, 29, 23, 52, - 28, 27, 27, 31, 30, 26, 29, 23, 21, 49, - 30, 27, 35, 31, 30, 29, 31, 23, 15, 23, 57, - 28, 27, 30, 31, 29, 12, 24, 20, 18, 25, 33, 53, - 40, 27, 29, 27, 46, 31, 30, 28, 28, 60, 25, 28, 36, - 60, 27, 34, 35, 51, 28, 28, 23, 22, 24, 29, 13, 31, 66, - 36, 27, 28, 28, 27, 29, 30, 31, 34, 32, 24, 42, 32, 29, 35, - 27, 27, 36, 31, 29, 60, 32, 46, 30, 28, 28, 25, 28, 28, 27, 40, - 28, 27, 24, 27, 23, 29, 27, 21, 18, 22, 23, 13, 31, 29, 31, 31, 38, - 31, 27, 32, 30, 29, 29, 61, 22, 16, 29, 30, 12, 28, 30, 30, 31, 29, 36, - 28, 27, 29, 24, 24, 31, 23, 15, 32, 23, 26, 9, 30, 32, 29, 35, 29, 3, 53, - 31, 27, 42, 31, 31, 31, 23, 22, 15, 26, 29, 25, 35, 31, 30, 31, 29, 0, 22, 132, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 2, 10, 3, -2, -6, 38, -14, -7, -1, -19, 0, 5, 3, 1, 4, -29, -6, -19, 0, 97, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -int rbeta_mat[]={ - 44, - 26, 26, - 29, 26, 102, - 27, 26, 22, 64, - 25, 26, 33, 22, 50, - 14, 26, 32, 17, 31, 70, - 28, 26, 31, 14, 35, 32, 68, - 36, 26, 33, 102, 28, 3, 23, 69, - 64, 26, 17, 26, 26, 9, 28, 21, 48, - 11, 26, 26, 31, 12, 28, 39, 17, 18, 52, - 22, 26, 50, 33, 27, 31, 36, 19, 21, 24, 52, - 22, 26, 28, 33, 29, 19, 17, 13, 16, 27, 37, 45, - 57, 26, 28, 25, 64, 33, 22, 11, 22, 102, 14, 26, 38, -102, 26, 39, 50, 68, 30, 30, 16, 0, 24, 32, 17, 31, 87, - 38, 26, 26, 11, 26, 35, 28, 32, 39, 35, 10, 50, 36, 28, 50, - 24, 26, 38, 29, 28, 102, 36, 64, 22, 22, 11, 14, 27, 26, 25, 57, - 26, 26, 10, 26, 23, 21, 22, 16, 17, 22, 8, 19, 33, 31, 26, 33, 46, - 33, 26, 35, 28, 28, 28, 69, 17, 15, 4, 35, 10, 17, 27, 27, 31, 29, 42, - 17, 26, 28, 10, 17, 24, 17, 21, 36, 28, 25, 16, 28, 18, 31, 50, 28, 9, 44, - 31, 26, 50, 32, 36, 21, 21, 14, 14, 24, 34, 2, 50, 31, 12, 33, 31, 13, 22, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 12, 17, 17, -12, -9, 28, -13, -3, 0, -12, 0, 8, 4, -11, 2, -5, -5, -5, 0, 47, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; -int rcoil_mat[]={ - 36, - 27, 27, - 29, 27, 124, - 28, 27, 22, 51, - 28, 27, 33, 18, 40, - 13, 27, 29, 17, 23, 101, - 27, 27, 30, 13, 23, 28, 64, - 31, 27, 30, 124, 21, 15, 24, 76, - 51, 27, 17, 29, 25, 14, 27, 26, 71, - 18, 27, 29, 30, 8, 25, 24, 23, 20, 61, - 22, 27, 39, 33, 22, 28, 28, 21, 24, 27, 70, - 18, 27, 29, 30, 21, 12, 6, 18, 20, 26, 33, 73, - 52, 27, 27, 28, 51, 33, 22, 18, 18, 124, 13, 29, 36, -124, 27, 34, 39, 64, 27, 25, 23, 18, 24, 27, 13, 30, 79, - 36, 27, 29, 18, 29, 23, 29, 29, 34, 32, 13, 40, 31, 21, 39, - 27, 27, 36, 29, 27, 124, 31, 51, 22, 18, 18, 13, 28, 29, 28, 52, - 29, 27, 13, 29, 24, 19, 16, 22, 21, 18, 9, 14, 30, 30, 25, 33, 44, - 33, 27, 32, 29, 27, 20, 76, 10, 19, 20, 32, 9, 17, 28, 22, 30, 29, 55, - 17, 27, 21, 13, 6, 21, 23, 24, 44, 13, 21, 7, 29, 17, 23, 39, 26, 20, 60, - 30, 27, 40, 29, 28, 19, 26, 16, 7, 25, 31, 9, 39, 30, 8, 30, 27, 18, 26, 143, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, -4, 8, -3, -30, -6, 49, -10, -7, -12, -18, 3, 3, -6, -11, 3, 2, 2, -5, 0, 59, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; -int tmpam250mt[]={ - 2, - 0, 0, - 2, 0, 6, - -1, 0, 0, 12, - 0, 0, 6, -1, 13, - -3, 0, 1, -3, 3, 5, - 1, 0, 3, -3, 1, 7, 6, - 6, 0, 2, 6, 0, -1, -3, 11, - 12, 0, -3, -2, -2, -5, 5, 0, 2, - -1, 0, 0, 3, -1, 0, 3, -3, -3, 12, - 0, 0, 11, 6, 3, 5, 3, -3, -2, -2, 3, - -1, 0, 2, 2, -1, -2, -1, -3, -4, -1, 9, 3, - 7, 0, 1, 0, 12, 6, 0, -1, -1, 6, -3, -2, 11, - 6, 0, 8, 11, 6, 0, 2, -4, -1, -2, 3, -4, 3, 11, - 11, 0, -2, -1, 0, 1, 2, 1, 8, 7, -3, 13, 6, 0, 11, - -1, 0, 11, 2, 1, 6, 6, 12, 0, -1, -1, -3, -1, -2, 0, 7, - -2, 0, -3, 0, -3, -3, -3, -4, -2, -3, -3, -4, 2, 2, -2, 6, 3, - 6, 0, 7, 2, 5, -2, 11, -2, -5, -1, 6, -6, -3, -1, 3, 3, 1, 3, - -3, 0, 0, -3, -1, 0, -3, -2, 1, -3, 4, -6, 2, 1, 3, 11, 0, -3, 2, - 3, 0, 13, 1, 3, -2, 0, -4, -4, -2, 1, 1, 11, 2, -1, 2, -1, -4, -1, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 1, 8, 3, -4, -3, 2, -4, -3, -1, -4, 0, 0, -1, -3, 1, 5, 0, -3, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -int rtmpam250mt[]={ - 32, - 24, 24, - 32, 24, 49, - 20, 24, 24, 73, - 24, 24, 49, 20, 77, - 12, 24, 28, 12, 36, 45, - 28, 24, 36, 12, 28, 53, 49, - 49, 24, 32, 49, 24, 20, 12, 69, - 73, 24, 12, 16, 16, 4, 45, 24, 32, - 20, 24, 24, 36, 20, 24, 36, 12, 12, 73, - 24, 24, 69, 49, 36, 45, 36, 12, 16, 16, 36, - 20, 24, 32, 32, 20, 16, 20, 12, 8, 20, 61, 36, - 53, 24, 28, 24, 73, 49, 24, 20, 20, 49, 12, 16, 69, - 49, 24, 57, 69, 49, 24, 32, 8, 20, 16, 36, 8, 36, 69, - 69, 24, 16, 20, 24, 28, 32, 28, 57, 53, 12, 77, 49, 24, 69, - 20, 24, 69, 32, 28, 49, 49, 73, 24, 20, 20, 12, 20, 16, 24, 53, - 16, 24, 12, 24, 12, 12, 12, 8, 16, 12, 12, 8, 32, 32, 16, 49, 36, - 49, 24, 53, 32, 45, 16, 69, 16, 4, 20, 49, 0, 12, 20, 36, 36, 28, 36, - 12, 24, 24, 12, 20, 24, 12, 16, 28, 12, 40, 0, 32, 28, 36, 69, 24, 12, 32, - 36, 24, 77, 28, 36, 16, 24, 8, 8, 16, 28, 28, 69, 32, 20, 32, 20, 8, 20, 73, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 1, 8, 3, -4, -3, 2, -4, -3, -1, -4, 0, 0, -1, -3, 1, 5, 0, -3, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/parttree.c b/binaries/src/tcoffee/t_coffee_source/parttree.c deleted file mode 100644 index 8a6a413..0000000 --- a/binaries/src/tcoffee/t_coffee_source/parttree.c +++ /dev/null @@ -1,1040 +0,0 @@ -#include -#include -#include -#include -#include -// #include - -#include "fast_tree_header.h" -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" -//TODO: -change kick-out value -// -pass arrays in partTree_r - -/*! - * \file parttree.c - * \brief Source code for PartTree algorithm. - */ - - - -#define ENLARGEMENT_PER_STEP 50 - - - -void -print_fastal_tree(Tree_fastal *tree, - int pos, - FILE *tree_file, - int num_seq) -{ - if (tree[pos].left >= num_seq) - print_fastal_tree(tree, tree[pos].left-num_seq, tree_file, num_seq); - if (tree[pos].right >= num_seq) - print_fastal_tree(tree, tree[pos].right-num_seq, tree_file, num_seq); - - fprintf(tree_file, "%i %i %i\n", tree[pos].left, tree[pos].right, tree[pos].name); -} - - - - - -PartTree_param *param_set; - - -//********************** UPGMA ***************************** - -/** - * Function to write tree to file in fastal_format. Leafs in \a tree are leafs in the complete tree as well. - * - * \param tree The root node of the (sub)tree. - * \param param_set Parameter of PartTree. - * \param start_write_here Current node to write into. - * \return position in tree - * \see tree_process - */ -int -tree_process_simple(NT_node tree, - PartTree_param *param_set, - int start_write_here) -{ - if (tree->isseq) - { -// printf("T: %s\n", tree->name); - return atoi(tree->name); - } - else - { - Tree_fastal *tree_flat = ¶m_set->tree[start_write_here]; - tree_flat->name = start_write_here +param_set->num_sequences; - if (start_write_here == param_set->pos_tree) - { - ++param_set->pos_tree; - } - start_write_here = param_set->pos_tree; - int left = tree_process_simple(tree->left, param_set, start_write_here); - start_write_here = param_set->pos_tree; - int right = tree_process_simple(tree->right, param_set, start_write_here); - tree_flat->index = NULL; - tree_flat->right = right; - tree_flat->left = left; - return tree_flat->name; - } -} - - - - -/** -* Function to write tree to file in fastal_format. Leafs in \a tree do not need to be leafs in the complete tree. -* -* \param tree The root node of the (sub)tree. -* \param param_set Parameter of PartTree. -* \param clusters Number of sequences in each cluster. -* \param subgroup The sequences for each cluster. -* \param start_write_here Current node to write into. -* \return position in tree -* \see tree_process_simple -*/ -int -tree_process(NT_node tree, - PartTree_param *param_set, - int *clusters, - int *subgroup, - int start_write_here) -{ - if (tree->isseq) - { - int node_num = atoi(tree->name); - int num_in_sub = clusters[node_num+1] - clusters[node_num]; -// printf("NUM: %i %i %i %i\n",node_num, num_in_sub, clusters[node_num+1], clusters[node_num]); - if (num_in_sub > 1) - { - Tree_fastal *tree_flat = ¶m_set->tree[start_write_here]; - tree_flat->name = start_write_here +param_set->num_sequences; - if (start_write_here == param_set->pos_tree) - { - ++param_set->pos_tree; - } - tree_flat->left = -1; - tree_flat->right = -1; - tree_flat->index = &subgroup[clusters[node_num]]; - - tree_flat->num_leafs = num_in_sub; - return tree_flat->name; - } - else - { - return(subgroup[clusters[node_num]]); - } - } - else - { -// printf("TREEPOS: %i\n",param_set->pos_tree); - Tree_fastal *tree_flat = ¶m_set->tree[start_write_here]; - tree_flat->name = start_write_here +param_set->num_sequences; - if (start_write_here == param_set->pos_tree) - { - ++param_set->pos_tree; - } - start_write_here = param_set->pos_tree; - int left = tree_process(tree->left, param_set, clusters, subgroup, start_write_here); - start_write_here = param_set->pos_tree; - int right = tree_process(tree->right, param_set, clusters, subgroup, start_write_here); - tree_flat->index = NULL; - tree_flat->right = right; - tree_flat->left = left; - return tree_flat->name; - } -} - - -/** -* \brief Calculates tree out of distance matrix. -* -* Calculates the upgma tree using a given distance matrix. -* \param mat The distance matrix. -* \param nseq Number of sequences. -* \param fname Filename for temporary storage. -* \param seqnames Names of the sequences. -* \return The calculated UPGMA Tree. -*/ -NT_node ** int_dist2upgma_tree_fastal (int **mat, int nseq, char *fname, char **seqnames) -{ - NT_node *NL, T; - int a, n, *used; - int tot_node; - if (upgma_node_heap (NULL)) - { - printf_exit ( EXIT_FAILURE,stderr, "\nERROR: non empty heap in upgma [FATAL]"); - } - NL=vcalloc (nseq, sizeof (NT_node)); - - for (a=0; aname, "%s", seqnames[a]); - NL[a]->isseq=1; - NL[a]->leaf=1; - } - used=vcalloc ( nseq, sizeof (int)); - n=nseq; - while (n>1) - { - T=upgma_merge(mat, NL,used, &n, nseq); - } - vfree (used); - vfclose (print_tree (T, "newick", vfopen (fname, "w"))); - upgma_node_heap (NULL); - vfree (NL); - - return read_tree (fname,&tot_node, nseq, seqnames); -} - - - - -//Part_Tree - -/*! -* \brief Constructs a guide tree for multiple sequence alignment. -* -* This algorithm is an implementation of the partTree algorithm (PartTree: an algorithm to build an approximate tree from a large number of unaligned -* sequences. Katoh et al. 2007). -* \param sequence_f Filename of file with sequences. -* \param tree_f Filename of file where the tree will be stored. -* \param ktup Size of the ktups. -* \param subgroup Parameter for subgroupsize. -*/ -void -make_partTree(char *sequence_f, - char *tree_f, - int ktup, - int subgroup) -{ - param_set = vcalloc(1,sizeof(PartTree_param)); - param_set->ktup = ktup; - param_set->subgroup = subgroup; - - long *file_positions = NULL; - long **tmp1 = &file_positions; - int *seq_lengths = NULL; - int **tmp2 = &seq_lengths; - - //make index - int number_of_sequences = make_pos_len_index_of_file(sequence_f, "KTUP_table", tmp1, tmp2, ktup, "DNA"); - param_set->num_sequences = number_of_sequences; - param_set->ktup_positions = file_positions; - param_set->seq_lengths = seq_lengths; - param_set->threshold = 0.01; - param_set->ktup_table_f = fopen("KTUP_table","r"); - - Tree_fastal *tree = vcalloc(number_of_sequences-1,sizeof(Tree_fastal)); - param_set->tree = tree; - - int i; - partTree_r(param_set); -// for (i = 0; i < number_of_sequences-1; ++i) -// { -// printf("%i %i %i\n", tree[i].left, tree[i].right, tree[i].name); -// } - FILE * tree_file = fopen(tree_f,"w"); - print_fastal_tree(tree, 0, tree_file, number_of_sequences); - fclose(tree_file); - vfree(tree); -} - - -/** -* Filters seed set. -* -* \param sequence_group Sequences to filter. -* \param dist_mat The distance matrix. -* \param seed_set_cleaned ordered_seed_set. -* \param param_set Parameters for PartTree algorithm. -* \return number in the filtered set. -*/ -int -filter(int *sequence_group, - int **dist_mat, - int *seed_set_cleaned, - PartTree_param *param_set) -{ - int i, j; - int num_in_subgroup = param_set->subgroup; - int *seq_lengths = param_set->seq_lengths; - int num_in_clean = 0; - double threshold = param_set->threshold; -// printf("threshold: %f\n", threshold); - double min; - for (i = 0; i < num_in_subgroup; ++i) - { - if (!seed_set_cleaned[i]) - continue; - for (j = i+1; j < num_in_subgroup; ++j) - { - min = MIN(seq_lengths[sequence_group[i]], seq_lengths[sequence_group[j]]); -// printf("MINIMUM: %i\n",min); - min = (threshold * min); -// printf("MINIMUM: %f\n",min); - if (seed_set_cleaned[j] &&(dist_mat[i][j] < min)) - { - if (seq_lengths[sequence_group[i]] < seq_lengths[sequence_group[j]]) - { - seed_set_cleaned[i] = 0; - break; - } - else - seed_set_cleaned[j] = 0; - } - } - } - - for (i = 0; i < num_in_subgroup; ++i) - { - num_in_clean += seed_set_cleaned[i]; - } - int max = num_in_subgroup -1; - i = 0; - int tmp; -// printf("CLEAN: %i\n", num_in_clean); - while (i < num_in_clean) - { - if (seed_set_cleaned[i]) - { - ++i; - } - else - { - seed_set_cleaned[i] = seed_set_cleaned[max]; - seed_set_cleaned[max] = 0; - tmp = sequence_group[i]; - sequence_group[i] = sequence_group[max]; - sequence_group[max] = tmp; - --max; - } - } - return num_in_clean; -} - - - - - -/*! -* \brief Function to create a tree using the PartTree algorithm. -* -* \param param_set A \a PartTree_param object containing all necessary parameters and the data. -* \return The node_number. -*/ -void -partTree_r(PartTree_param *param_set) -{ - - int num_of_tree_nodes = param_set->num_sequences-1; - int loop_tree_node; - - Tree_fastal *tree = param_set->tree; -// int this_node = param_set->pos_tree; - - int i; - int tsize = param_set->tsize; - - - //get some memory - short *table1 = vcalloc(tsize, sizeof(short)); - short *table2 = vcalloc(tsize, sizeof(short)); - int *seed_set = vcalloc(param_set->subgroup, sizeof(int)); - char **names = declare_char(param_set->subgroup, 8); - int **dist_mat = declare_int(param_set->subgroup, param_set->subgroup); - int **dist_mat2 = declare_int(param_set->subgroup, param_set->subgroup); - char * file_name_tmp = vtmpnam(NULL); - int *seed_set_cleaned = vcalloc(param_set->subgroup, sizeof(int)); - FILE *table_f = param_set->ktup_table_f; - long *file_positions = param_set->ktup_positions; - int max_n_group = param_set->subgroup; - int num_in_subgroup = param_set->subgroup; - int *seq_lengths = param_set->seq_lengths; - int *clusters = vcalloc(param_set->subgroup+1, sizeof(int)); - int *min_dist = vcalloc(param_set->num_sequences, sizeof(int)); - int *belongs_to = vcalloc(param_set->num_sequences, sizeof(int)); - - - - - - - //Prepare first node - - tree[0].index = vcalloc(param_set->num_sequences,sizeof(int)); - int *index = tree[0].index; - for (i = 0; i< param_set->num_sequences; ++i) - index[i] = i; - tree[0].name = param_set->pos_tree +param_set->num_sequences; - - tree[0].num_leafs = param_set->num_sequences; - int *sequence_group2 = vcalloc(param_set->num_sequences,sizeof(int)); - - Tree_fastal *current_node; - for (loop_tree_node = 0; loop_tree_node < num_of_tree_nodes; ++loop_tree_node) - { -// printf("ROUND: %i\n", loop_tree_node); - current_node = &tree[loop_tree_node]; - index= current_node->index; - if (current_node->index == NULL) - { - continue; - } - int num_sequences = current_node->num_leafs; - - //if number of sequences in this group smaller than number subgoup size: make tree, finisch - if (num_sequences <= max_n_group) - { - int j; - dist_mat = make_distance_matrix(table_f, file_positions, index, num_sequences, dist_mat); - for (i = 0; i < num_sequences; ++i) - { - sprintf(names[i],"%i", current_node->index[i]); - } - NT_node **tree= (int_dist2upgma_tree_fastal (dist_mat, num_sequences, file_name_tmp , names)); - tree_process_simple(tree[0][0], param_set,loop_tree_node); - continue; - } - - - for (i = 0; i < num_in_subgroup; ++i) - { - seed_set_cleaned[i] = 1; - } - - //finde longest sequence and put into the first field - - int index_longest = 0; - int length_of_longest = 0; - - for(i = 0; i < num_sequences; ++i) - { - if (seq_lengths[index[i]] > length_of_longest) - { - index_longest = i; - length_of_longest = seq_lengths[index[i]]; - } - } - int tmp = index[index_longest]; - index[index_longest] = index[0]; - index[0] = tmp; - - //distance of longest to rest - int seq_index = 1; - int min= euclidean_dist(table_f, file_positions[index[0]], file_positions[index[1]], table1, table2, param_set->tsize); - for (i = 2; i < num_sequences; ++i) - { - tmp = euclidean_dist_half(table_f, file_positions[index[i]], table1, table2, param_set->tsize); - if (tmp < min) - { - min = tmp; - seq_index = i; - } - } - - //get the new seed_set in the first n spaces - tmp = index[1]; - index[1] = index[seq_index]; - index[seq_index] = tmp; - int r,j; - num_in_subgroup = param_set->subgroup; - - - for (i = 2; i < num_in_subgroup; ++i) - { - r = i + rand() / ( RAND_MAX / ( num_sequences-i) + 1 ); -// printf("RANDOM: %i\n",r); - tmp = index[r]; - index[r] = index[i]; - index[i] = tmp; - } - - //Calculate matrix - dist_mat = make_distance_matrix(table_f, file_positions, index, param_set->subgroup, dist_mat); - - //Filter out sequences that are to similar & reorder - - NT_node **upgma_tree; - - - int num_in_clean = filter(index, dist_mat, seed_set_cleaned, param_set); -// if (num_in_clean == 1) -// { -// int j; -// // dist_mat = make_distance_matrix(table_f, file_positions, index, upgma_tree, dist_mat); -// for (i = 0; i < param_set->subgroup; ++i) -// { -// sprintf(names[i],"%i", current_node->index[i]); -// } -// upgma_tree= (int_dist2upgma_tree_fastal (dist_mat, param_set->subgroup, file_name_tmp , names)); -// tree_process_simple(upgma_tree[0][0], param_set,loop_tree_node); -// continue; -// } -// else -// { - - if (num_in_clean ==1) - { - num_in_clean = 2; - seed_set_cleaned[1] = 1; - } - //make_tree - int col = 0; - int row = 0; - for (i = 0; i < num_in_subgroup; ++i) - { - if (seed_set_cleaned[i]) - { - row = col+1; - for (j = i+1; j < num_in_subgroup; ++j) - { - if (seed_set_cleaned[j]) - { - dist_mat2[row][col] = dist_mat2[col][row] = dist_mat[i][j]; - ++row; - } - } - ++col; - } - } - for (i = 0; i < num_in_clean; ++i) - { - sprintf(names[i],"%i",i); - } - upgma_tree= (int_dist2upgma_tree_fastal (dist_mat2, num_in_clean, file_name_tmp , names)); -// } - -// int *pos_tree_p = ¶m_set->pos_tree; - - - int leaf = 0; - - //cluster - //calculate distances from n' to N - get_table(table1, table_f, file_positions[index[0]]); - for (j = num_in_clean; j < num_sequences; ++j) - { - min_dist[j] = euclidean_dist_half(table_f, file_positions[index[j]], table1, table2, param_set->tsize); - belongs_to[j] = 0; - } - for(i = 1; i < num_in_clean; ++i) - { - get_table(table1, table_f, file_positions[index[i]]); - belongs_to[i] = i; - for (j = num_in_clean; j < num_sequences; ++j) - { - tmp = euclidean_dist_half(table_f, file_positions[index[j]], table1, table2, param_set->tsize); - if (tmp < min_dist[j]) - { - min_dist[j] = tmp; - belongs_to[j] = i; - } - } - } - - //how_many sequences has each cluster - for (j = 0; j <= num_in_subgroup; ++j) - { - clusters[j] = 0; - } - for (j = 0; j < num_sequences; ++j) - { - ++clusters[belongs_to[j]]; - } -// for (j = 0; j <= num_in_subgroup; ++j) -// { -// printf("CL: %i ",clusters[j]); -// } -// printf("\n"); - for(i = 1; i < num_in_clean; ++i) - { - clusters[i] += clusters[i-1]; - } - clusters[num_in_clean] = clusters[num_in_clean-1]; - - for (i = 0; i < num_sequences; ++i) - { - sequence_group2[--clusters[belongs_to[i]]] = index[i]; - } - - for (i = 0; i < num_sequences; ++i) - { - index[i] = sequence_group2[i]; - } - - - for (i = 0; i < num_in_clean; ++i) - { - sprintf(names[i],"%i",i); - } - tree_process(upgma_tree[0][0], param_set, clusters, index, loop_tree_node); - NT_node tmp_tree = upgma_tree[3][0]; - vfree(upgma_tree[0]); - vfree(upgma_tree[1]); - vfree(upgma_tree[2]); - vfree(upgma_tree[3]); - vfree(upgma_tree); - free_tree(tmp_tree); - } - vfree(min_dist); - vfree(belongs_to); - vfree(clusters); -} - - - -/*! - * \brief Makes the distance matrix between all sequences. - * - * \param table_file File with the ktup tables - * \param file_positions Index of positions where the tabels are stored in \a table_file - * \param sequence_group the group of sequences - * \param number number of sequences - * \param dist_mat distance matrix - * \return the distance matrix. (same as \a dist_mat ) -*/ -int ** -make_distance_matrix(FILE *table_f, - long *file_positions, - int *sequence_group, - int number, - int **dist_mat) -{ - static short *table1 = NULL; - static short *table2; - int tsize = param_set->tsize; - if (table1 == NULL) - { - table1 = vcalloc(tsize, sizeof(short)); - table2 = vcalloc(tsize, sizeof(short)); - } - int i, j, num = number-1; - for (i = 0; i < num; ++i) - { - j = i+1; - dist_mat[i][j] = dist_mat[j][i]= euclidean_dist(table_f, file_positions[sequence_group[i]], file_positions[sequence_group[j]], table1, table2, tsize); - ++j; - for (; j < number; ++j) - { - dist_mat[i][j] = dist_mat[j][i] = euclidean_dist_half(table_f, file_positions[sequence_group[j]], table1, table2, tsize); - } - } - return dist_mat; -} - - - - -/** -* Replaces the coded sequence with coded tuples -* -* \param coded_seq The coded sequence which will be replaced by the tuple number -* \param ktup Size of the ktup -* \param ng Coded alphabet size -* \param length Lengths of coded sequence -*/ -void -makepointtable_fast(int *coded_seq, //sequence - int ktup, //ktup size - int ng, //hmm... - int length) //length of coded_seq -{ - int point, a; - register int *p; - static int *prod; - - if (!prod) - { - prod=vcalloc ( ktup, sizeof (int)); - for ( a=0; a 0) - fprintf(tables_f, "%i %i\n", point, table[point]); - } - fprintf(tables_f, "*\n"); -} - - -/** JUST FOR TEST */ -void -make_fast_tree(char *file_name, - int n, - int ktup) -{ - - make_partTree(file_name, "TREE_OUT", ktup, n); - -} - - - -/** -* \brief Reads ktup_table from file -* -* \param table Table to save the file content in. -* \param tables_f File in which the tables are stored. -* \param index Position of the table in \a tables_f -*/ -void -get_table(short *table, //Table to save the readings in - FILE* tables_f, //File with tables - long index) //index positin of ktup-tables -{ - fseek(tables_f, index, SEEK_SET); - const int LINE_LENGTH = 101; - char line[LINE_LENGTH]; - fgets(line, LINE_LENGTH, tables_f); - - char delims[] = " "; - char *result = NULL; - int code; - - while (line[0] != '*') - { - result = strtok( line, delims ); - code = atoi(result); - table[code] = atoi(strtok( NULL, delims)); - fgets(line, LINE_LENGTH, tables_f); - } -} - - - -/** -* \brief calculates the euclidean ktub distance between two sequences -* -* @param ktup_f, ktup_file -* @param pos1 position of sequence 1 in \a ktup_f -* @param pos2 position of sequence 2 in \a ktup_f -* @param table1 Saves the number of occurences for each ktup in sequence 1 -* @param table2 Saves the number of occurences for each ktup in sequence 2 -*/ -int -euclidean_dist(FILE* ktup_f, //ktup_file - long pos1, //position of table1 - long pos2, //position of table2 - short *table1, //table to save ktups in - short *table2, //table to save ktups in - int length) -{ - const int LINE_LENGTH = 101; - char line[LINE_LENGTH]; - - - char delims[] = " "; - char *result = NULL; - int code; - - fseek(ktup_f, pos1, SEEK_SET); - fgets(line, LINE_LENGTH, ktup_f); - int i; - for (i = 0; i < length; ++i) - { - table1[i] = 0; - table2[i] = 0; - } - while (line[0] != '*') - { - result = strtok( line, delims ); - code = atoi(result); - table1[code] = atoi(strtok( NULL, delims)); - fgets(line, LINE_LENGTH, ktup_f); - } - fseek(ktup_f, pos2, SEEK_SET); - fgets(line, LINE_LENGTH, ktup_f); - while (line[0] != '*') - { - result = strtok( line, delims ); - code = atoi(result); - table2[code] = atoi(strtok( NULL, delims)); - fgets(line, LINE_LENGTH, ktup_f); - } - - int dist = 0; - for (i = 0; i < length; ++i) - { - dist += (table1[i]-table2[i])*(table1[i]-table2[i]); - } - return dist; -} - - - -/** - * \brief calculates the euclidean ktub distance between two sequences. - * - * The difference to \a euclidean_dist is, that this uses the ktups stored in \a table1 - * @param ktup_f, ktup_file - * @param pos2 position of sequence 2 in \a ktup_f - * @param table1 Saves the number of occurences for each ktup in sequence 1 - * @param table2 Saves the number of occurences for each ktup in sequence 2 - * \see euclidean_dist - */ -int -euclidean_dist_half(FILE* ktup_f, //ktup_file - long pos2, //position of table1 - short *table1, //table to save ktups in - short *table2, //table to save ktups in - int length) -{ - const int LINE_LENGTH = 101; - char line[LINE_LENGTH]; - - - char delims[] = " "; - char *result = NULL; - int code; - - fseek(ktup_f, pos2, SEEK_SET); - fgets(line, LINE_LENGTH, ktup_f); - int i; - for (i = 0; i < length; ++i) - { - table2[i] = 0; - } - while (line[0] != '*') - { - result = strtok( line, delims ); - code = atoi(result); - table2[code] = atoi(strtok( NULL, delims)); - fgets(line, LINE_LENGTH, ktup_f); - } - - int dist = 0; - for (i = 0; i < length; ++i) - { - dist += (table1[i]-table2[i])*(table1[i]-table2[i]); - } - return dist; -} - - - - -/** -* Makes an index of a file -*/ -int -make_pos_len_index_of_file(char *file_name, //file with sequences - char *ktable_f, //file with the ktup-tables - long **file_positions, //array to save the positions - int **seq_lengths, //array to save the sequence length - int ktup, //length of ktup - char *type) //type of the seuqence -{ - //preparations for recoding sequence - int *aa; - int a, b, l; - - int ng = 0; - char **gl; - if ( strm (type, "DNA") || strm (type, "RNA")) - { - gl=declare_char (5,13); - sprintf ( gl[ng++], "Aa"); - sprintf ( gl[ng++], "Gg"); - sprintf ( gl[ng++], "TtUu"); - sprintf ( gl[ng++], "Cc"); - sprintf ( gl[ng++], "NnRrYyDdMmWw"); - } - else - { - gl=make_group_aa ( &ng, "mafft"); - } - aa=vcalloc ( 256, sizeof (int)); - for ( a=0; atsize = tsize; - param_set->ng = ng; - - int *table=vcalloc ( tsize,sizeof (int)); - - - //Reading and recoding squences - const int LINE_LENGTH = 501; - int *coded_seq = vcalloc(2*LINE_LENGTH, sizeof(int)); - int allocated_mem = 2*LINE_LENGTH; - - (*file_positions) = vcalloc(ENLARGEMENT_PER_STEP, sizeof(long)); - (*seq_lengths) = vcalloc(ENLARGEMENT_PER_STEP, sizeof(int)); - int current_size = ENLARGEMENT_PER_STEP; - int current_pos = 0; - - FILE *file = fopen(file_name,"r"); - - - int seq_length=0; - char line[LINE_LENGTH]; - - int num_of_sequences = 0; - int str_len = 0; - int mem_for_pos = ENLARGEMENT_PER_STEP; - int tmp; - int real_len; - int *c_seq; - - FILE *tables_f = fopen(ktable_f, "w"); - - - if (file == NULL) - { - printf("FILE NOT FOUND\n"); - exit(1); - } - else - { - - while(fgets(line, LINE_LENGTH , file)!=NULL) - { - if ( str_len >= allocated_mem - LINE_LENGTH) - { - allocated_mem += LINE_LENGTH; - coded_seq = vrealloc(coded_seq, allocated_mem*sizeof(int)); - } - - int i; - int length = strlen(line); - if (line[0] == '>') - { - if (num_of_sequences >0) - { - (*seq_lengths)[num_of_sequences-1] = str_len; -// printf("len: %i\n", str_len); - c_seq = coded_seq; - makepointtable_fast(coded_seq,ktup,ng, str_len); - - (*file_positions)[num_of_sequences-1] = ftell(tables_f ); - for (i=0; i < tsize; ++i) - table[i] = 0; - makecompositiontable_fastal(tables_f, table, coded_seq,tsize ); - - - } - str_len = 0; - ++num_of_sequences; - - if (num_of_sequences == mem_for_pos) - { - mem_for_pos += ENLARGEMENT_PER_STEP; - (*file_positions) = vrealloc((*file_positions), mem_for_pos * sizeof(long)); - (*seq_lengths) = vrealloc((*seq_lengths), mem_for_pos * sizeof(int)); - } - } - else - { - int i; - real_len = strlen(line); - if (line[real_len-1] == '\n') - --real_len; - for (i = 0; i < real_len; ++i) - { - coded_seq[str_len++] = aa[line[i]]; - } - } - } - } - - (*seq_lengths)[num_of_sequences-1] = str_len; - c_seq = coded_seq; - makepointtable_fast(coded_seq,ktup,ng, str_len); - (*file_positions)[num_of_sequences] = ftell(tables_f ); - makecompositiontable_fastal(tables_f, table, coded_seq,tsize ); - fclose(file); - fclose(tables_f); - return num_of_sequences; -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/pavie_dp.c b/binaries/src/tcoffee/t_coffee_source/pavie_dp.c deleted file mode 100644 index 4353b80..0000000 --- a/binaries/src/tcoffee/t_coffee_source/pavie_dp.c +++ /dev/null @@ -1,1411 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" - - -static double mc_delta_matrix ( int ***mat1, int ***mat2, char **alp, int nch); -static double delta_matrix ( int **mat1,int **mat2, char *alp); -static double ***pavie_seq2pavie_fmat (Sequence *S,double *gop, double *gep, char **mat, char *idmat, int id_threshold, int sample_size, int nch, char *param ); -static int **pavie_fmat2pavie_logodd_mat (double **fmat, char *alp); -static double **pavie_aln2fmat(Alignment *A, double **fmat, char *idmat, int id_threshold, int ch, int nch, char *param); -static int pavie_mat2pavie_id_mat ( int **mat,char *in_name, char *alp, char *ignore, char *force,int T, char *out_name); -static double paviemat2gep ( int **mat, char *alp); -static Alignment *align_pavie_sequences (char *seq0,char *seq1,char **mat,double *gop,double *gep,int nch, char *param); -static int pavie_score (char *s0,int p0, char *s1,int p1,char **mat_file, double *gop, double *gep, int nch, float factor, char *param); -static char **seq2pavie_alp (Sequence *S, int nch); -static Sequence * seq2pavie_seq ( Sequence *S, int nch); -static FILE* output_pavie_aln (Alignment *A, int nch, FILE *fp); -static char **output_pavie_mat_list ( int ***current_mat, double *gep, char **alp, int nch,char *prefix,int cycle, char **mat_name); -static float pavie_aln2id ( Alignment *A, int mode); -static int check_pavie_cl ( char *string); -float pavie_aln2delta_age ( Alignment *A,int s0, int s1, int a0, int a1); - -static float tgep_factor; -static int id_thres_used_aln; -static int log_odd_mode; -Sequence * pavie_seq2noisy_seq ( Sequence *S, int freq, char *alp) -{ - int a, b, l1, l2; - - vsrand(0); - - if (alp==NULL) - { - char **x; - x=seq2pavie_alp (S,1); - alp=x[0]; - } - - l2=strlen (alp); - for (a=0; a< S->nseq; a++) - { - l1=strlen (S->seq[a]); - for ( b=0; bseq[a][b]=alp[rand()%l2]; - } - } - return S; -} -Sequence * pavie_seq2random_seq ( Sequence *S, char *subst) -{ - int a, b, r, l; - - - vsrand (0); - r=subst[0]; subst++; - l=strlen (subst); - for ( a=0; a< S->nseq; a++) - for (b=0; blen[a]; b++) - if ( S->seq[a][b]==r)S->seq[a][b]=subst[rand()%l]; - return S; -} - -double **pavie_seq2pavie_aln(Sequence *S,char *mat, char *mode) -{ - int a, b,c, nch=0; - char **mat_list; - char *buf; - - double *gep, *gop; - Alignment *A; - char **alp; - char *pavie_idmat; - FILE *fp; - double **dist_mat; - float score; - - check_pavie_cl (mode); - - mat_list=declare_char (100, 100); - - if ( is_matrix (mat)) - { - sprintf ( mat_list[nch++], "%s", mat); - } - else - { - fp=vfopen (mat,"r"); - while ( (c=fgetc(fp))!=EOF) - { - ungetc(c, fp); - fscanf (fp, "%s\n",mat_list[nch++]); - } - vfclose (fp); - } - - alp=seq2pavie_alp (S, nch); - S=seq2pavie_seq (S, nch); - - gop=vcalloc (nch, sizeof (double)); - gep=vcalloc (nch, sizeof (double)); - - for ( a=0; a< nch; a++) - { - int **m; - char *st; - int v; - m=read_matrice (mat_list[a]); - if ((st=vstrstr(mode, "_GEP"))) - { - sscanf ( st, "_GEP%d_", &v); - gep[a]=v*-1; - } - else if ( m[0][GAP_CODE]==0) - { - gep[a]=paviemat2gep(m,alp[a]); - } - else - { - gep[a]=m[0][GAP_CODE]; - } - free_int (m, -1); - } - - - if ( (buf=vstrstr (mode, "_TGEPF"))) - { - - sscanf (buf, "_TGEPF%f_", &tgep_factor); - tgep_factor/=(float)100; - } - else - { - tgep_factor=0.5; - } - - pavie_idmat=vtmpnam(NULL); - - pavie_mat2pavie_id_mat (NULL,"idmat", alp[0],"X","",1,pavie_idmat); - dist_mat=declare_double ( S->nseq, S->nseq); - - - - for ( a=0; a< S->nseq-1; a++) - { - for ( b=a+1; b< S->nseq; b++) - { - int a0, a1; - float delta_a; - - - if ( ! strstr (mode, "_MSA_")) - { - A=align_pavie_sequences (S->seq[a],S->seq[b],mat_list,gop,gep,nch, mode); - sprintf ( A->name[0], "%s", S->name[a]); - sprintf ( A->name[1], "%s", S->name[b]); - } - else - { - - A=strings2aln ( 2, S->name[a], S->seq[a], S->name[b], S->seq[b]); - sprintf ( A->seq_al[0], "%s", S->seq[a]); - sprintf ( A->seq_al[1], "%s", S->seq[b]); - A->len_aln=strlen (S->seq[a]); - ungap_aln (A); - } - - if (strm (mode, "_ID01_"))A->score=score=pavie_aln2id (A, 1); - else if ( vstrstr (mode, "_ID02_"))A->score=score=pavie_aln2id (A, 2); - else if ( vstrstr (mode, "_ID04_"))A->score=score=pavie_aln2id (A, 4); - else if ( vstrstr (mode, "_ID05_"))A->score=score=pavie_aln2id (A, 5); - else if ( vstrstr (mode, "_ID06_"))A->score=score=pavie_aln2id (A, 6); - - else A->score=score=pavie_aln2id (A, 1); - - a0=S->seq[a][strlen(S->seq[a])+1]; - a1=S->seq[b][strlen(S->seq[b])+1]; - - delta_a=pavie_aln2delta_age (A, 0, 1, a0, a1); - - if ( vstrstr (mode, "_MATDIST_")) - dist_mat[a][b]=dist_mat[b][a]=(double)(vstrstr (mode, "_ID05") || vstrstr (mode, "_ID06"))?-score*100:(100-score); - else if ( vstrstr (mode, "_MATSIM_")) - dist_mat[a][b]=dist_mat[b][a]=(double)(score); - - - if ( !vstrstr (mode, "_MAT") ) - { - fprintf ( stdout, "#############\nAlignment %s %s: %d %% ID SCORE %d DELTA_AGE %.2f\n", S->name[a], S->name[b], A->score, A->score_aln, delta_a); - output_pavie_aln (A,nch, stdout); - } - free_aln(A); - } - } - - if ( vstrstr (mode, "_MAT") && !vstrstr ( mode, "_NOPRINT_")) - { - if ( vstrstr (mode, "_MFORMAT2")) - { - int max, n; - float *tot,s, bigtot=0; - - for (max=0, a=0; a< S->nseq; a++)max=MAX(max,(strlen (S->name[a]))); - tot=vcalloc ( S->nseq, sizeof (float)); - fprintf (stdout, "# TC_DISTANCE_MATRIX_FORMAT_01\n"); - for ( a=0; anseq; a++) - fprintf ( stdout, "# SEQ_INDEX %s %d\n",S->name[a],a); - fprintf ( stdout, "# PW_SEQ_DISTANCES \n"); - for (n=0,a=0;a< S->nseq-1; a++) - { - for ( b=a+1; bnseq; b++, n++) - { - s=dist_mat[a][b]; - - fprintf (stdout, "BOT\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", a,b,s,max,S->name[a], max, S->name[b], s); - fprintf (stdout, "TOP\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", b,a,s,max,S->name[b], max, S->name[a], s); - tot[a]+=s; - tot[b]+=s; - bigtot+=s; - } - } - for ( a=0; a< S->nseq; a++) - { - fprintf (stdout, "AVG\t %d\t %*s\t %*s\t %5.2f\n", a,max,S->name[a], max, "*", tot[a]/(S->nseq-1)); - } - vfree (tot); - fprintf (stdout, "TOT\t %*s\t %*s\t %5.2f\n", max,"TOT", max, "*", bigtot/n); - vfclose (stdout); - } - else - { - for ( a=0; anseq; a++) - { - fprintf ( stdout, "\n%s ", S->name[a]); - for ( b=0; b< S->nseq; b++) - fprintf ( stdout, "%6d ", (int)(dist_mat[a][b]*100)); - } - } - } - - return dist_mat; -} - -float pavie_aln2delta_age ( Alignment *A,int s0, int s1, int a0, int a1) -{ - int a,r0, r1, g0, g1, n; - float delta; - for (n=0, delta=0, a=0; a< A->len_aln; a++) - { - r0=A->seq_al[s0][a]; - r1=A->seq_al[s1][a]; - - g0=!is_gap(r0); - g1=!is_gap(r1); - - a0+=g0;a1+=g1; - if ( g0 && g1) - { - delta+=FABS((a0-a1)); - n++; - } - } - delta/=(float)((n)?n:1); - return delta; -} - -int **pavie_seq2trained_pavie_mat(Sequence *S, char *param) -{ - double ***fmat; - int ***current_mat; - int ***previous_mat; - char **alp; - - char **mat_file; - double d,delta_min=10; - double *gep; - double *gop; - - char ignore[100]; - char force [100]; - char pavie_idmat[100]; - int id_threshold; - int sample_size; - char *b; - int a,n=0,nch=1; - char *buf; - - check_pavie_cl (param); - - if ( !param)param=vcalloc (1, sizeof (char)); - - if ((b=vstrstr(param,"_THR")))sscanf ( b, "_THR%d_", &id_threshold); - else id_threshold=0; - - sample_size=0; - if ((b=vstrstr(param,"_SAMPLE")))sscanf ( b, "_SAMPLE%d_", &sample_size); - if ((b=vstrstr(param,"_PARALOGOUS"))) - { - sscanf ( b, "_PARALOGOUS%d_", &sample_size); - sample_size*=-1; - } - - if ((b=vstrstr(param,"_CHANNEL")))sscanf ( b, "_CHANNEL%d_", &nch); - else nch=1; - - if ( (buf=vstrstr (param, "_TGEPF"))) - { - sscanf (buf, "_TGEPF%f_", &tgep_factor); - tgep_factor/=(float)100; - } - else - { - tgep_factor=0.5; - } - if ( (buf=vstrstr (param, "_PAMLOGODD_"))) - { - log_odd_mode=1; - } - /*Declare Arrays*/ - gep=vcalloc (nch, sizeof (double)); - gop=vcalloc (nch, sizeof (double)); - mat_file=declare_char ( nch, 100); - current_mat =vcalloc ( nch, sizeof (double**)); - previous_mat=vcalloc ( nch, sizeof (double**)); - - - sprintf (ignore, "X"); - force[0]='\0'; - sprintf ( pavie_idmat, "pavie_idmat"); - - - - alp=seq2pavie_alp (S, nch); - - S=seq2pavie_seq (S, nch); - - pavie_mat2pavie_id_mat (NULL,"idmat", alp[0],ignore,force,1,pavie_idmat); - - for ( a=0; adelta_min) - { - - fprintf ( stdout, "\nDelta=%d: ",(int) d); - for (a=0; anseq-exclude_id; a++) - { - - output_completion ( stderr,a+1,S->nseq,1, ""); - - for ( b=a+exclude_id; b< S->nseq; b++) - { - tot++; - - A=align_pavie_sequences (S->seq[a],S->seq[b],mat,gop,gep,nch,param); - - for ( chan=0; chan< nch; chan++) - { - - fmat[chan]=pavie_aln2fmat (A, fmat[chan], idmat, id_threshold, chan, nch, param); - } - free_aln (A); - } - } - } - else - { - int c; - static int **list; - - if ( sample_size>0 && !list) - { - if ( exclude_id==0)sample_size*=3; - if (!list) - { - list=declare_int ((sample_size+1), 2); - vsrand(0); - tot=0; - while (totnseq);b=rand()%(S->nseq); - if ( a!=b) - { - list[tot][0]=a;list[tot][1]=b; - tot++; - if ( exclude_id==0) - { - list[tot][0]=a;list[tot][1]=a; - tot++; - list[tot][0]=b;list[tot][1]=b; - tot++; - } - } - } - } - } - else if ( sample_size<0 && !list) - { - - int **sim; - int m; - sim=seq2sim_mat (S, "idmat"); - sample_size*=-1; - list=declare_int (S->nseq*S->nseq, 2); - - m=S->nseq-exclude_id; - for (a=0; anseq; b++) - { - if ( sim[a][b]>sample_size) - { - list[tot][0]=a; - list[tot][1]=b; - tot++; - fprintf ( stderr, "\n%s %s: %d", S->name[a], S->name[b], sim[a][b]); - fprintf ( stderr, "\nKeep %s Vs %s : %d%% ID", S->name[a], S->name[b], sim[a][b]); - } - } - free_int(sim, -1); - } - - for (c=0; cseq[a],S->seq[b],mat,gop,gep,nch, param); - for (chan=0; chan< nch; chan++) - fmat[chan]=pavie_aln2fmat (A, fmat[chan], idmat, id_threshold,chan, nch, param); - - free_aln (A); - output_completion ( stderr,c,tot,1, ""); - } - } - fprintf ( stderr, "\n\tSample_size: %d Used alignments: %d\n", tot, id_thres_used_aln); - return fmat; -} - - - -int **pavie_fmat2pavie_logodd_mat (double **fmat, char *alp) -{ - int s1, s2,S1, S2; - double r1, r2; - int **mat; - int a, b; - int ns; - int logodd=0; - - - ns=strlen (alp); - mat=declare_int (256, 256); - - for ( a=0; alen_aln/nch); - start=l*ch; - A->len_aln=l; - A->seq_al[0]+=start; - A->seq_al[1]+=start; - - - - if ( fmat==NULL)fmat=declare_double(300, 300); - - if ( vstrstr (param, "_TWE00_"))w=100; - else if ( vstrstr (param, "_TWE01_"))w=pavie_aln2id (A, 1); - else if ( vstrstr (param, "_TWE02_"))w=pavie_aln2id (A, 2); - else if ( vstrstr (param, "_TWE03_"))w=pavie_aln2id (A, 3); - else if ( vstrstr (param, "_TWE04_"))w=pavie_aln2id (A, 4); - else if ( vstrstr (param, "_TWE05_"))w=pavie_aln2id (A, 5); - else if ( vstrstr (param, "_TWE06_"))w=pavie_aln2id (A, 6); - - else w=pavie_aln2id (A, 3); - - id=pavie_aln2id(A, 3); - - - if (idlen_aln*=nch; - A->seq_al[0]-=start;A->seq_al[1]-=start; - return fmat; - } - else - { - id_thres_used_aln++; - for ( a=0; alen_aln; a++) - { - c1=tolower(A->seq_al[0][a]); - c2=tolower(A->seq_al[1][a]); - fmat[c1][c2]+=w; - - fmat[c1][0]++; - fmat[c1][1]+=w; - - fmat[c2][0]++; - fmat[c1][1]+=w; - - fmat[0][0]+=2; - fmat[1][1]+=2*w; - } - A->len_aln*=nch; - A->seq_al[0]-=start;A->seq_al[1]-=start; - - return fmat; - } -} - -int pavie_mat2pavie_id_mat ( int **mat,char *in_name, char *alp, char *ignore, char *force,int T, char *out_name) -{ - int n1, n2, n3; - int s1, s2, S1, S2; - int a, b; - int **idmat; - - if (mat==NULL && in_name==NULL) return 0; - else if (mat==NULL) - { - mat=read_matrice (in_name); - } - - - idmat=declare_int ( 256, 256); - n1=strlen (alp); - n2=strlen (ignore); - n3=strlen (force); - - for (a=0; a< n1; a++) - for ( b=0; b=T)?PAVIE_MAT_FACTOR:0; - } - for (a=0; alen_aln=strlen (seq0); - A->nseq=2; - A->score=A->score_aln=100; - sprintf ( A->seq_al[0], "%s", seq1); - sprintf ( A->seq_al[1], "%s", seq0); - return A; - } - - - x=seq0; - y=seq1; - - XL=strlen (x)/nch; - YL=strlen (y)/nch; - - - ax=vcalloc ( (YL+XL)*nch+1, sizeof (char)); - ay=vcalloc ( (YL+XL)*nch+1, sizeof (char)); - bufx=vcalloc ( (YL+XL)*nch+1, sizeof (char)); - bufy=vcalloc ( (YL+XL)*nch+1, sizeof (char)); - - F=declare_double (XL+2, YL+2); - T=declare_int (XL+2, YL+2); - - - /*Fill stage*/ - F[0][0] = 0; - for(i = 1; i <=XL; i++) - { - - F[i][0] = F[i-1][0]+pavie_score (x,i-1,NULL,GAP_CODE,mat, gop, gep, nch, factor, param) /*CL->M[x[i-1]-'A'][gap]*/; - - T[i][0] = GY; - } - - for(j = 1; j <= YL; j++) - { - - F[0][j] = F[0][j-1]+pavie_score (NULL,GAP_CODE,y,j-1,mat, gop, gep, nch, factor, param)/*CL->M[y[j-1]-'A'][gap]*/; - T[0][j] = GX; - } - - - for(i = 1; i <= XL; i++) - { - for(j = 1; j <= YL; j++) - { - - match = F[i-1][j-1] + /*CL->M[x[i-1]-'A'][y[j-1]-'A']*/pavie_score (x,i-1,y, j-1,mat, gop, gep, nch, 1, param); - gap_inY= F[i-1][j] + /*CL->M[x[i-1]-'A'][gap]*/ pavie_score (x,i-1, NULL,GAP_CODE,mat, gop, gep, nch, (j==YL)?factor:1, param); - gap_inX= F[i][j-1] + /*+ CL->M[y[j-1]-'A'][gap]*/ pavie_score (NULL,GAP_CODE,y, j-1,mat, gop, gep, nch, (i==XL)?factor:1, param); - - if ( match >= gap_inY && match >=gap_inX){F[i][j]=match; T[i][j]=MXY;} - else if ( gap_inX>=gap_inY){F[i][j]=gap_inX; T[i][j]=GX;} - else {F[i][j]=gap_inY; T[i][j]=GY;} - } - } - /*Trace back stage*/ - - - i = XL; - j = YL; - len=0; - while(!(i==0 && j==0)) - { - - if (T[i][j]==MXY) - { - ax[len]=1;i--; - ay[len]=1;j--; - } - else if ( T[i][j]==GY) - { - ax[len]=1;i--; - ay[len]='-'; - } - else if ( T[i][j]==GX) - { - ax[len]='-'; - ay[len]=1;j--; - } - len++; - } - - for (a=0; alen_aln=strlen (ax); - A->nseq=2; - A->score=A->score_aln=F[XL][YL]; - - for (a=0, b=0, c=0; alen_aln; a++) - { - if (ax[a]==1)ax[a]=seq0[b++]; - if (ay[a]==1)ay[a]=seq1[c++]; - } - - - - sprintf ( A->seq_al[0], "%s", ax); - sprintf ( A->seq_al[1], "%s", ay); - - vfree (ax); vfree(ay);vfree (bufx); vfree (bufy);free_double(F, -1); free_int (T, -1); - return A; -} - - -int pavie_score (char *s0,int p0, char *s1,int p1,char **mat_file, double *gop, double *gep, int nch, float factor, char *param) - - { - static char *cmat; - static int ***mat; - static int use_age; - static int mchscore=-1; - - int l0, l1, c0, c1; - int a, score=0; - - if ( !use_age) - { - strget_param ( param, "_AGECHANNEL", "-1", "%d", &use_age); - - } - if (mchscore==-1) - { - strget_param (param, "_MCHSCORE", "0", "%d", &mchscore); - - } - - if ( !cmat || !mat_file || !strm (cmat, mat_file[0])) - { - if ( !cmat)cmat=vcalloc ( 100, sizeof (char)); - sprintf ( cmat, "%s", (mat_file)?mat_file[0]:"idmat"); - if ( !mat)mat=vcalloc ( nch, sizeof (int**)); - for ( a=0; a< nch; a++) - { - if ( mat[a])free_int (mat[a], -1); - mat[a]=read_matrice ((mat_file)?mat_file[a]:"idmat"); - - } - } - - l0=(s0)?strlen (s0)/nch:0; - l1=(s1)?strlen (s1)/nch:0; - - if (mchscore==0); - else if (mchscore==1) score=999999; - else if (mchscore==2)score=-9999999; - else - { - HERE ("Error: mchscore >2 [FATAL]\n"); - exit (EXIT_FAILURE); - } - for ( a=0; a< nch; a++) - { - int s; - c0=(s0)?s0[l0*a+p0]-'A':p0; - c1=(s1)?s1[l1*a+p1]-'A':p1; - if ( c0==GAP_CODE)s=(gep[a]!=0)?gep[a]:mat[a][c1][GAP_CODE]; - else if ( c1==GAP_CODE)s=(gep[a]!=0)?gep[a]:mat[a][c0][GAP_CODE]; - else s=mat[a][c0][c1]; - - if (mchscore==0)score+=s; - else if (mchscore==1)score=MIN(s, score); - else if (mchscore==2)score=MAX(s, score); - - - } - - if ( use_age>0 && s0 && s1) - { - - int a0, a1; - int s; - - a0=s0[strlen(s0)+1]; - a1=s1[strlen(s1)+1]; - - a0+=p0; - a1+=p1; - s=use_age*FABS((a0-a1))*-1; - - if (mchscore==0)score+=s; - else if (mchscore==1)score=MIN(s, score); - else if (mchscore==2)score=MAX(s, score); - } - - - score*=factor; - return score; - } -Sequence * seq2pavie_seq ( Sequence *S, int nch) - { - char *buf, *p; - int a, b; - - S->nseq/=nch; - - for (b=0; bnseq; b++) - { - - buf=vcalloc ((strlen (S->seq[b])*nch)+10, sizeof (char)); - for ( a=0; a< nch; a++) - { - strcat (buf, S->seq[b+(S->nseq)*a]); - vfree ( S->seq[b+(S->nseq)*a]); - } - S->seq[b]=buf; - /*Code Age on the byte just after the string termination*/ - - if ((p=strstr (S->seq_comment[b], "FIRSTYEAR"))) - { - sscanf ( p, "FIRSTYEAR%d", (int*)&(S->seq[strlen(buf)+1])); - } - - } - return S; - } -char **seq2pavie_alp (Sequence *S, int nch) - { - int a, n; - char **alp; - - n=S->nseq/nch; - alp=vcalloc (nch, sizeof (char*)); - for ( a=0; a< nch; a++) - { - alp[a]=array2alphabet (S->seq+n*a, n, "-."); - } - return alp; - } -FILE *output_pavie_aln (Alignment *A, int nch, FILE *fp) -{ - int a, b, c,d, l, start, end; - Alignment *B; - Sequence *S; - B=declare_aln2(A->nseq*nch+nch, A->len_aln); - - - - l=A->len_aln/nch; - - for ( a=0; a< nch; a++) - { - for (b=0; b< A->nseq; b++, B->nseq++) - { - sprintf (B->name[B->nseq], "%s.c%d", A->name[b], a); - start=l*a;end=start+l; - for (d=0,c=start; cseq_al[B->nseq][d]=A->seq_al[b][c]; - B->seq_al[B->nseq][d]='\0'; - } - if ( a!=nch-1) - { - B->name[B->nseq][0]='\0'; - for ( b=0; bseq_al[B->nseq][b]='^'; - B->nseq++; - } - } - - B->len_aln=l; - fp=output_Alignment_without_header (B,fp); - S=free_aln (B); - free_sequence (S, S->nseq); - return fp; - -} -char **output_pavie_mat_list ( int ***current_mat, double *gep, char **alp, int nch,char *prefix,int cycle, char **mat_name) -{ - int a; - char mat_list_name[100]; - FILE *fp; - char latest[1000]; - char current[1000]; - char command[1000]; - - sprintf ( mat_list_name, "pavie_matrix%s.cycle_%d.mat_list", prefix, cycle+1); - fp=vfopen ( mat_list_name, "w"); - fprintf ( stderr, "\n\tOutput Pavie Matrix: %s", mat_list_name); - for ( a=0; a< nch; a++) - { - sprintf ( mat_name[a], "pavie_matrix%s.ch_%d.cy_%d.pavie_mat", prefix,a+1, cycle+1); - sprintf (latest, "pavie_matrix%s.ch_%d.cy_last.pavie_mat",prefix,a+1); - sprintf ( current, "matrix.ch%d.pavie_mat", a); - fprintf ( stderr, "\n\t Channel %d Matrix: %s",a+1, mat_name[a]); - output_pavie_mat (current_mat[a],mat_name[a],gep[a], alp[a]); - sprintf ( command, "cp %s %s", mat_name[a], latest); - system (command); - sprintf ( command, "cp %s %s", latest, current); - system (command); - fprintf ( fp, "%s\n", mat_name[a]); - } - vfclose (fp); - return mat_name; -} - - -int pavie_pair_wise (Alignment *A,int *ns, int **l_s,Constraint_list *CL ) -{ - double **F; int **T; - char *x,*y; - char *ax, *ay; - int XL, YL, len; - int i, j; - double match, gap_inX, gap_inY, MXY=1, GX=2, GY=3; - int gap=GAP_CODE; - char *ix, *iy; - float factor=0.5; - - - /*factor: - decreases terminal gap penalties with a factor X - factor=1: terminal gap penalties <=> internal gap penalties - */ - - - - x=A->seq_al[l_s[0][0]]; - y=A->seq_al[l_s[1][0]]; - XL=strlen (x); - YL=strlen (y); - - ax=vcalloc ( YL+XL+1, sizeof (char)); - ay=vcalloc ( YL+XL+1, sizeof (char)); - - - F=declare_double (XL+2, YL+2); - T=declare_int (XL+2, YL+2); - - - /*Fill stage*/ - F[0][0] = 0; - for(i = 1; i <=XL; i++) - { - - F[i][0] = F[i-1][0]+(CL->M[x[i-1]-'A'][gap]*factor); - T[i][0] = GY; - } - - for(j = 1; j <= YL; j++) - { - F[0][j] = F[0][j-1]+CL->M[y[j-1]-'A'][gap]*factor; - T[0][j] = GX; - } - - - for(i = 1; i <= XL; i++) - { - for(j = 1; j <= YL; j++) - { - - match = F[i-1][j-1] + CL->M[x[i-1]-'A'][y[j-1]-'A']; - gap_inY= F[i-1][j] + (CL->M[x[i-1]-'A'][gap]*(j==YL)?factor:1); - gap_inX= F[i][j-1] + (CL->M[y[j-1]-'A'][gap]*(i==XL)?factor:1); - - if ( match >= gap_inY && match >=gap_inX){F[i][j]=match; T[i][j]=MXY;} - else if ( gap_inX>=gap_inY){F[i][j]=gap_inX; T[i][j]=GX;} - else {F[i][j]=gap_inY; T[i][j]=GY;} - } - } - /*Trace back stage*/ - A->score=A->score_aln=F[XL][YL]; - - i = XL; - j = YL; - len=0; - while(!(i==0 && j==0)) - { - - if (T[i][j]==MXY) - { - ax[len]=x[--i]; - ay[len]=y[--j]; - } - else if ( T[i][j]==GY) - { - ax[len]=x[--i]; - ay[len]='-'; - } - else if ( T[i][j]==GX) - { - ax[len]='-'; - ay[len]=y[--j]; - } - len++; - } - ax[len]='\0'; - ay[len]='\0'; - - ix=invert_string (ax); iy=invert_string(ay); - A=realloc_aln (A,len+1); - - sprintf ( A->seq_al[l_s[0][0]], "%s", ix); - sprintf ( A->seq_al[l_s[1][0]], "%s", iy); - A->nseq=2; - A->len_aln=len; - - vfree (ax); vfree(ay);vfree(ix); vfree(iy); free_double(F, -1); free_int (T, -1); - return A->score; -} - -float pavie_aln2id ( Alignment *A, int mode) -{ - int a, id=0, match=0, l1=0, l2=0, r1, r2, is_res1, is_res2; - - - - for (a=0; alen_aln; a++) - { - r1=A->seq_al[0][a]; - r2=A->seq_al[1][a]; - - - is_res1=(!is_gap(r1) && r1!='x' && r1!='X')?1:0; - is_res2=(!is_gap(r2) && r2!='x' && r2!='X')?1:0; - - l1+=is_res1; - l2+=is_res2; - - - if ( is_res1 && is_res2 ) - { - match++; - id+=(r1==r2)?1:0; - } - } - - - if ( mode==1)return (match==0)?0:((id*100)/match); - else if (mode ==2) return (A->len_aln==0)?0:((id*100)/A->len_aln); - else if (mode ==3) return (MIN(l1,l2)==0)?0:((id*100)/(MIN(l1,l2))); - else if (mode ==4) return (MAX(l1,l2)==0)?0:((id*100)/(MAX(l1,l2))); - else if (mode ==5)return (A->score_aln * -1)/*/PAVIE_MAT_FACTOR*/; - else if (mode ==6)return ((MAX(l1,l2)==0)?0:((A->score_aln)/(MAX(l1,l2))))*-1; - else - { - fprintf ( stderr, "\nUnknown Mode [pavie_aln2id:FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - return EXIT_FAILURE; - } - -} - -int check_pavie_cl ( char *string) -{ - if ( !string || string[0]=='\0' ) return 1; - else if (( string[0]!='_') ||string [strlen (string)-1]!='_') - { - fprintf ( stderr, "ERROR: parameters must start and finish with an underscore: _parameters_ [FATAL:%s]\n", PROGRAM); - myexit (EXIT_FAILURE); - } - return 1; -} - -Alignment *pavie_seq2pavie_sort ( Sequence *S, char *mat, char *mode) -{ - int a, b, c=0, avg_c; - int **avg; - double **dm; - Alignment *A=NULL; - char **new_order; - - if ( vstrstr (mode, "_IDSORT_") || vstrstr (mode, "_MASTERSORT")) - { - char *buf; - buf=vcat ( mode, "_MATDIST_NOPRINT_"); - dm=pavie_seq2pavie_aln (S, mat,buf); - avg=declare_int (S->nseq, 2); - if ( vstrstr (mode,"_IDSORT_")) - { - - for ( a=0; a< S->nseq; a++) - { - avg[a][0]=a; - for ( b=0; bnseq; b++) - if ( b!=a)avg[a][1]+=(int) dm[a][b]; - avg[a][1]/=S->nseq-1; - } - sort_int ( avg, 2, 1, 0, S->nseq-1); - - c=avg[0][0]; - avg_c=avg[0][1]; - fprintf ( stderr, "\nAVG\t %s\t %s\t %d",S->name[c],"avg", avg_c); - } - else if ( vstrstr (mode, "_MASTERSORT")) - { - char name[100]; - char *s; - s=vstrstr(mode, "_MASTERSORT"); - mode=substitute ( mode, "_", " "); - sscanf (s, " MASTERSORT%s", name); - - mode=substitute (mode, " ", "_"); - c=name_is_in_list ( name, S->name, S->nseq, 100); - - if ( c==-1) - { - fprintf ( stderr, "\nERROR: Sequence %s is not in the dataset [FATAL:%s]", name, PROGRAM); - myexit (EXIT_FAILURE); - } - } - - for ( a=0; anseq; a++) - { - avg[a][0]=a; - if ( a!=c)avg[a][1]=dm[c][a]; - else avg[a][1]=-1; - } - - sort_int ( avg, 2, 1, 0, S->nseq-1); - - new_order=declare_char ( S->nseq, 100); - sprintf (new_order[0], "%s", S->name[c]); - for ( a=1; anseq; a++) - { - sprintf ( new_order[a], "%s", S->name[avg[a][0]]); - - fprintf ( stderr, "\nTOP\t %s\t %s\t %d", S->name[c],new_order[a] , avg[a][1]); - } - - fprintf ( stderr, "\n"); - A=seq2aln (S, NULL,RM_GAP); - A=reorder_aln (A, new_order, A->nseq); - vfree ( buf); - free_double(dm, -1);free_int (avg, -1);free_char (new_order, -1); - } - else if ( vstrstr ( mode, "_TREESORT_")) - { - A=pavie_seq2pavie_msa (S, mat, mode); - } - else - { - fprintf ( stderr, "\nERROR: pavie_seq2sort <_IDSORT_ | _TREESORT_>"); - } - return A; - -} -NT_node pavie_seq2pavie_tree (Sequence *S, char *mat, char *mode) -{ - double **dm; - char *tree_name,*buf; - - - buf=vcat (mode,"_MATDIST_NOPRINT_"); - dm=pavie_seq2pavie_aln (S, mat,buf); - dist2nj_tree (dm,S->name, S->nseq,tree_name=vtmpnam (NULL)); - - free_double(dm, -1);vfree (buf); - - return main_read_tree (tree_name); -} - -Alignment* pavie_seq2pavie_msa ( Sequence *S, char *mat_in, char *mode) -{ - Constraint_list *CL; - char **alp, *s; - Alignment *A; - NT_node **FT, T; - int a; - char mat[100]; - - - A=seq2aln (S, NULL, RM_GAP); - CL=declare_constraint_list (S, NULL, NULL, 0, NULL, NULL); - sprintf ( CL->dp_mode, "myers_miller_pair_wise"); - sprintf ( CL->tree_mode, "nj"); - sprintf ( CL->distance_matrix_mode, "idscore"); - CL=choose_extension_mode ("matrix", CL); - - if ( !is_matrix (mat_in)) - { - FILE *fp; - fp=vfopen ( mat_in, "r"); - fscanf (fp, "%s", mat); - vfclose (fp); - add_warning( stderr, "\nWarning: Multiple Channel Not Supported. Used First Channel Only for MSA [Matrix: %s][WARNING:%s]", mat, PROGRAM); - } - else - { - sprintf ( mat, "%s", mat_in); - } - - CL->M=read_matrice (mat); - CL->gop=0; - - alp=seq2pavie_alp (S, 1); - CL->gep=paviemat2gep(CL->M, alp[0]); - - - CL->pw_parameters_set=1; - CL->local_stderr=stderr; - - if ( vstrstr (mode, "_QUICKTREE_")) - { - FT=make_tree (A, CL, CL->gop, CL->gep,S, NULL,MAXIMISE); - T=FT[3][0]; - } - else if ( (s=vstrstr (mode, "_USETREE"))) - { - char fname[100]; - mode=substitute ( mode, "_", " "); - sscanf (s, " USETREE%s", fname); - mode=substitute (mode, " ", "_"); - T=main_read_tree (fname); - } - else - { - T=pavie_seq2pavie_tree ( S, mat_in, mode); - } - - for ( a=0; a< A->nseq; a++)ungap (A->seq_al[a]); - - tree_aln (T->left,T->right,A,(CL->S)->nseq, CL); - A=reorder_aln ( A,A->tree_order,A->nseq); - - return A; -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/pb_util_read_seq_util.c b/binaries/src/tcoffee/t_coffee_source/pb_util_read_seq_util.c deleted file mode 100644 index f8c6c44..0000000 --- a/binaries/src/tcoffee/t_coffee_source/pb_util_read_seq_util.c +++ /dev/null @@ -1,374 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - - -/* -* Prototypes -*/ - - -void fatal(char *,...); -void error(char *,...); -void warning(char *,...); -char *rtrim(char *); -char *blank_to_(char *); /* DES change blanks to _ */ -char *upstr(char *); -char *lowstr(char *); -void getstr(char *,char *); -double getreal(char *,double,double,double); -int getint(char *,int,int,int); -void do_system(void); -Boolean linetype(char *,char *); -Boolean blankline(char *); -void get_path(char *,char *); - -/* -* ckalloc() -* -* Tries to allocate "bytes" bytes of memory. Exits program if failed. -* Return value: -* Generic pointer to the newly allocated memory. -*/ - -void *ckalloc(size_t bytes) -{ - register void *ret; - extern void *vcalloc (size_t nelem, size_t elsize); - - if( (ret = vcalloc(bytes, sizeof(char))) == NULL) -/* - if( (ret = vmalloc(bytes)) == NULL) -*/ - fatal("Out of memory\n"); - else - return ret; - return ret; -} - -/* -* ckvrealloc() -* -* Tries to vreallocate "bytes" bytes of memory. Exits program if failed. -* Return value: -* Generic pointer to the re-allocated memory. -*/ - -void *ckvrealloc(void *ptr, size_t bytes) -{ - register void *ret; - extern void *vrealloc (void *ptr, size_t size); - - if( (ret = vrealloc(ptr, bytes)) == NULL) - fatal("Out of memory\n"); - else - return ret; - return ret; -} - -/* -* ckfree() -* -* Tries to free memory allocated by ckalloc. -* Return value: -* None. -*/ - -void ckfree(void *ptr) -{ - vfree(ptr); -} - - -/* -* fatal() -* -* Prints error msg to stderr and exits. -* Variadic parameter list can be passed. -* -* Return values: -* none -*/ - -void fatal( char *msg,...) -{ - va_list ap; - - va_start(ap,msg); - fprintf(stderr,"\n\nFATAL ERROR: "); - vfprintf(stderr,msg,ap); - fprintf(stderr,"\n\n"); - va_end(ap); - myexit(EXIT_FAILURE); -} - -/* -* error() -* -* Prints error msg to stderr. -* Variadic parameter list can be passed. -* -* Return values: -* none -*/ - -void error( char *msg,...) -{ - va_list ap; - - va_start(ap,msg); - fprintf(stderr,"\n\nERROR: "); - vfprintf(stderr,msg,ap); - fprintf(stderr,"\n\n"); - va_end(ap); -} - -/* -* warning() -* -* Prints warning msg to stderr. -* Variadic parameter list can be passed. -* -* Return values: -* none -*/ - -void warning( char *msg,...) -{ - va_list ap; - - va_start(ap,msg); - fprintf(stderr,"\n\nWARNING: "); - vfprintf(stderr,msg,ap); - fprintf(stderr,"\n\n"); - va_end(ap); -} - - -/* -* rtrim() -* -* Removes trailing blanks from a string -* -* Return values: -* Pointer to the processed string -*/ - -char * rtrim(char *str) -{ - register int p; - - p = strlen(str) - 1; - - while ( isspace(str[p]) ) - p--; - - str[p + 1] = EOS; - - return str; -} - - -/* -* blank_to_() -* -* Replace blanks in a string with underscores -* -* Also replaces , ; : ( or ) with _ -* -* Return value: -* Pointer to the processed string -*/ - -char * blank_to_(char *str) -{ - int i,p; - - - p = strlen(str) - 1; - for(i=0;i<=p;i++) - { - if( strrchr(";,():",str[i]))str[i]='_'; - else if (isspace(str[i])); - } - return str; -} - - -/* -* upstr() -* -* Converts string str to uppercase. -* Return values: -* Pointer to the converted string. -*/ - -char * upstr(char *str) -{ - register char *s = str; - - while( (*s = toupper(*s)) ) - s++; - - return str; -} - -/* -* lowstr() -* -* Converts string str to lower case. -* Return values: -* Pointer to the converted string. -*/ - -char * lowstr(char *str) -{ - register char *s = str; - - while( (*s = tolower(*s)) ) - s++; - - return str; -} - -void getstr(char *instr,char *outstr) -{ - fprintf(stdout,"%s: ",instr); - fgets(outstr, 100, stdin); -} - -double getreal(char *instr,double minx,double maxx,double def) -{ - int status; - double ret; - char line[MAXLINE]; - - while(TRUE) { - fprintf(stdout,"%s (%.1lf-%.1lf) [%.1lf]: ",instr,minx,maxx,def); - fgets(line, MAXLINE, stdin); - status=sscanf(line,"%lf",&ret); - if(status == EOF) return def; - if(ret>maxx) { - fprintf(stderr,"ERROR: Max. value=%.1lf\n\n",maxx); - continue; - } - if(retmaxx) { - fprintf(stderr,"ERROR: Max. value=%d\n\n",(pint)maxx); - continue; - } - if(ret-1;--i) { - if(str[i]==DIRDELIM) { - i = -1; - break; - } - if(str[i]=='.') break; - } - if(i<0) - strcat(path,"."); - else - path[i+1]=EOS; -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/pb_util_read_sequence.c b/binaries/src/tcoffee/t_coffee_source/pb_util_read_sequence.c deleted file mode 100644 index 8f684df..0000000 --- a/binaries/src/tcoffee/t_coffee_source/pb_util_read_sequence.c +++ /dev/null @@ -1,562 +0,0 @@ -/********* Sequence input routines for CLUSTAL W *******************/ -/* DES was here. FEB. 1994 */ -/* Now reads PILEUP/MSF and CLUSTAL alignment files */ - -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" - -/* -* Prototypes -*/ - -extern Boolean linetype(char *,char *); -extern Boolean blankline(char *); -extern void warning(char *,...); -extern void error(char *,...); -extern char * rtrim(char *); -extern char * blank_to_(char *); -extern void getstr(char *,char *); - -void fill_chartab(void); - - -static void get_seq(char *,char *,int *,char *); -static void get_clustal_seq(char *,char *,int *,char *,int); -static void get_msf_seq(char *,char *,int *,char *,int); -static void check_infile(int *); - - - - -static int count_clustal_seqs(void); -static int count_msf_seqs(void); - -/* - * Global variables - */ - -static FILE *fin; - - -char *amino_acid_codes = "ABCDEFGHIKLMNPQRSTUVWXYZ-"; /* DES */ -char *nucleic_acid_order = "ACGTUN"; -static int seqFormat; -static char chartab[128]; - -void fill_chartab(void) /* Create translation and check table */ -{ - register int i; - register int c; - - - for(i=0;i<128;chartab[i++]=0); - for(i=0,c=0;c<=amino_acid_codes[i];i++) - chartab[c]=chartab[tolower(c)]=c; - -} - -static void get_msf_seq(char *sname,char *seq,int *len,char *tit,int seqno) -/* read the seqno_th. sequence from a PILEUP multiple alignment file */ -{ - static char *line; - int i,j,k; - unsigned char c; - if ( !line)line=vcalloc ( (MAXLINE+1), sizeof (char)); - - fseek(fin,0,0); /* start at the beginning */ - - *len=0; /* initialise length to zero */ - for(i=0;;i++) { - if(fgets(line,MAXLINE+1,fin)==NULL) return; /* read the title*/ - if(linetype(line,"/") ) break; /* lines...ignore*/ - } - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(!blankline(line)) { - - for(i=1;i') - break; /* EOL */ - - if( (c=chartab[c])) - {seq[++(*len)]=c; - } - } - if(*len == SEQ_MAX_LEN || c == '>') break; - } - break; -/**********************************************/ - case GDE: - - while(*line != '#' ||*line != '%' ) - fgets(line,MAXLINE+1,fin); - - - - - for (i=1;i<=MAXNAMES;i++) { - if (line[i] == '(' || line[i] == '\n') - { - i--; - break; - } - sname[i-1] = line[i]; - } - sname[i]=EOS; - offset=0; - if (sname[i-1] == '(') sscanf(&line[i],"%d",&offset); - else offset = 0; - for(i=MAXNAMES-1;i > 0;i--) - if(isspace(sname[i])) { - sname[i]=EOS; - break; - } - blank_to_(sname); - - - *tit=EOS; - - *len=0; - for (i=0;i SEQ_MAX_LEN) - { - error("Sequence too long. Maximum is %d",(pint)SEQ_MAX_LEN); - return 0; /* also return zero if too many */ - } - - - - for ( a=0; a') { /* no */ - seqFormat=(line[3] == ';')?PIR:PEARSON; /* distinguish PIR and Pearson */ - (*nseqs)++; - } - else if((*line == '"') || (*line == '%') || (*line == '#')) { - seqFormat=GDE; /* GDE format */ - if (*line == '%') { - (*nseqs)++; - - } - else if (*line == '#') { - (*nseqs)++; - - } - } - else { - seqFormat=UNKNOWN; - return; - } - - while(fgets(line,MAXLINE+1,fin) != NULL) { - switch(seqFormat) { - case EMBLSWISS: - if( linetype(line,"ID") ) - (*nseqs)++; - break; - case PIR: - case PEARSON: - if( *line == '>' ) - (*nseqs)++; - break; - case GDE: - if(( *line == '%' ) ) - (*nseqs)++; - else if (( *line == '#') ) - (*nseqs)++; - break; - case CLUSTAL: - *nseqs = count_clustal_seqs(); -/* DES */ /* fprintf(stdout,"\nnseqs = %d\n",(pint)*nseqs); */ - fseek(fin,0,0); - return; - break; - case MSF: - *nseqs = count_msf_seqs(); - fseek(fin,0,0); - return; - break; - case USER: - default: - break; - } - } - fseek(fin,0,0); -} - - -static int count_clustal_seqs(void) -/* count the number of sequences in a clustal alignment file */ -{ - static char *line; - int nseqs; - - if ( !line)line=vcalloc ( (MAXLINE+1), sizeof (char)); - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(!blankline(line)) break; /* Look for next non- */ - } /* blank line */ - nseqs = 1; - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(blankline(line)) return nseqs; - nseqs++; - } - - return 0; /* if you got to here-funny format/no seqs.*/ -} - -static int count_msf_seqs(void) -{ -/* count the number of sequences in a PILEUP alignment file */ - - static char *line; - int nseqs; - - if ( !line)line=vcalloc ( (MAXLINE+1), sizeof (char)); - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(linetype(line,"/")) break; - } - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(!blankline(line)) break; /* Look for next non- */ - } /* blank line */ - nseqs = 1; - - while (fgets(line,MAXLINE+1,fin) != NULL) { - if(blankline(line)) return nseqs; - nseqs++; - } - - return 0; /* if you got to here-funny format/no seqs.*/ -} - - - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/perl_header_lib.h b/binaries/src/tcoffee/t_coffee_source/perl_header_lib.h deleted file mode 100644 index 68711d6..0000000 --- a/binaries/src/tcoffee/t_coffee_source/perl_header_lib.h +++ /dev/null @@ -1,5955 +0,0 @@ -char *PerlScriptName[]={"rec_sum.pl","count.pl","p\ -rocess_list.pl","make_license.pl","CCsed.script","\ -msa2bootstrap.pl","t_coffee_dpa","t_coffee_dpa2","\ -tc_generic_method.pl","generic_method.tc_method","\ -clustalw_method.tc_method","extract_from_pdb","ins\ -tall.pl","clean_cache.pl","mocca","dalilite.pl","w\ -ublast.pl","blastpgp.pl","RNAplfold2tclib.pl","fas\ -ta_seq2RNAplfold_templatefile.pl","fasta_seq2hmmto\ -p_fasta.pl","fasta_seq2consan_aln.pl","clustalw_al\ -n2fasta_aln.pl","msf_aln2fasta_aln.pl","blast_aln2\ -fasta_aln.pl","blast_xml2fasta_aln.pl","fasta_aln2\ -fasta_aln_unique_name.pl","newick2name_list.pl","e\ -xcel2fasta.pl","any_file2unix_file.pl","EndList"};\ -char *PerlScriptFile[]={"use File::Copy;\nuse Env \ -qw(HOST);\nuse Env qw(HOME);\nuse Env qw(USER);\n$\ -x_field=0;\n$y_field=1;\n$interval=0;\n$file=\"std\ -in\";\n$print_avg=1;\n$print_sd=0;\n$print_sum=0;\\ -n$print_n=0;\nforeach $value ( @ARGV)\n {\n if \ -($value ne $ARGV[$np]) \n {\n ;\n }\n \ -elsif($value eq \"-print_all\")\n {\n $pri\ -nt_sd=$print_avg=$print_n=$print_sum=1;\n $np+\ -+;\n }\n elsif($value eq \"-print_sum\")\n \ - {\n $print_sum=1;\n $print_avg=0;\n $\ -np++;\n }\n elsif($value eq \"-print_n\")\n \ - {\n $print_n=1;\n $print_avg=0;\n $n\ -p++;\n }\n elsif($value eq \"-print_avg\")\n \ - {\n $print_avg=1;\n $print_avg=0;\n \ - $np++;\n }\n elsif($value eq \"-sd\")\n {\ -\n $print_sd=1;\n $print_avg=0;\n $np+\ -+;\n }\n elsif($value eq \"-h\")\n {\n \ - $header=1;\n $np++;\n }\n elsif ($value e\ -q \"-i\")\n {\n $interval= $ARGV[++$np];\n\ - $np++;\n }\n elsif ($value eq \"-r\")\ -\n {\n $min= $ARGV[++$np];\n $max= $AR\ -GV[++$np];\n $np++;\n }\n \n elsif ($v\ -alue eq \"-x\")\n {\n $x_field= $ARGV[++$n\ -p]-1;\n $np++;\n }\n elsif ($value eq \ -\"-y\")\n {\n \n while ($ARGV[$np+1]\ - && !($ARGV[$np+1]=~/\\-/))\n {\n $y_field[\ -$nyf++]=$ARGV[++$np]-1;\n $y_field_set=1;\n \ - }\n\n $np++;\n }\n elsif ($value eq \\ -"-file\")\n {\n $file= $ARGV[++$np];\n \ - $file_set=1;\n $np++;\n } \n el\ -sif ( $value eq \"h\" || $value eq \"-h\" || $val\ -ue eq \"-H\" || $value eq \"-help\" || $value eq \\ -"help\")\n {\n print STDOUT \"data_analyse: \ -Analyse and discretization of data\\n\";\n pri\ -nt STDOUT \" -file: ,.\\n\";\n print ST\ -DOUT \" -x: ,.......\ -........\\n\";\n print STDOUT \" \ --y: ,...............\\n\";\n print STDOUT \" -i:,...............\\n\";\n p\ -rint STDOUT \" -i:<0:only one interval>\\n\"\ -;\n print STDOUT \" -r:\\ -\n\";\n print STDOUT \" -sd: print stand\ -ard deviation on the Y\";\n print STDOUT \" \ - -h : print column header \\n\";\n exit (0\ -);\n }\n elsif ($value=~/-/)\n {\n print \\ -"$value is not a valid FLAG[FATAL]\\n\";\n exi\ -t (0);\n } \n elsif ($list eq \"\") \n {\n \ - $file=$ARGV[$np];\n $np++;\n }\n \n \n\ - }\n\n\n\n\n\nif ($file eq \"stdin\")\n {\n $\ -remove_file=1;\n $file=\"tmp$$\";\n open (F, \">$f\ -ile\");\n while ()\n {\n print F $_;\n }\ -\n close (F);\n \n ;}\n\n\nopen(F,$file);\n\nif (\ -$interval)\n {\n $interval_size=($max-$min)/$i\ -nterval;\n }\nwhile ()\n {\n $line=$_;\n \ - if (!/\\S/){next;}\n @list=($line=~/(\\S+)/g)\ -;\n \n if ($interval==0){$bin=0;}\n else{\ -$bin=int (($list[$x_field]-$min)/($interval_size))\ -;}\n\n \n if ($bin && $bin==$interval){$bin-\ --;}\n for ( $a=0; $a<$nyf; $a++)\n {\n $su\ -m{$a}{$bin}+=$list[$y_field[$a]];\n $sum2{$a}{$bin\ -}+=$list[$y_field[$a]]*$list[$y_field[$a]];\n $n{$\ -a}{$bin}++;\n }\n }\n\nif (!$interval){$inte\ -rval=1;}\nfor ( $a=0; $a<$interval; $a++)\n {\n \ - printf ( \"%3d %3d \", $interval_size*$a, $inter\ -val_size*($a+1));\n for ( $b=0; $b<$nyf; $b++) \ -\n {\n $i=$interval*$a;\n if ( $n{$b}{$a}==0)\ -\n {\n $avg=0;\n $sd=0;\n }\n else\n \ - {\n $avg=$sum{$b}{$a}/$n{$b}{$a};\n $sd=s\ -qrt($sum2{$b}{$a}*$n{$b}{$a}-$sum{$b}{$a}*$sum{$b}\ -{$a})/($n{$b}{$a}*$n{$b}{$a});\n }\n if ($print_\ -n) {printf \"%10.4f \", $n{$b}{$a};}\n if ($print_\ -sum){printf \"%10.4f \", $sum{$b}{$a};}\n if ($pri\ -nt_avg){printf \"%10.4f \", $avg}\n if ($print_sd)\ - {printf \"%10.4f \", $sd;}\n }\n printf (\ -\"\\n\");\n }\n\n\nif ( $remove_file){unlink $fil\ -e;}\n","use File::Copy;\nuse Env qw(HOST);\nuse En\ -v qw(HOME);\nuse Env qw(USER);\n\nforeach $v (@ARG\ -V){$cl.=$v;}\n\n\nif ( $cl=~/-k(\\d+)/){$k=$1;}\ne\ -lse {$k=1;}\nif ( $cl=~/-w(\\d+)/){$w=$1;}\nelse {\ -$w=-1;}\nif ( $cl=~/-p(\\d+)/){$p=$1;}\nelse {$p=-\ -1;}\n\nwhile ()\n {\n @l=($_=~/(\\S+)/g\ -);\n $v=$l[$k-1];\n if ( !$h{$v}){@ll=($v, @\ -ll);}\n \n if ( $w==-1)\n {$h{$v}++;}\n\ - else\n {$h{$v}+=$l[$w-1];}\n\n if ($p!\ -=-1){$print{$v}=$l[$p-1];}\n\n }\nforeach $v (@ll\ -)\n {\n print \"$v $print{$v} $h{$v}\\n\";\n \ -}\n","\nuse Env qw(HOST);\nuse Env qw(HOME);\nuse \ -Env qw(USER);\n$random_tag=int (rand 10000)+1;\n$u\ -nique_prefix=\"$$.$HOST.$random_tag\";\n$queue=\"d\ -istillery.and.mid\";\n$monitor=0;\n$stderr_file=\"\ -/dev/null\";\n$stdio_file=\"/dev/null\";\n$log_fil\ -e=\"/dev/null\";\n$pause_time=0;\n$max_sub_jobs=60\ -;\n$min_sub_jobs=30;\n$output_all=0;\n$var='\\$';\\ -n\nforeach $value ( @ARGV)\n {\n if ($value ne \ -$ARGV[$np]) \n {\n ;\n }\n elsif ($val\ -ue eq \"-max_sub_jobs\")\n {\n $max_sub_jo\ -bs= $ARGV[++$np];\n $np++;\n } \n elsi\ -f ($value eq \"-min_sub_jobs\" )\n {\n $mi\ -n_sub_jobs= $ARGV[++$np];\n $np++;\n }\ -\n elsif ($value eq \"-para\")\n {\n $para\ -=1;\n $monitor=1;\n $np++;\n }\n e\ -lsif ($value eq \"-monitor\") \n {\n $moni\ -tor=1;\n $np++;\n }\n elsif ($value eq \"-\ -no_monitor\") \n {\n $monitor=0;\n $np\ -++;\n }\n elsif ($value eq \"-queue\")\n {\ -\n $queue=$ARGV[++$np];\n $np++;\n } \\ -n elsif ($value eq \"-stderr_file\")\n {\n \ - $stderr_file=$ARGV[++$np];\n $np++;\n }\n\ - elsif ($value eq \"-stdio_file\")\n {\n $\ -stdio_file=$ARGV[++$np];\n $np++;\n }\n el\ -sif ($value eq \"-output_all\")\n {\n $out\ -put_all=1;\n $np++;\n }\n elsif ($value eq\ - \"-pause\") \n {\n $pause_time=$ARGV[++$n\ -p];\n $np++;\n }\n elsif ($value eq \"-log\ -\")\n {\n $log=1;\n \n \ -if ($ARGV[$np+1]=~/\\-\\S+/) \n {\n $\ -log_file=\"stderr\";\n }\n else \\ -n {\n $log_file=$ARGV[++$np]; \n +\ -+$np;\n \n }\n }\n elsif ( $valu\ -e eq \"-com\")\n {\n \n if (!$ARGV[$np+1]=~/\ -^\\'/) { $com=$ARGV[++$np];}\n else {$com=$ARGV[+\ -+$np];}\n\n $np++;\n }\n elsif ( $value e\ -q \"-check\")\n {\n \n if (!$ARGV[$np+1]\ -=~/^\\'/) { $check=$ARGV[++$np];}\n else {$che\ -ck=$ARGV[++$np];}\n $np++;\n }\n elsif ($com\ - eq \"\") \n {\n $com_set=1;\n $com=$A\ -RGV[$np];\n \n $np++;\n }\n elsif ($li\ -st eq \"\") \n {\n $list_set=1;\n $lis\ -t=$ARGV[$np];\n $np++;\n }\n elsif ( $var_\ -set eq \"\")\n {\n $var_set=1;\n $var=\ -$ARGV[$np];\n $np++;\n }\n }\n\n\n\n\nif (\ - $com eq \"\"){print \"You Need to Provide a Comma\ -nd [FATAL]\\n\";\n die;\n }\n\n\n\nif (\ -$list_set==0) \n {\n $x= int (rand 100000)+1\ -;\n $tmp_file_name=\"tmp_file_$x\";\n open (\ - TMP, \">$tmp_file_name\");\n while ()\n\ - {\n print TMP $_;\n }\n close (TMP);\ -\n open (F, $tmp_file_name);\n }\nelse \n \ - {\n open (F, $list);\n }\n\nif ($para==0) \\ -n {\n\n @tc_list= ;\n close (F); \n \ - \n foreach $val(@tc_list) \n {\n \ - \n \n \n $loc_com=$com;\n \ - if ($check){$loc_check=$check;}\n \n \ -@i_val=($val=~/([^\\s]+)/g);\n \n if (\ - $#i_val==0)\n {\n if ($check){$loc_check=~s/$\ -var/$i_val[0]/g;}\n $loc_com=~s/$var/$i_val[0]/\ -g;\n }\n else\n {\n for ($n=1; $n<=$#i_\ -val+1;$n++ )\n {\n \n $sub=\"$v\ -ar$n\";\n \n $loc_com=~s/$sub/$i_val\ -[$n-1]/g;\n if ($check){$loc_check=~s/$var/\ -$i_val[0]/g;}\n }\n }\n if ( $check &&\ - -e $loc_check)\n {\n print STDERR \"skipping \ -$loc_com...\\n\";\n }\n else\n {\n sy\ -stem \"$loc_com\";\n }\n }\n exit;\n }\\ -n\nelsif ($para==1) \n {\n print STDERR \"do\ - parallel execution of: \\\"$com $list\\\"\\n\";\n\ - \n if ($log==1) \n {\n if ($log_file eq \"s\ -tdout\" || $log_file eq \"stderr\" ) \n {\n $log\ -_file=\"\";\n }\n\n else \n {\n s\ -ystem \"echo LOG FILE> $log_file\";\n \n \ -}\n }\n else \n {\n open ( OUT, \">/dev/null\")\ -;\n }\n \n \n $id=0;\n $n_sub=0;\n whi\ -le ($val=) \n { \n $job_log[$i\ -d]=\"$HOME/tmp/$unique_prefix.$id.log_file\";\n \ - \n $job=$unique_prefix.\"_$id\";\n open \ -(JOB, \">$job\");\n \n $loc_com=$com;\n \ - chop $val;\n\n $loc_com=~s/\\$/$val/g;\n \n\ - print JOB \"#!/bin/csh\\n\";\n print JOB \ -\"#\\$ -cwd\\n\";\n print JOB \"#\\$ -N $uniqu\ -e_prefix\\n\";\n if ($queue && !($queue eq \" \ -\")) {print JOB \"#\\$ -l $queue\\n\";}\n prin\ -t JOB \"#\\n\"; \n print JOB \"$loc\ -_com\\n\";\n print JOB \"echo FINISHED >> $jo\ -b_log[$id]\\n\";\n print JOB \"pwd\\n\";\n \ - \n close (JOB);\n if ( $output_all==1)\n \ - {\n system \"qsub $job > $unique_prefix\"; \n \ - }\n else\n {system \"qsub $job -e $st\ -derr_file -o $stdio_file >$unique_prefix\"; \ - \n } \n\n\n\n print STDERR \"$id: $o\ -utput_all\\n\";\n $n_sub++;\n if ( $max_su\ -b_jobs && $n_sub==$max_sub_jobs) \n {\n $n_sub=m\ -onitor_process($min_sub_jobs,@job_log); \n \n \ - } \n \n unlink $unique_prefi\ -x;\n sleep $pause_time;\n $id++;\n }\n\ -\n close (OUT);\n close (F);\n\n print ST\ -DERR \"Your $id Jobs Have Been Submited (NAME=$uni\ -que_prefix)\\n\";\n monitor_process (0, @job_lo\ -g);\n foreach $file(@job_log) {if (-e $file) {u\ -nlink($file);}}\n \n }\n\nsub monitor_proces\ -s ( @job_list)\n {\n my (@job_list)=@_;\n \ - my $min_sub_jobs=shift (@job_list);\n my $n_su\ -b_jobs;\n my $finished;\n my $n=0;\n\n $n\ -_sub_jobs=-1;\n $finished=0;\n print STDERR \ -\"\\nMonitor Batch: [$min_sub_jobs]\";\n \n \ - while (!$finished && (($n_sub_jobs>$min_sub_job\ -s)|| $n_sub_jobs==-1) ) \n {\n $finished=1;\n $n_s\ -ub_jobs=0;\n $n=0;\n foreach $file (@job_list)\n \ - {\n \n if (-e $file){;}\n else \n {\\ -n $finished=0; $n_sub_jobs++;\n }\ -\n }\n system \"sleep 1\";\n }\n \ - \n return $n_sub_jobs;\n }\n \n \nif \ -($tmp_file_name){unlink($tmp_file_name);}\n","\n\n\ -foreach ($np=0; $np<=$#ARGV; $np++)\n {\n $v\ -alue=$ARGV[$np];\n\n if ($value eq \"-file\")\n\ - {\n $file= $ARGV[++$np];\n }\n \ -elsif ($value eq \"-type\")\n {\n $typ\ -e= $ARGV[++$np];\n }\n elsif ($value eq \"\ --institute\")\n {\n $institute= $ARGV[\ -++$np];\n }\n elsif ($value eq \"-author\"\ -)\n {\n $author= $ARGV[++$np];\n \ -}\n elsif ($value eq \"-date\")\n {\n \ - $date= $ARGV[++$np];\n }\n elsif ($val\ -ue eq \"-program\")\n {\n $program= $A\ -RGV[++$np];\n }\n elsif ($value eq \"-emai\ -l\")\n {\n $email= $ARGV[++$np];\n \ - }\n else\n {\n print \"$value is an unko\ -wn argument[FATAL]\\n\";\n exit (1);\n }\n }\ -\n\n\n\nopen F, $file || die;\nprint $INSTITUTE;\n\ -if ( $type eq \"c\"){print \"/********************\ -*************COPYRIGHT NOTICE*********************\ -*************/\\n\";}\nif ( $type eq \"perl\"){pri\ -nt \"#################################COPYRIGHT NO\ -TICE#################################/\\n\";}\nif \ -( $type eq \"txt\"){print \"----------------------\ -------------COPYRIGHT NOTICE----------------------\ ------------/\\n\";}\n\n\nwhile ()\n {\n s/\\$\ -INSTITUTE/$institute/g;\n s/\\$AUTHOR/$author/g;\\ -n s/\\$DATE/$date/g;\n s/\\$PROGRAM/$program/g; \ - \n s/\\$EMAIL/$email/g; \n if ( $type eq \"txt\ -\"){print $_;}\n elsif ($type eq \"c\"){chop $_; \ -print \"\\/*$_*\\/\\n\";}\n elsif ($type eq \"per\ -l\"){print \"\\#$_\";}\n}\nclose (F);\nif ( $type \ -eq \"c\"){print \"/*******************************\ -**COPYRIGHT NOTICE********************************\ -**/\\n\";}\nif ( $type eq \"perl\"){print \"######\ -###########################COPYRIGHT NOTICE#######\ -##########################/\\n\";}\nif ( $type eq \ -\"txt\"){print \"---------------------------------\ --COPYRIGHT NOTICE---------------------------------\ -/\\n\";}\n\n","\nwhile (<>) \n {\n s/\\=cc/1234567\ -89/g;\n s/\\bcc/\\$\\(CC\\)/g;\n s/123456789/\\=cc\ -/g;\n print $_;\n }\n\n","$version=\"1.00\";\n$rse\ -ed= int(rand(100000))+1;\n\n\nif ( $#ARGV==-1)\n \ -{\n print \"msa2bootstrap -i -o -input -n -o -tmode -d\ -mode -alignpg -rtree -stype -recomput\ -e -system \";\n print \"\\n\\t-i: \ -input file, can be sequneces, msa, matrix, trees, \ -type is specified via -input\";\n print \"\\n\\\ -t-input: Type of input data\";\n print \"\\n\\t\ -\\tmsa: msa in fasta format\";\n print \"\\n\\t\ -\\tseq: compute an msa with -alignpg\";\n print\ - \"\\n\\t\\tmatrix: phylipp distance matrix fed di\ -rectly to method -tmode [caveat: tmode=nj or upgma\ -]\";\n print \"\\n\\t\\ttree: list of newick tr\ -ees directly fed to consence in order to generate \ -a bootstraped tree\";\n \n print \"\\n\\t-n:\ - number of bootstrap replicates\";\n print \"\\\ -n\\t-o: name of the output tree. Files are not ove\ -rwritten. Use -recompute to overwrite existing fil\ -e\";\n print \"\\n\\t-tmode: tree mode: nj|upgm\ -a|parsimony|ml\";\n print \"\\n\\t-dmode: dista\ -nce mode\";\n print \"\\n\\t-alignpg: program f\ -or aligning sequences (t_coffee=default)\";\n p\ -rint \"\\n\\t-rtree: replicate tree file (default:\ - no file)\";\n print \"\\n\\t-rmsa: replicate m\ -sa file (default: no file)\";\n print \"\\n\\t-\ -rmat: replicate matrix file (default: no file)\";\\ -n print \"\\n\\t-stype: sequence type: protein,\ - dna or cdna\";\n print \"\\n\\t-recompute: for\ -ce files to be overwritten\";\n print \"\\n\\t-\ -system: cygwin|unix\";\n \n\n \n &my_ex\ -it (EXIT_FAILURE);\n }\nforeach $arg (@ARGV){$com\ -mand.=\"$arg \";}\n\nprint \"CLINE: $command\\n\";\ -\n$threshold=100;\n$trim_msa=0;\n$stype=\"prot\";\\ -nprint \"msa2bootstrap \";\n\n$system=\"cygwin\";\\ -nif(($command=~/\\-system (\\S+)/))\n {\n $sys\ -tem=$1;\n if ( $system eq \"cygwin\")\n {\\ -n $exec_extension=\".exe\";\n }\n elsif ( \ -$system eq \"unix\")\n {\n $exec_extension=\"\ -\";\n print \"system=Unix\";die;\n }\n els\ -e\n {\n print \"msa2boostrap: -system=$system\ - is an unknown mode [FATAL]\\n\"; die;\n }\n \ - \n print \"-system $system \";\n }\nif(($co\ -mmand=~/\\-stype (\\S+)/))\n {\n $stype=$1;\n \ - }\nprint \"-stype=$stype \";\n\n\n\nif(($command=\ -~/\\-i (\\S+)/))\n {\n $msa=$1;\n print \"-\ -i $msa \";\n }\n\nif(($command=~/\\-rtree (\\S+)/\ -))\n {\n $rtree=$1;\n print \"-rtree=$rtree\ - \";\n }\n\nif(($command=~/\\-rmsa (\\S+)/))\n {\ -\n $rmsa=$1;\n }\nif(($command=~/\\-rmat (\\S+\ -)/))\n {\n $rmat=$1;\n }\n$input=\"seq\";\nif\ -(($command=~/\\-input (\\S+)/))\n {\n $input=$\ -1;\n }\nprint \"-input=$input \";\n\n$dmode=\"kim\ -ura\";\nif(($command=~/\\-dmode (\\S+)/))\n {\n \ - $dmode=$1;\n }\nprint \"-dmode=$dmode \";\n$ali\ -gnpg=\"muscle\";\nif(($command=~/\\-alignpg (\\S+)\ -/))\n {\n $alignpg=$1;\n }\nprint \"-alignpg=\ -$dmode \";\n\n$tmode=\"nj\";\nif(($command=~/\\-tm\ -ode (\\S+)/))\n {\n $tmode=$1;\n }\nprint \"-\ -tmode=$tmode \";\n$recompute=0;\nif(($command=~/\\\ --recompute/))\n {\n $recompute=1;\n print \\ -"-recompute \";\n }\n\n$out=$msa;\n$out=~s/\\..*/\ -/;\n$out.=\".bph\";\nif(($command=~/\\-o (\\S+)/))\ -\n {\n $out=$1;\n \n }\nprint \"-out=$out \ -\";\nif (-e $out && !$recompute)\n {\n print \\ -"\\nNo Computation Required $out already exists\\n\ -\";\n &my_exit (EXIT_SUCCESS);\n \n }\n\n$n\ -=100;\nif(($command=~/\\-n (\\d+)/))\n {\n $n=\ -$1;\n }\nprint \"-n=$n \";\n$seed=3;\nif(($comman\ -d=~/\\-s (\\d+)/))\n {\n $seed=$1;\n }\nprint\ - \"-s=$seed\";\n\nif(($command=~/\\-run_name (\\d+\ -)/))\n {\n $suffix=$1;\n }\nelse\n {\n $m\ -sa=~/([^.]+)/;\n $suffix=$1;\n }\nprint \"-run\ -_name=$suffix\";\n\n\nif ( $input eq \"seq\")\n {\ -\n $seq=$msa;\n $msa=\"$suffix.prot_msa\";\n\ - \n if ($stype eq \"cdna\")\n {\n $cdna\ -_seq=$seq;\n $clean_cdna_seq=&vtmpnam();\n $seq=&v\ -tmpnam();\n `t_coffee -other_pg seq_reformat -in $\ -cdna_seq -action +clean_cdna >$clean_cdna_seq`;\n \ -`t_coffee -other_pg seq_reformat -in $clean_cdna_s\ -eq -action +translate >$seq`;\n \n }\n\n i\ -f (!-e $msa || $recompute)\n {\n print \"\\n#\ -#### Compute an MSA With $alignpg\\n\";\n \n if \ -( $alignpg eq \"t_coffee\")\n {`$alignpg $seq -o\ -utfile=$msa >/dev/null 2>/dev/null`;}\n elsif ( $a\ -lignpg eq \"muscle\")\n {\n `$alignpg -in $s\ -eq > $msa 2>/dev/null`;\n }\n elsif ( $alignpg e\ -q \"clustalw\")\n {\n `$alignpg -infile=$seq\ - -outfile=$msa -quicktree >/dev/null 2>/dev/null`;\ -\n }\n elsif ( $align eq \"mafft\")\n {\n \ -`$alignpg $seq > $msa >/dev/null 2>/dev/null`;\n \ - }\n else\n {\n `$alignpg -in=$seq -outfile=\ -$msa`;\n }\n }\n if (!-e $msa)\n {\\ -n print \"\\nError: $alignpg Could Not produce the\ - MSA $msa [FATAL]\\n\";\n }\n\n if ($stype\ - eq \"cdna\")\n {\n $msa2=\"$suffix.cdna_msa\\ -";\n `t_coffee -other_pg seq_reformat -in $clean_c\ -dna_seq -in2 $msa -action +thread_dna_on_prot_aln \ --output fasta_aln >$msa2`;\n $msa=$msa2;\n }\ -\n \n $input=\"msa\";\n }\n\n\n\n$seqboot_o\ -=&vtmpnam();\n$seqboot_c=&vtmpnam();\n\n$protdist_\ -o=&vtmpnam();\n$protdist_c=&vtmpnam();\nif ( $inpu\ -t eq \"msa\")\n {\n if ($tmode eq \"nj\" || $t\ -mode eq \"upgma\"){$input=\"matrix\";}\n \n \ -$lmsa= &vtmpnam ();\n `t_coffee -other_pg seq_r\ -eformat -in $msa -output phylip_aln > $lmsa`;\n \ - \n if ( -e \"outfile\"){unlink (\"outfile\");}\ -\n # run seqboot\n \n if ( $n>1)\n {\n\ - print \"Run SeqBoot .....\";\n open (F, \">$seqbo\ -ot_c\");\n print F \"$lmsa\\nR\\n$n\\nY\\n$seed\\n\ -\";\n close (F);\n `seqboot$exec_extension < $seq\ -boot_c`;\n if ( -e \"outfile\"){ print \"[OK]\\n\"\ -;}\n else { print \"[FAILED]\\n\";&my_exit (EXIT_F\ -AILURE);}\n `mv outfile $seqboot_o`;\n }\n \ - else\n {\n `cp $lmsa $seqboot_o`;\n }\n\ -\n if ($rmsa){`cp $seqboot_o $rmsa`;}\n \n \ - if ($tmode eq \"nj\" || $tmode eq \"upgma\")\n \ - {\n if ( $stype eq \"prot\")\n {\n # run\ - protdist\n print \"Run Protdist [dmode=$dmode\ -]\";\n if ($dmode eq \"kimura\")\n {\n \ -$dmode=\"P\\nP\\nP\";\n }\n else\n \ - {\n print \"\\n$dmode is an unknown mode for Pro\ -tdist [FATAL:msa2bootstrap.pl]\\n\";\n &my_exit (\ -EXIT_FAILURE);\n }\n open (F, \">$protdi\ -st_c\");\n if ($n>1){print F \"$seqboot_o\\n$d\ -mode\\nM\\nD\\n$n\\nY\\n\";}\n else {printf F \ -\"$seqboot_o\\n$dmode\\nY\\n\";}\n close (F);\\ -n `cp $protdist_c pd_comm`;\n `protdist$ex\ -ec_extension < $protdist_c`;\n if ( -e \"outf\ -ile\"){ print \"[OK]\\n\";}\n else { print \"[\ -FAILED]\\n\";&my_exit (EXIT_FAILURE);}\n `mv o\ -utfile $protdist_o`;\n \n }\n elsif ( $stype eq\ - \"cdna\" || $stype eq \"dna\")\n {\n print \ -\"Run dnadist [dmode=default\";\n open (F, \">\ -$protdist_c\");\n if ($n>1){print F \"$seqboot\ -_o\\nM\\nD\\n$n\\nY\\n\";}\n else {printf F \"\ -$seqboot_o\\nY\\n\";}\n close (F);\n `prot\ -dist$exec_extension < $protdist_c`;\n if ( -e\ - \"outfile\"){ print \"[OK]\\n\";}\n else { pr\ -int \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\n \ - `mv outfile $protdist_o`;\n }\n }\n }\ne\ -lsif ( $input eq \"matrix\")\n {\n $protdist_o\ -=&vtmpnam();\n print \"MSA: $msa\\n\";\n `cp\ - $msa $protdist_o`;\n $n=1;\n }\n\n\n\n\n\n$nb\ -_o=&vtmpnam();\n$nb_c=&vtmpnam();\nif ($input eq \\ -"matrix\" && $tmode ne \"parsimony\" && $tmode ne \ -\"ml\")\n {\n print \"Run neighbor [tmode=$tmo\ -de]\";\n\n if ($tmode eq \"nj\")\n {\n $tm\ -ode=\"\\nN\\nN\";\n }\n elsif ( $tmode eq \ -\"upgma\")\n {\n $tmode = \"\\nN\";\n }\\ -n else\n {\n print \"\\n ERROR: $tmode is \ -an unknown tree computation mode\\n\";\n &my_exit \ -(EXIT_FAILURE);\n }\n\n open (F, \">$nb_c\\ -");\n if ($n>1){print F \"$protdist_o$tmode\\nM\ -\\n$n\\n$seed\\nY\\n\";}\n else {print F \"$pro\ -tdist_o$tmode\\nY\\n\";}\n close (F);\n\n `n\ -eighbor$exec_extension < $nb_c`;\n if ( -e \"o\ -uttree\"){ print \"[Neighbor OK]\\n\";}\n else \ -{ print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\\ -n `mv outtree $nb_o`;\n unlink (\"outfile\")\ -;\n }\nelsif ($input eq \"msa\" && $tmode eq \"pa\ -rsimony\")\n {\n if ( -e \"outfile\"){unlink (\ -\"outfile\");}\n if ( -e \"outtree\"){unlink (\\ -"outtree\");}\n \n if ($stype eq \"prot\")\n\ - {\n print \"Run protpars [tmode=$tmode]\";\n\ - open (F, \">$nb_c\");\n if ($n>1){print F \"$seqb\ -oot_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\n else \ -{print F \"$seqboot_o\\nY\\n\";}\n close (F);\n `p\ -rotpars$exec_extension < $nb_c`;\n }\n el\ -sif ( $stype eq \"dna\" || $stype eq \"cdna\")\n \ - {\n print \"Run dnapars [tmode=$tmode]\";\n op\ -en (F, \">$nb_c\");\n if ($n>1){print F \"$seqboot\ -_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\n else {pr\ -int F \"$seqboot_o\\nY\\n\";}\n close (F);\n `dnap\ -ars$exec_extension < $nb_c`;\n }\n if ( -\ -e \"outtree\"){ print \"[OK]\\n\";}\n else { pr\ -int \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\n \ - `mv outtree $nb_o`;\n unlink (\"outfile\");\n \ -}\nelsif ($input eq \"msa\" && $tmode eq \"ml\")\n\ - {\n if ( -e \"outfile\"){unlink (\"outfile\")\ -;}\n if ( -e \"outtree\"){unlink (\"outtree\");\ -}\n \n if ($stype eq \"prot\")\n {\n pr\ -int \"Error: ML impossible with Protein Sequences \ -[ERROR]\";\n &my_exit (EXIT_FAILURE);\n }\n \ - elsif ( $stype eq \"dna\" || $stype eq \"cdna\")\ -\n {\n print \"Run dnaml [tmode=$tmode]\";\n \ -open (F, \">$nb_c\");\n if ($n>1){print F \"$seqbo\ -ot_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\n else {\ -print F \"$seqboot_o\\nY\\n\";}\n close (F);\n `dn\ -aml$exec_extension < $nb_c`;\n }\n if ( -\ -e \"outtree\"){ print \"[OK]\\n\";}\n else { pr\ -int \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\n \ - `mv outtree $nb_o`;\n unlink (\"outfile\");\n \ -}\n\n\nelse\n {\n `cp $msa $nb_o`;\n $n=2;\\ -n }\n\nif ($rmsa && -e $seqboot_o){print \"\\nOut\ -put List of $n Replicate MSA: $rmsa\\n\";`cp $seqb\ -oot_o $rmsa`;}\nif ($rmat && -e $protdist_o){print\ - \"\\nOutput List of $n Replicate MATRICES: $rmat\\ -\n\";`cp $protdist_o $rmat`;}\nif ($rtree && -e $n\ -b_o){print \"\\nOutput List of $n Replicate TREES:\ - $rtree\\n\";`cp $nb_o $rtree`;}\n\n\n\n$con_o=&vt\ -mpnam();\n$con_c=&vtmpnam();\nif ($n >1)\n {\n \ - print \"Run Consense.....\";\n open (F, \">$co\ -n_c\");\n print F \"$nb_o\\nY\\n\";\n close \ -(F);\n `consense$exec_extension < $con_c`;\n \ - if ( -e \"outfile\"){ print \"[OK]\\n\";}\n e\ -lse { print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE\ -);}\n `mv outtree $con_o`;\n unlink (\"outfi\ -le\");\n }\nelse\n {\n `cp $nb_o $con_o`;\n \ -}\n\n\n`cp $con_o $out`;\nif ( !-e $out)\n {\n \ - print \"Tree Computation failed [FAILED]\\n\";\n \ - &my_exit (EXIT_FAILURE);\n }\nelsif ($n>1)\n \ -{\n print \"\\nOutput Bootstrapped Tree: $out\\\ -n\";\n $avg=`t_coffee -other_pg seq_reformat -i\ -n $out -action +avg_bootstrap`;\n $avg=~s/\\n//\ -g;\n print \"$avg\\n\";\n }\nelse\n {\n pr\ -int \"\\nOutput Tree: $out\\n\";\n }\n\nopen (F, \ -\"$out\");\nwhile ()\n {\n \n $tree.=$_;\ -\n }\nclose (F);\n$tree=~s/\\n//g;\nprint \"BPH: \ -$tree\\n\";\n\n\n&my_exit (EXIT_SUCCESS);\n\nsub m\ -y_exit \n {\n my $m=@_[0];\n &clean_vtmpnam\ -();\n exit ($m);\n }\nsub vtmpnam \n {\n m\ -y $file;\n\n\n $ntmp++;\n $file=\"tmp4msa2bo\ -otstrap.$rseed.$$.$ntmp\";\n \n push (@tmpfi\ -le, $file);\n return $file;\n }\nsub clean_vtm\ -pnam \n {\n my $t;\n foreach $t (@tmpfile)\\ -n {\n if ( -e $t){unlink ($t)};\n }\n }\ -\n","use Env;\n$seq_reformat=\"t_coffee -other_pg \ -seq_reformat \";\n$VersionTag=\"1.00\";\n$step=1;\\ -n$unset=\"\";\n$scoreT1=$scoreT2=$nseqT=$dp_limit=\ -$unset;\n@tl=();\nchomp($tc_version=`t_coffee -ver\ -sion`);$tc_version=~s/PROGRAM: //;\n\n\nprint STDE\ -RR \"\\n******************************************\ -***********************\";\nprint STDERR \"\\n* \ - HIGH LEVEL PROGRAM: T-COFFEE_DPA Version $\ -VersionTag\";\nprint STDERR \"\\n* LOW \ -LEVEL PROGRAM: $tc_version \";\nprint STDERR \"\\n\ -**************************************************\ -***************\";\n\nif (!@ARGV)\n {\n print \ -\"t_coffee_dpa accepts every t_coffee_flag.\\nType\ - t_coffee to obtain a list\\n\";\n print \"Requ\ -ires $TC_VERSION\\n\";\n print \"Requires \";\n\ - print \"t_coffee_dpa specific flags:\\n\";\n \ - print \"\\t-dpa_master_aln....................Ma\ -ster alignment: provided OR computed\\n\";\n pr\ -int \"\\t-dpa_master_aln....................By def\ -ault, Computed with t_coffee -very_fast\\n\";\n \ - print \"\\t-dpa_master_aln=.............Use\ - file, (must be an aln in Fasta or ClustalW\\n\";\\ -n print \"\\t-dpa_master_aln=.........\ -.Compute aln with pg -in seq -out aln`\\n\";\n \ -print \"\\t-dpa_maxnseq.......................Maxi\ -mum number of sequences in subgroups\\n\";\n pr\ -int \"\\t-dpa_min_score1....................Minimu\ -m Id for two sequences to be grouped in ref_aln\\n\ -\";\n print \"\\t-dpa_min_score2...............\ -.....Minimum Id within a subgroup\\n\";\n print\ - \"\\t-dpa_debug.........................Keep Tmp \ -File (for debug purpose)\\n\\n\";\n \n exit \ -(0);\n }\nforeach $arg (@ARGV)\n {\n $arg_lis\ -t.=\" $arg\";\n }\n$arg_list=~s/[=,;]/ /g;\n\n\n(\ -$seq0, $arg_list)=&extract_val_from_arg_list(\"^\"\ -,$arg_list, \"SPLICE\",\"unset\");\n($seq1, $arg_l\ -ist)=&extract_val_from_arg_list(\"-seq\",$arg_list\ -, \"SPLICE\",\"unset\");\n($seq2, $arg_list)=&extr\ -act_val_from_arg_list(\"-in\",$arg_list, \"KEEP\",\ -\"unset\");\n($seq3, $arg_list)=&extract_val_from_\ -arg_list(\"-infile\",$arg_list, \"SPLICE\",\"unset\ -\");\n($prf, $arg_list)=&extract_val_from_arg_lis\ -t(\"-profile\",$arg_list, \"SPLICE\",\"unset\");\n\ -\n$gl{'Seq'}=$seq=&vtmpnam();#file containing all \ -the sequences\n\n #1-remove sequences from -in\n\ -if ( $arg_list =~/\\-in\\b/)\n {\n my $save, $\ -name;\n while($arg_list=~/\\-in\\b[^-]+(\\bS[\\\ -w.]+)/)\n {\n $name=$1;$name=~s/^.//;\n if ( \ -!-e $name){$save.=\" S$name \";}\n\n $arg_list=~s/\ -S$name/ /;\n }\n $arg_list=~s/\\-in\\b/\\-\ -in $save /;\n }\n #2-prepare \n\nif (!($arg_lis\ -t=~/\\-outorder/))\n {\n \n $output_cl .=\"\ - -outorder=$seq\";\n }\n@output_flag=(\"-output\"\ -,\"-outfile\", \"-run_name\", \"-outorder\"); \nfo\ -reach $v1 (@output_flag)\n {\n ($v2, $arg_list\ -)=&extract_val_from_arg_list($v1,$arg_list, \"SPLI\ -CE\",\"unset\");\n if ($v2 ne \"\")\n {\n\\ -n if ($v1 eq \"-run_name\"){$run_name=$v2;$output_\ -cl .=\" $v1 $v2 \";}\n elsif ( $v1 eq \"-outorder\\ -")\n {\n if ( $v2 eq \"input\"){$v2=$seq;}\n\ - $outorder=$v2;$output_cl .=\" $v1 $v2 \";\n \ - }\n else\n {\n $output_cl .=\" $v1 $v2 \";\\ -n }\n }\n }\n\n\n($dpa_master_aln, $arg_lis\ -t) =&extract_val_from_arg_list(\"-dpa_master_aln\\ -",$arg_list, \"SPLICE\", \"t_coffee\");\n$dpa_mast\ -er_aln=~s/\\s//g;\n($nseqT, $arg_list) =\ -&extract_val_from_arg_list(\"-dpa_maxnseq\",$arg_l\ -ist, \"SPLICE\", 30);\n($scoreT1, $arg_list) \ - =&extract_val_from_arg_list(\"-dpa_min_score1\"\ -,$arg_list, \"SPLICE\", 80);\n($scoreT2, $arg_list\ -) =&extract_val_from_arg_list(\"-dpa_min_s\ -core2\" ,$arg_list, \"SPLICE\", 30);\n($dpa_lim\ -it, $arg_list) =&extract_val_from_arg_list(\\ -"-dpa_limit\" ,$arg_list, \"SPLICE\", 0);\n\ -($dpa_delta_id, $arg_list) =&extract_val_from_a\ -rg_list(\"-dpa_delta_id\" ,$arg_list, \"SPL\ -ICE\", 1);\n($dpa_debug, $arg_list) =&extrac\ -t_val_from_arg_list(\"-dpa_debug\" ,$arg\ -_list, \"SPLICE\", 0);\n\n\n$in_seq=$seq0.\" \".$s\ -eq1.\" \".$seq2.\" \".$seq3;\n$in_prf=(($prf ne $u\ -nset)?\"$prf \":\"\");\n&exit_dpa (($in_seq eq \"\\ -" && $in_prf eq \"\")?1:0, \"ERROR: You did not Pr\ -ovide any sequences. Use the -seq flag [FATAL: t_c\ -offee_dpa]\\n\", EXIT_FAILURE);\n\n\nprint STDERR \ -\"\\nSTART DPA COMPUTATION\";\n\n\n\nif ($in_seq=~\ -/\\S+/)\n {\n \n print STDERR \"\\n Step $s\ -tep: Gather all the sequences into the tmp file: [\ -$seq]\";$step++; \n &my_system (\"t_coffee $in_\ -seq -convert -quiet -output fasta_seq -outfile=$se\ -q -maxnseq 0\");\n }\n\nif ( !-e $seq){$seq=\"\";\ -}\n\nif ($in_prf=~/\\S+/)\n {\n $seq_in_type=\\ -"profile\"; \n $seq.= $in_prf; \n }\nif ($seq \ -eq \"\"){ &exit_dpa (1, \"\\nERROR: No Sequence FO\ -und. Provide Sequences with the -seq flag [FATAL: \ -t_coffee_dpa]\", EXIT_FAILURE);}\n\n \n\nif ( $run\ -_name)\n {\n $suffix=$run_name;\n }\nelsif ($\ -in_seq=~/\\b(S[\\w.]+\\b)/)\n {\n my $suffix1,\ - $sufffix2;\n $suffix1=$suffix2=$1;\n $suffi\ -x2=~s/^S//;\n if ( -e $suffix1){$suffix=$suffix\ -1;}\n elsif ( -e $suffix2){$suffix=$suffix2;}\n\ - else\n {\n $suffix=&vtmpnam(); \n }\\ -n $suffix=~s/\\.\\w+//;\n }\n\nelse\n {\n \ -$suffix=&vtmpnam();\n }\n\n\nif (!$run_name){$out\ -put_cl.=\" -run_name $suffix \";}\n\n\n$gl{'Tree'}\ -=&seq2dpa_tree ($seq, \"$suffix.dpadnd\");\n\nprin\ -t STDERR \"\\n Step $step: Prepare guide tree: $gl\ -{'Tree'}\";$step++;\n\nprint STDERR \"\\n Step $st\ -ep: Identify and Align Closely Related Groups\";$s\ -tep++;\n%gl=&make_one_pass (0, $scoreT1,\"Align\",\ -%gl);\n\nprint STDERR \"\\n Step $step: Make Multi\ -ple Group Alignment\";$step++;\nwhile (!%gl ||$gl{\ -'Ng'}>$nseqT)\n {\n %gl=&make_one_pass ($nseqT\ -, $scoreT2,\"t_coffee\",%gl);\n if ( $gl{'Newgr\ -oups'}==0){$scoreT2--;} \n }\nprint STDERR \"\\ -\n Step $step: Make The Final Alignment\";$step++;\ -\n\n\n$arg_list .=$output_cl;\n\n\n%gl=&tree2group\ - (0,0, %gl);\n$gl{$gl{'0'}{'File'}}{'Output'}=\"\"\ -;\n$a=0;\n&align_groups (\"t_coffee\",'0', $arg_li\ -st, \" \", %gl);\n\n\n\nif ( !$dpa_keep_tmpfile){&\ -clean_tmp_file (@tl);}\n\n\n\nsub seq2dpa_tree \n \ - {\n my $seq=@_[0];\n my $newtree=@_[1];\n \ - my $aln=&vtmpnam ();\n\n &my_system (\"t_coff\ -ee -special_mode quickaln -in $seq -outfile $aln -\ -quiet\");\n &my_system (\"$seq_reformat -in $al\ -n -action +aln2tree +tree2dpatree -output newick >\ -$newtree\");\n return $newtree;\n } \nsub seq2\ -dpa_tree_old \n {\n my $aln=@_[0];\n my $ne\ -wtree=@_[1];\n \n \n &my_system(\"$seq_re\ -format -in $aln -action +seq2dpatree -output newic\ -k > $newtree\");\n return $newtree;\n }\nsub a\ -ln2dpa_tree \n {\n my $aln=@_[0];\n my $new\ -tree=&vtmpnam();\n \n &my_system(\"$seq_refo\ -rmat -in $aln -action +aln2tree +tree2dpatree -out\ -put newick > $newtree\");\n return $newtree;\n \ - }\nsub group_file2ngroups\n {\n my $file=@_[0\ -];\n my $n;\n \n open ( F, $file);\n w\ -hile ()\n {\n $n+=/\\>/;\n }\n clo\ -se (F);\n return $n;\n }\n\nsub make_one_pass\\ -n {\n my ($N, $ID,$pg, %gl)=@_;\n my $a;\n\\ -n %gl=&tree2group ($N,$ID,%gl);\n if (!$gl{'\ -Newgroups'}){return %gl;}\n else\n {\n for\ - ( $a=0; $a< $ng; $a++)\n {\n if ($gl{$gl{$a\ -}{'File'}}{'Ng'}>1){&display_group($a, %gl);}\n \ - &align_groups ($pg, $a, $arg_list, \" -quiet=qui\ -et \", %gl);\n }\n return %gl;\n }\n }\n\n\ -sub tree2group \n {\n my ($N, $ID, %gl)=@_;\n \ - my $prefix=&vtmpnam();\n my $group_file=&vtm\ -pnam();\n my $file;\n my $oldtree=&vtmpnam()\ -;\n my $n;\n my $tree;\n\n\n if ( $gl{'Ng\ -'}==1){return %gl;}\n $tree=$gl{'Tree'}; \n \ -\n #1 extract the groups\n &my_system (\"$se\ -q_reformat -in $tree -action +tree2group $N $ID $p\ -refix > $group_file\");\n $n=group_file2ngroups\ -($group_file);\n \n \n $gl{'Newgroups'}=1\ -;\n if ( $n==$gl{'Ng'})\n {\n $gl{'Newgrou\ -ps'}=0;\n return %gl;\n }\n $gl{'Iteration\ -'}++;\n $gl{'MaxNseq'}=$N;$gl{'MinID'}=$ID;\n \ - $gl{'GroupFile'}=$group_file;$gl{'Ng'}=$ng=0;\n \ - #2 Process the group list into the hash\n op\ -en (F, $group_file);\n while ()\n {\n $\ -gl{'File'}.=$_;\n if (/\\>/)\n {\n $line=$_;\ -\n $line=~s/\\>//;\n @list=($line=~/(\\S+)\ -/g);\n $file=$gl{$ng}{'File'}=shift @list;\n \ - $gl{$file}{'Output'}=$file;\n \n $gl{$f\ -ile}{'Ng'}=$#list+1;\n if ($gl{$file}{'Ng'}>1)\ -{ $gl{$file}{'Tlist'}=$gl{$file}{'Alist'}=\"(\";}\\ -n foreach $l (@list)\n {\n \n $gl{$file\ -}{'List'}.=\" $l \";\n \n if (!$gl{$l}{'Tlist'})\ -\n {\n $gl{$l}{'Tlist'}=\"$l\";\n $gl\ -{$l}{'Alist'}=\"$l\";\n $gl{$l}{'Nseq'}=1;\n \ - $gl{$l}{'Ng'}=1;\n }\n $gl{$file}{'Tlist'\ -}.=\"$gl{$l}{'Tlist'},\";\n $gl{$file}{'Alist'}.=\ -\"$gl{$l}{'Tlist'}|\";\n $gl{$file}{'Nseq'}+=$gl{\ -$l}{'Nseq'};\n }\n \n\n chop($gl{$fi\ -le}{'Tlist'});chop($gl{$file}{'Alist'});\n if \ -($gl{$file}{'Ng'}>1){$gl{$file}{'Tlist'}.=\")\"; $\ -gl{$file}{'Alist'}.=\");\";}\n $ng++;\n } \n\ - }\n $gl{'Ng'}=$ng;\n close (F);\n \\ -n #3 Update the old tree with the new groups\n \ - $gl{'Tree'}=&vtmpnam();\n &my_system (\"$seq\ -_reformat -in $tree -action +collapse_tree $group_\ -file -output newick > $gl{'Tree'}\");\n \n r\ -eturn %gl;\n }\n\nsub display_group \n {\n my\ - ($g,%gl)=@_;\n my $f;\n \n if ( $g==-1)\\ -n {\n print STDERR \"\\nIteration $gl{'Iterat\ -ion'} [MaxN=$gl{'MaxNseq'}][MinID=$gl{'MinID'}]\";\ -\n }\n else\n {\n\n $f=$gl{$g}{'File'\ -};\n $action=($gl{$f}{'Ng'}==1 || $gl{'Iteration'}\ -==1)?\"KEEP \":\"ALIGN \";\n print STDERR \ -\"\\n\\t[$action][MaxN=$gl{'MaxNseq'}][MinID=$gl{'\ -MinID'}][File $f][Nseq=$gl{$f}{'Nseq'}][Ngroups=$g\ -l{$f}{'Ng'}][$gl{$f}{'Alist'}]\";\n }\n }\n \ - \n\n\nsub align_groups\n {\n my ($pg, $g,\ - $arg, $extra_arg,%gl)=@_;\n my $f;\n my $Ou\ -tput,$Outflag;\n \n \n $f=$gl{$g}{'File'}\ -;\n $Output=($gl{$f}{'Output'});\n \n if \ -( $pg eq \"Align\")\n {\n if ( !-e $f)\n {\\ -n $command=\"$seq_reformat -in $gl{'Seq'} -ac\ -tion +extract_aln $gl{'GroupFile'}\";\n if ($g\ -l{$f}{'Ng'}>1)\n {\n &my_system ($command);\ -\n $command=\"t_coffee -special_mode quick_aln S\ -$f -outfile=$Output -quiet\";\n }\n }\n el\ -se \n {$command=\"\";}\n }\n elsif ( -e \ -$f)\n { \n $Outflag=($Output)?\"-outfile=$Out\ -put\":\"\";\n $command=\"$pg -infile $f $Outflag -\ -quiet stdout $arg $extra_arg -maxnseq 0 -convert -\ -quiet stdout\";\n }\n elsif ( $gl{$f}{'Ng'\ -}==1)\n {\n $action=($dpa_debug)?\"cp\":\"mv\\ -";\n $command=\"$action $gl{$f}{'List'} $Output\";\ -\n }\n else\n {\n $Outflag=($Output)?\ -\"-outfile=$Output\":\"\";\n $command=\"$pg -profi\ -le $gl{$f}{'List'} $Outflag $arg $extra_arg -maxns\ -eq 0\";\n }\n \n &my_system ($command);\ -\n return $outfile;\n }\n \nsub my_system \\ -n {\n my $command=@_[0];\n my $force=@_[1];\ -\n my $status;\n\n if ( $dpa_debug) {print S\ -TDERR \"\\nCOMMAND: $command\";}\n $status=syst\ -em ($command);\n\n if (!$force)\n {\n &e\ -xit_dpa (($status==1), \"Failed in Command:\\n$com\ -mand\\n[FATAL: t_coffee_dpa]\\n\", EXIT_FAILURE);\\ -n }\n \n return $status;\n }\n\nsub v\ -tmpnam\n {\n my $prefix=@_[0];\n my $tmp_fi\ -le_name;\n\n $tmp_prefix=($prefix)?$prefix:\"dp\ -a_tmp_file_$$\";\n \n $tmp_count++;\n $tmp\ -_file_name=\"$tmp_prefix\".\"$tmp_count\";\n $t\ -l[$#tl+1]=$tmp_file_name;\n return $tmp_file_na\ -me;\n }\n\nsub clean_tmp_file\n {\n\n my $lis\ -t;\n my $file;\n \n if ($dpa_debug){retur\ -n;}\n $list=vtmpnam();\n `ls -1 | grep $tmp_\ -prefix>$list`;\n \n open (F,$list);\n whi\ -le ( )\n {\n $file=$_;\n chop $file;\n if \ -( -e $file){unlink $file;}\n }\n close (F)\ -;\n unlink $list;\n }\n\n\nsub exit_dpa\n {\n\ - my $condition=@_[0];\n my $error_msg=@_[1];\n \ -my $exit_value=@_[2];\n if ( $condition)\n {\n\ - print \"$error_msg\\n\";\n exit ($exit_\ -value);\n }\n else\n {\n return;\n \ -}\n \n}\nsub extract_val_from_arg_list\n {\n \ -my $arg=@_[0];\n my $arg_list=@_[1];\n my $k\ -eep_flag=@_[2];\n my $default_value=@_[3];\n \ - my $val=\"\";\n \n #protect\n $arg_list=\ -~s/\\s-/ \\@/g;\n $arg=~s/-/\\@/g;\n \n #\ -search\n if ($arg eq \"^\")\n {\n $arg_lis\ -t=~/^([^@]*)/;\n $val=$1;\n }\n else\n \ - {$arg_list=~/$arg ([^@]*)/;$val=$1;}\n \n \ -#remove trailing spaces\n $val=~s/\\s*$//;\n \ - \n #remove the parsed sequence if needed\n \ -if (($val ne \"\") && $keep_flag ne \"KEEP\")\n \ - {\n if ( $arg eq \"^\"){$arg_list=~s/$val/ /;}\\ -n else {$arg_list=~s/($arg [^@]*)/ /;}\n }\n \ -\n #unprotect\n $arg_list=~s/\\@/-/g;\n $\ -arg=~s/\\@/-/g;\n \n if (($val eq \"\") && $\ -default_value ne \"unset\"){$val=$default_value;}\\ -n \n return $val, $arg_list;\n }\n$program=\ -\"T-COFFEE (Version_7.90)\";\\n\n","\n$DEBUG=1;\n$\ -dpa_nseq=10;\n$dpa_sim=0;\nif (!@ARGV)\n {\n `\ -t_coffee`;\n exit (0);\n }\nforeach $arg (@ARG\ -V)\n {\n $arg_list.=\" $arg\";\n }\n$max_nseq\ -=10;\n($seq0, $arg_list)=&extract_val_from_arg_lis\ -t(\"^\",$arg_list);\n($seq1, $arg_list)=&extract_v\ -al_from_arg_list(\"-seq\",$arg_list);\n($seq2, $ar\ -g_list)=&extract_val_from_arg_list(\"-in\",$arg_li\ -st, \"KEEP\");\n($seq3, $arg_list)=&extract_val_fr\ -om_arg_list(\"-infile\",$arg_list);\n$in_seq=$seq0\ -.\" \".$seq1.\" \".$seq2.\" \".$seq3;\n\n$seq=vtmp\ -nam();\n`t_coffee $in_seq -convert -output fasta_s\ -eq -outfile=$seq`;\n\n\n($dpa_nseq, $arg_list)=&ex\ -tract_val_from_arg_list(\"-dpa_nseq\",$arg_list);\\ -n($master_aln, $arg_list)=&extract_val_from_arg_li\ -st(\"-master_aln\",$arg_list);\n($sim_matrix, $arg\ -_list)=&extract_val_from_arg_list(\"-sim_matrix\",\ -$arg_list);\n($core_seq, $arg_list)=&extract_val_f\ -rom_arg_list(\"-core_seq\",$arg_list);\n($dpa_sim,\ - $arg_list)=&extract_val_from_arg_list(\"-dpa_sim\\ -",$arg_list);\n($run_name, $arg_list)=&extract_val\ -_from_arg_list(\"-run_name\",$arg_list);\n($output\ -, $arg_list)=&extract_val_from_arg_list(\"-output\\ -",$arg_list);\n\n\n\nif (!$sim_mat && !$master_aln\ -)#Compute the fast alignment\n {\n $ref_aln=vt\ -mpnam();\n `t_coffee -seq=$seq -very_fast -outf\ -ile=$ref_aln -quiet`;\n \n }\n\nif (!$sim_mat)\ -\n {\n $sim_mat=vtmpnam();\n `seq_reformat \ --in $ref_aln -output sim > $sim_mat`;\n }\n\nif (\ - !$core_seq)\n {\n $core_seq=vtmpnam();\n `\ -seq_reformat -in $ref_aln -action +trimTC N$max_ns\ -eq -output fasta_seq > $core_seq`;\n }\n@core_nam\ -e=`seq_reformat -in $core_seq -output name `; \n\n\ -@tot_name=`seq_reformat -in $seq -output name `;\n\ -\nforeach $s (@core_name){$s=~s/\\s//g;$hcore{$s}=\ -1;}\nforeach $s (@tot_name){$s=~s/\\s//g;}\nprint \ -STDERR \"T-Coffee_dpa:\\n\";\nprint STDERR \"\\tTO\ -TAL SEQ: @tot_name\\n\";\nprint STDERR \"\\tCHOSE\ -N SEQ: @core_name\\n\";\n\n\n\nopen (F, $sim_mat);\ -\nwhile ( )\n {\n @l=($_=~/(\\b[\\S]+\\b)/g\ -);\n if (($l[0] eq \"TOP\" || $l[0] eq \"BOT\")\ -)\n {\n $s1=$l[1];$s2=$l[2];$v=$l[3];\n if ($\ -hcore{$s1} && !$hcore{$s2})\n {\n if (!$hseq\ -{$s2}{\"sim\"} || $v>$hseq{$s2}{\"sim\"})\n \ -{\n $hseq{$s2}{\"sim\"}=$v;$hseq{$s2}{\"seq\"}=$s\ -1;\n }\n }\n }\n }\nclose (F);\nfore\ -ach $s (@tot_name)\n {\n\n if ( !$hseq{$s}{\"s\ -eq\"}){;}\n else\n {\n $s2=$hseq{$s}{\"seq\ -\"};\n $v=$hseq{$s}{\"sim\"};\n \n if ($v>$dpa_si\ -m)\n {\n $hseq{$s}{'used'}=1;\n $seq_lis\ -t{$s2}{$seq_list{$s2}{'nseq'}++}=$s;\n }\n \ -}\n }\nforeach $s (@core_name){$seq_list{$s}{$seq\ -_list{$s}{'nseq'}++}=$s;$hseq{$s}{'used'}=1;}\nfor\ -each $s (@tot_name){if (!$hseq{$s}{'used'}){$seq_l\ -ist{'unused'}{$seq_list{'unused'}{'nseq'}++}=$s;}}\ -\n\n\n$n=0;\nforeach $s (@core_name)\n {\n $ng\ -++;\n $n=$seq_list{$s}{'nseq'};\n for (@g_li\ -st=(), $a=0; $a<$n; $a++){@g_list=(@g_list,$seq_li\ -st{$s}{$a});}\n\n $g_seq=vtmpnam();\n $g_aln\ -=vtmpnam();\n \n print STDERR \"Group $ng: $\ -#g_list Seq: @g_list: \";\n \n \n `seq_re\ -format -in $seq -action +lower +keep_name +extract\ -_seq @g_list -output fasta_seq > $g_seq`;\n \n\ - \n if ( $#g_list==0)\n {\n print STDER\ -R \"[No aln]\\n\";\n $g_aln=$g_seq;\n }\n \ -elsif ($#g_list<$max_nseq) \n {\n print STDER\ -R \"[t_coffee]\\n\";\n `t_coffee $g_seq -outfile=$\ -g_aln -quiet $arg_list`;\n }\n else\n \ - {\n print STDERR \"[t_coffee_dpa]\\n\";\n `t_coff\ -ee_dpa2 $g_seq -outfile=$g_aln $arg_list -sim_matr\ -ix $sim_matrix -dpa_nseq $dpa_nseq`;\n }\n \ - @profile_list=(@profile_list, $g_aln);\n }\n\n\n\ -print \"UNUSED $seq_list{'unused'}{'nseq'}\";\n\ni\ -f ($seq_list{'unused'}{'nseq'})\n {\n $prf\ -=vtmpnam();\n \n `t_coffee -profile @pro\ -file_list $arg_list -outfile=$prf -quiet`;\n \ -$n=$seq_list{\"unused\"}{'nseq'};\n $new_seq=\ -vtmpnam();\n $new_prf=vtmpnam();\n for (\ -$a=0; $a<$n-1; $a++)\n {\n $s=$seq_list{\"unused\ -\"}{$a};\n print STDERR \"\\nADD Sequence $s\";\\ -n \n `seq_reformat -in $seq -action +lower +ke\ -ep_name +extract_seq $s -output fasta_seq > $new_\ -seq`;\n `t_coffee -profile $prf $new_seq $arg_li\ -st -outfile=$new_prf`;\n `cp $new_prf $prf`;\n }\ -\n $s=$seq_list{\"unused\"}{$a};\n `seq_\ -reformat -in $seq -action +lower +keep_name +extra\ -ct_seq $s -output fasta_seq > $new_seq`;\n @\ -profile_list=($prf, $new_seq);\n }\n \n \ - \nif ($run_name){$arg_list.=\" -run_name $run_nam\ -e\";}\nelse \n {\n $in_seq=~/([\\w-]+)/;\n \ -$arg_list.=\" -run_name $1\";\n }\nif ( $output){\ -$arg_list.=\" -output $output \";}\n\n`t_coffee -p\ -rofile @profile_list $arg_list`;\n\n\n&clean (@tmp\ -_file_list);\n\n\nsub vtmpnam\n {\n my $tmp_fi\ -le_name;\n $tmp_name_counter++;\n $tmp_file_\ -name=\"tmp_file_$tmp_name_counter\\_Pid$$\";\n \ -$tmp_file_list[$ntmp_file++]=$tmp_file_name;\n \ -return $tmp_file_name;\n }\nsub clean\n {\n my \ -@fl=@_;\n my $file;\n return;\n\n foreach $file\ - ( @fl)\n {\n if ( -e $file){unlink($file)\ -;}\n }\n}\nsub extract_val_from_arg_list\n {\n\ - my $arg=@_[0];\n my $arg_list=@_[1];\n m\ -y $keep_flag=@_[2];\n #protect\n $arg_list=~\ -s/\\s-/ \\@/g;\n $arg=~s/-/\\@/g;\n \n #s\ -earch\n if ($arg eq \"^\")\n {\n $arg_list\ -=~/^([^@]*)/;\n $val=$1;\n }\n else\n \ - {$arg_list=~/$arg ([^@]*)/;$val=$1;}\n \n #\ -remove the parsed sequence if needed\n if ($val\ - && $keep_flag ne \"KEEP\")\n {\n if ( $arg e\ -q \"^\"){$arg_list=~s/$val/ /;}\n else {$arg_list=\ -~s/($arg [^@]*)/ /;}\n }\n \n #unprotect\n\ - $arg_list=~s/\\@/-/g;\n $arg=~s/\\@/-/g;\n \ - \n return $val, $arg_list;\n }\n\n","use En\ -v;\n\n$BLAST_MAX_NRUNS=2;\n$EXIT_SUCCESS=0;\n$EXIT\ -_FAILURE=1;\n\nuse Cwd;\n$REF_EMAIL=\"\";\n\n\n$tm\ -p_dir=\"\";\n$init_dir=\"\";\n$program=\"tc_generi\ -c_method.pl\";\n\n$test=0;\nif ($test==1)\n {\n \ - $SERVER=\"NCBI\";\n $query=$ARGV[0];\n $hi\ -tf=$ARGV[1];\n %s=read_fasta_seq($query);\n \ -@sl=keys(%s);\n &blast_xml2profile (\"xx\", $s{\ -$sl[0]}{seq},$maxid,$minid,$mincov, $hitf);\n m\ -yexit ($EXIT_FAILURE);\n }\n\nforeach $v(@ARGV){$\ -cl.=\"$v \";}\n($mode)=&my_get_opt ( $cl, \"-mode=\ -\",1,0);\n\n($A)=(&my_get_opt ( $cl, \"-name1=\",0\ -,0));\n($B)=(&my_get_opt ( $cl, \"-name2=\",0,0));\ -\n($TMPDIR)=(&my_get_opt ( $cl, \"-tmpdir=\",0,0))\ -;\n($CACHE)=(&my_get_opt ( $cl, \"-cache=\",0,0));\ -\n($SERVER)=((&my_get_opt ( $cl, \"-server=\",0,0)\ -));\n($EMAIL)=((&my_get_opt ( $cl, \"-email=\",0,0\ -)));\n\nif (!$A){$A=\"A\";}\nif (!$B){$B=\"B\";}\n\ -\n\nif (!$TMPDIR)\n {\n $HOME=$ENV{HOME};\n \ - if ($ENV{TMP_4_TCOFFEE}){$TMPDIR=$ENV{TMP_4_TCOFF\ -EE};}\n else{$TMPDIR=\"$HOME/.t_coffee/tmp/\";}\ -\n }\nif ( ! -d $TMPDIR)\n {\n mkdir $TMPDIR;\ -\n }\nif ( ! -d $TMPDIR)\n {\n print \"ERROR:\ - Could not create temporary dir: $TMPDIR\\n\";\n \ - myexit ($EXIT_FAILURE);\n }\n\n$EMAIL=~s/XEMAIL\ -X/\\@/g;\nif (!$EMAIL)\n {\n if ($ENV{EMAIL_4_\ -TCOFFEE}){$EMAIL=$ENV{EMAIL_4_TCOFFEE};}\n elsi\ -f ($ENV{EMAIL}){$EMAIL=$ENV{EMAIL};}\n else {$E\ -MAIL=$REF_EMAIL;}\n }\n\n($maxid,$minid,$mincov)=\ -(&my_get_opt ( $cl, \"-maxid=\",0,0, \"-minid=\",0\ -,0,\"-mincov=\",0,0));\nif (!$cl=~/\\-maxid\\=/){$\ -maxid=95;}\nif (!$cl=~/\\-minid\\=/){$minid=35;}\n\ -if (!$cl=~/\\-mincov\\=/){$mincov=80;}\n\n\n\nif (\ -$mode eq \"seq_msa\")\n {\n &seq2msa($mode,&my\ -_get_opt ( $cl, \"-infile=\",1,1, \"-method=\",1,2\ -, \"-param=\",0,0, \"-outfile=\",1,0));\n }\n\nel\ -sif ( $mode eq \"thread_pair\")\n {\n &seq2thr\ -ead_pair($mode,&my_get_opt ( $cl, \"-infile=\",1,1\ -, \"-pdbfile1=\",1,1, \"-method=\",1,2,\"-param=\"\ -,0,0, \"-outfile=\",1,0, ));\n }\nelsif ( $mode e\ -q \"pdbid_pair\")\n {\n &seq2pdbid_pair($mode,\ -&my_get_opt ( $cl, \"-pdbfile1=\",1,0, \"-pdbfile2\ -=\",1,0, \"-method=\",1,2,\"-param=\",0,0, \"-outf\ -ile=\",1,0, ));\n }\nelsif ( $mode eq \"pdb_pair\\ -")\n {\n &seq2pdb_pair($mode,&my_get_opt ( $cl\ -, \"-pdbfile1=\",1,1, \"-pdbfile2=\",1,1, \"-metho\ -d=\",1,2,\"-param=\",0,0, \"-outfile=\",1,0, ));\n\ - }\nelsif ( $mode eq \"profile_pair\")\n {\n \ - &seq2profile_pair($mode,&my_get_opt ( $cl, \"-pro\ -file1=\",1,1, \"-profile2=\",1,1, \"-method=\",1,2\ -,\"-param=\",0,0, \"-outfile=\",1,0, ));\n }\nels\ -if ( $mode eq \"pdb_template\")\n {\n &blast2p\ -db_template ($mode,&my_get_opt ( $cl, \"-infile=\"\ -,1,1, \"-database=\",1,0, \"-method=\",1,0, \"-out\ -file=\",1,0));\n }\nelsif ( $mode eq \"profile_te\ -mplate\")\n {\n &psiblast2profile_template ($m\ -ode,&my_get_opt ( $cl, \"-infile=\",1,1, \"-databa\ -se=\",1,0, \"-method=\",1,0, \"-outfile=\",1,0));\\ -n }\nelsif ( $mode eq \"psiprofile_template\")\n \ - {\n &psiblast2profile_template ($mode,&my_get_\ -opt ( $cl, \"-infile=\",1,1, \"-database=\",1,0, \\ -"-method=\",1,0, \"-outfile=\",1,0));\n }\nelsif \ -( $mode eq \"RNA_template\")\n {\n &seq2RNA_te\ -mplate ($mode,&my_get_opt ( $cl, \"-infile=\",1,1,\ - \"-outfile=\",1,0));\n }\nelsif ( $mode eq \"tm_\ -template\")\n {\n &seq2tm_template ($mode,&my_\ -get_opt ( $cl, \"-infile=\",1,1,\"-arch=\",1,1,\"-\ -psv=\",1,1, \"-outfile=\",1,0,));\n }\nelsif ( $m\ -ode eq \"psitm_template\")\n {\n &seq2tm_templ\ -ate ($mode,&my_get_opt ( $cl, \"-infile=\",1,1,\"-\ -arch=\",1,1,\"-psv=\",1,1, \"-outfile=\",1,0,));\n\ - }\nelsif ( $mode eq \"ssp_template\")\n {\n \ -&seq2ssp_template ($mode,&my_get_opt ( $cl, \"-inf\ -ile=\",1,1,\"-seq=\",1,1,\"-obs=\",1,1, \"-outfile\ -=\",1,0));\n }\nelsif ( $mode eq \"psissp_templat\ -e\")\n {\n &seq2ssp_template ($mode,&my_get_op\ -t ( $cl, \"-infile=\",1,1,\"-seq=\",1,1,\"-obs=\",\ -1,1, \"-outfile=\",1,0));\n }\nelsif ( $mode eq \\ -"rna_pair\")\n{\n &seq2rna_pair($mode,&my_get_o\ -pt ( $cl, \"-pdbfile1=\",1,1, \"-pdbfile2=\",1,1, \ -\"-method=\",1,2,\"-param=\",0,0, \"-outfile=\",1,\ -0, ));\n}elsif ( $mode eq \"calc_rna_template\")\n\ -{\n &calc_rna_template($mode,&my_get_opt ( $cl,\ - \"-infile=\",1,1,\"-pdbfile=\",1,1, \"-outfile=\"\ -,1,0));\n}\nelse\n {\n print STDERR \"$mode is\ - an unknown mode of tc_generic_method.pl [FATAL]\\\ -n\";\n }\nmyexit ($EXIT_SUCCESS);\nsub seq2ssp_te\ -mplate\n {\n my ($mode, $infile,$gor_seq,$gor_ob\ -s,$outfile)=@_;\n my %s, %h;\n my $result;\n my\ - (@profiles);\n &set_temporary_dir (\"set\",$infi\ -le,\"seq.pep\");\n %s=read_fasta_seq (\"seq.pep\"\ -);\n\n \n open (R, \">result.aln\");\n \n #pri\ -nt stdout \"\\n\";\n foreach $seq (keys(%s))\n \ - {\n \n open (F, \">seqfile\");\n $\ -s{$seq}{seq}=uc$s{$seq}{seq};\n print (F \">$\ -s{$seq}{name}\\n$s{$seq}{seq}\\n\");\n close \ -(F);\n $lib_name=\"$s{$seq}{name}.ssp\";\n \ - $lib_name=&clean_file_name ($lib_name);\n \ -\n if ($mode eq \"ssp_template\"){&seq2gor_pr\ -ediction ($s{$seq}{name},$s{$seq}{seq}, \"seqfile\\ -", $lib_name,$gor_seq, $gor_obs);}\n elsif ($\ -mode eq \"psissp_template\")\n {\n &seq2msa_gor_\ -prediction ($s{$seq}{name},$s{$seq}{seq},\"seqfile\ -\", $lib_name,$gor_seq, $gor_obs);\n }\n \n \ - if ( !-e $lib_name)\n {\n print STDERR (\"GORI\ -V failed to compute the secondary structure of $s{\ -$seq}{name} [FATAL:$mode/$method/$program]\\n\");\\ -n myexit ($EXIT_FAILURE);\n }\n else\n {\n \ - print stdout \"\\tProcess: >$s{$seq}{name} _E_ $\ -lib_name \\n\";\n print R \">$s{$seq}{name} _E_ \ -$lib_name\\n\";\n }\n unshift (@profiles, $li\ -b_name);\n }\n close (R);\n &set_temporary_di\ -r (\"unset\",$mode, $method,\"result.aln\",$outfil\ -e, @profiles);\n}\n\nsub seq2tm_template\n {\n m\ -y ($mode, $infile,$arch,$psv,$outfile)=@_;\n my %\ -s, %h;\n my $result;\n my (@profiles);\n &set_t\ -emporary_dir (\"set\",$infile,\"seq.pep\");\n %s=\ -read_fasta_seq (\"seq.pep\");\n\n \n open (R, \"\ ->result.aln\");\n \n #print stdout \"\\n\";\n f\ -oreach $seq (keys(%s))\n {\n open (F, \">s\ -eqfile\");\n print (F \">$s{$seq}{name}\\n$s{\ -$seq}{seq}\\n\");\n close (F);\n $lib_na\ -me=\"$s{$seq}{name}.tmp\";\n $lib_name=&clean\ -_file_name ($lib_name);\n\n if ($mode eq \"tm\ -_template\")\n {\n &safe_system (\"t_coffee -oth\ -er_pg fasta_seq2hmmtop_fasta.pl -in=seqfile -out=$\ -lib_name -arch=$arch -psv=$psv\");\n }\n elsi\ -f ( $mode eq \"psitm_template\")\n {\n &seq2msa_\ -tm_prediction ($s{$seq}{name},$s{$seq}{seq},\"seqf\ -ile\", $lib_name,$arch, $psv);\n }\n if ( !-e\ - $lib_name)\n {\n print STDERR (\"RNAplfold fail\ -ed to compute the secondary structure of $s{$seq}{\ -name} [FATAL:$mode/$method/$program]\\n\");\n my\ -exit ($EXIT_FAILURE);\n }\n else\n {\n prin\ -t stdout \"\\tProcess: >$s{$seq}{name} _T_ $lib_na\ -me\\n\";\n print R \">$s{$seq}{name} _T_ $lib_na\ -me\\n\";\n }\n unshift (@profiles, $lib_name)\ -;\n }\n close (R);\n &set_temporary_dir (\"un\ -set\",$mode, $method,\"result.aln\",$outfile, @pro\ -files);\n}\n\nsub seq2RNA_template\n {\n my ($mo\ -de, $infile,$outfile)=@_;\n my %s, %h, ;\n my $r\ -esult;\n my (@profiles);\n &set_temporary_dir (\\ -"set\",$infile,\"seq.pep\");\n %s=read_fasta_seq \ -(\"seq.pep\");\n\n \n open (R, \">result.aln\");\ -\n \n #print stdout \"\\n\";\n foreach $seq (ke\ -ys(%s))\n {\n open (F, \">seqfile\");\n \ - print (F \">$s{$seq}{name}\\n$s{$seq}{seq}\\n\"\ -);\n close (F);\n $lib_name=\"$s{$seq}{n\ -ame}.rfold\";\n $lib_name=&clean_file_name ($\ -lib_name);\n &safe_system (\"t_coffee -other_\ -pg RNAplfold2tclib.pl -in=seqfile -out=$lib_name\"\ -);\n \n if ( !-e $lib_name)\n {\n prin\ -t STDERR (\"RNAplfold failed to compute the second\ -ary structure of $s{$seq}{name} [FATAL:$mode/$meth\ -od/$program]\\n\");\n myexit ($EXIT_FAILURE);\n \ -}\n else\n {\n print stdout \"\\tProcess: >\ -$s{$seq}{name} _F_ $lib_name\\n\";\n print R \">\ -$s{$seq}{name} _F_ $lib_name\\n\";\n }\n unsh\ -ift (@profiles, $lib_name);\n }\n close (R);\n\ - &set_temporary_dir (\"unset\",$mode, $method,\"r\ -esult.aln\",$outfile, @profiles);\n}\n\nsub psibla\ -st2profile_template \n {\n my ($mode, $infile, $\ -db, $method, $outfile)=@_;\n my %s, %h, ;\n my (\ -$result,$psiblast_output,$profile_name,@profiles);\ -\n \n &set_temporary_dir (\"set\",$infile,\"seq.\ -pep\");\n %s=read_fasta_seq (\"seq.pep\");\n ope\ -n (R, \">result.aln\");\n \n #print stdout \"\\n\ -\";\n foreach $seq (keys(%s))\n {\n open \ -(F, \">seqfile\");\n print (F \">$A\\n$s{$seq\ -}{seq}\\n\");\n close (F);\n $psiblast_o\ -utput=&run_blast ($s{$seq}{name},$method, $db, \"s\ -eqfile\",\"outfile\");\n if ( -e $psiblast_ou\ -tput)\n {\n %profile=blast_xml2profile($s{$seq}{\ -name}, $s{$seq}{seq},$maxid, $minid,$mincov,$psibl\ -ast_output);\n unlink ($psiblast_output);\n \n\ - $profile_name=\"$s{$seq}{name}.prf\";\n $prof\ -ile_name=&clean_file_name ($profile_name);\n uns\ -hift (@profiles, $profile_name);\n output_profil\ -e ($profile_name, %profile);\n print stdout \"\\\ -tProcess: >$s{$seq}{name} _R_ $profile_name [$prof\ -ile{n} Seq.] [$SERVER/blast/$db][$CACHE_STATUS]\\n\ -\";\n print R \">$s{$seq}{name} _R_ $profile_nam\ -e\\n\";\n }\n }\n close (R);\n &set_temporary\ -_dir (\"unset\",$mode, $method,\"result.aln\",$out\ -file, @profiles);\n}\n\nsub blast2pdb_template \n \ - {\n my ($mode, $infile, $db, $method, $outfile)=\ -@_;\n my %s, %h, ;\n my ($result,$blast_output);\ -\n &set_temporary_dir (\"set\",$infile,\"seq.pep\\ -");\n %s=read_fasta_seq (\"seq.pep\");\n open (R\ -, \">result.aln\");\n \n \n #print stdout \"\\n\\ -";\n foreach $seq (keys(%s))\n {\n open (\ -F, \">seqfile\");\n print (F \">$A\\n$s{$seq}\ -{seq}\\n\");\n close (F);\n \n $bla\ -st_output=&run_blast ($s{$seq}{name},$method, $db,\ - \"seqfile\",\"outfile\");\n %p=blast_xml2pro\ -file($s{$seq}{name}, $s{$seq}{seq},$maxid, $minid,\ -$mincov,$blast_output);\n unlink ($blast_outp\ -ut);\n if ($p{n}>1)\n {\n $pdbid=id2pdbid($\ -p{1}{identifyer});\n if ( length ($pdbid)>5){$pd\ -bid=id2pdbid($p{1}{definition});}\n \n print R\ - \">$s{$seq}{name} _P_ $pdbid\\n\";\n print stdo\ -ut \"\\tProcess: >$s{$seq}{name} _P_ $pdbid [$SERV\ -ER/blast/$db][$CACHE_STATUS]\\n\";\n }\n else\ -\n {\n print R \">$s{$seq}{name}\\n\";\n print\ - stdout \"\\tProcess: >$s{$seq}{name} _P_ No Templ\ -ate Found [$SERVER/blast/$db][$CACHE_STATUS]\\n\";\ -\n }\n }\n close (R);\n &set_temporary_dir (\\ -"unset\",$mode, $method,\"result.aln\",$outfile);\\ -n}\nsub blast_msa\n {\n my ($infile,$outfile)=\ -@_;\n my ($a, %seq);\n %s1=&read_fasta_seq (\ -$infile);\n foreach $s (keys (%s1))\n {\n \ -$i=$s1{$s}{order};\n $s{$i}{name}=$s;\n $s{$i}{seq\ -}=$s1{$s}{seq};\n $s{$i}{len}=length( $s{$i}{seq})\ -;\n $s{n}++;\n }\n `formatdb -i $infile`;\\ -n `blastpgp -i $infile -d $infile -m7 -j4 > io`\ -;\n &set_blast_type (\"io\");\n \n %FB=&x\ -ml2tag_list (\"io\", \"BlastOutput\");\n \n \ -open (F, \">$outfile\");\n print F \"! TC_LIB_F\ -ORMAT_01\\n\";\n print F \"$s{n}\\n\";\n for\ - ( $a=0; $a<$s{n}; $a++)\n {\n print F \"$s{$\ -a}{name} $s{$a}{len} $s{$a}{seq}\\n\";\n }\n \ - for ( $a=0; $a<$FB{n}; $a++)\n {\n %p=blas\ -t_xml2profile ($s{$a}{name}, $s{$a}{seq},100, 0, 0\ -, $FB{$a}{body});\n for ($b=1; $b<$p{n}; $b++)\n \ - {\n my $l=length ($p{$b}{Qseq});\n my $hi\ -t=$p{$b}{definition};\n my $Qstart=$p{$b}{Qsta\ -rt};\n my $Hstart=$p{$b}{Hstart};\n my $id\ -entity=$p{$b}{identity};\n my @lrQ=split (//,$\ -p{$b}{Qseq});\n my @lrH=split (//,$p{$b}{Hseq}\ -);\n my $i= $s1{$s{$a}{name}}{order}+1;\n \ -my $j= $s1{$hit}{order}+1;\n #if ( $j==$i){nex\ -t;}\n printf F \"# %d %d\\n\", $i, $j;\n #\ - print F \"\\n$p{$b}{Qseq} ($Qstart)\\n$p{$b}{Hs\ -eq} ($Hstart)\";\n for ($c=0; $c<$l; $c++)\n \ - {\n my $rQ=$lrQ[$c];\n my $rH=$lrH[$c];\n \ -my $n=0;\n \n if ($rQ ne \"-\"){$n++, $Qstart++;\ -}\n if ($rH ne \"-\"){$n++; $Hstart++;}\n \n if\ - ( $n==2)\n {\n printf F \"\\t%d %d %d\\n\\ -", $Qstart-1, $Hstart-1,$identity;\n }\n \ -}\n }\n }\n print F \"! SEQ_1_TO_N\\n\";\ -\n close (F);\n return $output;\n \n }\n\n\ -sub seq2msa\n {\n my ($mode, $infile, $method,\ - $param, $outfile)=@_;\n &set_temporary_dir (\"\ -set\",$infile,\"seq.pep\");\n $param.=\" >/dev/\ -null 2>&1 \";\n \n #make sure test.pep is in\ - FASTA\n &safe_system (\"t_coffee -other_pg seq\ -_reformat -in seq.pep -output fasta_seq > x\");\n \ - `mv x seq.pep`;\n \n if ( $method eq \"bl\ -astpgp\")\n {\n &blast_msa (\"seq.pep\", \"re\ -sult.aln\");\n }\n elsif ( $method eq \"mu\ -scle\")\n {\n `muscle -in seq.pep -out result\ -.aln $param`;\n }\n elsif ( $method eq \"p\ -robcons\")\n {\n `probcons seq.pep >result.al\ -n 2>/dev/null`;\n }\n elsif ( $method eq \\ -"mafft\")\n {\n `mafft --quiet --localpair --\ -maxiterate 1000 seq.pep> result.aln 2>/dev/null`\\ -n }\n elsif ( $method=~/prank/)\n {\n\ - `$method -d=seq.pep -o=result.aln -quiet 2>/dev/n\ -ull`;\n `mv result.aln.1.fas result.aln`;\n }\ -\n else\n {\n `$method -infile=seq.pep -ou\ -tfile=result.aln`;\n }\n \n &set_tempor\ -ary_dir (\"unset\",$mode, $method,\"result.aln\",$\ -outfile);\n myexit ($EXIT_SUCCESS);\n }\n\nsub\ - seq2thread_pair\n {\n my ($mode, $infile, $pd\ -bfile1, $method, $param, $outfile)=@_;\n &set_t\ -emporary_dir (\"set\",$infile,\"seq.pep\",$pdbfile\ -1,\"struc.pdb\");\n if ($method eq \"fugueali\"\ -)\n {\n #Env Variable that need to be defined\ - for Fugue\n if (!$ENV{FUGUE_LIB_LIST}){$ENV{FUGUE\ -_LIB_LIST}=\"DUMMY\";}\n if (!$ENV{HOMSTRAD_PATH})\ - {$ENV{HOMSTRAD_PATH}=\"DUMMY\";}\n if (!$ENV{HOM\ -S_PATH}){$ENV{HOMS_PATH}=\"DUMMY\";}\n \n `joy str\ -uc.pdb >x 2>x`;\n &check_file(\"struc.tem\", \"Joy\ - failed [FATAL:$program/$method]\");\n `melody -t \ -struc.tem >x 2>x`;\n &check_file(\"struc.tem\", \"\ -Melody failed [FATAL:$program/$method]\");\n `fugu\ -eali -seq seq.pep -prf struc.fug -print > tmp_resu\ -lt.aln`;\n \n &check_file(\"tmp_result.aln\", \"Fu\ -gue failed [FATAL:$program/$method]\");\n &safe_sy\ -stem (\"t_coffee -other_pg seq_reformat -in tmp_re\ -sult.aln -output fasta_aln >result.aln\");\n \ -}\n elsif ( $method eq \"t_coffee\")\n {\n\ - &safe_system (\"t_coffee -in Pstruc.pdb Sseq.pep \ -Mslow_pair -outfile result.aln -quiet\");\n }\ -\n else\n {\n &safe_system (\"$method -inf\ -ile=seq.pep -pdbfile1=struc.pdb -outfile=result.al\ -n $param>x 2>x\");\n }\n &set_temporary_di\ -r (\"unset\",$mode,$method,\"result.aln\",$outfile\ -);\n myexit ($EXIT_SUCCESS);\n }\nsub seq2pdbi\ -d_pair\n {\n my ($mode, $pdbfile1, $pdbfile2, \ -$method, $param, $outfile)=@_;\n my ($name);\n\\ -n \n &set_temporary_dir (\"set\");\n $nam\ -e=$pdbfile1.\" \".$pdbfile2;\n\n if ( &cache\ -_file(\"GET\",\"\",\"$name\",\"$method\",\"dali\",\ -$outfile,\"EBI\"))\n {return $outfile;}\n \ -else\n {\n if ($method eq \"dalilite\")\n {\ -\n $pdbfile1=~/(....)(.)/;\n $id1=$1; $c1=\ -$2;\n \n $pdbfile2=~/(....)(.)/;\n $id\ -2=$1; $c2=$2;\n \n $command=\"t_coffee -ot\ -her_pg dalilite.pl --pdb1 $id1 --chainid1 $c1 --pd\ -b2 $id2 --chainid2 $c2 --email=$EMAIL >dali_stder\ -r 2>dali_stderr\";\n $dali=`$command`;\n \\ -n open (F, \"dali_stderr\");\n while ()\ -\n {\n if ( /JobId: dalilite-(\\S+)/)\n {\\ -n $jobid=$1;\n }\n }\n close (F);\n \ - unlink (\"dali_stderr\");\n \n $output\ -1=\"dalilite-$jobid.txt\";\n if ( -e $output1)\ -\n {\n unlink ($output1);\n &url2file (\"h\ -ttp://www.ebi.ac.uk/Tools/es/cgi-bin/jobresults.cg\ -i/dalilite/dalilite-$jobid/aln.html\", \"output2\"\ -);\n \n if ( -e \"output2\")\n {\n my ($\ -seq1, $seq2);\n $seq1=$seq2=\"\";\n \n \ - open (F, \"output2\");\n while ()\n \ - {\n $l=$_;\n if ( $l=~/Query\\s+(\\S+)/)\\ -n {\n $seq1.=$1;\n }\n elsif ( $l=\ -~/Sbjct\\s+(\\S+)/)\n {\n $seq2.=$1;\n \ - }\n }\n close (F);\n unlink (\\ -"output2\");\n if ($seq1 ne \"\" && $seq2 ne \ -\"\")\n {\n $output3=\">$A\\n$seq1\\n>$B\\ -\n$seq2\\n\";\n $output3=~s/\\./-/g;\n open (F\ -, \">result.aln\");\n print F \"$output3\";\n \ -close (F);\n }\n }\n }\n }\n \ - }\n &cache_file(\"SET\",\"\",\"$name\",\"$met\ -hod\",\"dali\",\"result.aln\",\"EBI\");\n &set_\ -temporary_dir (\"unset\",$mode, $method, \"result.\ -aln\",$outfile);\n myexit ($EXIT_SUCCESS);\n }\ -\nsub seq2pdb_pair\n {\n my ($mode, $pdbfile1,\ - $pdbfile2, $method, $param, $outfile)=@_;\n \n\ - &set_temporary_dir (\"set\",$pdbfile1,\"pdb1.p\ -db\",$pdbfile2,\"pdb2.pdb\");\n if ($method eq \ -\"t_coffee\")\n {\n &safe_system (\"t_coffee \ --in Ppdb1.pdb Ppdb2.pdb -quiet -outfile=result.aln\ -\");\n }\n elsif ( $method eq \"TMalign\")\ -\n {\n if ( &safe_system (\"TMalign pdb1.pdb \ -pdb2.pdb >tmp1\")==$EXIT_SUCCESS)\n {\n `tai\ -l -4 tmp1 > tmp2`;\n \n open (F, \"tmp2\")\ -;\n while ()\n {\n unshift(@l, $_);\\ -n }\n close (F);\n open (F, \">resul\ -t.aln\");\n $l[3]=~s/[^a-zA-Z0-9-]/\\-/g;\n \ - $l[1]=~s/[^a-zA-Z0-9-]/\\-/g;\n print F \">$\ -A\\n$l[3]\\n>$B\\n$l[1]\\n\";\n close (F);\n \ - }\n else\n {\n print \"ERROR: TMalign faile\ -d to align the considered structures[tc_generic_me\ -thod.pl]\\n\";\n `rm result.aln >/dev/null 2>/\ -dev/null`;\n }\n }\n elsif ( $method eq \ -\"mustang\")\n {\n if ( &safe_system (\"musta\ -ng -i pdb1.pdb pdb2.pdb -F fasta >/dev/null 2>/dev\ -/null\")==$EXIT_SUCCESS)\n {\n `mv results.a\ -fasta result.aln`;\n }\n else\n {\n print \ -\"ERROR: mustang failed to align the considered st\ -ructures[tc_generic_method.pl]\\n\";\n `rm res\ -ult.aln >/dev/null 2>/dev/null`;\n }\n }\n \ - else\n {\n if ( &safe_system (\"$method -p\ -dbfile1=pdb1.pep -pdbfile2=pdb2.pdb -outfile=resul\ -t.aln $param>x 2>x\")==$EXIT_SUCCESS)\n {\n \ -`mv results.afasta result.aln`;\n }\n else\n {\ -\n print \"ERROR: $method failed to align the \ -considered structures[tc_generic_method.pl]\\n\";\\ -n `rm result.aln >/dev/null 2>/dev/null`;\n \ -}\n }\n &set_temporary_dir (\"unset\",$mod\ -e, $method, \"result.aln\",$outfile);\n myexit \ -($EXIT_SUCCESS);\n }\n\nsub seq2profile_pair\n {\ -\n my ($mode, $profile1, $profile2, $method, $p\ -aram, $outfile)=@_;\n \n \n if ($method e\ -q \"clustalw\")\n {\n &set_temporary_dir (\"s\ -et\",$profile1,\"prf1.aln\",$profile2,\"prf2.aln\"\ -);\n `clustalw -profile1=prf1.aln -profile2=prf2.a\ -ln -outfile=result.aln`;\n &set_temporary_dir (\"u\ -nset\",$mode, $method, \"result.aln\",$outfile);\n\ - }\n elsif ( $method eq \"hhalign\")\n \ - {\n hhalign ( $profile1,$profile2,$outfile,$para\ -m);\n }\n else\n {\n \n `$method -pro\ -file1=prf1.aln -profile2=prf2.aln -outfile=result.\ -aln $param>x 2>x`;\n }\n \n myexit ($EXI\ -T_SUCCESS);\n }\n\nsub pg_is_installed\n {\n \ -my @ml=@_;\n my $r, $p, $m;\n my $supported=\ -0;\n \n my $p=shift (@ml);\n $r=`which $p\ - 2>/dev/null`;\n if ($r eq \"\"){return 0;}\n \ - else {return 1;}\n }\nsub check_pg_is_installed\ -\n {\n my @ml=@_;\n my $r=&pg_is_installed \ -(@ml);\n if (!$r)\n {\n print STDERR \"\\n\ -Program $p Supported but Not Installed on your sys\ -tem [FATAL:tc_generic_method]\\n\";\n myexit ($EXI\ -T_FAILURE);\n }\n else\n {\n return 1\ -;\n }\n }\nsub set_temporary_dir\n {\n m\ -y @list=@_;\n my $dir_mode, $a, $mode, $method;\ -\n\n $dir_mode=shift (@list);\n\n \n if (\ - $dir_mode eq \"set\")\n {\n $initial_dir=cwd\ -();\n if ( !$tmp_dir)\n {\n srand;\n $ra\ -nd=rand (100000);\n $tmp_dir=\"$TMPDIR/tmp4tco\ -ffee_profile_pair_dir_$$_P_$rand\";\n }\n if ( !\ --d $tm_dir)\n {\n `mkdir $tmp_dir`;\n }\n \ -\n for ( $a=0; $a<=$#list; $a+=2)\n {\n `cp\ - $list[$a] $tmp_dir/$list[$a+1]`;\n }\n chdi\ -r $tmp_dir;\n }\n elsif ( $dir_mode eq \"u\ -nset\")\n {\n $mode=shift (@list);\n $method=\ -shift (@list);\n \n if (!-e $list[0])\n {\n \ -print STDERR (\"Program $method failed to produce \ -$list[1] [FATAL:$mode/$method/$program]\\n\");\n \ - myexit ($EXIT_FAILURE);\n }\n else\n {\n \ - chdir $initial_dir;\n # `t_coffee -other_pg \ -seq_reformat -in $tmp_dir/$list[0] -output fasta_a\ -ln -out $tmp_dir/result2.aln`;\n `cp $tmp_dir/\ -$list[0] $tmp_dir/result2.aln`;\n if ( $list[1\ -] eq \"stdout\")\n {\n open (F, \"$tmp_dir/\ -result2.aln\");\n while (){print $_;}close(F);\ -\n }\n else\n {\n `mv $tmp_dir/re\ -sult2.aln $list[1]`;\n }\n shift (@list)\ -; shift (@list);\n foreach $f (@list)\n \ -{\n `mv $tmp_dir/$f .`;\n }\n }\n }\\ -n }\nsub clean_dir\n {\n my $dir=@_[0];\n \ -if ( !-d $dir){return ;}\n elsif (!($dir=~/tmp/\ -)){return ;}#safety check 1\n elsif (($dir=~/\\\ -*/)){return ;}#safety check 2\n else\n {\n\ - `rm -rf $dir`;\n }\n return;\n }\n\nsub \ -myexit\n {\n my $code=@_[0];\n &clean_dir (\ -$tmp_dir);\n exit ($code);\n }\n\nsub my_get_o\ -pt\n {\n my @list=@_;\n my $cl, $a, $argv, \ -@argl;\n \n @argl=();\n $cl=shift @list;\\ -n for ( $a=0; $a<=$#list; $a+=3)\n {\n $op\ -tion=$list[$a];\n $optional=$list[$a+1];\n $status\ -=$list[$a+2];\n $argv=\"\";\n if ($cl=~/$option(\\\ -S+)/){$argv=$1;}\n @argl=(@argl,$argv);\n \n \n #$\ -optional:0=>optional\n #$optional:1=>must be set\n\ - #$status: 0=>no requirement\n #$status: 1=>must b\ -e an existing file\n #$status: 2=>must be an insta\ -lled package\n \n\n if ($optional==0){;}\n elsif (\ - $optional==1 && $argv eq \"\")\n {\n print \ -STDERR \"ERROR: Option $option must be set [FATAL:\ -$program/$mode/$method]\\n\";\n myexit ($EXIT_\ -FAILURE);\n }\n if ($status==0){;}\n elsif ($sta\ -tus ==1 && $argv ne \"\" && !-e $argv)\n {\n \ - print STDERR \"ERROR: File $argv must exist [FATA\ -L:$program/$mode/$method]\\n\";\n myexit ($EXI\ -T_FAILURE);\n }\n elsif ( $status==2 && $argv ne\ - \"\" && &check_pg_is_installed ($argv)==0)\n {\\ -n print STDERR \"ERROR: $argv is not installed\ - [FATAL:$program/$mode/$method]\\n\";\n myexit\ - ($EXIT_FAILURE);\n }\n }\n\n return @ar\ -gl;\n }\n\nsub check_file \n {\n my ($file,\ - $msg)=@_;\n\n if ( !-e $file)\n {\n print\ - \"\\n$msg\\n\";\n myexit ($EXIT_FAILURE);\n \ -}\n }\nsub hhalign\n {\n my ($aln1, $aln2, \ -$outfile, $param)=@_;\n my $h1, $h2;\n \n \ - $h{0}{index}=0;\n $h{1}{index}=1;\n \n $\ -h{0}{aln}=$aln1;\n $h{1}{aln}=$aln2;\n\n \n\n\ - %{$h{0}}=aln2psi_profile (%{$h{0}});\n %{$h\ -{1}}=aln2psi_profile (%{$h{1}});\n\n $param=~s/\ -#S/ /g;\n $param=~s/#M/\\-/g;\n $param=~s/#E\ -/\\=/g;\n \n\n \n $command=\"hhalign -i $\ -h{0}{a3m} -t $h{1}{a3m} -tc $outfile.tmp -rank 1 -\ -mapt 0 $param\";\n `$command`;\n \n # `hha\ -lign -i $h{0}{a3m} -t $h{1}{a3m} -tc $outfile.tmp \ --rank 1 -mapt 0 -gapf 0.8 -gapg 0.8`;\n \n\n \ - # To run global use the following\n \n open\ - (I, \"$outfile.tmp\");\n open (O, \">$outfile\\ -");\n $h{0}{cons}=s/\\./x/g;\n $h{1}{cons}=s\ -/\\./x/g;\n\n print O \"! TC_LIB_FORMAT_01\\n2\\ -\n$h{0}{name} $h{0}{len} $h{0}{seq}\\n$h{1}{name} \ -$h{1}{len} $h{1}{seq}\\n#1 2\\n\";\n \n whil\ -e ()\n {\n if (/(\\d+)\\s+(\\d+)\\s+(\\d+)\ -/)\n {\n print O \"\\t$h{0}{$1}\\t$h{1}{$2}\\ -\t$3\\n\";\n }\n }\n print O \"! SEQ_1_T\ -O_N\\n\";\n\n close (O);\n close (I);\n }\n\ -\nsub aln2psi_profile\n {\n my (%h)=@_;\n m\ -y ($aln,$i,$hv, $a, @c, $n);\n \n $i=$h{index\ -};\n $aln=$h{aln};\n\n `cp $aln $$.hhh_aln`;\ -\n $command=\"t_coffee -other_pg seq_reformat -\ -in $aln -output hasch\";\n $hv=`$command`;chomp\ - ($hv);\n \n $h{a2m}=\"$tmp/$hv.tmp4hhpred.a\ -2m\";\n $h{a3m}=\"$tmp/$hv.tmp4hhpred.a3m\";\n \ - if ( -e $h{a3m}){;}\n else\n {\n `hhcon\ -sensus -M 50 -i $h{aln} -oa2m $h{a2m}`;\n if (!-e\ - $h{a2m})\n {\n print STDERR \"Program tc_ge\ -neric_method.pl FAILED to run:\\n\\thhconsensus -\ -M 50 -i $h{aln} -oa2m $h{a2m}\";\n myexit ($EX\ -IT_FAILURE);\n }\n \n `hhconsensus -M 50 -i $h{\ -aln} -oa3m $h{a3m}`;\n if (!-e $h{a3m})\n {\n \ - print STDERR \"Program tc_generic_method.pl FAIL\ -ED to run:\\n\\thhconsensus -M 50 -i $h{aln} -oa3\ -m $h{a3m}\";\n myexit ($EXIT_FAILURE);\n }\n\ - `buildali.pl $h{a3m} -n 1`;\n }\n \\ -n \n $h{a2m_seq}=`head -n 2 $h{a2m} | grep -\ -v \">\"`;chomp ($h{a2m_seq});\n $h{a3m_seq}=`he\ -ad -n 2 $h{a3m} | grep -v \">\"`;chomp ($h{a3m_seq\ -});\n $h{cons}=$h{a2m_seq};\n $h{seq}=`head \ --n 2 $h{aln} | grep -v \">\"`;chomp ($h{seq});\n \ - \n \n\n @c=split (//, $h{cons});\n $h{l\ -en}=$#c+1;\n for ($n=0,$a=0, $b=0; $a<$h{len};$\ -a++)\n {\n if ( $c[$a]=~/[A-Z]/)\n {\n \ -$h{++$n}=++$b;\n\n }\n elsif ( $c[$a]=~/[a-z\\.]\ -/)\n {\n ++$b;\n }\n }\n \n $na\ -me=`head -n 2 $h{aln} | grep \">\"`;\n $name=~/\ -\\>(\\S+)/;\n $h{name}=$1;\n \n `cp $h{a2\ -m} $i.a2m`;\n `cp $h{a3m} $i.a3m`;\n `cp $h{\ -aln} $i.hh_aln`;\n \n return %h;\n }\n\nsub\ - read_fasta_seq \n {\n my $f=@_[0];\n my %h\ -seq;\n my (@seq, @com, @name);\n my ($a, $s,\ -$nseq);\n\n open (F, $f);\n while ()\n \ - {\n $s.=$_;\n }\n close (F);\n\n \n \ - @name=($s=~/>(\\S*).*\\n[^>]*/g);\n \n @s\ -eq =($s=~/>.*.*\\n([^>]*)/g);\n @com =($s=~/>\\\ -S*(.*)\\n([^>]*)/g);\n\n \n $nseq=$#name+1;\\ -n \n for ($a=0; $a<$nseq; $a++)\n {\n m\ -y $s;\n my $n=$name[$a];\n $hseq{$n}{name}=$n;\n $\ -seq[$a]=~s/[^A-Za-z]//g;\n $hseq{$n}{order}=$a;\n \ -$hseq{$n}{seq}=$seq[$a];\n $hseq{$n}{com}=$com[$a]\ -;\n \n }\n return %hseq;\n }\n\nsub file_\ -contains \n {\n my ($file, $tag, $max)=(@_);\n\ - my ($n);\n $n=0;\n \n if ( !-e $file \ -&& ($file =~/$tag/)) {return 1;}\n elsif ( !-e \ -$file){return 0;}\n else \n {\n open (FC, \ -\"$file\");\n while ( )\n {\n if ( ($_=~\ -/$tag/))\n {\n close (FC);\n return 1;\n \ - }\n elsif ($max && $n>$max)\n {\n \ -close (FC);\n return 0;\n }\n $n++;\n \ - }\n }\n close (FC);\n return 0;\n }\n\ - \n \nsub file2string\n {\n my $f=@_[0];\ -\n my $string, $l;\n open (F,\"$f\");\n w\ -hile ()\n {\n\n $l=$_;\n #chomp ($l);\n $s\ -tring.=$l;\n }\n close (F);\n $string=~\ -s/\\r\\n//g;\n $string=~s/\\n//g;\n return $\ -string;\n }\n\n\nsub my_get_opt\n {\n my @lis\ -t=@_;\n my $cl, $a, $argv, @argl;\n \n @a\ -rgl=();\n $cl=shift @list;\n for ( $a=0; $a<\ -=$#list; $a+=3)\n {\n $option=$list[$a];\n $o\ -ptional=$list[$a+1];\n $status=$list[$a+2];\n $arg\ -v=\"\";\n if ($cl=~/$option(\\S+)/){$argv=$1;}\n @\ -argl=(@argl,$argv);\n \n \n #$optional:0=>optional\ -\n #$optional:1=>must be set\n #$status: 0=>no req\ -uirement\n #$status: 1=>must be an existing file\n\ - #$status: 2=>must be an installed package\n \n\n \ -if ($optional==0){;}\n elsif ( $optional==1 && $ar\ -gv eq \"\")\n {\n print STDERR \"ERROR: Opti\ -on $option must be set [FATAL:$program/$mode/$meth\ -od]\\n\";\n myexit ($EXIT_FAILURE);\n }\n if\ - ($status==0){;}\n elsif ($status ==1 && $argv ne \ -\"\" && !-e $argv)\n {\n print STDERR \"ERRO\ -R: File $argv must exist [FATAL:$program/$mode/$me\ -thod]\\n\";\n myexit ($EXIT_FAILURE);\n }\n \ -elsif ( $status==2 && $argv ne \"\" && &check_pg_i\ -s_installed ($argv)==0)\n {\n print STDERR \\ -"ERROR: $argv is not installed [FATAL:$program/$mo\ -de/$method]\\n\";\n myexit ($EXIT_FAILURE);\n \ - }\n }\n\n return @argl;\n }\n\nsub ta\ -g2value \n {\n \n my $tag=(@_[0]);\n my \ -$word=(@_[1]);\n my $return;\n \n $tag=~/\ -$word=\"([^\"]+)\"/;\n $return=$1;\n return \ -$return;\n }\n \nsub hit_tag2pdbid\n {\n \ - my $tag=(@_[0]);\n my $pdbid;\n \n $t\ -ag=~/id=\"(\\S+)\"/;\n $pdbid=$1;\n $pdbid=~\ -s/_//;\n return $pdbid;\n }\nsub id2pdbid \n \ -{\n my $in=@_[0];\n my $id;\n \n $in=~\ -/(\\S+)/;\n $id=$in;\n \n if ($id =~/pdb/\ -)\n {\n $id=~/pdb(.*)/;\n $id=$1;\n }\n \ - $id=~s/[|��_]//g;\n return $id;\n }\nsu\ -b set_blast_type \n {\n my $file =@_[0];\n \ -if (&file_contains ($file,\"EBIApplicationResult\"\ -,100)){$BLAST_TYPE=\"EBI\";}\n elsif (&file_con\ -tains ($file,\"NCBI_BlastOutput\",100)) {$BLAST_TY\ -PE=\"NCBI\";}\n else\n {\n $BLAST_TYPE=\"\\ -";\n }\n return $BLAST_TYPE;\n }\nsub bla\ -st_xml2profile \n {\n my ($name,$seq,$maxid, $\ -minid, $mincov, $file)=(@_);\n my (%p, $a, $str\ -ing, $n);\n \n\n\n if ($BLAST_TYPE eq \"EBI\\ -" || &file_contains ($file,\"EBIApplicationResult\\ -",100)){%p=ebi_blast_xml2profile(@_);}\n elsif \ -($BLAST_TYPE eq \"NCBI\" || &file_contains ($file,\ -\"NCBI_BlastOutput\",100)){%p=ncbi_blast_xml2profi\ -le(@_);}\n else \n {\n print \"***********\ -* ERROR: Blast Returned an unknown XML Format ****\ -******************\";\n myexit ($EXIT_FAILURE);\n \ - }\n for ($a=0; $a<$p{n}; $a++)\n {\n \ -my $name=$p{$a}{name};\n $p{$name}{seq}=$p{$a}{seq\ -};\n }\n return %p;\n }\nsub ncbi_blast_x\ -ml2profile \n {\n my ($name,$seq,$maxid, $mini\ -d, $mincov, $string)=(@_);\n my ($L,$l, $a,$b,$\ -c,$d,$nhits,@identifyerL);\n \n \n $seq=~\ -s/[^a-zA-Z]//g;\n $L=length ($seq);\n \n \ -%hit=&xml2tag_list ($string, \"Hit\");\n \n \ -\n for ($nhits=0,$a=0; $a<$hit{n}; $a++)\n \ - {\n my ($ldb,$id, $identity, $expectation, $start\ -, $end, $coverage, $r);\n my (%ID,%DE,%HSP);\n \n \ -$ldb=\"\";\n\n %ID=&xml2tag_list ($hit{$a}{body}, \ -\"Hit_id\");\n $identifyer=$ID{0}{body};\n \n %DE=\ -&xml2tag_list ($hit{$a}{body}, \"Hit_def\");\n $de\ -finition=$DE{0}{body};\n \n %HSP=&xml2tag_list ($h\ -it{$a}{body}, \"Hsp\");\n for ($b=0; $b<$HSP{n}; $\ -b++)\n {\n my (%START,%END,%E,%I,%Q,%M);\n\n\ - \n %START=&xml2tag_list ($HSP{$b}{body}, \"H\ -sp_query-from\");\n %HSTART=&xml2tag_list ($HS\ -P{$b}{body}, \"Hsp_hit-from\");\n \n %LEN=\ - &xml2tag_list ($HSP{$b}{body}, \"Hsp_align-len\"\ -);\n %END= &xml2tag_list ($HSP{$b}{body}, \"H\ -sp_query-to\");\n %HEND= &xml2tag_list ($HSP{\ -$b}{body}, \"Hsp_hit-to\");\n %E=&xml2tag_list\ - ($HSP{$b}{body}, \"Hsp_evalue\");\n %I=&x\ -ml2tag_list ($HSP{$b}{body}, \"Hsp_identity\")\ -;\n %Q=&xml2tag_list ($HSP{$b}{body}, \"Hs\ -p_qseq\");\n %M=&xml2tag_list ($HSP{$b}{bo\ -dy}, \"Hsp_hseq\");\n \n for ($e=0; $e<$Q{\ -n}; $e++)\n\n {\n $qs=$Q{$e}{body};\n $ms=\ -$M{$e}{body};\n \n $expectation=$E{$e}{body};\n \ - $identity=($LEN{$e}{body}==0)?0:$I{$e}{body}/$LEN\ -{$e}{body}*100;\n $start=$START{$e}{body};\n $en\ -d=$END{$e}{body};\n $Hstart=$HSTART{$e}{body};\n \ - $Hend=$HEND{$e}{body};\n \n $coverage=(($end-$st\ -art)*100)/$L;\n\n \n if ($identity>$maxid || $ide\ -ntity<$minid || $coverage<$mincov){next;}\n @lr1=\ -(split (//,$qs));\n @lr2=(split (//,$ms));\n $l=\ -$#lr1+1;\n for ($c=0;$c<$L;$c++){$p[$nhits][$c]=\\ -"-\";}\n for ($d=0,$c=0; $c<$l; $c++)\n {\n \ - $r=$lr1[$c];\n if ( $r=~/[A-Za-z]/)\n \ - {\n \n $p[$nhits][$d + $start-1]=$lr2[$c];\\ -n $d++;\n }\n }\n $Qseq[$nhits]=$qs;\\ -n $Hseq[$nhits]=$ms;\n $QstartL[$nhits]=$start;\\ -n $HstartL[$nhits]=$Hstart;\n $identityL[$nhits]\ -=$identity;\n $endL[$nhits]=$end;\n $definitionL\ -[$nhits]=$definition;\n $identifyerL[$nhits]=$ide\ -ntifyer;\n $comment[$nhits]=\"$ldb|$identifyer [E\ -val=$expectation][id=$identity%][start=$Hstart end\ -=$Hend]\";\n $nhits++;\n }\n }\n }\n\ - \n $profile{n}=0;\n $profile{$profile{n}\ -}{name}=$name;\n $profile{$profile{n}}{seq}=$se\ -q;\n $profile {n}++;\n \n for ($a=0; $a<$\ -nhits; $a++)\n {\n $n=$a+1;\n \n $profile{$n}\ -{name}=\"$name\\_$a\";\n $profile{$n}{seq}=\"\";\n\ - $profile{$n}{Qseq}=$Qseq[$a];\n $profile{$n}{Hseq\ -}=$Hseq[$a];\n $profile{$n}{Qstart}=$QstartL[$a];\\ -n $profile{$n}{Hstart}=$HstartL[$a];\n $profile{$n\ -}{identity}=$identityL[$a];\n $profile{$n}{definit\ -ion}=$definitionL[$a];\n $profile{$n}{identifyer}=\ -$identifyerL[$a];\n $profile{$n}{comment}=$comment\ -[$a];\n for ($b=0; $b<$L; $b++)\n {\n if ($p\ -[$a][$b])\n {\n $profile{$n}{seq}.=$p[$a][$\ -b];\n }\n else\n {\n $profile{$n}\ -{seq}.=\"-\";\n }\n }\n }\n \n \ -$profile{n}=$nhits+1;\n return %profile;\n }\n\ -sub ebi_blast_xml2profile \n {\n my ($name,$se\ -q,$maxid, $minid, $mincov, $string)=(@_);\n my \ -($L,$l, $a,$b,$c,$d,$nhits,@identifyerL,$identifye\ -r);\n \n\n \n $seq=~s/[^a-zA-Z]//g;\n \ -$L=length ($seq);\n %hit=&xml2tag_list ($string\ -, \"hit\");\n \n for ($nhits=0,$a=0; $a<$hit\ -{n}; $a++)\n {\n my ($ldb,$id, $identity, $ex\ -pectation, $start, $end, $coverage, $r);\n my (%Q,\ -%M,%E,%I);\n \n $ldb=&tag2value ($hit{$a}{open}, \\ -"database\");\n $identifyer=&tag2value ($hit{$a}{o\ -pen}, \"id\");\n\n $description=&tag2value ($hit{$\ -a}{open}, \"description\");\n \n %Q=&xml2tag_list \ -($hit{$a}{body}, \"querySeq\");\n %M=&xml2tag_list\ - ($hit{$a}{body}, \"matchSeq\");\n %E=&xml2tag_lis\ -t ($hit{$a}{body}, \"expectation\");\n %I=&xml2tag\ -_list ($hit{$a}{body}, \"identity\");\n \n\n for (\ -$b=0; $b<$Q{n}; $b++)\n {\n\n $qs=$Q{$b}{bod\ -y};\n $ms=$M{$b}{body};\n \n $expectat\ -ion=$E{$b}{body};\n $identity=$I{$b}{body};\n \ - \n \n $start=&tag2value ($Q{$b}{o\ -pen}, \"start\");\n $end=&tag2value ($Q{$b}{op\ -en}, \"end\");\n $startM=&tag2value ($M{$b}{op\ -en}, \"start\");\n $endM=&tag2value ($M{$b}{op\ -en}, \"end\");\n $coverage=(($end-$start)*100)\ -/$L;\n \n # print \"$id: ID: $identity COV:\ - $coverage [$start $end]\\n\";\n \n \n \ - if ($identity>$maxid || $identity<$minid || $cove\ -rage<$mincov){next;}\n # print \"KEEP\\n\";\n\\ -n \n @lr1=(split (//,$qs));\n @lr2=(sp\ -lit (//,$ms));\n $l=$#lr1+1;\n for ($c=0;$\ -c<$L;$c++){$p[$nhits][$c]=\"-\";}\n for ($d=0,\ -$c=0; $c<$l; $c++)\n {\n $r=$lr1[$c];\n if\ - ( $r=~/[A-Za-z]/)\n {\n \n $p[$nhits\ -][$d + $start-1]=$lr2[$c];\n $d++;\n }\n \ - }\n \n \n $identifyerL[$nhits]=$ide\ -ntifyer;\n $comment[$nhits]=\"$ldb|$identifyer\ - [Eval=$expectation][id=$identity%][start=$startM \ -end=$endM]\";\n $nhits++;\n }\n }\n \ -\n $profile{n}=0;\n $profile{$profile{n}}{na\ -me}=$name;\n $profile{$profile{n}}{seq}=$seq;\n\ - $profile {n}++;\n \n for ($a=0; $a<$nhit\ -s; $a++)\n {\n $n=$a+1;\n $profile{$n}{name}=\ -\"$name\\_$a\";\n $profile{$n}{seq}=\"\";\n $profi\ -le{$n}{identifyer}=$identifyerL[$a];\n \n $profile\ -{$n}{comment}=$comment[$a];\n for ($b=0; $b<$L; $b\ -++)\n {\n if ($p[$a][$b])\n {\n $prof\ -ile{$n}{seq}.=$p[$a][$b];\n }\n else\n \ - {\n $profile{$n}{seq}.=\"-\";\n }\n \ -}\n }\n $profile{n}=$nhits+1;\n \n r\ -eturn %profile;\n }\nsub output_profile\n {\n \ - my ($name,%profile)=(@_);\n my ($a);\n open\ - (P, \">$name\");\n for ($a=0; $a<$profile{n}; \ -$a++)\n {\n print P \">$profile{$a}{name} $pr\ -ofile{$a}{comment}\\n$profile{$a}{seq}\\n\";\n \ - }\n close (P);\n return;\n }\nsub blast_x\ -ml2hit_list\n {\n my $string=(@_[0]);\n ret\ -urn &xml2tag_list ($string, \"hit\");\n }\nsub xm\ -l2tag_list \n {\n my ($string_in,$tag)=@_;\n \ - my $tag_in, $tag_out;\n my %tag;\n \n \ -if (-e $string_in)\n {\n $string=&file2string\ - ($string_in);\n }\n else\n {\n $stri\ -ng=$string_in;\n }\n $tag_in1=\"<$tag \";\\ -n $tag_in2=\"<$tag>\";\n $tag_out=\"/$tag>\"\ -;\n $string=~s/>/>##1/g;\n $string=~s//g;\n @l=($string=~/(\\<[^>]+\\>)/g);\n $t\ -ag{n}=0;\n $in=0;$n=-1;\n \n \n\n foreach $\ -t (@l)\n {\n\n $t=~s/<#//;\n $t=~s/#>//;\n \n\ - if ( $t=~/$tag_in1/ || $t=~/$tag_in2/)\n {\n \\ -n $in=1;\n $tag{$tag{n}}{open}=$t;\n $\ -n++;\n \n }\n elsif ($t=~/$tag_out/)\n {\n\ - \n\n $tag{$tag{n}}{close}=$t;\n $tag{\ -n}++;\n $in=0;\n }\n elsif ($in)\n {\n \ -\n $tag{$tag{n}}{body}.=$t;\n }\n }\n \ -\n return %tag;\n }\n\n\nsub seq2gor_predictio\ -n \n {\n my ($name, $seq,$infile, $outfile, $g\ -or_seq, $gor_obs)=(@_);\n my ($l);\n \n `\ -gorIV -prd $infile -seq $gor_seq -obs $gor_obs > g\ -or_tmp`;\n open (GR, \">$outfile\");\n open \ -(OG, \"gor_tmp\");\n\n while ()\n {\n \ -\n $l=$_;\n if ($l=~/\\>/){print GR \"$l\";}\n els\ -if ( $l=~/Predicted Sec. Struct./)\n {\n $l=\ -~s/Predicted Sec. Struct\\.//;\n print GR \"$l\ -\";\n }\n }\n close (GR);\n close (OG\ -);\n return;\n }\nsub seq2msa_tm_prediction \n\ - {\n my ($name, $seq,$infile, $outfile, $arch,\ - $psv)=(@_);\n my (%p,%gseq,%R, $blast_output, \ -%s, $l);\n \n $blast_output=&run_blast ($nam\ -e,\"blastp\", \"uniprot\", $infile, \"outfile\");\\ -n \n \n %p=blast_xml2profile($name,$seq,$\ -maxid, $minid,$mincov,$blast_output);\n \n \\ -n open (F, \">tm_input\");\n for ($a=0; $a<$\ -p{n}; $a++)\n {\n my $s;\n \n $s=$p{$a}{seq};\ -\n $s=uc($s);\n print F \">$p{$a}{name}\\n$s\\n\";\ -\n #print stdout \">$p{$a}{name}\\n$s\\n\";\n \ - }\n close (F);\n print \"\\tPSITM: kept $p\ -{n} Homologues for Sequence $p{0}{name}\\n\";\n \ - &safe_system (\"t_coffee -other_pg fasta_seq2hmmt\ -op_fasta.pl -in=tm_input -out=tm_output -arch=$arc\ -h -psv=$psv\");\n unlink (\"tm_input\");\n %\ -gs=read_fasta_seq(\"tm_output\");\n foreach $s \ -(keys(%gs))\n {\n my (@list, $seq, @plist, @p\ -seq, $L, $PL);\n \n \n #Prediction\n $seq=$gs{$s}{\ -seq};\n $seq=uc($seq);\n $L=length($seq);\n @list=\ -split //, $seq;\n \n #Original Profile Sequence\n \ -$pseq=$p{$s}{seq};\n $pseq=uc($pseq);\n $PL=length\ -($pseq);\n @plist=split //, $pseq;\n \n for ($c=0,\ -$b=0; $b<$PL; $b++)\n {\n my $r=$plist[$b];\\ -n if($r ne \"-\" && $r ne \"X\")\n {\n \ -$r=$plist[$b]=$list[$c++];\n }\n }\n \n if\ - ($c!=$L)\n {\n print \"ERROR: Could Not Thr\ -ead the Prediction Back [FATAL:tc_generic_method.p\ -l]\\n\";\n myexit ($EXIT_FAILURE);\n }\n for\ - ($b=0;$b<$PL; $b++)\n {\n my $r=$plist[$b];\ -\n if ( $r ne \"-\" && $r ne \"X\")\n {\\ -n $R{$b}{$r}++;\n }\n }\n }\n $L=l\ -ength ($p{0}{seq});\n open (R2, \">$outfile\");\ -\n print R2 \">$name\\n\";\n \n for ($a=0\ -; $a<$L; $a++)\n {\n \n my ($v,$v_max,$r,$r_m\ -ax, @rl);\n \n $v=$v_max=0;\n @rl=keys (%{$R{$a}})\ -;\n foreach $r (@rl)\n {\n\n $v=$R{$a}{$r};\\ -n if ($v>=$v_max)\n {\n $v_max=$v;\n $\ -r_max=$r;\n }\n }\n print R2 \"$r_max\";\n\ - }\n print R2 \"\\n\";\n close (R2);\n \ - return;\n }\nsub seq2msa_gor_prediction \n {\\ -n my ($name, $seq,$infile, $outfile, $gor_seq, \ -$gor_obs)=(@_);\n my (%p,%gseq,%R, $blast_outpu\ -t, %s, $l);\n \n \n $blast_output=&run_bl\ -ast ($name,\"blastp\", \"uniprot\", $infile, \"out\ -file\");\n %p=blast_xml2profile($name,$seq,$max\ -id, $minid,$mincov,$blast_output);\n \n open\ - (F, \">gor_input\");\n for ($a=0; $a<$p{n}; $a\ -++)\n {\n my $s;\n \n $s=$p{$a}{seq};\n $s=~s\ -/\\-//g;\n $s=~s/X//g;\n \n $s=uc($s);\n print F \\ -">$p{$a}{name}\\n$s\\n\";\n }\n close (F);\ -\n print \"\\tPSIGOR: kept $p{n} Homologues fo\ -r Sequence $p{0}{name}\\n\";\n \n `gorIV -pr\ -d gor_input -seq $gor_seq -obs $gor_obs > gor_tmp`\ -;\n unlink (\"gor_input\");\n \n open (GR\ -, \">gor_output\");\n open (OG, \"gor_tmp\");\n\ - \n while ()\n {\n \n my $l;\n $l=$\ -_;\n \n if ($l=~/\\>/){print GR \"$l\";}\n elsif (\ - $l=~/Predicted Sec. Struct./)\n {\n $l=~s/P\ -redicted Sec. Struct\\.//;\n print GR \"$l\";\\ -n }\n }\n close (GR);\n close (OG);\n\ - \n\n %gs=read_fasta_seq(\"gor_output\");\n \ - foreach $s (keys(%gs))\n {\n my (@list, $\ -seq, @plist, @pseq, $L, $PL);\n \n \n #Prediction\\ -n $seq=$gs{$s}{seq};\n $seq=uc($seq);\n $L=length(\ -$seq);\n @list=split //, $seq;\n \n #Original Prof\ -ile Sequence\n $pseq=$p{$s}{seq};\n $pseq=uc($pseq\ -);\n $PL=length($pseq);\n @plist=split //, $pseq;\\ -n \n $tseq=\"\";\n for ($c=0,$b=0; $b<$PL; $b++)\n\ - {\n my $r=$plist[$b];\n if($r ne \"-\" \ -&& $r ne \"X\")\n {\n $r=$plist[$b]=$list[$\ -c++];\n }\n $tseq.=$r;\n }\n \n if ($c\ -!=$L)\n {\n print \"ERROR: Could Not Thread \ -the Prediction Back [FATAL:tc_generic_method.pl]\\\ -n\";\n print \"SEQ:$seq\\nPSEQ:$pseq\\nTSEQ:$t\ -seq\";\n \n myexit ($EXIT_FAILURE);\n }\\ -n for ($b=0;$b<$PL; $b++)\n {\n my $r=$plist\ -[$b];\n if ( $r ne \"-\" && $r ne \"X\")\n \ - {\n $R{$b}{$r}++;\n }\n }\n }\n \ -\n $L=length ($p{0}{seq});\n open (R2, \">$o\ -utfile\");\n print R2 \">$name\\n\";\n \n \ - for ($a=0; $a<$L; $a++)\n {\n \n my ($v,$v_m\ -ax,$r,$r_max, @rl);\n \n $v=$v_max=0;\n @rl=keys (\ -%{$R{$a}});\n foreach $r (@rl)\n {\n\n $v=$R\ -{$a}{$r};\n if ($v>=$v_max)\n {\n $v_ma\ -x=$v;\n $r_max=$r;\n }\n }\n print R2 \"$\ -r_max\";\n }\n print R2 \"\\n\";\n clos\ -e (R2);\n return;\n }\n\nsub run_blast\n {\n \ - my ($name, $method, $db,$infile, $outfile, $run\ -)=(@_);\n if (!$run){$run=1;}\n \n \n \ -if (&cache_file(\"GET\",$infile,$name,$method,$db,\ -$outfile,$SERVER)){return $outfile;}\n else\n \ - {\n \n if ( $SERVER eq \"EBI\")\n {\n $c\ -l_method=$method;\n if ($cl_method =~/wu/)\n \ - {\n $cl_method=~s/wu//;\n if ( $cl_method e\ -q \"psiblast\")\n {\n print STDERR \"\\n**\ -*************WARNING: PSI BLAST cannot be used wit\ -h the NCBI BLAST Client. Use server=EBI Or server=\ -LOCAL. blastp will be used instead***********\\n\"\ -;\n $cl_method=\"blastp\";\n }\n \n $com\ -mand=\"t_coffee -other_pg wublast.pl --email $EMAI\ -L $infile -D $db -p $cl_method --outfile $outfile \ --o xml>/dev/null 2>/dev/null\";\n &safe_system ( \ -$command);\n if (-e \"$outfile.xml\") {`mv $outfi\ -le.xml $outfile`;}\n }\n else\n {\\ -n if ($cl_method eq \"psiblast\"){$cl_method =\"b\ -lastp -j5\";}\n \n $command=\"t_coffee -other_pg\ - blastpgp.pl --email $EMAIL $infile -d $db --outfi\ -le $outfile -p $cl_method --mode PSI-Blast>/dev/nu\ -ll 2>/dev/null\";\n &safe_system ( $command);\n \ -\n if (-e \"$outfile.xml\") {`mv $outfile.xml $ou\ -tfile`;}\n }\n }\n elsif ($SERVER eq \"NCB\ -I\")\n {\n if ($db eq \"uniprot\"){$cl_db=\"\ -nr\";}\n else {$cl_db=$db;}\n \n if ( \ -$method eq \"psiblast\")\n {\n print STDERR\ - \"\\n***************WARNING: PSI BLAST cannot be \ -used with the NCBI BLAST Client. Use server=EBI Or\ - server=LOCAL. blastp will be used instead********\ -***\\n\";\n $cl_method=\"blastp\";\n }\n \ - else\n {\n $cl_method=$method;\n }\\ -n $command=\"blastcl3 -p $cl_method -d $cl_db \ --i $infile -o $outfile -m 7\";\n &mysystem ($c\ -ommand);\n }\n elsif ($SERVER =~/CLIENT_(.*)/)\n\ - {\n my $client=$1;\n $command=\"$client\ - -p $method -d $db -i $infile -o $outfile -m 7\";\\ -n &mysystem ($command);\n }\n elsif ( $SERVE\ -R eq \"LOCAL_blastall\")\n {\n if ($method e\ -q \"blastp\")\n {\n $command=\"blastall -d \ -$db -i $infile -o $outfile -m7 -p blastp\";\n \ - }\n &mysystem ($command);\n }\n elsif ( $S\ -ERVER eq \"LOCAL\")\n {\n\n if ($ENV{\"BLAST\ -_DB_DIR\"})\n {\n $x=$ENV{\"BLAST_DB_DIR\"}\ -;\n $cl_db=\"$x$db\";\n }\n else\n \ - {\n $cl_db=$db;\n }\n \n if ($met\ -hod eq \"blastp\")\n {\n $command=\"blastpg\ -p -d $cl_db -i $infile -o $outfile -m7 -j1\";\n \ - }\n elsif ($method eq \"psiblast\")\n \ - {\n $command=\"blastpgp -d $cl_db -i $infile -o\ - $outfile -m7 -j5\";\n }\n elsif ($method e\ -q \"blastn\")\n {\n $command=\"blastall -p blas\ -tn -d $cl_db -i $infile -o $outfile -m7 -W6\";\n \ -} \n &mysystem ($command);\n }\n else\n {\\ -n print (\"*************** ERROR: $SERVER is a\ -n Unknown Server***********\");\n }\n \n if ( !-\ -e $outfile)\n {\n \n if ( $run==$BLAST_M\ -AX_NRUNS)\n {\n print STDERR \"COM: $comman\ -d\\n\";\n print STDERR (\"BLAST failed against $n\ -ame [FATAL:$mode/$method/$program]\\n\");\n if (\ - $SERVER eq \"EBI\" && !($method=~/wu/))\n {\n \ - print STDERR (\"Try WuBlast instead\");\n \ - return run_blast ($name,\"wublastp\", $db,$infil\ -e, $outfile);\n }\n }\n else\n \ -{\n print STDERR \"(Blast for $name failed [$com\ -mand][Attempt $run/$BLAST_MAX_NRUNS] [Try again]\\\ -n\";\n return run_blast ($name, $method, $db,$inf\ -ile, $outfile, $run+1);\n }\n }\n\n &cache\ -_file(\"SET\",$infile,$name,$method,$db,$outfile,$\ -SERVER);\n return $outfile;\n }\n }\nsub mys\ -ystem \n {\n my $command=@_[0];\n my $count\ -=0;\n my $r;\n \n while (($r=&safe_system\ -($command))!=$EXIT_SUCCESS && $count<5)\n {\n\ - print \"\\nCOMMAND $command Failed. Will try agai\ -n\\n\";\n $count++;\n }\n return $r;\n }\\ -nsub cache_file\n {\n my ($cache_mode,$infile,\ -$name,$method,$db, $outfile,$server)=(@_);\n my\ - $cache_file;\n #Protect names so that they can\ - be turned into legal filenames\n $name=&clean_\ -file_name ($name);\n\n if ($db=~/\\//)\n {\ -\n $db=~/([^\\/]+)$/;\n $db=$1;\n }\n $cac\ -he_file_sh=\"$name.$method.$db.$server.tmp\";\n \ - $cache_file=\"$CACHE/$name.$method.$db.$server.tm\ -p\";\n \n if ($infile ne \"\")\n {\n $c\ -ache_file_infile_sh=\"$name.$method.$db.$server.in\ -file.tmp\";\n $cache_file_infile=\"$CACHE/$name.$m\ -ethod.$db.$server.infile.tmp\";\n }\n \n \ - if ($cache_mode eq \"GET\")\n {\n if ($CACH\ -E eq \"\" || $CACHE eq \"no\" || $CACHE eq \"ignor\ -e\" || $CACHE eq \"local\" || $CACHE eq \"update\\ -"){return 0;}\n elsif ( !-d $CACHE)\n {\n pr\ -int STDERR \"ERROR: Cache Dir: $CACHE Does not Exi\ -st\";\n return 0;\n }\n else\n {\n if \ -( -e $cache_file && &fasta_file1_eq_fasta_file2($i\ -nfile,$cache_file_infile)==1)\n {\n `cp $ca\ -che_file $outfile`;\n $CACHE_STATUS=\"READ CACHE\\ -";\n return 1;\n }\n }\n }\n elsi\ -f ($cache_mode eq \"SET\")\n {\n if ($CACHE e\ -q \"\" || $CACHE eq \"no\" || $CACHE eq \"ignore\"\ - || $CACHE eq \"local\" || $CACHE eq \"update\"){\ -return 0;}\n elsif ( !-d $CACHE)\n {\n print\ - STDERR \"ERROR: Cache Dir: $CACHE Does not Exist\\ -";\n return 0;\n }\n elsif (-e $outfile)\n \ - {\n `cp $outfile $cache_file`;\n if ($cac\ -he_file_infile ne \"\"){ `cp $infile $cache_file_i\ -nfile`;}\n\n #functions for updating the cache\ -\n #`t_coffee -other_pg clean_cache.pl -file $\ -cache_file_sh -dir $CACHE`;\n #`t_coffee -othe\ -r_pg clean_cache.pl -file $cache_file_infile_sh -d\ -ir $CACHE`;\n return 1;\n }\n }\n $C\ -ACHE_STATUS=\"COMPUTE CACHE\";\n return 0;\n }\ -\nsub file1_eq_file2\n {\n my ($f1, $f2)=@_;\n\ - if ( $f1 eq \"\"){return 1;}\n elsif ( $f2 \ -eq \"\"){return 1;}\n elsif ( !-e $f1){return 0\ -;}\n elsif ( !-e $f2){return 0;}\n elsif ($f\ -1 eq \"\" || $f2 eq \"\" || `diff $f1 $f2` eq \"\"\ -){return 1;}\n \n return 0;\n }\nsub clean_\ -file_name \n {\n my $name=@_[0];\n \n $n\ -ame=~s/[^A-Za-z1-9.-]/_/g;\n return $name;\n }\ -\nsub url2file\n {\n my ($address, $out)=(@_);\ -\n \n if (&pg_is_installed (\"wget\"))\n {\n\ - return &safe_system (\"wget $address -O$out >/d\ -ev/null 2>/dev/null\");\n }\n elsif (&pg_is_ins\ -talled (\"curl\"))\n {\n return &safe_system \ -(\"curl $address -o$out >/dev/null 2>/dev/null\");\ -\n }\n else\n {\n print stderr \"ERRO\ -R: neither curl nor wget are installed. Imnpossibl\ -e to fectch remote file [FATAL]\\n\";\n exit ($EXI\ -T_FAILURE);\n }\n }\nsub fasta_file1_eq_fast\ -a_file2\n {\n my ($f1, $f2)=@_;\n my (%s1, \ -%s2);\n my @names;\n %s1=read_fasta_seq (%f1\ -);\n %s2=read_fasta_seq (%f2);\n\n @names=(k\ -eys (%s1));\n \n foreach $n (keys(%s1))\n \ - {\n if ($s1{$n}{seq} ne $s2{$n}{seq}){return 0;\ -}\n } \n \n foreach $n (keys(%s2))\n \ - {\n if ($s1{$n}{seq} ne $s2{$n}{seq}){return 0;\ -}\n }\n return 1;\n }\n \nsub safe_system\ - \n{\n my $com=@_[0];\n my $pid;\n my $status;\\ -n if ($com eq \"\"){return 1;}\n\n\n if (($pid =\ - fork ()) < 0){return (-1);}\n if ($pid == 0)\n \ - {\n exec ($com);\n }\n else\n {\n \ -$PIDCHILD=$pid;\n }\n \n waitpid ($pid,WTER\ -MSIG);\n return $?; #contains the status of the e\ -xit\n}\nEND {\n kill ($PIDCHILD);\n}\n\n\nsub rea\ -d_template_file\n{\n my $pdb_templates = @_[0];\n \ -open (TEMP, \"<$pdb_templates\");\n my %temp_h;\n \ -while ()\n{\n $line = $_;\n $line =~/(\\S\ -+)\\s(\\S+)/;\n $temp_h{$1}= $2;\n}\n close(TEMP\ -);\n return %temp_h;\n}\n\nsub calc_rna_template\n\ -{\n my ($mode, $infile, $pdbfile, $outfile)=@_;\n \ -my %s, %h ;\n my $result;\n my (@profiles);\n &set\ -_temporary_dir (\"set\",$infile,\"seq.pep\");\n %s\ -=read_fasta_seq (\"seq.pep\");\n \n %pdb_template_\ -h = &read_template_file($pdbfile);\n my $pdb_chain\ -;\n open (R, \">result.aln\");\n\n\n #print stdout\ - \"\\n\";\n foreach $seq (keys(%s))\n {\n if ($pd\ -b_template_h{$seq} eq \"\")\n {\n next;\n }\n \ - open (F, \">seqfile\");\n print (F \">$s{$seq}{n\ -ame}\\n$s{$seq}{seq}\\n\");\n close (F);\n $pdb_\ -chain = $pdb_template_h{$seq};\n $lib_name=\"$s{$\ -seq}{name}.rfold\";\n $lib_name=&clean_file_name \ -($lib_name);\n safe_system (\"t_coffee -other_pg \ -RNAplfold2tclib.pl -in=seqfile -out=$lib_name\");\\ -n \n safe_system (\"secondary_struc.py seqfile \ -$CACHE$pdb_chain $lib_name\");\n \n if ( !-e $l\ -ib_name)\n {\n print STDERR (\"RNAplfold failed\ - to compute the secondary structure of $s{$seq}{na\ -me} [FATAL:$mode/$method/$program]\\n\");\n myex\ -it ($EXIT_FAILURE);\n }\n else\n {\n print st\ -dout \"\\tProcess: >$s{$seq}{name} _F_ $lib_name\\\ -n\";\n print R \">$s{$seq}{name} _F_ $lib_name\\\ -n\";\n }\n unshift (@profiles, $lib_name);\n }\n\ - close (R);\n &set_temporary_dir (\"unset\",$mode,\ - $method,\"result.aln\",$outfile, @profiles);\n}\n\ -\n\n\nsub seq2rna_pair{\n my ($mode, $pdbfile1, $p\ -dbfile2, $method, $param, $outfile)=@_;\n\n if ($m\ -ethod eq \"runsara.py\")\n {\n open(TMP,\"<$pdbfi\ -le1\");\n my $count = 0;\n my $line;\n while (<\ -TMP>)\n {\n $line = $_;\n if ($count ==1)\n \ - {\n last;\n }\n $count += 1;\n }\n \n my\ - $y = length($line);\n\n $chain1 = substr($line,l\ -ength($line)-3,1);\n close TMP;\n open(TMP,\"<$p\ -dbfile2\");\n my $count = 0;\n while ()\n \ -{\n $line = $_;\n if ($count ==1)\n {\n l\ -ast;\n }\n $count += 1;\n }\n $chain2 = subs\ -tr($line,length($line)-3,1);\n close TMP;\n \n \ -\n system(\"runsara.py $pdbfile1 $chain1 $pdbfile\ -2 $chain2 -s -o tmp >/dev/null 2>/dev/null\");\n \ -open(TMP,\"$outfile\") or die\ - \"cannot open the $outfile file:$!\\n\";\n\n my \ -$switch = 0;\n my $seqNum = 0;\n foreach my $lin\ -e ()\n {\n next unless ($line=~/SARAALI/);\ -\n if ($line=~/>/)\n {\n $switch =0;\n p\ -rint OUT \">seq$seqNum\\n\";\n $seqNum++; \n\ - }\n if ($switch < 2){\n $switch++;\n ne\ -xt;\n }\n \n if ($line =~/REMARK\\s+SARAALI\\s\ -+([^\\*]+)\\*/)\n {\n my $string = $1;\n p\ -rint OUT \"$string\\n\";\n }\n }\n close TMP; \ -\n close OUT;\n }\n}$program=\"T-COFFEE (Version_\ -8.07)\";\\n\n","*TC_METHOD_FORMAT_01\n************\ -******generic_method.tc_method*************\n*\n* \ - Incorporating new methods in T-Coffee\n* \ - Cedric Notredame 26/08/08\n*\n*****************\ -**************************************\n*This file\ - is a method file\n*Copy it and adapt it to your n\ -eed so that the method \n*you want to use can be i\ -ncorporated within T-Coffee\n*********************\ -**********************************\n* \ - USAGE *\n*******\ -************************************************\n\ -*This file is passed to t_coffee via -in:\n*\n* t_\ -coffee -in Mgeneric_method.method\n*\n* The method\ - is passed to the shell using the following\n*call\ -:\n*\n*\n*Conventions:\n* \n*: no_name <=>\ - Replaced with a space\n*:   <=> Replac\ -ed with a space\n*\n******************************\ -*************************\n* ALN_\ -MODE *\n****************\ -***************************************\n*pairwise\ - ->all Vs all (no self )[(n2-n)/2aln]\n*m_pairwi\ -se ->all Vs all (no self)[n^2-n]^2\n*s_pairwise ->\ -all Vs all (self): [n^2-n]/2 + n\n*multiple ->Al\ -l the sequences in one go\n*\nALN_MODE pairwise\n\ -*\n***********************************************\ -********\n* OUT_MODE \ - *\n*********************************\ -**********************\n* mode for the output:\n*E\ -xternal methods: \n* aln -> alignmnent File (Fasta\ - or ClustalW Format)\n* lib-> Lib file (TC_LIB_FOR\ -MAT_01)\n*Internal Methods:\n* fL -> Internal Func\ -tion returning a List (Librairie)\n* fA -> Interna\ -l Function returning an Alignmnent\n*\nOUT_MODE a\ -ln\n**********************************************\ -*********\n* SEQ_TYPE \ - *\n********************************\ -***********************\n*G: Genomic, S: Sequence,\ - P: PDB, R: Profile\n*Examples:\n*SEQTYPE S sequen\ -ces against sequences (default)\n*SEQTYPE S_P sequ\ -ence against structure\n*SEQTYPE P_P structure aga\ -inst structure\n*SEQTYPE PS mix of sequences and s\ -tructure \n*\nSEQ_TYPE S\n*\n\n*******************\ -************************************\n* \ - COMMAND LINE *\n*EXEC\ -UTABLE PARAM1 IN_FLAG OUT_FLAG PARAM *\ -\n************************************************\ -*******\n*****************************************\ -**************\n* EXECUTABLE \ - *\n***************************\ -****************************\n*name of the executa\ -ble\n*passed to the shell: executable\n* \nEXECUTA\ -BLE tc_generic_method.pl\n*\n*********************\ -**********************************\n* \ - IN_FLAG *\n******\ -*************************************************\\ -n*IN_FLAG\n*flag indicating the name of the in com\ -ing sequences\n*IN_FLAG S no_name ->no flag\n*IN_F\ -LAG S &bnsp-in&bnsp -> \" -in \"\n*\nIN_FLAG -inf\ -ile=\n*\n*****************************************\ -**************\n* OUT_FLAG \ - *\n***************************\ -****************************\n*OUT_FLAG\n*flag ind\ -icating the name of the out-coming data\n*same con\ -ventions as IN_FLAG\n*OUT_FLAG S no_name ->no flag\ -\n*if you want to redirect, pass the parameters vi\ -a PARAM1\n*set OUT_FLAG to >\n*\nOUT_FLAG -outfil\ -e=\n*\n*******************************************\ -************\n* PARAM_1 \ - *\n***************************\ -****************************\n*\n*Parameters sent to the EXECUTABLE and speci\ -fied *before* IN_FLAG \n*If there is more than 1 P\ -ARAM line, the lines are\n*concatenated\n*Command_\ -line: @EP@PARAM@-gapopen%e10%s-gapext%e20\n* %s wh\ -ite space\n* %e equal sign\n*\n*PARAM1 \n*\n*\n*\n\ -**************************************************\ -*****\n* PARAM_2 \ - *\n**********************************\ -*********************\n*\n*\ -Parameters sent to the EXECUTABLE and specified \n\ -*after* IN_FLAG and *before* OUT_FLAG\n*If there i\ -s more than 1 PARAM line, the lines are\n*concaten\ -ated\n*\n*PARAM1 \n*\n*\n*************************\ -******************************\n* \ - PARAM *\n***********\ -********************************************\n*\n*Parameters sent to the EXEC\ -UTABLE and specified *after* OUT_FLAG\n*If there i\ -s more than 1 PARAM line, the lines are\n*concaten\ -ated\n*\nPARAM -mode=seq_msa -method=clustalw\nPAR\ -AM -OUTORDER=INPUT -NEWTREE=core -align -gapopen\ -=-15\n*\n*****************************************\ -**************\n* END \ - *\n***************************\ -****************************\n","*TC_METHOD_FORMAT\ -_01\n***************clustalw_method.tc_method*****\ -****\nEXECUTABLE clustalw\nALN_MODE pairwise\nIN_\ -FLAG -INFILE=\nOUT_FLAG -OUTFILE=\nOUT_MODE aln\ -\nPARAM -gapopen=-10\nSEQ_TYPE S\n**************\ -***********************************\n","$VersionTa\ -g = \ - \ - 2.43;\n$SILENT=\\ -" >/dev/null 2>/dev/null\";\n$EXIT_SUCCESS=0;\n$EX\ -IT_FAILURE=1;\n$INTERNET=-1;\n\n\n\n\n\nuse FileHa\ -ndle;\nuse Env qw(HOME);\n\nmy %onelett_prot=&fill\ -_onelett_prot();\nmy %threelett_prot=&fill_threele\ -tt_prot();\nmy %onelett_RNA=&fill_onelett_RNA();\n\ -my %threelett_RNA=&fill_threelett_RNA();\nmy %onel\ -ett_DNA=&fill_onelett_DNA();\nmy %threelett_DNA=&f\ -ill_threelett_DNA();\n\n\n\n\n\nmy %onelett = (\n'\ -P' => \\%onelett_prot,\n'D' => \\%onelett_DNA,\n'R\ -' => \\%onelett_RNA\n);\n\n\nmy %threelett = (\n'P\ -' => \\%threelett_prot,\n'D' => \\%threelett_DNA,\\ -n'R' => \\%threelett_RNA\n);\n\n\n\n\n\n\n\nif($AR\ -GV[0]=~/help/ ||$ARGV[0]=~/man/ || $ARGV[0]=~/HELP\ -/ || $ARGV[0]=~/Man/ || $ARGV[0] eq \"-h\" || $AR\ -GV[0] eq \"-H\" )\n{die \"SYNTAX: extract_from_pd\ -b Version $VersionTag \n Minimum: [ext\ -ract_from_pdb file] \n OR \n [... | ex\ -tract_from_pdb]\n Flags (Default setting on the f\ -irst line)\n -version...................[Return\ -s the Version Number]\n -force..........\ -...........[Forces the file to be treated like a P\ -DB file]\n [R\ -egenerates the header and SEQRES fields]\n \ - -force_name................[Forces the file to \ -be named after name]]\n -infile.....file\ -...........[Flag can be omited]\n \ -[File must be pdb or fro pgm]\n \ - [File can also be compressed Z \ -or gz]\n [In \ -the case of a compressed file, you can omit the gz\ -|Z extension]\n -netfile................\ -...[File will be fetch from the net using wget]\n \ - [wget or curl\ - must be installed]\n \ - [ftp://ftp.gnu.org/pub/gnu/wget/]\n \ - [http://curl.haxx.\ -se/]\n [Must \ -also be used to retrieve the file from a local pdb\ - copy (cf netaddress)]\n -netaddress....\ -............[Address used for the retrieving the n\ -etfile]\n [ht\ -tp://www.rcsb.org/pdb/cgi/export.cgi/%%.pdb.gz?for\ -mat=PDB&pdbId=%%&compression=gz]\n \ - [http://www.expasy.ch/cgi-bi\ -n/get-pdb-entry.pl?%%]\n \ - [local -> will get the file from pdb_d\ -ir (see pdb_dir)]\n -netcompression.....\ -.......[Extension if the netfile comes compressed]\ -\n [gz]\n \ - -pdb_dir...................[address of the \ -repertory where the pdb is installed]\n \ - [Supports standard ftp \ -style installation OR every stru in DIR]\n \ - [Give the ..../pdb/s\ -tructure/ dir]\n \ - [If value omitted, the pg gets it from the env\ - variable PDB_DIR]\n -netcompression_pg.\ -........[gunzip]\n -is_pdb_name........n\ -ame...[Returns 1 if the name is a PDB ID, 0 otherw\ -ise]\n -get_pdb_chains.....name...[Retur\ -ns the list of chains corresponding to the entry]\\ -n -get_pdb_id.........name...[Returns th\ -e PDB id within the provided pdb file]\n \ - -get_fugue_name.....name...[Turns a name into a n\ -ame valid for fugue]\n \ - [Uses the netaddress to do so]\n -cha\ -in......FIRST..........[Extract the first chain on\ -ly]\n A B C..........[Extract Several chai\ -ns if needed]\n ALL............[Extract al\ -l the chains] \n -ligand.....ALL........\ -....[Extract the ligands in the chain (HETATM)]\n \ - ,[Extract All \ -the named lignds]\n -ligand_only...............\ -[Extract only the ligands]\n -ligand_lis\ -t...............[Extract the list of ligands]\n \ - -coor..........[Coordinates of the fr\ -agment to extract]\n [Omit end to \ -include the Cter]\n -num........absolute\ -.......[absolute: relative to the seq] \n \ - file...........[file: relative to fi\ -le]\n -num_out....new............[new: s\ -tart 1->L]\n old............\ -[old: keep the file coordinates]\n -dele\ -te........[Delete from residue start t\ -o residue end]\n -atom.......CA.............[At\ -oms to include, ALL for all of them]\n CA \ -O N.........[Indicate several atoms if needed]\n \ - -code.......3..............[Use the 1 letter cod\ -e or the 3 letters code]\n -mode.......raw.....\ -.......[Output original pdb file]\n \ - pdb............[Output something that look\ -s like pdb]\n fasta..........[Output the s\ -equences in fasta format]\n simple........\ -.[Output a format easy to parse in C ]\n \ - -seq_field..ATOM...........[Field used to extrac\ -t the sequence]\n SEQRES.........[Use the \ -complete sequence]\n -seq......................\ -.[Equivalent to -mode fasta]\n -model......1..\ -............[Chosen Model in an NMR file]\n \ - -nodiagnostic..............[Switches Error Mes\ -sages off]\n -debug.....................\ -[Sets the DEBUG ON]\n -no_remote_pdb_dir\ -.........[Do not look for a remote file]\n \ - -cache_pdb.................[Cache Value, defaul\ -t is $HOME/.t_coffee/cache, other values: NO<=> No\ - cache]\n\n Environement Variables\n \ - These variables can be set from the environement\ -\n Command line values with the correspo\ -nding flag superseed evironement value\n \ - NO_REMOTE_PDB_DIR..........[Prevents the program \ -from searching remote file: faster]\n PD\ -B_DIR....................[Indicates where PDB file\ - must be fetched (localy)]\n\n PROBLEMS: please c\ -ontact cedric.notredame\\@europe.com\\n\";\n exit\ - ($EXIT_SUCCESS);\n}\n\n$np=0;\n$n_para=$#ARGV;\n$\ -model=1;\n$pdb_dir=$ENV{'PDB_DIR'};if ($pdb_dir){$\ -pdb_dir.=\"/\";}\n$debug=$ENV{'DEBUG_EXTRACT_FROM_\ -PDB'};\n\n$no_remote_pdb_dir=$ENV{NO_REMOTE_PDB_DI\ -R};\n$HOME=$ENV{'HOME'};\nif ( $ENV{CACHE_4_TCOFFE\ -E})\n{$cache=$ENV{CACHE_4_TCOFFEE};}\nelse\n{\n \ - $cache=\"$HOME/.t_coffee/cache/\";\n}\n\n \n$ne\ -taddress=\"http://www.rcsb.org/pdb/files/%%.pdb.gz\ -\";\n$netcompression_pg=\"gunzip\";\n$netcompressi\ -on=\"gz\";\n\n foreach ($np=0; $np<=$n_para; $np+\ -+)\n{ \n $value=$ARGV[$np];\n \n i\ -f ($np==0 && !($value=~/^-.*/))\n{ \n $pdb_\ -file= $ARGV[$np];\n}\n elsif ( !($value=~/^-.*/\ -))\n{\n print \"@ARGV\";\n die;\n} \n \n els\ -if ($value eq \"-nodiagnostic\"){$nodiagnostic=1;}\ -\n elsif ($value eq \"-force\")\n{\n $force_pdb\ -=1;\n}\n elsif ($value eq \"-force_name\")\n{\n\ - $force_name=$ARGV[++$np];\n $force_pdb=1;\n}\n \ - \n elsif ($value eq \"-is_pdb_name\")\n{\n $pd\ -b_file= $ARGV[++$np];\n \n $is_pdb_name=1;\n \n} \\ -n elsif ($value eq \"-debug\")\n{\n $debug=1;\n\ -}\n elsif ($value eq \"-get_pdb_chains\")\n{\n \ -$pdb_file= $ARGV[++$np];\n $get_pdb_chains=1;\n}\n\ - elsif ($value eq \"-get_pdb_ligands\")\n{\n $g\ -et_pdb_ligands=1;\n}\n \n elsif ($value eq \\ -"-get_pdb_id\")\n{\n $pdb_file= $ARGV[++$np];\n $g\ -et_pdb_id=1;\n \n}\n \n elsif ( $value eq \"\ --get_fugue_name\")\n{\n $pdb_file= $ARGV[++$np];\n\ - $get_fugue_name=1;\n}\n elsif ( $value eq \"-i\ -nfile\")\n{\n $pdb_file= $ARGV[++$np];\n} \n\ - elsif ($value eq \"-netfile\")\n{\n $netfile=1\ -;\n if ( !($ARGV[$np+1]=~/^-.*/)){$pdb_file= $ARGV\ -[++$np];}\n}\n elsif ( $value eq \"-num\")\n{\\ -n $numbering= $ARGV[++$np];\n}\n elsif ( \ - $value eq \"-num_out\")\n{\n $numbering_out\ -= $ARGV[++$np];\n}\n elsif ( $value eq \"-netad\ -dress\")\n{\n $netadress=$ARGV[++$np];\n}\n \n\ - elsif ( $value eq \"-netcompression\")\n{\n $\ -netcompression=$ARGV[++$np];\n}\n elsif ( $valu\ -e eq \"-pdb_dir\")\n{\n if ( !($ARGV[$np+1]=~/^-.\ -*/)){$pdb_dir= \"$ARGV[++$np]/\";}\n}\n elsif \ -( $value eq \"-no_remote_pdb_dir\")\n{\n $no_remot\ -e_pdb_dir=1;\n if ( !($ARGV[$np+1]=~/^-.*/)){$pdb_\ -dir= \"$ARGV[++$np]/\";}\n}\n elsif ( $value eq\ - \"-cache\")\n{\n $cache=$ARGV[++$np];\n}\n \n \ - elsif ($value eq \"-netcompression_pg\")\n{\n \ - $netcompression_pg=$ARGV[++$np];\n}\n elsif (\ -$value eq \"-mode\")\n{\n $MODE=$ARGV[++$np]\ -;\n}\n\n elsif ( $value eq \"-model\")\n{\n \ - $model= $ARGV[++$np];\n}\n elsif ($value eq \ -\"-seq_field\" )\n{\n $seq_field= $ARGV[++$n\ -p];\n} \n elsif ($value eq \"-coor\" )\n{\n \ - $start= $ARGV[++$np];\n \n if (($ARGV[\ -$np+1] eq \"\") ||($ARGV[$np+1]=~/^-.*/)){$end=\"*\ -\";} \n else {$end= $ARGV[++$np];} \n \ - $coor_set=1;\n}\n elsif ($value eq \"-del\ -ete\" )\n{\n $delete_start= $ARGV[++$np];\n \ - $delete_end= $ARGV[++$np];\n $delete_s\ -et=1;\n}\n elsif ($value eq \"-code\")\n{\n \ - $code= $ARGV[++$np];\n}\n elsif ($value eq\ - \"-no_hetatm\")\n{\n $no_hetatm=1;\n}\n \ -elsif ($value eq \"-chain\")\n{\n while (!($\ -ARGV[$np+1] eq \"\") &&!($ARGV[$np+1]=~/^-.*/))\n{\ -\n ++$np;\n @c_chain=(@chain, $ARGV[$\ -np]);\n $hc_chain{$ARGV[$np]}=$#c_chain+1;\n\ -} \n}\n elsif ($value eq \"-atom\")\n\ -{\n\n while (!($ARGV[$np+1] eq \"\") && !($A\ -RGV[$np+1]=~/^-.*/))\n{\n ++$np;\n $at\ -om[$n_atom++]= $ARGV[$np];\n $atom_list{$AR\ -GV[$np]}=1; \n} \n \n}\n elsif ( $v\ -alue eq \"-unfold\")\n{\n $unfold=1;\n}\n elsif\ - ($value eq \"-seq\" ||$value eq \"-fasta\" )\n{\n\ - $MODE=\"fasta\";\n}\n elsif ( $value eq \ -\"-version\")\n{\n print STDERR \"\\nextract_from\ -_pdb: Version $VersionTag\\n\";\n &myexit ($EXIT_S\ -UCCESS);\n}\n elsif ( $value eq \"-ligand\")\n{\ -\n while (!($ARGV[$np+1] eq \"\") && !($ARGV[$np+1\ -]=~/^-.*/))\n{\n ++$np;\n $ligand=1;\n \ - $ligand_list{$ARGV[$np]}=1; \n} \n $hc_chai\ -n{'LIGAND'}=1;\n}\n elsif ( $value eq \"-ligand\ -_only\")\n{\n $ligand_only=1;\n}\n}\nif ( $debug)\\ -n{\n print STDERR \"\\n[DEBUG:extract_from_pdb]\ - NO_REMOTE_PDB_DIR: $no_remote_pdb_dir\\n\";\n \ -print STDERR \"\\n[DEBUG:extract_from_pdb] PDB_DIR\ -: $pdb_dir\\n\";\n}\n\nif ( $is_pdb_name)\n{\n \ -if (remote_is_pdb_name($pdb_file, $netaddress))\n{\ -\n print \"1\";\n}\n else\n{\n print \"0\";\n}\\ -n exit ($EXIT_SUCCESS);\n}\n \n\nif (!$force\ -_name)\n{\n $pdb_file=~/([^\\/]*)$/;\n $forc\ -e_name=$1;\n}\n\n$local_pdb_file=$pdb_file;\n\nif \ -( $debug){print STDERR \"\\n[DEBUG: extract_from_p\ -db] Scan For $local_pdb_file\\n\";}\n\n$mem=$no_re\ -mote_pdb_dir;\n$no_remote_pdb_dir=1;\n$tmp_pdb_fil\ -e=get_pdb_file ($local_pdb_file);\n\nif ( !-e $tmp\ -_pdb_file || $tmp_pdb_file eq \"\")\n{\n $local\ -_pdb_file=$pdb_file;\n ($local_pdb_file, $suffi\ -x_chain)=&pdb_name2name_and_chain($local_pdb_file)\ -;\n\n if ($local_pdb_file)\n{\n if ( $debug){pr\ -int STDERR \"\\nSplit $pdb_file into $local_pdb_fi\ -le and $suffix_chain \\n\";}\n $tmp_pdb_file=get_p\ -db_file ($local_pdb_file);\n if ( $tmp_pdb_file ne\ - \"\")\n{\n @c_chain=();\n @c_chain=($suff\ -ix_chain);\n %hc_chain=();\n $hc_chain{$su\ -ffix_chain}=1;\n}\n}\n}\n\n$no_remote_pdb_dir=$mem\ -;\nif ($no_remote_pdb_dir==0)\n{\n if ( !-e $tm\ -p_pdb_file || $tmp_pdb_file eq \"\")\n{\n \n $loca\ -l_pdb_file=$pdb_file;\n ($local_pdb_file, $suffix_\ -chain)=&pdb_name2name_and_chain($local_pdb_file);\\ -n if ($local_pdb_file)\n{\n if ( $debug){print\ - STDERR \"\\nSplit $pdb_file into $local_pdb_file \ -and $suffix_chain \\n\";}\n $tmp_pdb_file=get_\ -pdb_file ($local_pdb_file); \n if ( $tmp_pd\ -b_file ne \"\")\n{\n @c_chain=();\n @c_chain=($s\ -uffix_chain);\n %hc_chain=();\n $hc_chain{$suffi\ -x_chain}=1;\n}\n}\n}\n}\n\nif ( $debug){print STDE\ -RR \"\\n$pdb_file copied into ##$tmp_pdb_file##\\n\ -\";}\n\n\nif ( !-e $tmp_pdb_file || $tmp_pdb_file \ -eq \"\")\n{\n if ($is_pdb_name)\n{\n print \"0\ -\\n\"; exit ($EXIT_SUCCESS);\n}\n else\n{\n \n \ - print \"\\nEXTRACT_FROM_PDB: NO RESULT for $pdb_f\ -ile [FATAL:EXTRACT_FROM_PDB Version $VersionTag]\\\ -n\";\n &myexit ($EXIT_FAILURE); \n}\n}\n\n\n\n\ -\n%molecule_type=&pdbfile2chaintype($tmp_pdb_file)\ -;\n\n$pdb_id=&get_pdb_id ($tmp_pdb_file);\n\nif ( \ -$pdb_id eq \"\"){$pdb_id=$force_name;}\n\n@f_chain\ -=&get_chain_list ($tmp_pdb_file);\n\n\n\nif ( $get\ -_pdb_chains)\n{\n print \"@f_chain\\n\";\n &\ -myexit ($EXIT_SUCCESS);\n}\nif ( $get_pdb_ligands)\ -\n{\n %complete_ligand_list=&get_ligand_list ($\ -tmp_pdb_file);\n print $complete_ligand_list{\"\ -result\"};\n &myexit ($EXIT_SUCCESS);\n}\n\nels\ -if ( $get_pdb_id ||$get_fugue_name )\n{\n if \ - (@c_chain && $c_chain[0] eq \"FIRST\"){$pdb_id=$p\ -db_id.$f_chain[0];}\n elsif (@c_chain && $c_cha\ -in[0] ne \" \"){$pdb_id=$pdb_id.$c_chain[0];}\n \ - \n print \"$pdb_id\\n\";\n &myexit ($EXIT_S\ -UCCESS);\n \n}\nelsif ( $is_pdb_name)\n{\n p\ -rintf \"1\\n\";\n &myexit ($EXIT_SUCCESS);\n}\n\ - \n\n$structure_file=vtmpnam();\n\n\n$INFILE=vfop\ -en (\"$tmp_pdb_file\", \"r\"); \n$TMP=vfopen (\"$s\ -tructure_file\", \"w\");\n\n$print_model=1;\n$in_m\ -odel=0;\nwhile ( <$INFILE>)\n{\n $line=$_;\n if \ -($line =~/^MODEL\\s*(\\d*)/)\n{\n if ($1==$model)\\ -n{\n $in_model=1;\n $print_model=1;\n \ -$is_nmr=1;\n}\n elsif ( $in_model==0)\n{\n $pr\ -int_model=0;\n}\n elsif ( $in_model==1)\n{\n l\ -ast;\n}\n}\n if ($print_model){print $TMP $line;}\ - \n\n}\nclose ($TMP);\nclose ($INFILE);\n\n \n\n \ - if ($numbering eq \"\"){$numbering=\"absolute\";}\ -\n if ($numbering_out eq \"\"){$numbering_out=\"n\ -ew\";}\n\n if ( $delete_set && $coor_set) {die \"\ --delete and -coor are mutually exclusive, sorry\\n\ -\";}\n if ( $n_atom==0){$atom_list[$n_atom++]=\"A\ -LL\";$atom_list{$atom_list[0]}=1;}\n if ( $seq_fi\ -eld eq \"\"){$seq_field=\"ATOM\";}\n \n if ( $MO\ -DE eq \"\"){$MODE=\"pdb\";}\n elsif ( $MODE eq \"\ -simple\" && $code==0){$code=1;}\n\n if ( $code==0\ -){$code=3;}\n\n\nif ($f_chain[0] eq \" \"){$hc_cha\ -in{' '}=1;$c_chain[0]=\" \";}\nelsif (!@c_chain){$\ -hc_chain{FIRST}=1;$c_chain[0]=\"FIRST\";}#make sur\ -e the first chain is taken by default\n\nif ($h\ -c_chain{ALL}) \n{\n @c_chain=@f_chain;\n \ - foreach $e (@c_chain){$hc_chain{$e}=1;}\n}\nelsif\ -($hc_chain{FIRST})\n{\n @c_chain=($f_chain[0]);\n \ -$hc_chain{$f_chain[0]}=1;\n}\n\n\n$MAIN_HOM_CODE=&\ -get_main_hom_code ($structure_file);\n$INFILE=vfop\ -en ($structure_file, \"r\");\n\n\nif ( $MODE eq \"\ -raw_pdb\" || $MODE eq \"raw\")\n{\n while (<$IN\ -FILE>)\n{ print \"$_\";}\n close ( $INFILE);\n \ - &myexit($EXIT_SUCCESS);\n} \nif ( $MODE eq \\ -"raw4fugue\" )\n{\n while (<$INFILE>)\n{ \n $l=\ -$_;\n if ($l=~/^SEQRES/)\n{\n \n $c= subst\ -r($l,11,1);\n if ($hc_chain {$c}){print \"$l\"\ -;}\n}\n elsif ( $l=~/^ATOM/)\n{\n $c=substr($l\ -,21,1);\n if ($hc_chain {$c}){print \"$l\";}\n\ -}\n}\n close ( $INFILE);\n &myexit($EXIT_SUC\ -CESS);\n} \n\nif ( $MODE eq \"pdb\")\n{\n\n \ -$read_header=0;\n while (<$INFILE>) \n{\n $\ -line=$_;\n if ($line =~ /^HEADER/){print \"\ -$line\";$read_header=1;}\n}\n close ($INFILE);\\ -n\n if (!$read_header)\n{\n print \"HEADER U\ -NKNOWN 00-JAN-00 \ - $force_name\\n\";\n}\n\n $INFILE=vfopen ($stru\ -cture_file, \"r\");\n \n print \"COMPND 1 \ -CHAIN:\";\n $last=pop(@c_chain);\n foreach $\ -c ( @c_chain){ print \" $c,\";}\n if ( $last eq\ - \" \"){print \" NULL;\\n\";}\n else \n{\n \ - print \" $last;\\n\";\n}\n @c_chain=(@c_chain,\ - $last);\n \n print \"REMARK Output of the p\ -rogram extract_from_pdb (Version $VersionTag)\\n\"\ -;\n print \"REMARK Legal PDB format not Guarant\ -eed\\n\";\n print \"REMARK This format is not m\ -eant to be used in place of the PDB format\\n\";\n\ - print \"REMARK The header refers to the origin\ -al entry\\n\";\n print \"REMARK The sequence fr\ -om the original file has been taken in the field: \ -$seq_field\\n\";\n print \"REMARK extract_from_\ -pdb, 2001, 2002, 2003, 2004, 2005 2006 (c) CNRS an\ -d Cedric Notredame\\n\"; \n if ( $coor_set)\n\ -{\n print \"REMARK Partial chain: Start $sta\ -rt End $end\\n\";\n}\n if ( $is_nmr)\n{\n \ - print \"REMARK NMR structure: MODEL $model\\n\";\\ -n}\n \n if ( $n_atom!=0)\n{\n print \"R\ -EMARK Contains Coordinates of: \";\n foreach\ - $a (@atom){print \"$a \";}\n print \"\\n\";\ -\n} \n}\n\n\n\n\nmy $residue_index = -999;\nmy $o\ -ld_c = \"TemporaryChain\";\n\nwhile (<$INFILE>) \n\ -{\n $line=$_;\n\n\n if ($line =~ /^SEQRES/)\n{\n\n\ - @field=/(\\S*)\\s*/g;\n \n \n $c= substr($_,11,\ -1);\n\n \n $l=$#field;\n for ($a=4; $a<$#field \ -;)\n{\n if (!$onelett{$molecule_type{$c}}->{$fie\ -ld[$a]})\n{\n splice @field, $a, 1;\n}\n else\ - \n{\n $a++;\n}\n}\n \n if ( $c ne $in_chain)\\ -n{\n $pdb_chain_list[$n_pdb_chains]=$c;\n $pdb\ -_chain_len [$n_pdb_chains]=$len;\n $in_chain=$c;\ -\n $n_pdb_chains++;\n}\n \n for ( $a=4; $a<$#fi\ -eld;$a++)\n{\n @{$complete_seq{$c}}->[$complete_\ -seq_len{$c}++]=$field[$a];\n}\n}\n elsif ( $lin\ -e=~/^ATOM/ || ($line=~/^HETATM/ && &is_aa(substr($\ -line,17,3),substr($line,21,1)) && !$no_hetatm))\n{\ -\n\n \n $RAW_AT_ID=$AT_ID=substr($line,12,4);\\ -n $RES_ID=&is_aa(substr($line,17,3),substr($line,2\ -1,1));\n $CHAIN=substr($line,21,1);\n\n $RES_NO\ -=substr($line,22,4);\n $HOM_CODE=substr ($line, 26\ -, 1);\n $TEMP=substr($line,60,6);\n \n $TEMP=~s/\\\ -s//g;\n $AT_ID=~s/\\s//g;\n $RES_ID=~s/\\s/\ -/g;\n $RES_NO=~s/\\s//g;\n \n if ( $HOM_CO\ -DE ne $MAIN_HOM_CODE){next;}\n elsif ( $already_re\ -ad2{$CHAIN}{$RES_ID}{$AT_ID}{$RES_NO}){next;}\n el\ -se{$already_read2{$CHAIN}{$RES_ID}{$AT_ID}{$RES_NO\ -}=1;}\n \n \n if ($coor_set && $numbering eq \"fil\ -e\" && $residue_index ne $RES_NO)\n{\n \n \ -if ( $RES_NO<=$start){$real_start{$CHAIN}++;}\n \ - if ( $RES_NO<=$end){$real_end{$CHAIN}++;}\n}\n e\ -lsif ($numbering eq \"absolute\")\n{\n $real_s\ -tart{$CHAIN}=$start;\n $real_end{$CHAIN}=$end;\ -\n}\n\n $KEY=\"ALL\";\n if ( $CHAIN \ -ne $in_atom_chain)\n{\n \n $pdb_atom_chain_l\ -ist[$n_pdb_atom_chains]=$c;\n $pdb_atom_chain_le\ -n [$n_pdb_atom_chains]=$len;\n $in_atom_chain=$c\ -;\n $n_pdb_atom_chains++;\n}\n \n if ( $residue_\ -index ne $RES_NO)\n{\n $residue_index = $RES_\ -NO;\n @{$atom_seq{$CHAIN}}->[$atom_seq_len{$C\ -HAIN}++]=$RES_ID;;\n}\n}\n\n}\nclose ($INFILE);\n\\ -n\n\n\n\n\n$INFILE=vfopen ($structure_file, \"r\")\ -;\nforeach $c (@c_chain)\n{\n if ( $seq_field e\ -q \"SEQRES\"){@pdb_seq=@{$complete_seq{$c}};}\n el\ -sif ( $seq_field eq \"ATOM\") {@pdb_seq=@{$atom_s\ -eq{$c}};}\n \n\n $full_length=$l=$#pdb_seq+1;\n \\ -n if ( $real_end{$c}==\"*\"){$real_end{$c}=$full_l\ -ength;}\n if ( $coor_set)\n{ \n\n if ( $real\ -_end{$c} < $l){splice @pdb_seq, $real_end{$c}, $l;\ -}\n if ( $real_start{$c} < $l){splice @pdb_seq,\ - 0, $real_start{$c}-1;} \n $l=$#pdb_seq;\\ -n}\n\n elsif ( $delete_set)\n{\n splice @pdb_se\ -q, $delete_start, $delete_end-$delete_start+1;\n \ - $l=$#pdb_seq;\n}\n \n $new_fasta_name=\"$pdb_id$\ -c\";\n if ( $coor_set)\n{\n if ( $n_pdb_chains=\ -=0){$new_fasta_name=\"$new_fasta_name$c\";}\n $\ -new_fasta_name= $new_fasta_name.\"\\_$start\\_$end\ -\";\n}\n \n if ( $MODE eq \"pdb\")\n{\n $nl=\ -1;\n $n=0;\n \n foreach $res ( @pdb_seq)\\ -n {\n if ( !$n)\n {\n \n printf \"SEQRES %2\ -d %1s %4d \", $nl,$c, $l;\n $nl++;\n }\n $\ -res=~s/\\s//g;\n \n if ($code==1){ print\ -f \"%3s \",$onelett{$molecule_type{$c}}->{$res};}\\ -n elsif ($code==3){ printf \"%3s \",$res};\n\ - \n $n++; \n if ( $n==13){$n=0;p\ -rint \"\\n\";}\n}\n if ( $n!=0){print \"\\n\"; $\ -n=0;}\n}\n elsif ( $MODE eq \"simple\")\n{\n pri\ -nt \"# SIMPLE_PDB_FORMAT\\n\";\n if ( $new_fasta\ -_name eq \" \"){$new_fasta_name=\"dummy_name\";}\n\ - print \">$new_fasta_name\\n\";\n\n foreach $r\ -es ( @pdb_seq)\n{\n print \"$onelett{$molecu\ -le_type{$c}}->{$res}\";\n}\n print \"\\n\";\n}\n\ - elsif ( $MODE eq \"fasta\")\n{\n $n=0;\n prin\ -t \">$new_fasta_name\\n\";\n \n foreach $res (\ - @pdb_seq)\n{\n\n print \"$onelett{$molecule\ -_type{$c}}->{$res}\";\n $n++;\n \ - if ( $n==60){print \"\\n\"; $n=0;}\n}\n print \\ -"\\n\"; \n}\n}\n\nif ( $MODE eq \"fasta\")\n{\n \ - &myexit($EXIT_SUCCESS);\n \n}\n\n \n $charcou\ -nt=0;\n $inchain=\"BEGIN\";\n $n=0;\n while (<$\ -INFILE>) \n{\n $line=$_;\n \n if ($line \ -=~/^ATOM/ || ($line=~/^HETATM/))\n{\n $line_head\ -er=\"UNKNWN\";\n $RES_ID=substr($line,17,3);\n $ch\ -ain = substr($line,21,1);\n\n if ($line =~/^ATOM/)\ -\n{\n $line_header=\"ATOM\";\n $RES_ID=(&i\ -s_aa($RES_ID,$chain))?&is_aa($RES_ID,$chain):$RES_\ -ID;\n}\n elsif ($line=~/^HETATM/ && ($ligand_list \ -{$RES_ID} ||$ligand_list {'ALL'} || !&is_aa($RES_I\ -D,$chain)))\n{\n $line_header=\"HETATM\";\n}\n\ - elsif ($line=~/^HETATM/ && (&is_aa($RES_ID,$chain\ -) && !$no_hetatm))\n{\n $line_header=\"ATOM\";\ -\n $RES_ID=&is_aa($RES_ID,$chain);\n}\n else\n\ -{\n next;\n}\n\n \n\n $X=substr($line,30,8); \ - \n $Y=substr($line,38,8);\n $Z=substr($line,46,\ -8);\n $TEMP=substr($line,60,6);\n \n $RAW_AT_ID=$A\ -T_ID=substr($line,12,4);\n $CHAIN=substr($line,21,\ -1);\n $RES_NO=substr($line,22,4);\n $HOM_CODE=subs\ -tr ($line, 26, 1);\n \n $X=~s/\\s//g;\n $Y=~s/\\s/\ -/g;\n $Z=~s/\\s//g;\n $TEMP=~s/\\s//g;\n \n $AT_ID\ -=~s/\\s//g;\n $RES_ID=~s/\\s//g;\n $RES_NO=~s/\\s/\ -/g;\n\n \n if ( $HOM_CODE ne $MAIN_HOM_CODE){next;\ -}\n elsif ( $already_read{$CHAIN}{$RES_ID}{$AT_ID}\ -{$RES_NO}){next;}\n else{$already_read{$CHAIN}{$RE\ -S_ID}{$AT_ID}{$RES_NO}=1;}\n \n $KEY=\"ALL\";\n\n \ - if ( $RES_NO ==0){$start_at_zero=1;}\n\n $RE\ -S_NO+=$start_at_zero; \n \n if ( $current_chain\ - ne $CHAIN)\n{\n $current_chain=$CHAIN;\n \ -$pos=$current_residue=0;\n $offset=($coor_set)\ -?($real_start{$CHAIN}-1):0;\n if ( $seq_fie\ -ld eq \"SEQRES\"){@ref_seq=@{$complete_seq{$CHAIN}\ -};}\n elsif ( $seq_field eq \"ATOM\") {@ref_s\ -eq=@{$atom_seq{$CHAIN}};}\n}\n \n if ($current_res\ -idue != $RES_NO)\n{\n $current_residue=$RES_NO\ -;\n if ( $seq_field eq \"SEQRES\"){$pos=$cu\ -rrent_residue;}\n elsif ( $seq_field eq \"ATOM\ -\"){$pos++;}\n}\n \n \n if ($n_atom==0 || $atom_li\ -st{$AT_ID}==1 || $atom_list{$KEY}==1)\n{ \n \\ -n $do_it=(!@c_chain || $hc_chain{$CHAIN} ||$hc\ -_chain{'LIGAND'} );\n \n $do_it= ($do_it==\ -1) && ($coor_set==0 ||($pos>=$real_start{$CHAIN} &\ -& $pos<=$real_end{$CHAIN}));\n $do_it= ($do_it\ -==1) && ($delete_set==0 || $pos<$delete_start ||$p\ -os>$delete_end );\n if ($ligand==0 && $line_he\ -ader eq \"HETATM\" ){$do_it=0;}\n if ($ligand_\ -only==1 && $line_header eq \"ATOM\" ){$do_it=0;}\n\ - if ($ligand==1 && $line_header eq \"HETATM\" \ -&& $ligand_list{$RES_ID}==0 && $ligand_list{\"ALL\\ -"}==0){$do_it=0;} \n \n \n if ( $do_it\ -)\n{\n $n++;\n $out_pos=$pos;\n \n if ( \ -$delete_set)\n{\n if ( $out_pos< $delete_start)\ -{;}\n else {$offset=$delete_end-$delete_start;}\ -\n} \n \n if ( $numbering_out \ -eq \"new\"){$out_pos-=$offset;}\n elsif ( $\ -numbering_out eq \"old\"){$out_pos=$RES_NO;}\n \ - \n \n \n if ( $code==1){$R\ -ES_ID=$onelett{$molecule_type{$c}}->{$RES_ID};}\n \ - \n if ($unfold)\n{\n $unfolded_x+=5\ -;\n $X=$unfolded_x;\n $Y=0;\n $Z=0;\n \ - $float=1;\n}\n else\n{\n $float=3;\\ -n}\n\n if ( $MODE eq \"pdb\")\n{\n prin\ -tf \"%-6s%5d %-4s %3s %s%4d %8.3f%8.3f%8.3f 1.\ -00 %5.2f\\n\",$line_header, $n, $RAW_AT_ID,$RES_ID\ -,$CHAIN,$out_pos, $X, $Y, $Z,$TEMP; \n}\n \ - elsif ( $MODE eq \"simple\")\n{\n if ( $RES\ -_ID eq \"\"){$RES_ID=\"X\";}\n printf \"%-6s %5\ -s %s %2s %4d %8.3f %8.3f %8.3f\\n\",$line_heade\ -r, $AT_ID, $RES_ID,($CHAIN eq\"\" || $CHAIN eq \" \ -\")?\"A\":$CHAIN,$out_pos, $X, $Y, $Z,$TEMP;\n}\n\\ -n}\n}\n}\n}\nprint \"\\n\";\nclose($INFILE);\n\n\n\ -if ( $error ne \"\") \n{$error=$error.\"\\nDiagnos\ -tic: SEQRES and the residues in ATOM are probab\ -ly Incompatible\\n\";\n $error=$error. \"Recom\ -endation: Rerun with '-fix 1' in order to ignore t\ -he SEQRES sequences\\n\";\n}\nif (!$nodiagnostic){\ -print STDERR $error;}\n&myexit ( $EXIT_SUCCESS);\n\ -\nsub remote_is_pdb_name \n{\n my $in=@_[0];\n \ - my $netaddress=@_[1];\n my $ref_file, $pdb;\\ -n my $value;\n\n if ( $in=~/[^\\w\\d\\:\\_]/\ -){return 0;}\n \n \n $ref_file=\"$cache/p\ -db_entry_type.txt\";\n \n if ( !-e $ref_file\ - || (-M $ref_file)>2 || -z $ref_file)\n{\n &url2fi\ -le(\"ftp://ftp.wwpdb.org/pub/pdb/derived_data/pdb_\ -entry_type.txt\", $ref_file);\n}\n \n $pdb=subs\ -tr ($in,0, 4);\n \n \n $value=`grep -c $p\ -db $ref_file`;\n return $value;\n}\n \nsub\ - is_pdb_file\n{\n my @arg=@_;\n\n if ( !-e $\ -arg[0]){return 0;}\n \n $F=vfopen ($arg[0], \ -\"r\");\n while ( <$F>)\n{\n if (/^HEADER/)\n{\\ -n close $F;\n return 1;\n}\n elsif ( /^SEQ\ -RES/)\n{\n close $F;\n return 1;\n}\n elsi\ -f ( /^ATOM/)\n{\n close $F;\n return 1;\n}\ -\n}\n return 0;\n}\nsub get_pdb_id\n{\n my $\ -header_file=@_[0];\n my $id;\n \n\n $F=vf\ -open (\"$header_file\", \"r\");\n\n while ( <$F\ ->)\n{\n \n if ( /HEADER/)\n{\n $id=substr($_,6\ -2,4 );\n return $id;\n}\n}\n close ($F);\n \ - \n return \"\";\n}\n\nsub get_ligand_list\n{\ -\n my $pdb_file=@_[0];\n my $chain;\n my \ -$ligand;\n my %complete_ligand_list;\n \n\n \ - $F=vfopen ($pdb_file, \"r\");\n while ( <$F>\ -)\n{\n if ( /^HETATM/)\n{\n $line=$_;\n $c\ -hain=substr($line,21,1);\n $ligand=substr($lin\ -e,17,3);\n \n if (!$complete_ligand_list{$\ -chain}{$ligand})\n{\n \n $complete_ligand_list{\\ -"result\"}.=\"CHAIN $chain LIGAND $ligand\\n\";\n \ - $complete_ligand_list{$chain}{$ligand}=1;\n}\n}\n\ -}\n close ($F);\n return %complete_ligand_li\ -st;\n}\n\nsub get_chain_list \n{\n my $header_f\ -ile;\n my @chain_list;\n my @list;\n my $\ -n_chains;\n my %chain_hasch;\n my $pdb_file=\ -@_[0];\n my $c;\n my %hasch;\n my $chain;\ -\n \n \n $F=vfopen ($pdb_file, \"r\");\n \ - while ( <$F>)\n{\n\n\n if (/SEQRES\\s+\\d+\\s+(\\\ -S+)/)\n{\n $chain = substr($_,11,1);$chain=~s/\ -\\s//g;if ( $chain eq \"\"){$chain=\" \";}\n \n\ - \n if ($chain && !$hasch{$chain}){$hasch{\ -$chain}=1;push @chain_list, $chain;}\n}\n if (/^AT\ -OM/ || /^HETATM/)\n{\n $chain = substr($_,21,1\ -); $chain=~s/\\s//g;if ( $chain eq \"\"){$chain=\"\ - \";}\n if ($chain && !$hasch{$chain}){$hasch{\ -$chain}=1;push @chain_list, $chain;}\n}\n}\n \n\ - \n close ($F);\n if (!@chain_list)\n{\n @\ -chain_list=(\"A\");\n}\n return @chain_list;\n}\ -\n\nsub token_is_in_list\n{\n\n my @list=@_;\n \ - my $a;\n \n for ($a=1; $a<=$#list; $a++)\\ -n{\n if ( $list[$a] eq $list[0]){return $a;}\n}\n}\ -\n\nsub pdb_name2name_and_chain \n{\n my $pdb_f\ -ile=@_[0];\n my $pdb_file_in;\n my @array;\n\ - my $chain;\n my $c;\n\n $pdb_file_in=$pd\ -b_file;\n\n $pdb_file=~/^(.{4})/;$pdb_id=$1;\n \ - @array=($pdb_file=~/([\\w])/g);\n \n \n $c\ -hain=uc ($array[4]);\n $chain=($chain eq \"\")?\ -\"FIRST\":$chain;\n \n return ( $pdb_id, $ch\ -ain);\n\n if ( $#array==3){return ($pdb_id, \"F\ -IRST\");}\n elsif ( $#array<4){ return ($pdb_id\ -, \"\");}\n else {return ( $pdb_id, $chain);}\n\ - \n \n \n}\nsub get_main_hom_code \n{\n\ - my $pdb_file=@_[0];\n my %hom, $n, $best, $\ -best_h;\n open (F, $pdb_file);\n while ()\ -\n{\n if ( $_=~/^ATOM/)\n{\n $h=substr ($_,26,\ - 1);\n $n=++$hom{$h};\n if ($n>$best)\n{\n\ - $best=$n;\n $best_h=$h;\n}\n}\n}\n close (F)\ -;\n return $best_h;\n}\n\n\nsub get_pdb_file \n\ -{\n my ($pdb_file_in)=(@_);\n my $result;\n \ - my @letter;\n my @chain;\n my $v;\n my\ - $pdb_file=$pdb_file_in;\n\n $pdb_file=($pdb_fi\ -le_in=~/\\S+_S_(\\S+)/)?$1:$pdb_file_in;\n\n if\ - ($no_remote_pdb_dir==0)\n{\n $no_remote_pdb_dir=1\ -;\n $result=get_pdb_file3 ($pdb_file);\n $no_remot\ -e_pdb_dir=0;\n if ( $result){return $result;}\n el\ -se\n{\n \n lc ($pdb_file);\n $result=g\ -et_pdb_file3($pdb_file);\n return $result;\n}\ -\n}\n else\n{\n return get_pdb_file3 ($pdb_file\ -);\n}\n \n}\n\nsub get_pdb_file3 \n{\n my $p\ -db_file_in=@_[0];\n my $result;\n my @letter\ -;\n my @chain;\n my $lcfile;\n my $ucfile\ -;\n my $pdb_file=$pdb_file_in;\n \n $lcfi\ -le=lc $pdb_file;\n $ucfile=uc $pdb_file;\n\n \ - if ( ($result=get_pdb_file2 ($pdb_file))){return \ -$result;}\n \n\n if ($lcfile ne $pdb_file &&\ - ($result=get_pdb_file2 ($lcfile))){return $result\ -;}\n if ($ucfile ne $pdb_file && ($result=get_p\ -db_file2 ($ucfile))){return $result;}\n \n \n\ - \n return \"\";\n}\nsub get_pdb_file2\n{\n \ - my $pdb_file=@_[0];\n my $return_value;\n \ - \n $return_value=\"\";\n \n if ( ($resul\ -t=get_pdb_file1 ($pdb_file))){$return_value=$resul\ -t;}\n elsif ( !($pdb_file=~/\\.pdb/) && !($pdb_\ -file=~/\\.PDB/))\n{\n if ( ($result=get_pdb_file1 \ -(\"$pdb_file.pdb\"))){$return_value=$result;}\n el\ -sif ( ($result=get_pdb_file1 (\"$pdb_file.PDB\")))\ -{$return_value=$result;}\n\n elsif ( ($result=get_\ -pdb_file1 (\"pdb$pdb_file.pdb\"))){$return_value=$\ -result;} \n elsif ( ($result=get_pdb_file1 (\"pdb$\ -pdb_file.PDB\"))){$return_value=$result;}\n elsif \ -( ($result=get_pdb_file1 (\"PDB$pdb_file.PDB\"))){\ -$return_value=$result;}\n elsif ( ($result=get_pdb\ -_file1 (\"PDB$pdb_file.pdb\"))){$return_value=$res\ -ult;}\n \n \n elsif ( ($result=get_pdb_file1 (\"$p\ -db_file.ent\"))){$return_value=$result;}\n elsif (\ - ($result=get_pdb_file1 (\"pdb$pdb_file.ent\"))){$\ -return_value=$result;}\n elsif ( ($result=get_pdb_\ -file1 (\"PDB$pdb_file.ent\"))){$return_value=$resu\ -lt;}\n\n elsif ( ($result=get_pdb_file1 (\"$pdb_fi\ -le.ENT\"))){$return_value=$result;}\n elsif ( ($re\ -sult=get_pdb_file1 (\"pdb$pdb_file.ENT\"))){$retur\ -n_value=$result;}\n elsif ( ($result=get_pdb_file1\ - (\"PDB$pdb_file.ENT\"))){$return_value=$result;}\\ -n \n \n \n}\n return $return_value;\n}\n \ns\ -ub get_pdb_file1\n{\n my ($pdb_file)=(@_);\n \ - my $return_value;\n \n\n $return_value=\"\"\ -;\n if ( ($result=get_pdb_file0 ($pdb_file))){$\ -return_value=$result;}\n elsif ( ($result=get_p\ -db_file0 (\"$pdb_file.Z\"))){$return_value=$result\ -;}\n elsif ( ($result=get_pdb_file0 (\"$pdb_fil\ -e.gz\"))){$return_value=$result;}\n elsif ( ($r\ -esult=get_pdb_file0 (\"$pdb_file.GZ\"))){$return_v\ -alue=$result;}\n return $return_value;\n}\nsub \ -get_pdb_file0 \n{ \n my ($pdb_file, $attempt)=(\ -@_);\n my $pdb_file=@_[0];\n my $tmp_pdb_fil\ -e; \n my $return_value;\n\n if ( !$attemp\ -t){$attempt=1;}\n \n $local_pdb_file=\"$pdb_\ -file\";\n if ( $local_pdb_file eq \"\")\n{\n $t\ -mp_pdb_file=vtmpnam();\n open F, \">$tmp_pdb_file\\ -";\n \n while (){print F \"$_\";}\n close (\ -F);\n \n if (-e $tmp_pdb_file && &is_pdb_file ( $l\ -ocal_pdb_file))\n{return $tmp_pdb_file;}\n}\n\n \ - $local_pdb_file=\"$pdb_file\";\n &debug_print \ -(\"\\nTry access local file: $local_pdb_file\");\n\ - \n $local_pdb_file=&check_pdb_file4compress\ -ion ($local_pdb_file);\n if ( -e $local_pdb_fil\ -e && (&is_pdb_file ($local_pdb_file) || $force_pdb\ -))\n{\n &debug_print ( \"\\n\\tIs in Current Dir\"\ -);\n $tmp_pdb_file=vtmpnam();\n `cp $local_pdb_fil\ -e $tmp_pdb_file`;\n return $tmp_pdb_file;\n}\n \ -else\n{\n &debug_print (\"\\n\\tFile Not in Curren\ -t Dir\");\n}\n\n if ($pdb_file=~/^pdb/||$pdb_fi\ -le=~/^PDB/){$pdb_div=substr ($pdb_file, 4, 2);}\n \ - else\n{\n $pdb_div=substr ($pdb_file, 1, 2);\\ -n}\n $local_pdb_file=\"$pdb_dir/$pdb_div/$pdb_f\ -ile\";\n $local_pdb_file=&check_pdb_file4compre\ -ssion ( $local_pdb_file);\n &debug_print (\"\\n\ -Try access file From PDB_DIR: $local_pdb_file\");\\ -n if ($pdb_dir && -e $local_pdb_file && &is_pdb\ -_file ($local_pdb_file))\n{\n &debug_print ( \"\\n\ -\\tIs in Local PDB DIR\");\n $tmp_pdb_file=vtmpnam\ -();\n `cp $local_pdb_file $tmp_pdb_file`;\n return\ - $tmp_pdb_file;\n}\n\n $local_pdb_file=\"$pdb_d\ -ir/$pdb_file\";\n $local_pdb_file=&check_pdb_fi\ -le4compression ( $local_pdb_file);\n &debug_pri\ -nt (\"\\nTry access file From PDB_DIR: local_pdb_f\ -ile\");\n if ($pdb_dir && -e $local_pdb_file &&\ - &is_pdb_file ($local_pdb_file))\n{\n &debug_print\ - ( \"\\n\\tIs in Local PDB DIR\");\n $tmp_pdb_file\ -=vtmpnam();\n `cp $local_pdb_file $tmp_pdb_file`;\\ -n return $tmp_pdb_file;\n}\n\n $local_pdb_file=\ -\"$pdb_dir$pdb_file\";\n $local_pdb_file=&check\ -_pdb_file4compression ( $local_pdb_file);\n &de\ -bug_print (\"\\nTry access file From PDB_DIR: $loc\ -al_pdb_file\");\n if ($pdb_dir && -e $local_pdb\ -_file && &is_pdb_file ($local_pdb_file))\n{\n &deb\ -ug_print ( \"\\n\\tIs in Local PDB DIR\");\n $tmp_\ -pdb_file=vtmpnam();\n `cp $local_pdb_file $tmp_pdb\ -_file`;\n return $tmp_pdb_file;\n}\n else\n{&de\ -bug_print ( \"\\n\\tNot In Local Pdb Dir\");}\n\n \ - if ($cache ne \"NO\" && $cache ne \"no\")\n{\n\\ -n $local_pdb_file=\"$cache/$pdb_file\";\n $local_p\ -db_file=&check_pdb_file4compression ( $local_pdb_f\ -ile);\n &debug_print(\"\\nTry access file From Cac\ -he: $local_pdb_file\");\n if (-e $local_pdb_file &\ -& &is_pdb_file ($local_pdb_file))\n{\n &debug_\ -print ( \"\\n\\tIs in T-Coffee Cache\");\n $tm\ -p_pdb_file=vtmpnam();\n `cp $local_pdb_file $t\ -mp_pdb_file`;\n return $tmp_pdb_file;\n}\n els\ -e{&debug_print ( \"\\n\\tNot in Cache Dir\");}\n}\\ -n\n if (!$no_remote_pdb_dir) \n{\n\n my $return\ -_value=\"\";\n if ( &remote_is_pdb_name ($pdb_file\ -, $netaddress)==1)\n{\n &debug_print (\"\\n***\ -**************************************************\ -**\\nTry Remote Access for $pdb_file\");\n $tm\ -p_pdb_file=vtmpnam();\n $netcommand=$netaddres\ -s;\n $netcommand=~s/%%/$pdb_file/g;\n &url\ -2file(\"$netcommand\", \"$tmp_pdb_file.$netcompres\ -sion\");\n &debug_print(\"\\nREMOTE: $netcomma\ -nd\\n\");\n \n $compressed_tmp_file_name=\"\ -$tmp_pdb_file.$netcompression\";\n \n if (\ -$netcompression && -B $compressed_tmp_file_name)\n\ -{\n my $r;\n &debug_print (\"\\n\\tFile Found Re\ -motely\");\n if (($r=safe_system ( \"$netcompress\ -ion_pg $compressed_tmp_file_name\")!=$EXIT_SUCCESS\ -) && $attempts<5)\n{\n &debug_print (\"\\n\\t\ -Proper Download Failed Try again\");\n unlink\ - $compressed_tmp_file_name;\n print \"\\nFail\ -ed to Download $compressed_tmp_file_name. New Atte\ -mpt $attempt/5\\n\";\n return &get_pdb_file0(\ -$pdb_file, $attempt+1);\n}\n elsif ($r== $EXIT_SU\ -CCESS)\n{\n &debug_print (\"\\n\\tProper Down\ -load Succeeded \");\n $return_value=$tmp_pdb_\ -file;\n}\n else\n{\n &debug_print (\"\\n\\tP\ -roper Download Failed \");\n &debug_print (\"\ -\\nFile Not Found Remotely\");\n unlink $comp\ -ressed_tmp_file_name;\n}\n}\n else\n{\n &debu\ -g_print (\"\\nFile Not Found Remotely\");\n unlin\ -k $compressed_tmp_file_name;\n}\n if ($cache n\ -e \"no\" && $cache ne \"update\" && -e $return_val\ -ue)\n{\n `cp $return_value $cache/$pdb_file.pdb`;\ -\n}\n}\n &debug_print (\"\\nRemote Download Finish\ -ed\");\n return $return_value;\n}\n return \"\"\ -;\n}\n\nsub check_pdb_file4compression \n{\n my\ - $file=@_[0];\n my $tmp;\n my $r;\n \n \ - $tmp=&vtmpnam();\n if (-e $tmp){unlink $tmp;}\\ -n \n $file=~s/\\/\\//\\//g;\n if (-B $\ -file && ($file=~/\\.Z/)) {`cp $file $tmp.Z`;`rm $t\ -mp`;`gunzip $tmp.Z $SILENT`;$r=$tmp;}\n elsif (\ --B $file && ($file=~/\\.gz/)){`cp $file $tmp.gz`;`\ -gunzip $tmp.gz $SILENT`;return $r=$tmp;}\n elsi\ -f (-B $file ){`cp $file $tmp.gz`;`gunzip $tmp.gz $\ -SILENT`;$r=$tmp;}\n elsif ( -e $file ) {$r= $fi\ -le;}\n elsif ( -e \"$file.gz\" ){ `cp $file.gz \ -$tmp.gz`;`gunzip $tmp.gz $SILENT`;$r=$tmp;} \ - \n elsif ( -e \"$file.Z\") {`cp $file.Z $tmp.\ -Z`; `gunzip $tmp.Z $SILENT`;$r=$tmp;}\n else {\ -$r= $file;}\n\n if ( -e \"$tmp.Z\"){unlink \"$t\ -mp.Z\";}\n if ( -e \"$tmp.gz\"){unlink \"$tmp.g\ -z\";}\n \n return $r;\n \n}\n\nsub vtmpna\ -m\n{\n my $tmp_file_name;\n $tmp_name_counte\ -r++;\n $tmp_file_name=\"tmp_file_for_extract_fr\ -om_pdb$$.$tmp_name_counter\";\n $tmp_file_list[\ -$ntmp_file++]=$tmp_file_name;\n if ( -e $tmp_fi\ -le_name) {return &vtmpnam ();}\n else {return $\ -tmp_file_name;}\n}\n\n\n\n \n\n\nsub safe_syste\ -m \n{\n my $com=@_[0];\n my $pid;\n my $status;\ -\n if ($com eq \"\"){return 1;}\n if (($pid = fo\ -rk ()) < 0){return (-1);}\n if ($pid == 0)\n{\n \ - exec ($com);\n}\n else\n{\n $PIDCHILD=$pid;\n\ -}\n \n waitpid ($pid,WTERMSIG);\n return $?; #c\ -ontains the status of the exit\n}\nEND {\n kill (\ -$PIDCHILD);\n clean(@tmp_file_list);\n}\nsub myex\ -it\n{\n my $exit_status=@_[0];\n \n &clea\ -n(@tmp_file_list);\n exit ( $exit_status);\n}\n\ -\nsub clean\n{\n my @fl=@_;\n my $file;\n \n\n \ - if ( $debug){print STDERR \"remove $#fl files\\n\ -\";}\n\n foreach $file ( @fl)\n{\n if (-e $f\ -ile)\n{\n if ( $debug){print STDERR \"\\n$file [\ -NOT DELETED]\";}\n else{unlink ($file);} \n}\n}\\ -n}\nsub vfopen \n{\n my $file=@_[0];\n my $m\ -ode=@_[1];\n my $tmp;\n my $F = new FileHand\ -le;\n \n \n $tmp=$file;\n \n \n if \ -( $mode eq \"r\" && !-e $file){ die \"Cannot open \ -file $file [FATAL: EXTRACT_FROM_PDB]\\n\";}\n e\ -lsif ($mode eq \"w\"){$tmp=\">$file\";}\n elsif\ - ($mode eq \"a\"){$tmp=\">>$file\";}\n \n \n\ - open ($F,$tmp);\n return $F;\n}\nsub debug_\ -print\n{\n my $message =@_[0];\n if ($debug)\ -{print STDERR \"NO_REMOTE_PDB_DIR: $no_remote_pdb_\ -dir - $message [DEBUG:extract_from_pdb]\";}\n r\ -eturn;\n}\nsub is_aa \n{\n my ($aa, $chain) =@_\ -;\n\n my $one;\n my $trhee;\n \n if ( \ -$onelett{$molecule_type{$chain}}->{$aa} eq 'X' || \ -!$onelett{$molecule_type{$chain}}->{$aa} ){return \ -'';}\n else\n{\n $one=$onelett{$molecule_type{$\ -chain}}->{$aa};\n\n $three=$threelett{$molecule_ty\ -pe{$chain}}->{$one};\n \n\n return $three;\n}\n\n}\ -\nsub pg_is_installed\n{\n my @ml=@_;\n my $\ -r, $p, $m;\n my $supported=0;\n \n my $p=\ -shift (@ml);\n $r=`which $p 2>/dev/null`;\n \ -if ($r eq \"\"){return 0;}\n else {return 1;}\n\ -}\nsub check_pg_is_installed\n{\n my @ml=@_;\n \ - my $r=&pg_is_installed (@ml);\n if (!$r)\n{\\ -n print STDERR \"\\nProgram $p Supported but Not I\ -nstalled on your system [FATAL:tc_generic_method]\\ -\n\";\n myexit ($EXIT_FAILURE);\n}\n else\n{\n \ -return 1;\n}\n}\n\nsub url2file\n{\n my ($addre\ -ss, $out, $wget_arg, $curl_arg)=(@_);\n my ($pg\ -, $flag, $r, $arg, $count);\n \n if ( $INTER\ -NET==-1)\n{\n $INTERNET=1;\n $INTERNET=&check_inte\ -rnet_connection();\n}\n if ($INTERNET==0){exit(\ -$EXIT_FAILURE);}\n \n if (&pg_is_installed (\\ -"wget\")) {$pg=\"wget\"; $flag=\"-O\";$arg=$wget\ -_arg;}\n elsif (&pg_is_installed (\"curl\")){$p\ -g=\"curl\"; $flag=\"-o\";$arg=$curl_arg;}\n els\ -e\n{\n print stderr \"ERROR: neither curl nor wget\ - are installed. Imnpossible to tectch remote file \ -[FATAL]\\n\";\n exit ($EXIT_FAILURE);\n}\n \n \ - $r=safe_system (\"$pg $flag$out $address >/dev/nu\ -ll 2>/dev/null\");\n if ($r!=$EXIT_SUCCESS)\n{\\ -n unlink $file;\n}\n return $r;\n}\n\n\n\nsub c\ -heck_internet_connection\n{\n my $internet;\n \ - \n if ( -e \"x\"){unlink (\"x\");}\n url2f\ -ile(\"www.google.com\", \"x\");\n \n if ( !-\ -e \"x\" || -s \"x\" < 10){$internet=0;}\n else \ -{$internet=1;}\n if (-e \"x\"){unlink \"x\";}\n\ - return $internet;\n}\n\n\n\nsub pdbfile2chaint\ -ype\n {\n my $file=@_[0];\n my %ct;\n my\ - $F;\n \n $F=vfopen ($file, \"r\");\n whi\ -le (<$F>)\n {\n my $line=$_;\n if ($line =~/^\ -ATOM/)\n {\n my $C=substr($line,21,1);\n \ - if (!$ct{$C})\n { \n my $r=substr($line,17\ -,3);\n $r=~s/\\s+//;\n if (length ($r)==1){$ct{$\ -C}=\"R\";}\n elsif (length ($r)==2){$ct{$C}=\"D\"\ -;}\n elsif (length ($r)==3){$ct{$C}=\"P\";}\n el\ -se \n {\n print \"ERROR: Could not read RE\ -S_ID field in file $file [FATAL:extract_from_pdb]\\ -\n\";die;\n }\n }\n }\n }\n clo\ -se ($F);\n return %ct;\n }\n \n \n\n\n\ns\ -ub fill_threelett_RNA\n{\n\n my %threelett=(\n 'A'\ -, ' A',\n 'T', ' T',\n 'U', ' U',\n 'C', ' C',\ -\n 'G', ' G',\n 'I', ' I', #Inosine\n );\n \n re\ -turn %threelett;\n\n}\n\n\nsub fill_onelett_RNA\n{\ -\n my %onelett=(\n ' A' => 'A',\n ' T' => 'T',\ -\n ' U' => 'U',\n ' C' => 'C',\n ' G' => 'G',\n\ - 'CSL' => 'X',\n 'UMS' => 'X',\n ' I' => 'I',\n '\ -A' => 'A',\n 'T' => 'T',\n 'U' => 'U',\n 'C' => 'C\ -',\n 'G' => 'G',\n 'I' => 'I',\n );\n\n return %on\ -elett;\n\n}\n\n\nsub fill_onelett_DNA\n{\n my %o\ -nelett=(\n ' DA', 'A',\n ' DT', 'T',\n ' DC', 'C',\ -\n ' DG', 'G',\n 'DA', 'A',\n 'DT', 'T',\n 'DC', '\ -C',\n 'DG', 'G',\n );\n\n return %onelett;\n\n}\n\\ -nsub fill_threelett_DNA\n{\n\n my %threelett=(\n '\ -A', ' DA',\n 'T', ' DT',\n 'C', ' DC',\n 'G', ' DG\ -',\n );\n\n return %threelett;\n\n}\n\n\n\n\nsub f\ -ill_threelett_prot\n{ \n my %threelett;\n\n %th\ -reelett=(\n'A', 'ALA',\n'C', 'CYS',\n'D', 'ASP',\n\ -'E', 'GLU',\n'F', 'PHE',\n'G', 'GLY',\n'H', 'HIS',\ -\n'I', 'ILE',\n'K', 'LYS',\n'L', 'LEU',\n'N', 'ASN\ -',\n'M', 'MET',\n'P', 'PRO',\n'Q', 'GLN',\n'R', 'A\ -RG',\n'S', 'SER',\n'T', 'THR',\n'V', 'VAL',\n'W', \ -'TRP',\n'Y', 'TYR',\n);\n\nreturn %threelett;\n\n\\ -n}\n\nsub fill_onelett_prot\n{\n my %onelett;\n\ - \n %onelett=(\n\n'10A', 'X',\n'11O', 'X',\n\ -'12A', 'X',\n'13P', 'X',\n'13R', 'X',\n'13S', 'X',\ -\n'14W', 'X',\n'15P', 'X',\n'16A', 'X',\n'16G', 'X\ -',\n'1AN', 'X',\n'1AP', 'X',\n'1AR', 'X',\n'1BH', \ -'X',\n'1BO', 'X',\n'1C5', 'X',\n'1CU', 'X',\n'1DA'\ -, 'X',\n'1GL', 'X',\n'1GN', 'X',\n'1IN', 'X',\n'1L\ -U', 'L',\n'1MA', 'X',\n'1MC', 'X',\n'1MG', 'X',\n'\ -1MZ', 'X',\n'1NA', 'X',\n'1NB', 'X',\n'1NI', 'X',\\ -n'1PA', 'A',\n'1PC', 'X',\n'1PE', 'X',\n'1PG', 'X'\ -,\n'1PI', 'A',\n'1PM', 'X',\n'1PN', 'X',\n'1PU', '\ -X',\n'1PY', 'X',\n'1UN', 'X',\n'24T', 'X',\n'25T',\ - 'X',\n'26P', 'X',\n'2AB', 'X',\n'2AM', 'X',\n'2AN\ -', 'X',\n'2AP', 'X',\n'2AR', 'X',\n'2AS', 'D',\n'2\ -BL', 'X',\n'2BM', 'X',\n'2CP', 'X',\n'2DA', 'X',\n\ -'2DG', 'X',\n'2DP', 'X',\n'2DT', 'X',\n'2EP', 'X',\ -\n'2EZ', 'X',\n'2FG', 'X',\n'2FL', 'X',\n'2FP', 'X\ -',\n'2FU', 'X',\n'2GL', 'X',\n'2GP', 'X',\n'2HP', \ -'X',\n'2IB', 'X',\n'2IP', 'X',\n'2LU', 'L',\n'2MA'\ -, 'X',\n'2MD', 'X',\n'2ME', 'X',\n'2MG', 'X',\n'2M\ -L', 'L',\n'2MO', 'X',\n'2MR', 'R',\n'2MU', 'X',\n'\ -2MZ', 'X',\n'2NO', 'X',\n'2NP', 'X',\n'2OG', 'X',\\ -n'2PA', 'X',\n'2PC', 'X',\n'2PE', 'X',\n'2PG', 'X'\ -,\n'2PH', 'X',\n'2PI', 'X',\n'2PL', 'X',\n'2PP', '\ -X',\n'2PU', 'X',\n'2SI', 'X',\n'2TB', 'X',\n'34C',\ - 'X',\n'35G', 'X',\n'3AA', 'X',\n'3AD', 'X',\n'3AH\ -', 'H',\n'3AN', 'X',\n'3AP', 'X',\n'3AT', 'X',\n'3\ -BT', 'X',\n'3CH', 'X',\n'3CN', 'X',\n'3CO', 'X',\n\ -'3CP', 'X',\n'3DR', 'X',\n'3EP', 'X',\n'3FM', 'X',\ -\n'3GA', 'X',\n'3GP', 'X',\n'3HB', 'X',\n'3HC', 'X\ -',\n'3HP', 'X',\n'3IB', 'X',\n'3ID', 'X',\n'3IN', \ -'X',\n'3MA', 'X',\n'3MB', 'X',\n'3MC', 'X',\n'3MD'\ -, 'D',\n'3MF', 'X',\n'3MP', 'X',\n'3MT', 'X',\n'3O\ -L', 'X',\n'3PA', 'X',\n'3PG', 'X',\n'3PO', 'X',\n'\ -3PP', 'X',\n'3PY', 'X',\n'49A', 'X',\n'4AB', 'X',\\ -n'4AM', 'X',\n'4AN', 'X',\n'4AP', 'X',\n'4BA', 'X'\ -,\n'4BT', 'X',\n'4CA', 'X',\n'4CO', 'X',\n'4HP', '\ -X',\n'4IP', 'X',\n'4MO', 'X',\n'4MV', 'X',\n'4MZ',\ - 'X',\n'4NC', 'X',\n'4NP', 'X',\n'4OX', 'X',\n'4PB\ -', 'X',\n'4PN', 'X',\n'4PP', 'X',\n'4SC', 'X',\n'4\ -SU', 'X',\n'4TB', 'X',\n'55C', 'X',\n'5AD', 'X',\n\ -'5AN', 'X',\n'5AT', 'X',\n'5CM', 'X',\n'5GP', 'X',\ -\n'5HP', 'E',\n'5HT', 'X',\n'5IT', 'X',\n'5IU', 'X\ -',\n'5MB', 'X',\n'5MC', 'X',\n'5MD', 'X',\n'5MP', \ -'X',\n'5MU', 'X',\n'5NC', 'X',\n'5OB', 'X',\n'5PA'\ -, 'X',\n'5PV', 'X',\n'6AB', 'X',\n'6CT', 'X',\n'6H\ -A', 'X',\n'6HC', 'X',\n'6HG', 'X',\n'6HT', 'X',\n'\ -6IN', 'X',\n'6MO', 'X',\n'6MP', 'X',\n'6PG', 'X',\\ -n'6WO', 'X',\n'70U', 'X',\n'7DG', 'X',\n'7HP', 'X'\ -,\n'7I2', 'X',\n'7MG', 'X',\n'7MQ', 'X',\n'7NI', '\ -X',\n'87Y', 'X',\n'8AD', 'X',\n'8BR', 'X',\n'8IG',\ - 'X',\n'8IN', 'X',\n'8OG', 'X',\n'95A', 'X',\n'9AD\ -', 'X',\n'9AM', 'X',\n'9AP', 'X',\n'9DG', 'X',\n'9\ -DI', 'X',\n'9HX', 'X',\n'9OH', 'X',\n'9TA', 'X',\n\ -'A12', 'X',\n'A15', 'X',\n'A23', 'X',\n'A24', 'X',\ -\n'A26', 'X',\n'A2G', 'X',\n'A2P', 'X',\n'A32', 'X\ -',\n'A3P', 'X',\n'A4P', 'X',\n'A5P', 'X',\n'A70', \ -'X',\n'A76', 'X',\n'A77', 'X',\n'A78', 'X',\n'A79'\ -, 'X',\n'A80', 'X',\n'A85', 'X',\n'A88', 'X',\n'A9\ -A', 'X',\n'AA3', 'X',\n'AA4', 'X',\n'AA6', 'X',\n'\ -AAA', 'X',\n'AAB', 'X',\n'AAC', 'X',\n'AAE', 'X',\\ -n'AAG', 'R',\n'AAH', 'X',\n'AAM', 'X',\n'AAN', 'X'\ -,\n'AAP', 'X',\n'AAR', 'R',\n'AAS', 'X',\n'AAT', '\ -X',\n'ABA', 'X',\n'ABC', 'X',\n'ABD', 'X',\n'ABE',\ - 'X',\n'ABH', 'X',\n'ABI', 'X',\n'ABK', 'X',\n'ABM\ -', 'X',\n'ABN', 'X',\n'ABP', 'X',\n'ABR', 'X',\n'A\ -BS', 'X',\n'ABU', 'X',\n'AC1', 'X',\n'AC2', 'X',\n\ -'ACA', 'X',\n'ACB', 'D',\n'ACC', 'C',\n'ACD', 'X',\ -\n'ACE', 'X',\n'ACH', 'X',\n'ACI', 'X',\n'ACL', 'R\ -',\n'ACM', 'X',\n'ACN', 'X',\n'ACO', 'X',\n'ACP', \ -'X',\n'ACQ', 'X',\n'ACR', 'X',\n'ACS', 'X',\n'ACT'\ -, 'X',\n'ACV', 'V',\n'ACX', 'X',\n'ACY', 'X',\n'AD\ -2', 'X',\n'AD3', 'X',\n'ADC', 'X',\n'ADD', 'X',\n'\ -ADE', 'X',\n'ADH', 'X',\n'ADI', 'X',\n'ADM', 'X',\\ -n'ADN', 'X',\n'ADP', 'X',\n'ADQ', 'X',\n'ADR', 'X'\ -,\n'ADS', 'X',\n'ADT', 'X',\n'ADU', 'X',\n'ADW', '\ -X',\n'ADX', 'X',\n'AE2', 'X',\n'AEA', 'X',\n'AEB',\ - 'X',\n'AEI', 'D',\n'AEN', 'X',\n'AET', 'T',\n'AF1\ -', 'X',\n'AF3', 'X',\n'AFA', 'D',\n'AFP', 'X',\n'A\ -G7', 'X',\n'AGB', 'X',\n'AGF', 'X',\n'AGL', 'X',\n\ -'AGM', 'R',\n'AGN', 'X',\n'AGP', 'X',\n'AGS', 'X',\ -\n'AGU', 'X',\n'AH0', 'X',\n'AH1', 'X',\n'AHA', 'X\ -',\n'AHB', 'D',\n'AHC', 'X',\n'AHF', 'X',\n'AHG', \ -'X',\n'AHH', 'X',\n'AHM', 'X',\n'AHO', 'X',\n'AHP'\ -, 'X',\n'AHS', 'X',\n'AHT', 'Y',\n'AHU', 'X',\n'AH\ -X', 'X',\n'AI1', 'X',\n'AI2', 'X',\n'AIB', 'X',\n'\ -AIC', 'X',\n'AIM', 'X',\n'AIP', 'X',\n'AIQ', 'X',\\ -n'AIR', 'X',\n'AJ3', 'X',\n'AKB', 'X',\n'AKG', 'X'\ -,\n'AKR', 'X',\n'AL1', 'X',\n'AL2', 'X',\n'AL3', '\ -X',\n'AL4', 'X',\n'AL5', 'X',\n'AL6', 'X',\n'AL7',\ - 'X',\n'AL8', 'X',\n'AL9', 'X',\n'ALA', 'A',\n'ALB\ -', 'X',\n'ALC', 'X',\n'ALD', 'L',\n'ALE', 'X',\n'A\ -LF', 'X',\n'ALG', 'X',\n'ALL', 'X',\n'ALM', 'A',\n\ -'ALN', 'A',\n'ALO', 'T',\n'ALP', 'X',\n'ALQ', 'X',\ -\n'ALR', 'X',\n'ALS', 'X',\n'ALT', 'A',\n'ALY', 'K\ -',\n'ALZ', 'X',\n'AMA', 'X',\n'AMB', 'X',\n'AMC', \ -'X',\n'AMD', 'X',\n'AMG', 'X',\n'AMH', 'X',\n'AMI'\ -, 'X',\n'AML', 'X',\n'AMN', 'X',\n'AMO', 'X',\n'AM\ -P', 'X',\n'AMQ', 'X',\n'AMR', 'X',\n'AMS', 'X',\n'\ -AMT', 'X',\n'AMU', 'X',\n'AMW', 'X',\n'AMX', 'X',\\ -n'AMY', 'X',\n'ANA', 'X',\n'ANB', 'X',\n'ANC', 'X'\ -,\n'AND', 'X',\n'ANE', 'X',\n'ANI', 'X',\n'ANL', '\ -X',\n'ANO', 'X',\n'ANP', 'X',\n'ANS', 'X',\n'ANT',\ - 'X',\n'AOE', 'X',\n'AOP', 'X',\n'AP1', 'X',\n'AP2\ -', 'X',\n'AP3', 'X',\n'AP4', 'X',\n'AP5', 'X',\n'A\ -P6', 'X',\n'APA', 'X',\n'APB', 'X',\n'APC', 'X',\n\ -'APE', 'F',\n'APF', 'X',\n'APG', 'X',\n'APH', 'A',\ -\n'API', 'X',\n'APL', 'X',\n'APM', 'X',\n'APN', 'G\ -',\n'APP', 'X',\n'APQ', 'X',\n'APR', 'X',\n'APS', \ -'X',\n'APT', 'X',\n'APU', 'X',\n'APX', 'X',\n'APY'\ -, 'X',\n'APZ', 'X',\n'AQS', 'X',\n'AR1', 'X',\n'AR\ -2', 'X',\n'ARA', 'X',\n'ARB', 'X',\n'ARC', 'X',\n'\ -ARD', 'X',\n'ARG', 'R',\n'ARH', 'X',\n'ARI', 'X',\\ -n'ARM', 'R',\n'ARN', 'X',\n'ARO', 'R',\n'ARP', 'X'\ -,\n'ARQ', 'X',\n'ARS', 'X',\n'AS1', 'R',\n'AS2', '\ -X',\n'ASA', 'D',\n'ASB', 'D',\n'ASC', 'X',\n'ASD',\ - 'X',\n'ASE', 'X',\n'ASF', 'X',\n'ASI', 'X',\n'ASK\ -', 'D',\n'ASL', 'X',\n'ASM', 'N',\n'ASO', 'X',\n'A\ -SP', 'D',\n'ASQ', 'X',\n'ASU', 'X',\n'ATA', 'X',\n\ -'ATC', 'X',\n'ATD', 'X',\n'ATF', 'X',\n'ATG', 'X',\ -\n'ATH', 'X',\n'ATM', 'X',\n'ATO', 'X',\n'ATP', 'X\ -',\n'ATQ', 'X',\n'ATR', 'X',\n'ATT', 'X',\n'ATY', \ -'X',\n'ATZ', 'X',\n'AUC', 'X',\n'AUR', 'X',\n'AVG'\ -, 'X',\n'AXP', 'X',\n'AYA', 'A',\n'AZ2', 'X',\n'AZ\ -A', 'X',\n'AZC', 'X',\n'AZD', 'X',\n'AZE', 'X',\n'\ -AZI', 'X',\n'AZL', 'X',\n'AZM', 'X',\n'AZR', 'X',\\ -n'AZT', 'X',\n'B12', 'X',\n'B1F', 'F',\n'B2A', 'A'\ -,\n'B2F', 'F',\n'B2I', 'I',\n'B2V', 'V',\n'B3I', '\ -X',\n'B3P', 'X',\n'B7G', 'X',\n'B96', 'X',\n'B9A',\ - 'X',\n'BA1', 'X',\n'BAA', 'X',\n'BAB', 'X',\n'BAC\ -', 'X',\n'BAF', 'X',\n'BAH', 'X',\n'BAI', 'X',\n'B\ -AK', 'X',\n'BAL', 'A',\n'BAM', 'X',\n'BAO', 'X',\n\ -'BAP', 'X',\n'BAR', 'X',\n'BAS', 'X',\n'BAT', 'F',\ -\n'BAY', 'X',\n'BAZ', 'X',\n'BB1', 'X',\n'BB2', 'X\ -',\n'BBA', 'X',\n'BBH', 'X',\n'BBS', 'X',\n'BBT', \ -'X',\n'BBZ', 'X',\n'BCA', 'X',\n'BCB', 'X',\n'BCC'\ -, 'X',\n'BCD', 'X',\n'BCL', 'X',\n'BCN', 'X',\n'BC\ -R', 'X',\n'BCS', 'C',\n'BCT', 'X',\n'BCY', 'X',\n'\ -BCZ', 'X',\n'BDA', 'X',\n'BDG', 'X',\n'BDK', 'X',\\ -n'BDM', 'X',\n'BDN', 'X',\n'BDS', 'X',\n'BE1', 'X'\ -,\n'BE2', 'X',\n'BEA', 'X',\n'BEF', 'X',\n'BEN', '\ -X',\n'BEO', 'X',\n'BEP', 'X',\n'BER', 'X',\n'BES',\ - 'X',\n'BET', 'X',\n'BEZ', 'X',\n'BF2', 'X',\n'BFA\ -', 'X',\n'BFD', 'X',\n'BFP', 'X',\n'BFS', 'X',\n'B\ -FU', 'X',\n'BG6', 'X',\n'BGF', 'X',\n'BGG', 'X',\n\ -'BGL', 'X',\n'BGN', 'X',\n'BGP', 'X',\n'BGX', 'X',\ -\n'BH4', 'X',\n'BHA', 'X',\n'BHC', 'X',\n'BHD', 'D\ -',\n'BHO', 'X',\n'BHS', 'X',\n'BIC', 'X',\n'BIN', \ -'X',\n'BIO', 'X',\n'BIP', 'X',\n'BIS', 'X',\n'BIZ'\ -, 'X',\n'BJH', 'X',\n'BJI', 'X',\n'BJP', 'X',\n'BL\ -A', 'X',\n'BLB', 'X',\n'BLE', 'L',\n'BLG', 'P',\n'\ -BLI', 'X',\n'BLM', 'X',\n'BLV', 'X',\n'BLY', 'K',\\ -n'BM1', 'X',\n'BM2', 'X',\n'BM5', 'X',\n'BM9', 'X'\ -,\n'BMA', 'X',\n'BMD', 'X',\n'BME', 'X',\n'BMP', '\ -X',\n'BMQ', 'X',\n'BMS', 'X',\n'BMT', 'T',\n'BMU',\ - 'X',\n'BMY', 'X',\n'BMZ', 'X',\n'BNA', 'X',\n'BNG\ -', 'X',\n'BNI', 'X',\n'BNN', 'F',\n'BNO', 'L',\n'B\ -NS', 'X',\n'BNZ', 'X',\n'BO3', 'X',\n'BO4', 'X',\n\ -'BOC', 'X',\n'BOG', 'X',\n'BOM', 'X',\n'BOT', 'X',\ -\n'BOX', 'X',\n'BOZ', 'X',\n'BPA', 'X',\n'BPB', 'X\ -',\n'BPD', 'X',\n'BPG', 'X',\n'BPH', 'X',\n'BPI', \ -'X',\n'BPJ', 'X',\n'BPM', 'X',\n'BPN', 'X',\n'BPO'\ -, 'X',\n'BPP', 'X',\n'BPT', 'X',\n'BPY', 'X',\n'BR\ -B', 'X',\n'BRC', 'X',\n'BRE', 'X',\n'BRI', 'X',\n'\ -BRL', 'X',\n'BRM', 'X',\n'BRN', 'X',\n'BRO', 'X',\\ -n'BRS', 'X',\n'BRU', 'X',\n'BRZ', 'X',\n'BSB', 'X'\ -,\n'BSI', 'X',\n'BSP', 'X',\n'BT1', 'X',\n'BT2', '\ -X',\n'BT3', 'X',\n'BTA', 'L',\n'BTB', 'X',\n'BTC',\ - 'C',\n'BTD', 'X',\n'BTN', 'X',\n'BTP', 'X',\n'BTR\ -', 'W',\n'BU1', 'X',\n'BUA', 'X',\n'BUB', 'X',\n'B\ -UC', 'X',\n'BUG', 'X',\n'BUL', 'X',\n'BUM', 'X',\n\ -'BUQ', 'X',\n'BUT', 'X',\n'BVD', 'X',\n'BX3', 'X',\ -\n'BYS', 'X',\n'BZ1', 'X',\n'BZA', 'X',\n'BZB', 'X\ -',\n'BZC', 'X',\n'BZD', 'X',\n'BZF', 'X',\n'BZI', \ -'X',\n'BZM', 'X',\n'BZO', 'X',\n'BZP', 'X',\n'BZQ'\ -, 'X',\n'BZS', 'X',\n'BZT', 'X',\n'C02', 'X',\n'C1\ -1', 'X',\n'C1O', 'X',\n'C20', 'X',\n'C24', 'X',\n'\ -C2F', 'X',\n'C2O', 'X',\n'C2P', 'X',\n'C3M', 'X',\\ -n'C3P', 'X',\n'C3X', 'X',\n'C48', 'X',\n'C4M', 'X'\ -,\n'C4X', 'X',\n'C5C', 'X',\n'C5M', 'X',\n'C5P', '\ -X',\n'C5X', 'X',\n'C60', 'X',\n'C6C', 'X',\n'C6M',\ - 'X',\n'C78', 'X',\n'C8E', 'X',\n'CA3', 'X',\n'CA5\ -', 'X',\n'CAA', 'X',\n'CAB', 'X',\n'CAC', 'X',\n'C\ -AD', 'X',\n'CAF', 'C',\n'CAG', 'X',\n'CAH', 'X',\n\ -'CAL', 'X',\n'CAM', 'X',\n'CAN', 'X',\n'CAO', 'X',\ -\n'CAP', 'X',\n'CAQ', 'X',\n'CAR', 'X',\n'CAS', 'C\ -',\n'CAT', 'X',\n'CAV', 'X',\n'CAY', 'C',\n'CAZ', \ -'X',\n'CB3', 'X',\n'CB4', 'X',\n'CBA', 'X',\n'CBD'\ -, 'X',\n'CBG', 'X',\n'CBI', 'X',\n'CBL', 'X',\n'CB\ -M', 'X',\n'CBN', 'X',\n'CBO', 'X',\n'CBP', 'X',\n'\ -CBS', 'X',\n'CBX', 'X',\n'CBZ', 'X',\n'CC0', 'X',\\ -n'CC1', 'X',\n'CCC', 'X',\n'CCH', 'X',\n'CCI', 'X'\ -,\n'CCM', 'X',\n'CCN', 'X',\n'CCO', 'X',\n'CCP', '\ -X',\n'CCR', 'X',\n'CCS', 'C',\n'CCV', 'X',\n'CCY',\ - 'X',\n'CD1', 'X',\n'CDC', 'X',\n'CDE', 'X',\n'CDF\ -', 'X',\n'CDI', 'X',\n'CDL', 'X',\n'CDM', 'X',\n'C\ -DP', 'X',\n'CDR', 'X',\n'CDU', 'X',\n'CE1', 'X',\n\ -'CEA', 'C',\n'CEB', 'X',\n'CEC', 'X',\n'CED', 'X',\ -\n'CEF', 'X',\n'CEH', 'X',\n'CEM', 'X',\n'CEO', 'X\ -',\n'CEP', 'X',\n'CEQ', 'X',\n'CER', 'X',\n'CES', \ -'G',\n'CET', 'X',\n'CFC', 'X',\n'CFF', 'X',\n'CFM'\ -, 'X',\n'CFO', 'X',\n'CFP', 'X',\n'CFS', 'X',\n'CF\ -X', 'X',\n'CGN', 'X',\n'CGP', 'X',\n'CGS', 'X',\n'\ -CGU', 'E',\n'CH2', 'X',\n'CH3', 'X',\n'CHA', 'X',\\ -n'CHB', 'X',\n'CHD', 'X',\n'CHF', 'X',\n'CHG', 'G'\ -,\n'CHI', 'X',\n'CHN', 'X',\n'CHO', 'X',\n'CHP', '\ -G',\n'CHR', 'X',\n'CHS', 'F',\n'CHT', 'X',\n'CHX',\ - 'X',\n'CIC', 'X',\n'CIN', 'X',\n'CIP', 'X',\n'CIR\ -', 'X',\n'CIT', 'X',\n'CIU', 'X',\n'CKI', 'X',\n'C\ -L1', 'X',\n'CL2', 'X',\n'CLA', 'X',\n'CLB', 'A',\n\ -'CLC', 'S',\n'CLD', 'A',\n'CLE', 'L',\n'CLF', 'X',\ -\n'CLK', 'S',\n'CLL', 'X',\n'CLM', 'X',\n'CLN', 'X\ -',\n'CLO', 'X',\n'CLP', 'X',\n'CLQ', 'X',\n'CLR', \ -'X',\n'CLS', 'X',\n'CLT', 'X',\n'CLX', 'X',\n'CLY'\ -, 'X',\n'CMA', 'R',\n'CMC', 'X',\n'CMD', 'X',\n'CM\ -E', 'C',\n'CMG', 'X',\n'CMK', 'X',\n'CMN', 'X',\n'\ -CMO', 'X',\n'CMP', 'X',\n'CMR', 'X',\n'CMS', 'X',\\ -n'CMT', 'C',\n'CMX', 'X',\n'CNA', 'X',\n'CNC', 'X'\ -,\n'CND', 'X',\n'CNH', 'X',\n'CNM', 'X',\n'CNN', '\ -X',\n'CNO', 'X',\n'CNP', 'X',\n'CO2', 'X',\n'CO3',\ - 'X',\n'CO5', 'X',\n'CO8', 'X',\n'COA', 'X',\n'COB\ -', 'X',\n'COC', 'X',\n'COD', 'X',\n'COE', 'X',\n'C\ -OF', 'X',\n'COH', 'X',\n'COI', 'X',\n'COJ', 'X',\n\ -'COL', 'X',\n'COM', 'X',\n'CON', 'X',\n'COP', 'X',\ -\n'COR', 'X',\n'COS', 'X',\n'COT', 'X',\n'COY', 'X\ -',\n'CP1', 'G',\n'CP2', 'X',\n'CP4', 'X',\n'CPA', \ -'X',\n'CPB', 'X',\n'CPC', 'X',\n'CPD', 'X',\n'CPG'\ -, 'X',\n'CPH', 'X',\n'CPI', 'X',\n'CPM', 'X',\n'CP\ -N', 'G',\n'CPO', 'X',\n'CPP', 'X',\n'CPQ', 'X',\n'\ -CPR', 'X',\n'CPS', 'X',\n'CPT', 'X',\n'CPU', 'X',\\ -n'CPV', 'X',\n'CPY', 'X',\n'CR1', 'X',\n'CR6', 'X'\ -,\n'CRA', 'X',\n'CRB', 'X',\n'CRC', 'X',\n'CRG', '\ -X',\n'CRH', 'X',\n'CRO', 'T',\n'CRP', 'X',\n'CRQ',\ - 'X',\n'CRS', 'X',\n'CRT', 'X',\n'CRY', 'X',\n'CSA\ -', 'C',\n'CSB', 'X',\n'CSD', 'C',\n'CSE', 'C',\n'C\ -SH', 'X',\n'CSI', 'X',\n'CSN', 'X',\n'CSO', 'C',\n\ -'CSP', 'C',\n'CSR', 'C',\n'CSS', 'C',\n'CST', 'X',\ -\n'CSW', 'C',\n'CSX', 'C',\n'CSY', 'X',\n'CSZ', 'C\ -',\n'CT3', 'X',\n'CTA', 'X',\n'CTB', 'X',\n'CTC', \ -'X',\n'CTD', 'X',\n'CTH', 'T',\n'CTO', 'X',\n'CTP'\ -, 'X',\n'CTR', 'X',\n'CTS', 'X',\n'CTT', 'X',\n'CT\ -Y', 'X',\n'CTZ', 'X',\n'CU1', 'X',\n'CUA', 'X',\n'\ -CUC', 'X',\n'CUL', 'X',\n'CUO', 'X',\n'CUZ', 'X',\\ -n'CVI', 'X',\n'CXF', 'X',\n'CXL', 'X',\n'CXM', 'M'\ -,\n'CXN', 'X',\n'CXP', 'X',\n'CXS', 'X',\n'CY1', '\ -C',\n'CY3', 'X',\n'CYB', 'X',\n'CYC', 'X',\n'CYF',\ - 'C',\n'CYG', 'C',\n'CYH', 'X',\n'CYL', 'X',\n'CYM\ -', 'C',\n'CYN', 'X',\n'CYO', 'X',\n'CYP', 'X',\n'C\ -YQ', 'C',\n'CYS', 'C',\n'CYU', 'X',\n'CYY', 'X',\n\ -'CYZ', 'X',\n'CZH', 'X',\n'CZZ', 'C',\n'D12', 'X',\ -\n'D13', 'X',\n'D16', 'X',\n'D18', 'X',\n'D19', 'X\ -',\n'D1P', 'X',\n'D24', 'X',\n'D34', 'X',\n'D35', \ -'X',\n'D4D', 'X',\n'D4T', 'X',\n'D6G', 'X',\n'DA2'\ -, 'R',\n'DA3', 'X',\n'DA6', 'X',\n'DA7', 'X',\n'DA\ -A', 'X',\n'DAB', 'X',\n'DAC', 'X',\n'DAD', 'X',\n'\ -DAE', 'X',\n'DAF', 'X',\n'DAG', 'X',\n'DAH', 'A',\\ -n'DAJ', 'X',\n'DAK', 'X',\n'DAL', 'A',\n'DAM', 'A'\ -,\n'DAN', 'X',\n'DAO', 'X',\n'DAP', 'X',\n'DAQ', '\ -X',\n'DAR', 'R',\n'DAS', 'D',\n'DAT', 'X',\n'DAU',\ - 'X',\n'DAV', 'X',\n'DBA', 'X',\n'DBD', 'X',\n'DBF\ -', 'X',\n'DBG', 'X',\n'DBI', 'X',\n'DBV', 'X',\n'D\ -BY', 'Y',\n'DCA', 'X',\n'DCB', 'X',\n'DCE', 'X',\n\ -'DCF', 'X',\n'DCG', 'X',\n'DCH', 'X',\n'DCI', 'I',\ -\n'DCL', 'X',\n'DCM', 'X',\n'DCP', 'X',\n'DCS', 'X\ -',\n'DCT', 'X',\n'DCY', 'C',\n'DCZ', 'X',\n'DDA', \ -'X',\n'DDB', 'X',\n'DDC', 'X',\n'DDF', 'X',\n'DDG'\ -, 'X',\n'DDH', 'X',\n'DDL', 'X',\n'DDM', 'X',\n'DD\ -O', 'L',\n'DDP', 'X',\n'DDQ', 'X',\n'DDT', 'Y',\n'\ -DDU', 'X',\n'DEA', 'X',\n'DEB', 'X',\n'DEC', 'X',\\ -n'DEF', 'X',\n'DEL', 'X',\n'DEM', 'X',\n'DEN', 'X'\ -,\n'DEP', 'X',\n'DEQ', 'X',\n'DES', 'X',\n'DET', '\ -X',\n'DFC', 'X',\n'DFG', 'X',\n'DFI', 'X',\n'DFL',\ - 'X',\n'DFO', 'X',\n'DFP', 'X',\n'DFR', 'X',\n'DFT\ -', 'X',\n'DFV', 'X',\n'DFX', 'X',\n'DG2', 'X',\n'D\ -G3', 'X',\n'DG6', 'X',\n'DGA', 'X',\n'DGD', 'X',\n\ -'DGG', 'X',\n'DGL', 'E',\n'DGN', 'Q',\n'DGP', 'X',\ -\n'DGT', 'X',\n'DGX', 'X',\n'DH2', 'X',\n'DHA', 'A\ -',\n'DHB', 'X',\n'DHC', 'X',\n'DHD', 'X',\n'DHE', \ -'X',\n'DHF', 'X',\n'DHG', 'X',\n'DHI', 'H',\n'DHL'\ -, 'X',\n'DHM', 'X',\n'DHN', 'V',\n'DHP', 'X',\n'DH\ -Q', 'X',\n'DHR', 'X',\n'DHS', 'X',\n'DHT', 'X',\n'\ -DHU', 'X',\n'DHY', 'X',\n'DHZ', 'X',\n'DI2', 'X',\\ -n'DI3', 'G',\n'DI4', 'X',\n'DI5', 'X',\n'DIA', 'X'\ -,\n'DIC', 'X',\n'DIF', 'X',\n'DIG', 'X',\n'DII', '\ -X',\n'DIL', 'I',\n'DIM', 'X',\n'DIO', 'X',\n'DIP',\ - 'X',\n'DIQ', 'X',\n'DIS', 'X',\n'DIT', 'X',\n'DIV\ -', 'V',\n'DIX', 'X',\n'DIY', 'X',\n'DKA', 'X',\n'D\ -LA', 'X',\n'DLE', 'L',\n'DLF', 'X',\n'DLS', 'K',\n\ -'DLY', 'K',\n'DM1', 'X',\n'DM2', 'X',\n'DM3', 'X',\ -\n'DM4', 'X',\n'DM5', 'X',\n'DM6', 'X',\n'DM7', 'X\ -',\n'DM8', 'X',\n'DM9', 'X',\n'DMA', 'X',\n'DMB', \ -'X',\n'DMC', 'X',\n'DMD', 'X',\n'DME', 'X',\n'DMF'\ -, 'X',\n'DMG', 'G',\n'DMH', 'N',\n'DMI', 'X',\n'DM\ -J', 'X',\n'DML', 'X',\n'DMM', 'X',\n'DMN', 'X',\n'\ -DMO', 'X',\n'DMP', 'X',\n'DMQ', 'X',\n'DMR', 'X',\\ -n'DMS', 'X',\n'DMT', 'X',\n'DMV', 'X',\n'DMY', 'X'\ -,\n'DNC', 'X',\n'DND', 'X',\n'DNH', 'X',\n'DNJ', '\ -X',\n'DNN', 'X',\n'DNP', 'X',\n'DNQ', 'X',\n'DNR',\ - 'X',\n'DO2', 'X',\n'DO3', 'X',\n'DOA', 'X',\n'DOB\ -', 'X',\n'DOC', 'X',\n'DOH', 'D',\n'DOM', 'X',\n'D\ -OS', 'X',\n'DOX', 'X',\n'DP5', 'X',\n'DP7', 'X',\n\ -'DPA', 'X',\n'DPC', 'X',\n'DPD', 'X',\n'DPE', 'X',\ -\n'DPG', 'X',\n'DPH', 'F',\n'DPM', 'X',\n'DPN', 'F\ -',\n'DPO', 'X',\n'DPP', 'X',\n'DPR', 'P',\n'DPS', \ -'X',\n'DPT', 'X',\n'DPX', 'X',\n'DPY', 'X',\n'DPZ'\ -, 'X',\n'DQH', 'X',\n'DQN', 'X',\n'DR1', 'X',\n'DR\ -B', 'X',\n'DRC', 'X',\n'DRI', 'X',\n'DRP', 'X',\n'\ -DRT', 'X',\n'DRU', 'X',\n'DSA', 'X',\n'DSB', 'X',\\ -n'DSC', 'X',\n'DSD', 'X',\n'DSE', 'S',\n'DSI', 'X'\ -,\n'DSN', 'S',\n'DSP', 'D',\n'DSR', 'X',\n'DSS', '\ -X',\n'DSX', 'X',\n'DSY', 'X',\n'DTB', 'X',\n'DTD',\ - 'X',\n'DTH', 'T',\n'DTN', 'X',\n'DTO', 'X',\n'DTP\ -', 'X',\n'DTQ', 'X',\n'DTR', 'W',\n'DTT', 'X',\n'D\ -TY', 'Y',\n'DUD', 'X',\n'DUO', 'X',\n'DUR', 'X',\n\ -'DUT', 'X',\n'DVA', 'V',\n'DVR', 'X',\n'DX9', 'X',\ -\n'DXA', 'X',\n'DXB', 'X',\n'DXC', 'X',\n'DXG', 'X\ -',\n'DXX', 'X',\n'DZF', 'X',\n'E09', 'X',\n'E20', \ -'X',\n'E2P', 'X',\n'E3G', 'X',\n'E4N', 'X',\n'E4P'\ -, 'X',\n'E64', 'X',\n'E6C', 'X',\n'E96', 'X',\n'E9\ -7', 'X',\n'EA2', 'X',\n'EAA', 'X',\n'EAP', 'X',\n'\ -EBP', 'X',\n'EBW', 'X',\n'ECO', 'X',\n'EDA', 'X',\\ -n'EDC', 'X',\n'EDE', 'X',\n'EDO', 'X',\n'EDR', 'X'\ -,\n'EEB', 'X',\n'EEE', 'X',\n'EFC', 'X',\n'EFZ', '\ -X',\n'EG1', 'X',\n'EG2', 'X',\n'EG3', 'X',\n'EGC',\ - 'X',\n'EGL', 'X',\n'EHP', 'A',\n'EIC', 'X',\n'EJT\ -', 'X',\n'ELA', 'X',\n'EMB', 'X',\n'EMC', 'X',\n'E\ -MD', 'X',\n'EMM', 'X',\n'EMO', 'X',\n'EMP', 'X',\n\ -'EMR', 'X',\n'ENA', 'X',\n'ENC', 'X',\n'ENH', 'X',\ -\n'ENO', 'X',\n'ENP', 'X',\n'EOA', 'X',\n'EOH', 'X\ -',\n'EOT', 'X',\n'EOX', 'X',\n'EPA', 'X',\n'EPE', \ -'X',\n'EPH', 'X',\n'EPI', 'X',\n'EPN', 'X',\n'EPO'\ -, 'X',\n'EPT', 'X',\n'EPU', 'X',\n'EPX', 'X',\n'EP\ -Y', 'X',\n'EQI', 'X',\n'EQP', 'X',\n'EQU', 'X',\n'\ -ERG', 'X',\n'ERI', 'X',\n'ERY', 'X',\n'ESC', 'X',\\ -n'ESD', 'X',\n'ESI', 'X',\n'ESO', 'X',\n'ESP', 'X'\ -,\n'EST', 'X',\n'ESX', 'X',\n'ETA', 'X',\n'ETC', '\ -X',\n'ETD', 'X',\n'ETF', 'X',\n'ETH', 'X',\n'ETI',\ - 'X',\n'ETN', 'X',\n'ETO', 'X',\n'ETP', 'X',\n'ETR\ -', 'X',\n'ETS', 'X',\n'ETY', 'X',\n'EU3', 'X',\n'E\ -UG', 'X',\n'EYS', 'C',\n'F09', 'X',\n'F2B', 'X',\n\ -'F3S', 'X',\n'F42', 'X',\n'F43', 'X',\n'F4S', 'X',\ -\n'F6B', 'X',\n'F6P', 'X',\n'F89', 'X',\n'FA1', 'X\ -',\n'FA5', 'F',\n'FAA', 'X',\n'FAB', 'X',\n'FAC', \ -'X',\n'FAD', 'X',\n'FAF', 'X',\n'FAG', 'X',\n'FAM'\ -, 'X',\n'FAR', 'X',\n'FAS', 'X',\n'FAT', 'X',\n'FB\ -A', 'X',\n'FBE', 'X',\n'FBI', 'X',\n'FBP', 'X',\n'\ -FBQ', 'X',\n'FBS', 'X',\n'FBT', 'X',\n'FBU', 'X',\\ -n'FCA', 'X',\n'FCB', 'X',\n'FCI', 'X',\n'FCN', 'X'\ -,\n'FCO', 'X',\n'FCR', 'X',\n'FCT', 'X',\n'FCX', '\ -X',\n'FCY', 'C',\n'FD1', 'F',\n'FD2', 'F',\n'FD3',\ - 'F',\n'FD4', 'F',\n'FDA', 'X',\n'FDC', 'X',\n'FDI\ -', 'X',\n'FDP', 'X',\n'FDS', 'X',\n'FE2', 'X',\n'F\ -EA', 'X',\n'FEL', 'X',\n'FEM', 'X',\n'FEN', 'X',\n\ -'FEO', 'X',\n'FEP', 'X',\n'FER', 'X',\n'FES', 'X',\ -\n'FFB', 'X',\n'FFC', 'X',\n'FFF', 'X',\n'FFO', 'X\ -',\n'FGL', 'G',\n'FHB', 'X',\n'FHC', 'X',\n'FHP', \ -'X',\n'FHU', 'X',\n'FID', 'X',\n'FII', 'X',\n'FIP'\ -, 'X',\n'FK5', 'X',\n'FKA', 'X',\n'FKI', 'X',\n'FK\ -P', 'X',\n'FL2', 'X',\n'FL9', 'X',\n'FLA', 'A',\n'\ -FLC', 'X',\n'FLD', 'X',\n'FLE', 'L',\n'FLF', 'X',\\ -n'FLO', 'X',\n'FLP', 'X',\n'FLT', 'Y',\n'FLU', 'X'\ -,\n'FLX', 'X',\n'FM1', 'X',\n'FM2', 'X',\n'FMA', '\ -X',\n'FMB', 'X',\n'FMC', 'X',\n'FME', 'M',\n'FMN',\ - 'X',\n'FMP', 'X',\n'FMR', 'X',\n'FMS', 'X',\n'FMT\ -', 'X',\n'FNE', 'X',\n'FNP', 'X',\n'FNS', 'X',\n'F\ -OC', 'X',\n'FOE', 'X',\n'FOG', 'F',\n'FOH', 'X',\n\ -'FOK', 'X',\n'FOL', 'X',\n'FON', 'X',\n'FOP', 'X',\ -\n'FOR', 'X',\n'FOS', 'X',\n'FPA', 'X',\n'FPC', 'X\ -',\n'FPI', 'X',\n'FPO', 'X',\n'FPP', 'X',\n'FPT', \ -'X',\n'FQP', 'X',\n'FRA', 'X',\n'FRD', 'F',\n'FRU'\ -, 'X',\n'FS3', 'X',\n'FS4', 'X',\n'FSB', 'X',\n'FS\ -O', 'X',\n'FSX', 'X',\n'FTC', 'X',\n'FTP', 'X',\n'\ -FTR', 'W',\n'FTT', 'X',\n'FTY', 'Y',\n'FUA', 'X',\\ -n'FUC', 'X',\n'FUM', 'X',\n'FUP', 'X',\n'FVF', 'X'\ -,\n'FXP', 'X',\n'FXV', 'X',\n'FYA', 'F',\n'G16', '\ -X',\n'G1P', 'X',\n'G20', 'X',\n'G21', 'X',\n'G23',\ - 'X',\n'G26', 'X',\n'G28', 'X',\n'G2F', 'X',\n'G37\ -', 'X',\n'G39', 'X',\n'G3H', 'X',\n'G3P', 'X',\n'G\ -4D', 'X',\n'G6D', 'X',\n'G6P', 'X',\n'G6Q', 'X',\n\ -'G7M', 'X',\n'GA2', 'X',\n'GAA', 'X',\n'GAB', 'X',\ -\n'GAC', 'X',\n'GAI', 'X',\n'GAL', 'X',\n'GAM', 'X\ -',\n'GAN', 'X',\n'GAO', 'X',\n'GAP', 'X',\n'GAR', \ -'G',\n'GAS', 'X',\n'GAT', 'X',\n'GBC', 'X',\n'GBI'\ -, 'X',\n'GBP', 'X',\n'GBS', 'X',\n'GBX', 'X',\n'GC\ -4', 'X',\n'GCA', 'X',\n'GCD', 'X',\n'GCG', 'G',\n'\ -GCH', 'G',\n'GCK', 'X',\n'GCL', 'X',\n'GCM', 'X',\\ -n'GCN', 'X',\n'GCO', 'X',\n'GCP', 'X',\n'GCR', 'X'\ -,\n'GCS', 'X',\n'GCU', 'X',\n'GD3', 'X',\n'GDB', '\ -X',\n'GDM', 'X',\n'GDN', 'X',\n'GDP', 'X',\n'GDS',\ - 'X',\n'GDU', 'X',\n'GE1', 'X',\n'GE2', 'X',\n'GE3\ -', 'X',\n'GEA', 'X',\n'GEL', 'X',\n'GEM', 'X',\n'G\ -EN', 'X',\n'GEP', 'X',\n'GER', 'X',\n'GFP', 'X',\n\ -'GGB', 'X',\n'GGL', 'E',\n'GGP', 'X',\n'GHP', 'G',\ -\n'GIP', 'X',\n'GIS', 'X',\n'GKR', 'X',\n'GL2', 'X\ -',\n'GL3', 'G',\n'GL4', 'X',\n'GL5', 'X',\n'GL7', \ -'X',\n'GL9', 'X',\n'GLA', 'X',\n'GLB', 'X',\n'GLC'\ -, 'X',\n'GLD', 'X',\n'GLE', 'X',\n'GLF', 'X',\n'GL\ -G', 'X',\n'GLH', 'Q',\n'GLI', 'X',\n'GLL', 'X',\n'\ -GLM', 'G',\n'GLN', 'Q',\n'GLO', 'X',\n'GLP', 'X',\\ -n'GLR', 'X',\n'GLS', 'X',\n'GLT', 'X',\n'GLU', 'E'\ -,\n'GLV', 'X',\n'GLW', 'X',\n'GLY', 'G',\n'GLZ', '\ -X',\n'GM1', 'X',\n'GMA', 'X',\n'GMC', 'X',\n'GMH',\ - 'X',\n'GMP', 'X',\n'GMY', 'X',\n'GN7', 'X',\n'GNA\ -', 'X',\n'GNB', 'X',\n'GNH', 'X',\n'GNP', 'X',\n'G\ -NT', 'X',\n'GOA', 'X',\n'GOL', 'X',\n'GOX', 'X',\n\ -'GP1', 'X',\n'GP3', 'X',\n'GP4', 'X',\n'GP6', 'X',\ -\n'GP8', 'X',\n'GPB', 'E',\n'GPC', 'X',\n'GPE', 'X\ -',\n'GPG', 'X',\n'GPI', 'X',\n'GPJ', 'X',\n'GPL', \ -'K',\n'GPM', 'X',\n'GPN', 'G',\n'GPP', 'X',\n'GPR'\ -, 'X',\n'GPS', 'X',\n'GPX', 'X',\n'GR1', 'X',\n'GR\ -3', 'X',\n'GR4', 'X',\n'GSA', 'X',\n'GSB', 'X',\n'\ -GSC', 'G',\n'GSE', 'S',\n'GSH', 'X',\n'GSP', 'X',\\ -n'GSR', 'X',\n'GSS', 'X',\n'GT9', 'C',\n'GTA', 'X'\ -,\n'GTB', 'X',\n'GTD', 'X',\n'GTE', 'X',\n'GTH', '\ -T',\n'GTN', 'X',\n'GTO', 'X',\n'GTP', 'X',\n'GTR',\ - 'X',\n'GTS', 'X',\n'GTT', 'X',\n'GTX', 'X',\n'GTZ\ -', 'X',\n'GU7', 'X',\n'GUA', 'X',\n'GUD', 'X',\n'G\ -UM', 'X',\n'GUN', 'X',\n'GUP', 'X',\n'GUR', 'X',\n\ -'GW3', 'X',\n'GZZ', 'X',\n'H2B', 'X',\n'H2P', 'H',\ -\n'H2S', 'X',\n'H2U', 'X',\n'H4B', 'X',\n'H5M', 'P\ -',\n'H5P', 'X',\n'HAA', 'X',\n'HAB', 'X',\n'HAC', \ -'A',\n'HAD', 'X',\n'HAE', 'X',\n'HAG', 'X',\n'HAI'\ -, 'X',\n'HAM', 'X',\n'HAP', 'X',\n'HAQ', 'X',\n'HA\ -R', 'R',\n'HAS', 'X',\n'HAV', 'V',\n'HAX', 'X',\n'\ -HAZ', 'X',\n'HBA', 'X',\n'HBC', 'X',\n'HBD', 'X',\\ -n'HBI', 'X',\n'HBO', 'X',\n'HBU', 'X',\n'HBY', 'X'\ -,\n'HC0', 'X',\n'HC1', 'X',\n'HC4', 'X',\n'HCA', '\ -X',\n'HCC', 'X',\n'HCI', 'X',\n'HCS', 'X',\n'HDA',\ - 'X',\n'HDD', 'X',\n'HDF', 'X',\n'HDN', 'X',\n'HDS\ -', 'X',\n'HDZ', 'X',\n'HE1', 'X',\n'HE6', 'X',\n'H\ -EA', 'X',\n'HEB', 'X',\n'HEC', 'X',\n'HED', 'X',\n\ -'HEE', 'X',\n'HEF', 'X',\n'HEG', 'X',\n'HEM', 'X',\ -\n'HEN', 'X',\n'HEO', 'X',\n'HEP', 'X',\n'HEU', 'X\ -',\n'HEV', 'X',\n'HEX', 'X',\n'HEZ', 'X',\n'HF1', \ -'X',\n'HFA', 'X',\n'HFP', 'X',\n'HGA', 'Q',\n'HGB'\ -, 'X',\n'HGC', 'X',\n'HGI', 'X',\n'HGU', 'X',\n'HH\ -O', 'X',\n'HHP', 'X',\n'HIB', 'X',\n'HIC', 'H',\n'\ -HII', 'X',\n'HIN', 'X',\n'HIO', 'X',\n'HIP', 'H',\\ -n'HIS', 'H',\n'HLE', 'X',\n'HLT', 'X',\n'HMA', 'A'\ -,\n'HMB', 'X',\n'HMC', 'X',\n'HMD', 'X',\n'HMF', '\ -A',\n'HMG', 'X',\n'HMH', 'X',\n'HMI', 'L',\n'HMM',\ - 'X',\n'HMN', 'X',\n'HMO', 'X',\n'HMP', 'X',\n'HMR\ -', 'R',\n'HNI', 'X',\n'HNP', 'X',\n'HOA', 'X',\n'H\ -OE', 'X',\n'HOH', 'X',\n'HOM', 'X',\n'HOP', 'X',\n\ -'HOQ', 'X',\n'HP1', 'A',\n'HP2', 'A',\n'HP3', 'X',\ -\n'HPA', 'X',\n'HPB', 'X',\n'HPC', 'X',\n'HPD', 'X\ -',\n'HPE', 'A',\n'HPG', 'X',\n'HPH', 'F',\n'HPP', \ -'X',\n'HPQ', 'F',\n'HPR', 'X',\n'HPT', 'X',\n'HPY'\ -, 'X',\n'HQO', 'X',\n'HQQ', 'X',\n'HQU', 'X',\n'HR\ -G', 'R',\n'HRI', 'X',\n'HSA', 'X',\n'HSE', 'S',\n'\ -HSF', 'X',\n'HSM', 'X',\n'HSO', 'H',\n'HSP', 'X',\\ -n'HT1', 'X',\n'HT2', 'X',\n'HTA', 'X',\n'HTL', 'X'\ -,\n'HTO', 'X',\n'HTP', 'X',\n'HTR', 'W',\n'HUP', '\ -X',\n'HUX', 'X',\n'HV5', 'A',\n'HV7', 'X',\n'HV8',\ - 'X',\n'HXA', 'X',\n'HXC', 'X',\n'HXP', 'X',\n'HY1\ -', 'X',\n'HYA', 'X',\n'HYB', 'X',\n'HYD', 'X',\n'H\ -YG', 'X',\n'HYP', 'P',\n'I06', 'X',\n'I10', 'X',\n\ -'I11', 'X',\n'I17', 'X',\n'I2P', 'X',\n'I3N', 'X',\ -\n'I3P', 'X',\n'I40', 'X',\n'I48', 'X',\n'I4B', 'X\ -',\n'I52', 'X',\n'I5P', 'X',\n'I84', 'G',\n'IAG', \ -'G',\n'IAS', 'X',\n'IB2', 'X',\n'IBB', 'X',\n'IBP'\ -, 'X',\n'IBR', 'X',\n'IBS', 'X',\n'IBZ', 'X',\n'IC\ -1', 'X',\n'ICA', 'X',\n'ICI', 'X',\n'ICL', 'X',\n'\ -ICP', 'X',\n'ICT', 'X',\n'ICU', 'X',\n'ID2', 'X',\\ -n'IDC', 'X',\n'IDG', 'X',\n'IDH', 'X',\n'IDM', 'X'\ -,\n'IDO', 'X',\n'IDP', 'X',\n'IDR', 'X',\n'IDS', '\ -X',\n'IDT', 'X',\n'IDU', 'X',\n'IFG', 'X',\n'IFP',\ - 'X',\n'IGL', 'X',\n'IGN', 'X',\n'IGP', 'X',\n'IGU\ -', 'X',\n'IH1', 'X',\n'IH2', 'X',\n'IH3', 'X',\n'I\ -HB', 'X',\n'IHN', 'X',\n'IHP', 'X',\n'IIC', 'X',\n\ -'IIL', 'I',\n'IIP', 'X',\n'IK2', 'X',\n'IKT', 'X',\ -\n'ILA', 'I',\n'ILE', 'I',\n'ILG', 'X',\n'ILO', 'X\ -',\n'ILX', 'I',\n'IM1', 'X',\n'IM2', 'X',\n'IMC', \ -'X',\n'IMD', 'X',\n'IME', 'X',\n'IMF', 'X',\n'IMG'\ -, 'X',\n'IMH', 'X',\n'IMI', 'X',\n'IML', 'I',\n'IM\ -M', 'X',\n'IMN', 'X',\n'IMO', 'X',\n'IMP', 'X',\n'\ -IMR', 'X',\n'IMU', 'X',\n'IN0', 'D',\n'IN1', 'R',\\ -n'IN2', 'K',\n'IN3', 'L',\n'IN4', 'X',\n'IN5', 'A'\ -,\n'IN6', 'L',\n'IN7', 'X',\n'IN8', 'X',\n'IN9', '\ -X',\n'INA', 'L',\n'INB', 'X',\n'INC', 'X',\n'IND',\ - 'X',\n'INE', 'X',\n'INF', 'F',\n'ING', 'F',\n'INH\ -', 'R',\n'INI', 'X',\n'INJ', 'X',\n'INK', 'X',\n'I\ -NL', 'X',\n'INM', 'X',\n'INN', 'A',\n'INO', 'X',\n\ -'INP', 'X',\n'INQ', 'X',\n'INR', 'X',\n'INS', 'X',\ -\n'INT', 'V',\n'INU', 'X',\n'INV', 'X',\n'INW', 'X\ -',\n'INX', 'X',\n'INY', 'X',\n'INZ', 'X',\n'IOA', \ -'X',\n'IOB', 'X',\n'IOC', 'X',\n'IOD', 'X',\n'IOE'\ -, 'X',\n'IOF', 'X',\n'IOH', 'X',\n'IOL', 'X',\n'IO\ -P', 'X',\n'IP1', 'X',\n'IP2', 'X',\n'IP3', 'X',\n'\ -IP4', 'X',\n'IPA', 'X',\n'IPB', 'X',\n'IPD', 'X',\\ -n'IPG', 'G',\n'IPH', 'X',\n'IPL', 'X',\n'IPM', 'X'\ -,\n'IPN', 'X',\n'IPO', 'F',\n'IPP', 'X',\n'IPS', '\ -X',\n'IPT', 'X',\n'IPU', 'X',\n'IPY', 'A',\n'IQB',\ - 'X',\n'IQP', 'X',\n'IQS', 'X',\n'IR3', 'X',\n'IRI\ -', 'X',\n'IRP', 'X',\n'ISA', 'X',\n'ISF', 'X',\n'I\ -SO', 'X',\n'ISP', 'X',\n'ISQ', 'X',\n'ISU', 'X',\n\ -'ITM', 'X',\n'ITP', 'X',\n'ITR', 'W',\n'ITS', 'X',\ -\n'ITU', 'X',\n'IU5', 'X',\n'IUM', 'X',\n'IUR', 'X\ -',\n'IVA', 'X',\n'IYG', 'G',\n'IYR', 'Y',\n'J77', \ -'X',\n'J78', 'X',\n'J80', 'X',\n'JE2', 'X',\n'JEN'\ -, 'X',\n'JST', 'X',\n'K21', 'X',\n'KAH', 'X',\n'KA\ -I', 'X',\n'KAM', 'X',\n'KAN', 'X',\n'KAP', 'X',\n'\ -KCP', 'X',\n'KCX', 'K',\n'KDO', 'X',\n'KEF', 'X',\\ -n'KET', 'X',\n'KGR', 'X',\n'KH1', 'X',\n'KIF', 'X'\ -,\n'KIV', 'V',\n'KNI', 'X',\n'KPH', 'K',\n'KTH', '\ -X',\n'KTN', 'X',\n'KTP', 'X',\n'KWT', 'X',\n'L04',\ - 'X',\n'L1P', 'X',\n'L24', 'E',\n'L2P', 'X',\n'L34\ -', 'E',\n'L37', 'E',\n'L3P', 'X',\n'L4P', 'X',\n'L\ -75', 'X',\n'LAC', 'X',\n'LAD', 'X',\n'LAK', 'X',\n\ -'LAM', 'X',\n'LAR', 'X',\n'LAT', 'X',\n'LAX', 'X',\ -\n'LCO', 'X',\n'LCP', 'X',\n'LCS', 'X',\n'LDA', 'X\ -',\n'LDO', 'L',\n'LDP', 'X',\n'LEA', 'X',\n'LEO', \ -'X',\n'LEU', 'L',\n'LG2', 'X',\n'LG6', 'X',\n'LGC'\ -, 'X',\n'LGP', 'X',\n'LHG', 'X',\n'LHY', 'F',\n'LI\ -1', 'X',\n'LIG', 'X',\n'LIL', 'X',\n'LIM', 'X',\n'\ -LIN', 'X',\n'LIO', 'X',\n'LIP', 'X',\n'LLA', 'X',\\ -n'LLP', 'K',\n'LLY', 'K',\n'LMG', 'X',\n'LML', 'X'\ -,\n'LMT', 'X',\n'LMU', 'X',\n'LMZ', 'X',\n'LNK', '\ -X',\n'LNL', 'X',\n'LNO', 'X',\n'LOF', 'X',\n'LOL',\ - 'L',\n'LOM', 'X',\n'LOR', 'X',\n'LOS', 'X',\n'LOV\ -', 'L',\n'LOX', 'X',\n'LP1', 'X',\n'LP2', 'R',\n'L\ -PA', 'X',\n'LPC', 'X',\n'LPF', 'X',\n'LPL', 'X',\n\ -'LPM', 'X',\n'LPP', 'X',\n'LRB', 'X',\n'LRU', 'X',\ -\n'LS1', 'X',\n'LS2', 'X',\n'LS3', 'X',\n'LS4', 'X\ -',\n'LS5', 'X',\n'LTA', 'X',\n'LTL', 'X',\n'LTR', \ -'W',\n'LUM', 'X',\n'LVS', 'L',\n'LXC', 'X',\n'LY2'\ -, 'X',\n'LY3', 'X',\n'LYA', 'X',\n'LYB', 'X',\n'LY\ -C', 'X',\n'LYD', 'X',\n'LYM', 'K',\n'LYN', 'X',\n'\ -LYS', 'K',\n'LYT', 'X',\n'LYW', 'X',\n'LYZ', 'K',\\ -n'M1A', 'X',\n'M1G', 'X',\n'M2G', 'X',\n'M3L', 'K'\ -,\n'M6P', 'X',\n'M6T', 'X',\n'M7G', 'X',\n'MA1', '\ -X',\n'MA2', 'X',\n'MA3', 'X',\n'MA4', 'X',\n'MA6',\ - 'X',\n'MAA', 'A',\n'MAB', 'X',\n'MAC', 'X',\n'MAE\ -', 'X',\n'MAG', 'X',\n'MAH', 'X',\n'MAI', 'R',\n'M\ -AK', 'X',\n'MAL', 'X',\n'MAM', 'X',\n'MAN', 'X',\n\ -'MAO', 'X',\n'MAP', 'X',\n'MAR', 'X',\n'MAS', 'X',\ -\n'MAT', 'X',\n'MAU', 'X',\n'MAZ', 'X',\n'MBA', 'X\ -',\n'MBD', 'X',\n'MBG', 'X',\n'MBH', 'X',\n'MBN', \ -'X',\n'MBO', 'X',\n'MBR', 'X',\n'MBS', 'X',\n'MBV'\ -, 'X',\n'MBZ', 'X',\n'MCA', 'X',\n'MCD', 'X',\n'MC\ -E', 'X',\n'MCG', 'G',\n'MCI', 'X',\n'MCN', 'X',\n'\ -MCP', 'X',\n'MCT', 'X',\n'MCY', 'X',\n'MD2', 'X',\\ -n'MDA', 'X',\n'MDC', 'X',\n'MDG', 'X',\n'MDH', 'X'\ -,\n'MDL', 'X',\n'MDM', 'X',\n'MDN', 'X',\n'MDP', '\ -X',\n'ME6', 'X',\n'MEB', 'X',\n'MEC', 'X',\n'MEL',\ - 'X',\n'MEN', 'N',\n'MEP', 'X',\n'MER', 'X',\n'MES\ -', 'X',\n'MET', 'M',\n'MEV', 'X',\n'MF2', 'X',\n'M\ -F3', 'M',\n'MFB', 'X',\n'MFD', 'X',\n'MFU', 'X',\n\ -'MG7', 'X',\n'MGA', 'X',\n'MGB', 'X',\n'MGD', 'X',\ -\n'MGG', 'R',\n'MGL', 'X',\n'MGN', 'Q',\n'MGO', 'X\ -',\n'MGP', 'X',\n'MGR', 'X',\n'MGS', 'X',\n'MGT', \ -'X',\n'MGU', 'X',\n'MGY', 'G',\n'MHB', 'X',\n'MHF'\ -, 'X',\n'MHL', 'L',\n'MHM', 'X',\n'MHO', 'M',\n'MH\ -S', 'H',\n'MHZ', 'X',\n'MIA', 'X',\n'MIC', 'X',\n'\ -MID', 'X',\n'MIL', 'X',\n'MIM', 'X',\n'MIN', 'G',\\ -n'MIP', 'X',\n'MIS', 'S',\n'MIT', 'X',\n'MJI', 'X'\ -,\n'MK1', 'X',\n'MKC', 'X',\n'MLA', 'X',\n'MLC', '\ -X',\n'MLE', 'L',\n'MLN', 'X',\n'MLT', 'X',\n'MLY',\ - 'K',\n'MLZ', 'K',\n'MM3', 'X',\n'MM4', 'X',\n'MMA\ -', 'X',\n'MMC', 'X',\n'MME', 'M',\n'MMO', 'R',\n'M\ -MP', 'X',\n'MMQ', 'X',\n'MMT', 'X',\n'MN1', 'X',\n\ -'MN2', 'X',\n'MN3', 'X',\n'MN5', 'X',\n'MN7', 'X',\ -\n'MN8', 'X',\n'MNA', 'X',\n'MNB', 'X',\n'MNC', 'X\ -',\n'MNG', 'X',\n'MNL', 'L',\n'MNO', 'X',\n'MNP', \ -'X',\n'MNQ', 'X',\n'MNS', 'X',\n'MNT', 'X',\n'MNV'\ -, 'V',\n'MO1', 'X',\n'MO2', 'X',\n'MO3', 'X',\n'MO\ -4', 'X',\n'MO5', 'X',\n'MO6', 'X',\n'MOA', 'X',\n'\ -MOB', 'X',\n'MOC', 'X',\n'MOE', 'X',\n'MOG', 'X',\\ -n'MOH', 'X',\n'MOL', 'X',\n'MOO', 'X',\n'MOP', 'X'\ -,\n'MOR', 'X',\n'MOS', 'X',\n'MOT', 'X',\n'MOX', '\ -X',\n'MP1', 'X',\n'MP3', 'X',\n'MPA', 'X',\n'MPB',\ - 'X',\n'MPC', 'X',\n'MPD', 'X',\n'MPG', 'X',\n'MPH\ -', 'M',\n'MPI', 'X',\n'MPJ', 'M',\n'MPL', 'X',\n'M\ -PN', 'X',\n'MPO', 'X',\n'MPP', 'X',\n'MPQ', 'G',\n\ -'MPR', 'X',\n'MPS', 'X',\n'MQ0', 'X',\n'MQ7', 'X',\ -\n'MQ8', 'X',\n'MQ9', 'X',\n'MQI', 'X',\n'MR2', 'X\ -',\n'MRC', 'X',\n'MRM', 'X',\n'MRP', 'X',\n'MS2', \ -'X',\n'MSA', 'X',\n'MSB', 'X',\n'MSD', 'X',\n'MSE'\ -, 'M',\n'MSF', 'X',\n'MSI', 'X',\n'MSO', 'M',\n'MS\ -Q', 'X',\n'MST', 'X',\n'MSU', 'X',\n'MTA', 'X',\n'\ -MTB', 'X',\n'MTC', 'X',\n'MTD', 'X',\n'MTE', 'X',\\ -n'MTF', 'X',\n'MTG', 'X',\n'MTO', 'X',\n'MTS', 'X'\ -,\n'MTT', 'X',\n'MTX', 'X',\n'MTY', 'Y',\n'MUG', '\ -X',\n'MUP', 'X',\n'MUR', 'X',\n'MVA', 'V',\n'MW1',\ - 'X',\n'MW2', 'X',\n'MXA', 'X',\n'MXY', 'X',\n'MYA\ -', 'X',\n'MYC', 'X',\n'MYG', 'X',\n'MYR', 'X',\n'M\ -YS', 'X',\n'MYT', 'X',\n'MZM', 'X',\n'N1T', 'X',\n\ -'N25', 'X',\n'N2B', 'X',\n'N3T', 'X',\n'N4B', 'X',\ -\n'NA2', 'X',\n'NA5', 'X',\n'NA6', 'X',\n'NAA', 'X\ -',\n'NAB', 'X',\n'NAC', 'X',\n'NAD', 'X',\n'NAE', \ -'X',\n'NAF', 'X',\n'NAG', 'X',\n'NAH', 'X',\n'NAI'\ -, 'X',\n'NAL', 'A',\n'NAM', 'A',\n'NAN', 'X',\n'NA\ -O', 'X',\n'NAP', 'X',\n'NAQ', 'X',\n'NAR', 'X',\n'\ -NAS', 'X',\n'NAU', 'X',\n'NAV', 'X',\n'NAW', 'X',\\ -n'NAX', 'X',\n'NAY', 'X',\n'NBA', 'X',\n'NBD', 'X'\ -,\n'NBE', 'X',\n'NBG', 'X',\n'NBN', 'X',\n'NBP', '\ -X',\n'NBS', 'X',\n'NBU', 'X',\n'NCA', 'X',\n'NCB',\ - 'A',\n'NCD', 'X',\n'NCH', 'X',\n'NCM', 'X',\n'NCN\ -', 'X',\n'NCO', 'X',\n'NCR', 'X',\n'NCS', 'X',\n'N\ -D4', 'X',\n'NDA', 'X',\n'NDC', 'X',\n'NDD', 'X',\n\ -'NDO', 'X',\n'NDP', 'X',\n'NDT', 'X',\n'NEA', 'X',\ -\n'NEB', 'X',\n'NED', 'X',\n'NEM', 'H',\n'NEN', 'X\ -',\n'NEO', 'X',\n'NEP', 'H',\n'NEQ', 'X',\n'NES', \ -'X',\n'NET', 'X',\n'NEV', 'X',\n'NFA', 'F',\n'NFE'\ -, 'X',\n'NFG', 'X',\n'NFP', 'X',\n'NFS', 'X',\n'NG\ -6', 'X',\n'NGA', 'X',\n'NGL', 'X',\n'NGM', 'X',\n'\ -NGO', 'X',\n'NGP', 'X',\n'NGT', 'X',\n'NGU', 'X',\\ -n'NH2', 'X',\n'NH3', 'X',\n'NH4', 'X',\n'NHD', 'X'\ -,\n'NHE', 'X',\n'NHM', 'X',\n'NHP', 'X',\n'NHR', '\ -X',\n'NHS', 'X',\n'NI1', 'X',\n'NI2', 'X',\n'NIC',\ - 'X',\n'NID', 'X',\n'NIK', 'X',\n'NIO', 'X',\n'NIP\ -', 'X',\n'NIT', 'X',\n'NIU', 'X',\n'NIY', 'Y',\n'N\ -LA', 'X',\n'NLE', 'L',\n'NLG', 'X',\n'NLN', 'L',\n\ -'NLP', 'L',\n'NM1', 'X',\n'NMA', 'A',\n'NMB', 'X',\ -\n'NMC', 'G',\n'NMD', 'X',\n'NME', 'X',\n'NMN', 'X\ -',\n'NMO', 'X',\n'NMQ', 'X',\n'NMX', 'X',\n'NMY', \ -'X',\n'NNH', 'R',\n'NNO', 'X',\n'NO2', 'X',\n'NO3'\ -, 'X',\n'NOA', 'X',\n'NOD', 'X',\n'NOJ', 'X',\n'NO\ -N', 'X',\n'NOP', 'X',\n'NOR', 'X',\n'NOS', 'X',\n'\ -NOV', 'X',\n'NOX', 'X',\n'NP3', 'X',\n'NPA', 'X',\\ -n'NPC', 'X',\n'NPD', 'X',\n'NPE', 'X',\n'NPF', 'X'\ -,\n'NPH', 'C',\n'NPI', 'X',\n'NPL', 'X',\n'NPN', '\ -X',\n'NPO', 'X',\n'NPP', 'X',\n'NPT', 'X',\n'NPY',\ - 'X',\n'NRG', 'R',\n'NRI', 'X',\n'NS1', 'X',\n'NS5\ -', 'X',\n'NSP', 'X',\n'NTA', 'X',\n'NTB', 'X',\n'N\ -TC', 'X',\n'NTH', 'X',\n'NTM', 'X',\n'NTP', 'X',\n\ -'NTS', 'X',\n'NTU', 'X',\n'NTZ', 'X',\n'NU1', 'X',\ -\n'NVA', 'V',\n'NVI', 'X',\n'NVP', 'X',\n'NW1', 'X\ -',\n'NYP', 'X',\n'O4M', 'X',\n'OAA', 'X',\n'OAI', \ -'X',\n'OAP', 'X',\n'OAR', 'X',\n'OAS', 'S',\n'OBA'\ -, 'X',\n'OBN', 'X',\n'OC1', 'X',\n'OC2', 'X',\n'OC\ -3', 'X',\n'OC4', 'X',\n'OC5', 'X',\n'OC6', 'X',\n'\ -OC7', 'X',\n'OCL', 'X',\n'OCM', 'X',\n'OCN', 'X',\\ -n'OCO', 'X',\n'OCP', 'X',\n'OCS', 'C',\n'OCT', 'X'\ -,\n'OCV', 'K',\n'OCY', 'C',\n'ODA', 'X',\n'ODS', '\ -X',\n'OES', 'X',\n'OET', 'X',\n'OF1', 'X',\n'OF2',\ - 'X',\n'OF3', 'X',\n'OFL', 'X',\n'OFO', 'X',\n'OHE\ -', 'X',\n'OHO', 'X',\n'OHT', 'X',\n'OIC', 'X',\n'O\ -IP', 'X',\n'OKA', 'X',\n'OLA', 'X',\n'OLE', 'X',\n\ -'OLI', 'X',\n'OLO', 'X',\n'OMB', 'X',\n'OMC', 'X',\ -\n'OMD', 'X',\n'OME', 'X',\n'OMG', 'X',\n'OMP', 'X\ -',\n'OMT', 'M',\n'OMU', 'X',\n'ONE', 'X',\n'ONL', \ -'L',\n'ONP', 'X',\n'OPA', 'X',\n'OPD', 'X',\n'OPE'\ -, 'X',\n'OPG', 'X',\n'OPH', 'X',\n'OPN', 'X',\n'OP\ -P', 'X',\n'OPR', 'R',\n'ORN', 'X',\n'ORO', 'X',\n'\ -ORP', 'X',\n'OSB', 'X',\n'OSS', 'X',\n'OTA', 'X',\\ -n'OTB', 'X',\n'OTE', 'X',\n'OTG', 'X',\n'OUT', 'X'\ -,\n'OVA', 'X',\n'OWQ', 'X',\n'OXA', 'X',\n'OXE', '\ -X',\n'OXI', 'X',\n'OXL', 'X',\n'OXM', 'X',\n'OXN',\ - 'X',\n'OXO', 'X',\n'OXP', 'X',\n'OXS', 'X',\n'OXY\ -', 'X',\n'P11', 'A',\n'P24', 'X',\n'P28', 'X',\n'P\ -2P', 'X',\n'P2U', 'X',\n'P3M', 'X',\n'P4C', 'X',\n\ -'P4P', 'X',\n'P5P', 'X',\n'P6G', 'X',\n'PA1', 'X',\ -\n'PA2', 'X',\n'PA3', 'X',\n'PA4', 'X',\n'PA5', 'X\ -',\n'PAA', 'X',\n'PAB', 'X',\n'PAC', 'X',\n'PAD', \ -'X',\n'PAE', 'X',\n'PAG', 'X',\n'PAH', 'X',\n'PAI'\ -, 'X',\n'PAL', 'D',\n'PAM', 'X',\n'PAN', 'X',\n'PA\ -O', 'X',\n'PAP', 'A',\n'PAQ', 'F',\n'PAR', 'X',\n'\ -PAS', 'X',\n'PAT', 'W',\n'PBA', 'X',\n'PBB', 'X',\\ -n'PBC', 'X',\n'PBF', 'F',\n'PBG', 'X',\n'PBI', 'X'\ -,\n'PBM', 'X',\n'PBN', 'X',\n'PBP', 'X',\n'PBR', '\ -X',\n'PBZ', 'X',\n'PC2', 'X',\n'PCA', 'E',\n'PCB',\ - 'X',\n'PCD', 'X',\n'PCE', 'X',\n'PCG', 'X',\n'PCH\ -', 'X',\n'PCL', 'X',\n'PCM', 'X',\n'PCP', 'X',\n'P\ -CR', 'X',\n'PCS', 'X',\n'PCU', 'X',\n'PCV', 'X',\n\ -'PCY', 'X',\n'PD1', 'X',\n'PDA', 'X',\n'PDC', 'X',\ -\n'PDD', 'A',\n'PDE', 'A',\n'PDI', 'X',\n'PDL', 'A\ -',\n'PDN', 'X',\n'PDO', 'X',\n'PDP', 'X',\n'PDT', \ -'X',\n'PDU', 'X',\n'PE2', 'X',\n'PE6', 'X',\n'PEA'\ -, 'X',\n'PEB', 'X',\n'PEC', 'X',\n'PED', 'X',\n'PE\ -E', 'X',\n'PEF', 'X',\n'PEG', 'X',\n'PEL', 'X',\n'\ -PEO', 'X',\n'PEP', 'X',\n'PEQ', 'X',\n'PER', 'X',\\ -n'PET', 'X',\n'PFB', 'X',\n'PFC', 'X',\n'PFG', 'X'\ -,\n'PFL', 'X',\n'PFM', 'X',\n'PFZ', 'X',\n'PG4', '\ -X',\n'PG5', 'X',\n'PG6', 'X',\n'PGA', 'X',\n'PGC',\ - 'X',\n'PGD', 'X',\n'PGE', 'X',\n'PGG', 'G',\n'PGH\ -', 'X',\n'PGL', 'X',\n'PGO', 'X',\n'PGP', 'X',\n'P\ -GQ', 'X',\n'PGR', 'X',\n'PGS', 'X',\n'PGU', 'X',\n\ -'PGX', 'X',\n'PGY', 'G',\n'PH1', 'X',\n'PH2', 'X',\ -\n'PH3', 'X',\n'PHA', 'F',\n'PHB', 'X',\n'PHC', 'X\ -',\n'PHD', 'X',\n'PHE', 'F',\n'PHG', 'X',\n'PHH', \ -'X',\n'PHI', 'F',\n'PHL', 'F',\n'PHM', 'X',\n'PHN'\ -, 'X',\n'PHO', 'X',\n'PHP', 'X',\n'PHQ', 'X',\n'PH\ -S', 'H',\n'PHT', 'X',\n'PHW', 'P',\n'PHY', 'X',\n'\ -PI1', 'X',\n'PI2', 'X',\n'PI3', 'X',\n'PI4', 'X',\\ -n'PI5', 'X',\n'PI6', 'X',\n'PI7', 'X',\n'PI8', 'X'\ -,\n'PI9', 'X',\n'PIA', 'X',\n'PIB', 'X',\n'PIC', '\ -X',\n'PID', 'X',\n'PIG', 'X',\n'PIH', 'X',\n'PIM',\ - 'X',\n'PIN', 'X',\n'PIO', 'X',\n'PIP', 'X',\n'PIQ\ -', 'X',\n'PIR', 'X',\n'PIV', 'X',\n'PKF', 'X',\n'P\ -L1', 'X',\n'PL9', 'X',\n'PLA', 'D',\n'PLC', 'X',\n\ -'PLE', 'L',\n'PLG', 'G',\n'PLH', 'X',\n'PLM', 'X',\ -\n'PLP', 'X',\n'PLS', 'S',\n'PLT', 'W',\n'PLU', 'L\ -',\n'PLY', 'X',\n'PMA', 'X',\n'PMB', 'X',\n'PMC', \ -'X',\n'PME', 'F',\n'PML', 'X',\n'PMM', 'X',\n'PMO'\ -, 'X',\n'PMP', 'X',\n'PMS', 'X',\n'PMY', 'X',\n'PN\ -2', 'X',\n'PNA', 'X',\n'PNB', 'X',\n'PNC', 'G',\n'\ -PND', 'X',\n'PNE', 'A',\n'PNF', 'X',\n'PNG', 'X',\\ -n'PNI', 'X',\n'PNL', 'X',\n'PNM', 'X',\n'PNN', 'X'\ -,\n'PNO', 'X',\n'PNP', 'X',\n'PNQ', 'X',\n'PNS', '\ -X',\n'PNT', 'X',\n'PNU', 'X',\n'PO2', 'X',\n'PO4',\ - 'X',\n'POB', 'X',\n'POC', 'X',\n'POL', 'X',\n'POM\ -', 'P',\n'PON', 'X',\n'POP', 'X',\n'POR', 'X',\n'P\ -OS', 'X',\n'PP1', 'X',\n'PP2', 'X',\n'PP3', 'A',\n\ -'PP4', 'X',\n'PP5', 'X',\n'PP6', 'X',\n'PP7', 'X',\ -\n'PP8', 'N',\n'PP9', 'X',\n'PPB', 'X',\n'PPC', 'X\ -',\n'PPD', 'X',\n'PPE', 'E',\n'PPG', 'X',\n'PPH', \ -'F',\n'PPI', 'X',\n'PPJ', 'V',\n'PPL', 'X',\n'PPM'\ -, 'X',\n'PPN', 'A',\n'PPO', 'X',\n'PPP', 'X',\n'PP\ -Q', 'X',\n'PPR', 'X',\n'PPS', 'X',\n'PPT', 'X',\n'\ -PPU', 'X',\n'PPX', 'F',\n'PPY', 'X',\n'PPZ', 'X',\\ -n'PQ0', 'X',\n'PQN', 'X',\n'PQQ', 'X',\n'PR1', 'X'\ -,\n'PR2', 'X',\n'PR3', 'X',\n'PRA', 'X',\n'PRB', '\ -X',\n'PRC', 'X',\n'PRD', 'X',\n'PRE', 'X',\n'PRF',\ - 'X',\n'PRH', 'X',\n'PRI', 'P',\n'PRL', 'X',\n'PRN\ -', 'X',\n'PRO', 'P',\n'PRP', 'X',\n'PRR', 'A',\n'P\ -RS', 'P',\n'PRZ', 'X',\n'PS0', 'X',\n'PSA', 'X',\n\ -'PSD', 'X',\n'PSE', 'X',\n'PSF', 'S',\n'PSG', 'X',\ -\n'PSI', 'X',\n'PSO', 'X',\n'PSQ', 'X',\n'PSS', 'X\ -',\n'PST', 'X',\n'PSU', 'X',\n'PT1', 'X',\n'PT3', \ -'X',\n'PTA', 'X',\n'PTC', 'X',\n'PTD', 'X',\n'PTE'\ -, 'X',\n'PTH', 'Y',\n'PTL', 'X',\n'PTM', 'Y',\n'PT\ -N', 'X',\n'PTO', 'X',\n'PTP', 'X',\n'PTR', 'Y',\n'\ -PTS', 'X',\n'PTT', 'X',\n'PTU', 'X',\n'PTY', 'X',\\ -n'PUA', 'X',\n'PUB', 'X',\n'PUR', 'X',\n'PUT', 'X'\ -,\n'PVA', 'X',\n'PVB', 'X',\n'PVH', 'H',\n'PVL', '\ -X',\n'PXA', 'X',\n'PXF', 'X',\n'PXG', 'X',\n'PXP',\ - 'X',\n'PXY', 'X',\n'PXZ', 'X',\n'PY2', 'X',\n'PY4\ -', 'X',\n'PY5', 'X',\n'PY6', 'X',\n'PYA', 'A',\n'P\ -YC', 'X',\n'PYD', 'X',\n'PYE', 'X',\n'PYL', 'X',\n\ -'PYM', 'X',\n'PYO', 'X',\n'PYP', 'X',\n'PYQ', 'X',\ -\n'PYR', 'X',\n'PYS', 'X',\n'PYT', 'X',\n'PYX', 'X\ -',\n'PYY', 'X',\n'PYZ', 'X',\n'PZQ', 'X',\n'Q82', \ -'X',\n'QNC', 'X',\n'QND', 'X',\n'QSI', 'Q',\n'QTR'\ -, 'X',\n'QUA', 'X',\n'QUE', 'X',\n'QUI', 'X',\n'QU\ -O', 'X',\n'R11', 'X',\n'R12', 'X',\n'R13', 'X',\n'\ -R18', 'X',\n'R1P', 'X',\n'R56', 'X',\n'R5P', 'X',\\ -n'RA2', 'X',\n'RAD', 'X',\n'RAI', 'X',\n'RAL', 'X'\ -,\n'RAM', 'X',\n'RAN', 'X',\n'RAP', 'X',\n'RBF', '\ -X',\n'RBU', 'X',\n'RCA', 'X',\n'RCL', 'X',\n'RCO',\ - 'X',\n'RDC', 'X',\n'RDF', 'W',\n'RE9', 'X',\n'REA\ -', 'X',\n'RED', 'K',\n'REO', 'X',\n'REP', 'X',\n'R\ -ET', 'X',\n'RFA', 'X',\n'RFB', 'X',\n'RFL', 'X',\n\ -'RFP', 'X',\n'RG1', 'X',\n'RGS', 'X',\n'RH1', 'X',\ -\n'RHA', 'X',\n'RHC', 'X',\n'RHD', 'X',\n'RHM', 'X\ -',\n'RHO', 'X',\n'RHQ', 'X',\n'RHS', 'X',\n'RIA', \ -'X',\n'RIB', 'X',\n'RIC', 'X',\n'RIF', 'X',\n'RIN'\ -, 'X',\n'RIP', 'X',\n'RIT', 'X',\n'RMB', 'X',\n'RM\ -N', 'X',\n'RMP', 'X',\n'RNG', 'X',\n'RNS', 'X',\n'\ -RNT', 'X',\n'RO2', 'X',\n'RO4', 'X',\n'ROC', 'N',\\ -n'ROI', 'X',\n'ROM', 'X',\n'RON', 'V',\n'ROP', 'X'\ -,\n'ROS', 'X',\n'ROX', 'X',\n'RPA', 'X',\n'RPD', '\ -X',\n'RPH', 'X',\n'RPL', 'X',\n'RPP', 'X',\n'RPR',\ - 'X',\n'RPX', 'X',\n'RQ3', 'X',\n'RR1', 'X',\n'RR6\ -', 'X',\n'RRS', 'X',\n'RS1', 'X',\n'RS2', 'X',\n'R\ -S7', 'X',\n'RSS', 'X',\n'RTA', 'X',\n'RTB', 'X',\n\ -'RTC', 'X',\n'RTL', 'X',\n'RUB', 'X',\n'RUN', 'X',\ -\n'RWJ', 'X',\n'RXP', 'X',\n'S02', 'X',\n'S11', 'X\ -',\n'S1H', 'S',\n'S27', 'X',\n'S2C', 'C',\n'S3P', \ -'X',\n'S4U', 'X',\n'S57', 'X',\n'S58', 'X',\n'S5H'\ -, 'X',\n'S6G', 'X',\n'S80', 'X',\n'SAA', 'X',\n'SA\ -B', 'X',\n'SAC', 'S',\n'SAD', 'X',\n'SAE', 'X',\n'\ -SAF', 'X',\n'SAH', 'C',\n'SAI', 'C',\n'SAL', 'X',\\ -n'SAM', 'M',\n'SAN', 'X',\n'SAP', 'X',\n'SAR', 'X'\ -,\n'SAS', 'X',\n'SB1', 'X',\n'SB2', 'X',\n'SB3', '\ -X',\n'SB4', 'X',\n'SB5', 'X',\n'SB6', 'X',\n'SBA',\ - 'L',\n'SBB', 'X',\n'SBD', 'A',\n'SBI', 'X',\n'SBL\ -', 'A',\n'SBN', 'X',\n'SBO', 'X',\n'SBR', 'X',\n'S\ -BS', 'X',\n'SBT', 'X',\n'SBU', 'X',\n'SBX', 'X',\n\ -'SC4', 'X',\n'SCA', 'X',\n'SCC', 'X',\n'SCD', 'X',\ -\n'SCH', 'C',\n'SCI', 'X',\n'SCL', 'X',\n'SCM', 'X\ -',\n'SCN', 'X',\n'SCO', 'X',\n'SCP', 'S',\n'SCR', \ -'X',\n'SCS', 'X',\n'SCV', 'C',\n'SCY', 'C',\n'SD8'\ -, 'X',\n'SDK', 'X',\n'SDZ', 'X',\n'SE4', 'X',\n'SE\ -A', 'X',\n'SEB', 'S',\n'SEC', 'X',\n'SEG', 'A',\n'\ -SEI', 'X',\n'SEL', 'S',\n'SEM', 'X',\n'SEO', 'X',\\ -n'SEP', 'S',\n'SER', 'S',\n'SES', 'X',\n'SET', 'S'\ -,\n'SEU', 'X',\n'SF4', 'X',\n'SFG', 'X',\n'SFN', '\ -X',\n'SFO', 'X',\n'SGA', 'X',\n'SGC', 'X',\n'SGL',\ - 'X',\n'SGM', 'X',\n'SGN', 'X',\n'SGP', 'X',\n'SHA\ -', 'X',\n'SHC', 'X',\n'SHF', 'X',\n'SHH', 'X',\n'S\ -HP', 'G',\n'SHR', 'E',\n'SHT', 'T',\n'SHU', 'X',\n\ -'SI2', 'X',\n'SIA', 'X',\n'SIF', 'X',\n'SIG', 'X',\ -\n'SIH', 'X',\n'SIM', 'X',\n'SIN', 'X',\n'SKD', 'X\ -',\n'SKF', 'X',\n'SLB', 'X',\n'SLE', 'X',\n'SLZ', \ -'K',\n'SMA', 'X',\n'SMC', 'C',\n'SME', 'M',\n'SML'\ -, 'X',\n'SMM', 'M',\n'SMN', 'X',\n'SMP', 'X',\n'SM\ -S', 'X',\n'SN1', 'X',\n'SN6', 'X',\n'SN7', 'X',\n'\ -SNC', 'C',\n'SNN', 'X',\n'SNP', 'X',\n'SO1', 'X',\\ -n'SO2', 'X',\n'SO3', 'X',\n'SO4', 'X',\n'SOA', 'X'\ -,\n'SOC', 'C',\n'SOM', 'X',\n'SOR', 'X',\n'SOT', '\ -X',\n'SOX', 'X',\n'SPA', 'X',\n'SPB', 'X',\n'SPC',\ - 'X',\n'SPD', 'X',\n'SPE', 'X',\n'SPG', 'X',\n'SPH\ -', 'X',\n'SPI', 'X',\n'SPK', 'X',\n'SPM', 'X',\n'S\ -PN', 'X',\n'SPO', 'X',\n'SPP', 'X',\n'SPS', 'X',\n\ -'SPY', 'X',\n'SQU', 'X',\n'SRA', 'X',\n'SRB', 'X',\ -\n'SRD', 'X',\n'SRL', 'X',\n'SRM', 'X',\n'SRS', 'X\ -',\n'SRY', 'X',\n'SSA', 'X',\n'SSB', 'X',\n'SSG', \ -'X',\n'SSP', 'X',\n'ST1', 'X',\n'ST2', 'X',\n'ST3'\ -, 'X',\n'ST4', 'X',\n'ST5', 'X',\n'ST6', 'X',\n'ST\ -A', 'X',\n'STB', 'X',\n'STE', 'X',\n'STG', 'X',\n'\ -STI', 'X',\n'STL', 'X',\n'STN', 'X',\n'STO', 'X',\\ -n'STP', 'X',\n'STR', 'X',\n'STU', 'X',\n'STY', 'Y'\ -,\n'SU1', 'X',\n'SU2', 'X',\n'SUC', 'X',\n'SUI', '\ -X',\n'SUL', 'X',\n'SUR', 'X',\n'SVA', 'S',\n'SWA',\ - 'X',\n'T16', 'X',\n'T19', 'X',\n'T23', 'X',\n'T29\ -', 'X',\n'T33', 'X',\n'T3P', 'X',\n'T42', 'A',\n'T\ -44', 'X',\n'T5A', 'X',\n'T6A', 'T',\n'T6P', 'X',\n\ -'T80', 'X',\n'T87', 'X',\n'TA1', 'X',\n'TAA', 'X',\ -\n'TAB', 'X',\n'TAC', 'X',\n'TAD', 'X',\n'TAF', 'X\ -',\n'TAM', 'X',\n'TAP', 'X',\n'TAR', 'X',\n'TAS', \ -'X',\n'TAU', 'X',\n'TAX', 'X',\n'TAZ', 'X',\n'TB9'\ -, 'X',\n'TBA', 'X',\n'TBD', 'X',\n'TBG', 'G',\n'TB\ -H', 'X',\n'TBM', 'T',\n'TBO', 'X',\n'TBP', 'X',\n'\ -TBR', 'X',\n'TBS', 'X',\n'TBT', 'X',\n'TBU', 'X',\\ -n'TBZ', 'X',\n'TC4', 'X',\n'TCA', 'X',\n'TCB', 'X'\ -,\n'TCH', 'X',\n'TCK', 'X',\n'TCL', 'X',\n'TCM', '\ -X',\n'TCN', 'X',\n'TCP', 'X',\n'TCR', 'W',\n'TCS',\ - 'X',\n'TCZ', 'X',\n'TDA', 'X',\n'TDB', 'X',\n'TDG\ -', 'X',\n'TDP', 'X',\n'TDR', 'X',\n'TDX', 'X',\n'T\ -EA', 'X',\n'TEM', 'X',\n'TEN', 'X',\n'TEO', 'X',\n\ -'TEP', 'X',\n'TER', 'X',\n'TES', 'X',\n'TET', 'X',\ -\n'TFA', 'X',\n'TFB', 'X',\n'TFH', 'X',\n'TFI', 'X\ -',\n'TFK', 'X',\n'TFP', 'X',\n'THA', 'X',\n'THB', \ -'X',\n'THC', 'T',\n'THD', 'X',\n'THE', 'X',\n'THF'\ -, 'X',\n'THJ', 'X',\n'THK', 'X',\n'THM', 'X',\n'TH\ -N', 'X',\n'THO', 'T',\n'THP', 'X',\n'THQ', 'X',\n'\ -THR', 'T',\n'THS', 'X',\n'THT', 'X',\n'THU', 'X',\\ -n'THX', 'X',\n'THZ', 'X',\n'TI1', 'X',\n'TI2', 'X'\ -,\n'TI3', 'P',\n'TIA', 'X',\n'TIH', 'A',\n'TK4', '\ -X',\n'TLA', 'X',\n'TLC', 'X',\n'TLM', 'X',\n'TLN',\ - 'X',\n'TLX', 'X',\n'TM5', 'X',\n'TM6', 'X',\n'TMA\ -', 'X',\n'TMB', 'T',\n'TMC', 'X',\n'TMD', 'T',\n'T\ -ME', 'X',\n'TMF', 'X',\n'TML', 'K',\n'TMM', 'X',\n\ -'TMN', 'X',\n'TMP', 'X',\n'TMQ', 'X',\n'TMR', 'X',\ -\n'TMT', 'X',\n'TMZ', 'X',\n'TNB', 'C',\n'TND', 'X\ -',\n'TNK', 'X',\n'TNP', 'X',\n'TNT', 'X',\n'TOA', \ -'X',\n'TOB', 'X',\n'TOC', 'X',\n'TOL', 'X',\n'TOP'\ -, 'X',\n'TOS', 'X',\n'TOT', 'X',\n'TP1', 'G',\n'TP\ -2', 'P',\n'TP3', 'E',\n'TP4', 'E',\n'TP7', 'T',\n'\ -TPA', 'X',\n'TPE', 'X',\n'TPF', 'X',\n'TPI', 'X',\\ -n'TPL', 'W',\n'TPM', 'X',\n'TPN', 'G',\n'TPO', 'T'\ -,\n'TPP', 'X',\n'TPQ', 'A',\n'TPR', 'P',\n'TPS', '\ -X',\n'TPT', 'X',\n'TPV', 'X',\n'TPX', 'X',\n'TPY',\ - 'X',\n'TQ3', 'X',\n'TQ4', 'X',\n'TQ5', 'X',\n'TQ6\ -', 'X',\n'TR1', 'X',\n'TRA', 'X',\n'TRB', 'X',\n'T\ -RC', 'X',\n'TRD', 'X',\n'TRE', 'X',\n'TRF', 'W',\n\ -'TRG', 'K',\n'TRH', 'X',\n'TRI', 'X',\n'TRJ', 'X',\ -\n'TRM', 'X',\n'TRN', 'W',\n'TRO', 'W',\n'TRP', 'W\ -',\n'TRQ', 'X',\n'TRS', 'X',\n'TRX', 'W',\n'TRZ', \ -'X',\n'TS2', 'X',\n'TS3', 'X',\n'TS4', 'X',\n'TS5'\ -, 'X',\n'TSA', 'X',\n'TSB', 'X',\n'TSI', 'X',\n'TS\ -M', 'X',\n'TSN', 'X',\n'TSP', 'X',\n'TSU', 'X',\n'\ -TTA', 'X',\n'TTE', 'X',\n'TTN', 'X',\n'TTO', 'X',\\ -n'TTP', 'X',\n'TTX', 'X',\n'TXL', 'X',\n'TYA', 'Y'\ -,\n'TYB', 'Y',\n'TYD', 'X',\n'TYI', 'Y',\n'TYL', '\ -X',\n'TYM', 'W',\n'TYN', 'Y',\n'TYQ', 'Y',\n'TYR',\ - 'Y',\n'TYS', 'Y',\n'TYV', 'X',\n'TYY', 'A',\n'TZB\ -', 'X',\n'TZC', 'X',\n'TZE', 'X',\n'TZL', 'X',\n'T\ -ZO', 'X',\n'TZP', 'X',\n'U01', 'X',\n'U02', 'X',\n\ -'U03', 'X',\n'U04', 'X',\n'U05', 'X',\n'U0E', 'X',\ -\n'U10', 'X',\n'U18', 'X',\n'U2G', 'X',\n'U3P', 'X\ -',\n'U49', 'X',\n'U55', 'X',\n'U5P', 'X',\n'U66', \ -'X',\n'U89', 'X',\n'U8U', 'X',\n'UAA', 'X',\n'UAG'\ -, 'A',\n'UAP', 'X',\n'UAR', 'X',\n'UC1', 'X',\n'UC\ -2', 'X',\n'UC3', 'X',\n'UC4', 'X',\n'UD1', 'X',\n'\ -UD2', 'X',\n'UDP', 'X',\n'UDX', 'X',\n'UFG', 'X',\\ -n'UFM', 'X',\n'UFP', 'X',\n'UGA', 'X',\n'UIN', 'X'\ -,\n'UKP', 'A',\n'UM3', 'X',\n'UMA', 'A',\n'UMG', '\ -X',\n'UMP', 'X',\n'UNA', 'X',\n'UND', 'X',\n'UNI',\ - 'X',\n'UNK', 'X',\n'UNN', 'X',\n'UNX', 'X',\n'UP5\ -', 'X',\n'UP6', 'X',\n'UPA', 'X',\n'UPF', 'X',\n'U\ -PG', 'X',\n'UPP', 'X',\n'UQ1', 'X',\n'UQ2', 'X',\n\ -'UQ6', 'X',\n'UR2', 'X',\n'URA', 'X',\n'URE', 'X',\ -\n'URF', 'X',\n'URI', 'X',\n'URS', 'X',\n'UTP', 'X\ -',\n'UVC', 'X',\n'UVW', 'X',\n'V35', 'X',\n'V36', \ -'X',\n'V4O', 'X',\n'V7O', 'X',\n'VAA', 'V',\n'VAC'\ -, 'X',\n'VAD', 'V',\n'VAF', 'V',\n'VAG', 'X',\n'VA\ -L', 'V',\n'VAN', 'X',\n'VAS', 'X',\n'VAX', 'X',\n'\ -VDX', 'X',\n'VDY', 'X',\n'VG1', 'X',\n'VIB', 'X',\\ -n'VIR', 'X',\n'VIT', 'X',\n'VK3', 'X',\n'VO3', 'X'\ -,\n'VO4', 'X',\n'VS1', 'F',\n'VS2', 'F',\n'VS3', '\ -F',\n'VS4', 'F',\n'VXA', 'X',\n'W01', 'X',\n'W02',\ - 'X',\n'W03', 'X',\n'W11', 'X',\n'W33', 'X',\n'W35\ -', 'X',\n'W42', 'X',\n'W43', 'X',\n'W54', 'X',\n'W\ -56', 'X',\n'W59', 'X',\n'W71', 'X',\n'W84', 'X',\n\ -'W8R', 'X',\n'W91', 'X',\n'WAY', 'X',\n'WCC', 'X',\ -\n'WO2', 'X',\n'WO4', 'X',\n'WRB', 'X',\n'WRR', 'X\ -',\n'WRS', 'X',\n'WW7', 'X',\n'X2F', 'X',\n'X7O', \ -'X',\n'XAA', 'X',\n'XAN', 'X',\n'XAO', 'X',\n'XBB'\ -, 'X',\n'XBP', 'X',\n'XDN', 'X',\n'XDP', 'X',\n'XI\ -F', 'X',\n'XIM', 'X',\n'XK2', 'X',\n'XL1', 'X',\n'\ -XLS', 'X',\n'XMP', 'X',\n'XN1', 'X',\n'XN2', 'X',\\ -n'XN3', 'X',\n'XUL', 'X',\n'XV6', 'X',\n'XYD', 'X'\ -,\n'XYH', 'X',\n'XYL', 'X',\n'XYP', 'X',\n'XYS', '\ -X',\n'YOF', 'Y',\n'YRR', 'X',\n'YT3', 'X',\n'YZ9',\ - 'X',\n'Z34', 'G',\n'Z5A', 'X',\n'ZAF', 'X',\n'ZAP\ -', 'X',\n'ZEB', 'X',\n'ZEN', 'X',\n'ZES', 'X',\n'Z\ -ID', 'X',\n'ZMR', 'X',\n'ZN3', 'X',\n'ZNH', 'X',\n\ -'ZNO', 'X',\n'ZO3', 'X',\n'ZPR', 'P',\n'ZRA', 'A',\ -\n'ZST', 'X',\n'ZYA', 'A',\n\n\n'ASN','N');\n} \n \ - \n\n\n","use Cwd;\nuse File::Path;\nuse FileHand\ -le;\nuse strict;\n\n\nour (%MODE, %PG, %ENV_SET, %\ -SUPPORTED_OS);\n\n\nour $EXIT_SUCCESS=0;\nour $EXI\ -T_FAILURE=1;\nour $INTERNET=0;\n\nour $CP=\"cp \";\ - #was causing a crash on MacOSX\nour $SILENT=\">/d\ -ev/null 2>/dev/null\";\nour $WEB_BASE=\"http://www\ -.tcoffee.org\";\nour $TCLINKDB_ADDRESS=\"$WEB_BASE\ -/Resources/tclinkdb.txt\";\nour $OS=get_os();\nour\ - $ROOT=&get_root();\nour $CD=cwd();\nour $CDIR=$CD\ -;\nour $HOME=$ENV{'HOME'};\nour $CXX=\"g++\";\nour\ - $CXXFLAGS=\"\";\n\nour $CPP=\"g++\";\nour $CPPFLA\ -GS=\"\";\n\nour $CC=\"gcc\";\nour $CFLAGS=\"\";\n\\ -nour $FC=\"f77\";\nour $FFLAGS=\"\";\n\nmy $instal\ -l=\"all\";\nmy $default_update_action=\"no_update\\ -";\nmy @required_applications=(\"wget_OR_curl\");\\ -nmy @smode=(\"all\", \"clean\", \"install\");\n\n&\ -initialize_PG();\n\nmy $cl=join( \" \", @ARGV);\ni\ -f ($#ARGV==-1 || ($cl=~/-h/) ||($cl=~/-H/) )\n {\\ -n print \"\\n!!!!!!! ./install t_coffee \ - --> installs t_coffee only\";\n print \\ -"\\n!!!!!!! ./install all --> in\ -stalls all the modes [mcoffee, expresso, psicoffee\ -,rcoffee..]\";\n print \"\\n!!!!!!! ./install \ - [mcoffee|rcoffee|..] --> installs the specified m\ -ode\";\n print \"\\n!!!!!!! ./install -h \ - --> print usage\\n\\n\";\n if ( \ -$#ARGV==-1){exit ($EXIT_FAILURE);}\n }\n \ni\ -f (($cl=~/-h/) ||($cl=~/-H/) )\n {\n my $m;\n \ - print \"\\n\\n!!!!!!! advanced mode\\n\";\n \ -foreach $m ((keys (%MODE)),@smode)\n {\n prin\ -t \"!!!!!!! ./install $m\\n\";\n }\n \ - \n print \"!!!!!!! ./install [target:package|m\ -ode|] [-update|-force|-exec=dir|-dis=dir|-root|-tc\ -linkdb=file|-] [CC=|FCC=|CXX=|CFLAGS=|CXXFLAGS=]\\\ -n\";\n print \"!!!!!!! ./install clean [remo\ -ves all executables]\\n\";\n print \"!!!!!!! ./\ -install [optional:target] -update [u\ -pdates package already installed]\\n\";\n print\ - \"!!!!!!! ./install [optional:target] -force \ - [Forces recompilation over everything]\\ -\n\";\n \n print \"!!!!!!! ./install [option\ -al:target] -root [You are running \ -as root]\\n\";\n print \"!!!!!!! ./install [opt\ -ional:target] -exec=/foo/bar/ [address for t\ -he T-Coffee executable]\\n\";\n print \"!!!!!!!\ - ./install [optional:target] -dis=/foo/bar/ \ - [Address where distributions should be stored]\\n\ -\";\n print \"!!!!!!! ./install [optional:targe\ -t] -tclinkdb=foo|update [file containing all the \ -packages to be installed]\\n\";\n print \"!!!!!\ -!! ./install [optional:target] -tclinkdb=foo|updat\ -e [file containing all the packages to be install\ -ed]\\n\";\n print \"!!!!!!! ./install [optional\ -:target] -clean [clean everything]\\ -\n\";\n print \"!!!!!!! ./install [optional:tar\ -get] -plugins [plugins directory]\\n\\ -";\n print \"!!!!!!! mode:\";\n foreach $m (\ -keys(%MODE)){print \"$m \";}\n print \"\\n\";\n\ - print \"!!!!!!! Packages:\";\n foreach $m (\ -keys (%PG)){print \"$m \";}\n print \"\\n\";\n \ - \n print \"\\n\\n\";\n exit ($EXIT_FAILUR\ -E);\n }\n\n\n\nmy (@argl)=($cl=~/(\\S+=[^=]+)\\s\\ -\w+=/g);\npush (@argl, ($cl=~/(\\S+=[^=]+\\S)\\s*$\ -/g));\n\nforeach $a (@argl)\n {\n if ( ($cl=~/\ -CXX=(.*)/)){$CXX=$1;}\n if ( ($cl=~/-CC=(.*)/ \ - )){$CC=$1;}\n if ( ($cl=~/-FC=(.*)/ )){$FC\ -=$1;}\n if ( ($cl=~/-CFLAGS=(.*)/)){$CFLAGS=$1;\ -}\n if ( ($cl=~/-CXXFLAGS=(.*)/)){$CXXFLAGS=$1;\ -}\n }\nour ($ROOT_INSTALL, $NO_QUESTION, $default\ -_update_action,$BINARIES_ONLY,$force, $default_upd\ -ate_action, $INSTALL_DIR, $PLUGINS_DIR, $DISTRIBUT\ -IONS,$tclinkdb, $proxy, $clean);\nif ( ($cl=~/-roo\ -t/)){$ROOT_INSTALL=1;}\nif ( ($cl=~/-no_question/)\ -){$NO_QUESTION=1;}\nif ( ($cl=~/-update/)){$defaul\ -t_update_action=\"update\";}\nif ( ($cl=~/-binarie\ -s/)){$BINARIES_ONLY=1;}\nif ( ($cl=~/-force/)){$fo\ -rce=1;$default_update_action=\"update\"}\nif ( ($c\ -l=~/-exec=\\s*(\\S+)/)){$INSTALL_DIR=$1;}\nif ( ($\ -cl=~/-plugins=\\s*(\\S+)/)){$PLUGINS_DIR=$1;}\nif \ -( ($cl=~/-dis=\\s*(\\S+)/)){$DISTRIBUTIONS=$1;}\n\\ -nif ( ($cl=~/-tclinkdb=\\s*(\\S+)/)){$tclinkdb=$1;\ -}\nif ( ($cl=~/-proxy=\\s*(\\S+)/)){$proxy=$1;}\ni\ -f ( ($cl=~/-clean/)){$clean=1;}\nif ($tclinkdb){&u\ -pdate_tclinkdb ($tclinkdb);}\n\nour $TCDIR=$ENV{DI\ -R_4_TCOFFEE};\nour $TCCACHE=$ENV{CACHE_4_TCOFFEE};\ -\nour $TCTMP=$ENV{CACHE_4_TCOFFEE};\nour $TCM=$ENV\ -{MCOFFEE_4_TCOFFEE};\nour $TCMETHODS=$ENV{METHODS_\ -4_TCOFFEE};\nour $TCPLUGINS=$ENV{PLUGINS_4_TCOFFEE\ -};\nour $PLUGINS_DIR=\"\";\nour $INSTALL_DIR=\"\";\ -\n\n&add_dir ($TCDIR=\"$HOME/.t_coffee\");\n&add_d\ -ir ($TCCACHE=\"$TCDIR/cache\");\n&add_dir ($TCTMP=\ -\"$CDIR/tmp\");\n&add_dir ($TCM=\"$TCDIR/mcoffee\"\ -);\n&add_dir ($TCMETHODS=\"$TCDIR/methods\");\n&ad\ -d_dir ($TCPLUGINS=\"$TCDIR/plugins/$OS\");\n\n\nou\ -r $BASE=\"$CD/bin\";\nour $BIN=\"$BASE/binaries/$O\ -S\";\nour $DOWNLOAD_DIR=\"$BASE/download\";\nour $\ -DOWNLOAD_FILE=\"$DOWNLOAD_DIR/files\";\nour $TMP=\\ -"$BASE/tmp\";\n\n&add_dir($BASE);\n&add_dir($BIN);\ -\n&add_dir($DOWNLOAD_DIR);\n&add_dir($DOWNLOAD_FIL\ -E);\nif (!$DISTRIBUTIONS){$DISTRIBUTIONS=\"$DOWNLO\ -AD_DIR/distributions\";}\n&add_dir ($DISTRIBUTIONS\ -);\n&add_dir ($TMP);\n\n\nif (!$PLUGINS_DIR && \ -!$ROOT_INSTALL){$PLUGINS_DIR=$TCPLUGINS;}\nelsif (\ -!$PLUGINS_DIR && $ROOT_INSTALL){$PLUGINS_DIR=\"/u\ -sr/local/bin/\";}\n\nif (!$INSTALL_DIR && !$ROO\ -T_INSTALL){$INSTALL_DIR=\"$HOME/bin/\";mkpath ($IN\ -STALL_DIR);}\nelsif (!$INSTALL_DIR && $ROOT_INSTA\ -LL){$INSTALL_DIR=\"/usr/local/bin/\";}\n\nif (-d \\ -"mcoffee\"){`cp mcoffee/* $TCM`;}\n\n\nour $ENV_FI\ -LE=\"$TCDIR/t_coffee_env\";\n&env_file2putenv ($EN\ -V_FILE);\n&set_proxy($proxy);\nmy ($target, $p, $r\ -);\n$target=$p;\n\nforeach $p ( ((keys (%PG)),(ke\ -ys(%MODE)),(@smode)) )\n {\n if ($ARGV[0] eq $\ -p && $target eq \"\"){$target=$p;}\n }\nif ($targ\ -et eq \"\"){exit ($EXIT_FAILURE);}\n\n\nforeach $r\ - (@required_applications)\n {\n my @app_list;\\ -n my $i;\n $i=0;\n \n @app_list=split \ -(/_OR_/, $r);\n foreach my $pg (@app_list)\n \ - {\n $i+=&pg_is_installed ($pg);\n }\n i\ -f ($i==0)\n {\n print \"One of the follo\ -wing packages must be installed to proceed: \";\n \ - foreach my $pg (@app_list)\n {\n print (\"$\ -pg \");\n }\n die;\n }\n }\n\n\n\n\n\n\n&\ -sign_license_ni();\n\n\n$PG{C}{compiler}=get_C_com\ -piler($CC);\n$PG{Fortran}{compiler}=get_F_compiler\ -($FC);\n$PG{CXX}{compiler}=$PG{CPP}{compiler}=$PG{\ -GPP}{compiler}=get_CXX_compiler($CXX);\nif ($CXXFL\ -AGS){$PG{CPP}{options}=$PG{GPP}{options}=$PG{CXX}{\ -options}=$CXXFLAGS;}\nif ($CFLAGS){$PG{C}{options}\ -=$CFLAGS;}\nforeach my $c (keys(%PG))\n {\n my\ - $arguments;\n if ($PG{$c}{compiler})\n {\\ -n $arguments=\"$PG{$c}{compiler_flag}=$PG{$c}{comp\ -iler} \";\n if ($PG{$c}{options})\n {\n $arg\ -uments.=\"$PG{$c}{options_flag}=$PG{$c}{options} \\ -";\n }\n $PG{$c}{arguments}=$arguments;\n }\ -\n }\n\nif ($PG{$target}){$PG{$target}{install}=1\ -;}\nelse\n {\n foreach my $pg (keys(%PG))\n \ - {\n if ( $target eq \"all\" || ($PG{$pg}{mode}=\ -~/$target/))\n {\n $PG{$pg} {install}=1;\n \ - }\n }\n }\n\nforeach my $pg (keys(%PG))\n \ -{\n if (!$PG{$pg}{update_action}){$PG{$pg}{upda\ -te_action}=$default_update_action;}\n elsif ($P\ -G{$pg}{update_action} eq \"never\"){$PG{$pg}{insta\ -ll}=0;}\n if ( $force && $PG{$pg}{install})\n \ - {\n `rm $BIN/$pg $BIN/$pg.exe $SILENT`;\n \ - }\n if ($PG{$pg}{update_action} eq \"update\" \ -&& $PG{$pg}{install}){$PG{$pg}{update}=1;}\n }\n\\ -nif (($target=~/clean/))\n {\n print \"-------\ - cleaning executables -----\\n\";\n `rm bin/* $\ -SILENT`;\n exit ($EXIT_SUCCESS);\n }\n\nif ( !\ -$PG{$target}){print \"------- Installing T-Coffee \ -Modes\\n\";}\n\nforeach my $m (keys(%MODE))\n {\n\ - if ( $target eq \"all\" || $target eq $m)\n \ - {\n print \"\\n------- The installer will now i\ -nstall the $m components $MODE{$m}{description}\\n\ -\";\n foreach my $pg (keys(%PG))\n {\n if ( \ -$PG{$pg}{mode} =~/$m/ && $PG{$pg}{install})\n \ - {\n if ($PG{$pg}{touched}){print \"------- $PG{\ -$pg}{dname}: already processed\\n\";}\n else {$PG\ -{$pg}{success}=&install_pg($pg);$PG{$pg}{touched}=\ -1;}\n }\n }\n }\n }\n\nif ( $PG{$tar\ -get}){print \"------- Installing Individual Packag\ -e\\n\";}\nforeach my $pg (keys (%PG))\n {\n \n\ - if ( $PG{$pg}{install} && !$PG{$pg}{touched})\\ -n {\n print \"\\n------- Install $pg\\n\";\n \ -$PG{$pg}{success}=&install_pg($pg);$PG{$pg}{touche\ -d}=1;\n }\n }\nprint \"------- Finishing The\ - installation\\n\";\nmy $final_report=&install ($I\ -NSTALL_DIR);\n\nprint \"\\n\";\nprint \"**********\ -**************************************************\ -*********\\n\";\nprint \"******** INS\ -TALLATION SUMMARY *****************\\n\";\ -\nprint \"****************************************\ -*****************************\\n\";\nprint \"-----\ --- SUMMARY package Installation:\\n\";\nforeach my\ - $pg (keys(%PG))\n {\n if ( $PG{$pg}{install})\ -\n {\n my $bin_status=($PG{$pg}{from_binary} \ -&& $PG{$pg}{success})?\"[from binary]\":\"\";\n if\ - ( $PG{$pg}{new} && !$PG{$pg}{old}) \ - {print \"*------ $PG{$pg}{dname}:\ - installed $bin_status\\n\"; $PG{$pg}{status}=1;}\\ -n elsif ( $PG{$pg}{new} && $PG{$pg}{old}) \ - {print \"*------ $PG{$pg}{dna\ -me}: updated $bin_status\\n\" ; $PG{$pg}{status}=\ -1;} \n elsif (!$PG{$pg}{new} && $PG{$pg}{old} &&\ - !$PG{$pg}{update}){print \"*------ $PG{$pg\ -}{dname}: previous\\n\" ; $PG{$pg}{status}=1;}\n e\ -lsif (!$PG{$pg}{new} && $PG{$pg}{old} && $PG{$p\ -g}{update}){print \"*------ $PG{$pg}{dname}\ -: failed update (previous installation available)\\ -\n\";$PG{$pg}{status}=0;}\n else \ - {print \"*\ ------- $PG{$pg}{dname}: failed installation\ -\";$PG{$pg}{status}=0;}\n }\n }\n\nif ( !$PG\ -{$target}){print \"*------ SUMMARY mode Installati\ -on:\\n\";}\nforeach my $m (keys(%MODE))\n {\n \ -if ( $target eq \"all\" || $target eq $m)\n {\ -\n my $succesful=1;\n foreach my $pg (keys(%PG))\n\ - {\n if (($PG{$pg}{mode}=~/$m/) && $PG{$pg}{\ -install} && $PG{$pg}{status}==0)\n {\n $suc\ -cesful=0;\n print \"*!!!!!! $PG{$pg}{dname}\ -: Missing\\n\";\n }\n }\n if ( $succesful)\ -\n {\n $MODE{$m}{status}=1;\n print \"*-\ ------ MODE $MODE{$m}{dname} SUCCESFULY insta\ -lled\\n\";\n }\n else\n {\n $MODE{$m}{stat\ -us}=0;\n print \"*!!!!!! MODE $MODE{$m}{\ -dname} UNSUCCESFULY installed\\n\";\n }\n }\ -\n }\n\nif ($clean==1 && ($BASE=~/install4tcoffee\ -/) ){print \"*------ Clean Installation Directory:\ - $BASE\\n\";`rm -rf $BASE`;}\nforeach my $pg (keys\ -(%PG)){if ($PG{$pg}{install} && $PG{$pg}{status}==\ -0){exit ($EXIT_FAILURE);}}\nexit ($EXIT_SUCCESS); \ - \n\nsub get_CXX_compiler\n {\n my $c=@_[0];\n\ - my (@clist)=(\"g++\");\n \n return get_c\ -ompil ($c, @clist);\n }\nsub get_C_compiler\n {\n\ - my $c=@_[0];\n my (@clist)=(\"gcc\", \"cc\"\ -, \"icc\");\n \n return get_compil ($c, @cli\ -st);\n }\n\nsub get_F_compiler\n {\n my ($c)=@\ -_[0];\n my @clist=(\"f77\", \"g77\", \"gfortran\ -\", \"ifort\");\n return get_compil ($c, @clist\ -);\n } \n \nsub get_compil\n {\n my ($f\ -av,@clist)=(@_);\n \n #return the first comp\ -iler found installed in the system. Check first th\ -e favorite\n foreach my $c ($fav,@clist)\n \ - {\n if (&pg_is_installed ($c)){return $c;}\n \ - }\n return \"\";\n }\nsub exit_if_pg_not_ins\ -talled\n {\n my (@arg)=(@_);\n \n foreac\ -h my $p (@arg)\n {\n if ( !&pg_is_installed (\ -$p))\n {\n print \"!!!!!!!! The $p utility m\ -ust be installed for this installation to proceed \ -[FATAL]\\n\";\n die;\n }\n }\n retur\ -n 1;\n }\nsub set_proxy\n {\n my ($proxy)=(@_\ -);\n my (@list,$p);\n \n @list= (\"HTTP_p\ -roxy\", \"http_proxy\", \"HTTP_PROXY\", \"ALL_prox\ -y\", \"all_proxy\",\"HTTP_proxy_4_TCOFFEE\",\"http\ -_proxy_4_TCOFFEE\");\n \n if (!$proxy)\n \ - {\n foreach my $p (@list)\n {\n if ( ($ENV\ -_SET{$p}) || $ENV{$p}){$proxy=$ENV{$p};}\n }\n \ - }\n foreach my $p(@list){$ENV{$p}=$proxy;}\\ -n }\n \nsub check_internet_connection\n {\n m\ -y $internet;\n \n if ( -e \"x\"){unlink (\"x\ -\");}\n if (&pg_is_installed (\"wget\"))\ -{`wget www.google.com -Ox >/dev/null 2>/dev/null`;\ -}\n elsif (&pg_is_installed (\"curl\")){`cu\ -rl www.google.com -ox >/dev/null 2>/dev/null`;}\n \ - else\n {\n printf stderr \"\\nERROR: No pg\ - for remote file fetching [wget or curl][FATAL]\\n\ -\";\n exit ($EXIT_FAILURE);\n }\n \n if\ - ( !-e \"x\" || -s \"x\" < 10){$internet=0;}\n \ -else {$internet=1;}\n if (-e \"x\"){unlink \"x\\ -";}\n return $internet;\n }\nsub url2file\n {\ -\n my ($cmd, $file,$wget_arg, $curl_arg)=(@_);\\ -n my ($exit,$flag, $pg, $arg);\n \n if ($\ -INTERNET || check_internet_connection ()){$INTERNE\ -T=1;}\n else\n {\n print STDERR \"ERROR: N\ -o Internet Connection [FATAL:install.pl]\\n\";\n e\ -xit ($EXIT_FAILURE);\n }\n \n if (&\ -pg_is_installed (\"wget\")){$pg=\"wget\"; $flag\ -=\"-O\";$arg=$wget_arg;}\n elsif (&pg_is_insta\ -lled (\"curl\")){$pg=\"curl\"; $flag=\"-o\";$ar\ -g=$curl_arg;}\n else\n {\n printf stderr \\ -"\\nERROR: No pg for remote file fetching [wget or\ - curl][FATAL]\\n\";\n exit ($EXIT_FAILURE);\n \ - }\n \n \n if (-e $file){unlink($file);}\\ -n $exit=system \"$pg $cmd $flag$file $arg\";\n \ - return $exit;\n }\n\nsub pg_is_installed\n {\\ -n my ($p, $dir)=(@_);\n my ($r,$m);\n my \ -($supported, $language, $compil);\n \n if ( \ -$PG{$p})\n {\n $language=$PG{$p}{language2};\\ -n $compil=$PG{$language}{compiler};\n }\n \ -\n if ( $compil eq \"CPAN\")\n {\n if ( sy\ -stem (\"perl -M$p -e 1\")==$EXIT_SUCCESS){return 1\ -;}\n else {return 0;}\n }\n elsif ($dir)\n\ - {\n if (-e \"$dir/$p\" || -e \"$dir/$p\\.exe\ -\"){return 1;}\n else {return 0;}\n }\n el\ -sif (-e \"$PLUGINS_DIR/$p\" || -e \"$PLUGINS_DIR/$\ -p.exe\"){return 1;}\n else\n {\n $r=`which\ - $p 2>/dev/null`;\n if ($r eq \"\"){return 0;}\n e\ -lse {return 1;}\n }\n return 0;\n }\nsub \ -install\n {\n my ($new_bin)=(@_);\n my ($co\ -pied, $report);\n\n \n if (!$ROOT_INSTALL)\n\ - {\n \n if (-e \"$BIN/t_coffee\"){`$CP $BIN/t\ -_coffee $INSTALL_DIR`};\n `cp $BIN/* $PLUGINS_DIR`\ -;\n $copied=1;\n }\n else\n {\n $copi\ -ed=&root_run (\"You must be root to finalize the i\ -nstallation\", \"$CP $BIN/* $INSTALL_DIR $SILENT\"\ -);\n }\n \n \n if ( !$copied)\n {\\ -n $report=\"*!!!!!! Installation unsuccesful.\ - The executables have been left in $BASE/bin\\n\";\ -\n }\n elsif ( $copied && $ROOT)\n {\n \ - $report=\"*------ Installation succesful. Your ex\ -ecutables have been copied in $new_bin and are on \ -your PATH\\n\";\n }\n elsif ( $copied && !$ROO\ -T)\n {\n $report= \"*!!!!!! T-Coffee and a\ -ssociated packages have been copied in: $new_bin\\\ -n\";\n $report.=\"*!!!!!! This address is NOT\ - in your PATH sytem variable\\n\";\n $report.\ -=\"*!!!!!! You can do so by adding the following l\ -ine in your ~/.bashrc file:\\n\";\n $report.=\ -\"*!!!!!! export PATH=$new_bin:\\$PATH\\n\";\n \ -}\n return $report;\n}\n\nsub sign_license_ni\n \ -{\n my $F=new FileHandle;\n open ($F, \"lice\ -nse.txt\");\n while (<$F>)\n {\n print \"$\ -_\";\n }\n close ($F);\n \n return;\\ -n }\n\nsub install_pg\n {\n my ($pg)=(@_);\n \ - my ($report, $previous, $language, $compiler, $\ -return);\n \n if (!$PG{$pg}{install}){return\ - 1;}\n \n $previous=&pg_is_installed ($pg);\\ -n \n if ($PG{$pg}{update_action} eq \"no_upd\ -ate\" && $previous)\n {\n $PG{$pg}{old}=1;\n \ -$PG{$pg}{new}=0;\n $return=1;\n }\n else\n\ - {\n $PG{$pg}{old}=$previous;\n \n if ($PG{$p\ -g} {language2} eq \"Perl\"){&install_perl_package \ -($pg);}\n elsif ($BINARIES_ONLY && &install_binary\ -_package ($pg)){$PG{$pg}{from_binary}=1;}\n elsif \ -(&install_source_package ($pg)){;}\n else \n {\n\ - \n if (!&supported_os($OS))\n {\n \ -print \"!!!!!!!! $pg compilation failed, binary un\ -supported for $OS\\n\"; \n }\n elsif (!(\ -$PG{$pg}{from_binary}=&install_binary_package ($pg\ -)))\n {\n print \"!!!!!!!! $pg compilation \ -and binary installation failed\\n\";\n }\n \ - }\n $PG{$pg}{new}=$return=&pg_is_installed ($pg,\ -$BIN);\n }\n\n \n return $return;\n }\\ -nsub install_perl_package\n {\n my ($pg)=(@_);\ -\n my ($report, $language, $compiler);\n \n \ - $language=$PG{$pg} {language2};\n $compiler=\ -$PG{$language}{compiler};\n \n if (!&pg_is_i\ -nstalled ($pg))\n {\n if ( $OS eq \"windows\"\ -){`perl -M$compiler -e 'install $pg'`;}\n elsif ( \ -$ROOT eq \"sudo\"){system (\"sudo perl -M$compiler\ - -e 'install $pg'\");}\n else {system (\"su root -\ -c perl -M$compiler -e 'install $pg'\");}\n }\\ -n return &pg_is_installed ($pg);\n }\n\n\n\nsu\ -b install_source_package\n {\n my ($pg)=(@_);\\ -n my ($report, $download, $arguments, $language\ -, $address, $name, $ext, $main_dir, $distrib);\n \ - my $wget_tmp=\"$TMP/wget.tmp\";\n my (@fl);\n\ - if ( -e \"$BIN/$pg\" || -e \"$BIN/$pg.exe\"){r\ -eturn 1;}\n \n if ($pg eq \"t_coffee\") {re\ -turn &install_t_coffee ($pg);}\n elsif ($pg e\ -q \"TMalign\"){return &install_TMalign ($pg);}\n\ - \n chdir $DISTRIBUTIONS;\n \n $downlo\ -ad=$PG{$pg}{source};\n \n if (($download =~/\ -tgz/))\n {\n ($address,$name,$ext)=($download\ -=~/(.+\\/)([^\\/]+)(\\.tgz)/);\n }\n elsif\ - (($download=~/tar\\.gz/))\n {\n ($address,$n\ -ame,$ext)=($download=~/(.+\\/)([^\\/]+)(\\.tar\\.g\ -z)/);\n }\n elsif (($download=~/tar/))\n \ - {\n ($address,$name,$ext)=($download=~/(.+\\/)\ -([^\\/]+)(\\.tar)/);\n }\n else\n {\n\ - ($address,$name)=($download=~/(.+\\/)([^\\/]+)/);\ -\n $ext=\"\";\n }\n $distrib=\"$name$ext\"\ -;\n \n if ( !-d $pg){mkdir $pg;}\n chdir \ -$pg;\n \n #get the distribution if available\\ -n if ( -e \"$DOWNLOAD_DIR/$distrib\")\n {\\ -n `$CP $DOWNLOAD_DIR/$distrib .`;\n }\n #U\ -NTAR and Prepare everything\n if (!-e \"$name.t\ -ar\" && !-e \"$name\")\n {\n &check_rm ($wget\ -_tmp);\n print \"\\n------- Downloading/Installing\ - $pg\\n\";\n if (!-e $distrib && &url2file (\"$dow\ -nload\", \"$wget_tmp\")==$EXIT_SUCCESS)\n {\n \ - \n `mv $wget_tmp $distrib`;\n `$CP $dist\ -rib $DOWNLOAD_DIR/`;\n }\n\n if (!-e $distrib)\n\ - {\n print \"!!!!!!! Download of $pg distrib\ -ution failed\\n\";\n print \"!!!!!!! Check Add\ -ress: $PG{$pg}{source}\\n\";\n return 0;\n }\ -\n print \"\\n------- unzipping/untaring $name\\n\\ -";\n if (($ext =~/z/))\n { \n &flush_command\ - (\"gunzip $name$ext\");\n \n }\n if (($ext \ -=~/tar/) || ($ext =~/tgz/))\n {\n &flush_com\ -mand(\"tar -xvf $name.tar\");\n }\n }\n \ -#Guess and enter the distribution directory\n @\ -fl=ls($p);\n foreach my $f (@fl)\n {\n if \ -(-d $f)\n {\n $main_dir=$f;\n }\n }\n\ - if (-d $main_dir)\n {chdir $main_dir;}\n \ -\n print \"\\n------- Compiling/Installing $pg\\ -\n\";\n `make clean $SILENT`;\n #sap\n if\ - ($pg eq \"sap\")\n {\n `rm *.o sap sap.exe \ -./util/aa/*.o ./util/wt/.o $SILENT`;\n &flush_com\ -mand (\"make $arguments sap\");\n &check_cp ($pg, \ -\"$BIN\");\n }\n elsif ($pg eq \"clustalw2\ -\")\n {\n &flush_command(\"./configure\");\n \ -&flush_command(\"make $arguments\");\n &check_cp (\ -\"./src/$pg\", \"$BIN\");\n \n }\n elsif (\ -$pg eq \"clustalw\")\n {\n &flush_command(\"m\ -ake $arguments clustalw\");\n `$CP $pg $BIN $SILEN\ -T`;\n }\n \n elsif ($pg eq \"mafft\")\n\ - {\n my $base=cwd();\n my $c;\n \n #compile c\ -ore\n mkpath (\"./mafft/bin\");\n mkpath (\"./maff\ -t/lib\");\n chdir \"$base/core\";\n `make clean $S\ -ILENT`;\n &flush_command (\"make $arguments\");\n \ -&flush_command (\"make install LIBDIR=../mafft/lib\ - BINDIR=../mafft/bin\");\n \n #compile extension\n\ - chdir \"$base/extensions\";\n `make clean $SILENT\ -`;\n &flush_command (\"make $arguments\");\n &flus\ -h_command (\"make install LIBDIR=../mafft/lib BIND\ -IR=../mafft/bin\");\n \n #put everything in mafft \ -and copy the coompiled stuff in bin\n chdir \"$bas\ -e\";\n if ($ROOT_INSTALL)\n {\n &root_run (\\ -"You Must be Roor to Install MAFFT\\n\", \"mkdir /\ -usr/local/mafft/;$CP mafft/lib/* /usr/local/mafft;\ -$CP mafft/lib/mafft* /usr/local/bin ;$CP mafft/bin\ -/mafft /usr/local/bin/; \");\n }\n else\n {\n \ - `$CP mafft/lib/* $BIN`;\n `$CP mafft/bin/\ -mafft $BIN`;\n }\n `tar -cvf mafft.tar mafft`;\\ -n `gzip mafft.tar`;\n `mv mafft.tar.gz $BIN`;\n \ - }\n elsif ( $pg eq \"dialign-tx\")\n {\\ -n my $f;\n my $base=cwd();\n\n chdir \"./source\";\ -\n &flush_command (\" make CPPFLAGS='-O3 -funroll-\ -loops' all\");\n \n chdir \"..\";\n &check_cp (\".\ -/source/$pg\", \"$BIN\");\n &check_cp (\"./source/\ -$pg\", \"$BIN/dialign-t\");\n }\n elsif ($\ -pg eq \"poa\")\n {\n &flush_command (\"make $\ -arguments poa\");\n &check_cp (\"$pg\", \"$BIN\");\ -\n }\n elsif ( $pg eq \"probcons\")\n \ - {\n `rm *.exe $SILENT`;\n &flush_command (\"make \ -$arguments probcons\");\n &check_cp(\"$pg\", \"$BI\ -N/$pg\");\n }\n elsif ( $pg eq \"probcons\\ -" || $pg eq \"probconsRNA\")\n {\n `rm *.exe \ -$SILENT`;\n &flush_command (\"make $arguments prob\ -cons\");\n &check_cp(\"probcons\", \"$BIN/$pg\");\\ -n }\n\n elsif ( $pg eq \"muscle\")\n \ - {\n `rm *.o muscle muscle.exe $SILENT`;\n &flush_\ -command (\"make $arguments all\");\n &check_cp(\"$\ -pg\", \"$BIN\");\n }\n elsif ( $pg eq \"pc\ -ma\")\n {\n &flush_command (\"make $arguments\ - pcma\");\n &check_cp(\"$pg\", \"$BIN\");\n }\ -\n elsif ($pg eq \"kalign\")\n {\n &flush_\ -command (\"./configure\");\n &flush_command(\"make\ - $arguments\");\n &check_cp (\"$pg\",$BIN);\n \ - }\n elsif ( $pg eq \"amap\")\n {\n chdir \ -\"align\";\n `make clean $SILENT`;\n &flush_comman\ -d (\"make $arguments all\");\n &check_cp (\"$pg\",\ - $BIN);\n }\n elsif ( $pg eq \"proda\")\n \ - {\n &flush_command (\"make $arguments all\");\ -\n &check_cp (\"$pg\", $BIN);\n }\n elsif \ -( $pg eq \"prank\")\n {\n &flush_command (\"m\ -ake $arguments all\");\n &check_cp (\"$pg\", $BIN)\ -;\n }\n elsif ( $pg eq \"mustang\")\n \ - {\n &flush_command (\"make $arguments all\");\n i\ -f ( $OS=~/windows/){&check_cp(\"./bin/MUSTANG_v.3\\ -", \"$BIN/mustang.exe\");}\n else {&check_cp(\"./b\ -in/MUSTANG_v.3\", \"$BIN/mustang\");}\n }\n \ - elsif ( $pg eq \"RNAplfold\")\n {\n &flush_\ -command(\"./configure\");\n &flush_command (\"make\ - $arguments all\");\n &check_cp(\"./Progs/RNAplfol\ -d\", \"$BIN\");\n }\n chdir $CDIR;\n re\ -turn &pg_is_installed ($pg, $BIN);\n }\n\nsub ins\ -tall_t_coffee\n {\n my ($pg)=(@_);\n my ($r\ -eport,$cflags, $arguments, $language, $compiler) ;\ -\n #1-Install T-Coffee\n chdir \"t_coffee_so\ -urce\";\n &flush_command (\"make clean\");\n \ - print \"\\n------- Compiling T-Coffee\\n\";\n \ -$language=$PG{$pg} {language2};\n $arguments=$P\ -G{$language}{arguments};\n if (!($arguments =~/\ -CFLAGS/)){$arguments .= \" CFLAGS=-O2 \";}\n\n \ -if ( $CC ne \"\"){&flush_command (\"make -i $argum\ -ents t_coffee\");}\n &check_cp ($pg, $BIN);\n \ - \n chdir $CDIR;\n return &pg_is_installed \ -($pg, $BIN);\n }\nsub install_TMalign\n {\n m\ -y ($pg)=(@_);\n my $report;\n chdir \"t_coff\ -ee_source\";\n print \"\\n------- Compiling TMa\ -lign\\n\";\n `rm TMalign TMalign.exe $SILENT`;\\ -n if ( $FC ne \"\"){&flush_command (\"make -i $\ -PG{Fortran}{arguments} TMalign\");}\n &check_cp\ - ($pg, $BIN);\n if ( !-e \"$BIN/$pg\" && pg_has\ -_binary_distrib ($pg))\n {\n print \"!!!!!!! \ -Compilation of $pg impossible. Will try to install\ - from binary\\n\";\n return &install_binary_packag\ -e ($pg);\n }\n chdir $CDIR;\n return &p\ -g_is_installed ($pg, $BIN);\n }\n\nsub pg_has_bin\ -ary_distrib\n {\n my ($pg)=(@_);\n if ($PG{\ -$pg}{windows}){return 1;}\n elsif ($PG{$pg}{osx\ -}){return 1;}\n elsif ($PG{$pg}{linux}){return \ -1;}\n return 0;\n }\nsub install_binary_packag\ -e\n {\n my ($pg)=(@_);\n my ($base,$report,\ -$name, $download, $arguments, $language, $dir);\n \ - my $isdir;\n &input_os();\n \n if (!&s\ -upported_os($OS)){return 0;}\n if ( $PG{$pg}{bi\ -nary}){$name=$PG{$pg}{binary};}\n else \n \ -{\n $name=$pg;\n if ( $OS eq \"windows\"){$name.=\\ -".exe\";}\n }\n \n $download=\"$WEB_BAS\ -E/Packages/Binaries/$OS/$name\";\n \n $base=\ -cwd();\n chdir $TMP;\n \n if (!-e $name)\\ -n {\n `rm x $SILENT`;\n if ( url2file(\"$down\ -load\",\"x\")==$EXIT_SUCCESS)\n {\n `mv x $n\ -ame`;\n }\n }\n \n if (!-e $name)\n \ - {\n print \"!!!!!!! $PG{$pg}{dname}: Download \ -of $pg binary failed\\n\";\n print \"!!!!!!! $PG{$\ -pg}{dname}: Check Address: $download\\n\";\n retur\ -n 0;\n }\n print \"\\n------- Installing $\ -pg\\n\";\n \n if ($name =~/tar\\.gz/)\n \ - {\n `gunzip $name`;\n `tar -xvf $pg.tar`;\n chdi\ -r $pg;\n if ( $pg eq \"mafft\")\n {\n if ($R\ -OOT_INSTALL)\n {\n &root_run (\"You Must be\ - Roor to Install MAFFT\\n\", \"$CP mafft/bin/* /us\ -r/local/mafft;mkdir /usr/local/mafft/; $CP mafft/l\ -ib/* /usr/local/bin/\");\n }\n else\n \ - {\n `$CP $TMP/$pg/bin/* $BIN $SILENT`;\n `$C\ -P $TMP/$pg/lib/* $BIN $SILENT`;\n }\n }\n \ -else\n {\n if (-e \"$TMP/$pg/data\"){`$CP $T\ -MP/$pg/data/* $TCM $SILENT`;}\n if (!($pg=~/\\\ -*/)){`rm -rf $pg`;}\n }\n }\n else\n \ - {\n &check_cp (\"$pg\", \"$BIN\");\n `chmod u+x \ -$BIN/$pg`; \n unlink ($pg);\n }\n chdir $b\ -ase;\n $PG{$pg}{from_binary}=1;\n return &pg\ -_is_installed ($pg, $BIN);\n }\n\nsub add_dir \n \ - {\n my $dir=@_[0];\n \n if (!-e $dir && \ -!-d $dir)\n {\n return mkpath ($dir);\n \ -}\n else\n {\n return 0;\n }\n }\nsu\ -b check_rm \n {\n my ($file)=(@_);\n \n \ -if ( -e $file)\n {\n return unlink($file);\n \ - }\n return 0;\n }\nsub check_cp\n {\n \ - my ($from, $to)=(@_);\n if ( !-e $from && -e \\ -"$from\\.exe\"){$from=\"$from\\.exe\";}\n if ( \ -!-e $from){return 0;}\n \n `$CP $from $t\ -o`;\n return 1;\n }\nsub check_file_list_exist\ -s \n {\n my ($base, @flist)=(@_);\n my $f;\\ -n\n foreach $f (@flist)\n {\n if ( !-e \"$\ -base/$f\"){return 0;}\n }\n return 1;\n }\ -\nsub ls\n {\n my $f=@_[0];\n my @fl;\n \ -chomp(@fl=`ls -1 $f`);\n return @fl;\n }\nsub \ -flush_command\n {\n my $command=@_[0];\n my\ - $F=new FileHandle;\n open ($F, \"$command|\");\ -\n while (<$F>){print \" --- $_\";}\n clo\ -se ($F);\n } \n\nsub input_installation_direct\ -ory\n {\n my $dir=@_[0];\n my $new;\n \n\ - print \"------- The current installation direc\ -tory is: [$dir]\\n\";\n print \"??????? Return \ -to keep the default or new value:\";\n \n if \ -($NO_QUESTION==0)\n {\n chomp ($new=);\ -\n while ( $new ne \"\" && !input_yes (\"You have \ -entered $new. Is this correct? ([y]/n):\"))\n {\\ -n print \"???????New installation directory:\"\ -;\n chomp ($new=);\n }\n $dir=($new e\ -q \"\")?$dir:$new;\n $dir=~s/\\/$//;\n }\n \ - \n if ( -d $dir){return $dir;}\n elsif (&ro\ -ot_run (\"You must be root to create $dir\",\"mkdi\ -r $dir\")==$EXIT_SUCCESS){return $dir;}\n else\\ -n {\n print \"!!!!!!! $dir could not be creat\ -ed\\n\";\n if ( $NO_QUESTION)\n {\n return \\ -"\";\n }\n elsif ( &input_yes (\"??????? Do you \ -want to provide a new directory([y]/n)?:\"))\n {\ -\n return input_installation_directory ($dir);\ -\n }\n else\n {\n return \"\";\n }\n \ - }\n \n }\nsub input_yes\n {\n my $questi\ -on =@_[0];\n my $answer;\n\n if ($NO_QUESTIO\ -N==1){return 1;}\n \n if ($question eq \"\")\ -{$question=\"??????? Do you wish to proceed ([y]/n\ -)?:\";}\n print $question;\n chomp($answer=l\ -c());\n if (($answer=~/^y/) || $answer e\ -q \"\"){return 1;}\n elsif ( ($answer=~/^n/)){r\ -eturn 0;}\n else\n {\n return input_yes($q\ -uestion);\n }\n }\nsub root_run\n {\n my\ - ($txt, $cmd)=(@_);\n \n if ( system ($cmd)=\ -=$EXIT_SUCCESS){return $EXIT_SUCCESS;}\n else \\ -n {\n print \"------- $txt\\n\";\n if ( $ROOT\ - eq \"sudo\"){return system (\"sudo $cmd\");}\n el\ -se {return system (\"su root -c \\\"$cmd\\\"\");}\\ -n }\n }\nsub get_root\n {\n if (&pg_is_i\ -nstalled (\"sudo\")){return \"sudo\";}\n else {\ -return \"su\";}\n }\n\nsub get_os\n {\n my $r\ -aw_os=`uname`;\n my $os;\n\n $raw_os=lc ($ra\ -w_os);\n \n if ($raw_os =~/cygwin/){$os=\"wi\ -ndows\";}\n elsif ($raw_os =~/linux/){$os=\"lin\ -ux\";}\n elsif ($raw_os =~/osx/){$os=\"macosx\"\ -;}\n elsif ($raw_os =~/darwin/){$os=\"macosx\";\ -}\n else\n {\n $os=$raw_os;\n }\n \ -return $os;\n }\nsub input_os\n {\n my $answe\ -r;\n if ($OS) {return $OS;}\n \n print \"\ -??????? which os do you use: [w]indows, [l]inux, [\ -m]acosx:?\";\n $answer=lc();\n\n if (\ -($answer=~/^m/)){$OS=\"macosx\";}\n elsif ( ($a\ -nswer=~/^w/)){$OS=\"windows\";}\n elsif ( ($ans\ -wer=~/^linux/)){$OS=\"linux\";}\n \n else\n \ - {\n return &input_os();\n }\n return \ -$OS;\n }\n\nsub supported_os\n {\n my ($os)=(\ -@_[0]);\n return $SUPPORTED_OS{$os};\n }\n \ -\n \n\n\nsub update_tclinkdb \n {\n my $fil\ -e =@_[0];\n my $name;\n my $F=new FileHandle\ -;\n my ($download, $address, $name, $l, $db);\n\ - \n if ( $file eq \"update\"){$file=$TCLINKD\ -B_ADDRESS;}\n \n if ( $file =~/http:\\/\\// \ -|| $file =~/ftp:\\/\\//)\n {\n ($address, $na\ -me)=($download=~/(.*)\\/([^\\/]+)$/);\n `rm x $SIL\ -ENT`;\n if (&url2file ($file,\"x\")==$EXIT_SUCCESS\ -)\n {\n print \"------- Susscessful upload o\ -f $name\";\n `mv x $name`;\n $file=$name;\\ -n }\n }\n open ($F, \"$file\");\n whi\ -le (<$F>)\n {\n my $l=$_;\n if (($l =~/^\\/\\\ -//) || ($db=~/^#/)){;}\n elsif ( !($l =~/\\w/)){;}\ -\n else\n {\n my @v=split (/\\s+/, $l);\n \ - if ( $l=~/^MODE/)\n {\n $MODE{$v[1]}{$v[2\ -]}=$v[3];\n }\n elsif ($l=~/^PG/)\n \ - {\n $PG{$v[1]}{$v[2]}=$v[3];\n }\n }\n \ - }\n close ($F);\n &post_process_PG();\n\ - return;\n }\n\n\n\nsub initialize_PG\n {\n \ - \n$PG{\"t_coffee\"}{\"4_TCOFFEE\"}=\"TCOFFEE\";\\ -n$PG{\"t_coffee\"}{\"type\"}=\"sequence_multiple_a\ -ligner\";\n$PG{\"t_coffee\"}{\"ADDRESS\"}=\"http:/\ -/www.tcoffee.org\";\n$PG{\"t_coffee\"}{\"language\\ -"}=\"C\";\n$PG{\"t_coffee\"}{\"language2\"}=\"C\";\ -\n$PG{\"t_coffee\"}{\"source\"}=\"http://www.tcoff\ -ee.org/Packages/T-COFFEE_distribution.tar.gz\";\n$\ -PG{\"t_coffee\"}{\"update_action\"}=\"always\";\n$\ -PG{\"t_coffee\"}{\"mode\"}=\"tcoffee,mcoffee,rcoff\ -ee,expresso,3dcoffee\";\n$PG{\"clustalw2\"}{\"4_TC\ -OFFEE\"}=\"CLUSTALW2\";\n$PG{\"clustalw2\"}{\"type\ -\"}=\"sequence_multiple_aligner\";\n$PG{\"clustalw\ -2\"}{\"ADDRESS\"}=\"http://www.clustal.org\";\n$PG\ -{\"clustalw2\"}{\"language\"}=\"C++\";\n$PG{\"clus\ -talw2\"}{\"language2\"}=\"CXX\";\n$PG{\"clustalw2\\ -"}{\"source\"}=\"http://www.clustal.org/download/2\ -.0.10/clustalw-2.0.10-src.tar.gz\";\n$PG{\"clustal\ -w2\"}{\"mode\"}=\"mcoffee,rcoffee\";\n$PG{\"clusta\ -lw\"}{\"4_TCOFFEE\"}=\"CLUSTALW\";\n$PG{\"clustalw\ -\"}{\"type\"}=\"sequence_multiple_aligner\";\n$PG{\ -\"clustalw\"}{\"ADDRESS\"}=\"http://www.clustal.or\ -g\";\n$PG{\"clustalw\"}{\"language\"}=\"C\";\n$PG{\ -\"clustalw\"}{\"language2\"}=\"C\";\n$PG{\"clustal\ -w\"}{\"source\"}=\"http://www.clustal.org/download\ -/1.X/ftp-igbmc.u-strasbg.fr/pub/ClustalW/clustalw1\ -.82.UNIX.tar.gz\";\n$PG{\"clustalw\"}{\"mode\"}=\"\ -mcoffee,rcoffee\";\n$PG{\"dialign-t\"}{\"4_TCOFFEE\ -\"}=\"DIALIGNT\";\n$PG{\"dialign-t\"}{\"type\"}=\"\ -sequence_multiple_aligner\";\n$PG{\"dialign-t\"}{\\ -"ADDRESS\"}=\"http://dialign-tx.gobics.de/\";\n$PG\ -{\"dialign-t\"}{\"DIR\"}=\"/usr/share/dialign-tx/\\ -";\n$PG{\"dialign-t\"}{\"language\"}=\"C\";\n$PG{\\ -"dialign-t\"}{\"language2\"}=\"C\";\n$PG{\"dialign\ --t\"}{\"source\"}=\"http://dialign-tx.gobics.de/DI\ -ALIGN-TX_1.0.1.tar.gz\";\n$PG{\"dialign-t\"}{\"mod\ -e\"}=\"mcoffee\";\n$PG{\"dialign-t\"}{\"binary\"}=\ -\"dialign-t\";\n$PG{\"dialign-tx\"}{\"4_TCOFFEE\"}\ -=\"DIALIGNTX\";\n$PG{\"dialign-tx\"}{\"type\"}=\"s\ -equence_multiple_aligner\";\n$PG{\"dialign-tx\"}{\\ -"ADDRESS\"}=\"http://dialign-tx.gobics.de/\";\n$PG\ -{\"dialign-tx\"}{\"DIR\"}=\"/usr/share/dialign-tx/\ -\";\n$PG{\"dialign-tx\"}{\"language\"}=\"C\";\n$PG\ -{\"dialign-tx\"}{\"language2\"}=\"C\";\n$PG{\"dial\ -ign-tx\"}{\"source\"}=\"http://dialign-tx.gobics.d\ -e/DIALIGN-TX_1.0.1.tar.gz\";\n$PG{\"dialign-tx\"}{\ -\"mode\"}=\"mcoffee\";\n$PG{\"dialign-tx\"}{\"bina\ -ry\"}=\"dialign-tx\";\n$PG{\"poa\"}{\"4_TCOFFEE\"}\ -=\"POA\";\n$PG{\"poa\"}{\"type\"}=\"sequence_multi\ -ple_aligner\";\n$PG{\"poa\"}{\"ADDRESS\"}=\"http:/\ -/www.bioinformatics.ucla.edu/poa/\";\n$PG{\"poa\"}\ -{\"language\"}=\"C\";\n$PG{\"poa\"}{\"language2\"}\ -=\"C\";\n$PG{\"poa\"}{\"source\"}=\"http://downloa\ -ds.sourceforge.net/poamsa/poaV2.tar.gz\";\n$PG{\"p\ -oa\"}{\"DIR\"}=\"/usr/share/\";\n$PG{\"poa\"}{\"FI\ -LE1\"}=\"blosum80.mat\";\n$PG{\"poa\"}{\"mode\"}=\\ -"mcoffee\";\n$PG{\"poa\"}{\"binary\"}=\"poa\";\n$P\ -G{\"probcons\"}{\"4_TCOFFEE\"}=\"PROBCONS\";\n$PG{\ -\"probcons\"}{\"type\"}=\"sequence_multiple_aligne\ -r\";\n$PG{\"probcons\"}{\"ADDRESS\"}=\"http://prob\ -cons.stanford.edu/\";\n$PG{\"probcons\"}{\"languag\ -e2\"}=\"CXX\";\n$PG{\"probcons\"}{\"language\"}=\"\ -C++\";\n$PG{\"probcons\"}{\"source\"}=\"http://pro\ -bcons.stanford.edu/probcons_v1_12.tar.gz\";\n$PG{\\ -"probcons\"}{\"mode\"}=\"mcoffee\";\n$PG{\"probcon\ -s\"}{\"binary\"}=\"probcons\";\n$PG{\"mafft\"}{\"4\ -_TCOFFEE\"}=\"MAFFT\";\n$PG{\"mafft\"}{\"type\"}=\\ -"sequence_multiple_aligner\";\n$PG{\"mafft\"}{\"AD\ -DRESS\"}=\"http://align.bmr.kyushu-u.ac.jp/mafft/o\ -nline/server/\";\n$PG{\"mafft\"}{\"language\"}=\"C\ -\";\n$PG{\"mafft\"}{\"language\"}=\"C\";\n$PG{\"ma\ -fft\"}{\"source\"}=\"http://align.bmr.kyushu-u.ac.\ -jp/mafft/software/mafft-6.603-with-extensions-src.\ -tgz\";\n$PG{\"mafft\"}{\"windows\"}=\"http://align\ -.bmr.kyushu-u.ac.jp/mafft/software/mafft-6.603-min\ -gw.tar\";\n$PG{\"mafft\"}{\"mode\"}=\"mcoffee,rcof\ -fee\";\n$PG{\"mafft\"}{\"binary\"}=\"mafft.tar.gz\\ -";\n$PG{\"muscle\"}{\"4_TCOFFEE\"}=\"MUSCLE\";\n$P\ -G{\"muscle\"}{\"type\"}=\"sequence_multiple_aligne\ -r\";\n$PG{\"muscle\"}{\"ADDRESS\"}=\"http://www.dr\ -ive5.com/muscle/\";\n$PG{\"muscle\"}{\"language\"}\ -=\"C++\";\n$PG{\"muscle\"}{\"language2\"}=\"GPP\";\ -\n$PG{\"muscle\"}{\"source\"}=\"http://www.drive5.\ -com/muscle/downloads3.6/muscle3.6_src.tar.gz\";\n$\ -PG{\"muscle\"}{\"windows\"}=\"http://www.drive5.co\ -m/muscle/downloads3.6/muscle3.6_win32.zip\";\n$PG{\ -\"muscle\"}{\"linux\"}=\"http://www.drive5.com/mus\ -cle/downloads3.6/muscle3.6_linux_ia32.tar.gz\";\n$\ -PG{\"muscle\"}{\"mode\"}=\"mcoffee,rcoffee\";\n$PG\ -{\"pcma\"}{\"4_TCOFFEE\"}=\"PCMA\";\n$PG{\"pcma\"}\ -{\"type\"}=\"sequence_multiple_aligner\";\n$PG{\"p\ -cma\"}{\"ADDRESS\"}=\"ftp://iole.swmed.edu/pub/PCM\ -A/\";\n$PG{\"pcma\"}{\"language\"}=\"C\";\n$PG{\"p\ -cma\"}{\"language2\"}=\"C\";\n$PG{\"pcma\"}{\"sour\ -ce\"}=\"ftp://iole.swmed.edu/pub/PCMA/pcma.tar.gz\\ -";\n$PG{\"pcma\"}{\"mode\"}=\"mcoffee\";\n$PG{\"ka\ -lign\"}{\"4_TCOFFEE\"}=\"KALIGN\";\n$PG{\"kalign\"\ -}{\"type\"}=\"sequence_multiple_aligner\";\n$PG{\"\ -kalign\"}{\"ADDRESS\"}=\"http://msa.cgb.ki.se\";\n\ -$PG{\"kalign\"}{\"language\"}=\"C\";\n$PG{\"kalign\ -\"}{\"language2\"}=\"C\";\n$PG{\"kalign\"}{\"sourc\ -e\"}=\"http://msa.cgb.ki.se/downloads/kalign/curre\ -nt.tar.gz\";\n$PG{\"kalign\"}{\"mode\"}=\"mcoffee\\ -";\n$PG{\"amap\"}{\"4_TCOFFEE\"}=\"AMAP\";\n$PG{\"\ -amap\"}{\"type\"}=\"sequence_multiple_aligner\";\n\ -$PG{\"amap\"}{\"ADDRESS\"}=\"http://bio.math.berke\ -ley.edu/amap/\";\n$PG{\"amap\"}{\"language\"}=\"C+\ -+\";\n$PG{\"amap\"}{\"language2\"}=\"CXX\";\n$PG{\\ -"amap\"}{\"source\"}=\"http://baboon.math.berkeley\ -.edu/amap/download/amap.2.2.tar.gz\";\n$PG{\"amap\\ -"}{\"mode\"}=\"mcoffee\";\n$PG{\"proda\"}{\"4_TCOF\ -FEE\"}=\"PRODA\";\n$PG{\"proda\"}{\"type\"}=\"sequ\ -ence_multiple_aligner\";\n$PG{\"proda\"}{\"ADDRESS\ -\"}=\"http://proda.stanford.edu\";\n$PG{\"proda\"}\ -{\"language\"}=\"C++\";\n$PG{\"proda\"}{\"language\ -2\"}=\"CXX\";\n$PG{\"proda\"}{\"source\"}=\"http:/\ -/proda.stanford.edu/proda_1_0.tar.gz\";\n$PG{\"pro\ -da\"}{\"mode\"}=\"mcoffee\";\n$PG{\"prank\"}{\"4_T\ -COFFEE\"}=\"PRANK\";\n$PG{\"prank\"}{\"type\"}=\"s\ -equence_multiple_aligner\";\n$PG{\"prank\"}{\"ADDR\ -ESS\"}=\"http://www.ebi.ac.uk/goldman-srv/prank/\"\ -;\n$PG{\"prank\"}{\"language\"}=\"C++\";\n$PG{\"pr\ -ank\"}{\"language2\"}=\"CXX\";\n$PG{\"prank\"}{\"s\ -ource\"}=\"http://www.ebi.ac.uk/goldman-srv/prank/\ -src/old/prank.src.081202.tgz\";\n$PG{\"prank\"}{\"\ -mode\"}=\"mcoffee\";\n$PG{\"sap\"}{\"4_TCOFFEE\"}=\ -\"SAP\";\n$PG{\"sap\"}{\"type\"}=\"structure_pairw\ -ise_aligner\";\n$PG{\"sap\"}{\"ADDRESS\"}=\"http:/\ -/mathbio.nimr.mrc.ac.uk/wiki/Software\";\n$PG{\"sa\ -p\"}{\"language\"}=\"C\";\n$PG{\"sap\"}{\"language\ -2\"}=\"C\";\n$PG{\"sap\"}{\"source\"}=\"http://www\ -.tcoffee.org/Packages/sap_distribution_TCC_0.6.tar\ -.gz\";\n$PG{\"sap\"}{\"mode\"}=\"expresso,3dcoffee\ -\";\n$PG{\"TMalign\"}{\"4_TCOFFEE\"}=\"TMALIGN\";\\ -n$PG{\"TMalign\"}{\"type\"}=\"structure_pairwise_a\ -ligner\";\n$PG{\"TMalign\"}{\"ADDRESS\"}=\"http://\ -zhang.bioinformatics.ku.edu/TM-align/TMalign.f\";\\ -n$PG{\"TMalign\"}{\"language\"}=\"Fortran\";\n$PG{\ -\"TMalign\"}{\"language2\"}=\"Fortran\";\n$PG{\"TM\ -align\"}{\"source\"}=\"http://zhang.bioinformatics\ -.ku.edu/TM-align/TMalign.f\";\n$PG{\"TMalign\"}{\"\ -linux\"}=\"http://zhang.bioinformatics.ku.edu/TM-a\ -lign/TMalign_32.gz\";\n$PG{\"TMalign\"}{\"mode\"}=\ -\"expresso,3dcoffee\";\n$PG{\"mustang\"}{\"4_TCOFF\ -EE\"}=\"MUSTANG\";\n$PG{\"mustang\"}{\"type\"}=\"s\ -tructure_pairwise_aligner\";\n$PG{\"mustang\"}{\"A\ -DDRESS\"}=\"http://www.cs.mu.oz.au/~arun/mustang\"\ -;\n$PG{\"mustang\"}{\"language\"}=\"C++\";\n$PG{\"\ -mustang\"}{\"language2\"}=\"CXX\";\n$PG{\"mustang\\ -"}{\"source\"}=\"http://www.cs.mu.oz.au/~arun/must\ -ang/mustang_v.3.tgz\";\n$PG{\"mustang\"}{\"mode\"}\ -=\"expresso,3dcoffee\";\n$PG{\"lsqman\"}{\"4_TCOFF\ -EE\"}=\"LSQMAN\";\n$PG{\"lsqman\"}{\"type\"}=\"str\ -ucture_pairwise_aligner\";\n$PG{\"lsqman\"}{\"ADDR\ -ESS\"}=\"empty\";\n$PG{\"lsqman\"}{\"language\"}=\\ -"empty\";\n$PG{\"lsqman\"}{\"language2\"}=\"empty\\ -";\n$PG{\"lsqman\"}{\"source\"}=\"empty\";\n$PG{\"\ -lsqman\"}{\"update_action\"}=\"never\";\n$PG{\"lsq\ -man\"}{\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"ali\ -gn_pdb\"}{\"4_TCOFFEE\"}=\"ALIGN_PDB\";\n$PG{\"ali\ -gn_pdb\"}{\"type\"}=\"structure_pairwise_aligner\"\ -;\n$PG{\"align_pdb\"}{\"ADDRESS\"}=\"empty\";\n$PG\ -{\"align_pdb\"}{\"language\"}=\"empty\";\n$PG{\"al\ -ign_pdb\"}{\"language2\"}=\"empty\";\n$PG{\"align_\ -pdb\"}{\"source\"}=\"empty\";\n$PG{\"align_pdb\"}{\ -\"update_action\"}=\"never\";\n$PG{\"align_pdb\"}{\ -\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"fugueali\"\ -}{\"4_TCOFFEE\"}=\"FUGUE\";\n$PG{\"fugueali\"}{\"t\ -ype\"}=\"structure_pairwise_aligner\";\n$PG{\"fugu\ -eali\"}{\"ADDRESS\"}=\"http://www-cryst.bioc.cam.a\ -c.uk/fugue/download.html\";\n$PG{\"fugueali\"}{\"l\ -anguage\"}=\"empty\";\n$PG{\"fugueali\"}{\"languag\ -e2\"}=\"empty\";\n$PG{\"fugueali\"}{\"source\"}=\"\ -empty\";\n$PG{\"fugueali\"}{\"update_action\"}=\"n\ -ever\";\n$PG{\"fugueali\"}{\"mode\"}=\"expresso,3d\ -coffee\";\n$PG{\"dalilite.pl\"}{\"4_TCOFFEE\"}=\"D\ -ALILITEc\";\n$PG{\"dalilite.pl\"}{\"type\"}=\"stru\ -cture_pairwise_aligner\";\n$PG{\"dalilite.pl\"}{\"\ -ADDRESS\"}=\"built_in\";\n$PG{\"dalilite.pl\"}{\"A\ -DDRESS2\"}=\"http://www.ebi.ac.uk/Tools/webservice\ -s/services/dalilite\";\n$PG{\"dalilite.pl\"}{\"lan\ -guage\"}=\"Perl\";\n$PG{\"dalilite.pl\"}{\"languag\ -e2\"}=\"Perl\";\n$PG{\"dalilite.pl\"}{\"source\"}=\ -\"empty\";\n$PG{\"dalilite.pl\"}{\"update_action\"\ -}=\"never\";\n$PG{\"dalilite.pl\"}{\"mode\"}=\"exp\ -resso,3dcoffee\";\n$PG{\"probconsRNA\"}{\"4_TCOFFE\ -E\"}=\"PROBCONSRNA\";\n$PG{\"probconsRNA\"}{\"type\ -\"}=\"RNA_multiple_aligner\";\n$PG{\"probconsRNA\"\ -}{\"ADDRESS\"}=\"http://probcons.stanford.edu/\";\\ -n$PG{\"probconsRNA\"}{\"language\"}=\"C++\";\n$PG{\ -\"probconsRNA\"}{\"language2\"}=\"CXX\";\n$PG{\"pr\ -obconsRNA\"}{\"source\"}=\"http://probcons.stanfor\ -d.edu/probconsRNA.tar.gz\";\n$PG{\"probconsRNA\"}{\ -\"mode\"}=\"mcoffee,rcoffee\";\n$PG{\"sfold\"}{\"4\ -_TCOFFEE\"}=\"CONSAN\";\n$PG{\"sfold\"}{\"type\"}=\ -\"RNA_pairwise_aligner\";\n$PG{\"sfold\"}{\"ADDRES\ -S\"}=\"http://selab.janelia.org/software/consan/\"\ -;\n$PG{\"sfold\"}{\"language\"}=\"empty\";\n$PG{\"\ -sfold\"}{\"language2\"}=\"empty\";\n$PG{\"sfold\"}\ -{\"source\"}=\"empty\";\n$PG{\"sfold\"}{\"update_a\ -ction\"}=\"never\";\n$PG{\"sfold\"}{\"mode\"}=\"rc\ -offee\";\n$PG{\"RNAplfold\"}{\"4_TCOFFEE\"}=\"RNAP\ -LFOLD\";\n$PG{\"RNAplfold\"}{\"type\"}=\"RNA_secon\ -darystructure_predictor\";\n$PG{\"RNAplfold\"}{\"A\ -DDRESS\"}=\"http://www.tbi.univie.ac.at/~ivo/RNA/\\ -";\n$PG{\"RNAplfold\"}{\"language\"}=\"C\";\n$PG{\\ -"RNAplfold\"}{\"language2\"}=\"C\";\n$PG{\"RNAplfo\ -ld\"}{\"source\"}=\"http://www.tbi.univie.ac.at/~i\ -vo/RNA/ViennaRNA-1.7.2.tar.gz\";\n$PG{\"RNAplfold\\ -"}{\"mode\"}=\"rcoffee\";\n$PG{\"hmmtop\"}{\"4_TCO\ -FFEE\"}=\"HMMTOP\";\n$PG{\"hmmtop\"}{\"type\"}=\"p\ -rotein_secondarystructure_predictor\";\n$PG{\"hmmt\ -op\"}{\"ADDRESS\"}=\"www.enzim.hu/hmmtop/\";\n$PG{\ -\"hmmtop\"}{\"language\"}=\"C\";\n$PG{\"hmmtop\"}{\ -\"language2\"}=\"C\";\n$PG{\"hmmtop\"}{\"source\"}\ -=\"empty\";\n$PG{\"hmmtop\"}{\"update_action\"}=\"\ -never\";\n$PG{\"hmmtop\"}{\"mode\"}=\"tcoffee\";\n\ -$PG{\"gorIV\"}{\"4_TCOFFEE\"}=\"GOR4\";\n$PG{\"gor\ -IV\"}{\"type\"}=\"protein_secondarystructure_predi\ -ctor\";\n$PG{\"gorIV\"}{\"ADDRESS\"}=\"http://mig.\ -jouy.inra.fr/logiciels/gorIV/\";\n$PG{\"gorIV\"}{\\ -"language\"}=\"C\";\n$PG{\"gorIV\"}{\"language2\"}\ -=\"C\";\n$PG{\"gorIV\"}{\"source\"}=\"http://mig.j\ -ouy.inra.fr/logiciels/gorIV/GOR_IV.tar.gz\";\n$PG{\ -\"gorIV\"}{\"update_action\"}=\"never\";\n$PG{\"go\ -rIV\"}{\"mode\"}=\"tcoffee\";\n$PG{\"wublast.pl\"}\ -{\"4_TCOFFEE\"}=\"EBIWUBLASTc\";\n$PG{\"wublast.pl\ -\"}{\"type\"}=\"protein_homology_predictor\";\n$PG\ -{\"wublast.pl\"}{\"ADDRESS\"}=\"built_in\";\n$PG{\\ -"wublast.pl\"}{\"ADDRESS2\"}=\"http://www.ebi.ac.u\ -k/Tools/webservices/services/wublast\";\n$PG{\"wub\ -last.pl\"}{\"language\"}=\"Perl\";\n$PG{\"wublast.\ -pl\"}{\"language2\"}=\"Perl\";\n$PG{\"wublast.pl\"\ -}{\"source\"}=\"empty\";\n$PG{\"wublast.pl\"}{\"up\ -date_action\"}=\"never\";\n$PG{\"wublast.pl\"}{\"m\ -ode\"}=\"psicoffee,expresso,3dcoffee\";\n$PG{\"bla\ -stpgp.pl\"}{\"4_TCOFFEE\"}=\"EBIBLASTPGPc\";\n$PG{\ -\"blastpgp.pl\"}{\"type\"}=\"protein_homology_pred\ -ictor\";\n$PG{\"blastpgp.pl\"}{\"ADDRESS\"}=\"buil\ -t_in\";\n$PG{\"blastpgp.pl\"}{\"ADDRESS2\"}=\"http\ -://www.ebi.ac.uk/Tools/webservices/services/blastp\ -gp\";\n$PG{\"blastpgp.pl\"}{\"language\"}=\"Perl\"\ -;\n$PG{\"blastpgp.pl\"}{\"language2\"}=\"Perl\";\n\ -$PG{\"blastpgp.pl\"}{\"source\"}=\"empty\";\n$PG{\\ -"blastpgp.pl\"}{\"update_action\"}=\"never\";\n$PG\ -{\"blastpgp.pl\"}{\"mode\"}=\"psicoffee,expresso,3\ -dcoffee\";\n$PG{\"blastcl3\"}{\"4_TCOFFEE\"}=\"NCB\ -IWEBBLAST\";\n$PG{\"blastcl3\"}{\"type\"}=\"protei\ -n_homology_predictor\";\n$PG{\"blastcl3\"}{\"ADDRE\ -SS\"}=\"ftp://ftp.ncbi.nih.gov/blast/executables/L\ -ATEST\";\n$PG{\"blastcl3\"}{\"language\"}=\"C\";\n\ -$PG{\"blastcl3\"}{\"language2\"}=\"C\";\n$PG{\"bla\ -stcl3\"}{\"source\"}=\"empty\";\n$PG{\"blastcl3\"}\ -{\"update_action\"}=\"never\";\n$PG{\"blastcl3\"}{\ -\"mode\"}=\"psicoffee,expresso,3dcoffee\";\n$PG{\"\ -blastpgp\"}{\"4_TCOFFEE\"}=\"NCBIBLAST\";\n$PG{\"b\ -lastpgp\"}{\"type\"}=\"protein_homology_predictor\\ -";\n$PG{\"blastpgp\"}{\"ADDRESS\"}=\"ftp://ftp.ncb\ -i.nih.gov/blast/executables/LATEST\";\n$PG{\"blast\ -pgp\"}{\"language\"}=\"C\";\n$PG{\"blastpgp\"}{\"l\ -anguage2\"}=\"C\";\n$PG{\"blastpgp\"}{\"source\"}=\ -\"empty\";\n$PG{\"blastpgp\"}{\"update_action\"}=\\ -"never\";\n$PG{\"blastpgp\"}{\"mode\"}=\"psicoffee\ -,expresso,3dcoffee\";\n$PG{\"SOAP::Lite\"}{\"4_TCO\ -FFEE\"}=\"SOAPLITE\";\n$PG{\"SOAP::Lite\"}{\"type\\ -"}=\"library\";\n$PG{\"SOAP::Lite\"}{\"ADDRESS\"}=\ -\"http://cpansearch.perl.org/src/MKUTTER/SOAP-Lite\ --0.710.08/Makefile.PL\";\n$PG{\"SOAP::Lite\"}{\"la\ -nguage\"}=\"Perl\";\n$PG{\"SOAP::Lite\"}{\"languag\ -e2\"}=\"Perl\";\n$PG{\"SOAP::Lite\"}{\"source\"}=\\ -"empty\";\n$PG{\"SOAP::Lite\"}{\"mode\"}=\"psicoff\ -ee,expresso,3dcoffee\";\n$MODE{\"tcoffee\"}{\"name\ -\"}=\"tcoffee\";\n$MODE{\"rcoffee\"}{\"name\"}=\"r\ -coffee\";\n$MODE{\"3dcoffee\"}{\"name\"}=\"3dcoffe\ -e\";\n$MODE{\"mcoffee\"}{\"name\"}=\"mcoffee\";\n$\ -MODE{\"expresso\"}{\"name\"}=\"expresso\";\n\n\n$P\ -G{C}{compiler}=\"gcc\";\n$PG{C}{compiler_flag}=\"C\ -C\";\n$PG{C}{options}=\"\";\n$PG{C}{options_flag}=\ -\"CFLAGS\";\n$PG{C}{type}=\"compiler\";\n\n$PG{\"C\ -XX\"}{compiler}=\"g++\";\n$PG{\"CXX\"}{compiler_fl\ -ag}=\"CXX\";\n$PG{\"CXX\"}{options}=\"\";\n$PG{\"C\ -XX\"}{options_flag}=\"CXXFLAGS\";\n$PG{CXX}{type}=\ -\"compiler\";\n\n$PG{\"CPP\"}{compiler}=\"g++\";\n\ -$PG{\"CPP\"}{compiler_flag}=\"CPP\";\n$PG{\"CPP\"}\ -{options}=\"\";\n$PG{\"CPP\"}{options_flag}=\"CPPF\ -LAGS\";\n$PG{CPP}{type}=\"compiler\";\n\n$PG{\"GPP\ -\"}{compiler}=\"g++\";\n$PG{\"GPP\"}{compiler_flag\ -}=\"GPP\";\n$PG{\"GPP\"}{options}=\"\";\n$PG{\"GPP\ -\"}{options_flag}=\"CFLAGS\";\n$PG{GPP}{type}=\"co\ -mpiler\";\n\n$PG{Fortran}{compiler}=\"g77\";\n$PG{\ -Fortran}{compiler_flag}=\"FCC\";\n$PG{Fortran}{typ\ -e}=\"compiler\";\n\n$PG{Perl}{compiler}=\"CPAN\";\\ -n$PG{Perl}{type}=\"compiler\";\n\n$SUPPORTED_OS{ma\ -cox}=\"Macintosh\";\n$SUPPORTED_OS{linux}=\"Linux\\ -";\n$SUPPORTED_OS{windows}=\"Cygwin\";\n\n\n\n$MOD\ -E{t_coffee}{description}=\" for regular multiple s\ -equence alignments\";\n$MODE{rcoffee} {description\ -}=\" for RNA multiple sequence alignments\";\n\n$M\ -ODE{psicoffee} {description}=\" for Homology Exten\ -ded multiple sequence alignments\";\n$MODE{express\ -o}{description}=\" for very accurate structure bas\ -ed multiple sequence alignments\";\n$MODE{\"3dcoff\ -ee\"}{description}=\" for multiple structure align\ -ments\";\n$MODE{mcoffee} {description}=\" for comb\ -ining alternative multiple sequence alignment pack\ -ages\\n------- into a unique meta-package. The ins\ -taller will upload several MSA packages and compil\ -e them\\n\n\";\n\n\n&post_process_PG();\nreturn;\n\ -}\n\nsub post_process_PG\n {\n my $p;\n \n \ - %PG=&name2dname (%PG);\n %MODE=&name2dname(%\ -MODE);\n foreach $p (keys(%PG)){if ( $PG{$p}{ty\ -pe} eq \"compiler\"){$PG{$p}{update_action}=\"neve\ -r\";}}\n \n }\n\nsub name2dname\n {\n my (\ -%L)=(@_);\n my ($l, $ml);\n \n foreach my\ - $pg (keys(%L))\n {\n $l=length ($pg);\n if (\ - $l>$ml){$ml=$l;}\n }\n $ml+=1;\n forea\ -ch my $pg (keys(%L))\n {\n my $name;\n $l=$ml\ --length ($pg);\n $name=$pg;\n for ( $b=0; $b<$l; $\ -b++)\n {\n $name .=\" \";\n }\n $L{$pg}{dn\ -ame}=$name;\n }\n return %L;\n }\n\nsub e\ -nv_file2putenv\n {\n my $f=@_[0];\n my $F=n\ -ew FileHandle;\n my $n;\n \n open ($F, \"\ -$f\");\n while (<$F>)\n {\n my $line=$_;\n\ - my($var, $value)=($_=~/(\\S+)\\=(\\S*)/);\n $ENV{\ -$var}=$value;\n $ENV_SET{$var}=1;\n $n++;\n }\ -\n close ($F);\n return $n;\n }\n\n","use E\ -nv;\nuse Cwd;\n@suffix=(\"tmp\", \"temp\", \"cache\ -\", \"t_coffee\", \"core\", \"tcoffee\");\n\nif ($\ -#ARGV==-1)\n {\n print \"clean_cache.pl -file \ - -dir= -size=\\n0: unlimited -1 always.\\nWill only clean dir\ -ectories matching:[\";\n foreach $k(@suffix){pr\ -int \"*$k* \";}\n print \"]\\n\";\n exit (EX\ -IT_FAILURE);\n }\n\n$cl=join (\" \",@ARGV);\nif (\ -($cl=~/\\-no_action/))\n {\n exit (EXIT_SUCCES\ -S);\n }\n\nif (($cl=~/\\-debug/))\n {\n $DEBU\ -G=1;\n }\nelse\n {\n $DEBUG=0;\n }\n\nif (($\ -cl=~/\\-dir=(\\S+)/))\n {\n $dir=$1;\n }\nels\ -e\n {\n $dir=\"./\";\n }\n\nif ($cl=~/\\-file\ -=(\\S+)/)\n {\n $file=$1;\n }\nelse\n {\n \ - $file=0;\n }\n\nif ($cl=~/\\-size=(\\S+)/)\n {\\ -n $max_size=$1;\n }\nelse\n {\n $max_size=\ -0;#unlimited\n }\nif ($cl=~/\\-force/)\n {\n \ -$force=1;\n }\nelse\n {\n $force=0;\n }\n\ni\ -f ($cl=~/\\-age=(\\S+)/)\n {\n $max_age=$1;\n \ - }\nelse\n {\n $max_age=0;#unlimited\n }\n\n$\ -max_size*=1000000;\nif ( ! -d $dir)\n {\n prin\ -t STDERR \"\\nCannot process $dir: does not exist \ -\\n\";\n exit (EXIT_FAILURE);\n }\n\nif ( !($d\ -ir=~/^\\//))\n {\n $base=cwd();\n $dir=\"$b\ -ase/$dir\";\n }\n\n$proceed=0;\nforeach $s (@suff\ -ix)\n {\n \n if (($dir=~/$s/)){$proceed=1;}\ -\n $s=uc ($s);\n if (($dir=~/$s/)){$proceed=\ -1;}\n }\nif ( $proceed==0)\n {\n print STDERR\ - \"Clean_cache.pl can only clean directories whose\ - absolute path name contains the following strings\ -:\";\n foreach $w (@suffix) {print STDERR \"$w \ -\";$w=lc($w); print STDERR \"$w \";}\n print ST\ -DERR \"\\nCannot process $dir\\n\";\n exit (EXI\ -T_FAILURE);\n }\n\n$name_file=\"$dir/name_file.tx\ -t\";\n$size_file=\"$dir/size_file.txt\";\nif ( $fo\ -rce){&create_ref_file ($dir,$name_file,$size_file)\ -;}\nif ($file){&add_file ($dir, $name_file, $size_\ -file, $file);}\n&clean_dir ($dir, $name_file, $siz\ -e_file, $max_size,$max_age);\nexit (EXIT_SUCCESS);\ -\n\nsub clean_dir \n {\n my ($dir, $name_file,\ - $size_file, $max_size, $max_age)=@_;\n my ($to\ -t_size, $size, $f, $s);\n\n \n $tot_size=&get_\ -tot_size ($dir, $name_file, $size_file);\n\n if\ - ( $tot_size<=$max_size){return ;}\n else {$max\ -_size/=2;}\n \n #recreate the name file in c\ -ase some temprary files have not been properly reg\ -istered\n &create_ref_file ($dir, $name_file, $\ -size_file, $max_age);\n \n $new_name_file=&vtm\ -pnam();\n open (R, \"$name_file\");\n open (\ -W, \">$new_name_file\");\n while ()\n {\ -\n my $line=$_;\n \n ($f, $s)=($line=~/(\\S+) (\\S\ -+)/);\n if ( !($f=~/\\S/)){next;}\n \n elsif ($max\ -_size && $tot_size>=$max_size && !($f=~/name_file/\ -))\n {\n remove ( \"$dir/$f\");\n $tot_s\ -ize-=$s;\n }\n elsif ( $max_age && -M(\"$dir/$f\\ -")>=$max_age)\n {\n remove ( \"$dir/$f\");\n\ - $tot_size-=$s;\n }\n else\n {\n print\ - W \"$f $s\\n\";\n }\n }\n close (R);\n \ - close (W);\n open (F, \">$size_file\");\n \ - print F \"$tot_size\";\n if ( -e $new_name_fil\ -e){`mv $new_name_file $name_file`;}\n close (F)\ -;\n }\nsub get_tot_size\n {\n my ($dir, $name\ -_file, $size_file)=@_;\n my $size;\n \n i\ -f ( !-d $dir){return 0;}\n if ( !-e $name_file)\ -\n {\n \n &create_ref_file ($dir, $name_file,\ - $size_file);\n }\n open (F, \"$size_file\\ -");\n $size=;\n close (F);\n chomp ($s\ -ize);\n return $size;\n }\nsub size \n {\n \ - my $f=@_[0];\n\n if ( !-d $f){return -s($f);}\\ -n else {return &dir2size($f);}\n }\nsub dir2si\ -ze\n {\n my $d=@_[0];\n my ($s, $f);\n \\ -n if ( !-d $d) {return 0;}\n \n foreach $\ -f (&dir2list ($d))\n {\n if ( -d $f){$s+=&dir\ -2size (\"$d/$f\");}\n else {$s+= -s \"$dir/$f\";}\\ -n }\n return $s;\n }\n\nsub remove \n {\\ -n my $file=@_[0];\n my ($f);\n \n debu\ -g_print( \"--- $file ---\\n\");\n if (($file eq\ - \".\") || ($file eq \"..\") || ($file=~/\\*/)){re\ -turn EXIT_FAILURE;}\n elsif ( !-d $file)\n \ - {\n debug_print (\"unlink $file\\n\");\n if (-e $\ -file){unlink ($file);}\n }\n elsif ( -d $f\ -ile)\n {\n debug_print (\"++++++++ $file ++++\ -+++\\n\");\n foreach $f (&dir2list($file))\n {\n\ - &remove (\"$file/$f\");\n }\n debug_print (\ -\"rmdir $file\\n\");\n rmdir $file;\n }\n \ -else\n {\n debug_print (\"????????? $file ???\ -?????\\n\");\n }\n return EXIT_SUCCESS;\n \ - }\n\nsub dir2list\n {\n my $dir=@_[0];\n m\ -y (@list1, @list2,@list3, $l);\n\n opendir (DIR\ -,$dir);\n @list1=readdir (DIR);\n closedir (\ -DIR);\n \n foreach $l (@list1)\n {\n if\ - ( $l ne \".\" && $l ne \"..\"){@list2=(@list2, $l\ -);}\n }\n @list3 = sort { (-M \"$dir/$list\ -2[$b]\") <=> (-M \"$dir/$list2[$a]\")} @list2;\n \ - return @list3;\n \n }\n\nsub debug_print\n \ -{\n \n if ($DEBUG==1){print @_;}\n \n }\\ -nsub create_ref_file\n {\n my ($dir,$name_file\ -,$size_file)=@_;\n my ($f, $s, $tot_size, @l);\\ -n \n if ( !-d $dir){return;}\n \n @l=&\ -dir2list ($dir);\n open (F, \">$name_file\");\n\ - foreach $f (@l)\n {\n $s=&size(\"$dir/$f\\ -");\n $tot_size+=$s;\n print F \"$f $s\\n\";\n \ - }\n &myecho ($tot_size, \">$size_file\");\n \ - close (F);\n }\nsub add_file \n {\n my ($di\ -r,$name_file,$size_file,$file)=@_;\n my ($s, $t\ -ot_size);\n \n if ( !-d $dir) {return;}\n \ - if ( !-e \"$dir/$file\" ) {return;}\n if ( !\ --e $name_file){&create_ref_file ($dir,$name_file,$\ -size_file);}\n \n $s=&size(\"$dir/$file\ -\");\n open (F, \">>$name_file\");\n print F\ - \"$file\\n\";\n close (F);\n\n $tot_size=&g\ -et_tot_size ($dir,$name_file,$size_file);\n $to\ -t_size+=$s;\n &myecho ($tot_size, \">$size_file\ -\");\n \n }\n \nsub myecho\n {\n my ($stri\ -ng, $file)=@_;\n open (ECHO, $file) || die;\n \ - print ECHO \"$string\";\n close (ECHO);\n }\\ -n \n \n \nsub vtmpnam\n {\n my $tmp_file_n\ -ame;\n $tmp_name_counter++;\n $tmp_file_name\ -=\"tmp_file_for_clean_cache_pdb$$.$tmp_name_counte\ -r\";\n $tmp_file_list[$ntmp_file++]=$tmp_file_n\ -ame;\n if ( -e $tmp_file_name) {return &vtmpnam\ - ();}\n else {return $tmp_file_name;}\n }\n","\ -\n$t_coffee=\"t_coffee\";\n\nforeach $value ( @ARG\ -V)\n {\n $seq_file=$seq_file.\" \".$value;\n \ -}\n\n$name=$ARGV[0];\n$name=~s/\\.[^\\.]*$//;\n$li\ -b_name=\"$name.mocca_lib\";\n$type=`t_coffee $seq_\ -file -get_type -quiet`;\nchop ($type);\n\nif ( $ty\ -pe eq \"PROTEIN\"){$lib_mode=\"lalign_rs_s_pair -l\ -align_n_top 20\";}\nelsif ( $type eq\"DNA\"){$lib_\ -mode=\"lalign_rs_s_dna_pair -lalign_n_top 40\";}\n\ -\nif ( !(-e $lib_name))\n {\n \n $command=\"$t\ -_coffee -mocca -seq_weight=no -cosmetic_penalty=0 \ --mocca_interactive -in $lib_mode -out_lib $lib_nam\ -e -infile $seq_file\";\n \n }\nelsif ( (-e $lib_\ -name))\n {\n $command=\"$t_coffee -mocca -seq_we\ -ight=no -cosmetic_penalty=0 -mocca_interactive -in\ - $lib_name -infile $seq_file\";\n \n }\n\nsystem\ - ($command);\n\nexit;\n\n","my $WSDL = 'http://www\ -.ebi.ac.uk/Tools/webservices/wsdl/WSDaliLite.wsdl'\ -;\n\nuse SOAP::Lite;\nuse Data::Dumper;\nuse Getop\ -t::Long qw(:config no_ignore_case bundling);\nuse \ -File::Basename;\n\nmy $checkInterval = 5;\n\nmy %p\ -arams=(\n 'async' => '1', # Use async mode and\ - simulate sync mode in client\n );\nGetOptions\ -(\n 'pdb1=s' => \\$params{'sequence1'},\n \ - 'chainid1=s' => \\$params{'chainid1'},\n 'pdb\ -2=s' => \\$params{'sequence2'},\n 'chainid2\ -=s' => \\$params{'chainid2'},\n \"help|h\" => \ -\\$help, # Usage info\n \"async|a\" => \\$asyn\ -c, # Asynchronous submission\n \"polljob\" => \ -\\$polljob, # Get results\n \"status\" => \\$s\ -tatus, # Get status\n \"jobid|j=s\" => \\$jobi\ -d, # JobId\n \"email|S=s\" => \\$params{email}\ -, # E-mail address\n \"trace\" => \\$trace\ -, # SOAP messages\n \"sequence=s\" => \\$sequen\ -ce, # Input PDB\n );\n\nmy $scriptName = basena\ -me($0, ());\nif($help) {\n &usage();\n exit(\ -0);\n}\n\nif($trace) {\n print \"Tracing active\ -\\n\";\n SOAP::Lite->import(+trace => 'debug');\ -\n}\n\nmy $soap = SOAP::Lite\n ->service($WSDL)\ -\n ->on_fault(sub {\n my $soap = shift;\\ -n my $res = shift;\n # Throw an exce\ -ption for all faults\n if(ref($res) eq '') \ -{\n die($res);\n } else {\n \ - die($res->faultstring);\n }\n \ - return new SOAP::SOM;\n }\n );\n\ -\nif( !($polljob || $status) &&\n !( defined($p\ -arams{'sequence1'}) && defined($params{'sequence2'\ -}) )\n ) {\n print STDERR 'Error: bad option\ - combination', \"\\n\";\n &usage();\n exit(1\ -);\n}\nelsif($polljob && defined($jobid)) {\n p\ -rint \"Getting results for job $jobid\\n\";\n g\ -etResults($jobid);\n}\nelsif($status && defined($j\ -obid)) {\n print STDERR \"Getting status for jo\ -b $jobid\\n\";\n my $result = $soap->checkStatu\ -s($jobid);\n print STDOUT \"$result\", \"\\n\";\ -\n if($result eq 'DONE') {\n print STDERR \"To \ -get results: $scriptName --polljob --jobid $jobid\\ -\n\";\n }\n}\nelse {\n if(-f $params{'sequen\ -ce1'}) {\n $params{'sequence1'} = read_file($param\ -s{'sequence1'});\n }\n if(-f $params{'sequen\ -ce2'}) {\n $params{'sequence2'} = read_file($param\ -s{'sequence2'});\n }\n\n my $jobid;\n my \ -$paramsData = SOAP::Data->name('params')->type(map\ -=>\\%params);\n # For SOAP::Lite 0.60 and earli\ -er parameters are passed directly\n if($SOAP::L\ -ite::VERSION eq '0.60' || $SOAP::Lite::VERSION =~ \ -/0\\.[1-5]/) {\n $jobid = $soap->runDaliLit\ -e($paramsData);\n }\n # For SOAP::Lite 0.69 \ -and later parameter handling is different, so pass\ -\n # undef's for templated params, and then pas\ -s the formatted args.\n else {\n $jobid \ -= $soap->runDaliLite(undef,\n $paramsData)\ -;\n }\n\n if (defined($async)) {\n print STD\ -OUT $jobid, \"\\n\";\n print STDERR \"To ch\ -eck status: $scriptName --status --jobid $jobid\\n\ -\";\n } else { # Synchronous mode\n prin\ -t STDERR \"JobId: $jobid\\n\";\n sleep 1;\n\ - getResults($jobid);\n }\n}\n\nsub clien\ -tPoll($) {\n my $jobid = shift;\n my $result\ - = 'PENDING';\n # Check status and wait if not \ -finished\n #print STDERR \"Checking status: $jo\ -bid\\n\";\n while($result eq 'RUNNING' || $resu\ -lt eq 'PENDING') {\n $result = $soap->check\ -Status($jobid);\n print STDERR \"$result\\n\ -\";\n if($result eq 'RUNNING' || $result eq\ - 'PENDING') {\n # Wait before polling a\ -gain.\n sleep $checkInterval;\n \ -}\n }\n}\n\nsub getResults($) {\n $jobid = s\ -hift;\n # Check status, and wait if not finishe\ -d\n clientPoll($jobid);\n # Use JobId if out\ -put file name is not defined\n unless(defined($\ -outfile)) {\n $outfile=$jobid;\n }\n \ -# Get list of data types\n my $resultTypes = $s\ -oap->getResults($jobid);\n # Get the data and w\ -rite it to a file\n if(defined($outformat)) { #\ - Specified data type\n my $selResultType;\n\ - foreach my $resultType (@$resultTypes) {\n\ - if($resultType->{type} eq $outformat) \ -{\n $selResultType = $resultType;\n\ - }\n }\n $res=$soap->poll\ -($jobid, $selResultType->{type});\n write_f\ -ile($outfile.'.'.$selResultType->{ext}, $res);\n \ - } else { # Data types available\n # Write\ - a file for each output type\n for my $resu\ -ltType (@$resultTypes){\n #print \"Gett\ -ing $resultType->{type}\\n\";\n $res=$s\ -oap->poll($jobid, $resultType->{type});\n \ - write_file($outfile.'.'.$resultType->{ext}, $re\ -s);\n }\n }\n}\n\nsub read_file($) {\n \ - my $filename = shift;\n open(FILE, $filename)\ -;\n my $content;\n my $buffer;\n while(sy\ -sread(FILE, $buffer, 1024)) {\n $content.= $buffer\ -;\n }\n close(FILE);\n return $content;\n\ -}\n\nsub write_file($$) {\n my ($tmp,$entity) =\ - @_;\n print STDERR \"Creating result file: \".\ -$tmp.\"\\n\";\n unless(open (FILE, \">$tmp\")) \ -{\n return 0;\n }\n syswrite(FILE, $entity);\ -\n close (FILE);\n return 1;\n}\n\nsub usage\ - {\n print STDERR < [options] pdbFile [--outfile \ -string]\n Returns: saves the results to disk\n\nA\ -synchronous job:\n\n Use this if you want to retr\ -ieve the results at a later time. The results \n \ -are stored for up to 24 hours. \n The asynchronou\ -s submission mode is recommended when users are su\ -bmitting \n batch jobs or large database searches\ - \n Usage: $scriptName --email --a\ -sync [options] pdbFile\n Returns: jobid\n\n Use \ -the jobid to query for the status of the job. \n \ -Usage: $scriptName --status --jobid \n Ret\ -urns: string indicating the status of the job:\n \ - DONE - job has finished\n RUNNING - job is ru\ -nning\n NOT_FOUND - job cannot be found\n ER\ -ROR - the jobs has encountered an error\n\n When \ -done, use the jobid to retrieve the status of the \ -job. \n Usage: $scriptName --polljob --jobid [--outfile string]\n\n[Help]\n\n For more det\ -ailed help information refer to\n http://www.ebi.\ -ac.uk/DaliLite/\nEOF\n;\n}\n","my $WSDL = 'http://\ -www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsd\ -l';\n\nuse strict;\nuse SOAP::Lite;\nuse Getopt::L\ -ong qw(:config no_ignore_case bundling);\nuse File\ -::Basename;\n\nmy $checkInterval = 15;\n\nmy $numO\ -pts = scalar(@ARGV);\nmy ($outfile, $outformat, $h\ -elp, $async, $polljob, $status, $ids, $jobid, $tra\ -ce, $sequence);\nmy %params= ( # Defaults\n \ -'async' => 1, # Force into async mode\n 'exp\ -' => 10.0, # E-value threshold\n 'numal' => \ -50, # Maximum number of alignments\n 'scores\ -' => 100, # Maximum number of scores\n \ -);\nGetOptions( # Map the options into variables\n\ - \"program|p=s\" => \\$params{program}, # B\ -LAST program\n \"database|D=s\" => \\$params\ -{database}, # Search database\n \"matrix|m=s\" \ - => \\$params{matrix}, # Scoring matrix\n \\ -"exp|E=f\" => \\$params{exp}, # E-value th\ -reshold\n \"echofilter|e\" => \\$params{echo\ -filter}, # Display filtered sequence\n \"filter\ -|f=s\" => \\$params{filter}, # Low complexity\ - filter name\n \"alignments|b=i\" => \\$params\ -{numal}, # Number of alignments\n \"scores|s=i\\ -" => \\$params{scores}, # Number of scores\n \ - \"sensitivity|S=s\" => \\$params{sensitivity}, \ -# Search sensitivity\n \"sort|t=s\" => \\\ -$params{sort}, # Sort hits by...\n \"stats|T=s\\ -" => \\$params{stats}, # Scoring statistic t\ -o use\n \"strand|d=s\" => \\$params{strand\ -}, # Strand to use in DNA vs. DNA search\n \"to\ -pcombon|c=i\" => \\$params{topcombon}, # Consist\ -ent sets of HSPs\n \"outfile=s\" => \\$ou\ -tfile, # Output file\n \"outformat|o=s\" => \\ -\$outformat, # Output format\n \"help|h\" \ - => \\$help, # Usage info\n \"async|a\" =\ -> \\$async, # Asynchronous mode\n \"polljob\" \ - => \\$polljob, # Get results\n \"status\" \ - => \\$status, # Get job status\n \"ids\" \ - => \\$ids, # Get ids from result\n \ -\"jobid|j=s\" => \\$jobid, # JobId\n \"em\ -ail=s\" => \\$params{email}, # E-mail addr\ -ess\n \"trace\" => \\$trace, # SOAP t\ -race\n \"sequence=s\" => \\$sequence, # Qu\ -ery sequence\n );\n\nmy $scriptName = basename(\ -$0, ());\nif($help || $numOpts == 0) {\n &usage\ -();\n exit(0);\n}\n\nif($trace){\n print STD\ -ERR \"Tracing active\\n\";\n SOAP::Lite->import\ -(+trace => 'debug');\n}\n\nmy $soap = SOAP::Lite\n\ - ->service($WSDL)\n ->proxy('http://localhos\ -t/',\n #proxy => ['http' => 'http://your.proxy.\ -server/'], # HTTP proxy\n timeout => 600, # HTT\ -P connection timeout\n )\n ->on_fault(sub { \ -# SOAP fault handler\n my $soap = shift;\n \ - my $res = shift;\n # Throw an except\ -ion for all faults\n if(ref($res) eq '') {\\ -n die($res);\n } else {\n \ - die($res->faultstring);\n }\n r\ -eturn new SOAP::SOM;\n }\n );\n\n\ -if( !($polljob || $status || $ids) &&\n !( defi\ -ned($ARGV[0]) || defined($sequence) )\n ) {\n \ - print STDERR 'Error: bad option combination', \"\ -\\n\";\n &usage();\n exit(1);\n}\nelsif($pol\ -ljob && defined($jobid)) {\n print \"Getting re\ -sults for job $jobid\\n\";\n getResults($jobid)\ -;\n}\nelsif($status && defined($jobid)) {\n pri\ -nt STDERR \"Getting status for job $jobid\\n\";\n \ - my $result = $soap->checkStatus($jobid);\n p\ -rint STDOUT \"$result\\n\";\n if($result eq 'DO\ -NE') {\n print STDERR \"To get results: $scriptNam\ -e --polljob --jobid $jobid\\n\";\n }\n} \nelsi\ -f($ids && defined($jobid)) {\n print STDERR \"G\ -etting ids from job $jobid\\n\";\n getIds($jobi\ -d);\n}\nelse {\n # Prepare input data\n my $\ -content;\n my (@contents) = ();\n if(-f $ARG\ -V[0] || $ARGV[0] eq '-') { \n $content={type=>'seq\ -uence',content=>read_file($ARGV[0])}; \n }\n \ - if($sequence) { \n if(-f $sequence || $sequence e\ -q '-') { \n $content={type=>'sequence',content\ -=>read_file($ARGV[0])}; \n } else {\n $content\ -={type=>'sequence',content=>$sequence};\n }\n }\ -\n push @contents, $content;\n\n # Submit th\ -e job\n my $paramsData = SOAP::Data->name('para\ -ms')->type(map=>\\%params);\n my $contentData =\ - SOAP::Data->name('content')->value(\\@contents);\\ -n # For SOAP::Lite 0.60 and earlier parameters \ -are passed directly\n if($SOAP::Lite::VERSION e\ -q '0.60' || $SOAP::Lite::VERSION =~ /0\\.[1-5]/) {\ -\n $jobid = $soap->runWUBlast($paramsData, \ -$contentData);\n }\n # For SOAP::Lite 0.69 a\ -nd later parameter handling is different, so pass\\ -n # undef's for templated params, and then pass\ - the formatted args.\n else {\n $jobid =\ - $soap->runWUBlast(undef, undef,\n $paramsDa\ -ta, $contentData);\n }\n\n # Asynchronous mo\ -de: output jobid and exit.\n if (defined($async\ -)) {\n print STDOUT $jobid, \"\\n\";\n prin\ -t STDERR \"To check status: $scriptName --status -\ --jobid $jobid\\n\";\n }\n # Synchronous mode\ -: try to get results\n else {\n print ST\ -DERR \"JobId: $jobid\\n\";\n sleep 1;\n \ - getResults($jobid);\n }\n}\n\nsub getIds($)\ - {\n my $jobid = shift;\n my $results = $soa\ -p->getIds($jobid);\n for my $result (@$results)\ -{\n print \"$result\\n\";\n }\n}\n\nsub clientP\ -oll($) {\n my $jobid = shift;\n my $result =\ - 'PENDING';\n # Check status and wait if not fi\ -nished\n while($result eq 'RUNNING' || $result \ -eq 'PENDING') {\n $result = $soap->checkSta\ -tus($jobid);\n print STDERR \"$result\\n\";\ -\n if($result eq 'RUNNING' || $result eq 'P\ -ENDING') {\n # Wait before polling agai\ -n.\n sleep $checkInterval;\n }\n\ - }\n}\n\nsub getResults($) {\n my $jobid = s\ -hift;\n my $res;\n # Check status, and wait \ -if not finished\n clientPoll($jobid);\n # Us\ -e JobId if output file name is not defined\n un\ -less(defined($outfile)) {\n $outfile=$jobid\ -;\n }\n # Get list of data types\n my $re\ -sultTypes = $soap->getResults($jobid);\n # Get \ -the data and write it to a file\n if(defined($o\ -utformat)) { # Specified data type\n if($outformat\ - eq 'xml') {$outformat = 'toolxml';}\n if($outform\ -at eq 'txt') {$outformat = 'tooloutput';}\n \ - my $selResultType;\n foreach my $resultTyp\ -e (@$resultTypes) {\n if($resultType->{\ -type} eq $outformat) {\n $selResult\ -Type = $resultType;\n }\n }\n \ - $res=$soap->poll($jobid, $selResultType->{typ\ -e});\n if($outfile eq '-') {\n write_file($ou\ -tfile, $res);\n } else {\n write_file($outfile\ -.'.'.$selResultType->{ext}, $res);\n }\n } else\ - { # Data types available\n # Write a file \ -for each output type\n for my $resultType (\ -@$resultTypes){\n #print STDERR \"Getti\ -ng $resultType->{type}\\n\";\n $res=$so\ -ap->poll($jobid, $resultType->{type});\n if($o\ -utfile eq '-') {\n write_file($outfile, $res);\n \ - } else {\n write_file($outfile.'.'.$resultTyp\ -e->{ext}, $res);\n }\n }\n }\n}\n\ns\ -ub read_file($) {\n my $filename = shift;\n \ -my ($content, $buffer);\n if($filename eq '-') \ -{\n while(sysread(STDIN, $buffer, 1024)) {\n $\ -content .= $buffer;\n }\n }\n else { # File\\ -n open(FILE, $filename) or die \"Error: unable to \ -open input file\";\n while(sysread(FILE, $buffer, \ -1024)) {\n $content .= $buffer;\n }\n close(FI\ -LE);\n }\n return $content;\n}\n\nsub write_\ -file($$) {\n my ($filename, $data) = @_;\n p\ -rint STDERR 'Creating result file: ' . $filename .\ - \"\\n\";\n if($filename eq '-') {\n print STDO\ -UT $data;\n }\n else {\n open(FILE, \">$file\ -name\") or die \"Error: unable to open output file\ -\";\n syswrite(FILE, $data);\n close(FILE);\n }\ -\n}\n\nsub usage {\n print STDERR < [options...] seqFile\ -\n Returns: saves the results to disk\n\nAsynchro\ -nous job:\n\n Use this if you want to retrieve th\ -e results at a later time. The results \n are sto\ -red for up to 24 hours. \n The asynchronous submi\ -ssion mode is recommended when users are submittin\ -g \n batch jobs or large database searches \n Us\ -age: $scriptName --async --email [o\ -ptions...] seqFile\n Returns : jobid\n\n Use the\ - jobid to query for the status of the job. \n Usa\ -ge: $scriptName --status --jobid \n Return\ -s : string indicating the status of the job:\n \ -DONE - job has finished\n RUNNING - job is runn\ -ing\n NOT_FOUND - job cannot be found\n ERRO\ -R - the jobs has encountered an error\n\n When do\ -ne, use the jobid to retrieve the status of the jo\ -b. \n Usage: $scriptName --polljob --jobid [--outfile string]\n Returns: saves the results\ - to disk\n\n[Help]\n\nFor more detailed help infor\ -mation refer to \nhttp://www.ebi.ac.uk/blast2/WU-B\ -last2_Help_frame.html\n \nEOF\n;\n}\n","\nmy $WSDL\ - = 'http://www.ebi.ac.uk/Tools/webservices/wsdl/WS\ -Blastpgp.wsdl';\n\nuse SOAP::Lite;\nuse Getopt::Lo\ -ng qw(:config no_ignore_case bundling);\nuse File:\ -:Basename;\n\nmy $checkInterval = 15;\n\nmy %param\ -s=(\n 'async' => '1', # Use async mode and sim\ -ulate sync mode in client\n );\nGetOptions(\n \ - \"mode=s\" => \\$params{mode}, # Sear\ -ch mode: PSI-Blast or PHI-Blast\n \"database|d=\ -s\" => \\$params{database}, # Database to sear\ -ch\n \"matrix|M=s\" => \\$params{matrix},\ -# Scoring maxtrix\n \"exp|e=f\" => \\$\ -params{exp}, # E-value\n \"expmulti|h=f\" =\ -> \\$params{expmulti}, # E-value\n \"filter|F=s\ -\" => \\$params{filter}, # Low complexity fi\ -lter\n \"dropoff|X=i\" => \\$params{dropof\ -f}, # Dropoff score\n \"finaldropoff|Z=i\" => \\ -\$params{finaldropoff}, # Final dropoff score\n \ - \"scores|v=i\" => \\$params{scores}, # Max \ -number of scores\n \"align=i\" => \\$p\ -arams{align}, # Alignment view\n \"startregion|\ -S=i\" => \\$params{startregion}, # Start of regio\ -n in query\n \"endregion|H=i\" => \\$params{\ -endregion}, # End of region in query\n \"maxpas\ -ses|j=i\" => \\$params{maxpasses}, # Number of \ -PSI iterations\n \"opengap|G=i\" => \\$par\ -ams{opengap}, # Gap open penalty\n \"extendgap|\ -E=i\" => \\$params{extendgap}, # Gap extension \ -penalty\n \"pattern=s\" => \\$params{pat\ -tern}, # PHI-BLAST pattern\n \"usagemode|p=s\" \ - => \\$params{usagemode}, # PHI-BLAST program\n \ - \"appxml=s\" => \\$params{appxml}, # Ap\ -plication XML\n \"sequence=s\" => \\$sequ\ -ence, # Query sequence\n \"help\" => \\$\ -help, # Usage info\n \"polljob\" => \\$p\ -olljob, # Get results\n \"status\" => \\\ -$status, # Get status\n \"ids\" =>\ - \\$ids, # Get ids from result\n \"jobid=s\" \ - => \\$jobid, # JobId\n \"outfile=s\" \ - => \\$outfile, # Output filename\n \"outfor\ -mat|o=s\" => \\$outformat, # Output file format\ -\n \"async|a\" => \\$async, # Async subm\ -ission\n \"email=s\" => \\$params{emai\ -l}, # User e-mail address\n \"trace\" \ - => \\$trace, # Show SOAP messages\n );\n\nmy \ -$scriptName = basename($0, ());\nif($help) {\n \ -&usage();\n exit(0);\n}\n\nif ($trace){\n pr\ -int \"Tracing active\\n\";\n SOAP::Lite->import\ -(+trace => 'debug');\n}\n\nmy $soap = SOAP::Lite\n\ - ->service($WSDL)\n ->on_fault(sub {\n \ - my $soap = shift;\n my $res = shift;\n \ - # Throw an exception for all faults\n \ -if(ref($res) eq '') {\n die($res);\n \ - } else {\n die($res->faultstring);\ -\n }\n return new SOAP::SOM;\n }\\ -n );\n\nif( !($polljob || $status ||\ - $ids) &&\n !( (defined($ARGV[0]) && -f $ARGV[0\ -]) || defined($sequence) )\n ) {\n print STD\ -ERR 'Error: bad option combination', \"\\n\";\n \ - &usage();\n exit(1);\n}\nelsif($polljob && def\ -ined($jobid)) {\n print \"Getting results for j\ -ob $jobid\\n\";\n getResults($jobid);\n}\nelsif\ -($status && defined($jobid)) {\n print STDERR \\ -"Getting status for job $jobid\\n\";\n my $resu\ -lt = $soap->checkStatus($jobid);\n print STDOUT\ - $result, \"\\n\";\n if($result eq 'DONE') {\n \ -print STDERR \"To get results: $scriptName --pollj\ -ob --jobid $jobid\\n\";\n }\n} \nelsif($ids &&\ - defined($jobid)) {\n print STDERR \"Getting id\ -s from job $jobid\\n\";\n getIds($jobid);\n}\ne\ -lse {\n if(-f $ARGV[0]) { \n $content={type=>'s\ -equence', content=>read_file($ARGV[0])}; \n }\n\ - if($sequence) { \n if(-f $sequence) {\n $c\ -ontent={type=>'sequence', content=>read_file($sequ\ -ence)}; \n } else {\n $content={type=>'sequenc\ -e', content=>$sequence};\n }\n }\n push @con\ -tent, $content;\n\n my $jobid;\n my $paramsD\ -ata = SOAP::Data->name('params')->type(map=>\\%par\ -ams);\n my $contentData = SOAP::Data->name('con\ -tent')->value(\\@content);\n # For SOAP::Lite 0\ -.60 and earlier parameters are passed directly\n \ - if($SOAP::Lite::VERSION eq '0.60' || $SOAP::Lite\ -::VERSION =~ /0\\.[1-5]/) {\n $jobid = $soa\ -p->runBlastpgp($paramsData, $contentData);\n }\\ -n # For SOAP::Lite 0.69 and later parameter han\ -dling is different, so pass\n # undef's for tem\ -plated params, and then pass the formatted args.\n\ - else {\n $jobid = $soap->runBlastpgp(un\ -def, undef,\n $paramsData, $contentData);\n\ - }\n\n if (defined($async)) {\n print STDOUT\ - $jobid, \"\\n\";\n print STDERR \"To check\ - status: $scriptName --status --jobid $jobid\\n\";\ -\n } else { # Synchronous mode\n print S\ -TDERR \"JobId: $jobid\\n\";\n sleep 1;\n \ - getResults($jobid);\n }\n}\n\nsub getIds($\ -) {\n $jobid = shift;\n my $results = $soap-\ ->getIds($jobid);\n for $result (@$results){\n p\ -rint \"$result\\n\";\n }\n}\n\nsub clientPoll($\ -) {\n my $jobid = shift;\n my $result = 'PEN\ -DING';\n # Check status and wait if not finishe\ -d\n #print STDERR \"Checking status: $jobid\\n\\ -";\n while($result eq 'RUNNING' || $result eq '\ -PENDING') {\n $result = $soap->checkStatus(\ -$jobid);\n print STDERR \"$result\\n\";\n \ - if($result eq 'RUNNING' || $result eq 'PENDI\ -NG') {\n # Wait before polling again.\n\ - sleep $checkInterval;\n }\n \ -}\n}\n\nsub getResults($) {\n $jobid = shift;\n\ - # Check status, and wait if not finished\n \ -clientPoll($jobid);\n # Use JobId if output fil\ -e name is not defined\n unless(defined($outfile\ -)) {\n $outfile=$jobid;\n }\n # Get l\ -ist of data types\n my $resultTypes = $soap->ge\ -tResults($jobid);\n # Get the data and write it\ - to a file\n if(defined($outformat)) { # Specif\ -ied data type\n my $selResultType;\n \ - foreach my $resultType (@$resultTypes) {\n \ - if($resultType->{type} eq $outformat) {\n \ - $selResultType = $resultType;\n \ - }\n }\n $res=$soap->poll($jobid\ -, $selResultType->{type});\n write_file($ou\ -tfile.'.'.$selResultType->{ext}, $res);\n } els\ -e { # Data types available\n # Write a file\ - for each output type\n for my $resultType \ -(@$resultTypes){\n #print \"Getting $re\ -sultType->{type}\\n\";\n $res=$soap->po\ -ll($jobid, $resultType->{type});\n writ\ -e_file($outfile.'.'.$resultType->{ext}, $res);\n \ - }\n }\n}\n\nsub read_file($) {\n my $f\ -ilename = shift;\n open(FILE, $filename);\n \ -my $content;\n my $buffer;\n while(sysread(F\ -ILE, $buffer, 1024)) {\n $content.= $buffer;\n \ -}\n close(FILE); \n return $content;\n}\n\n\ -sub write_file($$) {\n my ($tmp,$entity) = @_;\\ -n print STDERR \"Creating result file: \".$tmp.\ -\"\\n\";\n unless(open (FILE, \">$tmp\")) {\n r\ -eturn 0;\n }\n syswrite(FILE, $entity);\n \ - close (FILE);\n return 1;\n}\n\nsub usage {\n \ - print STDERR < [options...] seqfile\n Returns: saves\ - the results to disk\n\nAsynchronous job:\n\n Use\ - this if you want to retrieve the results at a lat\ -er time. The results\n are stored for up to 24 ho\ -urs.\n The asynchronous submission mode is recomm\ -ended when users are submitting\n batch jobs or l\ -arge database searches\n Usage: blastpgp.pl --ema\ -il --async [options...] seqFile\n Re\ -turns: jobid\n\n Use the jobid to query for the s\ -tatus of the job.\n Usage: blastpgp.pl --status -\ --jobid \n Returns: string indicating the s\ -tatus of the job\n DONE - job has finished\n \ - RUNNING - job is running\n NOT_FOUND - job can\ -not be found\n ERROR - the jobs has encountered\ - an error\n\n When done, use the jobid to retriev\ -e the results of the job.\n Usage: blastpgp.pl --\ -polljob --jobid [--outfile ]\n \ -Returns: saves the results to disk\nEOF\n;\n}\n","\ -\n\n\nmy $PROBTRESH = 0.3;# base pairs below this \ -prob threshold will be ignored\nmy $WEIGHT = 100.0\ -; # float!!\nmy $NUCALPH = \"ACGTUNRYMKSWHBVD\";\n\ -use vars qw($NUCALPH $WEIGHT);\n\nmy $myname = bas\ -ename($0);\n\nuse strict;\nuse warnings;\n\nuse Fi\ -le::Basename;\nuse Getopt::Long;\nuse File::Glob '\ -:glob';\nuse File::Spec;\nuse File::Temp qw/ tempf\ -ile tempdir /;\n\n\n\n\nsub tcoffeelib_header($;$)\ -\n{\n my ($nseq, $fd) = @_;\n if (! defined(\ -$fd)) {\n $fd = *STDOUT;\n }\n printf\ - $fd \"! TC_LIB_FORMAT_01\\n\";\n printf $fd \"\ -%d\\n\", $nseq;\n}\n\n\nsub tcoffeelib_header_adds\ -eq($$;$)\n{\n my ($id, $seq, $fd) = @_;\n if\ - (! defined($fd)) {\n $fd = *STDOUT;\n }\ -\n printf $fd \"%s %d %s\\n\", $id, length($seq\ -), $seq;\n}\n\n\nsub tcoffeelib_comment($;$)\n{\n \ - my ($comment, $fd) = @_;\n if (! defined($fd\ -)) {\n $fd = *STDOUT;\n }\n printf $f\ -d \"!\" . $comment . \"\\n\";\n}\n\n\nsub tcoffeel\ -ib_struct($$$;$)\n{\n my ($nseq, $len, $bpm, $f\ -d) = @_;\n\n if (! defined($fd)) {\n $fd\ - = *STDOUT;\n }\n\n # output basepair indice\ -s with fixed weight\n printf $fd \"#%d %d\\n\",\ - $nseq, $nseq;\n # output basepairs (only once)\ - and with unit-offset\n for (my $i=0; $i<$len; \ -$i++) {\n for (my $j=$i+1; $j<$len; $j++) {\ -\n if (! defined($bpm->[$i][$j])) {\n \ - print STDERR \"ERROR: \\$bpm->[$i][$\ -j] undefined\\n\";\n }\n if \ -($bpm->[$i][$j]>0) {\n print $fd $i\ -+1;\n print $fd \" \";\n \ - print $fd $j+1;\n print $fd \"\ - \" . $bpm->[$i][$j] . \"\\n\";\n }\n \ - }\n }\n}\n\n\nsub tcoffeelib_footer(;$)\n\ -{\n my ($fd) = @_;\n if (! defined($fd)) {\n\ - $fd = *STDOUT;\n }\n print $fd \"! S\ -EQ_1_TO_N\\n\";\n}\n\n\n \nsub plfold($$$)\n{ \ - \n my ($id, $seq, $probtresh) = @_;\n my (\ -@struct);# return\n my ($templ, $fhtmp, $fnamet\ -mp, $cmd, $ctr, $window_size);\n\n $templ = $my\ -name . \".\" . $id . \".pid-\" . $$ . \".XXXXXX\";\ -\n ($fhtmp, $fnametmp) = tempfile($templ, UNLIN\ -K => 1); \n print $fhtmp \">$id\\n$seq\\n\";\n\\ -n # --- init basepair array\n #\n for (my\ - $i=0; $i/dev/n\ -ull\";\n system($cmd);\n \n if ($? != 0) \ -{\n printf STDERR \"ERROR: RNAplfold ($cmd)\ - exited with error status %d\\n\", $? >> 8;\n \ - return;\n }\n #unlink($fnametmp);\n my\ - $fps = sprintf(\"%s_dp.ps\", $id); # check long n\ -ame\n \n if (! -s $fps) {\n {\n\n $fps \ -= sprintf(\"%s_dp.ps\", substr($id,0,12)); # check\ - short name\n if (! -s $fps)\n {\n die(\"co\ -uldn't find expected file $fps\\n\");\n return\ -;\n }\n }\n }\n\n \n # --- read ba\ -se pairs from created postscript\n #\n open(\ -FH, $fps);\n while (my $line = ) {\n \ - my ($nti, $ntj, $prob);\n chomp($line); \ - \n # line: bp bp sqrt-prob ubox\n \ - my @match = ($line =~ m/^([0-9]+) +([0-9]+) +([\ -0-9\\.]+) +ubox$/);\n if (scalar(@match)) {\ -\n $nti=$1;\n $ntj=$2;\n \ - $prob=$3*$3;# prob stored as square root\n\ -\n if ($prob>$probtresh) {\n \ - #printf STDERR \"\\$struct[$nti][$ntj] sqrtpr\ -ob=$3 prob=$prob > $probtresh\\n\";\n \ - $struct[$nti-1][$ntj-1] = $WEIGHT\n \ -}\n # store with zero-offset\n }\ -\n }\n close(FH);\n\n # remove or gzi pos\ -tscript\n #\n unlink($fps);\n #\n # or\ - gzip\n #$cmd = \"gzip -qf $fps\";\n #system\ -($cmd);\n #if ($? != 0) {\n # printf STDE\ -RR \"ERROR: gzip ($cmd) exited with error status %\ -d\\n\", $? >> 8;\n #}\n\n return \\@struct;\\ -n}\n\n\n\n\n\nsub rnaseqfmt($)\n{\n my ($seq) =\ - @_;\n # remove gaps\n $seq =~ s/-//g;\n \ -# uppercase RNA\n $seq = uc($seq);\n # T -> \ -U\n $seq =~ s/T/U/g;\n # check for invalid c\ -haraters\n $_ = $seq;\n s/[^$NUCALPH]//g;\n \ - return $_;\n}\n\n\n\n\nsub usage(;$)\n{ \n \ - my ($errmsg) = @_;\n if ($errmsg) {\n \ -print STDERR \"ERROR: $errmsg\\n\";\n }\n pr\ -int STDERR << \"EOF\";\n$myname:\n Creates a T-Cof\ -fee RNA structure library from RNAplfold predictio\ -n.\n See FIXME:citation\nUsage:\n $myname -in seq_\ -file -out tcoffee_lib\nEOF\n exit(1);\n}\n\nsub\ - read_fasta_seq \n {\n my $f=$_[0];\n my %h\ -seq;\n my (@seq, @com, @name);\n my ($a, $s,\ -$nseq);\n\n open (F, $f);\n while ()\n \ - {\n $s.=$_;\n }\n close (F);\n\n \n \ - @name=($s=~/>(\\S*).*\\n[^>]*/g);\n \n @s\ -eq =($s=~/>.*.*\\n([^>]*)/g);\n @com =($s=~/>(\\ -\S*)(.*)\\n([^>]*)/g);\n\n\n $nseq=$#name+1;\n \ - \n for ($a=0; $a<$nseq; $a++)\n {\n my $n\ -=$name[$a];\n my $s;\n $hseq{$n}{name}=$n;\n $s=$s\ -eq[$a];$s=~s/\\s//g;\n \n $hseq{$n}{seq}=$s;\n $hs\ -eq{$n}{com}=$com[$a];\n }\n return %hseq;\\ -n }\n\n\n\n\n\n\n\nmy $fmsq = \"\";\nmy $flib = \\ -"\";\nmy %OPTS;\nmy %seq;\nmy ($id, $nseq, $i);\nm\ -y @nl;\n\nGetOptions(\"in=s\" => \\$fmsq, \"out=s\\ -" => \\$flib);\n\nif (! -s $fmsq) {\n usage(\"e\ -mpty or non-existant file \\\"$fmsq\\\"\")\n}\nif \ -(length($flib)==0) {\n usage(\"empty out-filena\ -me\")\n}\n\n\n\n\n\n\n%seq=read_fasta_seq($fmsq);\\ -n\n\n@nl=keys(%seq);\n\n$nseq=$#nl+1;\nopen FD_LIB\ -, \">$flib\" or die \"can't open $flib!\";\ntcoffe\ -elib_header($nseq, *FD_LIB);\nforeach $id (keys (%\ -seq))\n {\n my ($seq, $fmtseq);\n \n $se\ -q = $seq{$id}{seq};\n \n $fmtseq = rnaseqfmt\ -($seq);# check here, formatting for folding import\ -ant later\n if (length($seq)!=length($fmtseq)) \ -{\n print STDERR \"ERROR: invalid sequence \ -$id is not an RNA sequence. read seq is: $seq\\n\"\ -;\n exit\n }\n \n tcoffeelib_head\ -er_addseq($id, uc($seq), *FD_LIB);\n }\ntcoffeeli\ -b_comment(\"generated by $myname on \" . localtime\ -(), *FD_LIB);\n\n\n\n$i=0;\nforeach $id (keys (%se\ -q))\n {\n my ($cleanid, $seq, $bpm);\n $seq\ -=$seq{$id}{seq};\n $cleanid = $id;\n $cleani\ -d =~ s,[/ ],_,g;# needed for rnaplfold\n $seq =\ - rnaseqfmt($seq);\n \n $bpm = plfold($cleani\ -d, rnaseqfmt($seq), $PROBTRESH); \n \n \ - tcoffeelib_struct($i+1, length($seq), $bpm, *FD_L\ -IB);\n $i++;\n}\n\n\ntcoffeelib_footer(*FD_LIB)\ -;\nclose FD_LIB;\nexit (0);\n\n","\n\n\n\n\n$cmd=j\ -oin ' ', @ARGV;\nif ($cmd=~/-infile=(\\S+)/){ $seq\ -file=$1;}\nif ($cmd=~/-outfile=(\\S+)/){ $libfile=\ -$1;}\n\n\n\n%s=read_fasta_seq ($seqfile);\n\nopen \ -(F, \">$libfile\");\nforeach $name (keys (%s))\n \ -{\n my $tclib=\"$name.RNAplfold_tclib\";\n p\ -rint (F \">$name _F_ $tclib\\n\");\n seq2RNAplf\ -old2tclib ($name, $s{$name}{seq}, $tclib);\n }\nc\ -lose (F);\nexit (EXIT_SUCCESS);\n\nsub seq2RNAplfo\ -ld2tclib\n {\n my ($name, $seq, $tclib)=@_;\n \ - my ($tmp);\n $n++;\n $tmp=\"tmp4seq2RNApl\ -fold_tclib.$$.$n.pep\";\n open (RF, \">$tmp\");\ -\n print (RF \">$name\\n$seq\\n\");\n close \ -(RF);\n \n system \"t_coffee -other_pg RNApl\ -fold2tclib.pl -in=$tmp -out=$tclib\";\n \n u\ -nlink ($tmp);\n return $tclib;\n }\n \n \ -\nsub read_fasta_seq \n {\n my $f=@_[0];\n \ -my %hseq;\n my (@seq, @com, @name);\n my ($a\ -, $s,$nseq);\n\n open (F, $f);\n while ()\ -\n {\n $s.=$_;\n }\n close (F);\n\n \ - \n @name=($s=~/>(\\S*).*\\n[^>]*/g);\n \n \ - @seq =($s=~/>.*.*\\n([^>]*)/g);\n @com =($s=\ -~/>\\S*(.*)\\n([^>]*)/g);\n\n \n $nseq=$#nam\ -e+1;\n \n for ($a=0; $a<$nseq; $a++)\n \ -{\n my $n=$name[$a];\n $hseq{$n}{name}=$n;\n $hseq\ -{$n}{seq}=$seq[$a];\n $hseq{$n}{com}=$com[$a];\n \ - }\n return %hseq;\n }\n","use Getopt::Long\ -;\nGetOptions(\"-in=s\" => \\$fmsq1, \"-out=s\" =>\ - \\$outfile, \"-arch=s\" => \\$arch,\"-psv=s\" => \ -\\$psv, \"-hmmtop_home=s\", \\$hmmtop_home );\nope\ -n (O, \">$outfile\");\n\nif (!$hmmtop_home){$hmmto\ -p_home=\"/home/notredame/packages/hmmtop/hmmtop_2.\ -1\";}\nif ($arch){$ENV{'HMMTOP_ARCH'}=$arch;}\nels\ -e {$ENV{'HMMTOP_ARCH'}=\"$hmmtop_home/hmmtop.arch\\ -";}\n\nif ($psv){$ENV{'HMMTOP_PSV'}=$psv;}\nelse{$\ -ENV{'HMMTOP_PSV'}=\"$hmmtop_home/hmmtop.psv\";}\n\\ -n$fmsq=\"seq2convert.$$.tmp\";\nsystem (\"t_coffee\ - -other_pg seq_reformat -in $fmsq1 -output fasta_s\ -eq > $fmsq\");\n%seq=read_fasta_seq($fmsq);\n\n$tm\ -pfile=\"fasta_seq2hmmtop_fasta.$$.tmp\";\nforeach \ -$s (keys (%seq))\n {\n \n open F, \">$tmpfi\ -le\";\n print F \">seq\\n$seq{$s}{seq}\\n\";\n \ - close F;\n\n $result=`hmmtop -if=$tmpfile -s\ -f=FAS -pl 2>/dev/null`;\n @r=($result=~/(.+)/g)\ -;\n foreach $l (@r)\n {\n \n if ($l=~/pred\ -(.*)/)\n {$p.=$1;}\n }\n \n $p=~s/\\s\ -//g;\n print O \">$seq{$s}{name}\\n$p\\n\";\n \ - $p=\"\";\n }\nunlink \"$tmpfile\";\nunlink \"$f\ -msq\";\nclose (O);\n\nsub read_fasta_seq \n {\n \ - my $f=$_[0];\n my %hseq;\n my (@seq, @com,\ - @name);\n my ($a, $s,$nseq);\n\n open (F, $\ -f);\n while ()\n {\n $s.=$_;\n }\n\ - close (F);\n\n \n @name=($s=~/>(.*).*\\n\ -[^>]*/g);\n \n @seq =($s=~/>.*.*\\n([^>]*)/g\ -);\n @com =($s=~/>.*(.*)\\n([^>]*)/g);\n\n\n \ - $nseq=$#name+1;\n \n \n for ($a=0; $a<$nse\ -q; $a++)\n {\n my $n=$name[$a];\n my $s;\n $h\ -seq{$n}{name}=$n;\n $s=$seq[$a];$s=~s/\\s//g;\n \n\ - $hseq{$n}{seq}=$s;\n $hseq{$n}{com}=$com[$a];\n \ - }\n return %hseq;\n }\n","\n\n\n\n\nmy $FM\ -ODEL =\"\"; \nmy $TMPDIR = \"/tmp\";\n\n\n\n\nmy $\ -NUCALPH = \"ACGTUNRYMKSWHBVD\";\nmy $PRIMNUCALPH =\ - \"ACGTUN\";\nuse vars qw($NUCALPH $PRIMNUCALPH $T\ -MPDIR);\n\n\nmy $errmsg;\nuse vars qw($errmsg);\n\\ -n\n\nuse Getopt::Long;\nuse Cwd;\nuse File::Basena\ -me;\nuse File::Temp qw/ tempfile tempdir /;\nuse F\ -ile::Copy;\nuse File::Path;\n\n\n\nsub usage(;$)\n\ -{\n my ($errmsg) = @_;\n my $myname = basena\ -me($0);\n\n if ($errmsg) {\n print STDER\ -R \"ERROR: $errmsg\\n\";\n }\n\n print STDER\ -R << \"EOF\";\n \n$myname: align two sequences \ -by means of consan\\'s sfold\nUsage:\n $myname -i \ -file -o file -d path\nOptions:\n -i|--in : pairwis\ -e input sequence file\n -o|--out: output alignment\ -\n -d|--directory containing data\n\nEOF\n}\n\nsub\ - read_stk_aln \n {\n my $f=$_[0];\n my ($se\ -q, $id);\n \n my %hseq;\n\n open (STK, \"\ -$f\");\n while ()\n {\n if ( /^#/ || \ -/^\\/\\// || /^\\s*$/){;}\n else\n {\n ($id,\ -$seq)=/(\\S+)\\s+(\\S+)/;\n $hseq{$id}{'seq'}.\ -=$seq;\n }\n }\n close (STK);\n retur\ -n %hseq;\n }\nsub read_fasta_seq \n {\n my $f\ -=$_[0];\n my %hseq;\n my (@seq, @com, @name)\ -;\n my ($a, $s,$nseq);\n\n open (F, $f);\n \ - while ()\n {\n $s.=$_;\n }\n clo\ -se (F);\n\n \n @name=($s=~/>(.*).*\\n[^>]*/g\ -);\n \n @seq =($s=~/>.*.*\\n([^>]*)/g);\n \ - @com =($s=~/>.*(.*)\\n([^>]*)/g);\n\n \n $n\ -seq=$#name+1;\n \n for ($a=0; $a<$nseq; $a++\ -)\n {\n my $n=$name[$a];\n $hseq{$n}{name}=$n\ -;\n $hseq{$n}{seq}=$seq[$a];\n $hseq{$n}{com}=$com\ -[$a];\n }\n return %hseq;\n }\n\n\n\nsub \ -sfold_parseoutput($$)\n{\n my ($frawout, $foutf\ -a) = @_;\n my %haln;\n my ($fstk, $cmd, $id)\ -;\n open FOUTFA, \">$foutfa\";\n \n $fstk\ - = $frawout . \".stk\";\n \n # first line of\ - raw out contains info\n # remaining stuff is s\ -tockholm formatted\n $cmd = \"sed -e '1d' $fraw\ -out\";\n system(\"$cmd > $fstk\");\n if ($? \ -!= 0) {\n $errmsg = \"command failed with e\ -xit status $?.\";\n $errmsg .= \"Command w\ -as \\\"$cmd\\\"\";\n return -1;\n }\n\n \ - # this gives an error message. just ignore it..\ -.\n %haln=read_stk_aln ( $fstk);\n foreach $\ -i (keys (%haln))\n {\n my $s;\n $s=$haln{$i}{\ -'seq'};\n $s =~ s/\\./-/g;\n print FOUTFA \">$i\\n\ -$s\\n\";\n }\n close FOUTFA;\n return 0\ -;\n}\n\n\n\n\nsub sfold_wrapper($$$$)\n{\n \n \ - my ($fs1, $fs2, $fmodel, $foutfa) = @_;\n \n\\ -n my ($cmd, $frawout, $ferrlog, $freadme, $ftim\ -elog, $fstk);\n\n # add basename($fmsqin) (unk\ -nown here!)\n $frawout = \"sfold.log\";\n $f\ -errlog = \"sfold.err\";\n $ftimelog = \"sfold.t\ -ime\";\n $freadme = \"sfold.README\";\n $fs\ -tk = \"sfold.stk\";\n \n # prepare execution\ -...\n #\n # ./tmp is essential for dswpalign\ -\n # otherwise you'll get a segfault\n mkdir\ - \"./tmp\";\n \n $cmd = \"sfold -m $fmodel $\ -fs1 $fs2\";\n open(FREADME,\">$freadme\");\n \ - print FREADME \"$cmd\\n\"; \n close(FREADME);\\ -n\n # and go\n #\n system(\"/usr/bin/time\ - -p -o $ftimelog $cmd >$frawout 2>$ferrlog\");\n \ - if ($? != 0) {\n $errmsg = \"command fail\ -ed with exit status $?\";\n $errmsg .= \"co\ -mmand was \\\"$cmd\\\". See \" . getcwd . \"\\n\";\ -\n return -1;\n }\n\n return sfold_pa\ -rseoutput($frawout, $foutfa);\n}\n\n\n\n\n\n\n\nmy\ - ($help, $fmsqin, $fmsaout);\nGetOptions(\"help\" \ - => \\$help,\n \"in=s\" => \\$fmsqin,\n \ - \"out=s\" => \\$fmsaout,\n \"data=s\"\ - => \\$ref_dir);\n\n\n\nif ($help) {\n usage();\ -\n exit(0);\n}\nif (! defined($fmsqin)) {\n \ -usage('missing input filename');\n exit(1);\n}\\ -nif (! defined($fmsaout)) {\n usage('missing ou\ -tput filename');\n exit(1);\n\n}\nif (scalar(@A\ -RGV)) {\n usage('Unknown remaining args');\n \ - exit(1);\n}\n\n$FMODEL = \"$ref_dir/mix80.mod\";\\ -nif (! -e \"$FMODEL\") {\n die(\"couldn't find \ -sfold grammar model file. Expected $FMODEL\\n\");\\ -n}\n\n\nmy %hseq=read_fasta_seq ($fmsqin);\nmy $id\ -;\n\nforeach $id (keys(%hseq))\n {\n push(@seq\ -_array, $hseq{$id});\n }\n\nif ( scalar(@seq_arra\ -y) != 2 ) {\n die(\"Need *exactly* two sequence\ -s as input (pairwise alignment!).\")\n}\n\n\n\nmy \ -($sec, $min, $hour, $mday, $mon, $year, $wday, $yd\ -ay, $isdst) = localtime(time);\nmy $datei = sprint\ -f(\"%4d-%02d-%02d\", $year+1900, $mon+1, $mday);\n\ -my $templ = basename($0) . \".\" . $datei . \".pid\ --\" . $$ . \".XXXXXX\";\nmy $wd = tempdir ( $templ\ -, DIR => $TMPDIR);\n\ncopy($fmsqin, \"$wd/\" . bas\ -ename($fmsqin) . \".org\"); # for reproduction\nco\ -py($FMODEL, \"$wd\");\nmy $fmodel = basename($FMOD\ -EL);\nmy $orgwd = getcwd;\nchdir $wd;\n\n\n\nmy @s\ -epseqfiles;\nforeach $id (keys(%hseq)) {\n my (\ -$seq, $orgseq, $fname, $sout);\n $seq=$hseq{$id\ -}{'seq'};\n \n $fname = basename($fmsqin) . \ -\"_$id.fa\";\n # replace funnies in file/id nam\ -e (e.g. \"/\" \" \" etc)\n $fname =~ s,[/ ],_,g\ -;\n open (PF, \">$fname\");\n print (PF \">$\ -id\\n$seq\\n\");\n close (PF);\n\n push(@sep\ -seqfiles, $fname);\n}\n\nmy ($f1, $f2, $fout);\n$f\ -1 = $sepseqfiles[0];\n$f2 = $sepseqfiles[1];\n$fou\ -t = $wd . basename($fmsqin) . \".out.fa\";\nif (sf\ -old_wrapper($f1, $f2, $fmodel, \"$fout\") != 0) {\\ -n printf STDERR \"ERROR: See logs in $wd\\n\";\\ -n exit(1);\n} else {\n chdir $orgwd;\n co\ -py($fout, $fmsaout);\n rmtree($wd);\n exit(0)\ -;\n}\n","\nuse Env qw(HOST);\nuse Env qw(HOME);\nu\ -se Env qw(USER);\n\n\n$tmp=clean_cr ($ARGV[0]);\no\ -pen (F, $tmp);\n\nwhile ( )\n {\n my $l=$_;\ -\n if ( $l=~/^# STOCKHOLM/){$stockholm=1;}\n \ - elsif ( $stockholm && $l=~/^#/)\n {\n $l=~/^\ -#(\\S+)\\s+(\\S+)\\s+(\\S*)/g;\n $l=\"_stockholmha\ -sch_$1\\_stockholmspace_$2 $3\\n\";\n }\n \ -$file.=$l;\n }\nclose (F);\nunlink($tmp);\n$file1\ -=$file;\n\n$file=~s/\\#/_hash_symbol_/g;\n$file=~s\ -/\\@/_arobase_symbol_/g;\n\n\n$file=~s/\\n[\\.:*\\\ -s]+\\n/\\n\\n/g;\n\n$file=~s/\\n[ \\t\\r\\f]+(\\b)\ -/\\n\\1/g;\n\n\n$file=~s/(\\n\\S+)(\\s+)(\\S)/\\1_\ -blank_\\3/g;\n\n$file=~s/[ ]//g;\n$file=~s/_blank_\ -/ /g;\n\n\n\n$file =~s/\\n\\s*\\n/#/g;\n\n$file.=\\ -"#\";\n$file =~s/\\n/@/g;\n\n\n\n\n@blocks=split /\ -\\#/, $file;\nshift (@blocks);\n@s=split /\\@/, $b\ -locks[0];\n$nseq=$#s+1;\n\n\n\n$file=join '@', @bl\ -ocks;\n@lines=split /\\@/,$file;\n\n$c=0;\n\nforea\ -ch $l (@lines)\n {\n if (!($l=~/\\S/)){next;}\\ -n elsif ($stockholm && ($l=~/^\\/\\// || $l=~/S\ -TOCKHOLM/)){next;}#get read of STOCHOLM Terminator\ -\n \n $l=~/(\\S+)\\s+(\\S*)/g;\n $n=$1; $s\ -=$2;\n \n $seq[$c].=$s;\n $name[$c]=$n;\n\ - $c++;\n \n if ( $c==$nseq){$c=0;}\n \\ -n } \n\nif ( $c!=0)\n {\n print STDERR \"ERR\ -OR: $ARGV[0] is NOT an MSA in Clustalw format: mak\ -e sure there is no blank line within a block [ERRO\ -R]\\n\";\n exit (EXIT_FAILURE);\n }\n\nfor ($\ -a=0; $a< $nseq; $a++)\n {\n $name[$a]=cleanstr\ -ing ($name[$a]);\n $seq[$a]=cleanstring ($seq[$\ -a]);\n $seq[$a]=breakstring($seq[$a], 60);\n \ - \n $line=\">$name[$a]\\n$seq[$a]\\n\";\n \n\ - print \"$line\";\n }\nexit (EXIT_SUCCESS);\n\\ -nsub cleanstring\n {\n my $s=@_[0];\n $s=~s\ -/_hash_symbol_/\\#/g;\n $s=~s/_arobase_symbol_/\ -\\@/g;\n $s=~s/[ \\t]//g;\n return $s;\n }\\ -nsub breakstring\n {\n my $s=@_[0];\n my $s\ -ize=@_[1];\n my @list;\n my $n,$ns, $symbol;\ -\n \n @list=split //,$s;\n $n=0;$ns=\"\";\ -\n foreach $symbol (@list)\n {\n if ( $n==\ -$size)\n {\n $ns.=\"\\n\";\n $n=0;\n }\ -\n $ns.=$symbol;\n $n++;\n }\n return $ns;\ -\n }\n\nsub clean_cr\n {\n my $f=@_[0];\n \ - my $file;\n \n $tmp=\"f$.$$\";\n \n \ -\n open (IN, $f);\n open (OUT, \">$tmp\");\n\ - \n while ( )\n {\n $file=$_;\n $fi\ -le=~s/\\r\\n/\\n/g;\n $file=~s/\\n\\r/\\n/g;\n $fi\ -le=~s/\\r\\r/\\n/g;\n $file=~s/\\r/\\n/g;\n print \ -OUT \"$file\";\n }\n \n close (IN);\n \ - close (OUT);\n return $tmp;\n }\n","use Env \ -qw(HOST);\nuse Env qw(HOME);\nuse Env qw(USER);\n\\ -n\n$query_start=-1;\n$query_end=-1;\n\nwhile (<>)\\ -n {\n if ( /\\/\\//){$in_aln=1;}\n elsif ( \ -$in_aln && /(\\S+)\\s+(.*)/)\n {\n\n\n $name=\ -$1;\n \n\n $seq=$2;\n $seq=~s/\\s//g;\n $se\ -q=~s/\\~/\\-/g;\n $seq=~s/\\./\\-/g;\n if ( $list{\ -$n}{'name'} && $list{$n}{'name'} ne $name)\n {\n\ - print \"$list{$n}{'name'} Vs $name\";\n \\ -n exit (EXIT_FAILURE);\n }\n else\n {\n \ - $list{$n}{'name'}= $name;\n }\n\n $list{$n}{'s\ -eq'}=$list{$n}{'seq'}.$seq;\n \n $nseq=++$n;\n \n \ - }\n else\n {$n=0;}\n }\n\n\nfor ($a=\ -0; $a<$nseq; $a++)\n {\n print \">$list{$a}{'n\ -ame'}\\n$list{$a}{'seq'}\\n\";\n }\n \n","\n\ -use Env qw(HOST);\nuse Env qw(HOME);\nuse Env qw(U\ -SER);\n\n \ - \nuse strict; \ - \nuse warnings;\nuse diagno\ -stics;\n\nmy $in_hit_list, my $in_aln=0, my(%name_\ -list)=(),my (%list)=(),my $n_seq=0; my $test=0;\nm\ -y($j)=0, my $n=0, my $nom, my $lg_query, my %vu=()\ -;\n\nopen (F, \">tmp\");\n\n$/=\"\\n\";\nwhile (<>\ -)\n{\n print F $_;\n if($_ =~ /Query=\\s*(.+\ -?)\\s/i) { $nom=$1;}\n\n if ( /Sequences produc\ -ing significant alignments/){$in_hit_list=1;}\n \ - \n if ($_=~ /^pdb\\|/i) { $_=~ s/pdb\\|//g; }\\ -n if ($_=~ /^(1_\\d+)\\s+\\d+/) { $_=~ s/$1/QUE\ -RY/;}\n \n if ( /^(\\S+).+?\\s+[\\d.]+\\s+\ -([\\de.-]+)\\s+$/ && $in_hit_list) \n {\n my($i\ -d)=$1; # \n $id=~ s/\\|/_/g; #\n if ($id =~ /.+_$/\ -) { chop($id) }; #\n $name_list{$n_seq++}=$id;\n $\ -name_list{$n_seq-1}=~ s/.*\\|//g; \n }\n \\ -n if (/query/i) {$in_aln=1;}\n if ( /^(\\S+)\ -\\s+(\\d+)\\s+([a-zA-Z-]+)\\s+(\\d+)/ || /^(\\S+)(\ -\\s+)(\\-+)(\\s+)/ && ($in_aln == 1))\n {\n my \ -$name=$1;\n my $start=$2;\n my $seq=$3;\n my $end=\ -$4;\n \n if ($name =~ /QUERY/i) { $lg_query=lengt\ -h($seq); }\n\n unless ($test > $n) #m\n {\n my\ -(@seqq)= split('',$seq);\n my($gap_missing)= s\ -calar(@seqq);\n \n while ($gap_missing != \ -$lg_query) { unshift (@seqq,\"-\"); $gap_missing=\ - scalar(@seqq); }\n $seq=join('',@seqq); #m\n\ - }\n \n if ($name =~ /QUERY/i)\n {\n $n=0; %vu\ -=(); $j=0;\n $list{$n}{'real_name'}=\"$nom\";\\ -n } \n else\n {\n unless (exists $vu{$name}) {\ - ++$j;} \n $list{$n}{'real_name'}=$name_list{$\ -j-1};\n }\n \n $list{$n}{'name'}=$name;\n\n $seq=\ -~tr/a-z/A-Z/;\n $list{$n}{'seq'}=$list{$n}{'seq'};\ -\n $list{$n}{'seq'}.=$seq;\n\n $n++;\n $vu{$name}+\ -+;\n $test++;\n } \n \n}\n\nmy @numero=();\n\\ -nfor (my $a=0; $a<$n; $a++) #m\n{\n my $long=le\ -ngth($list{0}{'seq'}); \n my $long1= length($l\ -ist{$a}{'seq'});\n \n while ($long1 ne $long)\\ -n {\n $list{$a}{'seq'}.=\"-\";\n $long1= length\ - ($list{$a}{'seq'});\n } \n \n push (@numero\ -,\"$list{$a}{'name'} $list{$a}{'real_name'}\\n\");\ -\n}\n\nmy %dejavu=();\n\n\nfor (my $i=0; $i<=$#num\ -ero; $i++)\n{\n my $s=\">$list{$i}{'real_name'}\ -\\n$list{$i}{'seq'}\\n\";\n my $k=0;\n \n \ - if (exists $dejavu{$numero[$i]}) {next;}\n els\ -e\n { \n for ($j=0; $j<$n ; $j++)\n {\n if \ -(\"$numero[$i]\" eq \"$numero[$j]\" && $j != $i )\\ -n {\n ++$k;\n $s .=\">$list{$j}{'real_name'}\ -\\n$list{$j}{'seq'}\\n\";\n }\n } \n }\n \ - \n if ($k>0) \n {\n my $cons;\n open (SOR,\\ -">tempo_aln2cons\"); print SOR $s; close SOR ;\n \ -open (COM,\"t_coffee -other_pg seq_reformat -in te\ -mpo_aln2cons -action +aln2cons +upper |\") ; \n \ - while ()\n { \n if (/^>/) { $cons =\">\ -$list{$i}{'real_name'}\\n\"; next;}\n $_=~ s/\\ -\n//g;\n $cons .=$_;\n }\n close COM; unlink (\ -\"tempo_aln2cons\");\n print $cons,\"\\n\"; print \ -F $cons,\"\\n\";\n } \n else { print $s; p\ -rint F $s; }\n \n $dejavu{$numero[$i]}++;\n}\ - #m\n\nexit;\n\n\n\n\n\n\n\n\n\n\n\n","use Env;\n\\ -n\n$tmp_dir=\"\";\n$init_dir=\"\";\n$program=\"tc_\ -generic_method.pl\";\n\n$blast=@ARGV[0];\n\n$name=\ -\"query\";$seq=\"\";\n%p=blast_xml2profile($name,$\ -seq,100, 0, 0, $blast);\n&output_profile (%p);\n\n\ -\nsub output_profile\n {\n my (%profile)=(@_);\ -\n my ($a);\n for ($a=0; $a<$profile{n}; $a+\ -+)\n {\n \n print \">$profile{$a}{name} $prof\ -ile{$a}{comment}\\n$profile{$a}{seq}\\n\";\n \ -}\n return;\n }\nsub file_contains \n {\n \ -my ($file, $tag, $max)=(@_);\n my ($n);\n $n\ -=0;\n \n if ( !-e $file && ($file =~/$tag/))\ - {return 1;}\n elsif ( !-e $file){return 0;}\n \ - else \n {\n open (FC, \"$file\");\n while \ -( )\n {\n if ( ($_=~/$tag/))\n {\n\ - close (FC);\n return 1;\n }\n elsif (\ -$max && $n>$max)\n {\n close (FC);\n retur\ -n 0;\n }\n $n++;\n }\n }\n clo\ -se (FC);\n return 0;\n }\n \n \nsub file\ -2string\n {\n my $f=@_[0];\n my $string, $l\ -;\n open (F,\"$f\");\n while ()\n {\\ -n\n $l=$_;\n #chomp ($l);\n $string.=$l;\n }\\ -n close (F);\n $string=~s/\\r\\n//g;\n $s\ -tring=~s/\\n//g;\n return $string;\n }\n\n\n\n\ -sub tag2value \n {\n \n my $tag=(@_[0]);\n \ - my $word=(@_[1]);\n my $return;\n \n $\ -tag=~/$word=\"([^\"]+)\"/;\n $return=$1;\n r\ -eturn $return;\n }\n \nsub hit_tag2pdbid\n \ -{\n my $tag=(@_[0]);\n my $pdbid;\n \n\ - $tag=~/id=\"(\\S+)\"/;\n $pdbid=$1;\n $p\ -dbid=~s/_//;\n return $pdbid;\n }\nsub id2pdbi\ -d \n {\n my $id=@_[0];\n \n if ($id =~/pdb\ -/)\n {\n $id=~/pdb(.*)/;\n $id=$1;\n }\n\ - $id=~s/[|¦_]//g;\n return $id;\n }\nsub se\ -t_blast_type \n {\n my $file =@_[0];\n if (\ -&file_contains ($file,\"EBIApplicationResult\",100\ -)){$BLAST_TYPE=\"EBI\";}\n elsif (&file_contain\ -s ($file,\"NCBI_BlastOutput\",100)) {$BLAST_TYPE=\\ -"NCBI\";}\n else\n {\n $BLAST_TYPE=\"\";\n\ - }\n return $BLAST_TYPE;\n }\nsub blast_x\ -ml2profile \n {\n my ($name,$seq,$maxid, $mini\ -d, $mincov, $file)=(@_);\n my (%p, $a, $string,\ - $n);\n \n\n\n if ($BLAST_TYPE eq \"EBI\" ||\ - &file_contains ($file,\"EBIApplicationResult\",10\ -0)){%p=ebi_blast_xml2profile(@_);}\n elsif ($BL\ -AST_TYPE eq \"NCBI\" || &file_contains ($file,\"NC\ -BI_BlastOutput\",100)){%p=ncbi_blast_xml2profile(@\ -_);}\n else \n {\n print \"************ ER\ -ROR: Blast Returned an unknown XML Format ********\ -**************\";\n die;\n }\n for ($a=0; \ -$a<$p{n}; $a++)\n {\n my $name=$p{$a}{name};\\ -n $p{$name}{seq}=$p{$a}{seq};\n }\n return\ - %p;\n }\nsub ncbi_blast_xml2profile \n {\n m\ -y ($name,$seq,$maxid, $minid, $mincov, $string)=(@\ -_);\n my ($L,$l, $a,$b,$c,$d,$nhits,@identifyer\ -L);\n \n \n $seq=~s/[^a-zA-Z]//g;\n $L\ -=length ($seq);\n \n %hit=&xml2tag_list ($st\ -ring, \"Hit\");\n \n \n for ($nhits=0,$a=\ -0; $a<$hit{n}; $a++)\n {\n my ($ldb,$id, $ide\ -ntity, $expectation, $start, $end, $coverage, $r);\ -\n my (%ID,%DE,%HSP);\n \n $ldb=\"\";\n\n %ID=&xml\ -2tag_list ($hit{$a}{body}, \"Hit_id\");\n $identif\ -yer=$ID{0}{body};\n \n %DE=&xml2tag_list ($hit{$a}\ -{body}, \"Hit_def\");\n $definition=$DE{0}{body};\\ -n \n %HSP=&xml2tag_list ($hit{$a}{body}, \"Hsp\");\ -\n for ($b=0; $b<$HSP{n}; $b++)\n {\n my (%S\ -TART,%END,%E,%I,%Q,%M);\n\n \n %START=&xml2ta\ -g_list ($HSP{$b}{body}, \"Hsp_query-from\");\n \ - %HSTART=&xml2tag_list ($HSP{$b}{body}, \"Hsp_hit-\ -from\");\n \n %LEN= &xml2tag_list ($HSP{$\ -b}{body}, \"Hsp_align-len\");\n %END= &xml2ta\ -g_list ($HSP{$b}{body}, \"Hsp_query-to\");\n %\ -HEND= &xml2tag_list ($HSP{$b}{body}, \"Hsp_hit-to\ -\");\n %E=&xml2tag_list ($HSP{$b}{body}, \\ -"Hsp_evalue\");\n %I=&xml2tag_list ($HSP{$\ -b}{body}, \"Hsp_identity\");\n %Q=&xml2tag_lis\ -t ($HSP{$b}{body}, \"Hsp_qseq\");\n %M=&xm\ -l2tag_list ($HSP{$b}{body}, \"Hsp_hseq\");\n \ - \n for ($e=0; $e<$Q{n}; $e++)\n\n {\n\ - $qs=$Q{$e}{body};\n $ms=$M{$e}{body};\n if ($s\ -eq eq\"\"){$seq=$qs;$L=length($seq);}\n \n $expe\ -ctation=$E{$e}{body};\n $identity=($LEN{$e}{body}\ -==0)?0:$I{$e}{body}/$LEN{$e}{body}*100;\n $start=\ -$START{$e}{body};\n $end=$END{$e}{body};\n $Hsta\ -rt=$HSTART{$e}{body};\n $Hend=$HEND{$e}{body};\n \ -\n $coverage=(($end-$start)*100)/$L;\n\n \n if (\ -$identity>$maxid || $identity<$minid || $coverage<\ -$mincov){next;}\n @lr1=(split (//,$qs));\n @lr2=\ -(split (//,$ms));\n $l=$#lr1+1;\n for ($c=0;$c<$\ -L;$c++){$p[$nhits][$c]=\"-\";}\n for ($d=0,$c=0; \ -$c<$l; $c++)\n {\n $r=$lr1[$c];\n if \ -( $r=~/[A-Za-z]/)\n {\n \n $p[$nhits][$\ -d + $start-1]=$lr2[$c];\n $d++;\n }\n \ -}\n $Qseq[$nhits]=$qs;\n $Hseq[$nhits]=$ms;\n $\ -QstartL[$nhits]=$start;\n $HstartL[$nhits]=$Hstar\ -t;\n $identityL[$nhits]=$identity;\n $endL[$nhit\ -s]=$end;\n $definitionL[$nhits]=$definition;\n $\ -identifyerL[$nhits]=$identifyer;\n $comment[$nhit\ -s]=\"$ldb|$identifyer [Eval=$expectation][id=$iden\ -tity%][start=$Hstart end=$Hend]\";\n $nhits++;\n \ - }\n }\n }\n \n $profile{n}=0;\n\ - $profile{$profile{n}}{name}=$name;\n $profi\ -le{$profile{n}}{seq}=$seq;\n $profile {n}++;\n \ - \n for ($a=0; $a<$nhits; $a++)\n {\n $n\ -=$a+1;\n \n $profile{$n}{name}=\"$name\\_$a\";\n $\ -profile{$n}{seq}=\"\";\n $profile{$n}{Qseq}=$Qseq[\ -$a];\n $profile{$n}{Hseq}=$Hseq[$a];\n $profile{$n\ -}{Qstart}=$QstartL[$a];\n $profile{$n}{Hstart}=$Hs\ -tartL[$a];\n $profile{$n}{identity}=$identityL[$a]\ -;\n $profile{$n}{definition}=$definitionL[$a];\n $\ -profile{$n}{identifyer}=$identifyerL[$a];\n $profi\ -le{$n}{comment}=$comment[$a];\n for ($b=0; $b<$L; \ -$b++)\n {\n if ($p[$a][$b])\n {\n $pr\ -ofile{$n}{seq}.=$p[$a][$b];\n }\n else\n\ - {\n $profile{$n}{seq}.=\"-\";\n }\n \ - }\n }\n \n $profile{n}=$nhits+1;\n \ - return %profile;\n }\nsub ebi_blast_xml2profile \ -\n {\n my ($name,$seq,$maxid, $minid, $mincov,\ - $string)=(@_);\n my ($L,$l, $a,$b,$c,$d,$nhits\ -,@identifyerL,$identifyer);\n \n\n \n $se\ -q=~s/[^a-zA-Z]//g;\n $L=length ($seq);\n %hi\ -t=&xml2tag_list ($string, \"hit\");\n \n for\ - ($nhits=0,$a=0; $a<$hit{n}; $a++)\n {\n my (\ -$ldb,$id, $identity, $expectation, $start, $end, $\ -coverage, $r);\n my (%Q,%M,%E,%I);\n \n $ldb=&tag2\ -value ($hit{$a}{open}, \"database\");\n $identifye\ -r=&tag2value ($hit{$a}{open}, \"id\");\n\n $descri\ -ption=&tag2value ($hit{$a}{open}, \"description\")\ -;\n \n %Q=&xml2tag_list ($hit{$a}{body}, \"querySe\ -q\");\n %M=&xml2tag_list ($hit{$a}{body}, \"matchS\ -eq\");\n %E=&xml2tag_list ($hit{$a}{body}, \"expec\ -tation\");\n %I=&xml2tag_list ($hit{$a}{body}, \"i\ -dentity\");\n \n\n for ($b=0; $b<$Q{n}; $b++)\n \ -{\n \n \n $qs=$Q{$b}{body};\n $ms=\ -$M{$b}{body};\n if ($seq eq\"\"){$seq=$qs;$L=l\ -ength($seq);}\n\n $expectation=$E{$b}{body};\n\ - $identity=$I{$b}{body};\n \n \n \ - $start=&tag2value ($Q{$b}{open}, \"start\");\n\ - $end=&tag2value ($Q{$b}{open}, \"end\");\n \ - $startM=&tag2value ($M{$b}{open}, \"start\");\n \ - $endM=&tag2value ($M{$b}{open}, \"end\");\n \ - $coverage=(($end-$start)*100)/$L;\n \n # \ -print \"$id: ID: $identity COV: $coverage [$start \ -$end]\\n\";\n \n \n if ($identity>$max\ -id || $identity<$minid || $coverage<$mincov){next;\ -}\n # print \"KEEP\\n\";\n\n \n @lr1=(\ -split (//,$qs));\n @lr2=(split (//,$ms));\n \ - $l=$#lr1+1;\n for ($c=0;$c<$L;$c++){$p[$nhit\ -s][$c]=\"-\";}\n for ($d=0,$c=0; $c<$l; $c++)\\ -n {\n $r=$lr1[$c];\n if ( $r=~/[A-Za-z]/)\\ -n {\n \n $p[$nhits][$d + $start-1]=$l\ -r2[$c];\n $d++;\n }\n }\n \n \\ -n $identifyerL[$nhits]=$identifyer;\n $com\ -ment[$nhits]=\"$ldb|$identifyer [Eval=$expectation\ -][id=$identity%][start=$startM end=$endM]\";\n \ - $nhits++;\n }\n }\n \n $profile{n}=0\ -;\n $profile{$profile{n}}{name}=$name;\n $pr\ -ofile{$profile{n}}{seq}=$seq;\n $profile {n}++;\ -\n \n for ($a=0; $a<$nhits; $a++)\n {\n\ - $n=$a+1;\n $profile{$n}{name}=\"$name\\_$a\";\n $\ -profile{$n}{seq}=\"\";\n $profile{$n}{identifyer}=\ -$identifyerL[$a];\n \n $profile{$n}{comment}=$comm\ -ent[$a];\n for ($b=0; $b<$L; $b++)\n {\n if \ -($p[$a][$b])\n {\n $profile{$n}{seq}.=$p[$a\ -][$b];\n }\n else\n {\n $profile{\ -$n}{seq}.=\"-\";\n }\n }\n }\n $pr\ -ofile{n}=$nhits+1;\n \n return %profile;\n \ -}\n\nsub blast_xml2hit_list\n {\n my $string=(\ -@_[0]);\n return &xml2tag_list ($string, \"hit\\ -");\n }\nsub xml2tag_list \n {\n my ($string\ -_in,$tag)=@_;\n my $tag_in, $tag_out;\n my %\ -tag;\n \n if (-e $string_in)\n {\n $str\ -ing=&file2string ($string_in);\n }\n else\\ -n {\n $string=$string_in;\n }\n $tag_\ -in1=\"<$tag \";\n $tag_in2=\"<$tag>\";\n $ta\ -g_out=\"/$tag>\";\n $string=~s/>/>##1/g;\n $\ -string=~s//g;\n @l=($string=~/(\\<[^>]+\ -\\>)/g);\n $tag{n}=0;\n $in=0;$n=-1;\n \n \\ -n\n foreach $t (@l)\n {\n\n $t=~s/<#//;\n \ -$t=~s/#>//;\n \n if ( $t=~/$tag_in1/ || $t=~/$tag_\ -in2/)\n {\n \n $in=1;\n $tag{$tag{n}}{o\ -pen}=$t;\n $n++;\n \n }\n elsif ($t=~/$t\ -ag_out/)\n {\n \n\n $tag{$tag{n}}{close}\ -=$t;\n $tag{n}++;\n $in=0;\n }\n elsif (\ -$in)\n {\n \n $tag{$tag{n}}{body}.=$t;\n \ - }\n }\n \n return %tag;\n }\n\n\n\n\n"\ -,"use Env qw(HOST);\nuse Env qw(HOME);\nuse Env qw\ -(USER);\nwhile (<>)\n {\n if ( /^>(\\S+)/)\n \ - {\n if ($list{$1})\n {\n print \">$1_$li\ -st{$1}\\n\";\n $list{$1}++;\n }\n else\n {\ -\n print $_;\n $list{$1}=1;\n }\n }\ -\n else\n {\n print $_;\n }\n }\n \ - \n","\n\n\nuse Env qw(HOST);\nuse Env qw(HOME);\ -\nuse Env qw(USER);\n\n\nopen (F,$ARGV[0]);\nwhile\ - ( <>)\n {\n @x=/([^:,;\\)\\(\\s]+):[^:,;\\)\\\ -(]*/g;\n @list=(@list,@x);\n }\n$n=$#list+1;\n\ -foreach $n(@list){print \">$n\\nsequence\\n\";}\n\\ -n\nclose (F);\n","\nopen (F, $ARGV[0]);\n\nwhile (\ - )\n {\n @l=($_=~/(\\S+)/g);\n \n $na\ -me=shift @l;\n \n print STDOUT \"\\n>$name\\\ -n\";\n foreach $e (@l){$e=($e eq \"0\")?\"O\":\\ -"I\";print \"$e\";}\n }\nclose (F);\n\n \\ -n \n","use Env qw(HOST);\nuse Env qw(HOME);\nus\ -e Env qw(USER);\n\n$tmp=\"$ARGV[0].$$\";\nopen (IN\ -, $ARGV[0]);\nopen (OUT, \">$tmp\");\n\nwhile ( )\n {\n $file=$_;\n $file=~s/\\r\\n/\\n/g\ -;\n $file=~s/\\n\\r/\\n/g;\n $file=~s/\\r\\r\ -/\\n/g;\n $file=~s/\\r/\\n/g;\n print OUT \"\ -$file\";\n }\nclose (IN);\nclose (OUT);\n\nopen (\ -OUT, \">$ARGV[0]\");\nopen (IN, \"$tmp\");\n\nwhil\ -e ( )\n{\n print OUT \"$_\";\n}\nclose (IN);\\ -nclose (OUT);\nunlink ($tmp);\n\n"}; -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/random.c b/binaries/src/tcoffee/t_coffee_source/random.c deleted file mode 100644 index 84b6c8e..0000000 --- a/binaries/src/tcoffee/t_coffee_source/random.c +++ /dev/null @@ -1,94 +0,0 @@ -/* -* -* Rand.c -* -* - linear and additive congruential random number generators -* (see R. Sedgewick, Algorithms, Chapter 35) -* -* Implementation: R. Fuchs, EMBL Data Library, 1991 -* -*/ - - - -#define m1 10000 -#define m 100000000 - -/* linear congruential method -* -* linrand() returns an unsigned long random number in the range 0 to r-1 -*/ - - - -static unsigned long mult(unsigned long p, unsigned long q) -{ - unsigned long p1,p0,q1,q0; - - p1 = p/m1; p0 = p % m1; - q1 = q/m1; q0 = q % m1; - return (unsigned long)((((p0*q1 + p1*q0) % m1) * m1 + p0*q0) % m); -} - - -/* additive congruential method -* -* addrand() returns an unsigned long random number in the range 0 to r-1 -* The random number generator is initialized by addrandinit() -*/ - -static unsigned long j; -static unsigned long a[55]; - -unsigned long addrand(unsigned long r) -{ -int x,y; -/* fprintf(stdout,"\n j = %d",j); */ - j = (j + 1) % 55; -/* fprintf(stdout,"\n j = %d",j); */ - x = (j+23)%55; - y = (j+54)%55; - a[j] = (a[x] + a[y]) % m; -/* a[j] = (a[(j+23)%55] + a[(j+54)%55]) % m; */ -/* fprintf(stdout,"\n a[j] = %d",a[j]); */ - return( ((a[j] / m1) * r) / m1 ); -} - -void addrandinit(unsigned long s) -{ - a[0] = s; - j = 0; - do { - ++j; - a[j] = (mult(31,a[j-1]) + 1) % m; - } while (j<54); -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/reformat.c b/binaries/src/tcoffee/t_coffee_source/reformat.c deleted file mode 100644 index 959a287..0000000 --- a/binaries/src/tcoffee/t_coffee_source/reformat.c +++ /dev/null @@ -1,11819 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "dp_lib_header.h" -#include "define_header.h" -#include "dev1_lib_header.h" //JM_STRAT - -#define ACTION(x) ((n_actions>=(x+1))?action_list[x]:NULL) -#define ACTION2(x,y) ((n_actions>=(x+1))?action_list[x]:y) -#define ATOI_ACTION(x) ((ACTION(x)!=NULL)?(atoi(ACTION(x))):0) - -/**************************************************************************************************/ -/***************************** SEQ_REFORMAT ******************************************/ -/**************************************************************************************************/ -int output_transitions(char *outfile, Alignment *A); -static int output_age_matrix ( char *outfile, int val); -int SeqGCGCheckSum(char *seq, int len); -static Sequence *seq2year ( Sequence *S, int modulo); -static Sequence* output_n_pavie_age_channel (Sequence *S, char *name, int n); -static Sequence* output_pavie_age_channel (Sequence *S, char *name, int modulo); - -static int output_seq2struc(char *outfile, Alignment *A); -void output_conservation_statistics ( char *file, Alignment *A); -/**************************************************************************************************/ -/***************************** SEQ_REFORMAT ******************************************/ -/**************************************************************************************************/ -int seq_reformat ( int argc, char **in_argv) - { - - Sequence_data_struc *D1=NULL; - Sequence_data_struc *D2=NULL; - Sequence_data_struc *D_ST=NULL; - Action_data_struc *RAD; - - - - int a, b; - - char *in_format; - char *in2_format; - char *out_format; - char *in_file; - char *in2_file; - char *out_file; - char *out2_file; - char *struc_in_format; - char *struc_out_format; - char *struc_in_file; - char *struc_out_file; - char**action_list; - char **action; - char *rename_file; - char *cache; - char ***rename_list=NULL; - int code=CODE; - char **argv; - - int n_actions=0; - int print_format=0; - /*INITIALIZATIONS*/ - - RAD=vcalloc ( 1, sizeof ( Action_data_struc)); - RAD->keep_case=1; - declare_name (cache);sprintf ( cache, "use"); - declare_name(in_file); - declare_name(in2_file); - declare_name(out_file); - declare_name(out2_file); - declare_name(struc_in_format); - declare_name(struc_out_format); - declare_name(RAD->coor_file); - - declare_name(struc_in_file); - declare_name(struc_out_file); - declare_name(in_format); - declare_name(in2_format); - declare_name(out_format); - declare_name(rename_file); - - - argv=break_list ( in_argv, &argc, "=;, \n"); - - action_list=declare_char ( 100, 100); - -/*END INITIALIZATION*/ - - addrandinit ( (unsigned long) 500); - - if ( argc==1 || strm6 ( argv[1], "h", "-h", "help", "-help", "-man", "?")) - { - - fprintf ( stdout, "\n%s (%s,%s,%s [%s])\n",PROGRAM, VERSION,AUTHOR, DATE, URL); - fprintf ( stdout, "\n*********** MINIMUM SYNTAX *****************"); - fprintf ( stdout, "\nseq_reformat -in -output "); - fprintf ( stdout, "\nSome File formats are automatically recognised"); - fprintf ( stdout, "\nSee Format section"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** MAIN FLAGS ******************"); - fprintf ( stdout, "\n-in name........Name of the file read"); - - - fprintf ( stdout, "\n-input format......Name of the format read, see Input Format Section"); - fprintf ( stdout, "\n...................Automatic detection, except for seqs of numbers"); - fprintf ( stdout, "\n...................-input number_aln | number_fasta"); - fprintf ( stdout, "\n-in2 fname......Second alignment"); - fprintf ( stdout, "\n-input2 format.....See -input"); - fprintf ( stdout, "\n-exon_boundaries obj file"); - fprintf ( stdout, "\n-out fname......Output file (defualt is STDOUT"); - fprintf ( stdout, "\n-output format.....Output Format, default is fasta_aln"); - fprintf ( stdout, "\n-struc_in name...File containing a coded aln"); - fprintf ( stdout, "\n-struc_in_f format.See -input and output format section"); - fprintf ( stdout, "\n-struc_out fname..Name of the output structure"); - fprintf ( stdout, "\n-struc_out_f symbol"); - fprintf ( stdout, "\n-keep_case=on|off..keep case, On by default"); - fprintf ( stdout, "\n-action +ac1 +ac2..See the action section"); - fprintf ( stdout, "\n-rename .....Rename the sequences following indications"); - fprintf ( stdout, "\n...................File Format: One couple /line"); - fprintf ( stdout, "\n...................Rename order into "); - fprintf ( stdout, "\n...................code file: -output code_name"); - fprintf ( stdout, "\n-code Rename file to "); - fprintf ( stdout, "\n-decode Rename file to "); - fprintf ( stdout, "\n-no_warning........Suppresses all warnings"); - fprintf ( stdout, "\n-cache.............use,ignore,update,local, DirectoryName"); - - - fprintf ( stdout, "\n"); - - fprintf ( stdout, "\n*********** REFORMAT ACTIONS *****************"); - fprintf ( stdout, "\n +Xaction.............Specifies which file undergoes the action"); - fprintf ( stdout, "\n +Xaction.............X=1: -in"); - fprintf ( stdout, "\n +Xaction.............X=2: -in2"); - fprintf ( stdout, "\n +Xaction.............X=3: -struc_in"); - fprintf ( stdout, "\n +name2unique_name....replace duplicated name with name_#"); - fprintf ( stdout, "\n +swap_header........,swapp comments: replace comments/name in 1 by in 2"); - fprintf ( stdout, "\n +swap_lib_header.F...Replace the sequences in the tc_lib (-in) with those in F"); - fprintf ( stdout, "\n .....................F is a legal FASTA file"); - - - fprintf ( stdout, "\n +translate[0-2]......Translate on Frame 0, 1, 2 "); - fprintf ( stdout, "\n +translate[3]........longuest ORF on direct strand"); - fprintf ( stdout, "\n +translate[4]........longuest ORF on direct+complementary strand"); - - - fprintf ( stdout, "\n +add_scale...addscale below aln"); - - fprintf ( stdout, "\n +rm_gap n ...........Removes col with n%% gap [n=100]"); - fprintf ( stdout, "\n +rmgap_col SEQ1:SEQ2.Removes column with a gap in SEQ [#] "); - - fprintf ( stdout, "\n +backtranslate.......Random Backtranslation"); - fprintf ( stdout, "\n +complement..........Produces the reverse complement"); - - fprintf ( stdout, "\n +reorder.............Reorders sequences of according to "); - fprintf ( stdout, "\n .........random......Random_order"); - fprintf ( stdout, "\n .........tree........Tree Order (in2)"); - fprintf ( stdout, "\n +reorder_columns.....Reorders sequences of according to "); - fprintf ( stdout, "\n .........random......Random_order"); - fprintf ( stdout, "\n .........tree..mode..Tree Order (comuted with mode: sarmat, idmat, blosum62mt..."); - fprintf ( stdout, "\n +aln2random_aln SCR..Randomize the aln, S: swap sequences names"); - fprintf ( stdout, "\n .....................Swap residues within colums"); - fprintf ( stdout, "\n .....................Swap residues across the aln"); - fprintf ( stdout, "\n +aln2sample......N......"); - fprintf ( stdout, "\n +aln2bootstrap...N......"); - - - fprintf ( stdout, "\n +chain...............Identifies all the intermediate sequences from <-in>"); - fprintf ( stdout, "\n .....................needed to join every sequence pair in <-in2>"); - - fprintf ( stdout, "\n +aln2cons mat_name..Ouputs a consensus sequence"); - fprintf ( stdout, "\n .....................The consensus is determined using mat"); - fprintf ( stdout, "\n .....................By Default, mat=blosum62mt, name=Cons"); - fprintf ( stdout, "\n +aln2resindex........Prints the sequence index of each residue in -in for each -in2 sequence"); - fprintf ( stdout, "\n +collapse_aln | file name"); - fprintf ( stdout, "\n .....................Replaces a group of sequences with its consensus"); - fprintf ( stdout, "\n .....................The replacement sequence is named "); - fprintf ( stdout, "\n .....................List of sequences can be provided via a file"); - fprintf ( stdout, "\n .....................File:>new_name seq1 seq2 seq3...."); - fprintf ( stdout, "\n +original_seqnos.....Keep original seqnos [SWITCH]"); - fprintf ( stdout, "\n +seqnos..............Print Seqnos [SWITCH]"); - fprintf ( stdout, "\n +code_dna_aln........Undocumented") ; - fprintf ( stdout, "\n +grep..[NAME|SEQ|COMMENT]..[KEEP|REMOVE]..[string]......"); - fprintf ( stdout, "\n .....................Keeps or Removes Sequences matching string"); - fprintf ( stdout, "\n +extract_block | |"); - fprintf ( stdout, "\n .....................Extract column pos OR [start to end["); - fprintf ( stdout, "\n ..................... Format"); - fprintf ( stdout, "\n .......................seq start end | seq pos"); - fprintf ( stdout, "\n .......................# for comments"); - fprintf ( stdout, "\n .......................! seq offset_value (0 by default)"); - fprintf ( stdout, "\n .....................Can extract as many positions as needed"); - fprintf ( stdout, "\n .....................seq=cons: measure positions on the full aln"); - fprintf ( stdout, "\n +cat_aln.............Concatenates the alignments input via -in and -in2"); - fprintf ( stdout, "\n +cat_aln.............-if no -in2, -in is expected to be a list of alignments to concatenate"); - - fprintf ( stdout, "\n +msalist2cat_pwaln.min..max"); - fprintf ( stdout, "\n .....................extract all pw projections and conctaenates those\n"); - fprintf ( stdout, "\n .....................where id>=min and id<=max\n"); - fprintf ( stdout, "\n .....................min and max can be omitted (min=0, max=100)\n"); - - fprintf ( stdout, "\n +seq2blast ..gather all possible homologues from NR (EBI BLAST)"); - fprintf ( stdout, "\n +seq2msa ....makes a standard progressive alignment using matrix"); - fprintf ( stdout, "\n +realign_block "); - fprintf ( stdout, "\n .....................Realign column c1 to c2 (non inc.) with pg)"); - fprintf ( stdout, "\n .....................pg reads fasta and outputs fasta"); - fprintf ( stdout, "\n .....................pg -infile= -outfile="); - fprintf ( stdout, "\n +extract_seq seq_name (start end seq_name start end...) | filename"); - fprintf ( stdout, "\n .....................seq_name='*': every seq"); - fprintf ( stdout, "\n .....................start='*' : real start"); - fprintf ( stdout, "\n .....................end='*' : real end"); - fprintf ( stdout, "\n .....................filename: fasta format"); - fprintf ( stdout, "\n +extract_seq_list name1 name2"); - fprintf ( stdout, "\n .....................Extracts entire sequences"); - fprintf ( stdout, "\n +remove_seq sn1 sn2..Removes sequences sn1, sn2..."); - fprintf ( stdout, "\n +remove_seq empty....Removes empty sequences (gap only)"); - fprintf ( stdout, "\n +remove_seq unique...Remove all multiple occurences except the first"); - fprintf ( stdout, "\n +thread_profile_on_msa "); - fprintf ( stdout, "\n .....................Threads a list of profiles on corresponding seq"); - fprintf ( stdout, "\n .....................File: >seqname _R_ [nlines]"); - - fprintf ( stdout, "\n +thread_dna_on_prot_aln"); - fprintf ( stdout, "\n .....................-in DNA.seq and -in2 AA.aln"); - fprintf ( stdout, "\n +thread_struc_on_aln"); - fprintf ( stdout, "\n .....................-in structure and -in2 aln"); - fprintf ( stdout, "\n +use_cons............Use the consensus for n[SWITCH]"); - fprintf ( stdout, "\n +upper.n|[n1-n2].....n omitted sets everything to upper case"); - fprintf ( stdout, "\n .....................To use n: provide a number_aln via:"); - fprintf ( stdout, "\n .....................-struc_in -struc_in_f number_aln"); - fprintf ( stdout, "\n .....................if use_cons is set n, is read on the cons"); - fprintf ( stdout, "\n .....................n: will upper every residue with a value of n in struc_in"); - fprintf ( stdout, "\n .....................[n1-n2]: upper residues between n1 and n2"); - fprintf ( stdout, "\n +lower n|[n1-n2]....See +upper"); - fprintf ( stdout, "\n +switchcase n|[n1-n2]See +upper"); - fprintf ( stdout, "\n +color_residue | file"); - fprintf ( stdout, "\n .....................File: seq_name pos color"); - fprintf ( stdout, "\n .....................color: 0-9"); - fprintf ( stdout, "\n +edit_residue | file"); - fprintf ( stdout, "\n .....................File: seq_name pos color"); - fprintf ( stdout, "\n .....................edit: upper|lower|symbol"); - - - - fprintf ( stdout, "\n +keep n|[n1-n2]....Only keep residues that have a score between n1 and n2"); - - fprintf ( stdout, "\n +invert..............Inverts the sequences: CAT => TAC"); - fprintf ( stdout, "\n +rotate name Rotate an MSA, names each sequence name_col#"); - fprintf ( stdout, "\n +convert n|[n1-n2] s1 s2 ...."); - fprintf ( stdout, "\n +merge_annotation.... "); - - fprintf ( stdout, "\n .....................Converts residues with your alignment"); - fprintf ( stdout, "\n .....................similar to upper"); - fprintf ( stdout, "\n .....................s1: ABCDe turns every ABCD into e"); - fprintf ( stdout, "\n .....................s1: #e turns any residue into e"); - fprintf ( stdout, "\n aln2short_aln L C S..Turns sequences into shorter sequences"); - fprintf ( stdout, "\n .....................L: list of residues to keep"); - fprintf ( stdout, "\n .....................S: Size of Streches replaced by symbol C"); - - - fprintf ( stdout, "\n +random n l..........Generates N random sequences of len l"); - fprintf ( stdout, "\n .....................You must provide a file with -in"); - fprintf ( stdout, "\n +count n|[n1-n2] s1 s2...."); - fprintf ( stdout, "\n .....................Counts residues with your alignment"); - fprintf ( stdout, "\n .....................similar to convert"); - fprintf ( stdout, "\n +print_format........prints the format name"); - fprintf ( stdout, "\n +keep_name...........Keep the original sequence name on extraction"); - - fprintf ( stdout, "\n +remove_aa pos Ml Ncycle Random_len"); - fprintf ( stdout, "\n .....................Randomly modifies an alignment"); - fprintf ( stdout, "\n .....................pos=0: chosen randomly"); - fprintf ( stdout, "\n .....................MaxLen of the deletions, Ncycle: number of cycles"); - fprintf ( stdout, "\n .....................Random_len: 0 sets the len to maxlen, 1 to a random value"); - fprintf ( stdout, "\n +remove_nuc.x........Remove Position 1, 2 or 3 of every codon"); - fprintf ( stdout, "\n +evaluate matrix..gop..gep"); - fprintf ( stdout, "\n .....................Make a similarity evaluation with matrix"); - fprintf ( stdout, "\n .....................use -output=score_ascii, or score_html."); - fprintf ( stdout, "\n .....................You can filter on the values"); - fprintf ( stdout, "\n +evaluate matrix..gop..gep"); - fprintf ( stdout, "\n .....................Make an SP evaluation with matrix"); - fprintf ( stdout, "\n .....................Uses Natural Gap penalties"); - fprintf ( stdout, "\n .....................gop and gep must be negative"); - fprintf ( stdout, "\n .....................use -output=color_ascii, color_html to get a color display"); - - fprintf ( stdout, "\n.....+evaluate_lat........Make a lateral evaluation with matrix"); - fprintf ( stdout, "\n +msa_weight proc.....Computes weights using the procedure"); - fprintf ( stdout, "\nRNA analysis Post Processing___________________________________________________"); - fprintf ( stdout, "\n +aln2alifold.........Turns the MSA into a consensus structure"); - fprintf ( stdout, "\n +add_alifold.........adds an alifold consensus structure"); - - fprintf ( stdout, "\n +alifold2analyze.mode..mode=stat_cache_list_aln_color_html_ps_usegap"); - fprintf ( stdout, "\n .......................stat: compile Number of compensated mutations"); - fprintf ( stdout, "\n .......................cache: ascii-code compensated mutations on aln"); - fprintf ( stdout, "\n .......................html: color-code compensated mutations on aln"); - fprintf ( stdout, "\n .......................aln: mark compensated mutations on stockholm aln"); - fprintf ( stdout, "\n .......................usegap: do not ignore positions with gaps"); - - fprintf ( stdout, "\n +cmp_RNAfold.........compares the sec struc of in1 and in2 (computes them with alifold if missing)"); - - fprintf ( stdout, "\nMSA Post Processing___________________________________________________"); - fprintf ( stdout, "\n +force_aln filename|seq1 res1 seq2 res2"); - fprintf ( stdout, "\n .....................Forces residue 1 of seq1 to be aligned with res2 of seq 2"); - fprintf ( stdout, "\n .....................In a file, there must be one pair of interaction/line"); - fprintf ( stdout, "\n +sim_filter[_aln_Ix_iy_Cz_cw "); - fprintf ( stdout, "\n ....................._, aln is assumed"); - fprintf ( stdout, "\n ....................._I max identity to seq"); - fprintf ( stdout, "\n ....................._i min identity to seq"); - fprintf ( stdout, "\n ....................._C max cov on seq"); - fprintf ( stdout, "\n ....................._c min cov on seq"); - fprintf ( stdout, "\n +trim[_aln_%%%%50_n111_N50_T_Fn_fS_pS_max_sim] [string2]"); - fprintf ( stdout, "\n ....................._, aln is assumed"); - fprintf ( stdout, "\n ....................._%%%%"); - fprintf ( stdout, "\n ....................._max Or _min "); - fprintf ( stdout, "\n ....................._cov Or _sim Filter according to the coverage [Def: _sim]"); - fprintf ( stdout, "\n ....................._n "); - fprintf ( stdout, "\n ....................._N"); - fprintf ( stdout, "\n ....................._T Reorder the sequences according to a tree BEFORE triming"); - fprintf ( stdout, "\n ....................._Fn Keep only sequences that have AT LEAST ONE residue aligned"); - fprintf ( stdout, "\n ......................in the n first and n last columns. "); - fprintf ( stdout, "\n ....................._O Remove outlayers that have less than min average sim with other sequences"); - - fprintf ( stdout, "\n .....................Keeping Sequences: Sequences provided via -in2 will be kept"); - - fprintf ( stdout, "\n .....................Keeping Sequences: Sequences whose name contains in field fS will be kept"); - fprintf ( stdout, "\n ....................._f designates a field"); - fprintf ( stdout, "\n ..................... is a Perl regular expression"); - fprintf ( stdout, "\n +aln2unalign Mode Penalty Threshold"); - fprintf ( stdout, "\n .....................Identifies all the streches less conserved than than the average"); - fprintf ( stdout, "\n .....................Mode: lower|number|unalign Act on all the resiues withs score with tree <-in2>)"); - fprintf ( stdout, "\n ......................+tree_scan help to get P1 information"); - fprintf ( stdout, "\n ......................+aln2tree help to get P2 information"); - - fprintf ( stdout, "\n .....................-in and -in2 can contain different taxons"); - fprintf ( stdout, "\n +treelist2groups.N....count all topologies within a list of trees"); - fprintf ( stdout, "\n .....................-in is in fasta format with each name being a newick file"); - fprintf ( stdout, "\n .....................-in2 can be a list of sequences used to trim the trees"); - fprintf ( stdout, "\n ......................N can be used to unresolve the trees with Depth N"); - fprintf ( stdout, "\n +treelist2lti.N.C.....Reports the average stability of each sequence neighborhood"); - fprintf ( stdout, "\n ......................Species can be selected via -in2 [Fasta file with Taxon names]"); - fprintf ( stdout, "\n ......................OR the sequences observed in C% of the files are kept [Def: C=100]"); - - - fprintf ( stdout, "\n +treelist2seq.C.......Reports the species observed in C% of the trees"); - fprintf ( stdout, "\n +treelist2splits......List and counts all the splits in a list of trees"); - fprintf ( stdout, "\n ......................splits can be restricted to a list of sequences provided via -in2"); - fprintf ( stdout, "\n +treelist2dmat.......outputs a distance matrix for a list of trees"); - - fprintf ( stdout, "\n +tree_compute n s....Computes a tree using the MSA provided with -in"); - fprintf ( stdout, "\n ....................n:0-9, controls the way the MSA is filtered"); - fprintf ( stdout, "\n ....................s:pam250mt|blosum62mt|categories|enthropy"); - fprintf ( stdout, "\n ....................s:controls the column evaluation in MSA"); - fprintf ( stdout, "\n +change_distances.f.f:float, sets all the distances to f in the tree"); - fprintf ( stdout, "\n +change_bootstrap n..:n=0 removes all the bootstrap values"); - fprintf ( stdout, "\n .....................:n!=0 adds a the value n to every node"); - fprintf ( stdout, "\n +tree2dpatree........Replaces tree distances with the minimum %%ID in"); - fprintf ( stdout, "\n .....................the depending subgroup. The ID is measured on an"); - fprintf ( stdout, "\n .....................-in=TREE -in2=ALN"); - fprintf ( stdout, "\n +unroot..............Removes the root in the input tree"); - fprintf ( stdout, "\n +tree2group.N.I.P....Reports all the tree subgroup with at most Nseq"); - fprintf ( stdout, "\n .....................and at min I%% identity. Output format can be read by"); - fprintf ( stdout, "\n .....................collapse_tree. New groups are named P_1, P_2..."); - fprintf ( stdout, "\n +collapse_tree.F.....Collapses trees. F is either a file or a list"); - fprintf ( stdout, "\n ..................... ..."); - fprintf ( stdout, "\n +aln2tree............Computes a tree"); - fprintf ( stdout, "\n ..ktupN|aln|sarmat ktupN: match size N to estimate distances"); - fprintf ( stdout, "\n .....................aln: Measures distances on aln"); - fprintf ( stdout, "\n .....................sarmat: expects in to be a SAR matrix of O and I"); - fprintf ( stdout, "\n ..nj | cw............Runs Neighbor Joining OR Cw to compute Tree"); - fprintf ( stdout, "\n ..dpa................Turns the tree into a daptree (+tree2dpatree)"); - fprintf ( stdout, "\n +node_sort.....Sort leafs of tree n1, by node distance"); - - - fprintf ( stdout, "\nMatrix Analysis___________________________________________________"); - fprintf ( stdout, "\n +aln2mat_diaa........computes a dinucleotide matrix on a list of aln"); - fprintf ( stdout, "\n +aln2mat.............computes a log odd matrix"); - - fprintf ( stdout, "\n +seq2lat_mat.........computes a transition matrix on seq provided via -in"); - - fprintf ( stdout, "\nStructure Analysis___________________________________________________"); - fprintf ( stdout, "\n +struc2contacts.A.B D.Displays in capitals all the residues of A"); - fprintf ( stdout, "\n ......................Less than D Angs from a residue of B"); - fprintf ( stdout, "\n ......................A and B are pdb file, D is a distance in Angs"); - fprintf ( stdout, "\n +seq2contacts.A.D.....Identifies all the residues in contact with ligands"); - fprintf ( stdout, "\n ......................Ligands are in the FASTA header of struc in"); - fprintf ( stdout, "\n ......................>Name _S_ [Target Struc] [Ligand1] [Chain] ..."); - fprintf ( stdout, "\n ......................Output: number_fasta: 0=no contact, 1=ligand 1..."); - fprintf ( stdout, "\n ......................9: residues in contact with more than 1 ligand"); - fprintf ( stdout, "\n ......................Use -output=color_html/ascii to display result"); - fprintf ( stdout, "\n +struc2nb...D.........Display a list of all the residues D appart"); - fprintf ( stdout, "\n +rm_template...V......Removes _[S|G|R]_[template] to sequence names"); - fprintf ( stdout, "\n ......................V: omitted | sequences <=> Output sequences"); - fprintf ( stdout, "\n ......................V: template <=> Output templates"); - - fprintf ( stdout, "\n +add_template.F.......Add _[S|G|R]_[template] to sequence names"); - fprintf ( stdout, "\n ......................F can either be a fasta file or an executable"); - fprintf ( stdout, "\n ......................F: File: >name _S_ template"); - fprintf ( stdout, "\n ......................F: executable: pg -infile= -outfile="); - fprintf ( stdout, "\nMatrix Comparison___________________________________________________"); - fprintf ( stdout, "\n +mat2cmp...............Returns the correlation coefficient between two matrices"); - fprintf ( stdout, "\n .......................-in mat1 -input matrix, -in2 mat2 -input2 matrix"); - fprintf ( stdout, "\n*********** INPUT FORMATS: Alignments *****************"); - fprintf ( stdout, "\n AUTOMATIC RECOGNITION"); - fprintf ( stdout, "\n perl_xxx:............. runs xxx onto the input file"); - fprintf ( stdout, "\n xxxx > outfile..xxx reads any formats, outputs fasta"); - fprintf ( stdout, "\n amps_aln saga_aln "); - fprintf ( stdout, "\n clustal_aln fasta_aln msf_aln "); - fprintf ( stdout, "\n dali_aln gotoh_aln pima_aln"); - fprintf ( stdout, "\n dialign_aln matrix conc_aln"); - fprintf ( stdout, "\n NON AUTOMATIC RECOGNITION (use the -input file to specify the format"); - fprintf ( stdout, "\n number_aln newick_tree"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** INPUT FORMATS: Sequences *****************"); - fprintf ( stdout, "\n fasta_seq dali_seq pir_seq"); - fprintf ( stdout, "\n barton_list_tc amps_sd_scores EST_fasta"); - fprintf ( stdout, "\n gor_seq gor_struc number_fasta[*]"); - fprintf ( stdout, "\n swissprot tc_lib pdb_struc"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** INPUT FORMATS: Structures *****************"); - fprintf ( stdout, "\n rna_number"); - fprintf ( stdout, "\n alifold"); - fprintf ( stdout, "\n*********** OUTPUT FORMATS: Alignments ******************"); - fprintf ( stdout, "\n compressed_aln saga_aln clustal_aln"); - fprintf ( stdout, "\n phylip_aln msf_aln fasta_aln "); - fprintf ( stdout, "\n pir_aln "); - fprintf ( stdout, "\n color_html,color_ps......colored using the struc_in file "); - fprintf ( stdout, "\n color_protogene..........colors codons"); - fprintf ( stdout, "\n color_exoset.............mixes conservation (gray) and introns (RGB)"); - fprintf ( stdout, "\n color_pdf pw_lib_saga_aln tdna_aln"); - fprintf ( stdout, "\n thread_dna_on_prot_aln"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** OUTPUT FORMATS: sequence ******************"); - fprintf ( stdout, "\n fasta_seq fasta_seq1 gotoh_seq"); - fprintf ( stdout, "\n gor_seq cache_id"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** OUTPUT FORMATS: weights ******************"); - fprintf ( stdout, "\n constraints saga_pw_sd_weights nseq\n"); - fprintf ( stdout, "\n"); - fprintf ( stdout, "\n*********** OUTPUT Formats: special ****************"); - fprintf ( stdout, "\n len name statistics<_hnrglNL>"); - fprintf ( stdout, "\n sim............outputs a similarity matrix based on an id comparison of -in"); - fprintf ( stdout, "\n sim_sarmat.....in is sar matrix"); - fprintf ( stdout, "\n sim_idscore....makes dp alignment of the sequences using Blosum62mt"); - fprintf ( stdout, "\n sim_idscoreDNA.makes dp alignment of the sequences using idmat"); - fprintf ( stdout, "\n sim............if -in2 is set: in1 vs in2, idscore"); - - fprintf ( stdout, "\n code_name......Outputs a compact list of names for code/decode"); - - - - fprintf ( stdout, "\n"); - - - fprintf ( stdout, "\n"); - return EXIT_SUCCESS; - } - - argv=standard_initialisation (argv, &argc); - - - for ( a=1; a< argc; a++) - { - if (a==1 && argv[1][0]!='-') - { - sprintf( in_file, "%s", argv[a]); - } - else if ( strcmp ( argv[a], "-in_f")==0 ||strm(argv[a],"-input") ) - { - if ( strcmp ( argv[a], "-in_f")==0) fprintf ( stdout,"\nWARNING: %s deprecated, use -input instead", argv[a]); - - sprintf ( in_format, "%s", argv[a+1]); - a++; - } - - else if ( strcmp ( argv[a], "-cache")==0 ) - { - sprintf (cache, "%s", argv[a+1]); - - a++; - } - - - else if ( strcmp ( argv[a], "-exon_boundaries")==0 ) - { - - set_string_variable ("exon_boundaries", argv[a+1]); - a++; - } - else if ( strcmp ( argv[a], "-overaln_threshold")==0 ) - { - - set_int_variable ("overaln_threshold", atoi(argv[a+1])); - a++; - } - else if ( strcmp ( argv[a], "-overaln_target")==0 ) - { - - set_int_variable ("overaln_target", atoi(argv[a+1])); - a++; - } - else if ( strcmp ( argv[a], "-overaln_P1")==0 ) - { - - set_int_variable ("overaln_P1", atoi(argv[a+1])); - a++; - } - else if ( strcmp ( argv[a], "-overaln_P2")==0 ) - { - - set_int_variable ("overaln_P2", atoi(argv[a+1])); - a++; - } - else if ( strcmp ( argv[a], "-overaln_P3")==0 ) - { - - set_int_variable ("overaln_P3", atoi(argv[a+1])); - a++; - } - else if ( strcmp ( argv[a], "-overaln_P4")==0 ) - { - - set_int_variable ("overaln_P4", atoi(argv[a+1])); - a++; - } - - else if ( strcmp ( argv[a], "-in2_f")==0||strm(argv[a],"-input2") ) - { - if ( strcmp ( argv[a], "-in_f")==0) fprintf ( stdout,"\nWARNING: %s deprecated, use -input2 instead", argv[a]); - - sprintf ( in2_format, "%s", argv[a+1]); - a++; - } - else if ( strcmp ( argv[a], "-seqnos")==0) - { - sprintf (action_list[n_actions++], "seqnos"); - } - - else if ( strcmp( argv[a], "-action")==0) - { - while ((a+1)keep_case=1; - else RAD->keep_case=(strm3(argv[a], "on","ON","On"))?1:0; - - } - - else if ( strcmp ( argv[a], "-conv")==0) - { - if ( strncmp ( argv[a+1],"set",3)==0)RAD->symbol_list=make_symbols (argv[++a],&(RAD->n_symbol)); - else - { - RAD->symbol_list=declare_char (STRING, STRING); - while(!NEXT_ARG_IS_FLAG) - { - sprintf ( RAD->symbol_list[RAD->n_symbol], "%s", argv[++a]); - RAD->n_symbol++; - } - } - } - else if ( strcmp ( argv[a], "-struc_in_f")==0 ||strcmp ( argv[a], "-input3")==0 ) - { - sprintf ( struc_in_format, "%s", argv[a+1]); - a++; - } - else if ( strcmp ( argv[a], "-out_f")==0 ||strm(argv[a],"-output") ) - { - if ( strcmp ( argv[a], "-out_f")==0) fprintf (stdout, "\nWARNING: %s deprecated, use -output instead", argv[a]); - sprintf ( out_format, "%s", argv[a+1]); - a++; - } - else if ( strm ( argv[a], "-struc_out_f") || strm ( argv[a], "-output_struc") ) - { - sprintf ( struc_out_format, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-in")==0) - { - sprintf( in_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-rename")==0) - { - sprintf( rename_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-code")==0) - { - code=CODE; - sprintf( rename_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-decode")==0) - { - code=DECODE; - sprintf( rename_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-in2")==0) - { - sprintf( in2_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-coor")==0) - { - sprintf( RAD->coor_file, "%s", argv[a+1]); - a++; - } - else if (strcmp (argv[a],"-out")==0) - { - sprintf (out_file, "%s", argv[a+1]); - a++; - } - else if (strcmp (argv[a],"-out2")==0) - { - sprintf (out2_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp (argv[a],"-struc_in")==0 || strcmp (argv[a],"-in3")==0 ) - { - sprintf( struc_in_file, "%s", argv[a+1]); - a++; - } - else if (strcmp (argv[a],"-struc_out")==0) - { - sprintf (struc_out_file, "%s", argv[a+1]); - a++; - } - else if ( strcmp ( argv[a], "-rm_gap")==0) - { - RAD->rm_gap=1; - } - else if ( strcmp ( argv[a], "-print_format")==0) - { - print_format=1; - } - else if ( strcmp ( argv[a], "-no_warning")==0) - { - set_warning_mode (NO); - } - - else - { - fprintf ( stdout, "\nUNKNOWN OPTION: %s", argv[a]); - myexit(EXIT_FAILURE); - } - } -/****************************************************************/ -/* */ -/* Data Preparation */ -/* */ -/* */ -/****************************************************************/ - - prepare_cache (cache); -/****************************************************************/ -/* */ -/* INPUT SEQ/ALN */ -/* */ -/* */ -/****************************************************************/ - - - if ( strm (out_format, "hasch")) - { - fprintf ( stdout, "%d\n", (int)hash_file(in_file)); - return EXIT_SUCCESS; - } - - if ( rename_file[0]) - { - rename_list=read_rename_file ( rename_file,code); - } - - - if ((D1=read_data_structure (in_format, in_file,RAD))!=NULL) - { - in_format=(in_format && in_format[0])?in_format:identify_seq_format(in_file); - - if (print_format)fprintf ( stdout, "\nFILE:%s FORMAT:%s\n", in_file, in_format); - } - else if ( in_file[0]) - { - fprintf ( stdout, "\nFORMAT of file %s Not Supported[FATAL:%s]\n", in_file, PROGRAM); - myexit(EXIT_FAILURE); - } - - if ((D2=read_data_structure (in2_format, in2_file,RAD))!=NULL){if (print_format)fprintf ( stderr, "\nFILE:%s FORMAT:%s\n", in2_file, (in2_format&&in2_format[0])?in2_format:identify_seq_format(in2_file));} - - else if (!D2 && in2_file[0]) - { - fprintf ( stderr, "\nFORMAT of file %s Not Supported [FATAL:%s]\n", in2_file, PROGRAM); - myexit(EXIT_FAILURE); - } - -/*STRUCTURE INPUT*/ - - - if ((D_ST=read_data_structure (struc_in_format, struc_in_file,RAD))) - { - - if ( D_ST->CL) - { - Constraint_list *CL; - int *entry; - - CL=D_ST->CL; - - entry=vcalloc ( LIST_N_FIELDS, sizeof (int)); - - for (a=0; ane; a++) - { - entry=extract_entry (entry, a, CL); - if ( D_ST->S)(D_ST->S)->seq[entry[SEQ1]][entry[R1]-1]=entry[WE]; - } - thread_seq_struc2aln (D_ST->A, D_ST->S); - } - else if ( name_is_in_list ("cons", ((D_ST)->A)->name, ((D_ST)->A)->nseq, 100)); - else - { - D_ST->A=copy_aln ( D1->A, D_ST->A); - - thread_seq_struc2aln (D_ST->A, D_ST->S); - } - } - else if ((strcmp (struc_in_format, "rna_number")==0) && in_file[0]) - { - D_ST->RNA_ST=read_rna_struc_number((D1->A),struc_in_file); - } - else if ( struc_in_format[0] && struc_in_file[0]) - { - - fprintf ( stderr, "\nSTRUC %s UNKNOWN[FATAL]", struc_in_format); - myexit(EXIT_FAILURE); - } - else - { - D_ST=vcalloc ( 1, sizeof (Sequence_data_struc)); - } - - action=declare_char(100, 100); - for ( a=0; a< n_actions;) - { - if (action_list[a][0]!='+') - { - fprintf ( stderr, "\nWARNING: Action %s Unknown. Actions start with a +", action_list[a]); - myexit (EXIT_FAILURE); - } - else - { - b=0; - sprintf ( action[b++], "%s", action_list[a++]+1); - while ( aA= rename_seq_in_aln(D1->A, rename_list); - if (D2)D2->A=rename_seq_in_aln (D2->A, rename_list); - if (D_ST)D_ST->A=rename_seq_in_aln (D_ST->A,rename_list); - - if (D1)D1->T =rename_seq_in_tree (D1->T, rename_list); - if (D2)D2->T =rename_seq_in_tree (D2->T, rename_list); - if (D_ST)D_ST->T=rename_seq_in_tree (D_ST->T,rename_list); - } - - - if ( !out_format[0] && ! struc_out_format[0])sprintf ( out_format, "%s", (in_format && in_format[0])?in_format:"fasta_aln"); - main_output ( D1, D2, D_ST, out_format, out_file); - main_output ( D1, D2, D_ST, struc_out_format, struc_out_file); - return EXIT_SUCCESS; - } - - - - -/**************************************************************************************************/ -/***************************** FORMAT GUESSING ******************************************/ -/**************************************************************************************************/ -Sequence_data_struc *read_data_structure ( char *in_format, char *in_file, Action_data_struc *RAD) - - { - Sequence_data_struc *D; - char **seq_name=NULL, **sequences=NULL; - int nseq=0, a; - - - D=vcalloc ( 1, sizeof (Sequence_data_struc)); - - - if (!in_file[0])return NULL; - if (!in_format[0]) - { - in_format=identify_seq_format(in_file); - } - if (!in_format[0])return NULL; - - - - D->A=declare_Alignment(NULL); - if ( RAD->keep_case)(D->A)->residue_case=KEEP_CASE; - - D->rm_gap=RAD->rm_gap; - sprintf ( D->format, "%s", in_format); - sprintf ( D->file, "%s", in_file); - - - - - if ( strm2(in_format,"saga_aln","clustal_aln")) - { - read_aln (in_file, D->A); - D->S=aln2seq(D->A); - - } - - else if ( strm (in_format, "treefile_list")) - { - int z; - D->S=get_tree_file_list(in_file); - D->A=seq2aln(D->S, D->A,NO_PAD); - } - else if ( strm (in_format, "file_list") || strm (in_format, "list")) - { - D->S=get_file_list(in_file); - D->A=seq2aln(D->S, D->A,KEEP_GAP); - } - else if ( strm (in_format, "fasta_tree")) - { - int z; - D->S=get_fasta_tree (in_file, NULL); - D->A=seq2aln(D->S, D->A,NO_PAD); - - } - else if ( strm (in_format, "tree_list") || strm (in_format, "treelist")) - { - char **line; - FILE *seq,*dnd; - int n=0; - char *seq_file; - FILE *fp; - Sequence *T; - seq_file=vtmpnam(NULL); - seq=vfopen (seq_file, "w"); - line=file2lines (in_file); - fp=vfopen (seq_file, "w"); - for ( n=1; nTree_%d\n%s\n", n,line[n]); - } - vfclose (fp); - - free_char (line, -1); - return read_data_structure ( "fasta_tree",seq_file,RAD); - } - - else if (strm (in_format, "matrix")) - { - D->M=read_matrice (in_file); - } - else if (strm4 (in_format, "newick_tree", "newick", "nh", "new_hampshire")) - { - D->T=main_read_tree (in_file); - D->S=tree2seq(D->T, NULL); - D->A=seq2aln (D->S,D->A, 0); - } - else if (strm (in_format, "blast_aln")) - { - if (read_blast_aln (in_file, D->A)) - { - D->S=aln2seq(D->A); - } - else - { - return NULL; - } - } - else if ( strm( in_format,"number_aln")) - { - read_number_aln (in_file, D->A); - D->S=aln2seq(D->A); - } - else if ( strm( in_format,"stockholm_aln")) - { - read_stockholm_aln (in_file, D->A); - D->S=aln2seq(D->A); - } - else if ( strm( in_format,"gotoh_aln")) - { - read_gotoh_aln (in_file, D->A); - D->S=aln2seq(D->A); - } - - else if ( strm ( in_format, "msf_aln")) - { - read_msf_aln (in_file, D->A); - D->S=aln2seq(D->A); - } - else if ( strm ( in_format, "amps_aln")) - { - read_amps_aln (in_file, D->A); - D->S=aln2seq(D->A); - } - else if ( strm (in_format, "excel_seq")) - { - D->S=perl_reformat2fasta ("excel2fasta.pl",in_file); - (D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strm (in_format, "pavie_seq")) - { - D->S=perl_reformat2fasta ("pavie2fasta.pl",in_file); - (D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strncmp (in_format, "perl_",5 )==0) - { - D->S=perl_reformat2fasta (in_format+5,in_file); - (D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strm (in_format, "number_fasta")) - { - D->S=get_fasta_sequence_num (in_file, NULL); - (D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strm (in_format, "raw_fasta")) - { - D->S=get_fasta_sequence_raw (in_file, NULL); - (D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - - else if ( strm2 (in_format, "fasta_aln", "fasta_seq")) - { - - D->S=get_fasta_sequence (in_file, NULL); - if ( strcmp (in_format, "fasta_aln")==0)(D->S)->contains_gap=0; - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strm (in_format, "fasta_tree")) - { - - D->S=get_fasta_tree (in_file, NULL); - D->A=seq2aln(D->S, D->A, NO_PAD); - } - - else if ( strm (in_format, "pdb") || strm (in_format, "pdb_struc")) - { - D->S=get_pdb_sequence (in_file); - if ( D->S==NULL) - { - add_warning (stderr, "FAILED TO find PDB File %s", in_file); - myexit (EXIT_FAILURE); - } - D->A=seq2aln(D->S, D->A,RAD->rm_gap); - } - else if ( strm2(in_format, "pir_seq", "pir_aln")) - { - D->S=get_pir_sequence ( in_file,NULL ); - seq2aln(D->S, D->A, RAD->rm_gap); - } - else if ( strm(in_format, "gor_seq") ) - { - D->S=get_gor_sequence ( in_file,NULL ); - seq2aln(D->S, D->A, RAD->rm_gap); - } - else if ( strm2 ( in_format, "dali_aln", "dali_seq")) - { - D->S=get_sequence_dali ( in_file); - seq2aln(D->S, D->A, RAD->rm_gap); - } - else if ( strm (in_format, "barton_list_tc")) - { - get_barton_list_tc_seq ( in_file); - } - else if ( strm (in_format, "amps_sd_scores")) - { - D->W=get_amps_sd_scores ( in_file); - } - - else if ( strm ( in_format, "pima_aln")) - { - D->S=get_pima_sequence ( in_file); - seq2aln (D->S, D->A, RAD->rm_gap); - } - else if ( strm( in_format, "gor_struc")) - { - D->S=get_struc_gor ( in_file); - seq2aln(D->S, D->A, RAD->rm_gap); - } - else if ( strm( in_format, "dialign_aln")) - { - D->S=get_dialign_sequence ( in_file); - seq2aln (D->S, D->A, RAD->rm_gap); - } - else if ( strm( in_format, "tc_lib") || strm( in_format, "mocca_lib") || strm( in_format, "lib")) - { - read_seq_in_list (in_file,&nseq,&sequences,&seq_name); - D->S=fill_sequence_struc ( nseq, sequences, seq_name); - D->CL=declare_constraint_list ( D->S,NULL, NULL, 0,NULL, NULL); - D->CL=read_constraint_list_file(D->CL,in_file); - seq2aln (D->S, D->A, RAD->rm_gap); - free_char (sequences,-1); - free_char (seq_name, -1); - } - else if ( strm( in_format,"swissprot_seq")) - { - D->S=get_swissprot_sequence ( in_file,NULL); - seq2aln (D->S, D->A, RAD->rm_gap); - } - else if (strm (in_format, "alifold")) - { - D->S=read_alifold ( in_file); - seq2aln (D->S, D->A,0); - } - else - { - return NULL; - } - - if ( D->A) - { - for ( a=0; a<(D->A)->nseq; a++)sprintf ( (D->A)->file[a], "%s", in_file); - } - if ( D->S) - { - for ( a=0; a<(D->A)->nseq; a++)sprintf ( (D->S)->file[a], "%s", in_file); - } - - return D; - } -Sequence *read_sequences (char *name) -{ - return main_read_seq (name); -} -Alignment * alifold2aln (char *file) -{ - Sequence *S; - S=read_alifold(file); - sprintf ( S->seq[0],"%s", S->seq[1]); - return seq2aln (S, NULL, 0); -} -Sequence * read_alifold (char *file) -{ - Sequence *S; - char **list; - int l; - S=declare_sequence (1,count_n_char_in_file (file),2); - list=file2lines (file); - - S->seq[0]=list[1]; - S->seq[1]=list[2]; - substitute (S->seq[0], "\n", "\0"); - substitute (S->seq[0], " ", "\0"); - substitute (S->seq[0], "_", STOCKHOLM_STRING); - l=strlen (S->seq[0]); - substitute (S->seq[1], "\n", "\0"); - substitute (S->seq[1], " ", "\0"); - substitute (S->seq[1], ".", STOCKHOLM_STRING); - S->seq[1][l]='\0'; - sprintf (S->name[0], "cons", file); - sprintf (S->name[1], "#=GC SS_cons", file); - return S; -} - - - - - - -Sequence * main_read_seq ( char *name) - { - char *format=NULL; - Sequence *S=NULL; - Alignment *A=NULL; - int a; - - - format=identify_seq_format (name); - - - if ( getenv4debug ("DEBUG_REFORMAT"))fprintf ( stderr, "\n\nFormat %s\n", format); - - - if (format &&strm(format, "fasta_seq")) - { - S= get_fasta_sequence ( name, NULL); - } - else if (format &&strm(format, "pir_seq")) S= get_pir_sequence ( name, NULL); - else if (format &&strm(format,"swissprot_seq"))S= get_swissprot_sequence (name, NULL); - else if (format && strstr (format, "aln")) - { - A=main_read_aln ( name, NULL); - S=aln2seq(A); - ungap_seq(S); - free_aln(A); - } - else if ( format && strstr (format, "tc_lib")) - { - int nseq,b; - char **sequences=NULL, **seq_name=NULL; - - read_seq_in_list (name,&nseq,&sequences,&seq_name); - S=fill_sequence_struc ( nseq, sequences, seq_name); - for ( b=0; b< S->nseq; b++)sprintf ( S->file[b], "%s",name); - free_char (seq_name, -1);free_char (sequences, -1); - } - else - { - /*Use The ClustalW routine*/ - S=cw_read_sequences (name); - } - - for ( a=0; anseq; a++)sprintf ( S->file[a], "%s", name); - vfree(format); - ungap_seq(S); - S=clean_sequence ( S); - return S; - } - -Alignment * main_read_aln ( char *name, Alignment *A) - { - int a; - - static char *format; - Sequence *S=NULL; - Sequence *IN_SEQ; - - - if ( !name)return NULL; - else if (!check_file_exists(name)) - { - if ( !check_file_exists (name+1))return NULL; - else if ( name[0]=='A') name++; - else if ( name[0]=='S') name++;/*Line Added for the -convert flag of T-Coffee*/ - } - - - if (!A)A=declare_aln(NULL); - format=identify_seq_format (name); - - IN_SEQ=A->S; - - if ((format && strm(format, "saga_aln" )) ||strm(format, "clustal_aln")||strm(format, "t_coffee_aln" ) ) - { - - read_aln ( name, A); - - } - else if (format && strm (format, "conc_aln"))A=input_conc_aln (name,NULL); - else if (format &&strm(format, "msf_aln" ))read_msf_aln ( name, A); - else if (format &&strm(format, "blast_aln"))read_blast_aln (name, A); - else if (format &&(strm(format, "fasta_aln"))) - { - - - S=get_fasta_sequence ( name, NULL); - - S->contains_gap=0; - seq2aln (S, A, 0); - } - else if (format &&strm(format, "pir_aln")) - { - S=get_pir_sequence ( name, NULL); - S->contains_gap=0; - seq2aln (S, A, 0); - } - else if (format && strm(format, "fasta_seq") && A) - { - S=get_fasta_sequence ( name, NULL); - - for ( a=1; anseq; a++)if ( strlen (S->seq[a-1])!=strlen (S->seq[a])){free_sequence (S, S->nseq); free_aln (A); return NULL;} - S->contains_gap=0; - seq2aln (S, A, 0); - } - - else if (format && strm(format, "pir_seq") && A) - { - S=get_pir_sequence ( name, NULL); - - for ( a=1; anseq; a++)if ( strlen (S->seq[a-1])!=strlen (S->seq[a])){free_sequence (S, S->nseq); free_aln (A); return NULL;} - S->contains_gap=0; - seq2aln (S, A, 0); - } - else - { - free_aln(A); - return NULL; - } - - - if ( check_list_for_dup( A->name, A->nseq)) - { - fprintf ( stderr, "\nWARNING (main_read_aln): %s is duplicated in File %s ", check_list_for_dup( A->name, A->nseq), A->file[0]); - A=aln2unique_name_aln(A); - } - - if (IN_SEQ)A->S=IN_SEQ; - else if (!A->S){A->S=aln2seq(A);} - - A->S=ungap_seq(A->S); - A=fix_aln_seq(A, A->S); - compress_aln (A); - for ( a=0; a< A->nseq; a++) sprintf ( A->file[a], "%s", name); - - A=clean_aln (A); - return A; - } - - -char * identify_aln_format ( char *file) - { - /*This function identify known sequence and alignmnent formats*/ - return identify_seq_format (file); - } -char * identify_seq_format ( char *file) - { - char *format=NULL; - /*This function identify known sequence and alignmnent formats*/ - - if ( format==NULL)format=vcalloc ( 100, sizeof (char)); - else format[0]='\0'; - - - - if ( !check_file_exists(file)) - { - fprintf (stderr, "ERROR: %s Does Not Exist [FATAL:%s]\n",file, PROGRAM); - myexit (EXIT_FAILURE); - } - else if ( is_stockholm_aln (file))sprintf (format, "stockholm_aln"); - else if ( is_blast_file (file))sprintf ( format, "blast_aln"); - else if ( is_pdb_file(file))sprintf ( format, "pdb_struc"); - else if ( format_is_msf (file))sprintf ( format, "msf_aln"); - else if ( format_is_fasta_seq(file))sprintf ( format, "fasta_seq"); - else if ( format_is_fasta_aln(file))sprintf ( format, "fasta_aln"); - else if ( format_is_pir_aln (file))sprintf ( format, "pir_aln"); - else if ( format_is_pir_seq (file))sprintf ( format, "pir_seq"); - else if ( format_is_oligo (file))sprintf ( format, "oligo_aln"); - else if ( format_is_swissprot (file))sprintf ( format, "swissprot_seq"); - else if ( format_is_saga (file))sprintf ( format, "clustal_aln"); - else if ( format_is_conc_aln (file))sprintf ( format, "conc_aln"); - else if ( is_lib (file))sprintf ( format, "tc_lib"); - else if ( is_lib_02 (file))sprintf ( format, "tc_lib_02"); - else if ( is_newick(file))sprintf ( format, "newick_tree"); - - else - { - add_warning ( stderr, "\nThe Format of File: %s was not recognized [SERIOUS:%s]",file, PROGRAM); - } - return format; - } -char **identify_list_format ( char **list, int n) - { - int a; - char *name; - char *string; - char mode; - - - - declare_name (name); - for ( a=0; a< n; a++) - { - - sprintf (name, "%s", list[a]); - string=list[a]; - if ((mode=identify_format ( &string))!='?') - { - sprintf ( name, "%s", string); - sprintf ( list[a], "%c%s", mode,name); - } - else - { - fprintf ( stderr, "\nERROR: %s not recognised [FATAL:%s]", name, PROGRAM); - } - - } - - vfree(name); - return list; - } - -char * name2type_name ( char *name) -{ - /*turns into , ...*/ - char *new_name; - char mode; - - new_name=vcalloc ( strlen (name)+2, sizeof (char)); - sprintf ( new_name, "%s", name); - if (is_in_set (name[0], "ALSMXPRW") && !check_file_exists(name)) - { - sprintf ( new_name, "%s", name); - } - else - { - mode=identify_format (&new_name); - sprintf ( new_name, "%c%s", mode,name); - } - return new_name; -} - -char identify_format (char **fname) - { - char mode='?'; - mode=fname[0][0]; - - if ((is_in_set (mode, "ALMSPR") && check_file_exists(fname[0]+1)) ||(mode=='X' && is_matrix ( fname[0]+1)) ||(mode=='M' && is_method(fname[0]+1)) ) - { - - fname[0]++; - } - else if (mode=='W' && !check_file_exists(fname[0])){fname[0]++;} - else - { - - /*WARNING: Order matters => internal methods can be confused with files, must be checked last*/ - if (is_lib(fname[0]))mode='L'; - else if (is_pdb_file(fname[0]))mode='P'; - else if (is_seq(fname[0]))mode='S'; - else if (is_aln(fname[0]))mode='A'; - else if (is_matrix(fname[0]))mode='X'; - else if (is_method(fname[0]))mode='M'; - else mode='?'; - } - return mode; - } - - - -int is_pdb_name ( char *name) - { - char command[1000]; - int result; - char *result_file; - static char **buf_names; - static int *buf_result; - static int nbuf; - FILE *fp; - - - /*Use the look up*/ - if ( !buf_names) - { - buf_names=declare_char (1000, 100); - buf_result=vcalloc (1000, sizeof (int)); - } - if ( (result=name_is_in_list ( name, buf_names,nbuf,100))!=-1)return buf_result[result]; - - - - result_file=vtmpnam (NULL); - - sprintf ( command, "extract_from_pdb -is_pdb_name \'%s\' > %s", name, result_file); - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:is_pdb_name] %s\n", command); - my_system ( command); - - fp=vfopen ( result_file, "r"); - fscanf ( fp, "%d", &result); - vfclose (fp); - vremove ( result_file); - - sprintf ( buf_names[nbuf], "%s", name); - result=buf_result[nbuf++]=(result==1)?1:0; - - return result; - - } - -char* get_pdb_id ( char *file) -{ - /*receives the name of a pdb file*/ - /*reads the structure id in the header*/ - /*returns the pdb_id*/ - char *tmp_name; - char command[10000]; - char cached [1000]; - char fname[1000]; - FILE *fp; - char *id; - char buf[1000]; - - - tmp_name=vtmpnam(NULL); - - sprintf ( cached, "%s/%s", get_cache_dir(),file); - if ( check_file_exists(cached))sprintf ( fname, "%s", cached); - else sprintf ( fname, "%s", file); - - sprintf ( command, "extract_from_pdb -get_pdb_id %s > %s",fname, tmp_name); - - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:get_pdb_id] %s\n", command); - my_system ( command); - - buf[0]='\0'; - fp=vfopen (tmp_name, "r"); - fscanf ( fp, "\n%s\n", buf); - vfclose (fp); - - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:get_pdb_id]DONE\n"); - - id=vcalloc ( strlen (buf)+1, sizeof (char)); - sprintf ( id, "%s", buf); - - - - return id; -} - - -char* get_pdb_struc(char *in_name, int start, int end) - { - char *name1,*name2; - char command[LONG_STRING]; - char *name; - - - - - name=vcalloc ( STRING, sizeof (char)); - sprintf ( name, "%s", in_name); - - if ( (name1=is_pdb_struc(name))==NULL && (name[0]=='P' && ((name1=is_pdb_struc (name+1))==NULL))) - { - fprintf ( stderr, "\nERROR Could not download structure %s [FATAL:%s]\n", name, PROGRAM);crash(""); - } - else if ( (start==0) && (end==0))return name1; - else - { - declare_name(name2); - sprintf ( name2, "%s_%d_%d.pdb", name, start, end); - sprintf ( command, "extract_from_pdb -infile \'%s\' -chain FIRST -coor %d %d > %s%s",check_file_exists(name1),start, end, get_cache_dir(),name2); - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:get_pdb_struc] %s\n", command); - my_system (command); - - if ( is_pdb_file(name2))return name2; - else - { - fprintf ( stderr, "\nERROR Could not extract segment [%d %d] from structure %s [FATAL:%s]\n",start, end, name, PROGRAM);crash(""); - } - exit (EXIT_FAILURE); - } - - return NULL; - } - -char* seq_is_pdb_struc ( Sequence *S, int i) -{ - - if (!S){return NULL;} - else if ( !S->T[i]){return NULL;} - else if ( !((S->T[i])->P)){return NULL;} - else return ((S->T[i])->P)->template_file; -} -char* is_pdb_struc ( char *name) - { - /*Receives a name - checks if this is the name of a local file that contains PDB data - checks if this is the name of a file from a local db - put the file in the cache - checks if this is a file from a remote db (extract_from_pdb - return NULL if everything fails - */ - - static char *file_name1; - static char *file_name2; - static char **buf_names; - static char **buf_result; - static int nbuf, s; - - - char *r=NULL; - char command[1000]; - - - if ( !name || name[0]=='\0')return NULL; - - - /*Use the look up*/ - if ( !buf_names) - { - - buf_names=vcalloc ( 1000, sizeof (char*)); - buf_result=vcalloc ( 1000, sizeof (char*)); - file_name1=vcalloc ( 1000, sizeof (char)); - file_name2=vcalloc ( 1000, sizeof (char)); - } - if ( (s=name_is_in_list ( name, buf_names,nbuf,-1))!=-1)return buf_result[s]; - - - r=NULL; - sprintf ( file_name1, "%s", name); - sprintf ( file_name2, "%s.pdb", name); - - - if (is_pdb_file(file_name1)){r=file_name1;} - else if (is_pdb_file(file_name2)){r=file_name2;} - else if (is_pdb_name (name)) - { - char *tmpname; - tmpname=vtmpnam (NULL); - - - sprintf ( file_name2, "%s.pdb", name); - /*sprintf ( command, "extract_from_pdb -netfile \'%s\' > %s%s 2>/dev/null",name, get_cache_dir(), file_name2);*/ - sprintf ( command, "extract_from_pdb -netfile \'%s\' > %s 2>/dev/null",name,tmpname); - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:is_pdb_struc] %s\n", command); - my_system (command); - - sprintf ( command, "cp %s %s%s", tmpname, get_cache_dir(), file_name2); - my_system (command); - - if ( is_pdb_file(file_name2))r=file_name2; - else r=NULL; - - } - - /*Fill the buffer*/ - buf_names[nbuf]=vcalloc ( strlen (name)+1, sizeof (char)); - sprintf ( buf_names[nbuf], "%s", name); - if ( r) - { - buf_result[nbuf]=vcalloc ( strlen (r)+1, sizeof (char)); - sprintf (buf_result[nbuf], "%s", r); - } - else buf_result[nbuf]=NULL; - nbuf++; - - return r; - } - -char *fix_pdb_file ( char *in) -{ - char *empty; - - empty=vcalloc(1, sizeof(char)); - - if ( !in || !check_file_exists (in))return empty; - else if ( is_pdb_file(in))return in; - else - { - char command[10000]; - char *tmp; - char *tmp2; - tmp=vtmpnam (NULL); - tmp2=vcalloc (strlen (tmp)+1, sizeof (char)); - sprintf (tmp2, "%s", tmp); - sprintf ( command, "extract_from_pdb %s > %s", check_file_exists(in), tmp2); - my_system (command); - if ( is_pdb_file (tmp))return tmp2; - else return empty; - - } -} - -int is_sap_file ( char *name) - { - FILE *fp; - if (!name); - if (!check_file_exists(name))return 0; - - if ((fp=find_token_in_file (name, NULL, "Percent"))!=NULL) - { - if ((fp=find_token_in_file (name,fp, "Percent"))!=NULL) - { - vfclose (fp); - return 1; - } - else - { - return 0; - } - } - else - { - return 0; - } - } - - -int is_blast_file ( char *name) - { - if ( !check_file_exists(name) ) return 0; - else if (token_is_in_file (name, "")) - { - return BLAST_XML; - } - else - { - if (token_is_in_file (name, "Lambda")) - { - return BLAST_TXT; - } - else - { - return 0; - } - } - return 0; - } -int is_simple_pdb_file ( char *name) -{ - FILE *fp; - if ((fp=find_token_in_file (name, NULL, "SIMPLE_PDB_FORMAT"))!=NULL){vfclose (fp);return 1;} - return 0; -} - - -int is_pdb_file ( char *name) - { - FILE *fp; - int ispdb=0; - - if ( name==NULL) return 0; - if (!check_file_exists (name))return 0; - - - - if ((fp=find_token_in_file (name, NULL, "\nHEADER"))!=NULL) - {vfclose (fp); - ispdb++; - } - if ((fp=find_token_in_file (name, NULL, "\nSEQRES"))!=NULL) - {vfclose (fp); - - ispdb++; - } - - if ((fp=find_token_in_file (name, NULL, "\nATOM"))!=NULL) - { - vfclose (fp); - ispdb++; - - } - else - { - ispdb=0; - } - - - - if ( ispdb>=2)return 1; - else return 0; - } -int is_seq ( char *name) - { - char *format; - - if ( !check_file_exists(name))return 0; - - format= identify_seq_format(name); - if(!format || format[0]=='\0'){vfree (format);return 0;} - else if (strstr(format, "seq")){vfree (format);return 1;} - else return 0; - } -int is_aln ( char *name) - { - char *format; - if ( !check_file_exists (name))return 0; - - format= identify_seq_format(name); - if ( !format || format[0]=='\0'){vfree (format);return 0;} - else if (strstr(format, "aln")){vfree (format); return 1;} - else return 0; - } - -int is_matrix (char *name) - { - int **m; - - if ((m=read_matrice (name))!=NULL){free_int (m, -1); return 1;} - return 0; - } -int is_newick (char *name) - { - int c; - FILE *fp; - - - fp=vfopen (name, "r"); - if ( (c=fgetc(fp))!='('){vfclose (fp); return 0;} - - - while ( (c=fgetc(fp))!=EOF) - { - if ( c==';'){vfclose (fp); return 1;} - } - vfclose (fp); - return 0; - } - -int is_clustalw_matrix ( char *name) -{ - - FILE *fp; - - - if ( (fp=find_token_in_file (name, NULL, "CLUSTALW_MATRIX"))!=NULL){vfclose(fp);return 1;} - else return 0; -} -int is_pavie_matrix ( char *name) -{ - - FILE *fp; - - - if ( (fp=find_token_in_file (name, NULL, "PAVIE_MATRIX"))!=NULL){vfclose(fp);return 1;} - else return 0; -} -int is_distance_matrix_file (char *name) -{ - FILE *fp; - if ( (fp=find_token_in_file (name, NULL, "TC_DISTANCE_MATRIX_FORMAT_01"))!=NULL){vfclose(fp);return 1;} - else return 0; -} -int is_similarity_matrix_file (char *name) -{ - FILE *fp; - if ( (fp=find_token_in_file (name, NULL, "TC_SIMILARITY_MATRIX_FORMAT_01"))!=NULL){vfclose(fp);return 1;} - else return 0; -} -int is_blast_matrix ( char *name) -{ - - FILE *fp; - - - if ( (fp=find_token_in_file (name, NULL, "BLAST_MATRIX"))!=NULL){vfclose(fp);return 1;} - else return 0; -} - -int is_single_seq_weight_file ( char *name) -{ - - - return token_is_in_file ( name, "SINGLE_SEQ_WEIGHT_FORMAT_01"); - -} -int is_stockholm_aln (char *file) -{ - FILE *fp; - - if ((fp=find_token_in_file_nlines (file, NULL, "STOCKHOLM",2))) - { - vfclose (fp); - return 1; - } - return 0; -} - -int is_lib ( char *name) -{ - return is_lib_01(name); -} - -int is_lib_02 ( char *name) -{ - - return token_is_in_file ( name, "TC_LIB_FORMAT_02"); - -} - -int is_lib_01 (char *name) - { - - - if ( token_is_in_file ( name, "TC_LIB_FORMAT_01")) return 1; - else if (token_is_in_file ( name, "T-COFFEE_LIB_FORMAT_01"))return 1; - else if (token_is_in_file (name, "SEQ_1_TO_N"))return 1; - else return 0; - } -int is_lib_list ( char *name) -{ - if ( !check_file_exists (name))return 0; - if ( token_is_in_file ( name, "TC_LIB_LIST_FORMAT_01")) return 1; - return 0; -} -int is_method ( char *file) - { - char new_file[200]; - - - sprintf ( new_file, "%s", file); - if ( (token_is_in_file(new_file, "TC_METHOD_FORMAT_01"))){return 1;} - if ( is_in_pre_set_method_list(new_file)) - { - - vremove ( new_file); - return 1; - } - else - { - - return 0; - } - } - -/*******************************************************************************************/ -/* */ -/* */ -/* SEQUENCE FORMAT IDENTIFIERS */ -/* */ -/***************************************************************************************** */ -int type_is_exon_boundaries(char **seq, int n) -{ - int a, l, b; - for (a=0; aseq[0]){free_sequence (S, S->nseq); return 1;} - l=strlen ( S->seq[0]); - for ( a=0; a< S->nseq; a++)if(strlen(S->seq[a])!=l){free_sequence (S, S->nseq);return 1;} - for ( a=0; a< S->nseq; a++) - { - l1=strlen ( S->seq[a]); - ungap (S->seq[a]); - l2=strlen ( S->seq[a]); - if ( l1!=l2) - { - free_sequence (S, S->nseq); - return 0; - } - } - free_sequence (S, S->nseq); - return 1; - } - else - { - return 0; - } - } - -int format_is_fasta ( char *file) - { - Sequence *S; - - if ( !check_file_exists(file))return 0; - - if ( get_first_non_white_char (file)!='>')return 0; - if ( !(S=get_fasta_sequence (file, NULL)))return 0; - free_sequence (S, -1); - if ( format_is_pir(file)) return 0; - return 1; - } - -int format_is_pir_aln ( char *file) - - { - if ( format_is_pir(file) && !format_is_pir_seq(file))return 1; - else return 0; - } - -int format_is_pir_seq ( char *file) - { - int a, l1, l2; - Sequence *S; - - - if ( format_is_pir (file)) - { - S=get_pir_sequence (file, NULL); - for ( a=0; a< S->nseq; a++) - { - l1=strlen ( S->seq[a]); - ungap (S->seq[a]); - l2=strlen ( S->seq[a]); - if ( l1!=l2) - { - free_sequence (S, S->nseq); - return 0; - } - } - return 1; - } - else - { - return 0; - } - } - - -int format_is_pir ( char *file) - { - Sequence *S; - int pir_name=1, star_end=1, a; - - S=get_fasta_sequence (file, NULL); - if (!S)return 0; - else if (!S->seq[0])return 0; - - pir_name=1; star_end=1; - for (a=0; a< S->nseq; a++) - { - int l; - if (!is_pir_name(S->name[a]))pir_name=0; - l=strlen (S->seq[a]); - if (!l || (l && S->seq[a][l-1]!='*')) - star_end=0; - } - free_sequence(S,-1); - if ( pir_name && star_end) return 1; - else return 0; - } -int is_pir_name (char *name) -{ - if ( strstr (name, "P1;"))return 1; - if ( strstr (name, "F1;"))return 1; - if ( strstr (name, "DL;"))return 1; - if ( strstr (name, "DC;"))return 1; - if ( strstr (name, "RL;"))return 1; - if ( strstr (name, "RC;"))return 1; - if ( strstr (name, "XX;"))return 1; - return 0; -} - - -int format_is_conc_aln (char *file) -{ - FILE *fp; - if ( (fp=find_token_in_file (file, NULL, "CONC_MSF_FORMAT_01"))){vfclose (fp); return 1;} - return 0; -} -int format_is_saga ( char *file) - { - FILE *fp; - int **list; - int n_blocks; - int n_seq; - int a, b; - - if ( (fp=find_token_in_file (file, NULL, "SAGA"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "CLUSTAL"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "ClustalW"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "clustalw"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "clustal"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "T-COFFEE_MSA"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "INTERLEAVED_MSA"))){vfclose (fp); return 1;} - - else return 0; - - if (1==1); - else if ((fp=find_token_in_file (file, NULL, "T-COFFEE"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "SAGA_FORMAT"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "GARP"))){vfclose (fp); return 1;} - else if ((fp=find_token_in_file (file, NULL, "INTERLEAVED"))){vfclose (fp); return 1;} - - else - { - list=get_file_block_pattern (file,&n_blocks,100); - if (n_blocks<=2){free_int (list, -1);return 0;} - else - { - n_seq=list[1][0]; - for ( a=1; a< n_blocks-1; a++) - { - if ( list[a][0]!=n_seq){free_int (list, -1);return 0;} - else - { - for ( b=1; b<=list[a][0]; b++) - if ( list[a][b]!=2){free_int (list, -1);return 0;} - } - } - } - return 1; - } - - return 0; - } - - -int format_is_swissprot (char *name) - { - FILE *fp; - - if ( !check_file_exists(name))return 0; - - - - - if ( (fp=find_token_in_file_nlines (name,NULL,"\nID ",10))!=NULL\ - &&(fp=find_token_in_file (name,NULL,"\nSQ "))!=NULL ) - { - - vfclose (fp);return 1; - } - else - { - return 0; - } - } - -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT STUFF */ -/* */ -/***************************************************************************************** */ -int output_format_aln ( char *format, Alignment *inA, Alignment *inEA,char *name) - { - Sequence_data_struc *D1=NULL; - Sequence_data_struc *D2=NULL; - Alignment *A=NULL; - Alignment *EA=NULL; - - - A =copy_aln (inA, NULL); - A->CL=inA->CL; - EA=copy_aln (inEA,NULL); - A =expand_aln(A); - EA=expand_number_aln(inA,EA); - - - if (A && A->expanded_order )A=reorder_aln ( A, A->expanded_order,A->nseq); - if (EA && EA->expanded_order)EA=reorder_aln ( EA, EA->expanded_order,EA->nseq); - - - D1=vcalloc ( 1, sizeof (Sequence_data_struc)); - D1->A=A; - if (EA) - { - D2=vcalloc ( 1, sizeof (Sequence_data_struc)); - D2->A=EA; - } - - main_output ( D1, NULL,D2, format, name); - - vfree(D1); - vfree(D2); - free_aln (A); - free_aln (EA); - return 1; - } -int main_output (Sequence_data_struc *D1, Sequence_data_struc *D2, Sequence_data_struc *DST, char *out_format, char *out_file) - - { - FILE *fp; - int value; - Alignment *BUF_A; - int expanded=0; - - if ( !out_format[0])return 0; - if ( D1 && D1->rm_gap)ungap_aln ((D1->A)); - - if ( (strstr (out_format, "expanded_"))) - { - if (!D1) return 1; - out_format+=strlen ("expanded_"); - BUF_A=copy_aln (D1->A, NULL); - (D1->A)=thread_profile_files2aln ((D1->A), NULL, NULL); - expanded=1; - } - - if ( strm (out_format, ""))return 0; - else if ( ( strm (out_format, "aln2lib"))) - { - int a, b, c; - int r1,r2,s1, s2,s; - Constraint_list *CL; - FILE *fp; - Alignment *IN; - int **pos; - - if (!D1)return 1; - IN=D1->A; - CL=(D1->A)->CL; - pos=aln2pos_simple(IN, IN->nseq); - fp=vfopen (out_file, "w"); - fp=save_list_header (fp,CL); - - - for ( b=0; b< IN->nseq-1; b++) - { - for ( c=b+1; c< IN->nseq; c++) - { - s1=IN->order[b][0]; - s2=IN->order[c][0]; - fprintf ( fp, "#%d %d\n", s1+1, s2+1); - for ( a=0; a< IN->len_aln; a++) - { - r1=pos[b][a]; - r2=pos[c][a]; - - if ( s1==s2 && !CL->do_self)continue; - - if ( s1< s2)s=(CL->evaluate_residue_pair)( CL, s1, r1, s2, r2); - else s=(CL->evaluate_residue_pair)( CL, s2, r2, s1, r1); - - s=(s!=UNDEFINED)?s:0; - if ( r1>0 && r2>0) - { - fprintf (fp, "\t%5d %5d %5d \n", r1, r2, s); - } - } - } - } - vfclose (save_list_footer (fp, CL)); - } - else if ( strncmp (out_format, "score",5)==0 || strm (out_format, "html")) - { - Alignment *BUF; - - if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format or use +evaluate][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - if ( !strm ("html", out_format))while ( out_format[0]!='_' && out_format[0]!='\0' )out_format++; - - D1->S=aln2seq(D1->A); - BUF=copy_aln (DST->A, NULL); - DST->A=aln2number (DST->A); - - if ( strstr ( out_format, "html" ))output_reliability_html ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_ps" ))output_reliability_ps ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_pdf" ))output_reliability_pdf ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_ascii" ))output_reliability_ascii ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_seq" ))output_seq_reliability_ascii ( D1->A, DST->A, out_file); - else - { - DST->A=BUF; - main_output (DST, NULL, NULL, out_format+1, out_file); - } - } - else if (strm (out_format, "sec_html") || strm (out_format, "_E_html")) - { - Alignment *ST, *A; - Sequence *S; - - int a, b,c,i, ns=0; - char *buf; - if (!D1)return 1; - A=D1->A; - - - S=A->S; - ST=copy_aln (A, NULL); - for (a=0; anseq; a++) - { - i=name_is_in_list (ST->name[a],S->name, S->nseq, 100); - if ( i!=-1) - { - buf=seq2E_template_string(S, i); - if ( buf==NULL)continue; - else ns++; - for (c=0,b=0; blen_aln; b++) - { - int r1, s; - r1=ST->seq_al[a][b]; - if ( r1!='-') - { - s=tolower (buf[c]); - if (s=='e')r1='0'; - else if (s=='h')r1='9'; - else if (s=='c')r1='5'; - c++; - } - ST->seq_al[a][b]=r1; - } - } - } - - if (!ns) - { - printf_exit ( EXIT_FAILURE, stderr, "\nYou must provide a TM template file [FATAL:%s]", PROGRAM); - } - output_color_html ( A, ST, out_file); - } - else if (strm (out_format, "tm_html") || strm (out_format, "_T_html")) - { - Alignment *ST, *A; - Sequence *S; - - int a, b,c,i, ns=0; - char *buf; - if (!D1)return 1; - A=D1->A; - - - S=A->S; - ST=copy_aln (A, NULL); - for (a=0; anseq; a++) - { - i=name_is_in_list (ST->name[a],S->name, S->nseq, 100); - if ( i!=-1) - { - buf=seq2T_template_string(S, i); - if ( buf==NULL)continue; - else ns++; - for (c=0,b=0; blen_aln; b++) - { - int r1, s; - r1=ST->seq_al[a][b]; - if ( r1!='-') - { - s=tolower (buf[c]); - if (s=='o')r1='0'; - else if (s=='h')r1='9'; - else if (s=='i')r1='5'; - c++; - } - ST->seq_al[a][b]=r1; - } - } - } - - if (!ns) - { - printf_exit ( EXIT_FAILURE, stderr, "\nYou must provide a TM template file [FATAL:%s]", PROGRAM); - } - output_color_html ( A, ST, out_file); - } - - else if (strm (out_format, "color_exoset")) - { - Alignment *ST, *EX, *A; - Constraint_list *CL; - int a, b, n; - char *buf; - - if ( !DST->A) - { - printf_exit ( EXIT_FAILURE, stderr, "\nYou must provide an obj file via the -struc_in flag [FATAL:%s]", PROGRAM); - } - EX=DST->A; - A=D1->A; - - CL=declare_constraint_list ( DST->S,NULL, NULL, 0,NULL, read_matrice("pam250mt")); - - ST=copy_aln (A, NULL); - buf=vcalloc ( EX->len_aln+1, sizeof (int)); - - for ( a=0; a< A->nseq; a++) - { - int i; - - i=name_is_in_list (A->name[a],EX->name, EX->nseq, -1); - if ( i==-1)continue; - - sprintf ( buf, "%s", EX->seq_al[i]); - ungap (buf); - - for (n=0,b=0; blen_aln; b++) - { - if (!is_gap(A->seq_al[a][b])) - { - if ( buf[n]=='o') - ST->seq_al[a][b]='0'; - else if ( buf[n]=='j') - ST->seq_al[a][b]='1'; - else if ( buf[n]=='b') - ST->seq_al[a][b]='2'; - n++; - } - } - } - vfree (buf); - - output_color_html ( A, ST, out_file); - return EXIT_SUCCESS; - } - - else if (strm (out_format, "color_protogene")) - { - int n, a, b; - DST->A=copy_aln (D1->A, NULL); - for (n=1,a=0; a< (D1->A)->len_aln; a++, n++) - { - for ( b=0; b<(D1->A)->nseq; b++) - { - if (is_gap((D1->A)->seq_al[b][a])); - else if ( n<=3)(DST->A)->seq_al[b][a]=2; - else if ( n>3)(DST->A)->seq_al[b][a]=9; - } - - if ( n==6)n=0; - } - output_color_html ( D1->A, DST->A, out_file); - return EXIT_SUCCESS; - - } - else if ( strncmp (out_format, "color",5)==0) - { - Alignment *BUF; - - if (!D1)return 1; - - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format or use +evaluate][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - while ( out_format[0]!='_' && out_format[0]!='\0' )out_format++; - - BUF=copy_aln (DST->A, NULL); - - - - - if ( strm ( out_format, "_html" ))output_color_html ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_ps" ))output_color_ps ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_pdf" ))output_color_pdf ( D1->A, DST->A, out_file); - else if( strm ( out_format, "_ascii" ))output_color_ascii ( D1->A, DST->A, out_file); - else - { - DST->A=BUF; - return main_output (DST, NULL, NULL, out_format+1, out_file); - } - return EXIT_SUCCESS; - } - else if ( strm4 ( out_format, "tc_aln","t_coffee_aln", "t_coffee", "tcoffee")) - { - if (!D1)return 1; - vfclose (output_aln ( D1->A, vfopen (out_file, "w"))); - } - else if ( strm ( out_format, "analyse_pdb")) - { - if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - analyse_pdb ( D1->A,DST->A, "stdout"); - (DST->A)=aln2number (DST->A); - output_reliability_ps ( D1->A, DST->A, out_file); - } - else if ( strm4 ( out_format, "lower0", "lower1", "lower2", "lower3") || strm4(out_format, "lower4", "lower5", "lower6", "lower7") || strm4 (out_format,"lower8", "lower9", "align_pdb", "malign_pdb") ) - { - if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - - - - (DST->A)=aln2number (DST->A); - if ( strm (out_format, "align_pdb"))value=0; - else if ( strm (out_format, "malign_pdb"))value=5; - else value=atoi(out_format+5); - - D1->A=filter_aln_upper_lower (D1->A, DST->A,0, value); - output_clustal_aln ( out_file, D1->A); - } - else if ( strnm (out_format, "repeat", 6)) - { - int size; - int a, b, c; - Alignment *CONC; - - if ( !D1)return 1; - size=atoi (out_format+6); - print_aln (D1->A); - CONC=declare_aln2 ( (D1->A)->nseq, ((D1->A)->len_aln+1)*size+1); - - for ( a=0; a< (D1->A)->nseq; a++)(D1->A)->seq_al[a][(D1->A)->len_aln]='\0'; - for ( c=0,a=0; a< (D1->A)->nseq;c++) - { - - sprintf ( CONC->name[c], "%s", (D1->A)->name[a]); - for ( b=0; bseq_al[c], (D1->A)->seq_al[a]); - strcat (CONC->seq_al[c], "O"); - } - } - CONC->nseq=c;CONC->len_aln=strlen (CONC->seq_al[0]); - output_clustal_aln ( out_file, CONC); - free_aln (CONC); - } - - else if ( strnm (out_format, "upper", 5)) - { - - if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - - - (DST->A)=aln2number (DST->A); - - value=atoi(out_format+5); - - D1->A=filter_aln_lower_upper (D1->A, DST->A,0, value); - output_clustal_aln ( out_file, D1->A); - } - - else if ( strm4 ( out_format, "filter0", "filter1", "filter2", "filter3")) - { - if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - - (DST->A)=aln2number (DST->A); - - D1->A=filter_aln (D1->A, DST->A, atoi(out_format+6)); - output_clustal_aln ( out_file, D1->A); - } - - else if ( strm3 ( out_format, "phylip_aln", "phylip", "phy")) - { - if (!D1)return 1; - output_phylip_aln ( out_file, D1->A); - } - else if ( strm ( out_format, "mocca_aln")) - { - if (!D1)return 1; - output_mocca_aln ( out_file, D1->A, DST->A); - } - else if ( strm ( out_format, "saga_pw_sd_weights") ) - { - if (!D1)return 1; - output_pw_weights4saga ((D1->W),(D1->W)->PW_SD, out_file); - } - else if ( strm ( out_format, "saga_aln")) - { - if (!D1)return 1; - output_saga_aln (out_file, D1->A); - } - else if (strm2 ( out_format, "aln","clustal_tc")|| strm (out_format, "msa")) - { - - if (!D1)return 1; - output_clustal_aln (out_file, D1->A); - } - else if (strm5 ( out_format, "strict_clustal","clustal_aln", "clustalw","clustal", "clustalw_aln") || strm (out_format,"number_aln")) - { - if (!D1)return 1; - output_strict_clustal_aln (out_file, D1->A); - } - else if ( strm ( out_format, "conc_aln")) - { - if (!D1)return 1; - output_conc_aln (out_file, D1->A); - } - else if ( strm2 ( out_format, "lalign_aln","lalign")) - { - if (!D1)return 1; - output_lalign (out_file, D1->A); - } - else if ( strm2 ( out_format, "glalign_aln","glalign")) - { - if (!D1)return 1; - output_glalign (out_file, D1->A, DST->A); - } - - else if ( strm2 ( out_format, "fasta_aln","fasta" ) || strm (out_format, "blast_aln")) - { - if (!D1)return 1; - output_fasta_aln( out_file, D1->A); - } - else if ( strm (out_format, "overaln")) - { - Alignment *EB=NULL; - char *s, mode[100]; - OveralnP *F; - int eb=0; - if (!D1) return 1; - F=vcalloc (1, sizeof (OveralnP)); - - string_array_upper ((D1->A)->seq_al, (D1->A)->nseq); - if ( D2 && D2->A) - { - D1->A=mark_exon_boundaries (D1->A, D2->A); - eb=1; - } - else if ( (s=get_string_variable ("exon_boundaries"))) - { - Sequence *S; - Alignment *EB; - EB=seq2aln(S=main_read_seq(s),NULL, 0); - D1->A=mark_exon_boundaries (D1->A, EB); - free_sequence (S, S->nseq); free_aln (EB); - eb=1; - } - - sprintf (F->mode, "%s", ((s=get_string_variable ("overaln_mode")))?s:"lower"); - if (!strm (F->mode, "lower") && !strm (F->mode, "unalign"))printf_exit (EXIT_FAILURE,stderr,"\nERROR: unknown overal_mode in overal output [%s] [FATAL:%s]", mode, PROGRAM); - - if (int_variable_isset ("overaln_threshold"))F->t=get_int_variable ("overaln_threshold"); - if (int_variable_isset ("overaln_target"))F->f=get_int_variable ("overaln_target"); - if (int_variable_isset ("overaln_P1"))F->p1=get_int_variable ("overaln_P1"); - if (int_variable_isset ("overaln_P2"))F->p2=get_int_variable ("overaln_P2"); - if (int_variable_isset ("overaln_P3"))F->p3=get_int_variable ("overaln_P3"); - if (int_variable_isset ("overaln_P4"))F->p4=get_int_variable ("overaln_P4"); - - if (eb)sprintf (F->model, "fsa2"); - else sprintf (F->model, "fsa1"); - D1->A=aln2clean_pw_aln (D1->A, F); - - //if (eb)D1->A=aln2clean_pw_aln (D1->A, mode,t, f,p1,p2,p3, "fsa2"); - //else D1->A=aln2clean_pw_aln (D1->A, mode,t, f,p1,p2,p3, "fsa1"); - - D1->S=aln2seq(D1->A); - output_clustal_aln (out_file, D1->A); - } - else if ( strm ( out_format, "est_prf" )) - { - if (!D1)return 1; - output_est_prf( out_file, D1->A); - } - else if ( strm ( out_format, "clean_est_fasta_seq" )) - { - if (!D1)return 1; - D1->A=clean_est(D1->A); - output_fasta_seq(out_file, D1->A); - - } - - else if ( strm3 ( out_format, "msf_aln", "gcg", "msf")) - { - if (!D1)return 1; - output_msf_aln( out_file, D1->A); - } - else if ( strm ( out_format, "rnalign")) - { - if (!D1)return 1; - output_rnalign (out_file, D1->A, DST->S); - } - else if ( strm ( out_format, "fasta_seq") ||strm ( out_format, "list")||strm ( out_format, "file_list")) - { - int z; - if (!D1)return 1; - output_fasta_seq (out_file,D1->A); - } - else if (strm (out_format, "fasta_tree") ) - { - if (!D1)return 1; - output_fasta_tree (out_file,D1->A); - } - - else if ( strm ( out_format, "gotoh_seq")) - { - if (!D1)return 1; - output_gotoh_seq (out_file,D1->A); - } - else if ( strm (out_format, "fasta_seq1")) - { - if (!D1)return 1; - output_fasta_seq1 (out_file, D1->A); - } - else if ( strm2 (out_format, "pir_aln", "pir")) - { - if (!D1)return 1; - output_pir_aln (out_file, D1->A); - } - else if ( strm (out_format, "pir_seq")) - { - if (!D1)return 1; - output_pir_seq (out_file, D1->A); - } - else if ( strm (out_format, "gor_seq")) - { - if (!D1)return 1; - output_gor_seq (out_file, D1->A); - } - else if ( strm (out_format, "pir_seq1")) - { - if (!D1)return 1; - output_pir_seq1 (out_file, D1->A); - } - else if ( strm (out_format, "pw_lib_saga_aln")) - { - if (!D1)return 1; - output_pw_lib_saga_aln (out_file, D1->A); - } - else if ( strm (out_format, "lib")) - { - if (!D1)return 1; - output_lib (out_file, D1->A); - } - else if ( strm (out_format, "pdb_constraint_list")) - { - if (!D1)return 1; - output_constraints (out_file, "pdb",D1->A); - } - else if ( strm2 (out_format, "constraint_list","tc_lib")) - { - - if (!D1)return 1; - else if (!D1->CL)output_constraints (out_file,"sim", D1->A); - else if (D1->CL) vfclose ( save_constraint_list ( D1->CL, 0, (D1->CL)->ne, out_file, NULL, "ascii",(D1->CL)->S)); - } - else if ( strm2 (out_format, "extended_lib","extended_cosmetic")) - { - if (!D1)return 1; - output_constraints (out_file,out_format, D1->A); - } - else if ( strncmp (out_format, "extended_pair", 13)==0) - { - if (!D1)return 1; - output_constraints (out_file,out_format, D1->A); - } - else if ( strm (out_format, "cache_id")) - { - if (!D1)return 1; - cache_id (D1->A); - output_saga_aln (out_file, D1->A); - } - else if ( strm (out_format, "compress_aln")) - { - if (!D1)return 1; - compress_aln (D1->A); - output_saga_aln (out_file, D1->A); - } - else if (strm (out_format, "n_seq") ||strm (out_format, "nseq") ) - { - if (!D1)return 1; - fp=vfopen ( out_file, "w"); - fprintf ( fp, "%d\n", (D1->A)->nseq); - vfclose (fp); - } - - else if ( strm ( out_format, "thread_dna_on_prot_aln")) - { - if (!D1)return 1; - D1->A=thread_dnaseq_on_prot_aln (D1->S, D2->A); - output_saga_aln ( out_file, D1->A); - } - else if ( strm ( out_format, "tdna_fasta_seq1")) - {if (!D1)return 1; - D1->A=translate_dna_aln (D1->A,0); - output_fasta_seq1 (out_file, D1->A); - } - else if ( strm ( out_format, "tdna_aln")) - {if (!D1)return 1; - D1->A=translate_dna_aln (D1->A,0); - output_saga_aln ( out_file, D1->A); - } - else if ( strm ( out_format, "cdna_fasta_seq1")) - {if (!D1)return 1; - D1->A= gene2prot(D1->A); - output_fasta_seq1 ( out_file, D1->A); - } - else if ( strm ( out_format, "mutate_cdna_aln")) - {if (!D1)return 1; - D1->A= mutate_cdna_aln ( D1->A); - output_clustal_aln ( out_file, D1->A); - } - else if ( strm ( out_format, "tdna_sp_aln")) - { if (!D1)return 1; - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - (DST->A)=aln2number (DST->A); - D1->A=translate_splice_dna_aln (D1->A, DST->A); - output_saga_aln ( out_file, D1->A); - } - else if (out_format && out_format[0] && (strcmp ( out_format,"rna_graph_fasta")==0)) - { - if (!D1)return 1; - sprintf ( (D1->A)->seq_al[0], "%s",(DST->S)->seq[0]); - (D1->A)->nseq=0; - output_fasta_seq (out_file, DST->A); - } - else if (strm ( out_format, "freq_mat")) - { - if (!D1)return 1; - output_freq_mat (out_file, D1->A); - } - else if (strm ( out_format, "maln_pval")) - {if (!D1)return 1; - output_maln_pval ( out_file, D1->A); - } - else if ( strm ( out_format, "model_aln")) - { - if (!D1)return 1; - output_model_aln ( out_file, D1->A); - } - else if (strncmp (out_format, "mult",4)==0) - { - if (!D1)return 1; - output_mult_fasta_seq ( out_file, D1->A, atoi(out_format+4)); - } - else if (strm (out_format, "conservation")) - { - output_conservation_statistics (out_file, D1->A); - } - else if (strm (out_format, "len")) - { - if (!D1)return 1; - output_statistics (out_file, D1->A, "nrl"); - } - else if ( strm (out_format, "name")) - { - if (!D1)return 1; - if ( D1->A)output_statistics (out_file, D1->A, "n"); - if ( D1->T) - { - Sequence *TS; - TS=tree2seq(D1->T, NULL);print_array_char (vfopen(out_file, "w"), TS->name, TS->nseq, "\n"); - } - } - else if ( strm (out_format, "code_name")) - { - char **nl=NULL; - int num, n=0; - Sequence *TS; - FILE *lfp; - if ( D1->A){n=(D1->A)->nseq, nl=(D1->A)->name;} - if ( D1->T){TS=tree2seq(D1->T, NULL);nl=TS->name;n=TS->nseq;} - - lfp=vfopen (out_file, "w"); - for ( num=0; numA); - } - else if ( strstr ( out_format, "pavie_age_channel")) - { - output_n_pavie_age_channel ( D1->S,out_file, atoi((out_format+strlen ("pavie_age_channel")))); - return EXIT_SUCCESS; - } - else if ( strstr ( out_format, "age_matrix")) - { - output_age_matrix (out_file, atoi((out_format+10))); - } - else if ( strm ( out_format, "transitions")) - { - output_transitions (out_file, D1->A); - } - - else if ( strncmp (out_format, "statistics",10)==0) - { - if (!D1)return 1; - - output_statistics (out_file, D1->A,out_format+10); - } - - - - - else if ( strm4 (out_format, "newick_tree","newick","binary","nh")) - { - if (!D1)return 1; - - /*D1->T=unroot_tree(D1->T);*/ - vfclose (print_tree ((D1->T), out_format, vfopen ( out_file, "w"))); - } - else if ( strncmp (out_format, "sarsim", 6)==0) - { - if (!D1)return 1; - compare_sar_sequence (D1->S, (D2 &&D2->S)?D2->S:D1->S, atoi(out_format+6)); - return EXIT_SUCCESS; - } - else if ( strncmp (out_format, "sim",3)==0) - { - if (!D1)return 1; - output_similarities (out_file, D1->A,out_format); - } - - else if ( strncmp (out_format, "cov",3)==0) - { - if (!D1)return 1; - output_similarities (out_file, D1->A,out_format); - } - else if ( strm (out_format, "stockholm_aln")) - { - output_stockholm_aln (out_file,D1->A, (D2)?D2->A:NULL); - } - else if ( strm (out_format, "pair_sim")) - { - if ( !D2) - { - fprintf ( stderr, "\n-output=pair_sim: provide aln1 via -in and aln2 via -in2 [FATAL:%s]\n", PROGRAM); - myexit (EXIT_FAILURE); - } - output_similarities_pw (out_file, D1->A,D2->A,out_format); - } - else if ( strm (out_format, "matrix") || strm (out_format, "blast_matrix")) - { - output_blast_mat (D1->M, out_file); - } - else - { - - fprintf ( stderr, "\n%s is an UNKNOWN OUTPUT FORMAT [FATAL:%s]\n",out_format, PROGRAM); - myexit (EXIT_FAILURE); - - } - - //Remove the expansion - if ( expanded) - { - free_aln (D1->A); - D1->A=BUF_A; - } - return 0; - } -int is_in_format_list ( char *name) - { - if ( strcmp ( name, "saga_aln")==0)return 1; - if ( strcmp ( name, "number_aln")==0)return 1; - if ( strcmp ( name, "clustal_aln")==0)return 1; - if ( strcmp ( name, "fasta_aln")==0)return 1; - if ( strcmp ( name, "number_fasta")==0)return 1; - if ( strcmp ( name, "fasta_seq")==0)return 1; - if ( strcmp ( name, "pdb")==0)return 1; - if ( strcmp ( name, "msf_aln")==0)return 1; - if ( strcmp ( name, "dali_aln")==0)return 1; - if ( strcmp ( name, "dali_seq")==0)return 1; - if ( strcmp ( name, "barton_list_tc")==0)return 1; - if ( strcmp ( name, "est_prf")==0)return 1; - - if ( strcmp ( name, "gotoh_aln")==0)return 1; - if ( strcmp ( name, "amps_aln")==0)return 1; - if ( strcmp ( name, "pir_aln")==0)return 1; - if ( strcmp ( name, "pir_seq")==0)return 1; - if ( strcmp ( name, "est_fasta")==0)return 1; - if ( strcmp ( name, "amps_sd_scores")==0)return 1; - if ( strcmp ( name, "pima_aln")==0)return 1; - if ( strcmp ( name, "dialign_aln")==0)return 1; - if ( strcmp ( name, "gor_seq")==0)return 1; - if ( strcmp ( name, "gor_struc")==0)return 1; - if ( strcmp ( name, "stockholm_aln")==0)return 1; - - return 0; - } -int is_struc_in_format_list ( char *name) - { - if ( strcmp ( name, "rna_number")==0)return 1; - if ( strcmp ( name, "fasta_seq")==0)return 1; - return 0; - } -char *format_name2aln_format_name (char *name) - { - if ( strm (name, "gcg"))sprintf (name, "msf"); - else if ( strm (name, "fasta"))sprintf (name, "fasta_aln"); - return name; - } -int is_out_format_list ( char *name) - { - return main_output (NULL, NULL, NULL, name, NULL); - } - -int is_struc_out_format_list ( char *name) - { - return main_output (NULL, NULL, NULL, name, NULL); - } - -/**************************************************************************************************/ -/*************************************REFORMAT UTIL*************************************************/ -/**************************************************************************************************/ - -/*************************************REFORMAT IN**************************************************/ -/**************************************************************************************************/ -/*******************************************************************************************/ -/* */ -/* */ -/* READ COG FILE */ -/* */ -/***************************************************************************************** */ - -/*******************************************************************************************/ -/* */ -/* */ -/* INPUT WEIGHTS */ -/* */ -/***************************************************************************************** */ - -Weights* get_amps_sd_scores ( char *fname) - { - FILE *fp; - char *buf; - char *buf2; - int nseq; - Weights *W; - int a, b,e; - int c; - float array[20]; - - buf=vcalloc ( 1001, sizeof (char)); - buf2=vcalloc ( 1001, sizeof (char)); - - fp=vfopen ( fname, "r"); - set_fp_id ( fp, "Index"); - buf=fgets ( buf, 1000, fp); - fscanf ( fp, "%s", buf2); - - nseq=0; - while ( isalnum(buf2[0]) && !isalpha(buf2[0])) - { - nseq++; - buf=fgets ( buf, 1000, fp); - fscanf ( fp, "%s", buf2); - } - vfclose ( fp); - - W=declare_weights (nseq); - - fp=vfopen ( fname, "r"); - set_fp_id ( fp, "Index"); - buf=fgets ( buf, 1000, fp); - fscanf ( fp, "%s", buf2); - - a=0; - while ( isalnum(buf2[0]) && !isalpha(buf2[0])) - { - fp=set_fp_after_char (fp, '>'); - fscanf ( fp, "%s",W->seq_name[a]); - buf=fgets ( buf, 1000, fp); - fscanf ( fp, "%s", buf2); - a++; - } - buf=fgets ( buf, 1000, fp); - c=1; - while ( c!=0) - { - for ( e=0; e< 16; e++) - { - c=fscanf ( fp, "%f", &array[e]); - } - fscanf ( fp, "\n"); - if ( c!=0) - { - - a=(int)array[0]-1; - b=(int)array[1]-1; - W->PW_ID[b][a]=W->PW_ID[a][b]=array[9]; - W->PW_SD[b][a]=W->PW_SD[a][b]=array[14]; - } - - } - vfclose ( fp); - sprintf ( W->comments, "SD WEIGHTS GENERATED WITH THE PROGRAM AMPS IN PAIRWISE MODE"); - vfree ( buf); - return W; - } - -Weights *read_seq_weight (char **name, int nseq, char* seq_weight) - { - int a, p; - Weights *W; - float w; - - FILE *fp; - char line[LONG_STRING]; - char sname[MAXNAMES]; - - - /*Read sequence weights: - * comment - name1 weight1 - ..... - - - NOTE: - weights must be between 0 and 1; - - sequences not in S do not get any weight - sequences in S but not in file get a weight of 1 - */ - if ( !is_single_seq_weight_file (seq_weight)) - { - fprintf ( stderr, "\nERROR: File %s is not in Format SINGLE_SEQ_WEIGHT_FORMAT_01 [FATA:%s]", seq_weight,PROGRAM); - myexit (EXIT_FAILURE); - return NULL; - } - else - { - W=declare_weights(nseq); - for ( a=0; a< nseq; a++) - { - sprintf ( W->seq_name[a], "%s", name[a]); - W->SEQ_W[a]=1; - } - sprintf ( W->mode, "%s", seq_weight); - fp=vfopen (seq_weight, "r"); - - - while ( fgets( line,LONG_STRING-1, fp)) - { - if ( line[0]=='*' ||line[0]=='#' || isblanc(line)); - else - { - if (sscanf(line, "%s %f", sname, &w)!=2)continue; - if ( (p=name_is_in_list ( sname, W->seq_name, nseq, MAXNAMES-1))!=-1) - { - W->SEQ_W[p]=w; - } - } - } - vfclose (fp); - return W; - } - } - - -/*******************************************************************************************/ -/* */ -/* */ -/* INPUT MISC */ -/* */ -/***************************************************************************************** */ - -char *** read_rename_file ( char *fname, int code) -{ - int n; - FILE *fp; - char ***convert=NULL; - - convert=declare_arrayN(3, sizeof (char),count_n_line_in_file(fname) +1,2,MAXNAMES+1); - fp=vfopen (fname, "r"); - n=0; - if ( code==CODE) while ( fscanf ( fp, "%s %s\n", convert[n][0], convert[n][1])==2)n++; - else if (code==DECODE)while ( fscanf ( fp, "%s %s\n", convert[n][1], convert[n][0])==2)n++; - vfclose (fp); - return convert; -} - -void get_barton_list_tc_seq ( char *in_file) - { - FILE *fp, *fp_make, *fp_length, *fp_long; - FILE *fp_small[9]; - - static char *buf; - int len_buf=10000; - char name[100]; - - char pwd[100]; - int a,c,nseq; - int k=0; - int *length; - int longest=0; - - c=0; - length=vcalloc ( 1000, sizeof(int)); - if ( buf==NULL)buf=vcalloc ( len_buf, sizeof (char)); - fp=vfopen (in_file, "r"); - fp_long=vfopen ( "barton_seq_list_large", "w"); - fp_make=vfopen ( "make_dir", "w"); - fp_length=vfopen ( "barton_length", "w"); - for ( a=0; a< 9; a++) - { - sprintf ( name, "barton_nseq%d",a); - fp_small[a]=vfopen ( name, "w"); - } - get_pwd (pwd); - - - while ( c!=EOF) - {a=0; - while ( (c=fgetc(fp))!='#'); - while ( (c=fgetc(fp))=='#'); - ungetc ( c, fp); - while ( (c=fgetc(fp))!='#')buf[a++]=c; - buf[a]='\0'; - - sprintf ( name, "%s", buf); - - while ( (c=fgetc(fp))=='#'); - - if ( c!=EOF) - { - a=0; - while ( (c=fgetc(fp))!='#' && c!=EOF) - { - buf[a++]=c; - if (a==len_buf) - { - len_buf+=10000; - buf=vrealloc ( buf, len_buf*sizeof (char)); - } - } - buf[a]='\0'; - if (c!=EOF) - { - - nseq=process_barton_entry ( buf,name); - length[nseq]++; - longest=(longest') - { - a=get_string_line (a,2, buf, buf2); - while ((c=buf[a++])!='*') - if (isalnum (c)|| c=='.' || c=='-') - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - if ( buf[a]!='\0')a++; - } - - - LS=declare_sequence ( min_len_seq, max_len_seq, nseq); - LS->nseq=nseq; - - - for (a=0, current=0; current< nseq; current++) - { - a=get_string_line ( a, 1, buf, buf2); - sscanf ( buf2, ">P1;%s", LS->name[current]); - a=get_string_line ( a, 1, buf, buf2); - l=strlen ( buf2); - buf2[l-1]='\0'; - sprintf ( LS->seq_comment[current], buf2); - - p=0; - while ( (c=buf[a++])!='*') - { - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if ( isgraph(c)) - LS->seq[current][p++]=(c); - } - a++; - } - - LA=declare_Alignment(LS); - seq2aln ( LS, LA,rm_gap); - output_fasta_seq (fname,LA); - output_pir_check (com_name,LA->nseq, LA->seq_comment); - free_Alignment ( LA); - free_sequence ( LS, nseq); - - return nseq; - } - - - - -Structure *read_rna_struc_number (Alignment *A,char *fname) - { - FILE *fp; - int a; - char x,y; - float f; - Sequence *SA; - Structure *ST; - int first, last; - - SA=declare_sequence ( A->len_aln, A->len_aln, 1); - SA->len[0]=A->len[0]; - for ( a=0; a< SA->len[0]; a++) - SA->seq[0][a]='.'; - ST=declare_rna_structure_num (SA); - ST->S=SA; - - fp=vfopen ( fname, "r"); - fscanf ( fp, "%c\n%d\n",&x, &(ST)->tot_list); - for ( a=0; a<(ST)->tot_list; a++) - { - fscanf ( fp, "%d %d %d %c %c %f\n", &(ST)->list[a][0],&(ST)->list[a][1],&(ST)->list[a][2], &x, &y, &f); - (ST)->list[a][0]--; - (ST)->list[a][1]--; - (ST)->list[a][2]--; - if ( a==0) - { - (ST)->stem[0][0]=(ST)->list[a][0]; - (ST)->stem[0][1]=a; - } - else if ( (ST)->stem[(ST)->tot_stem][0]==(ST)->list[a][0]); - else if ( (ST)->stem[(ST)->tot_stem][0]!=(ST)->list[a][0]) - { - (ST)->stem[(ST)->tot_stem][2]=a-1; - (ST)->tot_stem++; - (ST)->stem[(ST)->tot_stem][0]=(ST)->list[a][0]; - (ST)->stem[(ST)->tot_stem][1]=a; - } - - SA->seq[0][(ST)->list[a][1]]='-'; - SA->seq[0][(ST)->list[a][2]]='-'; - } - (ST)->stem[(ST)->tot_stem][2]=a-1; - (ST)->tot_stem++; - for ( a=0; a< (ST)->tot_stem; a++) - { - - first=(ST)->stem[a][1]; - last=(ST)->stem[a][2]; - SA->seq[0][(ST)->list[first][1]]='>'; - SA->seq[0][(ST)->list[first][2]]='<'; - SA->seq[0][(ST)->list[last][1]]='>'; - SA->seq[0][(ST)->list[last][2]]='<'; - } - - return ST; - } - -Structure * declare_rna_structure_num (Sequence *SA) - { - Structure *ST; - ST=vcalloc ( 1, sizeof ( Structure)); - ST->list=declare_int ( SA->len[0], 3); - ST->stem=declare_int ( SA->len[0], 3); - return ST; - } -char ** read_lib_list (char *name, int *n) -{ - - char **lines; - char **list; - int a, b, l; - - lines=file2lines (name); - l=atoi (lines[0]); - - list=vcalloc (l, sizeof (char*)); - for ( n[0]=0,a=1; a .... - Groups must NOT be overlaping - list[group_index][0]="number of sequences" - list[group_index][1]="group name" - list[group_index][2...N]="sequence" - */ - - FILE *fp; - char *buf; - char ***list; - int a, c, l; - - - - l=measure_longest_line_in_file (file)+1; - buf=vcalloc (l, sizeof (char)); - list=vcalloc ( count_n_line_in_file (file )+1, sizeof (char**)); - - fp=vfopen (file, "r"); - - a=0; - while ((c=fgetc(fp))!=EOF) - { - buf=fgets (buf,l-1, fp); - if ( c=='>')list[a++]=string2list (buf); - } - vfclose (fp); - vfree (buf); - return list; -} -static Sequence* get_pdb_sequence_from_field (char *fname, char *field); -Sequence* get_pdb_sequence (char *fname) -{ - Sequence *S; - - - if ( (S=get_pdb_sequence_from_field(fname, "SEQRES"))!=NULL); - else if ( (S=get_pdb_sequence_from_field(fname, "ATOM"))!=NULL) - { - add_warning (stderr,"Warning: Read Sequence from ATOM field in %s [%s:WARNING]", fname, PROGRAM); - } - else - { - add_warning ( stderr, "\nWARNING: failed to extract sequence from %s [%s:WARNING]\n", fname, PROGRAM); - S=NULL; - } - return S; -} -static Sequence* get_pdb_sequence_from_field (char *fname, char *field) - { - char *tp_name; - char *command; - char *pdbid; - Sequence *S; - - - command=vcalloc ( LONG_STRING, sizeof (char)); - tp_name=vtmpnam (NULL); - - sprintf ( command, "extract_from_pdb -seq_field %s -chain FIRST -infile \'%s\' -mode fasta > %s", field, check_file_exists(fname), tp_name); - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:get_pdb_seq] %s\n", command); - my_system ( command); - - - S=get_fasta_sequence ( tp_name, NULL); - if (S==NULL)return NULL; - - if ( (pdbid=get_pdb_id (fname))){sprintf ( S->name[0], "%s",pdbid);vfree (pdbid);} - S->nseq=1; - - sprintf ( S->file[0], "%s", fname); - S->max_len=S->min_len=S->len[0]; - if ( S->len[0]==0) - { - free_sequence (S, -1); - S=NULL; - } - - vremove ( tp_name); - vfree ( command); - - return S; - } - -char * get_pdb_file ( char *fname) - { - char *file; - int a, c; - FILE *fp; - - - a=0; - file=vcalloc ( sizeof (char),count_n_char_in_file ( fname)+1); - fp=vfopen ( fname, "r"); - while ( (c=fgetc(fp))!=EOF)file[a++]=c; - file[a]='\0'; - return file; - } - -Sequence* get_struc_gor ( char *fname) - { - int nseq, min_len, max_len; - int a, c; - int len; - char name[STRING]; - - - FILE *fp; - Sequence *S; - - min_len=max_len=-1; - fp=vfopen ( fname, "r"); - nseq=0; - while ( (c=fgetc(fp))!=EOF) - { - if ( c!='!'); - else - { - nseq++; - fscanf ( fp, "%s %d", name, &len); - if (min_len==-1)min_len=max_len=len; - else - { - min_len=(len>min_len)?min_len:len; - max_len=(len>max_len)?len:max_len; - } - } - - } - vfclose (fp); - - S=declare_sequence ( min_len, max_len+1,nseq); - S->nseq=0; - - fp=vfopen (fname,"r"); - while ( (c=fgetc(fp))!=EOF) - { - if ( c!='!'); - else - { - fscanf ( fp, "%s %d\n",S->name[S->nseq], &(S->len[S->nseq])); - - while ( (c=fgetc(fp))!='\n'); - - for ( a=0; alen[S->nseq]; a++) - fscanf ( fp, " %*c %c %*f %*f %*f\n",&(S->seq[S->nseq][a])); - - S->seq[S->nseq][a]='\0'; - while ( (c=fgetc(fp))!='!' && c!=EOF); - ungetc (c, fp); - S->nseq++; - } - - } - vfclose (fp); - return S; - } - -Sequence* get_sequence_dali (char *fname) - { - Sequence *LS; - FILE *fp; - int c; - - char name[100]; - int clen=0; - int current=0; - int p=0; - int max_len_seq=0; - int min_len_seq=999999; - int nseq=0; - - if ((fp=vfopen (fname,"r"))==NULL) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - c=fgetc(fp); - while (c!=EOF) - { - if (isdigit(c)) - { - ungetc(c, fp); - fscanf (fp, "%s",name); - while (!isdigit(c=fgetc(fp)) && c!=EOF) - if (isalnum (c) || c=='.' || c=='-') - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - else - c=fgetc (fp); - } - vfclose (fp); - - LS=declare_sequence ( min_len_seq, max_len_seq+1,nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (isdigit(c)) - { - ungetc(c, fp); - fscanf_seq_name (fp, LS->name[current]); - p=0; - while (!isdigit(c=fgetc(fp)) && c!=EOF) - { - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if ( c=='.') - LS->seq[current][p++]='-'; - else if ( c=='-') - LS->seq[current][p++]='-'; - } - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - current++; - } - else - c=fgetc ( fp); - } - - vfclose (fp); - - - return LS; - } - -Sequence* get_dialign_sequence (char *fname) - { - Sequence *LS; - FILE *fp; - int c; - - char name[10000]; - int clen=0; - int current=0; - int p=0; - int max_len_seq=0; - int min_len_seq=999999; - int nseq=0, l=0; - char *buf; - - buf=vcalloc ( 1000, sizeof (char)); - if ((fp=vfopen (fname,"r"))==NULL) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - {fscanf (fp, "%s",name); - - buf=fgets ( buf, 1000, fp); - while ((c=fgetc(fp))!='>' && c!=EOF && c!=' ' && c!='\t') - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - else - c=fgetc (fp); - } - vfclose (fp); - - LS=declare_sequence ( min_len_seq, max_len_seq, nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - - fscanf_seq_name (fp, LS->name[current]); - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==',')LS->name[current][l-1]='\0'; - buf=fgets ( buf, 1000, fp); - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF && c!=EOF && c!=' ' && c!='\t') - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if ( isgraph(c)) - LS->seq[current][p++]=(c); - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - current++; - } - else - c=fgetc ( fp); - } - - vfclose (fp); - return LS; - } - -Sequence* get_pima_sequence (char *fname) - { - Sequence *LS; - - FILE *fp; - int c; - - char name[10000]; - int clen=0; - int current=0; - int p=0; - int max_len_seq=0; - int min_len_seq=999999; - int nseq=0, l=0, len=0; - char *buf, *buf2; - char prefix[1000]; - - sprintf ( prefix, "%s",fname); - - buf=strstr(prefix, "-"); - buf[0]='\0'; - len=strlen (prefix); - - - - buf=vcalloc ( 1000, sizeof (char)); - if ((fp=vfopen (fname,"r"))==NULL) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,name); - if ( strlen(name)>=len && strncmp ( name, prefix, len)==0) - { - c=fgetc(fp); - } - else - { - - buf=fgets ( buf, 1000, fp); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - } - else - c=fgetc (fp); - } - vfclose (fp); - - LS=declare_sequence ( min_len_seq, max_len_seq, nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,LS->name[current]); - if ( strlen(LS->name[current])>=len && strncmp ( LS->name[current], prefix, len)==0) - c=fgetc (fp); - else - { - buf2=strstr (LS->name[current], "."); - if ( buf2!=NULL) buf2[0]='\0'; - - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==',')LS->name[current][l-1]='\0'; - buf=fgets ( buf, 1000, fp); - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if ( isgraph(c)) - LS->seq[current][p++]=(c); - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - current++; - } - } - else - c=fgetc ( fp); - } - - vfclose (fp); - return LS; - } - -Sequence* perl_reformat2fasta (char *perl_command, char *fname) - { - char command[1000]; - char *file; - - file=vtmpnam (NULL); - - check_program_is_installed ( perl_command,"", perl_command,EMAIL,IS_FATAL); - sprintf ( command, "%s %s > %s", perl_command, fname, file); - my_system ( command); - return get_fasta_sequence (file, NULL); - } -Sequence* get_fasta_sequence_num (char *fname, char *comment_out) - { - Sequence *LS; - char *buffer; - FILE *fp; - int a; - - int c; - char *name; - int clen=0; - int current=0; - int p=0; - int max; - int max_len_seq=0; - int min_len_seq=0; - int nseq=0, l=0; - - - - - int *sub; - - buffer=vcalloc (1000, sizeof (char)); - name=vcalloc ( 100, sizeof (char)); - - nseq=count_n_char_x_in_file(fname, '>'); - min_len_seq=max=count_n_char_in_file(fname); - sub=vcalloc (max+1, sizeof (int)); - - fp=vfopen (fname,"r"); - - - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,name); - while ((c=fgetc(fp))!='\n' && c!=EOF); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - clen=0; - } - else - c=fgetc (fp); - - } - - vfclose (fp); - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - - fscanf_seq_name (fp,LS->name[current]); - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==';')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - a=0; - while ((c=fgetc(fp))!='\n' && c!=EOF && a<(COMMENT_SIZE-1))LS->seq_comment[current][a++]=c; - LS->seq_comment[current][a]='\0'; - - - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - { - if (isalnum (c)) - LS->seq[current][p++]=c; - else if (is_gap(c)) - LS->seq[current][p++]=c; - } - - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - - current++; - - } - else - c=fgetc ( fp); - } - - - vfclose (fp); - - - vfree (sub); - vfree (name); - vfree (buffer); - return LS; - } - -Sequence *get_tree_file_list ( char *fname) -{ - - char ***list; - char *tmp; - int a; - FILE *fp; - - tmp=vtmpnam (NULL); - list=file2list (fname, "\n"); - fp=vfopen (tmp, "w"); - a=0; - while (list[a] && !isspace(list[a][1][0])) - { - char *s; - s=file2string (list[a][1]); - fprintf ( fp, ">%s\n%s\n", list[a][1], (s)?s:""); - a++; - } - vfclose (fp); - free_arrayN((void ***)list, 3); - return get_fasta_tree (tmp, NULL); -} -Sequence *get_file_list ( char *fname) -{ - - char ***list; - char *tmp; - int a; - FILE *fp; - - tmp=vtmpnam (NULL); - list=file2list (fname, "\n"); - fp=vfopen (tmp, "w"); - a=0; - while (list[a] && !isspace(list[a][1][0])) - { - - fprintf ( fp, ">%s\n", list[a][1]); - a++; - } - vfclose (fp); - free_arrayN((void ***)list, 3); - return get_fasta_sequence (tmp, NULL); -} -Sequence*get_fasta_tree (char *fname, char *comment_out) -{ - Sequence *LS; - char *buffer; - FILE *fp; - int a; - - int c; - char *name; - int clen=0; - int current=0; - int p=0; - int max; - int max_len_seq=0; - int min_len_seq=0; - int nseq=0, l=0; - - - - - int *sub; - - buffer=vcalloc (1000, sizeof (char)); - name=vcalloc ( 100, sizeof (char)); - - nseq=count_n_char_x_in_file(fname, '>'); - min_len_seq=max=count_n_char_in_file(fname); - sub=vcalloc (max+1, sizeof (int)); - - fp=vfopen (fname,"r"); - - - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,name); - while ((c=fgetc(fp))!='\n' && c!=EOF); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isgraph(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - clen=0; - } - else - c=fgetc (fp); - - } - - vfclose (fp); - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - - fscanf_seq_name (fp,LS->name[current]); - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==';')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - a=0; - while ((c=fgetc(fp))!='\n' && c!=EOF && a<(COMMENT_SIZE-1))LS->seq_comment[current][a++]=c; - LS->seq_comment[current][a]='\0'; - - - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - { - LS->seq[current][p++]=c; - } - - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - - current++; - - } - - else - c=fgetc ( fp); - } - - - vfclose (fp); - - - vfree (sub); - vfree (name); - vfree (buffer); - - return LS; -} -Sequence* get_fasta_sequence_raw (char *fname, char *comment_out) - { - Sequence *LS; - char *buffer; - FILE *fp; - int a; - - int c; - char *name; - int clen=0; - int current=0; - int p=0; - int max; - int max_len_seq=0; - int min_len_seq=0; - int nseq=0, l=0; - - - - - int *sub; - - buffer=vcalloc (1000, sizeof (char)); - name=vcalloc ( 100, sizeof (char)); - - nseq=count_n_char_x_in_file(fname, '>'); - min_len_seq=max=count_n_char_in_file(fname); - sub=vcalloc (max+1, sizeof (int)); - - fp=vfopen (fname,"r"); - - - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,name); - while ((c=fgetc(fp))!='\n' && c!=EOF); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isgraph(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - clen=0; - } - else - c=fgetc (fp); - - } - - vfclose (fp); - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - - fscanf_seq_name (fp,LS->name[current]); - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==';')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - a=0; - while ((c=fgetc(fp))!='\n' && c!=EOF && a<(COMMENT_SIZE-1))LS->seq_comment[current][a++]=c; - LS->seq_comment[current][a]='\0'; - - - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - { - //if (c<'A')c+='z'; - if (c!='\n')LS->seq[current][p++]=c; - } - - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - - current++; - - } - - else - c=fgetc ( fp); - } - - - vfclose (fp); - - - vfree (sub); - vfree (name); - vfree (buffer); - return LS; - } -Sequence* get_fasta_sequence (char *fname, char *comment_out) - { - Sequence *LS; - Sequence *pdb_S; - int a; - - char *pdb_name; - - char *buffer; - FILE *fp; - - int c; - char *name; - int clen=0; - int current=0; - int p=0; - int max; - int max_len_seq=0; - int min_len_seq=0; - int nseq=0, l=0; - char *sub; - int disk=0; - int coor=0; - char *test; - - - buffer=vcalloc (1000, sizeof (char)); - name=vcalloc ( 10000, sizeof (char)); - - nseq=count_n_char_x_in_file(fname, '>'); - if (disk==1 || get_int_variable ("use_disk") || getenv ("SEQ_ON_DISK_4_TCOFFEE")){disk=1;} - if ( nseq==0) - { - vfree (buffer); vfree (name); - return NULL; - } - - min_len_seq=max=count_n_char_in_file(fname); - sub=vcalloc (max+1, sizeof (char)); - - fp=vfopen (fname,"r"); - - nseq=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - nseq++; - fscanf_seq_name (fp,name); - while ((c=fgetc(fp))!='\n' && c!=EOF); - while ((c=fgetc(fp))!='>' && c!=EOF) - { - if (isalnum (c)|| is_gap(c)) - sub[clen++]=c; - } - - if (strm (sub, "PDB")) - { - pdb_name=get_pdb_struc(name,0, 0); - pdb_S=get_pdb_sequence (pdb_name); - if (pdb_S) - { - clen=strlen( pdb_S->seq[0]); - free_sequence ( pdb_S,1); - } - else - clen=0; - - } - - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - clen=0; - } - else - c=fgetc (fp); - - } - - vfclose (fp); - - - if ( disk==0) - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - else - { - LS=declare_sequence (0,0,nseq); - for (a=0; aseq[a]=NULL; - } - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - current=0; - c=fgetc(fp);coor++; - - while (c!=EOF) - { - if (c=='>') - { - coor+=fscanf_seq_name (fp, LS->name[current]); - - - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==';')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - a=0; - while ((c=fgetc(fp))!='\n' && c!=EOF && a<(COMMENT_SIZE-1)){LS->seq_comment[current][a++]=c;coor++;} - coor++; - - LS->seq_comment[current][a]='\0'; - - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - { - coor++; - - if (!isspace(c)) - { - if (p==0)LS->dc[current][0]=coor; - - if (disk==0)LS->seq[current][p++]=c; - else p++; - } - - LS->dc[current][1]=coor; - } - coor++; - - if ( disk==0)LS->seq[current][p]='\0'; - - if (LS->seq[current] && strm (LS->seq[current], "PDB")) - { - - pdb_name=get_pdb_struc(LS->name[current],0, 0); - pdb_S=get_pdb_sequence (pdb_name); - if (pdb_S) - { - sprintf ( LS->seq[current], "%s", pdb_S->seq[0]); - clen=strlen( pdb_S->seq[0]); - free_sequence ( pdb_S, 1); - } - else - { - add_warning (stderr, "WARNING: Could not fetch PDB file: %s", pdb_name); - } - } - - - LS->len[current]=p; - current++; - } - - else - { - c=fgetc ( fp); - coor++; - } - } - - vfclose (fp); - vfree (sub); - vfree (name); - vfree (buffer); - //LS=clean_sequence (LS); - - return LS; - } - -Sequence* get_sub_fasta_sequence (char *fname, char *comment_out) - { - Sequence *LS; - - FILE *fp; - - int c; - char name[100]; - int clen=0; - int current=0; - int p=0; - int max; - int max_len_seq=0; - int min_len_seq=0; - int nseq=0, l=0; - char *buf; - - - - int *sub; - - nseq=count_n_char_x_in_file(fname, '>'); - min_len_seq=max=count_n_char_in_file(fname); - sub=vcalloc (max+1, sizeof (int)); - buf=vcalloc ( max+1, sizeof (char)); - fp=vfopen (fname,"r"); - - - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - fscanf_seq_name (fp,name); - while ((c=fgetc(fp))!='\n' && c!=EOF); - buf=fgets ( buf,max, fp); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - clen=0; - } - else - c=fgetc (fp); - - } - - vfclose (fp); - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - - fscanf_seq_name (fp,LS->name[current]); - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==';')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - while ((c=fgetc(fp))!='\n' && c!=EOF); - - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - { - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if (is_gap(c)) - LS->seq[current][p++]=(c); - } - - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - - current++; - - } - - else - c=fgetc ( fp); - } - - - vfclose (fp); - - - vfree (sub); - return LS; - } -Sequence* get_pir_sequence (char *fname, char *comment_out) - { - Sequence *LS; - - FILE *fp; - int c; - - char name[100]; - int clen=0; - int current=0; - int p=0; - int max_len_seq=0; - int min_len_seq=999999; - int nseq=0, l=0; - char *buf; - - buf=vcalloc ( 1000, sizeof (char)); - if ((fp=vfopen (fname,"r"))==NULL) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - if ( (c=fgetc(fp))=='P')while ( (c=fgetc(fp))!=';'); - else ungetc ( c, fp); - fscanf_seq_name (fp,name); - - buf=fgets ( buf, 1000, fp); - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - else - c=fgetc (fp); - } - vfclose (fp); - - - - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='>') - { - if ( (c=fgetc(fp))=='P')while ( (c=fgetc(fp))!=';'); - else ungetc ( c, fp); - - fscanf_seq_name (fp,LS->name[current]); - - l=strlen ( LS->name[current]); - if ( LS->name[current][l-1]==','||LS->name[current][l-1]==',')LS->name[current][l-1]='\0'; - LS->name[current]=translate_name ( LS->name[current]); - buf=fgets ( buf, 1000, fp); - - LS->seq_comment[current]=fgets ( LS->seq_comment[current],COMMENT_SIZE-1, fp); - LS->seq_comment[current][strlen(LS->seq_comment[current])-1]='\0'; - p=0; - while ((c=fgetc(fp))!='>' && c!=EOF) - if (isalpha (c)) - LS->seq[current][p++]=tolower (c); - else if ( !isspace(c) && c!='*') - LS->seq[current][p++]=(c); - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - current++; - } - else - c=fgetc ( fp); - } - - vfclose (fp); - if (comment_out!=NULL) output_pir_check ( comment_out,LS->nseq, LS->seq_comment); - return LS; - } - -Sequence* get_gor_sequence (char *fname, char *comment_out) - { - Sequence *LS; - - FILE *fp; - int c; - - char name[100]; - int clen=0; - int current=0; - int p=0; - int max_len_seq=0; - int min_len_seq=99999; - int nseq=0; - char *buf; - - buf=vcalloc ( 1000, sizeof (char)); - if ((fp=vfopen (fname,"r"))==NULL) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - c=fgetc(fp); - while (c!=EOF) - { - if (c=='!') - { - fscanf_seq_name (fp,name); - - buf=fgets ( buf, 1000, fp); - while ((c=fgetc(fp))!='!' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - clen++; - max_len_seq=(clen> max_len_seq)?clen: max_len_seq; - min_len_seq=(clen< min_len_seq)?clen: min_len_seq; - nseq++; - clen=0; - } - else - c=fgetc (fp); - } - vfclose (fp); - - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - LS->nseq=nseq; - - fp=vfopen (fname,"r"); - - current=0; - c=fgetc(fp); - while (c!=EOF) - { - if (c=='!') - { - - - fscanf_seq_name (fp,LS->name[current]); - LS->name[current]=translate_name ( LS->name[current]); - buf=fgets ( buf, 1000, fp); - - p=0; - while ((c=fgetc(fp))!='!' && c!=EOF) - if (isalnum (c)|| is_gap(c)) - LS->seq[current][p++]=tolower (c); - - LS->seq[current][p]='\0'; - LS->len[current]=strlen ( LS->seq[current]); - current++; - } - else - c=fgetc ( fp); - } - - vfclose (fp); - - return LS; - } -Sequence* get_swissprot_sequence (char *fname, char *comment_out) - { - Sequence *LS; - FILE *fp; - int c; - char *buf; - int nseq=0; - int len, max_len_seq=0, min_len_seq=0; - - if ( !check_file_exists(fname)) - {printf ( "\nCOULDN'T OPEN %s",fname); - myexit(EXIT_FAILURE); - } - - buf=vcalloc (LONG_STRING+1, sizeof (char)); - fp=NULL; - while ( (fp=find_token_in_file(fname,fp,"\nSQ"))) - { - nseq++; - fgets (buf, LONG_STRING, fp); - len=0; - while ((c=fgetc(fp))!='/')if(isalpha(c))len++; - if ( max_len_seq==0)max_len_seq=min_len_seq=len; - else - { - max_len_seq=MAX(len, max_len_seq); - min_len_seq=MIN(len, min_len_seq); - } - } - - LS=declare_sequence ( min_len_seq, max_len_seq,nseq); - LS->nseq=0; - - fp=NULL; - while ( (fp=find_token_in_file(fname,fp,"\nID"))) - { - fscanf_seq_name (fp, LS->name[LS->nseq]); - fp=find_token_in_file(fname,fp,"\nSQ"); - fgets (buf, LONG_STRING, fp); - while ((c=fgetc(fp))!='/')if (isalpha(c))LS->seq[LS->nseq][LS->len[LS->nseq]++]=c; - LS->seq[LS->nseq][LS->len[LS->nseq]]='\0'; - LS->nseq++; - } - - - return LS; - } -int fscanf_seq_name ( FILE *fp, char *sname) -{ - static char *name; - int r; - if ( !sname) return 0; - - if ( !name)name=vcalloc ( 10000, sizeof (char)); - fscanf (fp, "%s", name); - r=strlen (name); - if ( strlen (name)>MAXNAMES) - add_warning (stderr, "\nWARNING: Seq Name Too long: [%s]. Truncated to %d", name, MAXNAMES); - name[MAXNAMES]='\0'; - sprintf ( sname, "%s", name); - return r; -} - -/*******************************************************************************************/ -/* */ -/* */ -/* INPUT ALN */ -/* */ -/***************************************************************************************** */ -void undump_msa ( Alignment *A, char *tmp) -{ - FILE *fp; - int m; - char *buf; - int index; - - if ( !A || !tmp || !check_file_exists (tmp))return; - m=measure_longest_line_in_file (tmp ); - A=realloc_aln2 ( A,A->max_n_seq,m+1); - - buf=vcalloc (m+1, sizeof (char)); - fp=vfopen (tmp, "r"); - while (fscanf (fp, "%d %s\n", &index, buf)==2) - { - sprintf ( A->seq_al[index], "%s", buf); - } - vfclose (fp); - vfree (buf); -} -void dump_msa ( char *file,Alignment *A, int nseq, int *lseq) -{ - FILE *fp; - int a; - fp=vfopen (file, "w"); - for (a=0; aseq_al[lseq[a]]); - vfclose (fp); -} - -void read_aln (char *file_name, Alignment *A) -{ - char *tmp_name; - Sequence *S; - - - tmp_name=vtmpnam (NULL); - if (printf_system ( "clustalw_aln2fasta_aln.pl %s > %s",file_name, tmp_name)!=EXIT_SUCCESS) - { - printf_exit ( EXIT_FAILURE, stderr, "Could Not Read File %s [FATAL:%s]\n", file_name, PROGRAM); - } - else - { - S=get_fasta_sequence ( tmp_name,NULL); - A=seq2aln (S, A, 0); - } - return; -} -void read_stockholm_aln (char *file_name, Alignment *A) -{ - char *tmp_name; - Sequence *S; - - - tmp_name=vtmpnam (NULL); - if (printf_system ( "clustalw_aln2fasta_aln.pl %s > %s",file_name, tmp_name)!=EXIT_SUCCESS) - { - printf_exit ( EXIT_FAILURE, stderr, "Could Not Read File %s [FATAL:%s]\n", file_name, PROGRAM); - } - else - { - int a; - S=get_fasta_sequence ( tmp_name,NULL); - for (a=0; anseq; a++) - { - if (strstr (S->name[a], "_stockholm")) - { - substitute ( S->name[a], "_stockholmspace_", " "); - substitute ( S->name[a], "_stockholmhasch_", "#"); - } - } - A=seq2aln (S, A, 0); - } - return; -} -Alignment* read_blast_aln ( char *file_name, Alignment *A) -{ - char *tmp_name; - Sequence *S; - int type; - int a; - - if ( !(type=is_blast_file (file_name))) - { - myexit (EXIT_FAILURE); - } - tmp_name=vtmpnam ( NULL); - if (type==BLAST_TXT) - { - printf_system("cat %s | blast_aln2fasta_aln.pl | fasta_aln2fasta_aln_unique_name.pl >%s", file_name, tmp_name); - } - else if (type==BLAST_XML) - { - - printf_system("blast_xml2fasta_aln.pl %s >%s", file_name, tmp_name); - } - - main_read_aln (tmp_name, A); - return A; -} - - -void read_number_aln ( char *file_name, Alignment *A) - { - FILE *fp, *fp2; - int * ptr_aln; - int a,b,d; - int c; - char *buf=NULL; - - int tot=0; - int flag=0; - char *fname; - int n_comment=0; - - int nseq=0; - int max_len=0; - - - fp=vfopen ( file_name, "r"); - - fname=vtmpnam(NULL); - fp2=vfopen ( fname, "w"); - while ( (c=fgetc(fp))!=EOF) - { - fprintf ( fp2, "%c", c); - } - vfclose (fp); - vfclose (fp2); - - - /*1 Count The number of sequences*/ - fp=vfopen ( fname, "r"); - buf=vfgets ( buf,fp); - if ( !isblanc (buf)); - while ( isblanc (buf)) - { - buf=vfgets ( buf, fp); - } - while (!isblanc (buf)) - { - buf=vfgets ( buf,fp); - } - while ( !isalnum ((c=fgetc(fp)))) - { - ungetc(c,fp); - buf=vfgets ( buf,fp); - } - - if ( c!='\n')ungetc(c,fp); - - while ( isalnum ((c=fgetc(fp)))) - { - ungetc(c,fp); - a=0; - while ( isgraph ((c=fgetc(fp)))); - nseq++; - buf=vfgets ( buf, fp); - } - vfclose (fp); - - /*DONE*/ - /*2 get_max_len*/ - max_len=count_n_char_in_file(fname)/nseq; - A=realloc_alignment2( A, nseq+1, max_len+1); - - /*DONE*/ - - - fp=vfopen ( fname, "r"); - buf=vfgets ( buf, fp); - if ( !isblanc (buf))sprintf (A->aln_comment[n_comment++], "%s", buf); - while ( isblanc (buf)) - { - buf=vfgets ( buf,fp); - } - while (!isblanc (buf)) - { - buf=vfgets ( buf, fp); - sprintf ( A->aln_comment[n_comment++], "%s", buf); - - } - while ( !isalnum ((c=fgetc(fp)))) - { - ungetc(c,fp); - buf=vfgets ( buf, fp); - - } - - if ( c!='\n')ungetc(c,fp); - - while ( isalnum ((c=fgetc(fp)))) - { - ungetc(c,fp); - - fscanf_seq_name (fp, A->name[A->nseq]); - - if ( name_is_in_list (A->name[A->nseq], A->name, A->nseq, 100)!=-1) - { - fprintf ( stderr, "\nWARNING (read_number_aln): Sequence %s Duplicated in File %s ", A->name[A->nseq], A->file[A->nseq]); - if (!getenv("ALLOW_DUPLICATE")) - { - fprintf ( stderr, " [FATAL:%s]\n", PROGRAM); - myexit (EXIT_FAILURE); - } - } - A->nseq++; - buf=vfgets ( buf,fp); - } - - vfclose (fp); - - - - if ((fp=vfopen ( fname, "r"))==NULL) - printf ( "\nCOULDN'T READ %s", fname); - - ptr_aln=vcalloc ( A->nseq, sizeof(int)); - while ( flag==0) - { - while ( (c=fgetc(fp))!='\n'); - if ( (c=fgetc(fp))=='\n') - flag=1; - } - while ( !isalnum(c=fgetc(fp))); - ungetc ( c, fp); - while ( c!=EOF) - { - tot=0; - while(tot< A->nseq && c!=EOF) - { - b=0; - while ( !isgraph (c=fgetc(fp)) && c!=EOF); - if ( c!=EOF)ungetc(c, fp); - while ( isgraph((buf[b++]=fgetc(fp)))); - buf[b-1]='\0'; - for ( a=-1,d=0; d< A->nseq; d++) - if ( strcmp (A->name[d], buf)==0) - {a=d; - tot++; - } - - if ( a==-1) while ( (c=fgetc(fp))!='\n' && c!=EOF); - else - { - while ( (c=fgetc(fp))!='\n') - { - if ( isgraph(c) || is_gap(c)) - {if ( isalpha(c)) - c=(A->residue_case==2)?c:tolower(c); - - if (!isspace(c))A->seq_al[a][ptr_aln[a]++]=c; - } - } - } - } - while ( !isalnum(c=getc(fp)) && c!=EOF); - if ( c!=EOF) - ungetc (c, fp); - } - - vfclose (fp); - - - for ( a=0; a< A->nseq; a++) - {A->seq_al[a][ptr_aln[a]]='\0'; - A->order[a][0]=a; - A->order[a][1]=0; - } - - A->len_aln= strlen(A->seq_al[0]); - - vfree (buf); - vfree(ptr_aln); - vremove (fname); - - } -void read_amps_aln ( char *in_file, Alignment *A) - { - FILE *fp; - int a, b, c, cont=1; - A->nseq=get_amps_seq_name ( A->name, in_file); - - fp=vfopen ( in_file, "r"); - fp=set_fp_id(fp, "1*"); - while ( (c=fgetc(fp))!='\n'); - b=0; - while ( cont==1) - { - c=fgetc ( fp); - c=fgetc(fp); - if ( c=='*') - { - cont=0; - for ( a=0; anseq; a++) - A->seq_al[a][b]='\0'; - A->len_aln=b; - } - - else - { - ungetc (c, fp); - for ( a=0; a< A->nseq; a++) - { - c=fgetc(fp); - if ( c==' ')A->seq_al[a][b]='-'; - else - { - A->seq_al[a][b]=c; - A->len[a]++; - } - } - while ((c=fgetc(fp))!='\n'); - b++; - } - } - } - - - - - - -int get_amps_seq_name ( char **name, char* fname) - { - FILE *fp; - int nseq=0; - - fp=vfopen ( fname, "r"); - fp=set_fp_id ( fp, "Index"); - while ( (fgetc(fp))!='\n'); - while ( isspace(fgetc(fp))) - {fscanf (fp, "%*d >%s", name[nseq++]); - while ( (fgetc(fp))!='\n'); - } - vfclose ( fp); - return nseq; - } -Alignment * read_gotoh_aln ( char *fname, Alignment *A) - { - FILE *fp; - int * ptr_aln; - int a,b,d,e; - - - char *buf; - char buf2[VERY_LONG_STRING+1]; - char buf3[VERY_LONG_STRING+1]; - char buf4[VERY_LONG_STRING+1]; - - int tot=0; - - int l; - int nseq, max_len; - - - if ( !check_file_exists (fname))return NULL; - fp=vfopen ( fname, "r"); - -/*1 GET THE NUMBER OF SEQUENCES*/ - nseq=0; - buf=vcalloc ( VERY_LONG_STRING+1, sizeof (char)); - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while (!isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while ( !isblanc ( buf) && buf!=NULL) - { - a=-1; - d=sscanf ( buf, "%d %s %s %s", &a, buf2, A->name[A->nseq],buf3); - if ( a!=-1) - { - if ( name_is_in_list (A->name[A->nseq], A->name, A->nseq, 100)!=-1) - { - fprintf ( stderr, "\nWARNING (get_amps_seq_name): Sequence %s Duplicated in File %s ", A->name[A->nseq], A->file[A->nseq]); - if (!getenv("ALLOW_DUPLICATE")) - { - fprintf ( stderr, " [FATAL:%s]\n", PROGRAM); - myexit (EXIT_FAILURE); - } - } - nseq++; - fgets(buf, VERY_LONG_STRING, fp); - } - else ( buf=NULL); - } - vfclose (fp); -/*2 Get the MAX Len and Reallocate*/ - max_len=count_n_char_in_file(fname)/nseq; - A=realloc_aln2( A, nseq+1, max_len+1); -/*3 Get The Sequences Names*/ - A->nseq=0; - fp=vfopen ( fname, "r"); - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while (!isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while ( !isblanc ( buf) && buf!=NULL) - { - a=-1; - d=sscanf ( buf, "%d %s %s %s", &a, buf2, A->name[A->nseq],buf3); - if ( a!=-1) - { - if ( d==4)sprintf (A->name[A->nseq],"%s", buf3); - A->nseq++; - fgets(buf, VERY_LONG_STRING, fp); - } - else ( buf=NULL); - } - vfclose (fp); - -/*READ THE ALN*/ - fp=vfopen ( fname, "r"); - - buf=vcalloc ( VERY_LONG_STRING+1, sizeof (char));; - ptr_aln=vcalloc ( A->nseq, sizeof(int)); - - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - while (!isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - - - while ( isblanc (buf=fgets ( buf, VERY_LONG_STRING, fp))); - - while (buf!=NULL) - { - tot=0; - while(tot< A->nseq) - { - - e=sscanf (buf, "%d %s %s %s", &e, buf2, buf3, buf4); - if ( e==4)sprintf( buf3, "%s", buf4); - - - for ( d=0; d< A->nseq; d++) - { - - if ( strcmp (A->name[d], buf3)==0) - {a=d; - tot++; - } - } - l=strlen (buf2); - if ( buf2[l-1]=='|')l--; - buf2[l]='\0'; - - for (b=0; bseq_al[a][ptr_aln[a]++]=(A->residue_case==2)?buf2[b]:tolower (buf2[b]); - } - buf=fgets(buf, VERY_LONG_STRING, fp); - } - if ( buf!=NULL) - { - buf=fgets(buf, VERY_LONG_STRING, fp); - while ( isblanc (buf) && buf!=NULL) - { - buf=fgets ( buf, VERY_LONG_STRING, fp); - } - } - - } - - vfclose (fp); - - - for ( a=0; a< A->nseq; a++) - {A->seq_al[a][ptr_aln[a]]='\0'; - } - - A->len_aln= strlen(A->seq_al[0]); - - - - for ( a=0; a< A->nseq; a++) - { - for ( b=0; b< A->len_aln; b++) - A->len[a]+=1-is_gap(A->seq_al[a][b]); - } - for ( a=0, b=0; a< A->len_aln; a++) - { - if ( !is_gap(A->seq_al[0][a]) &&!is_gap(A->seq_al[1][a]))b++; - } - return A; - } - - - - - -void read_msf_aln ( char *fname, Alignment *A) - { - char command[1000]; - char *tmp_name; - Sequence *S; - - tmp_name=vtmpnam(NULL); - sprintf ( command, "msf_aln2fasta_aln.pl %s > %s", fname, tmp_name); - - if ( my_system (command)!=EXIT_SUCCESS) - { - fprintf ( stderr, "\nERROR: file %s does not have a legal msf format [FATAL:%s]", fname,PROGRAM); - myexit (EXIT_FAILURE); - } - - S=get_fasta_sequence ( tmp_name,NULL); - A=seq2aln (S, A, 0); - vremove (tmp_name); - return; - } - -/**************************************************************************************************/ -/*************************************REFORMAT OUT*************************************************/ -/**************************************************************************************************/ -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT MATRICES */ -/* */ -/***************************************************************************************** */ - - - -int output_freq_mat ( char *outfile, Alignment *A) - { /* - function documentation: start - - int output_freq_mat ( char *outfile, Aligmnent *A) - - This function counts the number of residues in each column of an alignment (Prot) - It outputs these values in the following format - - A | 0 0 0 1 0 - B | 1 0 0 0 1 - - | 0 1 1 0 0 - - This format can be piped into: - The routine used for computing the p-value gmat-inf-gc-v2c - - function documentation: end - */ - - int a, b; - int **freq_mat; - FILE *fp; - - - freq_mat=aln2count_mat (A); - - fp=vfopen ( outfile, "w"); - for ( b=0; b< 26; b++) - { - fprintf (fp, "%c |", 'A'+b); - for ( a=0; a< A->len_aln; a++)fprintf (fp,"%d ", freq_mat[b][a]); - fprintf (fp, "\n"); - } - fprintf (fp, "- |"); - for ( a=0; a< A->len_aln; a++)fprintf (fp,"%d ", freq_mat[26][a]); - - free_int (freq_mat, -1); - vfclose ( fp); - return 1; - } -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT P-Values */ -/* */ -/***************************************************************************************** */ -float output_maln_pval ( char *outfile, Alignment *A) - { - /* - function documentation: start - float output_maln_pval ( char *outfile, Aligmnent *A) - - This function outputs the p-value of a multiple alignmnet as described - in Hertz, Stormo, Bioinformatics, 15-7/8, 563/577 - ftp beagle.colorado.edu /pub/cosensus - Locally - packages/consensus/gmat-inf-gc-v2c - - - The routine used for computing the p-value is the program gmat-inf-gc-v2c - function documentation: end - */ - - - char *mat; - char *result; - FILE *fp; - float value; - char command[LONG_STRING]; - char string[STRING]; - mat=vtmpnam (NULL); - result=vtmpnam (NULL); - - output_freq_mat (mat,A); - sprintf ( command, "more %s | gmat-inf-gc-v2c -A abcdefghijklmnopqrstuvwxyz> %s",mat, result); - my_system ( command); - - if ( !check_file_exists(result))return 0; - fp=find_token_in_file ( result, NULL, "ln(p-value):"); - - fscanf ( fp, "%s",string); - value=atof ( string); - vfclose ( fp); - - vremove ( mat); - vremove ( result); - - fp=vfopen ( outfile, "w"); - fprintf ( fp, "%.6f\n", value); - vfclose ( fp); - - return value; - } - - -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT WEIGHTS */ -/* */ -/***************************************************************************************** */ -int output_seq_weights ( Weights *W, char *wfile) - { - FILE*fp; - int a; - - if ( W==NULL)return 0; - - fp=vfopen (wfile, "w"); - if ( fp==NULL)return 0; - - - for ( a=0; a< W->nseq; a++) - { - - fprintf ( fp, "%s %.2f\n", W->seq_name[a],W->SEQ_W[a]); - } - vfclose ( fp); - return 1; - } -void output_pw_weights4saga ( Weights *W, float **w_list, char *wfile) - { - FILE*fp; - int a, b; - fp=vfopen (wfile, "w"); - - fprintf ( fp, "%s\n$\n", W->comments); - for ( a=0; a< W->nseq-1; a++) - { - for (b=a+1; b< W->nseq; b++) - { - fprintf ( fp, "%s %s %f\n", W->seq_name[a], W->seq_name[b],w_list[a][b]); - } - } - fprintf ( fp, "$\n"); - vfclose ( fp); - } - -FILE * display_weights (Weights *W, FILE *fp) -{ - int a; - int max_len; - - if ( W==NULL) - { - fprintf ( fp, "\n\nUN-WEIGHTED MODE: EVERY SEQUENCE WEIGHTS 1\n"); - return fp; - } - fprintf ( fp, "\n\nWEIGHTED MODE:%s\n\n", (W)->mode); - for ( a=0, max_len=0; a< W->nseq; a++)max_len=MAX(max_len, strlen (W->seq_name[a])); - for ( a=0; a< (W->nseq); a++) - { - fprintf ( fp, "\t%*s %.2f\n", max_len,(W)->seq_name[a],W->SEQ_W[a]); - } - fprintf ( fp, "\n"); - return fp; -} - -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT SEQ */ -/* */ -/***************************************************************************************** */ -int ** input_similarities (char *file, Alignment *A, char *mode) -{ - int a, b, i, n; - int **sim; - float score; - char name[1000]; - FILE *fp=NULL; - char *buf1=NULL, *buf2=NULL; - int new_aln=0; - - - - if ( !check_file_exists (file) || !is_distance_matrix_file (file) ||!is_similarity_matrix_file (file) ) - { - return NULL; - } - - if ( A) - { - fp=vfopen (file, "r"); - while ((buf2=vfgets (buf1,fp))!=NULL ) - { - if (strstr (buf2, "SEQ_INDEX")) - { - buf1=buf2; - sscanf (buf1, "# SEQ_INDEX %s %d",name, &i); - if ( !strm (A->name[i], name)) - { - return NULL; - } - } - } - vfclose (fp); - } - else - { - - A=similarities_file2aln(file); - new_aln=1; - } - - sim=declare_int ( A->nseq, A->nseq); - for ( a=0; anseq; a++)sim[a][a]=100; - - - fp=find_token_in_file (file, NULL, "PW_SEQ_DISTANCES"); - fp=find_token_in_file (file, fp, "BOT"); - while ((buf2=vfgets (buf1,fp))!=NULL ) - { - if ( !(strstr (buf2, "BOT\t") || strstr (buf2, "TOP\t")))continue; - buf1=buf2; - n=sscanf (buf1, "%*s %d %d %f", &a, &b, &score); - if ( n!=3) - { - free_int (sim, -1); - return NULL; - } - else sim[a][b]=sim[b][a]=(int)score; - } - vfclose (fp); - vfree (buf1); - if (new_aln)free_aln(A); - return sim; -} - -Alignment * similarities_file2aln ( char *file) -{ - int nseq=0, i; - FILE *fp; - char name[1000]; - Alignment *A; - - - fp=vfopen (file, "r"); - while ((fp=find_token_in_file (file,fp, "SEQ_INDEX")))nseq++; - A=declare_aln2 (nseq+1, 10); - - while ((fp=find_token_in_file (file,fp, "SEQ_INDEX"))) - { - fscanf (fp, "%s %d", name,&i); - sprintf ( A->name[i], "%s", name); - } - A->nseq=nseq; - - return A; -} - -void output_similarities (char *file, Alignment *A, char *mode) -{ - float s; - float *tot; - float bigtot=0; - int n, max; - FILE *fp; - int a, b; - char *p; - int **M=NULL; - for (max=0, a=0; a< A->nseq; a++)max=MAX(max,(strlen (A->name[a]))); - - - tot=vcalloc ( A->nseq, sizeof (float)); - fp=vfopen (file, "w"); - fprintf (fp, "# TC_SIMILARITY_MATRIX_FORMAT_01\n"); - for ( a=0; anseq; a++) - fprintf ( fp, "# SEQ_INDEX %s %d\n",A->name[a],a); - fprintf ( fp, "# PW_SEQ_DISTANCES \n"); - for (n=0,a=0;a< A->nseq-1; a++) - { - for ( b=a+1; bnseq; b++, n++) - { - if (strstr (mode, "_sarmat2")) - { - s=get_sar_sim (A->seq_al[a], A->seq_al[b]); - } - else if (strstr (mode, "_sar")) - { - s=get_sar_sim (A->seq_al[a], A->seq_al[b]); - } - else if ( (p=strstr (mode, "_memory_"))) - { - int **sim; - sscanf ( p, "_memory_%ld", (long int*)&sim); - s=sim[a][b]; - } - else if ( strstr (mode, "_idscore") || strstr ( mode, "_covscore")) - { - static Sequence *S; - if (a==0 && b==1) - { - free_sequence (S, -1); - if ( strstr (mode, "idscoreDNA")) - M=read_matrice ("idmat"); - else - M=read_matrice("blosum62mt"); - - S=aln2seq(A); - } - if ( strstr (mode, "_idscore"))s=idscore_pairseq(S->seq[a], S->seq[b], -10,-1, M, "sim"); - else s=idscore_pairseq(S->seq[a], S->seq[b], -10,-1, M, "cov"); - } - else if ( strstr (mode, "cov")) - { - s=get_seq_sim ( A->seq_al[a], A->seq_al[b],GAP_LIST, "cov"); - } - else - { - s=get_seq_fsim2 (A->seq_al[a], A->seq_al[b],GAP_LIST, mode); - } - fprintf (fp, "BOT\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", a,b,s,max,A->name[a], max, A->name[b], s); - fprintf (fp, "TOP\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", b,a,s,max,A->name[b], max, A->name[a], s); - tot[a]+=s; - tot[b]+=s; - bigtot+=s; - } - } - for ( a=0; a< A->nseq; a++) - { - fprintf (fp, "AVG\t %d\t %*s\t %*s\t %5.2f\n", a,max,A->name[a], max, "*", tot[a]/(A->nseq-1)); - - } - vfree (tot);free_int (M, -1); - fprintf (fp, "TOT\t %*s\t %*s\t %5.2f\n", max,"TOT", max, "*", bigtot/n); - vfclose (fp); -} - -void output_similarities_pw (char *file, Alignment *A, Alignment *B,char *mode) -{ - float s; - float *tot; - float bigtot=0; - int n, max; - FILE *fp; - int a, b; - - int **M=NULL; - Sequence *SA, *SB; - - if ( strstr (mode, "idscoreDNA")) - M=read_matrice ("idmat"); - else - M=read_matrice("blosum62mt"); - - SA=aln2seq(A); - SB=aln2seq(B); - - for (max=0, a=0; a< A->nseq; a++)max=MAX(max,(strlen (A->name[a]))); - for (a=0; a< B->nseq; a++)max=MAX(max,(strlen (B->name[a]))); - - - tot=vcalloc ( A->nseq, sizeof (float)); - fp=vfopen (file, "w"); - fprintf (fp, "# TC_SIMILARITY_MATRIX_FORMAT_01\n"); - for ( a=0; anseq; a++) - fprintf ( fp, "# SEQ_INDEX %s %d\n",A->name[a],a); - fprintf ( fp, "# PW_SEQ_DISTANCES \n"); - for (n=0,a=0;a< A->nseq; a++) - { - for ( b=0; bnseq; b++, n++) - { - s=idscore_pairseq(SA->seq[a], SB->seq[b], -10,-1, M, "sim"); - fprintf (fp, "BOT\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", a,b,s,max,A->name[a], max, B->name[b], s); - fprintf (fp, "TOP\t %4d %4d\t %5.2f %*s\t %*s\t %5.2f\n", b,a,s,max,B->name[b], max, A->name[a], s); - tot[a]+=s; - tot[b]+=s; - bigtot+=s; - } - } - - for ( a=0; a< A->nseq; a++) - { - fprintf (fp, "AVG\t %d\t %*s\t %*s\t %5.2f\n", a,max,A->name[a], max, "*", tot[a]/(A->nseq-1)); - } - vfree (tot);free_int (M, -1); - fprintf (fp, "TOT\t %*s\t %*s\t %5.2f\n", max,"TOT", max, "*", bigtot/n); - vfclose (fp); -} -void output_conservation_statistics ( char *file, Alignment *A) -{ - int a, b, c,c1, c2; - double **tot; - char aa[1000]; - int naa; - - sprintf (aa, "%s", BLAST_AA_ALPHABET); - naa=strlen (aa); - - tot=declare_double (256, 256); - - - for ( a=0; anseq; a+=2) - { - b=a+1; - for ( c=0; clen_aln; c++) - { - c1=tolower (A->seq_al[a][c]); - c2=tolower (A->seq_al[b][c]); - if ( !is_gap(c1) && !is_gap(c2)) - { - tot[c1][c2]++; - tot[c2][c1]++; - tot[c1][0]++; - tot[c2][0]++; - tot[0][0]++; - } - } - } - - fprintf ( stdout, "# BLAST_MATRIX FORMAT\n#ALPHABET=%s\n",aa); - for (a=0; anseq; a++)maxname=MAX(strlen(A->name[a]), maxname); - maxname++; - - - fp=vfopen (file, "w"); - - if (mode[0]=='h') - { - b=0; - while ((c=mode[b++])!='\0') - { - if ( c=='n') fprintf (fp, "%-*s ",maxname,"name"); - if ( c=='l') fprintf (fp, "%-*s ",5,"nres"); - if ( c=='g') fprintf (fp, "%-*s ",5,"ngap"); - if ( c=='t') fprintf (fp, "%-*s ",5,"len"); - } - if (is_in_set ( c, "nlgt")) fprintf (fp, "\n"); - mode++; - } - b=0; - while ((c=mode[b++])!='\0') - { - if ( c=='n')break; - if ( c=='N'){d=1;fprintf (fp, "NSEQ %d ", A->nseq);} - if ( c=='L'){d=1;fprintf (fp, "LEN %d ", A->len_aln);} - } - if ( d) fprintf (fp, "\n"); - - for (a=0; anseq; a++) - { - b=0; - d=0; - while ((c=mode[b++])!='\0') - { - if (is_in_set ( c, "nlgt"))d=1; - - if (c=='n'){d=1;fprintf ( fp, "%-*s ", maxname,A->name[a]);} - if (c=='l') - { - for (n=0,d=0; dlen_aln; d++)n+=!is_gap(A->seq_al[a][d]); - fprintf ( fp, "%-5d ",n); - } - if (c=='g') - { - for (n=0,d=0; dlen_aln; d++)n+=((is_gap(A->seq_al[a][d]) && !is_gap(A->seq_al[a][d+1]))||(is_gap(A->seq_al[a][d])&& A->seq_al[a][d+1]=='\0')) ; - fprintf ( fp, "%-5d ",n); - } - if (c=='t') - { - fprintf ( fp, "%-5d ",strlen (A->seq_al[a])); - } - if (c=='N' && d) - { - fprintf ( fp, "%-5d ",A->nseq); - } - if (c=='L'&& d) - { - fprintf ( fp, "%-5d ",A->len_aln); - } - } - if (d)fprintf ( fp, "\n"); - } - vfclose (fp); - } - -int output_age_matrix ( char *outfile, int val) -{ - int **mat; - int a, b; - char alp[]="abcdefghij-"; - int naa; - - mat=declare_int ( 256, 256); - naa=strlen (alp); - for ( a=0; anseq; a++) - { - ungap (A->seq_al[a]); - lower_string (A->seq_al[a]); - s=A->seq_al[a]; - l=strlen (s); - if ( s[0]=='\0') continue; - symbols[(int)s[0]]++; - for ( b=1; b< l; b++) - { - symbols[(int)s[b]]++; - table[(int)s[b-1]][(int)s[b]]++; - tot++; - } - } - for (naa=0, a=0; a< 256; a++) - { - if (symbols[a])alp[naa++]=a; - } - - - for ( a=0; a< 256; a++) - for (b=0; b<256; b++) - { - if (symbols[a]&& symbols[b] && table[a][b] && tot>0) - { - freq=(table[a][b])/tot; - expected=(symbols[a]*symbols[b])/(tot*tot); - log_odd=log (freq/expected); - mat[a-'A'][b-'A']=log_odd*10; - fmat[a-'A'][b-'A']=log_odd; - } - else if ( symbols[a]&& symbols[b]) - { - mat[a-'A'][b-'A']=-999; - fmat[a-'A'][b-'A']=-999; - } - } - output_mat ( mat,outfile, alp, 'A'); - - fp=vfopen (outfile, "a"); - for ( a=0; a<256; a++) - if ( symbols[a]) - { - fprintf (fp, "# %c tot: %6d freq: %7.5f\n", a, (int)symbols[a],(float)symbols[a]/tot); - } - - for ( a=0; a< 256; a++) - for (b=0; b<256; b++) - { - if (symbols[a]&& symbols[b]) - { - freq=(table[a][b])/tot; - fprintf (fp, "# %c%c tot: %6d freq: %7.5f log_odd: %9.3f\n", a, b, (int)table[a][b],(float)freq,fmat[a-'A'][b-'A']); - } - } - vfclose (fp); - vfree(alp); - free_arrayN ((void **)mat, 2); - free_arrayN ((void **)fmat, 2); - - return 1; -} - - - -void output_est_prf (char *fname, Alignment *A) - { - int a; - FILE *fp; - - if ( !A->P) - { - fprintf ( stderr, "\nFormat output_est_prf Impossible: No profile\n"); - myexit(EXIT_FAILURE); - } - - - fp=vfopen ( fname, "w"); - fprintf ( fp, "Consensus Sequence\nReconstructed with %s (%s,%s)\n",PROGRAM,AUTHOR,DATE); - fprintf ( fp, "%4c %4c %4c %4c %15s Consensus\n", 'A','G','C','T', "Internal Gaps"); - - for ( a=0; a< A->len_aln; a++) - { - fprintf (fp, "%4d %4d %4d %4d %15d %c\n", (A->P)->count[0][a],(A->P)->count[1][a],(A->P)->count[2][a], (A->P)->count[3][a], (A->P)->count[4][a],A->seq_al[0][a]); - } - return; - } - - -void output_gotoh_seq (char *fname, Alignment*A ) - { - int a; - FILE *fp; - - fp=vfopen ( fname, "w"); - fprintf ( fp, "%d %d\n",A->nseq, A->max_len); - for ( a=0; a< A->nseq; a++) - { - ungap ( A->seq_al[a]); - fprintf ( fp, ">%s\n", A->name[a]); - fp=output_string_wrap ( 50,A->seq_al[a] , fp); - fprintf ( fp, "//\n"); - } - - vfclose (fp); - } - -void output_mult_fasta_seq (char *fname, Alignment*A, int n ) - { - int a; - FILE *fp; - - fp=vfopen (fname, "w"); - ungap(A->seq_al[0]); - for (a=0; a%s_%d\n%s\n", A->name[0],a+1, A->seq_al[0]); - } - vfclose (fp); - } - -char * output_fasta_seqX (char *name, char *mode, Sequence *S, Alignment *A, int i) -{ - FILE *fp; - - if (!name)name=vtmpnam (NULL); - fp=vfopen (name, mode); - if ( (S && S->nseq<=i) || (A && S->nseq<=i) || (!A && !S)) - { - fprintf ( stderr, "\nERROR in function reformat:output_fasta_seqX[FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - else if ( S) - fprintf ( fp, ">%s %s\n%s\n", S->name[i], S->seq_comment[i], S->seq[i]); - else if ( A) - { - ungap (A->seq_al[i]); - fprintf ( fp, ">%s %s\n%s\n", A->name[i], A->seq_comment[i], A->seq_al[i]); - } - vfclose (fp); - return name; -} - -void output_fasta_seq1 (char *fname, Alignment*A ) - { - char seq_name[VERY_LONG_STRING]; - int a; - FILE *fp; - char *extension; - - for ( a=0; a< A->nseq; a++) - { - if ( strncmp( fname, "name",4)==0) - { - if ( (fname+4)[0]!='\0')extension=fname+5; - else - extension=NULL; - - sprintf ( seq_name,"%s.%s", A->name[a],(extension==NULL)?"seq":extension); - } - else - sprintf ( seq_name,"%s.seq",A->name[a]); - - ungap ( A->seq_al[a]); - fp=vfopen (seq_name, "w"); - fprintf (fp, ">%s %s\n", A->name[a], A->seq_comment[a]); - fp=output_string_wrap ( 50, A->seq_al[a],fp); - fprintf ( fp, "\n"); - vfclose (fp); - } - } -void output_pir_check (char *fname,int nseq, char **comment ) - { - int a; - FILE *fp; - - if ( fname==NULL)return; - fp=vfopen ( fname, "w"); - - for ( a=0; a< nseq; a++)fprintf (fp, "%s\n", comment[a]); - vfclose (fp); - } -void output_fasta_seq (char *fname, Alignment*A) -{ - main_output_fasta_seq (fname, A, HEADER); -} -void output_fasta_tree (char *fname, Alignment*A) - { - int a; - FILE *fp; - if ( !A || !A->nseq) return; - - fp=vfopen ( fname, "w"); - - for ( a=0; a< A->nseq; a++) - { - fprintf ( fp, ">%s %s\n%s\n", A->name[a], A->seq_comment[a], A->seq_al[a]); - } - vfclose (fp); - } -void main_output_fasta_seq (char *fname, Alignment*A,int header ) - { - int a; - FILE *fp; - - fp=vfopen ( fname, "w"); - - for ( a=0; a< A->nseq; a++) - { - ungap(A->seq_al[a]); - fprintf ( fp, ">%s", A->name[a]); - if (header==HEADER && A->seq_comment[a][0] && !isblanc(A->seq_comment[a]))fprintf (fp," %s\n",A->seq_comment[a]); - else fprintf ( fp, "\n"); - fp=output_string_wrap ( 50, A->seq_al[a],fp); - fprintf ( fp, "\n"); - } - vfclose (fp); - } -void output_gor_seq (char *fname, Alignment*A ) - { - int a; - FILE *fp; - - fp=vfopen ( fname, "w"); - - for ( a=0; a< A->nseq; a++) - { - ungap(A->seq_al[a]); - fprintf ( fp, "!%s %d \n", A->name[a], (int)strlen(A->seq_al[a])); - upper_string ( A->seq_al[a]); - fp=output_string_wrap ( 50, A->seq_al[a],fp); - fprintf ( fp, "@\n"); - } - vfclose (fp); - } -void output_pir_seq (char *fname, Alignment*A ) - { - int a; - for ( a=0; a< A->nseq; a++)ungap(A->seq_al[a]); - output_pir_aln (fname, A); - } -void output_pir_seq1 (char *fname, Alignment*A ) - { - char seq_name[VERY_LONG_STRING]; - int a; - FILE *fp; - char type[20]; - - - for ( a=0; a< A->nseq; a++) - { - if ( strm ( get_string_type (A->seq_al[a]),"DNA") || strm ( get_string_type (A->seq_al[a]),"RNA"))sprintf(type, "DL"); - else if ( strm ( get_string_type (A->seq_al[a]),"PROTEIN"))sprintf(type, "P1"); - sprintf ( seq_name,"%s;%s_%s.seq",type, fname,A->name[a]); - ungap ( A->seq_al[a]); - fp=vfopen (seq_name, "w"); - fprintf (fp, ">%s\n\n", A->name[a]); - fp=output_string_wrap ( 50, A->seq_al[a],fp); - fprintf ( fp, "\n*\n"); - vfclose (fp); - } - } -/*******************************************************************************************/ -/* */ -/* */ -/* OUTPUT ALN */ -/* */ -/***************************************************************************************** */ -void output_mocca_aln (char *outfile, Alignment *A, Alignment *S) - { - FILE *fp; - int **score; - char **new_name_order; - int a, maxl; - - score=declare_int (S->nseq, 2); - new_name_order=declare_char ( S->nseq,MAXNAMES+1); - for ( a=0; anseq; a++) - { - score[a][0]=a; - score[a][1]=S->score_seq[a]; - } - sort_int_inv (score+1,2,1,0,S->nseq-2); - for ( a=0; anseq; a++) - { - sprintf ( new_name_order[a], "%s", A->name[score[a][0]]); - } - A=reorder_aln (A, new_name_order, A->nseq); - - fp=vfopen (outfile, "w"); - fprintf ( fp, "MOCCA,(%s,%s, C. Notredame)\nSCORE %d\nNSEQ %d\nLEN %d\n",VERSION,DATE, A->score_aln, A->nseq, A->len_aln); - - maxl=return_maxlen ( new_name_order, A->nseq); - - - for (a=0; a< A->nseq; a++) - { - fprintf (fp, "%-*s: %3d\n", maxl, A->name[a], score[a][1]); - } - - fprintf ( fp, "\n"); - - fp=output_Alignment_without_header ( A, fp); - vfclose (fp); - free_int (score, -1); - free_char (new_name_order, -1); - return ; - } - -void print_sub_aln ( Alignment *B, int *ns, int **ls) -{ - Alignment *X; - int a, b; - - - X=copy_aln (B, NULL); - X->nseq=0; - X->len_aln=strlen ( B->seq_al[ls[0][0]]); - - - for (a=0; a< 2; a++) - for ( b=0; bnseq++) - { - sprintf ( X->seq_al[X->nseq], "%s", B->seq_al[ls[a][b]]); - sprintf ( X->name[X->nseq], "%s", B->name[ls[a][b]]); - } - X->name[X->nseq][0]='\0'; - - print_aln (X); - free_aln (X); -} -void print_aln ( Alignment *B) - { - - while(B) - { - output_Alignment_without_header ( B, stderr); - B=B->A; - } - } - - -FILE * output_aln ( Alignment *B, FILE *fp){return output_Alignment(B, fp);} -FILE * output_Alignment ( Alignment *B, FILE *fp) - { - fprintf ( fp, "%s, %s (%s) [%s] [MODE: %s]\n%s\nCPU %d sec\nSCORE %d\nNSEQ %d\nLEN %d\n",PROGRAM,VERSION,DATE,retrieve_mode(),URL,AUTHOR, (B->cpu+get_time())/1000, B->score_aln, B->nseq, B->len_aln); - return output_Alignment_without_header ( B, fp); - } - -FILE * output_Alignment_without_header ( Alignment *B, FILE *fp) - { - int a,b, c; - int max_len=0; - int line; - int *n_residues; - char s; - - - if (fp==NULL)return fp; - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - max_len=MAX(max_len+2, 16); - line=get_msa_line_length (0, 0); - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; anseq; a++)n_residues[a]=(B->output_res_num==2)?B->order[a][1]:0; - - - - - fprintf ( fp, "\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; b<=B->nseq; b++) - { - fprintf (fp,"%-*s",max_len,B->name[b]); - if (B->output_res_num)fprintf (fp, " %4d ", n_residues[b]+1); - for (c=a;clen_aln;c++) - { - if (b==B->nseq){n_residues[b]++;s=analyse_aln_column ( B, c);} - else - {n_residues[b]+=!is_gap(B->seq_al[b][c]); - s=GET_CASE(B->residue_case, B->seq_al[b][c]); - } - - fprintf (fp,"%c",s ); - } - if (B->output_res_num)fprintf (fp, " %4d", n_residues[b]); - fprintf (fp,"\n"); - } - - fprintf (fp,"\n"); - } - - fprintf (fp,"\n\n"); - vfree (n_residues); - - return fp; - } -FILE * output_aln_score ( Alignment *B, FILE *fp){return output_Alignment_score(B, fp);} -FILE * output_Alignment_score ( Alignment *B, FILE *fp) - { - int a, b, c; - static int max_len=0; - static int line; - int ch; - - if (fp==NULL)return fp; - if ( max_len==0) - { - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - max_len+=4; - - } - line=get_msa_line_length(0, 0); - sprintf (B->name[B->nseq], "CONS"); - fprintf ( fp, "T_COFFEE ALIGNMENT\nCPU TIME:%d sec.\n", (B->cpu+get_time())/1000); - fprintf ( fp, "SCORE=%d\n", B->score_aln); - for ( a=0;anseq; a++)fprintf ( fp, "%s: %d\n", B->name[a], B->score_seq[a]); - fprintf ( fp, "\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - { - fprintf (fp,"%-*s",max_len,B->name[b]); - for (c=a;clen_aln;c++) - { - ch=B->seq_al[b][c]; - if (ch==NO_COLOR_RESIDUE)fprintf (fp,"-"); - else if ( ch==NO_COLOR_GAP)fprintf (fp,"*"); - else if ( ch<10 && ch>=0)fprintf (fp,"%d",ch); - else if ( ch>10)fprintf (fp,"#"); - else if ( ch<0)fprintf (fp,"."); - else fprintf (fp,"9"); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n"); - fprintf (fp,"%-*s",max_len,B->name[b]); - for (c=a;clen_aln;c++) - { - ch=B->seq_al[b][c]; - if (ch==NO_COLOR_RESIDUE)fprintf (fp,"-"); - else if ( ch==NO_COLOR_GAP)fprintf ( fp, "*"); - else if ( ch<10 && ch>=0)fprintf (fp,"%d",ch); - else if ( ch>10)fprintf (fp,"#"); - else if ( ch<0)fprintf (fp,"."); - else fprintf (fp,"9"); - } - fprintf (fp,"\n\n\n"); - } - fprintf (fp,"\n\n"); - return fp; - } -FILE * output_aln_with_res_number ( Alignment *B, FILE *fp){return output_Alignment_with_res_number(B, fp);} -FILE * output_Alignment_with_res_number ( Alignment *B, FILE *fp) - { - int a, b, c; - static int max_len=0; - static int line; - int**order; - - if (fp==NULL)return fp; - if ( max_len==0) - { - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - } - max_len+=4; - line=60; - } - order=copy_int ( B->order,declare_int ( B->nseq, 2), B->nseq, 2); - - fprintf ( fp, "T_COFFEE ALIGNMENT\nCPU TIME:%d sec.\n", (B->cpu+get_time())/1000); - fprintf ( fp, "\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - { - fprintf (fp,"%-*s %3d %4d ",max_len,B->name[b], order[b][0], order[b][1] ); - for (c=a;clen_aln;c++) - { - order[b][1]+=1-is_gap(B->seq_al[b][c]); - fprintf (fp,"%c",toupper(B->seq_al[b][c]) ); - } - fprintf (fp," %4d\n", order[b][1] ); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n\n"); - - free_int (order, -1); - return fp; - } - -void output_constraints ( char *fname, char *mode,Alignment *A) - { - FILE *fp; - Constraint_list *CL; - char *buf; - char **name_list; - - if ( !A->CL || strm ( mode, "pdb")) - { - if (!A->S) - { - A->S=aln2seq(A); - } - - CL=declare_constraint_list ( A->S, NULL, NULL, 0, NULL, NULL); - CL=aln2constraint_list (A,CL, mode); - compact_list (CL, 0, CL->ne, "default"); - fp=save_constraint_list ( CL, 0, CL->ne,fname, NULL, "lib",A->S); - vfclose (fp); - free_constraint_list (CL); - return; - } - else if ( strncmp ( mode, "extended_pair", 13)==0) - { - buf=duplicate_string (mode+14); - - name_list=vcalloc(2, sizeof(char*)); - name_list[0]=strtok (buf,"_"); - name_list[1]=strtok (NULL,"_"); - mode[13]='\0'; - - - CL=A->CL; - compact_list (CL, 0, CL->ne, "default"); - fp=save_sub_list_header (vfopen(fname, "w"),2, name_list,CL); - fp=save_extended_constraint_list_pair (CL, "pair",name_list[0],name_list[1],fp); - fp=save_list_footer (fp, CL); - vfree (buf); - } - else if ( strm2 (mode, "extended_lib","extended_cosmetic")) - { - CL=A->CL; - compact_list (CL, 0, CL->ne, "default"); - fp=save_extended_constraint_list ( CL,mode+9, vfopen(fname, "w")); - } - else - { - CL=(Constraint_list *)A->CL; - compact_list (CL, 0, CL->ne, "default"); - fp=save_constraint_list ( CL, 0, CL->ne,fname, NULL, "lib",A->S); - } - vfclose ( fp); - - if ( (Constraint_list *)A->CL !=CL)free_constraint_list (CL); - - return; - - } -void output_model_aln (char *fname, Alignment*A ) - { - FILE *fp; - int a; - Dp_Model *M; - Dp_Result *R; - char *string; - - if ( A->Dp_result==NULL) - { - fprintf ( stderr, "\nWARNING Could Not Output Model %s [%s]", fname, PROGRAM); - } - R=A->Dp_result; - M=R->Dp_model; - - fp=vfopen ( fname, "w"); - for (a=0; anstate; a++) - { - if (M->model_comments[a][0])fprintf ( fp, "#STATE %c: %s\n", 'a'+a, M->model_comments[a]); - } - string=vcalloc ( R->len+1, sizeof (char)); - for (a=0; alen; a++)string[a]=R->traceback[a]+'a'; - fprintf ( fp, ">%s\n",fname); - fp=output_string_wrap ( 50,string, fp); - vfree(string); - fprintf ( fp, "\n"); - - vfclose (fp); - return; - } -char * output_fasta_sub_aln (char *fname, Alignment*A, int ns, int *ls ) -{ - int a,s; - FILE *fp; - if (fname==NULL)fname=vtmpnam (NULL); - fp=vfopen (fname, "w"); - for (a=0; a%s %s\n%s\n", A->name[s],A->seq_comment[s],A->seq_al[s]); - } - vfclose (fp); - return fname; -} -char * output_fasta_sub_aln2 (char *fname, Alignment*A, int *ns, int **ls ) -{ - int a,g,s; - FILE *fp; - if (fname==NULL)fname=vtmpnam (NULL); - fp=vfopen (fname, "w"); - for ( g=0; g<2; g++) - for (a=0; a%s %s\n%s\n", A->name[s],A->seq_comment[s],A->seq_al[s]); - } - vfclose (fp); - return fname; -} - -int output_suchard_aln (char *out_file, Alignment *A) -{ - int a, b, c, d; - FILE *fp; - - A=back_translate_dna_aln (A); - - for ( c=0,a=0; alen_aln; a++, c++) - { - if (c==3)c=0; - for (b=0; bnseq; b++) - { - if (c==2) - { - A->seq_al[b][a]='-'; - } - } - } - A=ungap_aln_n (A, 1); - fp=vfopen (out_file, "w"); - for ( a=0; a< A->nseq; a++) - { - for (b=0; b< A->len_aln; b++) - { - c=tolower(A->seq_al[a][b]); - if ( c=='a')d=1; - else if ( c=='g')d=2; - else if ( c=='c')d=3; - else if ( c=='t')d=4; - else if ( c=='u')d=5; - else d=6; - - fprintf ( fp, "%d", d); - } - fprintf ( fp, "\n"); - } - vfclose (fp); - exit (EXIT_SUCCESS); -} - -void output_fasta_aln (char *fname, Alignment*A ) - { - FILE *fp; - int a; - int line=0; - - line=get_msa_line_length (line, A->len_aln+1); - fp=vfopen ( fname, "w"); - - for ( a=0; a< A->nseq; a++) - { - fprintf ( fp, ">%s", A->name[a]); - - if ( A->seq_comment[a][0] && !isblanc (A->seq_comment[a]))fprintf ( fp, " %s", A->seq_comment[a]); - fprintf ( fp, "\n"); - fp=output_string_wrap ( line,A->seq_al[a] , fp); - fprintf ( fp, "\n"); - } - vfclose (fp); - } - -void output_pir_aln (char *fname, Alignment*A ) - { - int a; - FILE *fp; - char type[20]; - - - - - - fp=vfopen ( fname, "w"); - for ( a=0; a< A->nseq; a++) - { - if ( strm ( get_string_type (A->seq_al[a]),"DNA") || strm ( get_string_type (A->seq_al[a]),"RNA"))sprintf(type, "DL"); - else if ( strm ( get_string_type (A->seq_al[a]),"PROTEIN"))sprintf(type, "P1"); - fprintf ( fp, ">%s;%s\n%s\n",type, A->name[a], A->seq_comment[a]); - fp=output_string_wrap ( 50,A->seq_al[a] , fp); - fprintf ( fp, "\n*\n"); - } - - vfclose (fp); - } - -int landscape_msa; -int set_landscape_msa (int len) -{ - if ( len==0)landscape_msa=-1; - else - { - landscape_msa=len; - } - return landscape_msa; -} -int get_msa_line_length (int line, int aln_len) -{ - if (landscape_msa==-1) return aln_len; - else if ( landscape_msa)return landscape_msa; - else if (line) return line; - else - { - return (getenv ("ALN_LINE_LENGTH"))?atoi(getenv("ALN_LINE_LENGTH")):ALN_LINE_LENGTH; - } -} - -void output_msf_aln (char *fname,Alignment *B) - { - int a, b, c; - char *seq; - int *all_checks; - int i,j; - long grand_checksum; - FILE *fp; - int max_len; - int line=0; - int block=10; - int c_block; - char aa; - - - line=get_msa_line_length (line, B->len_aln+1); - - - for ( max_len=0,a=0; a< B->nseq; a++)max_len= MAX(strlen ( B->name[a]),max_len); - - - max_len+=5; - - fp=vfopen (fname, "w"); - - seq =vcalloc(B->len_aln, sizeof(char)); - all_checks =vcalloc(B->nseq, sizeof(int)); - for ( i=0; i< B->nseq; i++) - { - for ( j=0; jlen_aln; j++) - { - if ( is_gap(B->seq_al[i][j]))seq[j]='.'; - else seq[j]=B->seq_al[i][j]=toupper(B->seq_al[i][j]); - - } - all_checks[i] = SeqGCGCheckSum(seq, (int)B->len_aln); - } - grand_checksum = 0; - for(i=0; inseq; i++) grand_checksum += all_checks[i]; - grand_checksum = grand_checksum % 10000; - fprintf(fp,"PileUp\n\n"); - B=get_aln_type(B); - fprintf(fp,"\n\n MSF:%5d Type: ",B->len_aln); - if(strm ( (B->S)->type, "DNA") || strm ( (B->S)->type, "RNA")) - fprintf(fp,"N"); - else - fprintf(fp,"P"); - fprintf(fp," Check:%6ld .. \n\n", (long)grand_checksum); - for (i=0; i< B->nseq; i++) - { - fprintf ( fp, " Name: %s oo Len:%5d Check:%6ld Weight: %.3f\n", B->name[i], B->len_aln,(long)all_checks[i],(B->S)->W?((B->S)->W)->SEQ_W[i]:1.00); - } - fprintf(fp,"\n//\n\n"); - - for (a=0; alen_aln; a+=line) - { - fprintf ( fp,"\n\n"); - for (b=0; bnseq; b++) - { - fprintf (fp,"%-*s ",max_len,B->name[b]); - for (c_block=0,c=a;clen_aln;c++) - { - if ( c_block==block) - { - fprintf (fp, " "); - c_block=0; - } - c_block++; - aa=(is_gap(B->seq_al[b][c]))?'.': toupper(B->seq_al[b][c]); - fprintf (fp,"%c",aa ); - } - if ( c_block==block) - { - fprintf (fp, " "); - c_block=0; - } - fprintf (fp,"\n"); - - } - } - fprintf ( fp,"\n"); - vfclose ( fp); - - - vfree(seq); - vfree(all_checks); - - - return; -} -int SeqGCGCheckSum(char *seq, int len) -{ - int i; - long check; - - for( i=0, check=0; i< len; i++,seq++) - check += ((i % 57)+1) * toupper(*seq); - - return(check % 10000); -} -void old_output_msf_aln (char *fname,Alignment *B) - { - FILE *fp; - static int *put_seq; - int a, b, c; - int line=0; - char aa; - char *buf; - int max_len; - int seq_max_len; - - line=get_msa_line_length (line, B->len_aln+1); - - - for ( max_len=0,a=0; a< B->nseq; a++)max_len= MAX(strlen ( B->name[a]),max_len); - for ( seq_max_len=0,a=0; a< B->nseq; a++)seq_max_len= MAX(strlen ( B->seq_al[a]),max_len); - - - buf=vcalloc(seq_max_len+1, sizeof (int)); - - if ( put_seq==NULL) - put_seq= vcalloc ( B->nseq, sizeof (int)); - put_seq[0]=1; - - - for ( b=1; b< B->nseq; b++) - { - sprintf ( buf, "%s", B->seq_al[b]); - ungap(buf); - put_seq[b]=( strlen (buf)>0)?1:0; - } - - fp=vfopen ( fname, "w"); - fprintf ( fp, "MSF: %d Type P Check: 5083 ..\n", B->len_aln); - for ( a=0; a< B->nseq; a++) - { - if ( put_seq[a]==1) - fprintf ( fp,"Name: %s\n",B->name[a]); - } - fprintf ( fp, "//\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - { - if ( put_seq[b]==1) - { - fprintf (fp,"%-*s ",max_len,B->name[b]); - for (c=a;clen_aln;c++) - { - - - - aa=(B->seq_al[b][c]=='-')?'.': toupper(B->seq_al[b][c]); - fprintf (fp,"%c",aa ); - } - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n"); - } - fprintf ( fp,"\n\n"); - vfclose ( fp); - - vfree (buf); - vfree(put_seq); - } - -void output_saga_aln ( char *name, Alignment *B) - { - int a, b, c; - FILE *fp; - - - - int max_len; - int line=0; - - line=get_msa_line_length (line, B->len_aln+1); - - - - for ( max_len=0,a=0; a< B->nseq; a++)max_len= (strlen ( B->name[a])>max_len)?(strlen ( B->name[a])):max_len; - - - - - fp= vfopen ( name, "w"); - - fprintf (fp, "\nSAGA FORMAT\nalignement %s nseq=%d len=%d\n", name, B->nseq, B->len_aln); - - fprintf (fp, "\n\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - {fprintf (fp,"%-*s ",max_len,B->name[b]); - for (c=a;clen_aln;c++) - { - fprintf (fp,"%c",(B->seq_al[b][c]) ); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n\n"); - vfclose ( fp); - } -void output_compact_aln ( char *name, Alignment *B) - { - int a, b, c; - FILE *fp; - int do_print=0; - - - int max_len; - int line=0; - - line=get_msa_line_length (line, B->len_aln+1); - - - for ( max_len=0,a=0; a< B->nseq; a++)max_len= (strlen ( B->name[a])>max_len)?(strlen ( B->name[a])):max_len; - - - - - fp= vfopen ( name, "w"); - - fprintf (fp, "\nSAGA FORMAT\nalignement %s nseq=%d len=%d", name, B->nseq, B->len_aln); - fprintf (fp, "\n\n"); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - { - - for ( do_print=0, c=a;clen_aln;c++) - do_print+=1-is_gap(B->seq_al[b][c]); - if ( do_print>0) - { - fprintf (fp,"%-*s ",max_len,B->name[b]); - - - - for (c=a;clen_aln;c++) - { - if ( is_gap(B->seq_al[b][c])&& B->seq_al[b][c]!='-' )fprintf (fp,"%c", '-'); - else fprintf (fp,"%c",(B->seq_al[b][c]) ); - } - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n\n"); - vfclose ( fp); - } - -void output_clustal_aln ( char *name, Alignment *B) -{ - return output_generic_clustal_aln (name, B, "tc_clustal"); -} -void output_strict_clustal_aln ( char *name, Alignment *B) -{ - return output_generic_clustal_aln (name, B, "strict_clustal"); -} - -void output_generic_clustal_aln ( char *name, Alignment *B, char *mode) - { - int a, b, c; - FILE *fp; - int max_len=0; - int line=0; - int *n_residues; - - if ( getenv ("SEP_4_TCOFFEE")) - { - while ( linelen_aln && B->seq_al[0][line]!='o' && B->seq_al[0][line]!='O')line++; - if ( B->seq_al[0][line]=='O' || B->seq_al[0][line]=='o')line++; - } - else - { - while ( linelen_aln)line++; - } - - if ( line==B->len_aln)line=get_msa_line_length (0, B->len_aln+1); - - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - n_residues[a]=B->order[a][1]; - } - max_len=MAX(max_len+2, 16); - - - fp= vfopen ( name, "w"); - - if ( strm (mode, "strict_clustal")) - fprintf ( fp, "CLUSTAL W (1.83) multiple sequence alignment"); - else - fprintf (fp, "CLUSTAL FORMAT for %s %s [%s] [MODE: %s ], CPU=%.2f sec, SCORE=%d, Nseq=%d, Len=%d ", PROGRAM, VERSION,URL, retrieve_mode (),(float)(B->cpu+get_time())/1000, B->score_aln, B->nseq, B->len_aln); - fprintf (fp, "\n\n"); - - - if ( B->len_aln==0) - { - for (b=0; b<=B->nseq; b++) - fprintf (fp,"%-*s -\n",max_len, B->name[b]); - } - - else - { - for (a=0; alen_aln; a+=line) - {for (b=0; b<=B->nseq; b++) - { - if (b!=B->nseq) - { - fprintf (fp,"%-*s",max_len, B->name[b]); - for (c=a;clen_aln;c++) - { - if ( is_gap(B->seq_al[b][c]))fprintf (fp,"%c", '-'); - else - { - n_residues[b]++; - fprintf (fp, "%c", GET_CASE(B->residue_case, B->seq_al[b][c])); - - } - - } - if (B->output_res_num)fprintf (fp, " %d", n_residues[b]); - fprintf (fp,"\n"); - } - else if ( b==B->nseq) - { - fprintf (fp,"%-*s",max_len," "); - for (c=a;clen_aln;c++) - { - fprintf ( fp, "%c", analyse_aln_column (B, c)); - } - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n\n"); - vfree (n_residues); - vfclose ( fp); - } -FILE * output_generic_interleaved_aln (FILE *fp, Alignment *B, int line, char gap, char *mode) - { - int a, b, c; - int max_len=0; - int *n_residues; - - - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - n_residues[a]=B->order[a][1]; - } - max_len=MAX(max_len+2, 16); - - - - - if ( B->len_aln==0) - { - for (b=0; b<=B->nseq; b++) - fprintf (fp,"%-*s -\n",max_len, B->name[b]); - } - - else - { - for (a=0; alen_aln; a+=line) - {for (b=0; b<=B->nseq; b++) - { - if (b!=B->nseq) - { - fprintf (fp,"%-*s",max_len, B->name[b]); - for (c=a;clen_aln;c++) - { - if ( is_gap(B->seq_al[b][c]))fprintf (fp,"%c", gap); - else - { - n_residues[b]++; - fprintf (fp, "%c", GET_CASE(B->residue_case, B->seq_al[b][c])); - - } - - } - if (B->output_res_num)fprintf (fp, " %d", n_residues[b]); - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n"); - } - } - vfree (n_residues); - return fp; - } -void output_phylip_aln ( char *name, Alignment *B) - { - int a, b, c, d; - FILE *fp; - - int *print_name; - static int line=0; - line=get_msa_line_length(0, 0); - - print_name=vcalloc ( B->nseq, sizeof (int)); - fp= vfopen ( name, "w"); - - fprintf (fp, "%3d %d\n", B->nseq, B->len_aln); - for (a=0; alen_aln; a+=line) - {for (b=0; bnseq; b++) - {if ( print_name[b]==0) - { - - fprintf (fp,"%-10.10s ",B->name[b]); - print_name[b]=1; - } - else - { - fprintf (fp, "%10.10s ", " "); - } - - - for (d=0,c=a;clen_aln;c++, d++) - { - if ( d==10) - { - fprintf ( fp, " "); - d=0; - } - if ( is_gap(B->seq_al[b][c])&& B->seq_al[b][c]!='-' )fprintf (fp,"%c", '-'); - else fprintf (fp,"%c",(B->seq_al[b][c]) ); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n"); - } - fprintf (fp,"\n\n"); - vfclose ( fp); - } - -void output_rnalign (char *out_file, Alignment *A, Sequence *STRUC) - { - int a, b; - FILE *fp; - char bank_file[100]; - char pep_file[100]; - char *buf; - - sprintf ( bank_file, "%s.mss", out_file); - sprintf ( pep_file, "%s.one_rna", out_file); - - - buf=vcalloc ( strlen ( A->seq_al[0]+1), sizeof (char)); - - for ( b=0,a=0; a< strlen(A->seq_al[0]); a++) - { - if ( is_gap(A->seq_al[0][a])) - buf[a]='.'; - else - buf[a]=STRUC->seq[0][b++]; - } - buf[a]='\0'; - - fp=vfopen ( bank_file, "w"); - - fprintf ( fp, "ST\n"); - fp=output_string_wrap ( 50, buf, fp); - fprintf ( fp, "\n\n"); - - for ( a=0; anseq-1; a++) - { - fprintf ( fp, "AS %s\n ", A->name[a]); - fp=output_string_wrap ( 50, A->seq_al[a], fp); - fprintf ( fp, "\n\n"); - } - vfclose ( fp); - fp=vfopen ( pep_file, "w"); - fprintf ( fp, ">%s\n", A->name[A->nseq-1]); - fp=output_string_wrap ( 50, A->seq_al[A->nseq-1], fp); - fprintf ( fp, "\n"); - vfclose (fp); - } - -void output_lib (char *pw_lib_saga_aln_name, Alignment *A ) - { - Alignment *B; - char fname[VERY_LONG_STRING]; - int a,b; - - B=declare_Alignment (NULL); - - B->nseq=2; - - for ( a=0; a< A->nseq-1; a++) - { - for ( b=a+1; bnseq; b++) - { - sprintf ( B->seq_al[0], "%s", A->seq_al[a]); - sprintf ( B->name[0], "%s", A->name[a]); - sprintf(B->name[1], "%s", A->name[b]); - sprintf ( B->seq_al[1], "%s",A->seq_al[b]); - B->nseq=2; - sprintf ( fname, "%s_%s_%s.lib",pw_lib_saga_aln_name, A->name[a], A->name[b]); - - B->len_aln=strlen ( B->seq_al[0]); - ungap_aln (B); - output_clustal_aln (fname,B); - } - } - } -void output_pw_lib_saga_aln (char *pw_lib_saga_aln_name, Alignment *A ) - { - Alignment *B; - char fname[VERY_LONG_STRING]; - int a,b; - - B=declare_Alignment (NULL); - - B->nseq=2; - - for ( a=0; a< A->nseq-1; a++) - { - for ( b=a+1; bnseq; b++) - { - sprintf ( B->seq_al[0], "%s", A->seq_al[a]); - sprintf ( B->name[0], "%s", A->name[a]); - sprintf(B->name[1], "%s", A->name[b]); - sprintf ( B->seq_al[1], "%s",A->seq_al[b]); - B->nseq=2; - sprintf ( fname, "%s_%s_%s.pw_lib_saga_aln",pw_lib_saga_aln_name, A->name[a], A->name[b]); - - B->len_aln=strlen ( B->seq_al[0]); - ungap_aln (B); - output_clustal_aln (fname,B); - } - } - } -void output_lalign_header( char *name, Alignment *A) - { - FILE *fp; - - fp=vfopen ( name, "w"); - fprintf ( fp, " Lalign mode: best local alignments between two sequences\n"); - fprintf ( fp, " %s(%s) [%s]\n\n", VERSION, DATE, URL); - fprintf ( fp, " Comparison of:\n(A) %s\t%s\t-%d aa\n", (A->S)->file[A->order[0][0]],(A->S)->name[A->order[0][0]], (A->S)->len[A->order[0][0]]); - fprintf ( fp, "(B) %s\t%s\t-%d aa\n", (A->S)->file[A->order[1][0]],(A->S)->name[A->order[1][0]], (A->S)->len[A->order[1][0]]); - - - vfclose ( fp); - return; - } -void output_stockholm_aln (char *file, Alignment *A, Alignment *ST) -{ - FILE *fp; - int a,b,l; - - for (a=0; anseq; a++) - for (b=0; blen_aln; b++) - if (A->seq_al[a][b]==STOCKHOLM_CHAR)A->seq_al[a][b]='.'; - - fp=vfopen (file, "w"); - fprintf ( fp, "# STOCKHOLM 1.0\n\n"); - output_generic_interleaved_aln (fp,A, 50, '.', NULL); - fprintf ( fp, "//\n"); - vfclose (fp); -} - -void output_glalign ( char *name, Alignment *B, Alignment *S) -{ - int a, b, g, s; - int naln=0; - FILE *fp; - int **nr; - B=B->A; - if ( B==NULL){return;} - - fp=vfopen (name, "w"); - fprintf (fp, "Format: GLALIGN_01 [Generated with %s ]\n", PROGRAM); - fprintf (fp, "#Each Line corresponds to a column\n"); - fprintf (fp, "#First column coresponds to first genome\n"); - fprintf (fp, "#Last Column gives the column reliability on a 0-9 scale\n"); - fprintf (fp, "#[-1] Indicates that the reliability was not evaluated\n"); - - fprintf (fp, "Genome List\n"); - for ( a=0; a< B->nseq; a++) - fprintf (fp, "\tGenome %s\n", B->name[a]); - fprintf (fp, "Alignment List\n"); - while (B) - { - fprintf (fp, "Alignment %d Len %d Score %d\n", ++naln, B->len_aln, S->score_aln); - nr=duplicate_int (B->order, -1, -1); - for ( a=0; a< B->len_aln; a++) - { - fprintf ( fp, "\t"); - for ( b=0; b< B->nseq; b++) - { - g=is_gap (B->seq_al[b][a]); - nr[b][1]+=1-g; - - if (g)fprintf (fp, "---- "); - else fprintf ( fp, "%4d ",nr[b][1]); - } - s=((S)?S->seq_al[S->nseq][a]:-1); - if (s==NO_COLOR_RESIDUE)s=-1; - fprintf ( fp,"[ %d ]",s); - fprintf ( fp, "\n"); - - } - free_int (nr, -1); - B=B->A; - S=S->A; - } - vfclose ( fp); -} -Alignment *input_conc_aln ( char *name, Alignment *IN) -{ - FILE *fp; - char *string, *p, *file; - Alignment *F=NULL,*A=NULL, *B=NULL; - - file=vtmpnam (NULL); - - string=file2string(name); - string=substitute ( string, "@", "!Protected!"); - string=substitute ( string, TC_REC_SEPARATOR, "@"); - strtok (string,"@"); - - - while ( (p=strtok (NULL,"@"))!=NULL) - { - char *buf; - buf=vcalloc ( strlen (p)+1, sizeof (char)); - sprintf (buf,"%s", p); - buf=substitute (buf,"!protected!", "@"); - - fp=vfopen (file, "w"); - fprintf ( fp, "%s",buf); - vfclose (fp); - vfree (buf); - - if ( is_aln (file)) - { - B=main_read_aln (file,NULL); - - if ( !A) - { - if (IN){copy_aln (B, IN);F=A=IN;} - else F=A=B; - } - else - { - A->A=B; - A=A->A; - } - } - } - - vfree (string); - return F; -} - -void output_conc_aln ( char *name, Alignment *B) -{ - FILE *fp; - int a; - - fp=vfopen (name, "w"); - fprintf (fp, "# CONC_MSF_FORMAT_01\n"); - while (B) - { - fprintf (fp, "%s\n", TC_REC_SEPARATOR); - for ( a=0; a< B->nseq; a++) - { - fprintf ( fp, ">%s\n%s\n", B->name[a], B->seq_al[a]); - } - B=B->A; - - } - vfclose (fp); -} - -void output_lalign ( char *name, Alignment *B) -{ - static int output_header; - - B=B->A; - if ( B==NULL){output_header=0;return;} - else if ( output_header==0) - { - output_lalign_header(name, B); - output_header=1; - } - while (B) - { - output_lalign_aln ( name, B); - B=B->A; - } -} -void output_lalign_aln ( char *name, Alignment *B) - { - int a, b, c,d=0, s=0; - char col; - - float tot=0; - float id=0; - - FILE *fp; - int max_len=0; - int line; - int *n_residues; - int res; - - - n_residues=vcalloc ( B->nseq+1, sizeof (int)); - for ( a=0; a< B->nseq; a++) - {if ( strlen (B->name[a])>max_len) - max_len= strlen ( (B->name[a])); - n_residues[a]=B->order[a][1]; - } - max_len=MAX(max_len+2, 16); - line=60; - - - - fp= vfopen ( name, "a"); - - for (a=0; a< B->len_aln; a++) - { - if ( !is_gap(B->seq_al[0][a]) && !is_gap(B->seq_al[1][a])) - { - tot++; - id+=(B->seq_al[0][a]==B->seq_al[1][a]); - } - } - - id=(id*100)/tot; - fprintf (fp, " %.1f%% identity in %d aa overlap; score: %d\n\n", id,(int)tot, B->score_aln); - - - for (a=0; alen_aln; a+=line) - {for (b=0; b<5; b++) - { - if ( b==0 || b==4) - { - if ( b==0)s=0; - if ( b==4)s=1; - fprintf (fp,"%-*s",max_len," "); - for (d=0,c=a;clen_aln;c++) - { - res=!is_gap ( B->seq_al[s][c]); - n_residues[s]+=res; - if ( (n_residues[s]%10)==0 && res && (c-a+4)name[s]); - for (c=a;clen_aln;c++) - { - if ( is_gap(B->seq_al[s][c]))fprintf (fp,"%c", '-'); - else - { - fprintf (fp, "%c", GET_CASE(B->residue_case, B->seq_al[s][c])); - } - } - fprintf (fp,"\n"); - } - else if ( b==2) - { - fprintf (fp,"%-*s",max_len," "); - for (c=a;clen_aln;c++) - { - col=analyse_aln_column (B, c); - if ( col=='*')col=':'; - else if ( col==':')col='.'; - else if ( col=='.')col=' '; - fprintf ( fp, "%c", col); - } - fprintf (fp,"\n"); - } - } - fprintf (fp,"\n"); - } - - fprintf (fp,"\n\n----------\n\n"); - vfree (n_residues); - vfclose ( fp); - } - - -/****************************************************************************************************/ -/*************************************UTIL *********************************************************/ -/**************************************************************************************************/ - - -/****************************************************************************************************/ -/*************************** *************************************/ -/*************************** PROCESSING *************************************/ -/*************************** *************************************/ -/*******************************************************************************************/ -/* */ -/* */ -/* THREADING */ -/***************************************************************************************** */ - -char *thread_aa_seq_on_dna_seq( char *s) - { - int l, b, c; - char *array; - - - l=strlen ( s); - array=vcalloc ( l*3 +1, sizeof (char)); - for ( b=0, c=0; b< l; b++, c+=3) - { - array[c]=s[b]; - array[c+1]='o'; - array[c+2]='o'; - } - array[c]='\0'; - return array; - } - -Alignment *thread_dnaseq_on_prot_aln (Sequence *S, Alignment *A) - { - Alignment *B=NULL; - int a, b, c, n, la, ls, ln, m; - - B=copy_aln ( A, B); - B=realloc_aln2 ( B, B->nseq, B->len_aln*3 +1); - - for ( n=0,a=0; a< A->nseq; a++) - { - for ( m=0,b=0; b< S->nseq; b++) - { - if (strm (A->name[a], S->name[b]) ) - { - m=1; - n++; - ungap ( S->seq[b]); - B->seq_al[a][0]='\0'; - for (la=0, ls=0, ln=0; la< A->len_aln; la++) - { - for (c=0; c< 3; c++) - B->seq_al[a][ls++]=(is_gap(A->seq_al[a][la]))?'-':S->seq[b][ln++]; - } - B->seq_al[a][ls]='\0'; - } - } - if ( m==0) - { - for (la=0, ls=0, ln=0; la< A->len_aln; la++) - { - - B->seq_al[a][ls++]=A->seq_al[a][la]; - B->seq_al[a][ls++]='-'; - B->seq_al[a][ls++]='-'; - } - } - } - - B->len_aln=strlen ( B->seq_al[0]); - return B; - } -void thread_seq_struc2aln ( Alignment *A, Sequence *ST) - { - int a, b, c,d; - int len, cons; - - for ( a=0; a< A->nseq; a++) - for ( b=0; b< ST->nseq; b++) - { - if ( strcmp ( A->name[a], ST->name[b])==0) - { - ungap (ST->seq[b]); - len=strlen(A->seq_al[a]); - for ( c=0, d=0; cseq_al[a][c]))A->seq_al[a][c]=ST->seq[b][d++]; - } - } - } - cons=name_is_in_list ("Cons", ST->name, ST->nseq, 100); - if ( cons!=-1 && A->len_aln==strlen ( ST->seq[cons])) - { - sprintf (A->name[A->nseq], "Cons"); - sprintf (A->seq_al[A->nseq],"%s", ST->seq[cons]); - A->nseq++; - } - } -void cache_id ( Alignment *A) - { - int a, b,n; - char r1, r2, r3; - - for ( a=0; a< A->len_aln; a++) - { - for ( b=0, n=0; b< A->nseq; b++)if ( !is_gap(A->seq_al[b][a]))n++; - for ( b=0; b< A->nseq; b++) - if ( !is_gap(A->seq_al[b][a]) && n==A->nseq)A->seq_al[b][a]='h'; - else if( !is_gap(A->seq_al[b][a]))A->seq_al[b][a]='x'; - } - for ( a=0; a< A->nseq; a++) - { - for ( b=1; b< A->len_aln-1; b++) - { - r1=A->seq_al[a][b-1]; - r2=A->seq_al[a][b]; - r3=A->seq_al[a][b+1]; - if (r2=='h') - { - if ( (r1=='h' || r1=='b') && (r3=='h' || r3=='b'))A->seq_al[a][b]='h'; - else A->seq_al[a][b]='b'; - } - } - for ( b=1; b< A->len_aln-1; b++)if ( A->seq_al[a][b]=='b')A->seq_al[a][b]='x'; - } - - } - - -/*******************************************************************************************/ -/* */ -/* */ -/* PROCESING OF EST */ -/* */ -/***************************************************************************************** */ -int process_est_sequence ( Sequence *S, int *cluster_list) - { - char **inverted_seq; - int T=20; - int a, b; - int V1, V2; - int **sens; - int **a_sens; - int **best; - int *solution; - char buf [VERY_LONG_STRING]; - int n_clusters=0; - int n; - - sens=declare_int ( S->nseq,S->nseq); - a_sens=declare_int ( S->nseq,S->nseq); - best=declare_int ( S->nseq,S->nseq); - - - inverted_seq=vcalloc ( S->nseq, sizeof (char*)); - for ( a=0; anseq; a++) - inverted_seq[a]=invert_seq ( S->seq[a]); - - for ( a=0; a< S->nseq-1; a++) - { - - for ( b=a+1; bnseq; b++) - { - - V1=sens[a][b]=sens[b][a]=get_best_match ( S->seq[a], S->seq[b]); - V2=a_sens[a][b]=a_sens[b][a]=get_best_match ( S->seq[a],inverted_seq[b]); - best[a][b]=best[b][a]=(V1>V2)?V1:V2; - } - } - solution=SHC ( S->nseq, a_sens, sens); - - - for ( a=0; anseq; a++)cluster_list[a]=-1; - for ( a=0; anseq; a++) - { - n=search_for_cluster (a, n_clusters, cluster_list, T, S->nseq, best); - if ( n>0)n_clusters++; - } - fprintf ( stderr, "\nTHERE %s %d Independant Cluster(s) in your sequences",(n_clusters>1)?"are":"is",(n_clusters)); - for (a=0; anseq; b++) - { - if ( cluster_list[b]==a)fprintf ( stderr, "%s ", S->name[b]); - } - } - - for ( a=0; anseq; a++) - { - if ( solution[a]==-1) - { - S->seq[a]=inverted_seq[a]; - sprintf ( buf, "i_%s", S->name[a]); - sprintf ( S->name[a], "%s", buf); - } - } - return n_clusters; - } - -int search_for_cluster ( int seq, int cluster_number, int *cluster_list, int T, int nseq, int **S) - { - int n=0,a; - - if (cluster_list[seq]==-1) - { - cluster_list[seq]=cluster_number; - n++; - } - for ( a=0; aT) - { - n++; - cluster_list[a]=cluster_number; - n+=search_for_cluster ( a, cluster_number, cluster_list, T, nseq, S); - } - } - return n; - } - -int * SHC ( int nseq, int **NST, int **ST) - { - int a; - int mut; - int score, new_score; - int N_IT=VERY_LONG_STRING; - int *sol; - int count; - - sol=vcalloc ( nseq, sizeof (int)); - for ( a=0; a49)?1:-1; - - score=evaluate_sol (sol, nseq, ST, NST); - fprintf ( stderr, "\nI_Score=%d\n", score); - N_IT=N_IT*nseq; - - for ( count=0,a=0; a< N_IT && scorescore) - { - score=new_score; - } - else if ( (addrand ((unsigned long)VERY_LONG_STRING))>score) - { - score=new_score; - } - else - sol[mut]=sol[mut]*-1; - if ( count==VERY_LONG_STRING) - { - count=0; - fprintf ( stderr, "\nScore=%d", score); - } - } - fprintf ( stderr, "\nScore=%d\n", score); - return sol; - } - -int mutate_sol (int *sol, int nseq) - { - int n; - n=addrand ((unsigned long)nseq); - sol[n]=sol[n]*-1; - return n; - } -int evaluate_sol ( int *sol, int nseq, int **ST, int **NST) - { - static int max_score; - int a, b, score=0; - - if ( max_score==0) - { - for ( a=0; aNST[a][b])?ST[a][b]:NST[a][b]; - } - } - - for ( a=0; al2)?l1:l2; - m=declare_int (ml, ml); - } - else if ( (mll2)?l1:l2; - m=declare_int (ml, ml); - } - - for ( a=0; abest)?mdiag[a][0]:best; - - return best; - } - -int** extract_m_diag_streches ( int ** m, int l1, int l2,char *seq1, char *seq2, int *n_mdiag) - { - - int b, x, y, s1, s2; - static int **mdiag; - int in; - static int max_diag=VERY_LONG_STRING; - - /* - diag[0]=len; - diag[1]=x_start; - diag[2]=y_start; - diag[3]=x_end; - diag[4]=y_end; - */ - - if ( mdiag==NULL) - mdiag=declare_int ( max_diag, 5); - - for ( s1=l1-1, s2=0;s20) - { - if (in==1) - mdiag[n_mdiag[0]][0]++; - else - { - mdiag[n_mdiag[0]][0]=1; - mdiag[n_mdiag[0]][1]=x; - mdiag[n_mdiag[0]][2]=y; - in=1; - } - } - else - if (in==1) - { - in=0; - mdiag[n_mdiag[0]][3]=x-1; - mdiag[n_mdiag[0]][4]=y-1; - if ( !is_strech ( "ta", seq1, seq2,mdiag[n_mdiag[0]][0], mdiag[n_mdiag[0]][1],mdiag[n_mdiag[0]][2]))n_mdiag[0]++; - } - if (n_mdiag[0]==(max_diag-1)) - {mdiag=vrealloc (mdiag, (max_diag+VERY_LONG_STRING)*sizeof (int*)); - for ( b=max_diag; bT)return 1; - } - return 0; - } - - -/************************************************************************************/ -/* */ -/* STRUC */ -/* */ -/* */ -/************************************************************************************/ - -char * oneletaa2threeletaa(char aa); -float aa2property (char aa, char *mode); - -int output_seq2struc(char *outfile, Alignment *A) -{ - FILE *fp1, *fp2; - int a,c, l; - float v, h, x, y, z, dx, dy, dz; - char *s; - char *tmpfile1, *tmpfile2; - char command[1000]; - - tmpfile1=vtmpnam(NULL); - tmpfile2=vtmpnam(NULL); - - ungap (A->seq_al[0]); - s=A->seq_al[0];l=strlen (s); - fp1=vfopen (tmpfile1, "w"); - - x=y=z=0; - for ( a=0; a< l; a++) - { - h=aa2property ( s[a], "doolittle" ); - v=aa2property (s[a], "volume"); - /*14.398907: peptide bond length*/ - dx=(float)sqrt ((double)(14.398907/(((h*h)/(v*v))+1))); - dy=dx*(h/v); - dz=0; - - - x+=dx; - y+=dy; - z+=dz; - fprintf (fp1, "ATOM%7d CA %s A%4d%12.3f%8.3f%8.3f 1.00 5.30\n",a+1, oneletaa2threeletaa(s[a]),a+1, x, y, z); - } - vfclose (fp1); - sprintf ( command, "extract_from_pdb -infile %s -force > %s", tmpfile1, tmpfile2); - my_system (command); - fp1=vfopen (tmpfile2, "r"); - fp2=vfopen (outfile, "w"); - - while ( (c=fgetc(fp1))!=EOF)fprintf (fp2, "%c", c); - vfclose (fp1); - vfclose (fp2); - - return 0; -} - -char * oneletaa2threeletaa(char aa) - { - aa=tolower (aa); - if ( aa=='a')return "ALA"; - else if ( aa=='r') return "ARG"; - else if ( aa=='n') return "ASN"; - else if ( aa=='d') return "ASP"; - else if ( aa=='c') return "CYS"; - else if ( aa=='q') return "GLN"; - else if ( aa=='e') return "GLU"; - else if ( aa=='g') return "GLY"; - else if ( aa=='h') return "HIS"; - else if ( aa=='i') return "ILE"; - else if ( aa=='l') return "LEU"; - else if ( aa=='k') return "LYS"; - else if ( aa=='m') return "MET"; - else if ( aa=='f') return "PHE"; - else if ( aa=='p') return "PRO"; - else if ( aa=='s') return "SER"; - else if ( aa=='t') return "THR"; - else if ( aa=='w') return "TRP"; - else if ( aa=='y') return "TYR"; - else if ( aa=='v') return "VAL"; - else - { - fprintf ( stderr, "\nERROR: %c is not an amino acid [FATAL::aa2hydropathy::%s]", aa, PROGRAM); - myexit (EXIT_FAILURE); - return NULL; - } - return NULL; - } - -float aa2property (char aa, char *mode) - { - if ( mode==NULL || strm (mode, "doolittle")) - { - aa=tolower (aa); - if ( aa=='i')return 4.5; - else if ( aa=='v') return 4.2; - else if ( aa=='l') return 3.8; - else if ( aa=='f') return 2.8; - else if ( aa=='c') return 2.5; - else if ( aa=='m') return 1.9; - else if ( aa=='a') return 1.8; - else if ( aa=='g') return -0.4; - else if ( aa=='t') return -0.7; - else if ( aa=='w') return -0.9; - else if ( aa=='s') return -0.8; - else if ( aa=='y') return -1.3; - else if ( aa=='p') return -1.6; - else if ( aa=='h') return -3.2; - else if ( aa=='e') return -3.5; - else if ( aa=='q') return -3.5; - else if ( aa=='d') return -3.5; - else if ( aa=='n') return -3.5; - else if ( aa=='k') return -3.9; - else if ( aa=='r') return -4.5; - else - { - fprintf ( stderr, "\nERROR: %c is not an amino acid [FATAL::aa2hydropathy::%s]", aa, PROGRAM); - myexit (EXIT_FAILURE); - } - } - else if (strm (mode, "volume")) - { - aa=tolower (aa); - if ( aa=='a')return 0.915; - else if ( aa=='r') return 2.02; - else if ( aa=='n') return 1.35; - else if ( aa=='d') return 1.24; - else if ( aa=='c') return 1.18; - else if ( aa=='q') return 1.61; - else if ( aa=='e') return 1.55; - else if ( aa=='g') return 0.66; - else if ( aa=='h') return 1.67; - else if ( aa=='i') return 1.69; - else if ( aa=='l') return 1.68; - else if ( aa=='k') return 1.71; - else if ( aa=='m') return 1.70; - else if ( aa=='f') return 2.03; - else if ( aa=='p') return 1.29; - else if ( aa=='s') return 0.99; - else if ( aa=='t') return 1.22; - else if ( aa=='w') return 2.37; - else if ( aa=='y') return 2.03; - else if ( aa=='v') return 1.41; - else - { - fprintf ( stderr, "\nERROR: %c is not an amino acid [FATAL::aa2hydropathy::%s]", aa, PROGRAM); - myexit (EXIT_FAILURE); - } - } - - else - { - fprintf ( stderr, "\nERROR: %s is an unknown mode [FATAL::aa2hydropathy::%s]", mode , PROGRAM); - myexit (EXIT_FAILURE); - } - return 0; - } - - - - - -/************************************************************************************/ -/* */ -/* DNA */ -/* */ -/* */ -/************************************************************************************/ - -Alignment *code_dna_aln (Alignment *A) - { - int a, b,l,r; - - for ( a=0; a< A->nseq; a++) - { - for (l=0, b=0; b< A->len_aln; b++) - { - r=A->seq_al[a][b]; - if ( r=='-')l++; - else if ( r=='~')continue; - else if ( r=='.')l++; - else if ( !islower(r))A->seq_al[a][b]='4'; - else - { - A->seq_al[a][b]=(l+3)%3+'0'; - l++; - } - } - } - return A; - } - - -Alignment *back_translate_dna_aln (Alignment *A) - { - /*Given a set of aligned sequences - starts from left to right - 1 aa->3 nuc - ambiguities are randomly resolved. - returns the corresponding amino acid alignment - */ - int a; - char *seq ; - - ungap_aln(A); - A=realloc_aln (A, 10000); - seq=vcalloc ( 10000, sizeof (char)); - - - for ( a=0; a< A->nseq; a++) - { - seq=back_translate_dna_seq (A->seq_al[a], seq, RANDOM); - sprintf ( A->seq_al[a], "%s", seq); - } - A->len_aln=A->len_aln*3; - compress_aln (A); - vfree (seq); - return A; - } -char * back_translate_dna_seq ( char *in_seq,char *out_seq, int mode) - { - int a,len; - - len=strlen(in_seq); - - if (out_seq==NULL)out_seq=vcalloc ( len*3+1, sizeof (char)); - - out_seq[0]='\0'; - for (a=0; atype, "DNA") && !strm (S->type, "RNA")) printf_exit (EXIT_FAILURE, stderr, "Sequences should be *RNA* type [FATAL:%s]\n", PROGRAM); - for ( a=0; anseq; a++) - { - for (b=0; bseq[a]); b++) - { - if ( S->seq[a][b]=='u') S->seq[a][b]='t'; - if ( S->seq[a][b]=='U') S->seq[a][b]='T'; - } - HERE ("%s", S->seq[a]); - } - return S; -} -Sequence *dna_seq2rna_seq (Sequence *S) -{ - int a, b; - - if ( !strm(S->type, "DNA") && !strm (S->type, "RNA")) printf_exit (EXIT_FAILURE, stderr, "Sequences should be *DNA* type (type=%s) [FATAL:%s]\n", PROGRAM, S->type); - for ( a=0; anseq; a++) - for (b=0; blen[a]; b++) - { - if ( S->seq[a][b]=='t') S->seq[a][b]='u'; - if ( S->seq[a][b]=='T') S->seq[a][b]='U'; - } - return S; -} - - - -int get_longest_frame (char *seq, int mode); -Alignment *translate_dna_aln (Alignment *A, int frame) - { - /*Given a set of aligned sequences - starts from left to right - 3 nuc->1 aa - 2nuc+1gap, 1nuc+2gap->3 gaps - 1 stop-> 3gaps - returns the corresponding amino acid alignment - */ - - - int a, b,r; - - - if (frame==3 || frame ==4) - { - - for (a=0; a< A->nseq; a++) - { - char *d, *buf, f; - d=A->seq_al[a]; - f=get_longest_frame (d,frame); - buf=vcalloc ( strlen (d)+1, sizeof (char)); - if ( f<3) - { - sprintf (buf, "%s", d+f); - sprintf (d, "%s", buf); - sprintf (A->seq_comment[a], " frame: %d", f); - } - else if ( f>=3) - { - f-=3; - sprintf ( buf, "%s", d); - buf=complement_string (buf); - sprintf (d, "%s",buf+f); - sprintf (A->seq_comment[a], " frame: %d Reverse Complement", f); - } - vfree (buf); - } - } - else - { - - for ( a=0; a< A->nseq; a++) - for (b=0; b< frame; b++) - A->seq_al[a][b]='-'; - ungap_aln(A); - } - - for ( b=0; b< A->nseq; b++) - for ( a=0; a< A->len_aln;) - { - - r=translate_dna_codon (A->seq_al[b]+a, 'z'); - if (is_gap(r)) - { - A->seq_al[b][a++]='-'; - A->seq_al[b][a++]='-'; - A->seq_al[b][a++]='-'; - } - else if ( r=='x') - { - A->seq_al[b][a++]='o'; - A->seq_al[b][a++]='-'; - A->seq_al[b][a++]='-'; - } - else if ( r=='z') - { - A->seq_al[b][a++]='x'; - A->seq_al[b][a++]='-'; - A->seq_al[b][a++]='-'; - } - else - { - A->seq_al[b][a++]=r; - A->seq_al[b][a++]='-'; - A->seq_al[b][a++]='-'; - } - } - compress_aln (A); - - return A; - } - -int get_longest_frame (char *in_seq, int mode) -{ - char *prot, *seq; - int a; - int max_l=0, l; - int best_frame=0; - int nf; - - seq=vcalloc (strlen (in_seq)+1, sizeof (char)); - prot=vcalloc (strlen (in_seq)+1, sizeof (char)); - sprintf ( seq, "%s", in_seq); - - if ( mode == 3)nf=3; - else if ( mode == 4) nf=6; - - for (a=0; a=3)?a-3:a; - prot=translate_dna_seq ( seq,f,'\0', prot); - l=strlen (prot); - if (l>=max_l){max_l=l;best_frame=a;} - } - vfree (seq); - vfree (prot); - return best_frame; -} - -Alignment *clean_gdna_aln (Alignment *A) - { - int a, b, c, r1, r2,s, p, n, tn; - int *col; - static int **mat; - Alignment *T=NULL; - int **score; - char *buffer; - - - /*Viterbi Parameters*/ - int AL=0; /*Allowed Transition*/ - int F=-1000000; /*Forbiden Transition*/ - int SPLICE_PENALTY=100; - int ORF1=0, ORF2=1, ORF3=2, NC=3; - - int state, pstate, best_e, best_pstate_p,best_state_p, best_pstate_v, best_state_v, v; - int nstate=4; - int **transitions; - int e; - int **v_tab_p; - int **v_tab; - int * is_dna; - - best_state_p=best_state_v=best_pstate_p=best_pstate_v=best_e=0; - buffer=vcalloc ( 100000, sizeof (char)); - is_dna=vcalloc ( A->nseq, sizeof (int)); - score=declare_int ( A->nseq+1, A->len_aln); - - - if ( !mat)mat=read_matrice("pam250mt"); - T=copy_aln (A, T); - col=vcalloc ( A->nseq, sizeof (int)); - - for (a=0; a<= A->len_aln; a++) - for ( b=0; b< A->nseq; b++){A->seq_al[b][a]=tolower(A->seq_al[b][a]); A->seq_al[b][a]=(A->seq_al[b][a]=='t')?'u':A->seq_al[b][a];} - - for ( a=0; a< A->nseq; a++) - { - sprintf ( buffer, "%s", A->seq_al[a]); - ungap (buffer); - is_dna[a]=strm ( get_string_type (buffer), "DNA"); - } - - - for (a=0; a< A->len_aln-2; a++) - { - for (b=0; b< A->nseq; b++) - { - if (is_dna[b])col[b]=translate_dna_codon (A->seq_al[b]+a, 'x'); - else col[b]=tolower ( A->seq_al[b][a]); - } - - for (n=0,tn=0,b=0; b< A->nseq; b++) - for ( c=b; c< A->nseq; c++ ) - { - r1=col[b]; - r2=col[c]; - - if (r1=='x' || r2=='x'){score[A->nseq][a]=F;break;} - else if (r1=='-' && r2=='-'); - else if (r1=='-' || r2=='-'); - else - { - - if ( is_dna[b] && is_dna[c])score[A->nseq][a]+= mat[r1-'A'][r2-'A']; - else score[A->nseq][a]+=mat[r1-'A'][r2-'A']* (A->nseq*A->nseq); - } - n+=( !is_gap(r1) && !is_gap(r2)); - score[A->nseq][a]=(((tn!=0)?score[A->nseq][a]/tn:0)); - } - - } - - /*initialisation*/ - - transitions=declare_int ( nstate, nstate); - v_tab=declare_int ( A->len_aln+2, nstate ); - v_tab_p=declare_int ( A->len_aln+2, nstate ); - - for (a=0; anseq; s++) - { - for ( p=0; p<=A->len_aln; p++){for (state=0; state< nstate; state++)v_tab_p[p][state]=-1; } - for (p=1+2; p<= A->len_aln; p++) - { - - for (state=0; state< nstate; state++) - { - - if ( state==NC){e=-best_e;} - else - { - e=score[A->nseq][(p-1)-state]; - if ( state==0)best_e=e; - else best_e=MAX(e, best_e); - } - - for ( pstate=0; pstatebest_pstate_v) ) - { - best_pstate_v=v; - best_pstate_p=pstate; - } - } - - v_tab[p][state]=best_pstate_v; - v_tab_p[p][state]=best_pstate_p; - if (state==0 ||best_pstate_v>best_state_v ) - { - best_state_p=state; - best_state_v=best_pstate_v; - } - } - - } - - - - for (p=0; p< A->len_aln; p++)T->seq_al[s][p]='.'; - for (p=A->len_aln; p>0; p--) - { - - if ( best_state_p==0)T->seq_al[s][p-1]=translate_dna_codon (A->seq_al[s]+(p-1), 'x'); - else if ( best_state_p==1 || best_state_p==2)T->seq_al[s][p-1]='-'; - - - - best_state_p=v_tab_p[p][best_state_p]; - - } - } - - - - vfree (col); - return T; - } - -Alignment *clean_cdna_aln (Alignment *A) - { - /*Given an alignmnet of nucleotides - Returns the same alignmnent whith non coding nucleotides replaced with dots - - at each position, the emission probability is the sum of pair of the substitution of amino-acids - */ - - int a, b, c,s, p; - static int **mat; - int *emission; - float em1, em2; - char *buffer; - Alignment *B=NULL; - - - - - /*Viterbi Parameters*/ - int AL=0; /*Allowed Transition*/ - int F=-1000000; /*Forbiden Transition*/ - int PENALTY=30; - int NC, C1,C2, C3, START, END; - int nstate=0; - int state=0,best_state=0, score=0, best_score=0; - int p_state; - int e=0; - int **score_tab; - int **state_tab; - - int **transitions; - int n; - int r1, r2, r3; - - NC=nstate++; - C1=nstate++; - C2=nstate++; - C3=nstate++; - START=nstate++; - END=nstate++; - - - B=copy_aln (A, B); - buffer=vcalloc ( 100000, sizeof (char)); - emission=vcalloc (A->len_aln, sizeof (int)); - - if ( !mat) - { - mat=read_matrice("pam250mt"); - } - - /*Computation of the emission proba for the coding state*/ - - - for (a=0; a< A->len_aln; a++) - { - - /*First component: % occupancy of the column*/ - em1=0; - for ( b=0; b< A->nseq; b++) em1+=!is_gap(translate_dna_codon (A->seq_al[b]+a, '-')); - em1=em1/(float)A->nseq; - - /*Second Component: % similarity within column*/ - em2=0; - for (n=0,b=0; b< A->nseq-1; b++) - { - r1=translate_dna_codon (A->seq_al[b]+a, '-'); - - for (c=b+1; cnseq; c++) - { - r2=translate_dna_codon (A->seq_al[c]+a, '-'); - if (is_gap(r2) || is_gap(r1)); - else - { - n++; - em2+=((mat[r1-'A'][r2-'A'])>1)?1:0; - } - } - } - em2=em2/(float)((n==0)?1:n); - - - emission[a]=(em1*100); - - } - - - - /*initialisation*/ - - transitions=declare_int ( nstate, nstate); - score_tab=declare_int ( A->len_aln+2, nstate ); - state_tab=declare_int ( A->len_aln+2, nstate ); - - for (a=0; anseq; s++) - { - for ( p=0; p<=A->len_aln; p++){for (state=0; state< nstate; state++){score_tab[p][state]=F;state_tab[p][state]=-1;} } - score_tab[0][START]=0; - - for (p=1; p<= A->len_aln; p++) - { - for (state=0; state< nstate; state++) - { - if ( state==START || state==END)continue; - else if ( state==NC) e=-10; - else if ( state==C1) - { - e=emission[p-1]; - } - else if ( state ==C2) - { - if ( p-2<0)e=F; - else e=emission[p-2]; - } - else if ( state==C3) - { - if ( p-3<0)e=F; - else e=emission[p-3]; - } - - for (p_state=0; p_statebest_score){ best_score=score;best_state=p_state;} - - } - - score_tab[p][state]=best_score; - state_tab[p][state]=best_state; - - } - } - - best_score=best_state=UNDEFINED; - for (state=0; statebest_score) - { - best_score=score_tab[p-1][state]+e; - best_state=state; - } - - } - - for (p=A->len_aln; p>0;) - { - B->seq_al[s][p-1]=best_state+'0'; - best_state=state_tab[p][best_state]; - p--; - } - } - - for ( a=0; a< A->nseq; a++) - for ( b=0; b< A->len_aln;) - { - s=B->seq_al[a][b]; - if ( s==C1+'0') - { - r1=A->seq_al[a][b]; - r2=A->seq_al[a][b+1]; - r3=A->seq_al[a][b+2]; - - - if ( is_gap(r1) ||is_gap(r2) || is_gap(r3)) - { - A->seq_al[a][b]=(is_gap(r1))?'~':'.'; - A->seq_al[a][b+1]=(is_gap(r2))?'~':'.'; - A->seq_al[a][b+2]=(is_gap(r3))?'~':'.'; - } - b+=3; - } - else if ( s==NC+'0') - { - A->seq_al[a][b]=(is_gap(A->seq_al[a][b]))?'~':'.'; - b++; - } - else - { - fprintf (stderr, "\nPROBLEM: [%d %d]->%d", a, b, s-'0'); - } - } - - - free_aln (B); - free_int (transitions, -1); - free_int (score_tab, -1); - free_int (state_tab, -1); - vfree (emission); - vfree (buffer); - - return A; - } - - - - -Alignment *translate_splice_dna_aln (Alignment *A, Alignment *ST) - { - int a, b, c, r1, r2,s, p, n, tn; - int *col; - static int **mat; - Alignment *T=NULL; - int **score; - - /*Viterbi Parameters*/ - int AL=0; /*Allowed Transition*/ - int F=-1000000; /*Forbiden Transition*/ - int ORF1=0, ORF2=1, ORF3=2,SPL1=3, SPL2=4, SPL3=5, SPL4=6, NC=7; - int SPLICE_PENALTY; - int frame1, frame2, frame3, best_frame; - int nstate=8; - char r; - - - - int state=0, pstate=0, best_pstate_p=0,best_state_p=0, best_pstate_v=0, best_state_v=0, v=0; - - int **transitions; - int e=0; - int **v_tab_p; - int **v_tab; - - score=declare_int ( A->nseq+1, A->len_aln); - - - if ( !mat)mat=read_matrice("pam250mt"); - T=copy_aln (A, T); - col=vcalloc ( A->nseq, sizeof (int)); - - for (a=0; a<= A->len_aln; a++) - for ( b=0; b< A->nseq; b++){A->seq_al[b][a]=tolower(A->seq_al[b][a]); A->seq_al[b][a]=(A->seq_al[b][a]=='t')?'u':A->seq_al[b][a];} - - - - - for (a=0; a< A->len_aln-2; a++) - { - for (b=0; b< A->nseq; b++) - { - col[b]=translate_dna_codon (A->seq_al[b]+a, 'x'); - } - - for (n=0,tn=0,b=0; b< A->nseq-1; b++) - for ( c=b+1; c< A->nseq; c++, tn++ ) - { - r1=col[b]; - r2=col[c]; - - if (r1=='x' || r2=='x')score[A->nseq][a]=F; - else if (r1=='-' && r2=='-'); - else if (r1=='-' || r2=='-'); - else - { - score[A->nseq][a]+= mat[r1-'A'][r2-'A']; - - } - n+=( !is_gap(r1) && !is_gap(r2)); - } - score[A->nseq][a]=(((tn!=0)?score[A->nseq][a]/tn:0)); - - } - - /*initialisation*/ - - transitions=declare_int ( nstate, nstate); - v_tab=declare_int ( A->len_aln+2, nstate*nstate); - v_tab_p=declare_int ( A->len_aln+2, nstate*nstate); - - for (a=0; anseq; s++) - { - for ( p=0; p<=A->len_aln; p++){for (state=0; state< nstate; state++)v_tab_p[p][state]=-1; } - for (p=1+2; p<= A->len_aln; p++) - { - frame1=score[A->nseq][(p-1)]; - frame2=score[A->nseq][(p-1)-1]; - frame3=score[A->nseq][(p-1)-2]; - best_frame=best_int (3, 1, &a, frame1, frame2, frame3); - for (state=0; state< nstate; state++) - { - r=tolower (A->seq_al[s][p-1]); - r=(r=='u')?'t':r; - - if (state==ORF1)e=frame1; - else if (state==ORF2)e=frame2; - else if (state==ORF3)e=frame3; - else if (state==SPL1)e=(r=='g')?best_frame:F; - else if (state==SPL2)e=(r=='t')?best_frame:F; - else if (state==SPL3)e=(r=='a')?best_frame:F; - else if (state==SPL4)e=(r=='g')?best_frame:F; - else if (state==NC)e=-best_frame; - for ( pstate=0; pstatebest_pstate_v) ){best_pstate_v=v;best_pstate_p=pstate;} - } - - v_tab[p][state]=best_pstate_v; - v_tab_p[p][state]=best_pstate_p; - if (state==0 ||best_pstate_v>best_state_v ){best_state_p=state; best_state_v=best_pstate_v;} - } - } - - - - for (p=0; p< A->len_aln; p++)T->seq_al[s][p]='.'; - for (p=A->len_aln; p>0; p--) - { - if ( best_state_p==0)T->seq_al[s][p-1]=toupper(translate_dna_codon (A->seq_al[s]+(p-1), 'x')); - else if ( best_state_p>=SPL1 && best_state_p<=SPL4)T->seq_al[s][p-1]='-'; - best_state_p=v_tab_p[p][best_state_p]; - } - } - - - - vfree (col); - return T; - } - -Alignment * mutate_cdna_aln ( Alignment *A) -{ - int a, b, c, n; - int n1, n2, r1, r2; - int **pos, ps; - int neutral_substitution=50; - int random_substitution=0; - int random_deletion=0; - int amino_acid_deletion=0; - int amino_acid_substitution=0; - char nuc_list[]="agct"; - char *new_codon; - - neutral_substitution=atoi(get_env_variable ("NEUTRAL_SUBSTITUTION",IS_FATAL)); - random_substitution =atoi(get_env_variable ("RANDOM_SUBSTITUTION", IS_FATAL)); - random_deletion =atoi(get_env_variable ("RANDOM_DELETION", IS_FATAL)); - amino_acid_deletion =atoi(get_env_variable ("AMINO_ACID_DELETION", IS_FATAL)); - amino_acid_substitution =atoi(get_env_variable ("AMINO_ACID_SUBSTITUTION", IS_FATAL)); - - - if (A->S)free_sequence ( A->S, (A->S)->nseq); - A->S=aln2seq(A); - - addrandinit(time (NULL)); - - - pos=aln2pos_simple ( A, A->nseq); - - /* 1 Apply neutral substitutions */ - - if ( neutral_substitution) - { - for ( c=0; c< neutral_substitution; c++) - { - for ( a=0; a< A->nseq; a++) - { - - for ( b=0; b< A->len_aln; b++) - { - - if (pos[a][b]<=0)continue; - ps=MAX(0,pos[a][b]-(pos[a][b]-1)%3-1); - - - n1=(A->S)->seq[a][pos[a][b]-1]; - r1=translate_dna_codon ( (A->S)->seq[a]+ps, 'o'); - - n2=nuc_list[(int)addrand((unsigned long) 4)]; - (A->S)->seq[a][pos[a][b]-1]=n2; - r2=translate_dna_codon ( (A->S)->seq[a]+ps, 'o'); - - - if ( r1==r2 && r1!='o')A->seq_al[a][b]=n2; - - else (A->S)->seq[a][pos[a][b]-1]=n1; - } - } - } - } - - /* 2 Apply substitutions */ - if ( random_substitution) - { - for ( a=0; a< A->nseq; a++) - { - for ( b=0; b< A->len_aln; b++) - { - if (pos[a][b]<=0)continue; - if (addrand ((unsigned long) 100)>random_substitution)continue; - - n1=nuc_list[(int)addrand((unsigned long)4)]; - (A->S)->seq[a][pos[a][b]-1]=n1; - A->seq_al[a][b]=n1; - } - } - } - - /* 3 Apply amino acid substitutions */ - if ( amino_acid_substitution) - { - for ( a=0; a< A->nseq; a++) - { - for ( b=0; b< A->len_aln; b+=3) - { - if (pos[a][b]<=0)continue; - if (addrand ((unsigned long) 100)>amino_acid_substitution)continue; - ps=MAX(0,pos[a][b]-(pos[a][b]-1)%3-1); - - r1=translate_dna_codon ( (A->S)->seq[a]+ps, 'o'); - new_codon=mutate_amino_acid(r1, "clustalw_col"); - - for ( c=ps; cS)->seq[a][c]=new_codon[c-ps]; - } - for ( b=0; b< A->len_aln; b++) - { - if (pos[a][b]<=0)continue; - else A->seq_al[a][b]=(A->S)->seq[a][pos[a][b]-1]; - } - } - } - /* 3 Apply amino acid deletions */ - if ( amino_acid_deletion) - { - for ( a=0; a< A->nseq; a++) - { - for ( b=0; b< A->len_aln; b+=3) - { - if (pos[a][b]<=0)continue; - if (addrand ((unsigned long) 1000)>amino_acid_deletion)continue; - ps=MAX(0,pos[a][b]-(pos[a][b]-1)%3-1); - n=addrand ((unsigned long) 4)+1; - - for ( c=ps; clen_aln; c++)(A->S)->seq[a][c]='-'; - } - for ( b=0; b< A->len_aln; b++) - { - if (pos[a][b]<=0)continue; - else A->seq_al[a][b]=(A->S)->seq[a][pos[a][b]-1]; - } - } - } - /* 4 Apply amino acid insertions */ - -/*FRAMESHIFT MUTATIONS*/ - /* 5 Apply nucleotide deletions*/ - if ( random_deletion) - { - for ( a=0; a< A->nseq; a++) - { - for ( b=0; b< A->len_aln; b++) - { - if (pos[a][b]<=0)continue; - if (addrand ((unsigned long) 1000)>random_deletion)continue; - - n1='-'; - (A->S)->seq[a][pos[a][b]-1]=n1; - A->seq_al[a][b]=n1; - } - } - } - /* 6 Apply nucleotide deletions*/ - free_int (pos, -1); - return A; - -} - -Alignment* clean_est ( Alignment *A) - { - /*Rules are as follow: - Internal Gap > 30% Requences ----> - - Best Residue < 50% Residues ----> 'N' - */ - int a, b,c; - int best; - int tot; - - for ( a=0; a< A->len_aln; a++) - { - - for (tot=0, b=0; b<4; b++)tot+=(A->P)->count[b][a]; - best=best_int (5,1, &c, (A->P)->count[0][a],(A->P)->count[1][a],(A->P)->count[2][a],(A->P)->count[3][a],(A->P)->count[4][a]); - - if ( tot==0) - { - fprintf ( stderr, "\nWARNING: POSITION WITH NO INFORMATION [clean_est:%s]", PROGRAM); - A->seq_al[0][a]='-'; - } - else if (((A->P)->count[4][a]*100)/tot >30)A->seq_al[0][a]='-'; - else if ( (best*100)/tot<50)A->seq_al[0][a]='n'; - - } - return A; - } - - - -char **make_symbols ( char *name, int *n) - { - char **symbol; - - symbol=declare_char ( STRING, STRING); - - if ( strcmp (name, "3d_ali")==0) - { - sprintf ( symbol[0], "gih"); - sprintf ( symbol[1], "eb"); - sprintf ( symbol[2], "x"); - sprintf ( symbol[3], "#l"); - n[0]=4; - } - - else if ( strcmp (name, "all")==0) - { - int a, i; - for ( i=0,a=0; a<26; a++) - { - sprintf ( symbol[i++], "%c%c", 'a'+a, 'a'+a); - sprintf ( symbol[i++], "%c%c", 'A'+a, 'A'+a); - } - sprintf ( symbol[i++], "--"); - n[0]=i; - } - - else if ( strcmp (name, "set1")==0) - { - sprintf ( symbol[0], "ilvmfywhktcagH"); - sprintf ( symbol[1], "reqdnsP"); - sprintf ( symbol[2], "--"); - sprintf ( symbol[3], "#l"); - n[0]=4; - } - else if ( strcmp (name, "set2")==0) - { - n[0]=0; - sprintf ( symbol[n[0]++], "gsacT"); - sprintf ( symbol[n[0]++], "ndtvpS"); - sprintf ( symbol[n[0]++], "ilkreqL"); - sprintf ( symbol[n[0]++], "--"); - sprintf ( symbol[n[0]++],"#l"); - } - else if ( strcmp ( name, "any")==0) - { - sprintf ( symbol[0], "*x"); - n[0]=1; - } - - - - - return symbol; - } - -char * translate_dna_seq_on3frame ( char *dna_seq, char stop, char *prot) - { - int a, l; - char *buf; - - l=strlen (dna_seq); - if ( prot==NULL)prot=vcalloc ( l+2, sizeof (char)); - - buf=vcalloc (l+4, sizeof (char)); - sprintf (buf, "%s", dna_seq); - lower_string ( buf); - for ( a=0; a< l; a++)buf[a]=(buf[a]=='t')?'u':buf[a]; - - for (a=0; a< l; a++) - prot[a]=translate_dna_codon (buf+a, stop); - vfree (buf); - prot[a]='\0'; - - return prot; - } -char * translate_dna_seq ( char *dna_seq, int frame, char stop, char *prot) - { - int a, b, l; - char *buf; - - l=strlen (dna_seq); - if ( prot==NULL)prot=vcalloc ( l/3 +2, sizeof (char)); - - buf=vcalloc (l+4, sizeof (char)); - sprintf (buf, "%s", dna_seq); - lower_string ( buf); - for ( a=0; a< l; a++)buf[a]=(buf[a]=='t')?'u':buf[a]; - - for ( b=0,a=0+frame; a< l; a+=3,b++) - prot[b]=translate_dna_codon (buf+a, stop); - vfree (buf); - prot[b]='\0'; - - return prot; - } -char * back_translate_dna_codon ( char aa, int deterministic) - { - static char *r; - int choice; - - vsrand(0); - if ( r==NULL)r=vcalloc (4, sizeof (char)); - - if (!is_gap(aa))aa=tolower(aa); - - if (is_gap(aa))sprintf (r, "---"); - else if ( aa>=0 && aa<=9) - { - sprintf (r, "%d%d%d", aa, aa,aa); - } - else if ( aa>='0' && aa<='9') - { - sprintf (r, "%c%c%c", aa, aa,aa); - } - else if ( aa=='a') - { - choice=(deterministic)?0:rand()%4; - if ( choice==0)sprintf (r, "gca"); - else if ( choice==1)sprintf (r, "gcg"); - else if ( choice==2)sprintf (r, "gcc"); - else if ( choice==3)sprintf (r, "gct"); - } - else if ( aa=='c') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0)sprintf (r, "tgc"); - else if ( choice==1)sprintf (r, "tgt"); - } - else if ( aa=='d') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0)sprintf (r, "gac"); - else if ( choice==1)sprintf (r, "gat"); - } - - else if ( aa=='e') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0)sprintf (r, "gaa"); - else sprintf (r, "gag"); - } - else if ( aa=='f') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0)sprintf (r, "ttc"); - else sprintf (r, "ttt"); - } - else if ( aa=='g') - { - choice=(deterministic)?0:rand()%4; - if ( choice==0) sprintf (r, "gga"); - else if ( choice==1) sprintf (r, "ggg"); - else if ( choice==2) sprintf (r, "ggc"); - else if ( choice==3) sprintf (r, "ggt"); - } - else if ( aa=='h') - { - choice =rand()%2; - if ( choice==0)sprintf (r, "cac"); - else sprintf (r, "cat"); - } - else if ( aa=='i') - { - choice=(deterministic)?0:rand()%3; - if ( choice==0) sprintf (r, "ata"); - else if ( choice==1) sprintf (r, "atc"); - else if ( choice==2) sprintf (r, "att"); - } - else if ( aa=='k') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0) sprintf (r, "aaa"); - else if ( choice==1) sprintf (r, "aag"); - - } - else if ( aa=='l') - { - choice=(deterministic)?0:rand()%6; - if ( choice==0) sprintf (r, "cta"); - else if ( choice==1) sprintf (r, "ctg"); - else if ( choice==2) sprintf (r, "ctc"); - else if ( choice==3) sprintf (r, "ctt"); - else if ( choice==4) sprintf (r, "tta"); - else if ( choice==5) sprintf (r, "ttg"); - } - else if ( aa=='m')sprintf ( r, "atg"); - else if ( aa=='n') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0) sprintf (r, "aac"); - else if ( choice==1) sprintf (r, "aat"); - } - else if ( aa=='p') - { - choice=(deterministic)?0:rand()%4; - if ( choice==0) sprintf (r, "cca"); - else if ( choice==1) sprintf (r, "ccg"); - else if ( choice==2) sprintf (r, "ccc"); - else if ( choice==3) sprintf (r, "cct"); - } - else if ( aa=='q') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0) sprintf (r, "caa"); - else if ( choice==1) sprintf (r, "cag"); - } - else if ( aa=='r') - { - choice=(deterministic)?0:rand()%6; - if ( choice==0) sprintf (r, "cga"); - else if ( choice==1) sprintf (r, "cgg"); - else if ( choice==2) sprintf (r, "cgc"); - else if ( choice==3) sprintf (r, "cgt"); - else if ( choice==4) sprintf (r, "aga"); - else if ( choice==5) sprintf (r, "agg"); - - } - else if ( aa=='s') - { - choice=(deterministic)?0:rand()%6; - if ( choice==0) sprintf (r, "tca"); - else if ( choice==1) sprintf (r, "tcg"); - else if ( choice==2) sprintf (r, "tcc"); - else if ( choice==3) sprintf (r, "tct"); - else if ( choice==4) sprintf (r, "agt"); - else if ( choice==5) sprintf (r, "agc"); - - } - else if ( aa=='t') - { - choice=(deterministic)?0:rand()%4; - if ( choice==0) sprintf (r, "aca"); - else if ( choice==1) sprintf (r, "acg"); - else if ( choice==2) sprintf (r, "acc"); - else if ( choice==3) sprintf (r, "act"); - } - else if ( aa=='v') - { - choice=(deterministic)?0:rand()%4; - if ( choice==0) sprintf (r, "gta"); - else if ( choice==1) sprintf (r, "gtg"); - else if ( choice==2) sprintf (r, "gtc"); - else if ( choice==3) sprintf (r, "gtt"); - } - else if ( aa=='w') - { - sprintf (r, "tgg"); - } - else if ( aa=='y') - { - choice=(deterministic)?0:rand()%2; - if ( choice==0) sprintf (r, "tac"); - else if ( choice==1) sprintf (r, "tat"); - } - else - { - sprintf (r, "nnn"); - } - return r; - - } -int translate_dna_codon ( char *sequence, char stop) - { - char seq[4]; - int a,b; - - - if ( (b=strlen (sequence))<3) - { - for ( a=0; atype, "DNA") || strm(S->type, "RNA"))sprintf (alp, "AGCT"); - else if ( strm(S->type, "PROTEIN"))sprintf (alp, "ACDEFGHIKLMNPQRSTVWY"); - - alp_size=strlen(alp); - - B=copy_aln (A,NULL); - B=realloc_aln(B, B->len_aln*2+1); - - for ( a=0, b=0; a< A->len_aln; a++, b+=2) - { - for ( c=0; c< A->nseq; c++) - { - B->seq_al[c][b]=tolower(A->seq_al[c][a]); - B->seq_al[c][b+1]='~'; - } - } - - for ( c=0; c< A->nseq; c++)B->seq_al[c][b]='\0'; - B->len_aln=A->len_aln*2; - - - - tot=n_mut=0; - for (a=0; a< B->len_aln; a+=2) - for ( b=0; bnseq; b++) - { - if ( is_gap(B->seq_al[b][a]))continue; - mut=((rand()%RAND_MAX)>ratio)?0:1; - tot++; - n_mut+=mut; - - if (mut) - { - type=rand()%2; - if (type==0)/*deletion*/ - { - B->seq_al[b][a]='.'; - } - else if ( type==1) - { - B->seq_al[b][a+1]=alp[rand()%alp_size]; - } - else if (type==2) - { - B->seq_al[b][a]=alp[rand()%alp_size]; - } - - } - } - ungap_aln (B); - - - free_sequence (S, S->nseq); - free_aln (A); - return B; - -} - -char* mutate_amino_acid ( char aa, char *mode) - - { - int a, b, c, d; - char nucleotide[]="agct"; - char amino_acid[]="acdefghiklmnpqrstvwy"; - static char **triplet; - static char **cw_col; - int ng_cw_col; - static int **amino_acid_list; - static int *lu; - char a1, a2; - char *mat; - - aa=tolower(aa); - declare_name(mat); - if ( !mode)sprintf (mat, "clustalw_col"); - else sprintf (mat, "%s", mode); - if (!triplet) - { - triplet=declare_char ( 64, 4); - for (d=0, a=0; a< 4;a++) - for ( b=0; b< 4; b++) - for ( c=0; c< 4; c++, d++) - { - triplet[d][0]=nucleotide[a]; - triplet[d][1]=nucleotide[b]; - triplet[d][2]=nucleotide[c]; - } - } - if ( !cw_col)cw_col=make_group_aa ( &ng_cw_col,mat); - if ( !amino_acid_list) - { - amino_acid_list=declare_int ( 20, 65); - for ( a=0; a< 20; a++) - for ( b=0; b< 64; b++) - { - a1=translate_dna_codon ( triplet[b], 'x'); - a2=amino_acid[a]; - for ( d=0; d< ng_cw_col; d++) - if ( is_in_set ( a1, cw_col[d]) && is_in_set ( a2, cw_col[d])) - { - amino_acid_list[a][++amino_acid_list[a][0]]=b; - } - } - lu=vcalloc ( 26, sizeof (int)); - for ( a=0; a<20; a++) - { - lu[amino_acid[a]-'a']=a; - } - /* - for ( a=0; a< 20; a++) - { - fprintf ( stderr, "\n%c", amino_acid[a]); - for ( b=1; b<=amino_acid_list[a][0]; b++) - fprintf ( stderr, "\n\t%s %c", triplet[amino_acid_list[a][b]], translate_dna_codon (triplet[amino_acid_list[a][b]], 'x')); - } - */ - } - - return triplet [addrand((unsigned long)amino_acid_list[lu[aa-'a']][0])+1]; - } - -/**************************************************************************************************/ -/******************************** ********************************************/ -/******************************** PROCESSING ********************************************/ -/******************************** ********************************************/ - - - -void modify_data (Sequence_data_struc *D1in, Sequence_data_struc *D2in, Sequence_data_struc *DSTin, char **action_list,int n_actions, Action_data_struc *RAD) - { - Sequence *COOR=NULL, *NS=NULL,*BUFS=NULL, *OUT_S=NULL; - Constraint_list *CL; - char *s; - int value,upper_value, lower_value, start, end, a, b,c; - int *count_table=NULL; - char *action; - Sequence_data_struc *D1; - Sequence_data_struc *D2; - Sequence_data_struc *DST; - int s1, s2, r1, r2; - static int clean_flag; - Alignment *BUF; - - /*Switches*/ - - action=action_list[0]; - - if (action[0]=='2') - { - - D1=D2in; - D2=D1in; - DST=DSTin; - action++; - } - else if ( action[0]=='1') - { - D1=D1in; - D2=D2in; - DST=DSTin; - action++; - } - else if ( action[0]=='3') - { - D1=DSTin; - D2=D1in; - DST=DSTin; - action++; - } - else - { - D1=D1in; - D2=D2in; - DST=DSTin; - } - if (!D1->A)D1->A=copy_aln (D1in->A, NULL); - - if ( strm(action, "seqnos")) - { - (D1->A)->output_res_num=1; - } - else if ( strm (action,"aln2bootstrap")) - { - (D1->A)=aln2bootstrap (D1->A, ATOI_ACTION (1)); - D1->S=aln2seq (D1->A); - } - else if ( strm (action,"aln2sample")) - { - (D1->A)=aln2sample (D1->A, ATOI_ACTION (1)); - D1->S=aln2seq (D1->A); - } - else if ( strm (action,"aln2random_aln")) - { - (D1->A)=aln2random_aln (D1->A, ACTION (1)); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "or_scan")) - { - HERE ("OR SCAN"); - D1->A=or_scan(D1->A, D2->A, ACTION(1)); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "or_sar")) - { - D1->A=or_sar(D1->A, D2->A, ACTION(1), PRINT); - D1->S=aln2seq (D1->A); - } - else if ( strm ( action, "sar2subsar")) - { - /*in->sequences - in2->sar data - */ - Alignment *subA, *subS; - - if ( n_actions==1) - { - fprintf ( stderr, "\nin=aln, in2=sar sar2subsar [filter value compound1 compound2...] | [jack1] | [file]\n"); - myexit (EXIT_FAILURE); - } - - sarset2subsarset ( D1->A, D2->A, &subA, &subS, main_read_aln (action_list[2], NULL)); - D1->A=subA;D2->A=subS; - } - else if ( strm (action, "display_sar")) - { - D1->A=display_sar (D1->A, D2->A, action_list[1]); - } - else if ( strm ( action, "sar2simpred")) - { - /*in->sequences - in2->sar data - */ - sar2simpred ( D1->A, D2->A, action_list[1], action_list[2], atoi(action_list[3]), atoi (action_list[4])); - } - else if ( strm ( action, "sar2simpred2")) - { - /*in->sequences - in2->sar data - */ - if ( n_actions!=5) - { - fprintf ( stderr, "\nERROR: +sar2simpred2 seqnamesfile posfile compound limit"); - myexit (EXIT_FAILURE); - } - sar2simpred2 ( D1->A, D2->A, action_list[1], action_list[2], action_list[3], atoi (action_list[4])); - } - else if ( strm ( action, "sar_analyze")) - { - /*in->sequences - in2->sar data - */ - sar_analyze ( D1->A, D2->A,action_list[1]); - } - else if ( strm ( action, "simple_sar_predict")) - { - //displays each column with ist score; - simple_sar_predict (D1->A, D2->A,ACTION(1)); - exit (EXIT_SUCCESS); - } - else if ( strm ( action, "display_sar_analyze")) - { - //displays each column with ist score; - display_simple_sar_analyze_col (D1->A, D2->A,ACTION(1)); - exit (EXIT_SUCCESS); - } - else if ( strm ( action, "display_sar_analyze_pc")) - { - //displays each column with ist score; - display_simple_sar_analyze_pair_col (D1->A, D2->A,ACTION(1)); - exit (EXIT_SUCCESS); - } - else if ( strm ( action, "weight2sar")) - { - /*in->sequences - in2->sar data - */ - if ( n_actions!=3) - { - fprintf ( stderr, "\nERROR: +weight2sar "); - myexit (EXIT_FAILURE); - } - D1->A=weight2sar ( D1->A,D2->A, action_list[1], atoi(action_list[2])); - - } - else if ( strm ( action, "sar_weight")) - { - /*in->sequences - in2->sar data - */ - if ( n_actions!=3) - { - fprintf ( stderr, "\nERROR: +sar_weight "); - myexit (EXIT_FAILURE); - } - D1->A=aln2weighted_sar_score ( D1->A,D2->A, action_list[1], action_list[2]); - D1->S=aln2seq ( D1->A); - } - - else if ( strm (action, "name2unique_name")) - { - char *tmp1, *tmp2; - char command[1000]; - tmp1=vtmpnam (NULL); tmp2=vtmpnam (NULL); - - output_fasta_aln (tmp1,D1->A); - free_aln (D1->A);free_sequence (D1->S, -1); - sprintf ( command, "fasta_aln2fasta_aln_unique_name.pl %s >%s", tmp1, tmp2); - my_system ( command); - D1->S=get_fasta_sequence ( tmp2, NULL); - D1->A=seq2aln (D1->S,NULL, 1); - } - else if ( strm (action, "rm_tag") || strm (action, "rm_template")) - { - - char **temp_name=NULL,**temp_list=NULL, temp_nseq=0; - int z; - - if ( D1 && D1->A){temp_name=(D1->A)->name;temp_nseq=(D1->A)->nseq;} - else if ( D1 && D1->S){temp_name=(D1->S)->name;temp_nseq=(D1->S)->nseq;} - temp_list=rm_name_tag (temp_name,temp_nseq, NULL); - if ( n_actions>1 && strm (action_list[1], "template")) - { - - for ( z=0; zS=seq2template_seq (D1->S, action_list[1], NULL); - D1->A=seq2aln(D1->S, NULL, 1); - } - else if ( strm ( action, "seq2year")) - { - D1->S=seq2year (D1->S, (n_actions>1)?atoi(action_list[1]):1); - D1->A=seq2aln(D1->S, NULL, 1); - } - else if ( strm (action, "swap_lib_header")) - { - Sequence *S; - S=main_read_seq (action_list[1]); - (D1->CL)->S=S; - - } - else if ( strm (action, "weight_lib")) - { - int l; - int w; - w=atoi (action_list[1]); - if ( D1->CL) - { - for (l=0; l<(D1->CL)->ne; l++) - (D1->CL)->L[l*CL->entry_len+WE]=w; - } - } - else if ( strm (action, "struc2nb")) - { - int c; - for ( c=0; c< (D1->S)->nseq; c++) - { - struclist2nb ((D1->S)->name[c],(D1->S)->seq[c], (D1->S)->seq_comment[c], atof(action_list[1]),ACTION(2),ACTION(3) ); - } - myexit (EXIT_SUCCESS); - } - - - - else if ( strm(action, "seq2contacts")) - { - int z; - D1->S=swap_header (D1->S, D2->S); - for ( z=0; z< (D1->S)->nseq; z++)sprintf ( (D1->A)->name[z], "%s", (D1->S)->name[z]); - DST->S=seq2contacts (D1->S, atof (action_list[1])); - DST->A=copy_aln (D1->A, NULL); - thread_seq_struc2aln ( DST->A,DST->S); - for (z=0; z< (D1->S)->nseq; z++) - (DST->A)->S=D1->S; - - } - else if ( strm(action, "struc2contacts")) - { - char *seq; - if ( atof (action_list[3])>0) - { - seq=map_contacts (action_list[1], action_list[2], atof (action_list[3])); - fprintf ( stderr, "\n>%s %s\n%s",action_list[1], action_list[2],seq); - } - else - print_contacts (action_list[1], action_list[2], atof (action_list[3])); - - myexit (EXIT_SUCCESS); - } - else if ( strm(action, "treelist_prune")|| strm(action, "prune_treelist")) - { - Sequence *TS; - if (D2 && D2->S)TS=D2->S; - else TS=treelist2sub_seq((D1->S),ATOI_ACTION(1)); - treelist2prune_treelist ( D1->S,TS, NULL); - D1->A=seq2aln (D1->S, NULL, NO_PAD); - } - else if ( strm (action, "tree2unresolved_nodes")) - { - int ns; - int *l; - ns=tree2nseq (D1->T); - l=vcalloc (ns, sizeof (int)); - tree2nnode_unresolved (D1->T, l); - for ( a=0; aT=main_prune_tree ( D1->T, D2->S); - } - else if ( strm ( action, "tree2seq")) - { - D1->S=tree2seq(D1->T, NULL); - D1->A=seq2aln (D1->S, D1->A, 1); - (D1->A)->len_aln=1; - for ( a=0; a< (D1->A)->nseq; a++)sprintf ( (D1->A)->seq_al[a], "sequence"); - } - else if ( strm (action, "seq2dpatree")) - { - D1->T= seq2dpa_tree(D1->S,"ktup"); - } - else if ( strm (action, "tree2dpatree")) - { - D1->T= tree2dpa_tree(D1->T,(D2 && D2->A)?D2->A:D1->A, (n_actions==1)?"idmat":action_list[1]); - } - else if ( strm (action, "tree2group")) - { - vfclose (tree2group (D1->T, (tree2seq(D1->T,NULL)), atoi(action_list[1]), atoi(action_list[2]),(n_actions==4)?action_list[3]:NULL, stdout)); - myexit (EXIT_SUCCESS); - } - else if ( strm(action, "unroot")) - { - D1->T=unroot_tree(D1->T); - } - - - else if ( strm(action, "treelist2group")|| strm(action, "treelist2groups") ) - { - Sequence *TS; - - if (D2 && D2->S)TS=D2->S; - else TS=treelist2seq((D1->S)); - treelist2groups (D1->S, TS, ACTION(1), stdout); - myexit (EXIT_SUCCESS); - - // treelist2groups (D1->S,(D2)?D2->S:NULL, ACTION(1), stdout ); - //exit (EXIT_SUCCESS); - } - else if ( strm(action, "splits2tree")) - { - - D1->T=split2tree ((D2)?D2->T:NULL,D1->S, ACTION(1)); - - } - else if ( strm(action, "count_splits")) - { - - count_splits ((D2)?D2->T:NULL,D1->S, ACTION(1)); - exit (EXIT_SUCCESS); - } - else if ( strm(action, "count_groups")) - { - count_tree_groups (D1->S, ACTION(1)); - } - else if ( strm (action, "tree2dist")) - { - int ta, tb, ***td; - Sequence *TS; - - TS=(D2)?D2->S:NULL; - td=tree2dist (D1->T,TS, NULL); - if (!TS)TS=tree2seq(D1->T, NULL); - for (ta=0; tanseq; ta++) - { - fprintf ( stdout, "%-15s ",TS->name[ta]); - for ( tb=0; tbnseq; tb++) - { - int n=0; - if ( ACTION(1) && strm (ACTION(1), "length"))n=1; - - fprintf (stdout, " %4d", td [n][ta][tb]); - } - fprintf ( stdout, "\n"); - } - exit (EXIT_SUCCESS); - } - else if ( strm (action, "treelist2lti")) - { - Sequence *TS; - if (D2 && D2->S)TS=D2->S; - else TS=treelist2sub_seq((D1->S),ATOI_ACTION(2)); - treelist2lti (D1->S,TS, (int)ATOI_ACTION(1), stdout ); - exit (0); - } - else if ( strm (action,"treelist2frame")) - { - Sequence *TS; - if (D2 && D2->S)TS=D2->S; - else TS=treelist2sub_seq((D1->S),ATOI_ACTION(1)); - treelist2frame (D1->S, TS); - myexit (EXIT_SUCCESS); - } - - else if ( strm (action, "treelist2seq")) - { - D1->S=treelist2sub_seq (D1->S,ATOI_ACTION(1)); - D1->A=seq2aln(D1->S, NULL, 1); - } - else if ( strm (action, "treelist2leafgroup")) - { - treelist2leafgroup (D1->S, (D2)?D2->S:NULL, ACTION(1)); - exit (0); - } - else if ( strm(action, "treelist2splits")) - { - if (D1->T)D1->S=add_file2file_list ((D1->T)->file, NULL); - treelist2splits (D1->S, (D2)?D2->S:NULL); - } - - else if ( strm(action, "treelist2dmat")) - { - treelist2dmat (D1->S); - } - else if ( strm(action, "tree_cmp") || strm (action, "tree_compare")) - { - D1->T=main_compare_trees ( D1->T, D2->T, stdout); - } - else if ( strm (action, "tree_scan")) - { - D1->T=tree_scan (D1->A, D2->T, ACTION(1), ACTION(2)); - } - else if ( strm (action, "split_cmp")) - { - main_compare_splits (D1->T, D2->T, ACTION(1), stdout); - } - - else if ( strm(action, "node_sort")) - { - node_sort ( action_list[1], D1->T); - exit (EXIT_SUCCESS); - } - - else if ( strm ( action, "avg_bootstrap")) - { - display_avg_bootstrap (D1->T); - myexit (EXIT_SUCCESS); - } - - else if ( strm (action, "tree_cog_cmp")) - { - main_compare_cog_tree (D1->T,action_list[1]); - exit (EXIT_SUCCESS); - } - else if ( strm (action, "tree_aln_cmp")) - { - main_compare_aln_tree (D1->T, D2->A, stdout); - exit (EXIT_SUCCESS); - } - else if ( strm(action, "change_bootstrap")) - { - D1->T=reset_boot_tree ( D1->T, (n_actions>=2)?atoi(action_list[1]):0); - } - else if ( strm(action, "change_distances")) - { - D1->T=reset_dist_tree ( D1->T, (n_actions>=2)?atof(action_list[1]):0.00); - } - - else if ( strm(action, "aln2tree")) - { - D1->T=tree_compute (D1->A, n_actions-1, action_list+1); - } - else if ( strm(action, "similarities2tree")) - { - D1->T=similarities_file2tree (ACTION(1)); - } - - else if ( strm(action, "original_seqnos")) - { - (D1->A)->output_res_num=2; - } - - else if ( strm (action, "aln2pred")) - { - aln2pred (D1->A, D2->A, ACTION (1)); - exit (EXIT_SUCCESS); - } - else if ( strm(action, "evaluate")) - { - Alignment *A; - - - DST->A=copy_aln (D1->A, NULL); - DST->S=aln2seq(DST->A); - if (n_actions>1 && strm ( action_list[1], "categories")) - { - CL=declare_constraint_list ( DST->S,NULL, NULL, 0,NULL, read_matrice("pam250mt")); - DST->A= main_coffee_evaluate_output(DST->A, CL, "categories"); - } - else if (n_actions>1 && strm ( action_list[1], "sar")) - { - CL=declare_constraint_list ( DST->S,NULL, NULL, 0,NULL, read_matrice("pam250mt")); - DST->A= main_coffee_evaluate_output(DST->A, CL, "sar"); - } - else if (n_actions>1 && strstr ( action_list[1], "boxshade")) - { - char color_mode[1000]; - sprintf (color_mode,"boxshade_%d", atoi(ACTION2(2,"30"))); - CL=declare_constraint_list ( DST->S,NULL, NULL, 0,NULL, read_matrice("pam250mt")); - DST->A= main_coffee_evaluate_output(DST->A, CL, color_mode); - } - - else - { - CL=declare_constraint_list ( DST->S,NULL, NULL, 0,NULL, read_matrice((n_actions==1)?"pam250mt":action_list[1])); - DST->A= main_coffee_evaluate_output(DST->A, CL, "matrix"); - } - - DST->S=aln2seq ( DST->A); - - A=D1->A; - - sprintf ( A->name[A->nseq], "cons"); - sprintf ( A->seq_al[A->nseq], "%s", aln2cons_seq_mat (A, "idmat")); - - } - else if ( strm (action, "sp_evaluate")) - { - fprintf ( stdout, "SP Score: %.2f", sum_pair ((DST && DST->A)?DST->A:D1->A,ACTION(1),atoi(ACTION2(2,"0")),atoi(ACTION2(3,"0")))); - exit (EXIT_SUCCESS); - } - else if ( strm (action, "lat_evaluate")) - { - float score; - score=lat_sum_pair ( D1->A, action_list[1]); - fprintf ( stdout, "\nLAT_SCORE: %.2f", score); - exit (EXIT_SUCCESS); - - } - else if ( strm (action, "add_scale")) - { - D1->A=aln2scale (D1->A, ACTION(1)); - } - else if ( strm (action, "RNAfold_cmp")) - { - D1->A=compare_RNA_fold (D1->A, D2->A); - } - else if ( strm (action, "aln2alifold")) - { - D1->A=aln2alifold (D1->A); - D1->S=aln2seq ( D1->A); - } - - - else if ( strm (action, "add_alifold")) - { - D1->A=add_alifold2aln (D1->A, (D2)?D2->A:NULL); - - } - else if ( strm (action, "alifold2analyze")) - { - D1->A=alifold2analyze (D1->A, (D2)?D2->A:NULL, ACTION(1)); - D1->S=aln2seq(D1->A); - } - else if ( strm (action, "aln2conservation")) - { - D1->A=aln2conservation ( D1->A, ATOI_ACTION (1), ACTION (2)); - exit (EXIT_FAILURE); - } - else if ( strm (action, "aln2cons")) - { - char *cons_seq; - char *cons_name; - cons_name=vcalloc (100, sizeof (char)); - sprintf(cons_name, "%s", (n_actions<=2)?"Cons":action_list[2]); - cons_seq=aln2cons_seq_mat (D1->A, (n_actions==1)?"blosum62mt":action_list[1]); - free_aln (D1->A);free_sequence(D1->S, -1); - D1->S=fill_sequence_struc (1, &cons_seq, &cons_name); - /*keep the gaps*/ - (D1->S)->len[0]=strlen (cons_seq); sprintf ( (D1->S)->seq[0], "%s", cons_seq); - D1->A=seq2aln (D1->S, NULL, KEEP_GAP); - vfree (cons_name);vfree (cons_seq); - } - else if ( strm (action, "seq2filter")) - { - D1->S=seq2filter ( D1->S, atoi(action_list[1]), atoi(action_list[2])); - - } - else if ( strm (action, "aln2resindex")) - { - //-in: aln, file: ref_seq ref_res target_seq - //-in2 target sequences - aln2resindex (D1->A, (D2)?D2->A:NULL, stdout); - exit (EXIT_SUCCESS); - } - else if (strm(action, "keep_name")) - { - RAD->keep_name=1-RAD->keep_name; - } - else if (strm(action, "use_consensus") ||strm(action, "use_cons") ) - { - RAD->use_consensus=1-RAD->use_consensus; - } - else if ( strm(action, "ungap")) - { - seq2aln (D1->S, D1->A, 1); - } - else if ( strm2(action, "rmgap", "rm_gap")) - { - - ungap_aln_n (D1->A, (n_actions==1)?100:atoi(action_list[1])); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - (D1->A)->S=D1->S; - } - else if ( strm(action, "rmgap_col")) - { - D1->A=remove_gap_column ( D1->A,action_list[1]); - } - else if ( strm(action,"random")) - { - - D1->A= make_random_aln(NULL,(n_actions==1)?1:atoi(action_list[1]),(n_actions==2)?100:atoi(action_list[2]),"acdefghiklmnpqrstvwy"); - - D1->S=aln2seq ( D1->A); - } - - else if ( strm(action, "landscape")) - { - - set_landscape_msa ((n_actions==1)?0:atoi(action_list[1])); - } - else if ( strm(action, "clean_maln")) - { - if ( !DST) - { - fprintf ( stderr,"\n[You Need an evaluation File: Change the output format][FATAL:%s]\n", PROGRAM); - myexit(EXIT_FAILURE); - } - (DST->A)=aln2number (DST->A); - D1->A=clean_maln(D1->A, DST->A,(n_actions==1)?1:atoi(action_list[1]),(n_actions==1)?1:atoi(action_list[2])); - } - else if ( strm (action, "extract")) - { - - COOR=get_pir_sequence (RAD->coor_file, NULL); - D1->S=extract_sub_seq ( COOR, D1->S); - free_aln (D1->A); - D1->A=declare_Alignment(D1->S); - seq2aln (D1->S, D1->A, RAD->rm_gap); - free_sequence (COOR, COOR->nseq); - } - else if ( strm (action, "reorder_column")) - { - - - - Alignment *RO1, *RO2; - Sequence *OUT_S; - int s; - - RO1=rotate_aln (D1->A,NULL); - if (ACTION(1) && strm (ACTION(1), "tree")) - { - D1->T=tree_compute (RO1,n_actions-2, action_list+2); - OUT_S=tree2seq(D1->T, NULL); - RO1=reorder_aln(RO1, OUT_S->name, OUT_S->nseq); - } - else if ( ACTION(1) && strm (ACTION(1), "random")) - { - RO1=reorder_aln ( RO1, NULL, RO1->nseq); - } - - RO2=rotate_aln (RO1, NULL); - for (s=0; s< RO2->nseq; s++) - sprintf ( RO2->name[s], "%s", (D1->A)->name[s]); - free_aln (RO1); - free_aln (D1->A); - D1->A=RO2; - D1->S=aln2seq(D1->A); - } - - else if ( strm (action, "reorder")) - { - - if ( n_actions==2 && strm (action_list[1], "random")) - { - D1->A=reorder_aln ( D1->A, NULL, (D1->A)->nseq); - } - else if (n_actions==2 && strm (action_list[1], "scramble")) - { - D1->A=aln2scramble_seq(D1->A); - } - - else if ( n_actions==2 && strm (action_list[1], "tree")) - { - - OUT_S=tree2seq (D2->T, NULL); - D1->A=reorder_aln(D1->A, OUT_S->name, OUT_S->nseq); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else - { - (D2->A)->S=aln2seq (D2->A); - (D1->A)->S=aln2seq (D1->A); - OUT_S=trim_aln_seq_name(D2->A, D1->A); - D1->A=reorder_aln(D1->A, OUT_S->name, OUT_S->nseq); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - } - else if ( strm (action, "cat_aln")) - { - /*D1->A=aln_cat ( D1->A, D2 ->A);*/ - - if (D2 && D2->A && !ACTION(1)) - D1->A=concatenate_aln (D1->A, D2->A, ACTION(1)); - else if (ACTION(1) && is_aln(ACTION(1))) - { - Alignment *B; - int n=1; - - while (ACTION(n)) - { - - B=main_read_aln (ACTION(n), NULL); - D1->A=concatenate_aln (D1->A, B, NULL); - n++; - } - D1->S=aln2seq(D1->A); - } - - else - { - Alignment *A, *B; - - A=main_read_aln ((D1->A)->name[0], NULL); - - for ( a=1; a<(D1->A)->nseq; a++) - { - B=main_read_aln ((D1->A)->name[a], NULL); - A=concatenate_aln (A, B, ACTION(1)); - - } - D1->A=A; - D1->S=aln2seq(D1->A); - } - } - - else if ( strm ( action, "msalist2cat_pwaln")) - { - int a, b, c; - int sim, min, max; - - if (n_actions!=3) - { - min=0; - max=100; - } - else - { - min=atoi(action_list[1]); - max=atoi(action_list[2]); - } - - fprintf ( stdout, ">A\n"); - for (a=0;a<(D1->S)->nseq; a++) - { - Alignment *A; - HERE ("process %s", (D1->S)->name[a]); - A=main_read_aln((D1->S)->name[a],NULL); - for (b=0; bnseq-1; b++) - { - for ( c=b+1; cnseq; c++) - { - sim=get_seq_sim (A->seq_al[b], A->seq_al[c], "-", ""); - if (sim>=min && sim<=max)fprintf (stdout, "xxx%s", A->seq_al[b]); - } - } - free_aln (A); - } - fprintf ( stdout, "\n>B\n"); - for (a=0;a<(D1->S)->nseq; a++) - { - Alignment *A; - HERE ("process %s", (D1->S)->name[a]); - A=main_read_aln((D1->S)->name[a],NULL); - for (b=0; bnseq-1; b++) - { - for ( c=b+1; cnseq; c++) - { - sim=get_seq_sim (A->seq_al[b], A->seq_al[c], "-", ""); - if (sim>=min && sim<=max)fprintf (stdout, "xxx%s", A->seq_al[c]); - } - } - free_aln (A); - } - - fprintf ( stdout, "\n"); - exit (EXIT_SUCCESS); - } - - else if ( strm (action, "collapse_tree")) - { - D1->T=tree2collapsed_tree (D1->T, n_actions-1, action_list+1); - } - else if ( strm (action, "collapse_aln")) - { - D1->A=aln2collapsed_aln (D1->A, n_actions-1, action_list+1); - } - else if ( strm (action, "extract_aln")) - { - D1->A=aln2sub_aln_file (D1->A, n_actions-1, action_list+1); - myexit (EXIT_SUCCESS); - } - - - - else if ( strm (action, "remove_aa")) - { - int pos,len, n; - pos=atoi(action_list[1]); - len=atoi(action_list[2]); - n=atoi (action_list[3]); - if ( atoi (action_list[4])==1)len=-len; - if (pos && n>1) - { - fprintf ( stderr, "\nWARNING: rm_aa, position (pos) and iteration number (n) simulatneously defined. Iteration number reset to 1 [%s]\n", PROGRAM); - n=1; - } - for ( a=0; a< n; a++) - D1->A=probabilistic_rm_aa (D1->A, pos, len); - } - else if ( strm (action, "remove_nuc")) - { - int pos; - pos=atoi(action_list[1]); - - if ( pos>3 || pos<1) - printf_exit (EXIT_FAILURE, stderr, "Remove_nuc: indicate a number between 1 and 3\n"); - - pos--; - for ( c=0,a=0; a<(D1->A)->len_aln; a++, c++) - { - if (c==3)c=0; - for (b=0; b<(D1->A)->nseq; b++) - { - if (c==pos) - { - (D1->A)->seq_al[b][a]='-'; - } - } - } - - D1->S=aln2seq (D1->A); - } - - else if (strm ( action, "conserved_positions")) - { - Alignment *A; - int a, b, c; - int *cache=NULL; - - - A=D1->A; - for ( a=0; a< A->nseq && !cache; a++) - { - if ( strm (action_list[1], A->name[a])) - { - cache=vcalloc ( A->len_aln+1, sizeof (int)); - for ( c=0,b=0; blen_aln; b++) - { - if ( is_gap (A->seq_al[a][b]))cache[b]=-1; - else cache[b]=++c; - } - } - } - - for ( a=0; a< A->len_aln; a++) - { - r1=A->seq_al[0][a]; - if ( is_gap(r1))continue; - for ( c=0,b=0; bnseq; b++) - { - r2=A->seq_al[b][a]; - c+=(r1==r2)?1:0; - } - if ( (c*100)/A->nseq>=atoi(action_list[2])) - fprintf ( stdout, "COL: %d Res: %c %s %d\n", a+1, r1, action_list[1], cache[a]+atoi(action_list[3])); - } - exit (EXIT_FAILURE); - } - else if (strm ( action, "extract_block") ) - { - - BUF=copy_aln (D1->A, NULL); - if ( check_file_exists(action_list[1])) - BUF=extract_aln3(BUF,action_list[1]); - else - BUF=extract_aln2(BUF,atoi(action_list[2]),atoi(action_list[3]),action_list[1]); - D1->A=copy_aln (BUF,D1->A); - - } - else if ( strm ( action, "extract_pos_list")) - { - D1->A=alnpos_list2block (D1->A, n_actions-1, action_list+1); - } - else if ( strm ( action, "seq2msa")) - { - D1->A=simple_progressive_aln ( D1->S, NULL, NULL, action_list[1]); - } - else if ( strm ( action, "realign_block") ) - { - D1->A=realign_block ( D1->A, atoi (action_list[1]), atoi (action_list[2]), (n_actions==4)?action_list[3]:NULL); - } - else if ( strm (action, "extract_seq")) - { - int is_file; - if ( check_file_exists (action_list[1])) - { - is_file=1; - BUFS=main_read_seq (action_list[1]); - action_list=BUFS->name; - n_actions=BUFS->nseq; - } - else - { - is_file=0; - action_list++; - n_actions--; - } - - for ( a=0; a< n_actions;) - { - s=action_list[a]; - - if ( n_actions==1 || is_file==1) - { - start=1; - end=0; - a+=1; - } - else - { - - start=(strm2 (s,"#","*"))?1:(atoi(action_list[a+1])); - end= (strm2 (action_list[a+2],"#","*"))?0:(atoi(action_list[a+2])); - a+=3; - } - - if ( strm2 (s, "#", "*")) - { - OUT_S=extract_one_seq((D1->A)->name[0],start, end, D1->A, RAD->keep_name); - for (b=1; b< (D1->A)->nseq; b++) - { - NS=extract_one_seq((D1->A)->name[b],start, end, D1->A, RAD->keep_name); - if (count_n_res_in_array(NS->seq[0], -1)) - OUT_S=add_sequence ( NS,OUT_S, 0); - } - } - else - { - if ( a==1)OUT_S=extract_one_seq(s,start, end, D1->A, RAD->keep_name); - else - { - NS=extract_one_seq(s,start, end, D1->A, RAD->keep_name); - OUT_S=add_sequence ( NS,OUT_S, 0); - } - } - } - D1->S=OUT_S; - free_aln (D1->A); - D1->A=declare_Alignment(D1->S); - seq2aln (D1->S, D1->A, RAD->rm_gap); - } - - else if ( strm (action, "extract_seq_list")) - { - if ( check_file_exists (action_list[1])) - { - - BUFS=main_read_seq (action_list[1]); - action_list=BUFS->name; - n_actions=BUFS->nseq; - } - else - { - action_list++; - n_actions--; - } - - for ( a=0; a< n_actions;a++) - { - NS=extract_one_seq(action_list[a],1,0, D1->A, KEEP_NAME); - OUT_S=add_sequence ( NS,OUT_S, 0); - } - - D1->S=OUT_S; - free_aln (D1->A); - D1->A=declare_Alignment(D1->S); - seq2aln (D1->S, D1->A, RAD->rm_gap); - } - else if ( strm (action, "remove_seq") || strm (action, "rm_seq")) - { - char *buf; - char **list; - int n; - int l; - - list=declare_char ((D1->S)->nseq, 200); - - buf=vcalloc ((D1->S)->max_len+1, sizeof (char)); - for ( n=0,a=0; a< (D1->A)->nseq; a++) - { - - sprintf (buf, "%s", (D1->S)->seq[a]); - ungap (buf); - l=strlen(buf); - - for (c=1, b=1; b< n_actions; b++) - { - if ( strm (action_list[b], (D1->S)->name[a])){(D1->S)->seq[a]=NULL;break;} - else if ( strm (action_list[b], "empty") && l==0) - { - fprintf ( stderr, "WARNING: Sequence %s does not contain any residue: automatically removed from the set [WARNING:%s]\n",(D1->S)->name[a], PROGRAM); - (D1->S)->seq[a]=NULL;break; - } - else if ( strm (action_list[b], "unique")) - { - if ( name_is_in_list ((D1->S)->name[a], list,n, 100)!=-1) - { - (D1->S)->seq[a]=NULL;break; - } - else - { - sprintf ( list[n++], "%s", (D1->S)->name[a]); - } - } - } - } - D1->S=duplicate_sequence (D1->S); - free_aln (D1->A); - free_char ( list, -1); - D1->A=declare_Alignment(D1->S); - seq2aln (D1->S, D1->A, RAD->rm_gap); - } - - else if ( strm (action, "aln2overaln")|| strm (action,"overaln_param")) - { - //mode (lower|number|uanlign) Penalty (0-100) Thresold (0-9) - int p1,p2,p3,f, t; - char *s; - int eb=0; - char clean_mode[100]; - OveralnP *F; - - F=vcalloc (1, sizeof (OveralnP)); - if ( D2 && D2->A) - { - D1->A=mark_exon_boundaries (D1->A, D2->A); - eb=1; - } - else if ( get_string_variable ("exon_boundaries")) - { - Sequence *S; - Alignment *EB; - EB=seq2aln(S=main_read_seq(s),NULL, 0); - D1->A=mark_exon_boundaries (D1->A, EB); - free_sequence (S, S->nseq); free_aln (EB); - eb=1; - } - - - if (ACTION(1)==NULL)sprintf (F->mode, "lower"); - else if (strstr (ACTION(1), "h")) - { - fprintf ( stdout, "aln2unalign lower|number|unalign F P1 P2 P3 T\n"); - exit (EXIT_SUCCESS); - } - else sprintf (F->mode, "%s", ACTION(1)); - - F->t=ATOI_ACTION(2); - F->f=ATOI_ACTION(3); - F->p1=ATOI_ACTION(4); - F->p2=ATOI_ACTION(5); - F->p3=ATOI_ACTION(6); - F->p3=ATOI_ACTION(7); - - if (int_variable_isset ("overaln_target"))f=get_int_variable ("overaln_target"); - if (int_variable_isset ("overaln_threshold"))t=get_int_variable ("overaln_threshold"); - if (eb)sprintf (F->model, "fsa2"); - else sprintf (F->model, "fsa1"); - - D1->A=aln2clean_pw_aln (D1->A, F); - - } - else if ( strm (action,"aln2unalign")) - { - Alignment *SA; - Sequence *SS; - - SS=aln2seq(SA); - SA=copy_aln (D1->A, NULL); - thread_seq_struc2aln (SA, SS); - D1->A=unalign_aln (D1->A,SA, ATOI_ACTION(1)); - D1->S=aln2seq ( D1->A); - } - else if ( strm (action, "clean_cdna")) - { - Alignment *A; - A=D1->A; - for (a=0; a< A->nseq; a++) - { - char *d, *buf, f; - - d=A->seq_al[a]; - f=get_longest_frame (d, 3); - buf=vcalloc ( strlen (d)+1, sizeof (char)); - sprintf (buf, "%s", d+f); - sprintf (d, "%s", buf); - vfree (buf); - } - } - else if ( strm (action, "clean_cdna2")) - { - D1->A=clean_cdna_aln ( D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if ( strm (action, "aln2short_aln")) - { - D1->A=aln2short_aln (D1->A, action_list[1], action_list[2], atoi(action_list[3])); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if ( strm ( action, "complement")) - { - D1->A=complement_aln (D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if ( strm ( action, "translate")) - { - D1->A=translate_dna_aln( D1->A,(n_actions==1)?0:atoi(action_list[1])); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if (strm2 ( action, "back_translate","backtranslate")) - { - D1->A=back_translate_dna_aln( D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if (strm ( action, "rotate")) - { - D1->A=rotate_aln( D1->A, action_list[1]); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if (strm ( action, "invert")) - { - D1->A=invert_aln( D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - else if (strm ( action, "code_dna_aln")) - { - D1->A=code_dna_aln( D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq ( D1->A); - } - - else if ( strm ( action, "mutate")) - { - D1->A=mutate_aln( D1->A,(n_actions==1)?"0":action_list[1]); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if ( strm ( action, "thread_profile_on_msa")) - { - (D1->A)->S=NULL; - D1->A=thread_profile_files2aln (D1->A, action_list[1], NULL); - D1->S=aln2seq(D1->A); - } - else if ( strm ( action, "thread_dna_on_prot_aln")) - { - D1->A=thread_dnaseq_on_prot_aln (D1->S, D2->A); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if ( strm ( action, "thread_struc_on_aln")) - { - thread_seq_struc2aln ( D2->A, D1->S); - D1->A=copy_aln(D2->A, D1->A); - free_sequence ( D1->S, (D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "sim_filter")) - { - D1->A=sim_filter (D1->A, action_list[1], ACTION (2)); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "seq2blast")) - { - D1->A=seq2blast (D1->S); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - - else if ( strm (action, "trim")) - { - D1->A=simple_trimseq (D1->A,(D2)?D2->A:NULL, action_list[1], ACTION (2)); - - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - - else if (strm ( action, "trimTC")) - { - value=(n_actions==1)?10:atoi(action_list[1]); - - D1->A=tc_trimseq(D1->A,D1->S,action_list[1]); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if (strm ( action, "trimTC2")) - { - char *group_file; - Alignment *B=NULL; - char trim_mode[100]; - if ( n_actions==1 || !(strm (action_list[1], "NSEQ") ||strm (action_list[1], "MINID")) ) - { - fprintf ( stderr, "\nTrimTC2 ()\n"); - myexit (EXIT_FAILURE); - } - sprintf (trim_mode, "%s", action_list[1]);action_list+=2; n_actions-=2; - - if ( strm ( trim_mode, "NSEQ")) - { - group_file=tree2Ngroup( (D1)?D1->A:NULL, (D2)?D2->T:NULL, atoi (action_list[0]), vtmpnam(NULL), (n_actions==1)?"idmat":action_list[1]); - } - else - { - group_file=tree2Ngroup( (D1)?D1->A:NULL, (D2)?D2->T:NULL, -1*atoi (action_list[0]), vtmpnam(NULL), (n_actions==1)?"idmat":action_list[1]); - } - - B=copy_aln (D1->A, B); - B=aln2sub_aln_file (B,1,&group_file); - B=aln2sub_seq (B, 1, &group_file); - D1->A=extract_sub_aln2 (D1->A, B->nseq, B->name); - } - else if ( strm (action, "chain")) - { - D1->A=seq2seq_chain (D1->A,D2->A, ACTION(2)); - } - - - else if (strm ( action, "master_trim")) - { - value=(n_actions==1)?10:atoi(action_list[1]); - - D1->A=master_trimseq(D1->A,D1->S,action_list[1]); - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "force_aln")) - { - char ***rlist=NULL; - int count=0; - - if ( n_actions==2) - { - if (!is_lib_02(action_list[1])) - { - fprintf ( stderr, "\nERROR: force_aln requires files in TC_LIB_FORMAT_02 [FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - } - else - rlist=file2list (action_list[1], " "); - } - else - { - rlist=declare_arrayN(3, sizeof (char),3,7, 10); - - strcat (rlist[1][1],action_list[1]);strcat (rlist[1][3],action_list[2]); - strcat (rlist[1][4],action_list[3]);strcat (rlist[1][6],action_list[4]); - sprintf ( rlist[2][0], "-1"); - } - count=1; - while (rlist[count] && atoi(rlist[count][0])!=-1) - { - char st1[100], st2[100], st3[100], st4[100]; - - sprintf ( st1, "%s", rlist[count][1]);sprintf ( st2, "%s", rlist[count][3]); - sprintf ( st3, "%s", rlist[count][4]);sprintf ( st4, "%s", rlist[count][6]); - fprintf ( stderr, "\nFORCE: %s %s %s %s", st1, st2, st3, st4); - - if (is_number (st1))s1=atoi (st1)-1; - else s1=name_is_in_list (st1,(D1->A)->name, (D1->A)->nseq, 100); - if ( s1<0 || s1>= (D1->A)->nseq)crash ("wrong sequence index"); - r1=atoi (st2)-1; - - if (is_number (st3))s2=atoi (st3)-1; - else s2=name_is_in_list (st3,(D1->A)->name, (D1->A)->nseq, 100); - if ( s2<0 || s2>= (D1->A)->nseq)crash ("wrong sequence index"); - r2=atoi (st4)-1; - - (D1->A)=add_constraint2aln ((D1->A), s1, r1, s2, r2); - count++; - } - fprintf ( stderr, "\n"); - free_arrayN((void*)rlist,3); - } - - else if (strm ( action, "grep")) - { - D1->A=grep_seq (D1->A, ACTION(1),ACTION(2), ACTION(3)); - if (D1->A==NULL) myexit (EXIT_SUCCESS); - else D1->S=aln2seq (D1->A); - } - - else if (strm (action, "find")) - { - int r, l; - char *search_string; - - search_string=vcalloc ( 30, sizeof (char)); - if ( strm (action_list[1], "lower"))sprintf ( search_string, "abcdefghijklmnopqrstuvwxyz"); - else if ( strm ( action_list[1], "upper"))sprintf ( search_string, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - else - { - vfree (search_string);search_string=vcalloc ( strlen (action_list[1])+1, sizeof (char)); - sprintf (search_string, "%s", action_list[1]); - } - - for (a=0; a<(D1->A)->nseq; a++) - for ( l=0,b=0; b< (D1->A)->len_aln; b++) - { - r=(D1->A)->seq_al[a][b]; - l+=!is_gap(r); - if ( r!='\0' && strrchr (search_string, r)) - { - /*fprintf ( stdout, "%-15s res %c alnpos %4d seqpos %4d\n", (D1->A)->name[a], r, b+1, l);*/ - fprintf ( stdout, "%s %d %d\n", (D1->A)->name[a], l, l+1); - } - } - myexit (EXIT_SUCCESS); - } - else if ( strm (action, "merge_annotation")) - { - D1->A=merge_annotation (D1->A, DST?DST->A:NULL, ACTION(1)); - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "color_residue")) - { - int i; - Alignment *A; - A=D1->A; - - DST->A=copy_aln (D1->A, NULL); - DST->S=aln2seq (DST->A); - for (a=0; a< (DST->S)->nseq; a++)ungap ((DST->S)->seq[a]); - - if (n_actions>2) - { - for (a=1; aA)->name, (D1->A)->nseq, 100); - if (i!=-1) - { - (DST->S)->seq[i][atoi(action_list[a+1])-1]='0'+atoi(action_list[a+2])-1; - } - else fprintf (stderr, "\nWARNING: Could not find Sequence %s", action_list[a]); - } - } - else - { - char name[1000]; - int pos, val; - FILE *fp; - - fp=vfopen (action_list[1], "r"); - while (fscanf (fp, "%s %d %d\n", name, &pos, &val)==3) - { - - i=name_is_in_list(name, (D1->A)->name, (D1->A)->nseq, 100); - if (i!=-1)(DST->S)->seq[i][pos-1]='0'+val; - else fprintf (stderr, "\nWARNING: Could not find Sequence %s", action_list[a]); - } - vfclose (fp); - } - DST->A=seq2aln (DST->S, NULL, 1); - } - else if ( strm (action, "edit_residue")) - { - FILE *fp; - int i, pos; - int **p; - char mod[100], name[100]; - Alignment *A; - - A=D1->A; - - p=aln2inv_pos (A); - if (n_actions>2) - { - for (a=1; aA)->name, (D1->A)->nseq, 100); - if (i!=-1) - { - pos=atoi(action_list[a+1]); - - pos=p[i][pos]-1; - sprintf (mod, "%s", action_list[a+2]); - if ( strm (mod, "upper"))(D1->A)->seq_al[i][pos]=toupper((D1->A)->seq_al[i][pos]); - else if ( strm (mod, "lower"))(D1->A)->seq_al[i][pos]=tolower((D1->A)->seq_al[i][pos]); - else (D1->A)->seq_al[i][pos]=mod[0]; - } - else fprintf (stderr, "\nWARNING: Could not find Sequence %s", action_list[a]); - - } - } - else - { - fp=vfopen (action_list[1], "r"); - while (fscanf (fp, "%s %d %s\n", name, &pos, mod)==3) - { - - i=name_is_in_list(name, (D1->A)->name, (D1->A)->nseq, 100); - if (i!=-1) - { - pos=p[i][pos]-1; - if ( strm (mod, "upper"))(D1->A)->seq_al[i][pos]=toupper(A->seq_al[i][pos]); - else if ( strm (mod, "lower"))A->seq_al[i][pos]=tolower(A->seq_al[i][pos]); - else A->seq_al[i][pos]=mod[0]; - } - else fprintf(stderr, "\nWARNING: Could not find Sequence %s", action_list[a]); - } - vfclose (fp); - } - D1->S=aln2seq (D1->A); - } - else if ( strm (action, "clean_flag")) - { - clean_flag=1-clean_flag; - } - else if ( strm (action, "aln2case")) - { - D1->A=aln2case_aln (D1->A, ACTION(1), ACTION(2)); - D1->S=aln2seq(D1->A); - } - - else if ( strm5 (action, "convert","upper","lower", "keep", "switchcase")) - { - b=1; - - if ( n_actions>1 && is_number (action_list[b])) - { - lower_value=upper_value=atoi(action_list[b++]); - } - else if ( n_actions>1 && strm (action_list[b], "gap")) - { - DST=vcalloc (1,sizeof(Sequence_data_struc)); - DST->A=aln2gap_cache (D1->A,0); - lower_value=0; - upper_value=0; - b++; - } - else if (n_actions>1 && action_list[b] && action_list[b][0]=='[') - - { - lower_value=atoi(strtok (action_list[b]+1, "-[]")); - upper_value=atoi(strtok (NULL, "-[]")); - - b++; - } - else - { - lower_value=upper_value=-1; - } - - if ( n_actions >b ||strm (action, "keep") ) - { - if ( !RAD->symbol_list)RAD->symbol_list=declare_char (STRING, STRING); - RAD->n_symbol=0; - if ( strm (action, "keep") )sprintf ( RAD->symbol_list[RAD->n_symbol++], "#-"); - else - { - for (a=b; a< n_actions; a++) - { - sprintf ( RAD->symbol_list[RAD->n_symbol], "%s", action_list[a]); - RAD->n_symbol++; - } - } - } - - for ( value=0; value<=9; value++) - { - if ( lower_value==-1)value=-1; - - if ( (value>=lower_value && value<=upper_value)|| value==-1) - { - if (strm(action,"convert")) D1->A=filter_aln_convert (D1->A, DST?DST->A:NULL,RAD->use_consensus,value,RAD->n_symbol, RAD->symbol_list); - else if (strm(action,"upper"))D1->A=filter_aln_lower_upper (D1->A, DST?DST->A:NULL,RAD->use_consensus,value); - else if (strm(action,"lower"))D1->A=filter_aln_upper_lower (D1->A, DST?DST->A:NULL,RAD->use_consensus,value); - else if (strm(action,"switchcase"))D1->A=filter_aln_switchcase (D1->A, DST?DST->A:NULL,RAD->use_consensus,value); - } - else - { - if (strm(action,"keep")) D1->A=filter_aln_convert (D1->A, DST?DST->A:NULL,RAD->use_consensus,value,RAD->n_symbol, RAD->symbol_list); - } - if (value==-1)break; - - } - - /*free_sequence (D1->S,(D1->S)->nseq);*/ - if (!D1->S)D1->S=aln2seq (D1->A); - } - else if ( strm ( action, "count_pairs")) - { - int a, b,c,v, **matrix; - Alignment *A; - matrix=declare_int (300,300); - A=D1->A; - for ( a=0; a< A->nseq-1; a++) - for (b=0; b< A->nseq; b++) - for (c=0; clen_aln; c++) - matrix[(int)A->seq_al[a][c]][(int)A->seq_al[b][c]]++; - for ( a=0; a<255; a++) - for ( b=a; b<256; b++) - { - v=matrix[a][b]+matrix[b][a]; - if (v)fprintf ( stdout, "\n%c %c %d", a, b, v); - } - exit (EXIT_SUCCESS); - } - else if ( strm (action, "count_misc")) - { - count_misc (D1->A, (!D2)?NULL:D2->A); - } - else if ( strm (action, "count")) - { - b=1; - if ( n_actions>1 && is_number (action_list[b])) - { - lower_value=upper_value=atoi(action_list[b++]); - } - else if (n_actions>1 && action_list[b] && action_list[b] && action_list[b][0]=='[') - - { - lower_value=atoi(strtok (action_list[b]+1, "-[]")); - upper_value=atoi(strtok (NULL, "-[]")); - - b++; - } - else - { - lower_value=upper_value=-1; - } - if ( n_actions >b) - { - if ( !RAD->symbol_list)RAD->symbol_list=declare_char (STRING, STRING); - RAD->n_symbol=0; - for (a=b; a< n_actions; a++) - { - sprintf ( RAD->symbol_list[RAD->n_symbol], "%s", action_list[a]); - RAD->n_symbol++; - } - } - for ( value=lower_value; value<=upper_value; value++) - { - count_table=count_in_aln (D1->A, DST?DST->A:NULL,value,RAD->n_symbol, RAD->symbol_list, count_table); - } - for ( a=0; an_symbol; a++) - { - fprintf ( stdout, "%s %d\n", RAD->symbol_list[a], count_table[a]); - } - free_sequence (D1->S,(D1->S)->nseq); - D1->S=aln2seq (D1->A); - vfree(count_table); - exit(EXIT_SUCCESS); - } - else if ( strm (action, "msa_weight")) - { - int random_value; - char command [LONG_STRING]; - char aln_name[FILENAMELEN]; - char tree_name[FILENAMELEN]; - char dist_matrix_name[FILENAMELEN]; - char weight_name[FILENAMELEN]; - char method_4_msa_weights[1000]; - - if ( n_actions==1) - { - fprintf ( stderr, "\nError: msa_weight requires a weight_method"); - } - - sprintf ( method_4_msa_weights, "%s", (get_env_variable ("METHOD_4_MSA_WEIGHTS",NO_REPORT))?get_env_variable ("METHOD_4_MSA_WEIGHTS",NO_REPORT):METHOD_4_MSA_WEIGHTS); - - /*1 Computation of the tree and the distance matrix*/ - random_value=addrand ((unsigned long) 100000)+1; - sprintf (aln_name, "%d.aln", random_value); - sprintf (tree_name, "%d.ph", random_value); - sprintf (dist_matrix_name, "%d.dst", random_value); - sprintf (weight_name, "%d.weight", random_value); - output_fasta_aln (aln_name, D1->A); - - sprintf ( command, "clustalw -infile=%s -tree -outputtree=dist %s", aln_name, TO_NULL_DEVICE); - my_system ( command); - sprintf ( command, "%s -method %s -aln %s -tree %s -dmatrix %s -weightfile %s %s",method_4_msa_weights, action_list[1],aln_name, tree_name, dist_matrix_name,weight_name, TO_NULL_DEVICE); - my_system ( command); - - (D1->A)->S=aln2seq (D1->A); - ((D1->A)->S)->W=read_seq_weight ( (D1->A)->name, (D1->A)->nseq,weight_name); - vremove (weight_name); - vremove (aln_name); - vremove (tree_name); - vremove (dist_matrix_name); - } - else if ( strm (action, "pavie_seq2random_seq")) - { - D1->S=pavie_seq2random_seq (D1->S, action_list[1]); - D1->A=seq2aln (D1->S,NULL,1); - } - else if ( strm ( action, "pavie_seq2noisy_seq")) - { - /* ()*/ - - D1->S=pavie_seq2noisy_seq (D1->S, atoi(action_list[1]),ACTION(2)); - D1->A=seq2aln (D1->S,NULL,1); - } - else if ( strm (action, "pavie_seq2pavie_mat")) - { - - pavie_seq2trained_pavie_mat ( D1->S, (n_actions==2)?action_list[1]:NULL); - myexit (EXIT_SUCCESS); - } - else if ( strm (action, "pavie_seq2pavie_aln")) - { - - pavie_seq2pavie_aln ( D1->S, action_list[1], ACTION(2)); - myexit (EXIT_SUCCESS); - } - else if ( strm (action, "pavie_seq2pavie_dm")) - { - if (strstr (ACTION2(2,""), "_MSA_")) - D1->S=aln2seq_main(D1->A, KEEP_GAP); - - - pavie_seq2pavie_aln ( D1->S, action_list[1],(n_actions==3)?action_list[2]:"_MATDIST_"); - myexit (EXIT_SUCCESS); - } - else if ( strm (action, "pavie_seq2pavie_msa")) - { - D1->A=pavie_seq2pavie_msa ( D1->S, action_list[1], (n_actions==3)?action_list[2]:NULL); - } - else if ( strm (action, "pavie_seq2pavie_tree")) - { - D1->T=pavie_seq2pavie_tree ( D1->S, action_list[1], (n_actions==3)?action_list[2]:NULL); - } - else if ( strm (action, "pavie_seq2pavie_sort")) - { - D1->A=pavie_seq2pavie_sort ( D1->S, action_list[1], (n_actions==3)?action_list[2]:NULL); - } - - else if ( strm (action, "aln2mat_diaa")) - { - aln2mat_diaa (D1->S); - } - else if ( strm (action, "aln2mat")) - { - aln2mat(D1->S); - } - - else if ( strm (action, "seq2latmat")) - { - seq2latmat ( D1->S, "stdout"); - myexit (EXIT_SUCCESS); - } - else if ( strm (action , "rm_target_pdb")) - { - int i, j; - char *buf; - - for (i=0; i< (D1->A)->nseq; i++) - { - j=1;buf=(D1->A)->name[i]; - while (buf[j]!='_' && buf[j-1]!='_' && buf[j]!='\0')j++; - buf[j]='\0'; - } - } - else if ( strm ( action, "mat2cmp")) - { - double *r; - r=mat2cmp (D1->M, D2->M); - fprintf ( stdout, "\nMATRIX COMPARISON: R=%.3f R2=%.3f On %d pairs of values\n", (float)r[0], (float)r[1], (int)r[2]); - myexit (EXIT_SUCCESS); - } -//Special modes - else if ( strm ( action, "overaln_list")) - { - float *re, tre=0,sn, tsn=0, sp, tsp=0; - int p1,p2,p3, t, f; - FILE *fp; - char fname [100]; - Alignment **LA; - Alignment **LB; - - HERE ("F P1 P2 P3 T"); - - t=ATOI_ACTION(1); - f=ATOI_ACTION(2); - p1=ATOI_ACTION(3); - p2=ATOI_ACTION(4); - p3=ATOI_ACTION(5); - - - - LA=vcalloc ((D1->A)->nseq, sizeof (Alignment*)); - LB=vcalloc ((D2->A)->nseq, sizeof (Alignment*)); - for (a=0; a<(D1->A)->nseq; a++) - { - LA[a]=main_read_aln ((D1->A)->name[a], NULL); - LB[a]=main_read_aln ((D2->A)->name[a], NULL); - } - - for ( a=0; a<(D1->A)->nseq; a++) - { - Alignment *A, *B; - A=LA[a]; - B=LB[a]; - re=analyze_overaln (A, B, "_case_l_",t,f,p1,p2,p3); - fprintf (stdout, "\n%d: sn: %.2f sp: %.2f re: %.2f F: %d P: %d P2: %d T: %d",a, re[0],re[1],re[2],f, p1,p2,t); - tsn+=re[0]; - tsp+=re[1]; - tre+=re[2]; - vfree(re); - } - fprintf (stdout, "\nTOT: sn: %.2f sp: %.2f re: %.2f F: %d P: %d P2: %d T: %d", tsn/(D1->A)->nseq,tsp/(D1->A)->nseq, tre/(D1->A)->nseq,f,p1,p2,t); - - exit (0); - } - else if ( strm ( action, "overaln_list_scan")) - { - float *re, tre=0, tsn=0, tsp; - int p1,p2, p3, t, f; - FILE *fp; - char fname [100]; - Alignment **LA; - Alignment **LB; - - if ( ACTION(1))sprintf ( fname, "%s", ACTION(1)); - else sprintf ( fname, "scan_results.txt"); - - fprintf ( stdout, "SCAN Results will be ouput in %s\n", fname); - - - LA=vcalloc ((D1->A)->nseq, sizeof (Alignment*)); - LB=vcalloc ((D2->A)->nseq, sizeof (Alignment*)); - for (a=0; a<(D1->A)->nseq; a++) - { - LA[a]=main_read_aln ((D1->A)->name[a], NULL); - LB[a]=main_read_aln ((D2->A)->name[a], NULL); - } - for (f=32; f<=40; f++) - { - for (p1=90; p1<=100; p1+=5) - { - for ( t=1; t<=3; t++) - { - for (p2=0; p2<=40; p2+=5) - { - for (p3=0;p3<=0;p3+=5) - { - tre=tsn=tsp=0; - for ( a=0; a<(D1->A)->nseq; a++) - { - Alignment *A, *B; - A=LA[a]; - B=LB[a]; - re=analyze_overaln (A, B, "_case_l_",t,f,p1,p2,p3); - - tsn+=re[0]; - tsp+=re[1]; - tre+=re[2]; - vfree (re); - } - fp=vfopen (fname, "a"); - fprintf (fp, "\nTOT: sn: %.2f sp: %.2f re: %.2f P: %d P2: %d P3: %d T: %d F: %d", tsn/(D1->A)->nseq,tsp/(D1->A)->nseq, tre/(D1->A)->nseq, p1,p2, p3,t,f); - fprintf (stderr, "\nTOT: sn: %.2f sp: %.2f re: %.2f P: %d P2: %d P3: %d T: %d F: %d", tsn/(D1->A)->nseq,tsp/(D1->A)->nseq, tre/(D1->A)->nseq, p1,p2, p3,t,f); - vfclose (fp); - } - } - } - } - } - exit (0); - } - else if ( strm ( action, "overaln"))//Evaluate the capacity to predict over-aligned regions - { - OveralnP *F; - F=vcalloc (1, sizeof (OveralnP)); - //al1: ref - //al2: alignment - //ATOI(1): P (0-100) - //ATOI(2): T (0-9) - - float *r; - DST=vcalloc (1,sizeof(Sequence_data_struc)); - DST->A=aln2gap_cache (D1->A,0); - lower_value=0; - upper_value=0; - D1->A=filter_aln_upper_lower (D1->A, DST->A, 0, 0); - - sprintf (F->mode, "%s", ((s=get_string_variable ("overaln_mode")))?s:"lower"); - if (!strm (F->mode, "lower") && !strm (F->mode, "unalign"))printf_exit (EXIT_FAILURE,stderr,"\nERROR: unknown overal_mode in overal output [%s] [FATAL:%s]", F->mode, PROGRAM); - - if (int_variable_isset ("overaln_threshold"))F->t=get_int_variable ("overaln_threshold"); - if (int_variable_isset ("overaln_target"))F->f=get_int_variable ("overaln_target"); - if (int_variable_isset ("overaln_P1"))F->f=get_int_variable ("overaln_P1"); - if (int_variable_isset ("overaln_P1"))F->f=get_int_variable ("overaln_P2"); - if (int_variable_isset ("overaln_P1"))F->f=get_int_variable ("overaln_P3"); - if (int_variable_isset ("overaln_P1"))F->f=get_int_variable ("overaln_P4");//F P1 P2 P3 T; - - D2->A=aln2clean_pw_aln (D2->A, F); - r=aln2pred (D1->A, D2->A,"case_l_"); - fprintf ( stdout, "sn %.2f sp %.2f re %.2f\n", r[0], r[1], r[2]); - exit (0); - } - - -//JM_START - else if ( strm ( action, "aln2hitMat")) - { - aln2hitMat(D1->A, ACTION(1)); - myexit (EXIT_SUCCESS); - } -//JM_END - - else - { - fprintf ( stderr, "\nWARNING: ACTION %s UNKNOWN and IGNORED\n", action); - } - } - - -void aln2mat_diaa (Sequence *S) -{ - int a, aa1, aa2, aa3, aa4; - int s1, s2, p; - Alignment *A; - - int ****m; - int **c; - int naa=0; - int count=0; - double Delta=0.00001; - int *alp; - int tot,u; - double observed, expected, f_diaa1, f_diaa2, v; - - - alp=vcalloc (256, sizeof (int)); - for (a=0; a<26; a++)alp[a+'a']=1; - alp['b']=0; - alp['j']=0; - alp['o']=0; - alp['u']=0; - alp['x']=0; - alp['z']=0; - - m=declare_arrayN (4,sizeof (int),26,26,26,26); - c=declare_arrayN (2,sizeof (int),26,26); - - for ( a=0; a< S->nseq; a++) - { - fprintf ( stderr, "%s\n", S->name[a]); - A=main_read_aln (S->name[a],NULL); - for (s1=0; s1nseq; s1++)lower_string (A->seq_al[s1]); - - for ( s1=0; s1nseq-1; s1++) - for (s2=s1+1; s2nseq; s2++) - { - for (p=0; plen_aln-1; p++) - { - - u =alp[aa1=A->seq_al[s1][p]]; - u+=alp[aa2=A->seq_al[s1][p+1]]; - u+=alp[aa3=A->seq_al[s2][p]]; - u+=alp[aa4=A->seq_al[s2][p+1]]; - - if ( u==4) - { - aa1-='a';aa2-='a';aa3-='a'; aa4-='a'; - - c[aa1][aa2]++; - c[aa3][aa4]++; - m[aa1][aa2][aa3][aa4]++; - count+=2; - } - } - } - free_aln (A); - } - fprintf ( stdout, "# DIAA_MATRIX_FORMAT_01\n"); - naa=26; - for (aa1=0; aa10)fprintf ( stdout, "TEST C=%d expected=%.4f observed=%.4f v=%.4f [%d %d %d][%d] tot=%d\n", count, (float)expected, (float)observed, (float) v, c[aa1][aa2], c[aa3][aa4], count, m[aa1][aa2][aa3][aa4], tot); - fprintf ( stdout, "%c%c %c%c %d %d\n", aa1+'a', aa2+'a', aa3+'a', aa4+'a', (int)v, m[aa1][aa2][aa3][aa4]+ m[aa3][aa4][aa1][aa2]); - } - } - exit (EXIT_SUCCESS); -} -void aln2mat (Sequence *S) -{ - int a, aa1, aa3; - int s1, s2, p; - Alignment *A; - - int **m; - int *c; - int naa=0; - int count=0; - double Delta=0.00001; - int *alp; - int tot,u; - double observed, expected, f_diaa1, f_diaa2, v; - - - alp=vcalloc (256, sizeof (int)); - for (a=0; a<26; a++)alp[a+'a']=1; - alp['b']=0; - alp['j']=0; - alp['o']=0; - alp['u']=0; - alp['x']=0; - alp['z']=0; - - m=declare_arrayN (2,sizeof (int),26,26); - c=declare_arrayN (1,sizeof (int),26); - - for ( a=0; a< S->nseq; a++) - { - fprintf ( stderr, "%s\n", S->name[a]); - A=main_read_aln (S->name[a],NULL); - for (s1=0; s1nseq; s1++)lower_string (A->seq_al[s1]); - - for ( s1=0; s1nseq-1; s1++) - for (s2=s1+1; s2nseq; s2++) - { - for (p=0; plen_aln-1; p++) - { - - u =alp[aa1=A->seq_al[s1][p]]; - u+=alp[aa3=A->seq_al[s2][p]]; - - if ( u==2) - { - aa1-='a';aa3-='a'; - - c[aa1]++; - c[aa3]++; - m[aa1][aa3]++; - count+=2; - } - } - } - free_aln (A); - } - fprintf ( stdout, "# MONOAA_MATRIX_FORMAT_01\n"); - naa=26; - for (aa1=0; aa10)fprintf ( stdout, "TEST C=%d expected=%.4f observed=%.4f v=%.4f [%d %d %d][%d] tot=%d\n", count, (float)expected, (float)observed, (float) v, c[aa1][aa2], c[aa3][aa4], count, m[aa1][aa2][aa3][aa4], tot); - fprintf ( stdout, "%c %c %d %d\n", aa1+'a', aa3+'a', (int)v, m[aa1][aa3]+ m[aa3][aa1]); - } - } - exit (EXIT_SUCCESS); -} - - -int **seq2latmat ( Sequence *S, char *fname) -{ - int a, b, r0, r1; - char *aa; - int naa; - int *count, tot; - int **mat; - double observed, expected; - FILE *fp; - - fp=vfopen (fname, "w"); - - count=vcalloc ( 256, sizeof (int)); - mat=declare_int (256, 256); - - naa=strlen ( BLAST_AA_ALPHABET); - aa=vcalloc ( naa+2, sizeof (char)); - sprintf ( aa, "%s", BLAST_AA_ALPHABET); - lower_string (aa); - - for ( tot=0,a=0; a< S->nseq; a++) - { - ungap (S->seq[a]); - for ( b=1; blen[a]; b++) - { - r0=tolower(S->seq[a][b-1]); - r1=tolower(S->seq[a][b]); - - mat[r0][r1]++; - //count[r0]++; - count[r1]++; - tot++; - } - } - for ( a=0; a< naa; a++) - for (b=0; b< naa; b++) - { - if ( aa[a]=='*' || aa[b]=='*'); - else - { - expected=((double)count[(int)aa[a]]/(double)tot)* ((double)count[(int)aa[b]]/(double)tot)*(double)tot; - observed=((double)mat[(int)aa[a]][(int)aa[b]]); - - /* - fprintf ( stderr, "\n%c=%d %c=%d Tot=%d Obs=%d Exp=%d\n", aa[a],count[aa[a]], aa[b],count[aa[b]],tot, mat[aa[a]][aa[b]],(int)expected); - fprintf ( stderr, "\n%d", mat[aa[a]][aa[b]]); - fprintf ( stderr, "\n%d", mat[aa[a]][aa[b]]); - */ - mat[(int)aa[a]][(int)aa[b]]=(expected==0 || observed==0)?0:((int)10*log((observed/expected))); - } - } - - fprintf (fp,"# BLAST_MATRIX FORMAT\n#ALPHABET=%s\n#TRANSITION MATRIX TRAINED ON %d Sequence\n#", BLAST_AA_ALPHABET, S->nseq); - for (a=0; a< naa; a++)fprintf ( fp, "%3c ", toupper(aa[a])); - fprintf (fp,"\n"); - for (a=0; a< naa; a++) - { - - fprintf (fp, "%c", toupper(aa[a])); - for ( b=0; b< naa; b++) - { - fprintf (fp, "%3d ", mat[(int)aa[a]][(int)aa[b]]); - } - fprintf ( fp, "\n"); - } - vfclose (fp); - vfree (count); - vfree (aa); - - return mat; -} - -double* mat2cmp ( int **mat1, int **mat2) -{ - int a, b, n, x, y; - double **list, *r; - if ( !mat1 || !mat2) - { - fprintf ( stderr, "\nERROR: mat2cmp needs two matrices [FATAL:%s]", PROGRAM); - myexit (EXIT_FAILURE); - } - - for (n=0, a=0; a< 256; a++) - for ( b=0; b<256; b++) - { - x=mat1[a][b]; - y=mat2[a][b]; - if ( x|| y)n++; - } - if ( n==0) return 0; - list=declare_double (n, 2); - - for (n=0, a=0; a<256; a++) - for ( b=0; b<256; b++) - { - x=mat1[a][b]; - y=mat2[a][b]; - if ( x || y) - { - list[n][0]=x; - list[n][1]=y; - n++; - } - } - r=return_r (list, n); - free_double(list, -1); - return r; -} - -int ** read_blast_matrix ( char *mat_name) - { - FILE *fp; - int n_aa,aa1, aa2; - int a, b, c; - int **matrix; - int value; - char sbuf[VERY_LONG_STRING]; - char buf[2]; - char alp[257]; - - matrix=declare_int (256,256); - vfree ( matrix[30]); - matrix[30]=vcalloc(10000, sizeof (int)); - fp=vfopen ( mat_name, "r"); - while ( (c=fgetc(fp))=='#' || isspace(c) ) - { - char *p; - fgets ( sbuf, VERY_LONG_STRING, fp); - if ( (p=strstr (sbuf, "ALPHABET"))) - sscanf (p, "ALPHABET=%s", alp); - } - ungetc(c, fp); - lower_string (alp); - n_aa=strlen (alp); - - for ( a=0; a< n_aa; a++) - { - fscanf ( fp, "%s ", buf); - - aa1=tolower(buf[0]); - - if ( aa1!=alp[a]) - { - fprintf ( stderr, "\nParsing_error when reading blast_matrix %s:\n%c %c",mat_name, aa1,alp[a]); - fprintf ( stderr, "\n%c ", fgetc(fp)); - myexit (EXIT_FAILURE); - } - for ( b=0; bnseq; a++) - { - if (S->seq_comment[a] && (s=strstr(S->seq_comment[a], "_FIRSTYEAR"))) - { - sscanf (s, "_FIRSTYEAR%d_", &first); - } - else first=1; - - for ( y=first,b=0; blen[a]; b++) - { - if ( !is_gap(S->seq[a][b])) - { - S->seq[a][b]='a'+((y/modulo))%10; - y++; - } - } - if ( (s=strstr ( S->name[a], "_agechannel"))) - { - sprintf ( s, "%s", new_channel); - } - else strcat (S->name[a], new_channel); - } - return S; -} - -Sequence* output_n_pavie_age_channel (Sequence *S, char *name, int n) -{ - int x, a; - if (!n)n=2; - - - for ( x=1,a=0; a< n; a++, x*=10) - { - S=output_pavie_age_channel(S, name,x); - } -return S; -} - - - - -Sequence* output_pavie_age_channel (Sequence *S, char *name, int modulo) - { - Alignment *A; - FILE *fp; - static int display; - char mat_list_name[100]; - char seq_list[1000]; - char mat_name[1000]; - char *tmp; - - sprintf ( mat_list_name, "%s_pavie_age_matrix.mat_list", name); - sprintf (seq_list, "%s_age_channel.fasta",name); - - if ( display==0 ) - { - if (check_file_exists(seq_list))vremove (seq_list); - if (check_file_exists(mat_list_name))vremove (mat_list_name); - } - sprintf (mat_name, "%s_age_mat_mod%d.mat",name, modulo); - output_age_matrix ( mat_name, modulo); - - fp=vfopen ( mat_list_name,"a"); - fprintf ( fp, "%s\n", mat_name); - vfclose ( fp); - - S=seq2year (S,modulo); - A=seq2aln (S, NULL, KEEP_GAP); - output_fasta_seq (tmp=vtmpnam (NULL),A); - file_cat ( tmp, seq_list); - - if ( display==0) - { - display_output_filename ( stdout, "AGE_MAT_LIST", "MAT_LIST", mat_list_name, CHECK); - display_output_filename ( stdout, "AGE_SEQ", "FASTA", seq_list, CHECK); - display=1; - } - fprintf ( stderr, "\nModulo:%d years", modulo); - fprintf ( stderr, "\n"); - free_aln (A); - return S; - } -// -// Name MAnipulation -// - -Alignment *clean_aln (Alignment *A) -{ - if ( A) - { - A->seq_comment=clean_string (A->nseq, A->seq_comment); - A->aln_comment=clean_string (A->nseq, A->aln_comment); - A->name=translate_names(A->nseq, A->name); - (A->S)=clean_sequence ((A->S)); - } - return A; -} -Sequence *clean_sequence ( Sequence *S) -{ - if ( !S) return S; - - S->seq_comment=clean_string (S->nseq, S->seq_comment); - S->name=translate_names(S->nseq, S->name); - return S; -} -char ** translate_names (int n, char **name) -{ - int a; - for ( a=0; a<", name[a]))name[a]='_'; - - } - sprintf (buf,"%s",decode_name (name, DECODE)); - if ( strlen (buf)>read_array_size_new ((char *)name)) - { - name=vrealloc (name, sizeof (char)*(strlen (buf)+1)); - } - sprintf (name, "%s", buf); - - return name; - } -char *decode_name (char *name, int mode) -{ - static char ***name_list; - static int n; - static char tag[100]; - int a; - - if (mode==CLEAN) - { - for (a=0; a %s\n", name_list[a][0], name_list[a][1]); - return file; - } - if (mode ==DECODE && name_list==NULL)return name; - if ( name==NULL) return name; - - - - if (!tag[0]) - { - vsrand (0); - sprintf ( tag, "TCTAG_%d",rand ()%100000); - } - - if ( mode==CODE) - { - for (a=0; a< n; a++) - if ( strm (name, name_list[a][0]))return name_list[a][1]; - - - name_list=realloc (name_list, sizeof (char**)*(n+1)); - name_list[n]=vcalloc (2, sizeof (char*)); - name_list[n][0]=vcalloc (strlen (name)+1, sizeof (char)); - name_list[n][1]=vcalloc (100, sizeof (char)); - sprintf ( name_list[n][0], "%s", name); - sprintf ( name_list[n][1], "%s_%d", tag,n+1); - return name_list[n++][1]; - } - else if ( mode ==DECODE) - { - char *p; - int i; - if ( !(p=after_strstr (name, tag)))return name; - else - { - sscanf (p, "_%d", &i); - return name_list[i-1][0]; - } - } - else - { - printf_exit (EXIT_FAILURE, stderr,"Unknown Mode for Decode_name [FATAL:%s]", PROGRAM); - } - return NULL; -} - - -FILE * display_sequences_names (Sequence *S, FILE *fp, int check_pdb_status, int print_templates) - { - int a; - int max_len; - char *r; - - if ( !S) - { - fprintf (fp,"\nERROR: NO SEQUENCE READ [FATAL:%s]\n", PROGRAM); myexit (EXIT_FAILURE); - } - for ( a=0, max_len=0; a< S->nseq; a++)max_len=MAX(max_len, strlen (S->name[a])); - fprintf ( fp, "\nINPUT SEQUENCES: %d SEQUENCES [%s]", S->nseq,(S->type)?S->type:"Unknown type"); - for ( a=0; a< S->nseq; a++) - { - fprintf (fp, "\n Input File %-*s Seq %-*s Length %4d type %s",max_len,S->file[a], max_len,S->name[a],(int)strlen ( S->seq[a]), S->type); - if (check_pdb_status) - { - if ((r=seq_is_pdb_struc (S, a)))fprintf (fp, " Struct Yes PDBID %s", get_pdb_id(r)); - else fprintf (fp, " Struct No"); - /* - if (is_pdb_struc (S->name[a])||is_pdb_struc (S->file[a]) )fprintf (fp, " Struct Yes"); - else fprintf (fp, " Struct No"); - */ - } - else fprintf (fp, " Struct Unchecked"); - if ( print_templates)fp=display_sequence_templates (S, a, fp); - - - } - fprintf ( fp, "\n"); - return fp; - - } -Sequence *add_file2file_list (char *name, Sequence *S) -{ - - if (!S) S=declare_sequence (1,1,10); - else S=realloc_sequence (S,S->nseq+1,0);S->nseq=0; - - sprintf ( S->name[S->nseq++], "%s", name); - return S; - -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/reformat_struc.c b/binaries/src/tcoffee/t_coffee_source/reformat_struc.c deleted file mode 100644 index 10ccc6d..0000000 --- a/binaries/src/tcoffee/t_coffee_source/reformat_struc.c +++ /dev/null @@ -1,1093 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "dp_lib_header.h" -#include "define_header.h" - - - -#define FATAL "fatal:reformat_struc" - -char * process_repeat (char *aln, char *seq, char *pdb) -{ - char *tf, *file, *name; - Alignment *A, *A2; - Sequence *S, *P; - int r1, r2, is_r1, is_r2, l1=0, l2=0, a; - int *pos; - FILE *fp; - - A=main_read_aln (aln, NULL); - for (a=0; anseq; a++)ungap(A->seq_al[a]); - - S=main_read_seq (seq); - P=get_pdb_sequence (pdb); - - - A2=align_two_sequences (S->seq[0], P->seq[0], "pam250mt", -10, -1, "myers_miller_pair_wise"); - - pos=vcalloc ( A2->len_aln+1, sizeof (int)); - - for (l1=0, l2=0,a=0; a< A2->len_aln; a++) - { - - r1=A2->seq_al[0][a]; - r2=A2->seq_al[1][a]; - - is_r1=1-is_gap(r1); - is_r2=1-is_gap(r2); - - l1+=is_r1; - l2+=is_r2; - - if (!is_r1); - else - { - pos[l1]=l2; - } - } - tf=vtmpnam(NULL); - fp=vfopen (tf, "w"); - for (a=0; anseq; a++) - { - int *coor, b, c; - - name=A->name[a]; - file=vtmpnam (NULL); - coor=string2num_list2 (name, "-"); - - //Check the compatibility between the guide sequence and the coordinates - for ( c=0,b=coor[1]-1; bseq_al[a][c])!=tolower(S->seq[0][b])) - printf_exit (EXIT_FAILURE, stderr, "Incompatibility between the repeat [%s] and the master Sequence [%s]\n%s",A->name[a], seq, A->seq_al[a]); - } - - printf_system ( "extract_from_pdb %s -coor %d %d -seq_field SEQRES> %s", pdb,pos[coor[1]-1],pos[coor[2]-1], file); - fprintf (fp, ">%s _P_ %s\n", name, file); - vfree (coor); - } - vfclose (fp); - return tf; -} - - - -char * normalize_pdb_file (char *name_in, char *seq, char *out_file) -{ - char command[1000]; - Sequence *S; - Alignment *A; - int a; - int start, end, npdb, r1, r2; - char name[100]; - - - if ( !name_in) return NULL; - else - { - sprintf ( name, "%s", name_in); - } - - if ( !is_pdb_file(name)) - { - fprintf(stdout, "\nERROR[normalize_pdb_file]: %s is not a pdb file[FATAL:%s]\n", name, PROGRAM); - myexit (EXIT_FAILURE); - } - - S=get_pdb_sequence (name); - A=align_two_sequences (S->seq[0],seq,"idmat",-3,0, "fasta_pair_wise"); - - - - for (start=-1, end=-1,npdb=0,a=0; a< A->len_aln; a++) - { - r1=1-is_gap(A->seq_al[0][a]); - r2=1-is_gap(A->seq_al[1][a]); - - npdb+=r1; - - if (r1 && r2 && start==-1)start=npdb; - if (r1 && r2)end=npdb; - } - - free_aln(A); - free_sequence (S, -1); - - sprintf ( command, "extract_from_pdb -infile %s -atom ALL -chain FIRST -coor %d %d -nodiagnostic > %s", check_file_exists(name), start, end, out_file); - my_system ( command); - return out_file; - } - -Ca_trace * trim_ca_trace (Ca_trace *T, char *seq ) -{ - /*This function: - -removes from Ca trace all the residues that are not in the sequence - -add in the Ca trace residues unmatched in the structure (it gives them a NULL structure) - */ - Alignment *ALN; - Atom *A; - int a,l, s, r, is_r, is_s; - int *seq_cache, *struc_cache; - int tot_l=0; - - char buf1[10000]; - char buf2[10000]; - - /* lower_string (T->seq); - lower_string (seq); - */ - - - sprintf (buf1, "%s", T->seq); - sprintf (buf2, "%s", seq); - lower_string (buf1); - lower_string (buf2); - - - if ( strm (buf1,buf2))return T; - else - { - ALN=align_two_sequences (T->seq,seq, "est_idmat",-1, 0,"fasta_pair_wise"); - struc_cache=vcalloc (ALN->len_aln+1, sizeof (int)); - seq_cache =vcalloc (ALN->len_aln+1, sizeof (int)); - - for ( r=0, s=0,a=0; a< ALN->len_aln; a++) - { - is_r=!is_gap(ALN->seq_al[0][a]); - is_s=!is_gap(ALN->seq_al[1][a]); - - r+=is_r; - s+=is_s; - - if ( is_s && is_r) - { - struc_cache[r-1]=s-1; - seq_cache[s-1]=r-1; - } - else if ( is_s && !is_r) - { - seq_cache[s-1]=-1; - - } - else if ( !is_s && is_r) - { - struc_cache[r-1]=-1; - } - } - - T->ca=vrealloc ( T->ca, sizeof (Atom*)*(ALN->len_aln+1)); - T->peptide_chain=vrealloc ( T->peptide_chain, (sizeof (Amino_acid*))*(ALN->len_aln+1)); - T->seq=vrealloc ( T->seq, ALN->len_aln+1); - - for ( a=T->len; a< ALN->len_aln; a++) - { - T->peptide_chain[a]=vcalloc (1, sizeof (Amino_acid)); - } - - - /*Read every atom*/ - for ( a=0; a< T->n_atom; a++) - { - - A=(T->structure[a]); - if ( struc_cache[A->res_num-1]==-1)continue; - else - { - /*set the struc residue to its sequence index*/ - A->res_num=struc_cache[A->res_num-1]+1; - if (strm (A->type, "CA")) {T->ca[A->res_num-1]=A;tot_l++;} - if ( strm (A->type, "CA"))(T->peptide_chain[A->res_num-1])->CA=A; - if ( strm (A->type, "C"))(T->peptide_chain[A->res_num-1] )->C=A; - if ( strm (A->type, "CB"))(T->peptide_chain[A->res_num-1])->CB=A; - if ( strm (A->type, "N"))(T->peptide_chain[A->res_num-1] )->N=A; - } - } - - l=strlen(seq); - for ( a=0;a< l; a++) - { - - if ( seq_cache[a]==-1) - { - tot_l++; - T->ca[a]=NULL; - - if (!T->peptide_chain[a])T->peptide_chain[a]=vcalloc (1, sizeof (Amino_acid)); - T->peptide_chain[a]->CA=NULL; - T->peptide_chain[a]->C =NULL; - T->peptide_chain[a]->CB=NULL; - T->peptide_chain[a]->N=NULL; - T->seq[a]='x'; - } - else - { - T->seq[a]=seq[a]; - } - } - T->len=ALN->len_aln; - - /* - T->len=tot_l; - */ - - free_aln (ALN); - vfree(seq_cache); - vfree(struc_cache); - - - } - return T; -} - -Ca_trace * read_ca_trace (char *name, char *seq_field ) -{ - char *tp_name=NULL; - char command[10000]; - - - if ( !is_simple_pdb_file (name)) - { - tp_name=vtmpnam (NULL); - sprintf ( command, "extract_from_pdb -seq_field %s -infile %s -atom ALL -chain FIRST -mode simple> %s",seq_field, check_file_exists(name), tp_name); - if ( getenv4debug ("DEBUG_EXTRACT_FROM_PDB"))fprintf ( stderr, "\n[DEBUG_EXTRACT_FROM_PDB:read_ca_trace] %s\n", command); - my_system ( command); - } - else - tp_name=name; - - return simple_read_ca_trace (tp_name); -} - -Ca_trace * simple_read_ca_trace (char *tp_name ) - { - /*This function reads a pdb file into a Ca_trace structure*/ - - - - int a, c, n; - FILE *fp; - Atom *A; - char res; - char *buf; - Ca_trace *T=NULL; - int res_num=0, last_res_num=0; - - - buf=vcalloc ( VERY_LONG_STRING, sizeof (char)); - n=count_n_line_in_file (tp_name ); - - if ( !T) - { - T=vcalloc ( 1, sizeof ( Ca_trace)); - declare_name (T->name); - } - - /*1 Get the complete sequence: replace missing residues with Xs*/ - for (a=0; a< VERY_LONG_STRING; a++)buf[a]='x'; - res=res_num=0; - - fp=vfopen (tp_name, "r"); - while ( (c=fgetc(fp))!='>'); - fscanf ( fp, "%*s" ); - while ( (c=fgetc(fp))!='\n'); - fscanf ( fp, "%*s" ); - while ( (c=fgetc(fp))!='\n'); - while ((c=fgetc(fp))!=EOF) - { - ungetc(c, fp); - - fscanf (fp, "%*s %*s %c %*c %d %*f %*f %*f\n",&res,&res_num); - if (res) - { - - res=tolower (res); - buf[res_num-1]=res; - last_res_num=res_num; - } - res=res_num=0; - } - buf[last_res_num]='\0'; - vfclose (fp); - /*Sequence Read*/ - - - T->len=strlen (buf); - T->seq=vcalloc ( T->len+1, sizeof (char)); - buf=lower_string (buf); - sprintf ( T->seq, "%s", buf); - n+=T->len; - T->structure=vcalloc ( n, sizeof (Atom*)); - for ( a=0; a< n; a++)T->structure[a]=vcalloc ( 1, sizeof (Atom)); - T->ca=vcalloc ( T->len+1, sizeof ( Atom*)); - a=0; - - fp=vfopen (tp_name, "r"); - while ( (c=fgetc(fp))!='>'); - fscanf ( fp, "%*s" ); - while ( (c=fgetc(fp))!='\n'); - fscanf ( fp, "%*s" ); - while ( (c=fgetc(fp))!='\n'); - - while ((c=fgetc(fp))!=EOF) - { - ungetc(c, fp); - A=T->structure[a]; - A->num=a; - fscanf (fp, "%*s %s %s %*c %d %f %f %f\n",A->type, A->res,&A->res_num, &A->x, &A->y, &A->z); - res=A->res[0]; - - res=tolower (res); - - T->seq[A->res_num-1]=res; - - if ( strm ( A->type, "CA")) T->ca[A->res_num-1]=A; - a++; - } - T->n_atom=a; - - T->peptide_chain=vcalloc (T->len+1, sizeof (Amino_acid*)); - for ( a=0; a<=T->len; a++) T->peptide_chain[a]=vcalloc (1, sizeof (Amino_acid)); - for ( a=0; a< T->n_atom; a++) - { - A=T->structure[a]; - - if ( strm (A->type, "CA"))(T->peptide_chain[A->res_num-1])->CA=A; - if ( strm (A->type, "C"))(T->peptide_chain[A->res_num-1] )->C=A; - if ( strm (A->type, "CB"))(T->peptide_chain[A->res_num-1])->CB=A; - if ( strm (A->type, "N"))(T->peptide_chain[A->res_num-1] )->N=A; - } - - - vfclose (fp); - vfree (buf); - return T; - } -Ca_trace * hasch_ca_trace ( Ca_trace *T) - { - - T=hasch_ca_trace_nb (T); - T=hasch_ca_trace_bubble (T); - T=hasch_ca_trace_transversal (T); - return T; - } -Ca_trace * hasch_ca_trace_transversal ( Ca_trace *TRACE) - { - /*This function gets the Coordinates of a protein and computes the distance of each Ca to its - - given a Ca, - Compute the distance between, CA-x and CA+x with x=[1-N_ca] - T->nb[a][0]-->Number of distances. - T->nb[a][1... T->nb[a][0]]-->ngb index with respect to the Ca chain - T->d_nb[a][1... T->d_nb[a][0]]-->ngb index with respect to the Ca chain - */ - - int a, b, d; - float dist; - Atom *A, *B; - - Struct_nb *T; - Pdb_param *PP; - - - TRACE->Transversal=vcalloc ( 1, sizeof (Struct_nb)); - - T=TRACE->Transversal; - PP=TRACE->pdb_param; - - if ( !T->nb)T->nb=declare_int (TRACE->len+1, 1); - if ( !T->d_nb)T->d_nb=declare_float (TRACE->len+1, 1); - - for (d=0,a=0; a< TRACE->len; a++) - { - - for ( b=1; b<=PP->N_ca; b++) - { - if ( (a-b)<0 || (a+b)>=TRACE->len)continue; - A=TRACE->ca[a-b]; - B=TRACE->ca[a+b]; - dist=get_atomic_distance ( A, B); - - T->nb[a]=vrealloc ( T->nb[a], (++T->nb[a][0]+1)*sizeof (int)); - T->nb[a][T->nb[a][0]]=b; - - T->d_nb[a]=vrealloc ( T->d_nb[a], (T->nb[a][0]+1)*sizeof (float)); - T->d_nb[a][T->nb[a][0]]=dist; - - d++; - } - T->max_nb=MAX (T->max_nb, T->nb[a][0]); - } - return TRACE; - - } - -Ca_trace * hasch_ca_trace_nb ( Ca_trace *TRACE) - { - /*This function gets the Coordinates of a protein and computes the distance of each Ca to its - T->N_ca Ngb. - The first Ngb to the left and to the right are excluded - Ngd to the left get negative distances - Ngb to the right receive positive distances - T->nb[a][0]-->Number of ngb. - T->nb[a][1... T->nb[a][0]]-->ngb index with respect to the Ca chain - T->d_nb[a][1... T->d_nb[a][0]]-->ngb index with respect to the Ca chain - */ - - - - int a, b, d; - float dist; - Atom *A, *B; - - Struct_nb *T; - Pdb_param *PP; - - TRACE->Chain=vcalloc ( 1, sizeof (Struct_nb)); - - T=TRACE->Chain; - PP=TRACE->pdb_param; - - if ( !T->nb)T->nb=declare_int (TRACE->len+1, 1); - if ( !T->d_nb)T->d_nb=declare_float (TRACE->len+1, 1); - - for (d=0,a=0; a< TRACE->len; a++) - { - for ( b=MAX(0,a-PP->N_ca); b< MIN( a+PP->N_ca, TRACE->len); b++) - { - if (FABS(a-b)<2)continue; - A=TRACE->ca[a]; - B=TRACE->ca[b]; - if ( !A || !B)continue; - dist=get_atomic_distance ( A, B); - if (bnb[a]=vrealloc ( T->nb[a], (++T->nb[a][0]+1)*sizeof (int)); - T->nb[a][T->nb[a][0]]=b; - - T->d_nb[a]=vrealloc ( T->d_nb[a], (T->nb[a][0]+1)*sizeof (float)); - T->d_nb[a][T->nb[a][0]]=dist; - d++; - } - - T->max_nb=MAX (T->max_nb, T->nb[a][0]); - } - return TRACE; - - } -Ca_trace * hasch_ca_trace_bubble ( Ca_trace *TRACE) - { - - int a, b; - float dist; - Atom *A, *B; - float **list; - Pdb_param *PP; - Struct_nb *T; - - PP=TRACE->pdb_param; - TRACE->Bubble=vcalloc ( 1, sizeof (Struct_nb)); - T=TRACE->Bubble; - - - - if ( !T->nb)T->nb=declare_int (TRACE->len+1, 1); - if ( !T->d_nb)T->d_nb=declare_float (TRACE->len+1, 1); - list=declare_float ( TRACE->n_atom, 3); - - - for (a=0; a< TRACE->len; a++) - { - for ( b=0; b< TRACE->len; b++) - { - A=TRACE->ca[a]; - B=TRACE->ca[b]; - if ( !A || !B)continue; - dist=get_atomic_distance ( A, B); - - if ( distmaximum_distance && FABS((A->res_num-B->res_num))>2) - { - T->nb[a][0]++; - T->nb[a]=vrealloc ( T->nb[a], (T->nb[a][0]+1)*sizeof (int)); - T->nb[a][T->nb[a][0]]=(TRACE->ca[b])->num; - - T->d_nb[a]=vrealloc ( T->d_nb[a], (T->nb[a][0]+1)*sizeof (float)); - T->d_nb[a][T->nb[a][0]]= ((amax_nb=MAX (T->max_nb, T->nb[a][0]); - - } - - for ( a=0; a< TRACE->len; a++) - { - for ( b=0; b< T->nb[a][0]; b++) - { - list[b][0]=T->nb[a][b+1]; - list[b][1]=T->d_nb[a][b+1]; - list[b][2]=(TRACE->structure[T->nb[a][b+1]])->res_num; - } - - sort_float ( list, 3,2, 0, T->nb[a][0]-1); - for ( b=0; b< T->nb[a][0]; b++) - { - T->nb[a][b+1]=list[b][0]; - T->d_nb[a][b+1]=list[b][1]; - } - } - - free_float ( list, -1); - return TRACE; - - } - - -float ** measure_ca_distances(Ca_trace *T) - { - int a, b; - Atom *A, *B; - float **dist; - - dist=declare_float ( T->len, T->len); - - for (a=0; a< T->len-1; a++) - { - for ( b=a+1; b< T->len; b++) - { - - A=T->ca[a]; - B=T->ca[b]; - dist[a][b]=dist[b][a]=get_atomic_distance ( A, B); - - } - } - return dist; - } -float get_atomic_distance ( Atom *A, Atom*B) - { - float dx, dy, dz, d; - - if ( !A || !B) - { - return UNDEFINED; - } - - - dx=A->x - B->x; - dy=A->y - B->y; - dz=A->z - B->z; - - - d=(float) sqrt ( (double) ( dx*dx +dy*dy +dz*dz)); - return d; - } - -char * map_contacts ( char *file1, char *file2, float T) -{ - - Ca_trace *ST1, *ST2; - int *contact_list; - int a; - - - ST1=read_ca_trace (file1, "ATOM"); - ST2=read_ca_trace (file2, "ATOM"); - - contact_list=identify_contacts (ST1, ST2, T); - for ( a=0; alen; a++) - { - ST1->seq[a]=(contact_list[a]==1)?toupper(ST1->seq[a]):tolower(ST1->seq[a]); - } - - return ST1->seq; -} - -float ** print_contacts ( char *file1, char *file2, float T) -{ - - Ca_trace *ST1, *ST2; - float **dist, d; - int a, b; - Atom *A, *B; - char *list; - int *list1=NULL, *list2=NULL; - int *cache1, *cache2; - - - - if ((list=strstr (file1, "_R_"))!=NULL) - { - list[0]='\0'; - list+=3; - list1=string2num_list2(list, "_"); - } - - if ((list=strstr (file2, "_R_"))!=NULL) - { - list[0]='\0'; - list+=3; - list2=string2num_list2(list, "_"); - } - - fprintf ( stdout, "\n#%s (%s) struc2contacts_01", PROGRAM, VERSION); - fprintf ( stdout, "\nStructure %s vs %s", file1, file2); - ST1=read_ca_trace (file1, "SEQRES"); - ST2=read_ca_trace (file2, "SEQRES"); - - - cache1=vcalloc (ST1->len+1, sizeof (int)); - cache2=vcalloc (ST2->len+1, sizeof (int)); - - if (list1)for ( a=1; alen; a++)cache1[a]=1; - - if (list2)for ( a=1; alen; a++)cache2[a]=1; - - - dist=declare_float (ST1->len+1,ST2->len+1); - vfree (list1); vfree(list2); - - for ( a=0; a< ST1->n_atom; a++) - { - A=ST1->structure[a]; - if ( !cache1[A->res_num])continue; - for ( b=0; bn_atom; b++) - { - - B=ST2->structure[b]; - if( !cache2[B->res_num])continue; - - d=get_atomic_distance (A,B); - - if (dist[A->res_num][B->res_num]==0 || dist[A->res_num][B->res_num]>d)dist[A->res_num][B->res_num]=d; - } - } - - for ( a=1; a<=ST1->len; a++) - { - A=ST1->ca[a-1]; - if ( !A || !cache1[A->res_num])continue; - for ( b=1; b<= ST2->len; b++) - { - B=ST2->ca[b-1]; - if( !B || !cache2[B->res_num])continue; - if(dist[a][b]!=0)fprintf ( stdout, "\nResidue %3d [%s] vs %3d [%s] %9.4f Angstrom",A->res_num,A->res,B->res_num,B->res,dist[a][b]); - } - } - fprintf ( stdout, "\n"); - vfree (cache1);vfree(cache2); - free_float (dist, -1); - return NULL; -} - - -int * identify_contacts (Ca_trace *ST1,Ca_trace *ST2, float T) -{ - int a, b; - float d; - int *result; - - - - result=vcalloc ( ST1->len+1, sizeof (int)); - - - for ( a=0; a< ST1->n_atom; a++) - for ( b=0; bn_atom; b++) - - { - - d=get_atomic_distance (ST1->structure[a], ST2->structure[b]); - if (dstructure[a]; B=ST2->structure[b]; - fprintf ( stderr, "\n%d %s %s Vs %d %s %s: %f", A->res_num, A->res, A->type, B->res_num, B->res, B->type, d); */ - result[(ST1->structure[a])->res_num-1]=1; - } - } - return result; -} - -Sequence *seq2contacts ( Sequence *S, float T) -{ - int a; - Sequence *NS; - - - - NS=duplicate_sequence (S); - for ( a=0; a< S->nseq; a++) - { - NS->seq[a]=string2contacts ( S->seq[a], S->name[a], S->seq_comment[a], T); - } - - return NS; -} - -char *string2contacts (char *seq,char *name, char *comment, float T) -{ - char **nlist; - char *r; - char *result; - int a, b, n; - char *struc_name; - static char *struc_file; - static char *ligand_file; - Alignment *A; - char r0, r1; - - int l, ln; - char command[1000]; - /*>seq__struc Ligand1 Chain1 Ligand 2 cahin2 - Chain: index or ANY if unknown - Ligand: name of pdb file - */ - - if ( !struc_file) - { - struc_file=vtmpnam (NULL); - ligand_file=vtmpnam (NULL); - } - - - - result=vcalloc ( strlen (seq)+1, sizeof (char)); - for ( a=0; a< strlen (seq); a++)result[a]='0'; - - nlist=string2list (comment); - if ( !nlist)return result; - else - n=atoi(nlist[0]); - - struc_name=strstr(name, "_S_"); - if (!struc_name && !is_pdb_struc (name)) - { - - return result; - } - else if ( !struc_name && is_pdb_struc (name)) - { - struc_name=name; - } - else - { - struc_name+=3; - if ( check_file_exists (struc_name) && is_simple_pdb_file(struc_name)) - { - sprintf (command, "cp %s %s", name, struc_file); - } - else - { - sprintf ( command, "extract_from_pdb -infile %s -atom ALL -mode simple -force >%s",name, struc_file); - } - my_system (command); - } - - - - for ( a=1, ln=1;a%s", nlist[a], ligand_file); - a++; - } - else - { - sprintf ( command, "extract_from_pdb -infile %s -chain %s -ligand %s -ligand_only -atom ALL -mode simple -force >%s",struc_name, nlist[a+1],nlist[a], ligand_file); - a+=2; - } - my_system (command); - - if ( T>0) - { - r=map_contacts (struc_file,ligand_file,T); - - toggle_case_in_align_two_sequences (KEEP_CASE); - A=align_two_sequences (seq,r,"pam250mt", -10, -1, "myers_miller_pair_wise"); - toggle_case_in_align_two_sequences (CHANGE_CASE); - - - for ( l=0,b=0; b< A->len_aln; b++) - { - r0=A->seq_al[0][b];r1=A->seq_al[1][b]; - if (!is_gap(r0)) - { - if (isupper(r1))result[l]=(result[l]!='0')?'9':'0'+ln; - l++; - } - } - - free_aln (A); - fprintf ( stderr, " [DONE]"); - } - else if ( T==0) - { - print_contacts( struc_file,ligand_file,T); - } - - } - fprintf ( stderr, "\n"); - - return result; -} - - -char **struclist2nb (char *name,char *seq, char *comment, float Threshold, char *atom, char *output) -{ - char *list, **pdb; - int a; - char **R, *tmpf; - - tmpf=vtmpnam (NULL); - - list=strstr ( comment, "_P_")+3; - if ( !strstr (comment, "_P_"))return NULL; - else - { - pdb=string2list ( strstr ( comment, "_P_")+3); - } - - for (a=1; a%s R=%d T=%.2f %s\n%s\n", name, a+1, Threshold, comment, R[a]); - } - else - { - FILE *fp; - char c; - - fp=vfopen (tmpf, "r"); - while ( (c=fgetc(fp))!=EOF)fprintf (stdout, "%c", c); - vfclose (fp); - } - return NULL; -} - -char **struc2nb (char *name,char *seq, char *comment, float Threshold, char *atom, char *output) -{ - char *struc_file; - char *struc_name; - Ca_trace *T; - Atom *A1, *A2; - int a, b; - short **hasch; - FILE *fp; - float d; - char command[10000]; - static char **R; - - struc_file=vtmpnam (NULL); - declare_name (struc_name); - - sscanf ( strstr(comment, "_P_"), "_P_ %s", struc_name); - //struc_name=strstr(name, "_S_"); - - if (!R) - { - int l; - l=strlen (seq); - R=declare_char (l+1, l+1); - for ( a=0; a%s",struc_name,(atom==NULL)?"ALL":atom, struc_file); - } - - my_system (command); - } - T=read_ca_trace (struc_file, "ATOM"); - hasch=declare_short (T->len, T->len); - - if (!R) - { - int l; - l=strlen (seq); - R=declare_char (l+1, l+1); - for ( a=0; an_atom; a++) - for ( b=0; b< T->n_atom; b++) - { - A1=T->structure[a];A2=T->structure[b]; - d=get_atomic_distance (A1, A2); - - if ( dres_num-1][A2->res_num-1]=1; - } - } - fp=vfopen (output, "a"); - fprintf ( fp, "#Distance_map_format_01\n#Sequence %s with T= %.2f", struc_name, Threshold); - for ( a=0; alen; a++) - { - int c; - c=change_residue_coordinate ( T->seq,seq,a); - - if ( c!=-1 && seq) - { - char r1, r2; - r1=(T->seq)[a]; - r2=seq[c]; - r1=tolower(r1);r2=tolower(r2); - if ( r1!=r2) continue; - R[c][c]=toupper (R[c][c]); - fprintf (fp, "\n%s Residue %d ",struc_name,c+1); - for ( b=0; blen; b++) - { - int d; - char r3, r4; - r3=(T->seq)[a];r4=seq[c]; - r3=tolower(r3);r4=tolower(r4); - if ( r3!=r4) continue; - - d=change_residue_coordinate (T->seq,seq,b); - - if ( hasch[a][b] && d!=-1) - { - fprintf (fp, "%d ",d+1); - R[c][d]=toupper (R[c][d]); - } - } - fprintf (fp, ";"); - } - } - free_short (hasch, -1); - fprintf (fp, "\n"); - return R; -} - -short **seq2nb (char *seq, char *pdb, float Threshold, char *atom) -{ - char *struc_file; - char *struc_name; - Ca_trace *T; - Atom *A1, *A2; - int a, b; - short **hasch; - short **result; //Contains the result for every residue of seq - float d; - char command[10000]; - - // get a clean pdb file - struc_file=vtmpnam (NULL); - if ( check_file_exists (struc_file) && is_simple_pdb_file(struc_name)) - { - sprintf (command, "cp %s %s", pdb, struc_file); - } - else - { - sprintf ( command, "extract_from_pdb -infile %s -atom %s -mode simple -force >%s",pdb,(atom==NULL)?"ALL":atom, struc_file); - } - my_system (command); - - //Read and hasch the PDB file - T=read_ca_trace (struc_file, "ATOM"); - hasch=declare_short (T->len, T->len); - result=declare_short (strlen (seq)+1, strlen (seq)+1); - for ( a=0; a< T->n_atom; a++) - for ( b=0; b< T->n_atom; b++) - { - A1=T->structure[a];A2=T->structure[b]; - d=get_atomic_distance (A1, A2); - - if ( dres_num-1][A2->res_num-1]=1; - } - } - - for ( a=0; alen; a++) - { - int c; - c=change_residue_coordinate ( T->seq,seq,a); - if ( c!=-1) - { - for ( b=0; blen; b++) - { - int d; - d=change_residue_coordinate (T->seq,seq,b); - - if ( hasch[a][b] && d!=-1) - { - result[c][result[c][0]++]=d; - } - } - } - } - free_short (hasch, -1); - return result; -} -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/showpair.c b/binaries/src/tcoffee/t_coffee_source/showpair.c deleted file mode 100644 index ed4ae69..0000000 --- a/binaries/src/tcoffee/t_coffee_source/showpair.c +++ /dev/null @@ -1,560 +0,0 @@ -#include -#include -#include -#include - -#include "io_lib_header.h" -#include "util_lib_header.h" -#include "define_header.h" -#include "dp_lib_header.h" - -static void make_p_ptrs(int *tptr, int *pl, int naseq, int l); -static void make_n_ptrs(int *tptr, int *pl, int naseq, int len); -static void put_frag(int fs, int v1, int v2, int flen); -static int frag_rel_pos(int a1, int b1, int a2, int b2); -static void des_quick_sort(int *array1, int *array2, int array_size); -static void pair_align(int seq_no, int l1, int l2); - - -/* -* Prototypes -*/ - -/* -* Global variables -*/ -/*extern int *seqlen_array; - extern char **seq_array; - extern int dna_ktup, dna_window, dna_wind_gap, dna_signif; params for DNA - extern int prot_ktup,prot_window,prot_wind_gap,prot_signif; params for prots - extern int nseqs; - extern Boolean dnaflag; - extern double **tmat; - extern int max_aa; - extern int max_aln_length; -*/ - -static int *seqlen_array; -static char **seq_array; - -static int nseqs; -static int dnaflag; -static int max_aln_length; -static int max_aa; - -static int next; -static int curr_frag,maxsf; -static int **accum; -static int *diag_index; -static char *slopes; - -int ktup,window,wind_gap,signif; /* Pairwise aln. params */ -int *displ; -int *zza, *zzb, *zzc, *zzd; - -static Boolean percent=1; - - -static void make_p_ptrs(int *tptr,int *pl,int naseq,int l) -{ - static int a[10]; - int i,j,limit,code,flag; - int residue; - - /*tptr--> pointer to the last occurence of the same residue or ktuple: - - abcdeabef - - tptr: 0 0 0 0 0 1 2 5 0 - pl[a]=6 - pl[b]=7 - */ - - - for (i=1;i<=ktup;i++) - a[i] = (int) pow((double)(max_aa+1),(double)(i-1)); - - limit = (int) pow((double)(max_aa+1),(double)ktup); - for(i=1;i<=limit;++i) - pl[i]=0; - for(i=1;i<=l;++i) - tptr[i]=0; - - - - for(i=1;i<=(l-ktup+1);++i) { - code=0; - flag=FALSE; - for(j=1;j<=ktup;++j) { - residue = seq_array[naseq][i+j-1]; - if((residue<0) || (residue > max_aa)){ - flag=TRUE; - break; - } - code += ((residue) * a[j]); - } - if(flag) - continue; - ++code; - if(pl[code]!=0)tptr[i]=pl[code]; - pl[code]=i; - } -} - - -static void make_n_ptrs(int *tptr,int *pl,int naseq,int len) -{ - static int pot[]={ 0, 1, 4, 16, 64, 256, 1024, 4096 }; - int i,j,limit,code,flag; - int residue; - - limit = (int) pow((double)4,(double)ktup); - - for(i=1;i<=limit;++i) - pl[i]=0; - for(i=1;i<=len;++i) - tptr[i]=0; - - for(i=1;i<=len-ktup+1;++i) { - code=0; - flag=FALSE; - for(j=1;j<=ktup;++j) { - residue = seq_array[naseq][i+j-1]; - if((residue<0) || (residue>4)){ - flag=TRUE; - break; - } - code += ((residue) * pot[j]); /* DES */ - } - if(flag) - continue; - ++code; - if(pl[code]!=0) - tptr[i]=pl[code]; - pl[code]=i; - } -} - - -static void put_frag(int fs,int v1,int v2,int flen) -{ - int end; - accum[0][curr_frag]=fs; - accum[1][curr_frag]=v1; - accum[2][curr_frag]=v2; - accum[3][curr_frag]=flen; - - if(!maxsf) { - maxsf=1; - accum[4][curr_frag]=0; - return; - } - - if(fs >= accum[0][maxsf]) { - accum[4][curr_frag]=maxsf; - maxsf=curr_frag; - return; - } - else { - next=maxsf; - while(TRUE) { - end=next; - next=accum[4][next]; - if(fs>=accum[0][next]) - break; - } - accum[4][curr_frag]=next; - accum[4][end]=curr_frag; - } -} - - -static int frag_rel_pos(int a1,int b1,int a2,int b2) -{ - int ret; - - ret=FALSE; - if(a1-b1==a2-b2) { - if(a2 0) { - if(lst[p] >= ust[p]) - p--; - else { - i = lst[p] - 1; - j = ust[p]; - pivlin = array1[j]; - while(i < j) { - for(i=i+1; array1[i] < pivlin; i++) - ; - for(j=j-1; j > i; j--) - if(array1[j] <= pivlin) break; - if(i < j) { - temp1 = array1[i]; - array1[i] = array1[j]; - array1[j] = temp1; - - temp2 = array2[i]; - array2[i] = array2[j]; - array2[j] = temp2; - } - } - - j = ust[p]; - - temp1 = array1[i]; - array1[i] = array1[j]; - array1[j] = temp1; - - temp2 = array2[i]; - array2[i] = array2[j]; - array2[j] = temp2; - - if(i-lst[p] < ust[p] - i) { - lst[p+1] = lst[p]; - ust[p+1] = i - 1; - lst[p] = i + 1; - } - else { - lst[p+1] = i + 1; - ust[p+1] = ust[p]; - ust[p] = i - 1; - } - p = p + 1; - } - } - return; - -} - - - - - -static void pair_align(int seq_no,int l1,int l2) -{ - int pot[8],i,j,l,m,flag,limit,pos,tl1,vn1,vn2,flen,osptr,fs; - int tv1,tv2,encrypt,subt1,subt2,rmndr; - int residue; - - if(dnaflag) { - for(i=1;i<=ktup;++i) - pot[i] = (int) pow((double)4,(double)(i-1)); - limit = (int) pow((double)4,(double)ktup); - } - else { - for (i=1;i<=ktup;i++) - pot[i] = (int) pow((double)(max_aa+1),(double)(i-1)); - limit = (int) pow((double)(max_aa+1),(double)ktup); - } - - tl1 = (l1+l2)-1; - - for(i=1;i<=tl1;++i) { - slopes[i]=displ[i]=0; - diag_index[i] = i; - } - - -/* increment diagonal score for each k_tuple match */ -/* Attempt at guessing the best band by looking at identities*/ - - for(i=1;i<=limit;++i) - { - vn1=zzc[i]; - while(TRUE) - { - if(!vn1) break; - vn2=zzd[i]; - while(vn2 != 0) - { - osptr=vn1-vn2+l2; - ++displ[osptr]; /*PLUG THE Pos Dependant Scheme Here!!!! (For Id only)*/ - vn2=zzb[vn2]; - } - vn1=zza[vn1]; - } - } - -/* choose the top SIGNIF diagonals */ - - des_quick_sort(displ, diag_index, tl1); - - j = tl1 - signif + 1; - if(j < 1) j = 1; - -/* flag all diagonals within WINDOW of a top diagonal */ - - for(i=tl1; i>=j; i--) - if(displ[i] > 0) { - pos = diag_index[i]; - l = (1 >pos-window) ? 1 : pos-window; - m = (tl1max_aa)){flag=TRUE; break;}encrypt += ((residue)*pot[j]);} - if(flag) continue; - else flag=FALSE; - - ++encrypt; - vn2=zzd[encrypt]; - - /*now trying to match i-ktup and vn2-ktup*/ - while(TRUE) - { - if(!vn2) - { - flag=TRUE; - break; - } - osptr=i-vn2+l2; /*osptr=Diagonal under investigation*/ - if(slopes[osptr]!=1) /*Get the next diagonal if that one is not flagged*/ - { - vn2=zzb[vn2]; - continue; - } - flen=0; - fs=ktup; - next=maxsf; - - /* A-loop*/ - while(TRUE) - { - if(!next) - { - ++curr_frag; - if(curr_frag>=2*max_aln_length) - { - - return; - } - displ[osptr]=curr_frag; - put_frag(fs,i,vn2,flen); /*sets the coordinates of the fragments*/ - } - else - { - tv1=accum[1][next]; - tv2=accum[2][next]; - if(frag_rel_pos(i,vn2,tv1,tv2)) - { - if(i-vn2==accum[1][next]-accum[2][next]) - { - if(i>accum[1][next]+(ktup-1)) - fs=accum[0][next]+ktup; - else - { - rmndr=i-accum[1][next]; - fs=accum[0][next]+rmndr; - } - flen=next; - next=0; - continue; - } - else - { - if(displ[osptr]==0) - subt1=ktup; - else - { - if(i>accum[1][displ[osptr]]+(ktup-1)) - subt1=accum[0][displ[osptr]]+ktup; - else - { - rmndr=i-accum[1][displ[osptr]]; - subt1=accum[0][displ[osptr]]+rmndr; - } - } - subt2=accum[0][next]-wind_gap+ktup; - if(subt2>subt1) - { - flen=next; - fs=subt2; - } - else - { - flen=displ[osptr]; - fs=subt1; - } - next=0; - continue; - } - - } - else - { - next=accum[4][next]; - continue; - } - } - break; - } - /* - * End of Aloop - */ - - vn2=zzb[vn2]; - } - } - -} - -int ** show_pair(int istart, int iend, int jstart, int jend, int *in_seqlen_array, char **in_seq_array, int dna_ktup, int dna_window, int dna_wind_gap, int dna_signif,int prot_ktup, int prot_window,int prot_wind_gap,int prot_signif, int in_nseqs,int in_dnaflag, int in_max_aa, int in_max_aln_length ) -{ - int i,j,dsr; - double calc_score; - int **tmat; - - seqlen_array=vcalloc ( in_nseqs+1, sizeof(int)); - for ( i=0; i< in_nseqs; i++)seqlen_array[i+1]=in_seqlen_array[i]; - - - seq_array=declare_char ( in_nseqs+1, in_max_aln_length); - for ( i=0; i< in_nseqs; i++)sprintf (seq_array[i+1], "%s",in_seq_array[i]); - - - nseqs=in_nseqs; - dnaflag=in_dnaflag; - max_aa=in_max_aa; - max_aln_length=in_max_aln_length; - - - tmat=declare_int ( nseqs+1, nseqs+1); - accum=declare_int( 5, 2*max_aln_length+1); - - displ = (int *) vcalloc( (2*max_aln_length +1), sizeof (int) ); - slopes = (char *)vcalloc( (2*max_aln_length +1) , sizeof (char)); - diag_index = (int *) vcalloc( (2*max_aln_length +1) , sizeof (int) ); - - zza = (int *)vcalloc( (max_aln_length+1),sizeof (int) ); - zzb = (int *)vcalloc( (max_aln_length+1),sizeof (int) ); - - zzc = (int *)vcalloc( (max_aln_length+1), sizeof (int) ); - zzd = (int *)vcalloc( (max_aln_length+1), sizeof (int) ); - - if(dnaflag) { - ktup = dna_ktup; - window = dna_window; - signif = dna_signif; - wind_gap = dna_wind_gap; - } - else { - ktup = prot_ktup; - window = prot_window; - signif = prot_signif; - wind_gap = prot_wind_gap; - } - - for(i=istart+1;i<=iend;++i) - { - if(dnaflag) - make_n_ptrs(zza,zzc,i,seqlen_array[i]); - else - make_p_ptrs(zza,zzc,i,seqlen_array[i]); - for(j=MAX(jstart+1, i+1);j<=jend;++j) - { - if (i!=j) - { - if(dnaflag) - make_n_ptrs(zzb,zzd,j,seqlen_array[j]); - else - make_p_ptrs(zzb,zzd,j,seqlen_array[j]); - - pair_align(i,seqlen_array[i],seqlen_array[j]); - - if(!maxsf) - calc_score=0.0; - else { - calc_score=(double)accum[0][maxsf]; - if(percent) { - dsr=(seqlen_array[i] %.2f",i, j, (float)calc_score ); - } - } - } - - free_int ( accum, -1); - - vfree(displ); - vfree(slopes); - vfree(diag_index); - - vfree(zza); - vfree(zzb); - vfree(zzc); - vfree(zzd); - return tmat; -} - -/*********************************COPYRIGHT NOTICE**********************************/ -/*© Centro de Regulacio Genomica */ -/*and */ -/*Cedric Notredame */ -/*Tue Oct 27 10:12:26 WEST 2009. */ -/*All rights reserved.*/ -/*This file is part of T-COFFEE.*/ -/**/ -/* T-COFFEE is free software; you can redistribute it and/or modify*/ -/* it under the terms of the GNU General Public License as published by*/ -/* the Free Software Foundation; either version 2 of the License, or*/ -/* (at your option) any later version.*/ -/**/ -/* T-COFFEE is distributed in the hope that it will be useful,*/ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*/ -/* GNU General Public License for more details.*/ -/**/ -/* You should have received a copy of the GNU General Public License*/ -/* along with Foobar; if not, write to the Free Software*/ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ -/*............................................... |*/ -/* If you need some more information*/ -/* cedric.notredame@europe.com*/ -/*............................................... |*/ -/**/ -/**/ -/* */ -/*********************************COPYRIGHT NOTICE**********************************/ diff --git a/binaries/src/tcoffee/t_coffee_source/source_list b/binaries/src/tcoffee/t_coffee_source/source_list deleted file mode 100644 index e0e85dd..0000000 --- a/binaries/src/tcoffee/t_coffee_source/source_list +++ /dev/null @@ -1,50 +0,0 @@ -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/CUSTOM_evaluate_for_struc.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/aln_compare.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/aln_convertion_util.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev1.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev2.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev3.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/dev4.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/evaluate.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/evaluate_dirichlet.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/evaluate_for_domain.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/evaluate_for_struc.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/fastal.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/fsa_dp.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/hsearch.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/io_func.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/parttree.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/pavie_dp.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/pb_util_read_seq_util.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/pb_util_read_sequence.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/random.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/reformat.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/reformat_struc.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/showpair.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/t_coffee.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/tree_util.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_aln_analyze.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_analyse_constraints_list.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_constraints_list.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_declare.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_domain_constraints_list.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_domain_dp.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_domain_dp_drivers.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_cdna_fasta_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_clean_maln.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_drivers.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_est.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_fasta_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_fasta_sw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_generic_fasta_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_gotoh_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_gotoh_sw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_mm_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_sim.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_ssec_pwaln.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dp_suboptimal_nw.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_dps.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_graph_maln.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_job_handling.c -/home/notredame/distributions/T-COFFEE_distribution_Version_8.14/t_coffee_source/util_make_tree.c diff --git a/binaries/src/tcoffee/t_coffee_source/t_coffee b/binaries/src/tcoffee/t_coffee_source/t_coffee deleted file mode 100644 index 9cf3447ae8ccdbe40d797b7c6f0ee107e609fdfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729699 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�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%0ARk_=yKhH6JWc1M;LDK@zv(Z-PQjNWAHJt^ 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%0A=XR5$KDV}M=acxIfRta0xG8~5_#y5|BDgr5#S z8T81%#<*9bYodBz^@iSuo-ph^!aw0fx3Q6!9$Ywd*()Qu{Juaz1&9BLQExPZcWb_mKl{KH7z?J4}_757loveq4G;7SD zMaAAY)!Gt7W)`*D_-QFx2z;@zm5HVsTdm7UbT*KN{G-q?ZbgAH_arEq&G9SH*gyQNyCSYQFx z%~nUL*)>&Gq+#D-^ABm(WQxuuzsFHYwyGpd4%V4;Z=K>|}}hBW_ytR`187bW((r(DXm2D67n= zfR~iF+sz=#KTQ32sPUG_qUv3I<6aF39nP3L1%FqSFyKfVs%W#R%d`s}%`mxmp+qdS z)a17y!+^iY%Bg@i%a#xGBml-vsyh|^S zcF`Z+T+?gq-5<2~(!#i!<;|zLTe-hUu}@-;t5WWeqQ7j6%=3#y+!?O1yIe~k9FFY< z%Fddg0BWb}SZa09%zW>{%hNDw=9Z^Xcz^@exjsZFn1)&Bf2F-pL7@%Wp)g!D#@tZa z)JF|8sElymJ4SAfZixPocH)9=lnc6FF6gBr%BC_5oMuj(>kE0_kB4(O%sa0n_YJwA z+i*c|3E_6$QHu*21hQd2yeWkQiG-KFAa|>-&v`bzU34t4QX6jaLt%bA%6v}^j&dGQ zB;$pt3=J3ch}+-t+l<;&o0z3G#s#zY60`abr_&f|uCs>81-&#&{XtyNKhQ(*zRE75 zooo2b`F`SYy43|1Z58b}a^LhOaZ6q|fik-GQ^VDh_x5o?qsL;NiFx4|1DDyQUC>1a z5^k&&5^$c!Alc15!u90?@j`Vv3T-nj3*8Rdfljw*r_*FyP$>w$iMmI|1!aD^#;FG` zC_Z#u0d<=TdN%s2@h$K_vF8_Frwc-VEfXX}HM?0TL@Ue#rITPoRlOOUZk?$z0auvV z?zq5tY0d++4>iVeG&ftYj|b}X8wUsvbaNjM6hYx!Szk9HN#zk6Qj!O%Qh1>Kea&yS zm~S^Uum^TBSUi9AzY#yk+z3KMn{>rNVHb@m=i3P@j^?3ai1tSVU(=YKyifk)#0%;C zrSfU=?+Leuj)=|L)Uf}sc>}nfm^+g((DY_(cJHB@T3iCj_(#K+oBydpQlJDk#K@9| zQh)MJXzxQZ#$O4e&8;~>G&{@hRMsrNwah8D3;@h9P9!gYamyCg6>a)V$%Nw%%iqj8O&d&7w2 zUszd(U#81FvTZKK;mg00m+Q|vTGo>pXk|~?M7-SO6M%ap636n7jjMY;1|SO>sn=kS zoZ8GZ-{1HiPOTc9xhFIL@qeo?8VHjUL6=@nY3QD6_huLB(rj+IpRHBi*!2S&{ycz7 zCS!BD8usUgZ&UUNTk_q`kFr}vg%@q+hc~^bd4pU8af3AXvI?++I|nuPpYRkkYI%qY zGAGDQQ6~s=l4V7y*{4q;vYLW;J)h~fiOEWZFgh_g#6KevgZNvLn5cI}iHUkw;7;uG zi`ls?@W;V`1?HrC(W-5b(y(S=ni@td<=jt0E>m4Idvd22X4jXwy_W00xi-A+Q@d~0 zn?0N(btTc+!y|>XG7=tnLlFUy(dmV$t=8WwhSTgE@0R>_c^jP3Q(JE-bO{z`7pZDB zv;AbgLY7Rx`%vZIg}l7k#VvZ@ypK1NqO*%3PG`vq(xuEm-C`#&-}z4#!!A{)dR}4X z>GM=oZjp!(&M|xOqep3#29Bmfngj2<wA6snvyqrP+kDtft_xr}z|(-2*o4cf(rLXP5d9 zK1cK6n-D+sdV^KoIxGtEAHRet9Eu&PlA0MwtOmjI9)?RLoR?O*$6;S0J*2Map4uy* z+^nmWo~)q_-`15fJAzHgP_^U+nUKM%#}JP2#u*{>q;DtT3RAU-{L3yvb{=l)BZPcz zANgSg=@}BCWnF{s+e)I7x(~xI%=}Q&?HZ>e=T|Mgd24@U81bo@vFAUGEJfT(GN#%XMd)me?3+G>UmN1R2^84HH?$W>3XDvC_eQB zjH`Vp+2L%djD?E=!gTr%zJo~+Cz7N29Nnw=cA+M|{v;Go^X=lv$iDVHH_!e|gH15c z{*d2U@S_3OBzyDc^wpw`7j`evieMe?Um;sQB-O=Bh+R5X*HkyvVj5-k85E<-7x55m z6y?^jjfp~_Y|Gb#S8jG^_mT&-Ci->6SQVY9ii*jO6l)V%;8hL&laG@Z zcZJ#KO!=~O$;cR$9H)|BF%p+si;6^I&}9M=ANd6)~`b#)B(;JP1SSARAs}3 zGg|0L>sM78g;gWbq47NWZ#`jbB@eYR8&0j_P4DF4ecKBQ;6P3?BeV#-g@aptG zqrH>K`XD%5YPTZ+uLVpEbH$MPl=0>}KEbabgP8va=|+CQcM%iFax3p(it(f6IN=mS z-29DjeGo1Z!mkM-gZ9n&4Qo#!P<Lzyhx-$xg7D9 zhg7Yk0;R}P-D@sYbH&_Y^NHpQJh7fuTc8lu*U52aa;8t58z59XtRbA)-D(J>2hbWI z%mX2)5I4r(c7Xil!qS(vP=M++HC426TEI}L*>uc+Rc#L&Dh*OvFIKCjIaDnf3R`Zn z0D&6qFU+Y8h!sY z--*OeU!Ppp9p501it4O@52d=)QZ*^_G25g+KSW;`p$5S{``({>FY0@n`ihNDRo%@7 zBw{5qmxb*K0ZjqO?yGI+CY{EoxSG-GecX^fjvHgSBYM0ydn|ozB0s<8O&?3L@)||m z_qX5vOMgHzlh2N_;;_%FF(*mx=hkiPckwzjJhg+i>%>>~;K`JobhwJKRFnEeYHt3SoDfv}S$q|7;NDpDc;n~x%d>Q5c2ZlWDruXgL4 z%@ba=9%)SXM=klJmzajkdGxAu{p*5wkW76{;fP|`H!3otVc*vyUuoF)waC}gi0$}W zYrPOdkM*Wky-&=4??Z;<5i~3HUcg4$aJqM-fM5FYFYzmL$Q|q|I0ilK}%dhw@HK>2BpWgm?eg*aafAPyMca0mrKu`Na z{$n84c-V&w$1iKv0sK0k4HfD$8Gapv@=2l`e#ySe=`jD8J8spD@jT$g6@2mkYr72w z921Hhc#7!`KH4d!@#whi1^B5A=sy!cW?pKChW=(cm-;}#o9y9mWIs48=K3S6r+p49 z#hQY{O1};CL946!&Is|=gPHS6*VEnm>mzfL{GiWLE5tv?9d-WuH^`LL42iM=lJ1Vl z`!8@77$Ds%>2Ew3&|hByD8evQf&*(xEVejp!^YPwR zzcI)UVXS3MEie8`B}4f+-!*SNjZT9SD8B?s{7KF)k)>*DFsxMcQ8!>dyB}-$$#L@& zM1~(X|CxsM`L+Qj#R%f9*zaH1U4%r_7$thHy~k$LdOzmA;hG^HRu>*FKyTI%=n zmSkg^5p~c-*+9&19_{loLSWeCfbi17=Vj!Y@|d0@*FyhSZ#vGf!5vRHTb&or{{~!g zhe|E*=l95pV*VK@nMD8lF5{6YTR%4aGkRBV3g{J8Eg~9v$*<$+)zWLTHR7MqTkQWz zIh~Q@Kc#nQKyNJS=pFhG={4rb2#zogHXEa0W8ApR+!V6J%@$+j4Co~g0QfB+~su2O{38l)ksDWEjDRb#yGPXFle&6lrB;!ReJfJ(c;qqD*}lobW< zGZ*Tta1JFKj`T}^F9)Hc6(Q21G+(a%s=;0UlUp;{a1SX3cLhBvc=tT-Sc!fb0aJizSYHTd zs}C5zU2Ph~-FA$Pqq|le{O{e%{J5sOc4xFMeN;91%Ku;%z}+=c$2(auxV8C% zC2ppv6)O!MM?i2{bvGLJjJk=Sdq#HYTsF{ggNCd$^v=7{tWkDLQ^7=bK#T_Z zb{r6a(Rfz*N~@EdTl?CJj6dtmW^P+E5p`{`Ss^k&na*_mt50H_Yg}KJL8{yBbovR* zOGc-KK=W(~5d@lAt5;?H@2`L$b)Q?`jW1(6+Ud*XIpMr!?M?$-6xXshKQi*1pb!60 zo{KPn2jzEMSRH<0Y_{s8kA{!&EgsZ(P({>wsVU-Cjl%y(o><&;erU7rPu_*}lplK3 zG8z3!lAGoq?ai9nxaFon-XI(#_Vl%GNb^D!ev6<#sr?h)MS5DsBneB498mdimvlL(6V}5ZBrsG0tXoX=kxxOHv6lXSuBWry>Pd)jS@pVk0~=P4j!v4I`m6dk?@!@<#vkVSYkE%S??S(vJ{>RuZTVw%NyCjm zTG9};=m;os{1T#h7=g?pW``eJ&j^N}tU-(Ib=7 z`{-yNcv2OzAfuEVI{T&_4~r4J%YGL)`%J}ht3H#P!WsOI=5y#3-es5D$j9C@#*+)5 z|F{%mKQq56K8C`l}QFJj+W481ke>!f> z*~+wUQp5fQ^Y?heHk~?*h=DPC_YSPDIl&vOL#kfsq>i5&P{$$mPq@AO3#FgUe-B1y zqJ!1cM_(gYyqmg+@eO1l6Z3#*sOlNB8rzf}$aKkLD`cCCFU?r?Wv^Sq&gTDV_}*x{ucz)8Z-&2`7Y8QzCio_}2K z;=y+4LquRB6VKz`6Xw^nmxaB7oM%d(1P%3j}vYIF0Cj5!(P9#~`ZU1e?NKUK%8$eD$ zpv`myffWRD%<4$6MXQb(Wf)Jsnki;wC~HdP#P5oMrmuQ^2d~Z))B+VXuF}km;Qbq3 zWTQlSnw;x)im&9eTj@rD{PXo$8k-#DJ|9IpvYz)ieU|K#y)1i!Tv>Cn$dA!y*^A_> zd=3T>+fTsW%bXzKU3{iXD{sXq^qw&rZG7(t9rxXd3qQ``%>n{O1(Zs44uUqqnC+?m z`Wt=I8!Y+9b15Q5BfvcWy>=SUui^8GgTg!@=uc4o~}y@OJZyGJ$Wz}?Bg8X;$U89$V=|1y$I+)X+W|LGfG4Id!7{_(-u(`xOJ7N|cAb(Eas%C-EVl}TLS_f5mR;9}A+p-i>+ zQCx4BUKt?jEA9WoV<E4p@9?#r#oxV?TcMQ~NCJQdgRR-tfYqIxGFJ@MGQY;fEDl zn>@A;KNvKyD4BfH2lFrXj@i=JzsQ}`QQzOc2z`Nbi0`S7xceF0df=lQXuMZfpx(Y) zK997R%n{*5Q*klEOBLTWHS#U*ST}q}@EY9HA2O|1=Vpb(Mgg~45b`g? zGJD6SHhDu;L#tUA2?}nu@d<98?!HYj}v@>j|4^RjeZ_@}4K z;u&HNER;yk-fFP{j>0i!640ls83yzt-ORCrN*iVAPwY04-ihZ!4Z~!xg03TU)^&nPt^iPs ze@FxTv149exIe6cbn}986ANK-0~K|}|JIq2FC&;fl1$6c|EW0WWb~~wYqqs8oyM0&uV-Di;Drb zs`S(J(M*@C&I}*=*lJ6k)cD5+bFb+WlDu1(vTpkgA+9d$s3%v#`E4PiKlX z;si3tdMXEYjq52SjsGZ*yXXo|iBrT1<=|i#;Z9iaa zov|9TtJWs}zMmD1y^KFLALM-Ndhr1B$e?O&mN`6Q_Tqm;h!@KYKk)79TiK0qecm|W z4O3abY;cm|)&Sx5oB9}qaR#L!Sw>+j`|&`DMHQ0xVEalRD0PPC_YHMLx${pazuojc zZ-PR5DEn`Y!V~;j#Dl-cCBNOO| zt@n(T$SdS5--Yr8Hj8m@t$r5_w0dB~QcH}P_lf{(iC;!#F4dnlAnL`t8TK;D15YDyr zY0;_5;K(_%L$83h@C4g&tT!1U!&VH&g7^i{(4d0pBO{%I-I*th!fL5#eU zIq$ni-#6$x`V`K7A6OD$WPV$rcn$lnn14ui4mvY0x5w&)(l?=BYwr#F0BP1JF6$M_ zv+?>nTIZ;-esQmU2HLgYI{|y#{-$Fi3U+$^{!_z?8o^P&|CC6r)NKR`HaxuY!|=*` z((1-iQtZdM(Qhs;9E7?B%GMev+gX|~_cdY0Q3*$#0Db%I{6OCv=ipcq(*)DE^ZV%A zvlpi7pZ!`gg1#BMl7Hi)`}GpP4$#33t>~cYO5Vr#)NgreS(OV&vi%v@3wWUeej>FvmIj#S+{NE^z|2VaQdu8{~QFOP`&!$ zpK90C1=^V3#q=>-rf_qF zVDHyI0t5jKvR_qk#eiA;HbLq~M1Ov~t@>X^WC!KPW3~SpKRgihtv|huTs66obgUNx?!O!)4#Y-wTd*7b>Jajiq1=2)s2MLJsc%aDb%0|w{b7v%#`6>|S~ z_g`PM^<*uGiH||)#puuHORqtNWVSlG# zBHXVs9z{YOq0=wpUdZ`xre1a3y6RD_RY0UDOpr*|3oTo;dhx(Wk^4T;zK7d~xc9l_ zJJYUamLAL9`p?R14fdaukAHt1b4T?zxu8Mk_XZCaRhX<#Z$cf0j^)YhRoZ$=Ajt8K zo6!bjnB|}GC$?f2;@|?HOVIIHlh4CWcDm~Fc2*W9HtuZdvKPhrsq@J@n>OfgqyDxG z+y={PQLv#RVP~TN5*szDu;*C3vr%O!$nio5;GcYdE+nFw-e6G~*Gf~m8UFh};S=6V z{HMB|Bj|}E5tyrNLS)3wuAPk{HeJ!qx8B_K(7ZEuCR|PKaq!Nrh3nN8TY={r2B)P& zgvxWz1gUJAM^M{1tRP5%h<{5ERGQk+pFgoSaYPp+m4g#^K-cPM(U9{LY>v7mWh|P> zKs!|D2Z$t)f2R`GMx9JrthJi>V+#BnwYGeCZ24}`>rLD;Wk~R-YHIMGWEgwc!^+6?@l@;9e32P7)3> zkk%AVIpuoF%1Y1j`q*}g!o#bwg2J;x@@Xz%lqBD2Y&FDiP$(BB> z8%+^pm(KqpBR8YHWwxZ;#cE4`d zhv8l%E-R-ansg_iA57C_7u7E=wFHn~)k`JIE^*seGf4!NvtbhF3+I-nl9~H6uhpIh zm}`nO|M-;Qn0`SD3(dx1^xr1vv~odCwDRTfl3(#Pe8(e#nfbCevADFdK8lFcr`D#=+=Ur)$D|VFL6lsvt|j>M_MfG75&*+{gi(>8oaaesc1*c5<(Qk z>_lEMeYxQE%7UGAs0(&huXZipiOTIdwpFSr{6h7%s}{bba}d>A z6F=Pgdex@H54UmVz4XmUE&WUJJ#~ewa)FK}QZH>Rh`#Anzf41=-F_D>b98Xpn^1{9 zbnL8LEz@#AmWYcT5s@1qfKwmT?aq39uI`%Kc6QOLeoJTd&X7wL*MhHz$gI0UN4~#A zJro*c2U>S=F;Z}h9=arlzg$nJt1N6-@6vch_gbx=YjJhZ;?y0C$Xh?EE?}&zD+DXs zo-gaXIt@m1q$FnSaH-#g820H1jH7E?LS1B$WBP3@X^gY?1xYUKa-Hc{fkvR0YoM18 z&I-4b?7$caFP|ntt18Vlu$=s#r_*Z2BIkm!diyyZ;D*7bm9WWQDAW{*{)$jytXJRx z{pw1}aBCEf_bOH8Cs|H_gb>M%fc9!Q7zng%(rGM>P+4*eRxRz1xcy|t+wpd&jUYoRaQYD^ z#z1U`#*%p)={R7&Tb+#{vzlV|9I!JpM5`6Rd^GJbL18!jO$8KV-M35|KgyAZK($>D?#!` zjZzUd+d29>(`g;LmOjKLInFDTDu0N-DaQU2xB|gxCqp}#4GZ#f@NlP{XzfnUrW(c* z8*k>U3ehgNt?rDU3Qm+>NE14OMXBq)&kGEiu25rP76obljRpH=4nletSPriz?R7UM zQO0mE=AfZ2KR0~Gz5KFl9Ci8OB|kFzmz~MPYNzL-Fl?G$L-8`A6xM~8uzGDPSWi?b zB}fmK2T<$2XB7z1Gp5%YsM+~1B)Yxn{DExTS!Op>jhGfjQ%r>QD3t3>@mj?Db;kz! zj23o=9solQQ3%DgJ+11uWz~M|RfHh%kquvOuDK`DTko7=jiTzH(4oUgFv4ZwCiF?# zoZmb}Ue1-jGZMW}D-uHv}f;LSY{J##Z94wU ziP)&l&_XKBsoh|Ey4tW-g{jI@8MkbdrJ;Kx|C_v$hkpLB#S0Nnu9#^Wqz&W*D7@LTIQ?-b@s|XCoF@C> zO*a}hibg%&VEtI?6BR2yB`BQ9Nb;8yPOrawUME}xX=lkNy%TDF?aiitMb7f36_zHV zuSCXpldwtA$@!6R>8!%YA<^p!QvVsft}yjz=}VC#Iwx7fqI*(5>zrgwP3`fnFG#&e za-0i_Yc*x~p$?vtipOc3u7t>YU|=H#MJ7u3;n@ zqSZy-ES6*00AV2@=%3L|sU6kpyr~6T$G9i;w`En$H%oI_#BG;twa6akW->b{{;6$@ z2K2)svN)8PRkkC7{Nf}ZqozL?9gEHS%(A#ojWVLBYtqwKJW4m?u@eKdbSe#NnLYtu zfS6POyg8%1;#<{&&!MrMQ;O7Z#v!td;hVB{mE&EMKRG(D5XHRqbNem2IJvv_yF@F> zK8#)F0!l6o8O8Dt=9IXL5BEs>r)W~a(xIjSQV@)%$X3+@sZ?$$F+AWJduQX`n#b^I z)2a*hz>s+thP<<%b7PXm0b93#1GF-HEwY;Fvv^U}6TW*L=@^1C)4j8wmYK?LcxS&e zfeq`;|@b=|P~+{MQ!)l&X*iznvto-4K|cT^1EFmQKx ziS9496a;FuJ8a`c?sq$6G)NpJR7LY`ku;BVMh|ri_%3&3dt>jf=$M>~N$sv(XO`w5 z>mwsLb-)xMHuJCQLK@ZcAyy5QA16)dto$pC%<&a70;}m3C0x5sP7?SLPf1BJzJB-z z*gkmsBtC~%`BxM*eRd$TK7zgyif`@;t8&!0&zmw!HhLQJ@TL@a*Il8&F^xOk90K01 z&=lr93Gv(l@A@mexmR>fx46?aoogi>I0|X@7}<6b1Be zyojnXIqU2xug{lD_yRGfU(7hz>Hp?@T4ken2v;bU|FhhU>J%@SKeR*MktBFdajYQ=C;iC3&$B#*>?QBQl*zyeVQFXGfM{oh49FHs*dPMl zrSnNAY!j$_c>8Kpz@H%hRMyBQM}dl%@Nb)q`_ZGt94^m7%WYon7u=;m!f&w`=!gXJ z>Cbpqv)cmb(t6?Z4s2qizvOBL9LsbaOUI7|@u)Ierm}K@(5AJ3>r}KJq4+s_>?XK$ zb!k`KvC9H8IA&u*`E9w81ru^#EbXfO0F{Y_q8f{4cCXpRqQLIl7o(f+|L9}%w$i8Q z_PQ?x)w}%^E1y#{sGW&RZ0r~A|L8OFp41`J%ow9# z*){=Eohlw~oChcDMW6fXb)VU6<}cjLQ=M13q3)Re_IqIHu1TdY*6w3X*X&(Y{8TlR z{NHWk>Cd)Eh;hP4_|%(P!kM?@Y&~Poe@Q3Q%|1aLB*`0wQjF^bthhAzZ9a@tM#Vfk zMjvYwK5^59C!ig(t}+L60~KcWGW@Upf+udQn=zj00&m)Q0y}^9X3l@6(^#L`aJjLnGs3zhzTJ<<&M^{(}Kvd{TgcR1K6cJg9G729HQ< zo*^KH%M3zk;#^=b@EWnrQYlNGUKJQx^ zEK5pud{ey(oT|g0Sc<*X09IGf@>v9=8jp6@9FrHbuoekC*0fs0(wK`KWd;5bu2eyb z@W#!KV)LL+HbKo=HDn&R>_{Q%>AyanT6oR8Bz=Z8KmP2M$K=yz^AJ>EXPsOA`$i+r<`e?G4NwQ;m2$gH>|VQL?X?s42Y0L`KU!N~pF=lW^XCHM z0CTp)mJ4A+V&KTl4Ik%*fBFe4G3dB=QxT2BqP{zpT!f8}17nFG_@w50Q!OL*;)l_= zw%_p)rzbOajy5jSo12BfzfvHLOL)<&wwWcOvz!C7;ufhRDi*N63)Q7UmifXrcP5NoGe$yOK?|DcyMtB|n9TO%cVZim_cCc*^iUe z$32Ou1)lwt?Bpm*t!jrCA$AP99GHCnXBddY1Xig$htv?Um{YT-2VHJ8CMX_gp%ZyFoCEq~X+M{Aco1(Hb@=G!=eN(K6 zoDf^Cx2?AcBZfv}$J6#H-1rOzPvgZ-d^6hxa(O^d+IFq5+67v+K3)4qTg^iAkKy?tw*E`p(5X~_sPf2+5Z&P(ENq;sW@*hl2Zz!s}y03rYRg8B%!Yf?N*6=Y( zyKsi1GeOFww%>p`{6b9s1S{{cU-LWh-}?J{(^K|aU%f{C<|x(T&@p5zDyn^=*T{0j zl~ojmmz+z7NWR7>y|XL%Lk-p_r`t?xeI(sYJ`=fDUyPnCH_d)6YND<^k~JP$;m^le=Wc)EfUdslbZ7Mrr|Y2|PMOWNm73*?z8H{a$h?zx(@(T&+6a>ut0~Y%X1{ ze-|9Vb%*?$wEedgYA%Z*WxbAfPE8!=OjW{5UPreAi*0X8my5sQB|3bQY$22|(KwYC z-iitO+ct{7j1%L%MseC(KAyj*=GfSbZ{&JSqxCdn_yli-Mi4JnuIICd5BJ(6M9;=> z8)3|nV**CC*2~^ShL7gI5&T!ee?_3sFr~dAn~Iqsp|jUs$j0*+=q)qGFUT)z6T8B( zJ?Rd@B-l7;)`bOsMlNr;*e7((agg0Clm@>+Y`n(6wXTK45nuv$CLX%}s%V><6?FAB zNjuu4rg$bV&q=*a46wl{t$S)?)c6!_G)^>$ThTTNLAEOPbGnQvS#lBt@9at?ooCSc zn{BRC9o*tS<+y(x#E#&(I~Xdo7GrbEJXJ1j5?!7 z=>JJ3!iRzLqY-hWB>x+LsI;xDpOT+>aJEf=Ydlr z%gC^^_f%);4xzs?(KACDwO&q{9Sxa( zluXEZMWwGT;85oLQ0b=m#|0hMjC^UEI&AHV~a1gqvqA>k#YlFCzYO=MKkx19capE!(6djK?h}id4Ayk zY2Y@;C)!j1zT|i4tt}(Y!tq;Sj-UKR#IWUSrsOBY%_nqO@EDvl_P=1C!i{U?Z8a?h ziS3f6wLFA#2Gm0C-HSF}%h#4svejvS2**-G{u``dyfO!xj5)d;^LK!TV;5>j2u2V_ zl-L!#?dwq|ny%5C@~6EOtN9VNhL>)Owq0URm-BbQX$LX$$7IZWK4v~o7d1RgRWi_< z6OD#5s7qWHCp|+MiyW3K%jY!-bxXHYu2vrSBRqO5)IRk#sUb})k_=6rI7?#Vzt8>~ z_Sw)|LxX8o(-O)hid((oH2=EG=3lR#xcy(9f7Qd#786WAnSF7T$?U6X<&)Z_UE`;) zXP${emNoJ?D@232#?D(IzQu@$(`Pl2mTGO&i1zuSpfjz>8DTcF3p$vCNR_qF?y`{bhUh|MVE- z9S=#oRWzZdP3pUv;z*BhsGyaE_y z;Nyd6L6GJ#Q1ET1INf))zuhK1sI4e&wNK&3&DPB{XUmw> zV2s_`Oi=oVx{|N)LI{f&r~3q^OKk($kr3j?)lXfY;0oB^0UD0I1FY*41mp12O?KN> z^RcXLJ%7E>v(e9-Y2yBoOb>F7Z=kAfXfJ-oYf}9%wg`{7{i_lm;z8lXT8Z8I_;a&Z z__Jk%e^o^-9#BgJYgi(fcYTYv7O+(k$095kX>2_yP){?dK@*n@GyM}~N$H8S!MWN2 z3N5stl%fzZR?702k?`6g0uQ~A`lZ(>g={y44EX)``{1`w*=)OyGBW2@QYRbH_Q5Yi z>()3-70*W%zck#b;xz6MPM!vJF5VnXb;#lquwZa5Wc>w42AzEWJ2?6*0TZxdew_Pc zcDy@?FZ zw?V@H(|IU4GIEpamh1HqY1s4+OuNKdJWKQ4{HFwr!N`nu>MNJO>GamW-JuF*UVYaz zR|^DV=3fm+ayfT463+#Ln$P9&u0La(hzD^6(n%KJAQELoj~djq{g;=h7qe$s*lbon z!bAU7d|8@Y6XDJ;H|o(AP`3s;k>{UZ2%BjEOVcPC4AACIup_X6uEo$mdwXs6#YXm7ovIwgX9gZSM&}ocy%!ilLRg+st{A&@d)x4wA(+DmsBvHSAr+f zYs|*RE%U#RhIt{6rL3vm*q5SfM}CNzKl`N+sq8;oFu@z9;-A|;WV8^@d?*e+A#kma854msC`b?Y7H|6 z+)!kdd}*0Coubc>>w9uXXh=@kyh7GH3?%h#08034U6BM;WP(CWlF*nf64qL2i=Q_b zL9sD(s!v||dm?}99_tYXBG=vDd z&S2rty7=q7zGO`6L1Zl;^)=AG+DHY}~ToW^GA-QDS|02D&z-h`2FUCmEq< zvU{6Rx4nJUjSDfY6MB6m9_why~(vyl+CEiD3&5R8}{8&{!!q@7)p!B*R9H>DJm*7VdqBEbX+>rCH7?BP@uJwms0 zl7NW&Hm7sHCK>7Ty=eu}=>>$>ke!~pE2GnkylKVJ>BZi(lIV28n~S4kyqP6jYl``} z0=t;HGkYG5?1*Mo%BQ-G%HbNI-FS5WWLq8~^v>q^lck{sx=Lb@VLL z6L|hKVLQ@w0*hDMsENWnXz#j}AV#JbDaTv)^)}p8%${lZj`@Ey%T~xeO-B_yW;BtvB*ZFvcC;9Lo_6 z?U+kr#g9b{BOZ@h$COfHI0Q_6=kqauYmtgoD7~b>rk9A`C-iP|adxYgEhIWfuRo)P zI<18kMtTO11c ^GEWI3lF?=iWr@`Dnf}vlv6&JD`FCp3lcAOZA`ql#y_E}q9Aw8 z=8qBb8~YQJ^Aj&7E)FFIbqxfdf~T&HZ+w`TT*&L=xkI6=B2Vvmd}HGqA0#fenay`^ zcm2L!K16skVVB$h#mBXtBla_LXSNf?55Mc%jK5W=G2K9+FNpOJbVR$NpW;>o9Qxkb zS+#Ky(AxACf7O2fv9Y*ie*nDydYg@ZW=$EY=u|ZXHMwhrvDb^v%!ot_SDH=`reQ&9 z>tU`FmiuB6ibT)3{9t@cRFo&)Pi)Ms?6K(DnlIj5>`hnf7ZHO!+5Vi4XL2&KYlNu8 z{}YS=L$ovTzOCZlI4H3(u`98$u{S}hwe8Om|CDn2vO;%n9H4IkL=9g^F`v6=3Px@&eUXU&7bR1F#~RRGTJRkgW)9NH`6`ni8QVogU6Vt6{$k=% z{&7h29=h?EoryO9VMD5CLUJ+(Gf=4kZ-CFw`SwKX&~x;^qm`$V84gP9!EUx8ls zt>zH#;)2wwhV}WuVHeVLe8_nb@=eS!eZp37a3r6TSOtU$T;S;ULiZ517+$`5Qh4R+ zsVA-}-Co;`kj9VM;#`RBbzgIU>G)X(e|KN_0KnoME{<-{{nrPySEIF7ajNqh_eKe5 zt1AdEnt;udwvFds`oXzzlIM;(T8?74@lf8mhK^P%10I~oN_)dT&WT)!VonGz>V+ri zk{=%BO1AS(7X`vVN)lb9cqsAFzfNlD?v6;GBCwkrs=K){g4jQnqQbMBN~G12@DD?z zfjP@^te^l;!MIRn1B_!7mN7S6cFdX6Yr<~!oFcIhm?k^V%!!go=U};{&iPb z=+2tgCgpZQ!3X5E?7?d73)C|8w9)*PzBKo@9|8UM8vO~*uA&8f`)A-U;wCc6au!49 zGV&GZSeRW@!X;5Ji>|Y|UgS&Ic^jiO0w9&B`|Lg*G9fZVp+A3(Zps|USXU9J*4~=; zQtw&39-aLHoAv!a&fWz)s_OdtCopJ~(TO@J*0EwuD=1p1u@VzoASNIffnpHRVEZfW z>)Y11DigJuK{P};J&e*SidxjxUTo{H^==Xb!o>uXTC}uH1Q9Fh87FE~3JBKxKi{>_ zOcM0>yzlex^He71?6WUxuf6VT?HN>a-JcrOcRnEyNP&nhgH$JvCWh&G$Wg_l6Wb^n zxg$)LXx!LjUA~^}?!R86r@79#(M|fb@_7c}XY#l{WAI7+)?7vg z`;{ALTed5QPp*Ch4n7ydURMMmHM;C_M6Vx5w){u+WPrIUI{rnYiFM7VCRUgbFB${sG^(- z?dZ}tXMs)Sq1OB-O*c{@J-vJx1KBsBJ$H(09R}76JHo{)waig( z(%i%86swu0F+vl4Z;i#@6g6KS&Ym2d*tnl?Wc`dQ#IJk!!X@w0S8pYlexn_+`fXz<}Vv@*>hsf<_5vt{m=`Q^za-=mu z1LD(0iiCQN7Hx=#y+=Yfi9GwpxkR4eX;w#2$eDgxn*)CxhEI=QH?7yM8I1_h8r{hb zkER|>MPkhUokzWiVw)x)&q4?Nr);oxZRNvlEYCOtznj~{wwE=6DSR0_V!`*x?-rf6tCmG}_$KVmw7QJyEqPMg6mI{?9-(N$%IU=QM;ROU2wAtY8`jskF& znk{He+o!miZ#~oy^R%8r)jj@(zo$o8fU%)%i~l(D1E__r(3=SrfTnu=B+>h zFm29JKpFDxKPR*Vn$yskRDsP31yPDVyv`v^((W3yt7ijUwP$@{)}V6Gs-}`Hy~oQMUG=>`@~R=7>lvJ zR=2vu>;#wl7e~FB<=z}K904`etI?c-c~X+QjpLfk#k0uwrM!*`Ii&``aMdzqo*}Cg z^)TgB#PH#>*fhR*(Dmb6G?H|BcpNQFh}cB{m7T9OsN;Nu(5AbHCF4Z{Dg`NBv)vyz z47hPTfY##7YJLD9LF*qs-rJM$`8&)9xT$MY1X$TEBYZm``1}9qi(Tz~{%Q-Fd;bdl zo8MmJE-)^KxcAwUZs8yXEzU&n`ymeL;LA-5gmTGZP|mPabcVAklsoBc!_?rula*T% z_m`?u^fI;~ws0|X66&?=(D%Ya`qoO{Ep=agkFV6gPithm)6W5mctv%jZd%5@5q_-m z_(b^SsrnLNpK&z+1#4Un+J+;(@*hi3SQlLM&VOJv0#Rt&YFdr^IwOX_`NZd;;Or-H zC33$ANUaPQjD?&zs`#rq=WuoktCrQZ_h*mdFYH}oc?A=Z;0TekvtSZ>a1Zr)N%JBQ z^9Z5c541Bgz_CyKfmTby4HU||pSd5&G{od+f2OkI&RFxtKw$|*p|zqPU&9)!G(I_| zqXqR^dosG;?MQk{odAY@K!m!=JfZ#tX0}M%6Xh7wW|-RCU{8i+mxl6~;@K&{sf;6- zf1S(NBP6bZETH6gzk(FHFxH^jCTv|sfkfPv8SWd_W#&VGhcj{pBnlSJ<8n zucJ~vFOK~!QCx&nmkmsFD1c<^U?gVB_HlAI51>G+s=$ho^~G1y2+lY7#}@9U9eXe^ zcH2Ar@`oR$`fRmA;#RdnE!P`H<5vBpXwHdYU3qPH%+|5cP zif(1Q$Jkb%%wwHf8fV5)MSAMcE zz2mFYM8-$GHhFS-atFZz*BslhZ&Whgu&=D{wFCTzi{fWZ1ix{u3Mj$KoAy)U`z+8S zr(dwS!5Gzdn|FF_)wyT%sFG8|-Vw=Tb@duG-nKXF8<{+W{_8%{woS}->G!{~icNb! z7P_DIs5({MkwTN(;P5gyhK^P-FjJD7c8FDpJF;u{F#Y_sq`mYWlIY4p$Rb#~D>*Ve z@b&oaETGwPAgs6+Q0VPvwU~<%e$A%88N*Y;WVs zZY{Be?*epZ<~~~VwYNycx<2ri{fY~Wy|%`lIyvd!D3pSBWLQugi=3|{|8_y|IMT8^ z2aC1fES<#}jCM>Z_bQ^Lv*X^hqRvaolUJ0^E=tyd*6`rN)-x%6wvdTeYZdV3;DmKFJnshQfv1nCnA5hPq0t@3D`a< zvg}PRk1b5omp@yH;D?0!cQtOoXz2&ZANsRNp{l#gpCGC;?9~qMY7FzelqJN6((dHQ z(vOmb#EWj^FuwwfY1k?GdV+Yk&^l0k2yl@hJ@TWR2HjuY)AM zxraYlx`a?8{qYkR8Iup)*^6M_#gHLvIm=iH=f35vIZhP`CP&N`)c6BlXowpU-bYH( z-px6RwxF{W&nN|tJqoV3&XP|^qzTI!nLix8YsG+_j7TG4 z(AStwNR5K0OE8zbAL@sq*LIZi^5xlN6(gcGo}k^XvV!Rnun<5vgd?p(aM0xCbqDa* zzLJL;GU5nU6>I^v`a9%QjUk$v^IOrp!4tU#PI{f&w*kh70m08{;LoIDN8MGORpvW2 z-{$oLle0Uk#>u@vApi9z)}4Uov#Px5CEz{QemKeL&5K$jD=7}B+{Mftwh4ld{hNbnt3I=Xzr#{;VLV9~8|59pg;%07 zu`4-D{QJL<`}vn6m|_#kN1#qo1AiRId<{ecrR<9Y!}?PXB5bxoDfCFNiN{9;0O-w?ZHLZxu71y(qw>F zcQbrET^EFDhqM=A$<3);HX%SX7j$72WkUtl2O%RdaeYqD# zr;gd*^Gg9-UftUy`3%)gNkclHzr5{$0G~R7l>d{cHwdeecNVc`FLI|41^&K39#mE7 zi`3xoCMNue<=(_|>$_YG(22%>2v(8{`CX1Lg=%Vx$nxQ*h4oOnArAgs&|bMsKoMEj z9$;M2dI;s#mbYuSf}`hZn|73b8e80EO%xV1%dgv^)%^Z)P&Ks;TCWH%H~1KzO}&n? zUfi$RxY56Oc=Fir{7fI=k00eFmh_At;h(2?hj(o<|Kx*)_2s57VIFFsMg_DLSJDo` z@U%U)IUyn(%ngd;l0)pnmyMS*OW<8-^(<)3bu@|>S-m3!KOdVB>hxj&U%3qk49H?k z1n+kEvkIGRu;>#Ms$xhl@wh^zAj3I)5HjA`p&<{gD*d#+J@W~NS|i$U?m!hak9(8j zkgK4Px8pr~QtybWKdH6NWq3mnDmw@_Qak;rg^C&^f(k-?57>doJA{%AMfHEpOk*&; z$7V(oE)ttP+?zc~bIav#Q;?_7FMr&hYM-}o0JH1VDNm!1dshwju9}oNlwLR(4{DO; zY+F4=vw&xqa}bo)d7}PbpX0mabQI$pHa1?3)D0xmv6WYlFDg0+agQJ_(1ADVU)@374+j$aO)zPqjL~Nl_ccE_@OR!5N{31W*S1M=U ztM1_Eb-)xdce|hJ5SgLsWo3MV-crlOxbmW7h2B4PeS$3u#-1Eocpn`$>_0nM)v$k5 za(u)7k;(GD^u3|yyEh(8+eL|kC+h3-b2B;{eUvX^d{Orbh>)ZAH9H%6=C(zS;Q|tc zv(mMz^63v%jpE(s&Mqj7Exe0Gu+ns@d&NJ+*MN8MwG&xA&Xk(2=0U0!Ao>f~f**W| z=j^Kvu4XWszb7SCb(1~_bK}w7oO8BGk(K!NyZMa36Sg$~ii(zEEBV?LOH!8;A#&`y z$osQU0?uj9&aHZ}MudMo+-4J$({=VY3}WN0(#(Pp8cwuC#8fm^(_g3Q)8P=ktnJGD z2#yL^*zc{Z&>f^^tIx<6&SRs~55@(7&QusP*L5nAjBYvz<@<*HCnrbsv8TBGs9`^j zvHj3_Gz>Yp4!~=#s(BZiXmI~A{jf=~h2OUyBV!9|)w2aUhWjP(U6<>Ftt!uba)$e) zZhK}Vze2_e(Ao|rZjlK7Vg6AB^!kNO@7P2{tD#Nj1xcmdP2A|&F|M~U>VBckyB~~I+~ZN!#V~)YKg1sw zu1>`lwLmIG9?^5KEdo<8sHKIdD1m5lh^L`h;e9OmY^=;E@Z>hnWR{@xJsDJD3*~y{ z?SQv(=-~t#(7Z_w5hkre5DhkhS($yTQ)qC2ytU#=wd9i={*>23SFQ}j0?`WD0=OR8 zioLau!%+?^Olz-lgN2fbB+NMV3^{C5l85#Rf9+Ln zzEw8g>|4F`#nz8KX0K2VDSuwEaN{kYgS7z=gCIKLm0Ho9q86>p%4mA?bo}MSE|pNCd#~z86#J6-|d&X zPp+=e>CeozkmWjZ=&jp*?u3Hjbs5Zk$)PqSj?0LI-H9feWaZ@F6#;PtULh{VYV)pL zVO{XM6M6~AAMp=mpUT@eT|9PY(7AD@-5NEDBZ06(m~&@sKv7|#NG#pJe?xhODx-(` zBta>5GuEiMOkfsGBe7v2>7xz2!5am9S{&5%+${MJ4??Zwn$t14b+o!z&HnX?IxD+7 zD+7CT?ROheI}4Jv3a2#Dr=cuWm^_=1ZH^)qkx1~Gj(j_$M1;27GC{>i#icnM7GL%% zR_RfpJ<`7{u4-tnX>c^E+OF&qORR1(y}ZV9_2e!hHLufl%gJp0(xbeLxlTprGbf37 z8<`B@*GdjT=NefSkvhqK39nWK=c@}lkEA38HPU8cZ!eRkK>QJUHqn+}(fqFYlK%dJ2~91pc5bcgzG(YC zi|ixpX#2;P)o#zM!w&QsvFzK{WqbX37Jnb^wNZyoik4Qh;jZ!&^4PIhQi$~uDiLqb z!cF)X#8ZJ@B?!@@I(UoEn_^=oOgC=qJTe)_BkdtpQkVO@XlMMHDx}>m$}p=mwHgAJOkroItv%gz5UKPbTMLnc5@@tV4Wfgq-=m#xR!=@GP&>{}i5RBr27({b+4K4HNGMRgwB3s5S! zMmvY~ASG89l~(VJE&dL>{Avfw5$S(I#ErxENB;HewxLK+rjMlVx_l+f>Bakdw$gp7 zo4&VJc66jTLtTvA@x89jnr`sWqjG`ZXUTwl;+$5|p?W`!5mFS!@HZQ0YYJ*`@$`Q}o&uL!r1o(abZ-J6j1( z-{{RO+Wt=G#?skE-kf-Ql@b2V+2y!FfZ71)b8O+0`~W?@332Zw1r~c(MU$uJ{EwxR zacAG!+hQ^$`pO$y>B4)7rnT~f*1ZB0r_0OoHR6PbGGMmeZ0asY*{@P!8D^I!kMgF) z+s7L@Z&+XCNE`O-Y?iisA{!lwHgJ64wmgJ=CQOrFzwEf2z5qKB@s9 zkowsPI7Mii+s?yK6!O{$gXCi4Y4O-%-HQwFlsD1QY2!hU4U?)A@Q`yBC3qt}TerT} z2C?+t^o#<&B@d8ov?#^r-geYpua5I0I@*i>e&QMQ-9?Q&TtR6;@%o}>fswjxj1q6i z4)){EhN5lTujjQZJ8tY=kI7AQo)Tw!5$^b>&?e9Zj zQEBZb1#A7r*Nc z?e19|T2)bYN06UX{h1a|9kqlUEGqRDMDBojPbixauYXUt&}QwmCl==gEXQHB$&An% za@P>B@n!>ap@7^{O<_p!idmynhK4y!-^k#RXSfjIP*xIFVpa*)Iz*qKY-YUviOgG) zO#8~)z44nrBKgA%6oR=Fm%5_1#tn~gUqoADM+g7-*Tuc1>vYW{$wkRZf|*CYD7@|+*i z2?^t$>HL*ADSpfKacr?z8PzuUt+}6n%O`%tD0%P`OIohm7a9sU5#g|KtL1KH5jWoz z;IC+0a0`7(xD|=pcNu5nDFZ$e+XMx3#-#L8VHwsjNQK({>L|WBbF)mPdv97V>~zMf z`2GI5_mc+~p}LajSacBwN)ogmy}v?}!{;)76s7FR4;KXJ4norWq4atH6YOIypSSLR zF`ip@{e4zS*vZE#mzSww9ijXsdTv&fp_Q?%5x)v=W2-p^tjyrG@8`k1ec9;Q;Nzz)*mlBn_qqpr0gi(U4G^werdu!7<(F{wZe8NXeeY1e{5J1;?0y_bfqJ|jX%exYV32#M zeyf?}i2LJ`ahEiT8i@iR3vgn0?RQ?nQM?K=LjL&LM7*mN;1wZMF(D5|7109Cc4Vl zTC@7YfGNI_IYR1PE{Ng){%Y|OhVdY)VmFK0D@NGnR3s3Uixh?9n4H@mf5s?Byy>`` zxMgrB?|IM+M`<1qksC&9Eicl-#2J_yWFlrSM~8u4kLmMN)FF;2A0NDXzCJJU=Z)1e zZ+8RadAtUA!CH*vLlBi3_D22`Lm*9pVYF@+t9GJ2lvxfAaSA+_x{;Gcq=x(RM*Gu7 z<>b5apN?;jga{LqO&wAHF6DQT#z*2F;DgB{QYYwxZ-rSUe&6;xtv#)(qp|eM;7jM= zy<`i~KCch^@!RBzxK9XOF~YxrIKx|e_z}5H?9lMMhPt}`4JAyH0M@{tP(rCZv>2d& z2>nfbz{{&e!C@rrAUAJ>j1Qt z@00JY)F+obmg)+79jjg=$KW8KV^aO2vBj#tjl=E`7LuQTFMeQGw#(^@MD>afmQww07+|8rgnvW=YHic?Q}0(f+&=wf+t7^N0|(cwI7B z9v2!ur^RY(F_sv-5NQR|KQO7B8{Y=Qu4n&i}Q!`P5{qlkL} zZH1iCTiBxZ$nBDT{2Ru$M}DebpO;scxLxUFoDt`FStZYLXgb*;c8?h3-yjQu@g^XU z*Y4(hOzy>VOO$UbIp~HWq5o|HeJ>unIL@EgL$t_%u)VLb^B~;R5hdzR9hF-HRe+-`g|9K3yspFdH__E1~*y69)N#HE##%pQ1$^wqvyB6a~;pW)Wo4uMH znJ4*@+LsZC#{4~VJhK+Ab+z@Fcj2~XDE=0xfuVBIy^MzH0 zF8*Kfl6ImV{}cqPILm-!n%!yhoba)#+&HtWVisy9tJq@(eq*nVXoFq+Ibi-sqM4nr zzFX3+x1oUh8veYt0Q1X+(!J^P3hD#&meBUFpP2jLd%Jb0yS@D**Og+}sEx-SSnCgp zJ^j2_9UucplS3=OYSgReSa^ij4Tb%YKbvb*>dt65N1YZVFZCzO(|VFWRDWZ4 zIM$iYkJq35*JBxoL;b4JIsQUWOF?xvAus>-_OHpFkdBwVv=6E0My?a#A(n|;DsaeO zXO8}Cb{{K(hCX(X3!TZnV1qp8{L@vV4TK7w8Tq`{4z0;22kNuy-Dm&E-Wl5SLufkt zc};i!`Qv*Ob$)IzKGfaZfV6NOKyKJy7F%d(nYim}<%a7J(cTPh<0|yplcmTis;ndV z`xQP-UxXcAl2)OAnVhO75dDmv+9ysEDQ%xR;9pbZ&sTBsVD5S7tIpii3sO!J+x9BGce2}a`92u+ zHb<__f>I2AX1~EweN$HgZYC*`&e|iWCWvwCY}`Xw(3nq#yiHg3-#2BT=L2wIP-Y0H!q%jJNN=%mQ#WVv`H5DN8?HH?7!UpTK~hyF8GWm z=|fWZLKl%gbO}gcMz;3QTaX82CR!NN5n(I$ zvgtUrl^{>6L9|M9qZmg5KY_OXXCg)GxW`3&;Tb_G$@y>@aV6m>I1x>z9jm!v38z@eb8OQB!Kd2IPEpSeO`>WfuM{WJ0V z0y?3p&dWB&@v5`kbaie`^!Qa?XCLV^frdU4IFgt7D^9~@E$#FE!vfxaDp>}wHb1O4 zz$Wu+p7gQD*ErFww+PemcZxm;s7zq{S7A#-m+1*0zOphDDk+|AYEkUPo}P!)zE_l- zX2RxO<4`{JnSYpG`xhs?=hO3gO82Br_qIF44E6E!Wd)@l;pUGmHtwQ^^6+m@U(!?h zTK(((^aP>qSL@5+-amv!mlb%=+ZXl6@{+b#T}xl{{!#xXARp7}Y#LV=W4tg_(63e6 zO*gP5SEMmT_;hbJ0~{G?X??HdIdZ z(g7kFT48&{&Q12oke__c(2EHFVYEZs&^?ise#8DHb5MVJp!~#DJnE6g>mT+D1_1>u zR_21!*$)yGO^?-Q%@+;4baDn5It{W{Xc^jqoqF+|g1F5&$@WeUvUb&6KCBmmx!Grdw!z4ec#v(;rwi{pV?*6$+uLWc5 zD`W{xNu69zO>4J_@qpiep!H0w8kMR6 zVt+nnf9`~^+Mf8=x|&N^U`mR|><$L%V?k3;ON`fN%C1HI(5{Fq>#9p6 zU$-Awc%|D9Wh6O?&+W%|5^g^(Rzbw-4H!@&kE!!n24}WpTFpoRPM2s}4lU)LqvIIM~g zFd-TTI<`0_&V<=#chGnN&ugRVEqxja={RYt4I zu1wT#$y91^g*VCpz?`F6Yt(Ain`MffSmo$!VQ|vBA-DV-!O7^jlx$mIdX5#v~`Y z^#Rr9{p!{gvJQ`dCU*uO=2mY&wXHozSOLmBHH9#;@8W!7olglLMF;O`wiT)qQ8?En zT?HSr&f9bJmO^_Q1WCVSnK;?0q|kDD5u&}wJ=$S$0-n!%mmMYMPR$#4L$|#WimnuT zHS0ANO)FdL4(F&2}Q0cxNJwlKC%2vIU(yh^FDjO!KtI`UrC+6eZPl7M4rf;%S(U-tIM3g&m74< z9qjL~59aivhOSHdIuF|`H;cyS2=~{|(&>AWQ_K|0ru|Q}`z=_QRVKGsa7Vj|PG-`- zIoi?gyPC)O1*@O;s@t?)rgN@^2kMEOzHbujNI+QM*gD@cm z#y-qXV1$hQd9UN26TfN1NLG^R31F)pCJ2{<(|8jOfsMZus$IE040(yA*U>Cz;i%r0 zMiZBty>b(t`*aB=;U_^c+_qheCaSDhX2|IE9E@B@4Aif3TWRIa)c46iF##bb_|$E~ zm{wY|BON^}HNKC$t!wh?HjQle_F`P7Nx@z}atpVq*X=m9{85jf=u}sgSGNO`Z0SEz zgE0wZ|H6L=YGIW6U&;GiTgaGhF|ozx^vWwSF{f0QU1$vNuVV5=s3Wc@7`!$1=a;k! zzynvbps(OY$NyV&nXm*FASNdI@I-hOHUb5Ry$URI08F*|#{j}u`biBnF%qt|v~ou* z{T142nYqX!9Of=pItQxhK))lFzL~N8+Vx`lb?b>Og|F=JQqOYo{p%1-0bia)8_#3Bzy$F16cuDPSC~xAOE@AcQ2SFQyW=)gF zkIJrz9)C<@7CY&QXT92{bYdyN>^r?q7*6R{ zg{<>7_2fstjorD%uWO1u{c%C6gSV+COSkIbTJ{N>9ekmndW!}kW*>gNh5HZ&dYeK2 zQ2ksr_!YRe=ok1jd6yA-Ie|hYkzEQd+|AQ4@QM%z;qJ~B( zM4kO%*!3G^wx3$raoq*1gjytG$*YglN_04oXsbJ*ej$M`46go&lnka?)9O!%2uBw0 zfM5AXg2O_h#jE%$^8;-aFsj`$vLpL2@Mfbzo_%F8n%8P$2hQcJVS)s`D&}KGBJ+K4 zU-2KtG6=516d&?DK~_u%THN&^?P&BaxUNsP6BXk6?0Yf3g-WCPw=kB6i}$lplOS0wYCrV^8m+nH3_CUABPW zV1z|W+p+I-$SN3tn2PD#+SoK#dn4vaxmjcrDPc96ZGgyK#1?8D>wlZ`p>Tg@s~>L? z7q5BLe(>L$L!U`S_7=akwI{M7GXdy?q%iL)3O?nM776_9x$Xqre%3-b}F3*O%& zDR~3N8_n<~^B0QpdJ}btsZD5R!XgTSEv58Cc26rCkfRS|W|o?S{Q}&Q;x`09$&Y+b zd*przi4|p+C5R@fe>?L>@!BW9!ZYxVsRWMJMs#&3a9p+!F!QkPNhaz=oFY#(Wx(+2 zPI`{q596S?bwG#pt1=tKczO3aTb*ay(_p)gXO8V|8(p_f(?9QHakY^keOF#Vt z(@zcHrKAr5E;wof0D~l(t+-h&#cfud;ZVt_!797@5BB(WyR|KJb+Vev)P}$lQ)68t z$u*d1!I_{XY}|Yvm8M)AHgD5bfNNES`&7w9I51)_9lXY81(l@&MA-}^jt8`RSn#ZZN={q6oB%|pE#|Y+ln+JUXB_S%j#GE2 z7xjg?S3-xAT}_8S;e!K(j%tluA?74i%S|Evgu9CJQeeQu{U~zBbUW-n)?s&Ao&|q` z|KA1x&V1uy68In=hA&d+?tBR<`4VZc*>*tNwFN+NmK!e}!cMR3X1dZo%lOMKXbi84 zk(sQ7{5WgucB^i1%UlO^)DtCjty+K)NpKbvYTsjqhF>yD{srB}Zxpt1nHV=a27>LC zNJ8J|gmF%;sYXPrur;UCdS+%Gi5^%3G(E0V1MZsA!wV(3JtI!r`i6SlsaK5}y0lTh zy~aoQZ!EoD_}pkc@AjVBVej?dSo-IBv(&y@zKth-`5nFX1Gn~#V|M$q6Q!NrE2%O5 za((7I*d>;E%Vl!S>HEI@lekgH3Ez^x(4SirCUM+`wVWdb)GUiQ7y6S^qcO zo0Yy{lDAyT_S2e*zf`{+dX~NvTdaU#f2BGUGg%>%sV(uQ^&;@j@5AkW8}#W@IwTD% zMX3uM$~qj?#Q>6@E2B_Hq6maVQ%-yV45NUTmH{=j2%$|%(>3T*Axu3Q&`TY*tQ2HD zH@(OMvGn;iGp(uApcz~Eu;B7k7fvlShaPPZ{`@ z8Ys(GNic3SI2y((RQRKUrS|nx_88XNs7^~aCkw`hC}mxhE){y!x0e|YyYWlDja_Qr zCdc?I)yK${8kB1c`ET<0&qKJ=Sy85r*JC#NjRw(`eIaUx1A8i)2^5QbJ3hctF&KsC zow$Y*3_Jx8DRw%e^{A}wbh>ky^-M5wW~B#3NhR2Y?ul3i&0jaMIB~8`;+dUn_ig47 zUcm!^G0DWi&xT_{YuvQ9JWA@bzf#SO#gUC9 zHVls4&5Mv+>EdjxkJBMonLo_ic zj!kU1CU))THT=I%to(q975&c>lVD=!)UPNew58b$M%pbwoE`i7TUwJ4&o_qPU>sZg zE1rY|6p_Pmyh#AJgy;J1oU!aQsBk9#`pXSZRtirHeTmQ#r3^-7X_P1q#{C=8V;~zR zK|501&^AyI3+^^~N(VV#AxiD1ebv5WSKB-zCc)uk7z%XbB#)2(GQ_%F_@8dv%eO0* zDveh5G@TtLH5_fcmBQbD80yB4$w4#6SxprP?|WBg|E~rZ{;IuumCwcv_INu zcYGW!81l;aGIz~5=UUZEY>U43CL)<*r8Xbg8P{Z|k+` zC&05R&l;il)c-m278e|*mz&JShJN+sPnc{MeL4rJsy9UZt1Vt{-brG;;!<3k-C9`qwV7xe!58=uJCQsgREYn%aFdU~>d z3+wj+&K;XkAzW|Q@~H-RmmLmuKC(Sb=ewJ_BQjfKYQ0(|NY-V(<*up|O*G$~oxzVz z1hS)f^Evic9IvEro(chGhXpI$W&~pP|gCD4UDj|L15xuEPG%L#6#Cs!ar7HT{7Je`E zUbbUbPkB%BC)&r@s?7qz-+2V(v7PlM)4m<6sXt7QG{)1w2;5pL;xxG((rx8TEtM+j z7d1Bu!9(s4E{Q%LQ=b&KhPX-9hy)8D+ZMc|Nt{8g7{z2H>oJcqdN$jJ-F|`~wf~FIok97?oLoFkIiJx{E|fI1 zkq5QM0Lxw%^9A;&T+Bw$ad*E*7K?&GsnnNCu{9P)nI*G+uQ+iw=hTRf%53_v?A>PFcJ;$Ic`nBTQN~xjDOV4htQ;m@(maIDLoGzHZxs@-xQ77QO*+ z%qRLTYkE;V7{$pOYb@!7g^R`_0tI)l&#sr_`o_Ds{zfM+%KMKCeolzE_2oixLD*G5 zXn->!0Yh~eoExHz3i#k!X9O+oi#*M_xF6>fd%GtkzvMcD(AokqQxm9#yI28JLYvaf&OQ#LM)SL38t*iqM|^qC@gy(46_X#v52-|<)F=FAX5y?RUNBra7a zZxR75FY{xvj5D7zx8>y)OjahhoG2Hwa}j@ni(fj%@;lo2C(l&uPq};LJC+S zSOiZWp+no9`}24F35`Y&&;}yF(9xh{51`Fq3{ZBM2#z9Vh<{2yNN?eBa`mI#jQY^$ zPoMywAD=ayz*ilb^PU$_4vf#L0K@tt?Ny8{+wT7@KIjUsIuGLJM5Op z;L$G$5>!Nx_ql$IoEISJEr<{R$A~e}h1#qJvU~IJVs0Tn)v*L`LW|+yRQX{kLVB=4 zfl5H~Vq)&X^%15k&7H6a!t@mu@fc~wghf;qTEx)fc3lts5f;%UQZH;&?=I2g+oM?l zK0LB8$PB=kX(%TYbk!us>HQ1>=8}KH%HASZm`_HHW>QNbhaJ|PCAJ>ap(vA}{zSTK zk*=!-vCM_FnVwuAnK2Q9}IQ)XF(n=M3C4A5ed3S5F1;yy~vx^j|(moT)UJm$j5g@d~@~n-7D#zX;@I5M9@7Wj;mb!Dwdp>hGB- z9S%l>@rSAdP2{W*I;4RiKJkK9UgsoGk5fC&&c}ETOgBo58czmA_{%XiUA`OG36QGO zZ98>w6eU$HuVjlkzs+xm+aYVt0^2M{!kW$IP&bIzou_6*g7C%tkRSw?%sR($wMW4Z zqWgOu(o8eMwAHj)^bd#bRE^3J>pOG!?dW6X2gWiB31!M%WES!Z(d*p(wysXa**%n` zkbJQ=RD$B{fi~9&Pw+zoG-IwjL1Fp9$F4*;C-*_t_p zkLCaVZ@_DaKe5<9f-G=B@PDlr`r)KDiWLM<7X6u15er)k3pnP%t73_Lb*S@EyBWR( z(3)!|xS@bMy-^^D03XLQyJ@^nyo}>_S}pwUe4Tzgvqa>opRYhByecZn;M3s(z)G3$Ge539vG_ z3m3o{%Sz;3-~eHqj{JZl!5)xN+DsUfZV0r5TTSlr7d2JNU+!QBwUg{3T#awFiSNh* zf$T?;$0p=y#Wka+6mTX8E~Iu_!31la-4`v`{iBRiZ9N~~^UiW3b z%j$dc3G2ys)BbbD=a^Z|P6B!+F!(x)G-RQ+aNQ7a245wiXWW_?YP+UUXeDxDa_E-E zLZE@L?IF7UQt}QclP|jDPhcY3ytT3PK`^y2a;oz^;-orjHX)66)^3QUF93DC%3nj; z$L#Lp-zkaCn)Q^DseaG}upP)RzybJ0AweSU!<(0p=AN;uL0g%L^?vEl>dGa10hEdEvBZU zY-S>Ls4jsUkdYGS?gQ3BD>pN93fNJ9qhq6YRA=g~j=Bx8XX@UvyF42=a+~MQZ5!DP zmT|?-ty~a%#ar(3AA-7?gVT`5z!|piLW(+oH1bE+L~ZI$^;5|b5<(KUK(1EVOrc&n z!oh_$K{Pg_5{3nf_lb$5HczsH?e6|?c0~w<5ME?k(nbfd;LN>YeZ4s|DMpc`4rElbl-?Dtr7wTHv1k7AqL2es`Xv5nI&uPfE-`~j zXHbM)GfhvGktFdLzbt7Q#JnCjK7cqT?G_CowQUe;apYcoRNGahiM7@LyobrHWrnfE zNp^<>YK6BUfz`8_(gU2FFOQ<&GcS%ME%SH&GEx{87q0DE&0!v3Iv?5qJ4lwF0#aR2 z2{;G+6N3yM#aUotmE@T?X4Z%)!s@%Oo+7#8om%LmYoWjY>uGX;A!ePVE zxA}4fK-)V3vjmZL+hlKT3IwJYUle;fa@5$!(cBOef2JpL zFXbP)>)&+3hAJdIUj>%5)i?D~3i{qg_wZeUsZ+mt`Bk}SPpv`}6q|==q2tC$U>C%v z8*pua42@euzCtPpsv;SxG>xv7FC>SBLDLH++|XanpTV6>E^+JKBLrN9cIxO}CfO9} za<^D}TWT!F%GfmLBKZ|xxvH_o{U9sX3}Mc1?AA|xIscIMigInex4VjUz5q+LI27Pn z&n8`7DDBDW5P|~0b-a2X>g>Z-A8p}MuuY$KD^LnGEWMWA96x)8TVN4A_!~-2!sg|= z1-#?SKjO+>#(_ceXXnO-^%2KrwtrysIsVLK0m960k2SZ7i8#R*Fxp*XPi&Ar5^vEZ z2ohMpN28(9M};JVmve$3CGmSIysvToy_(JG=z?^_LofUVN8Q_S&mJs^tY$5g+M}}4 z_yqHJ{0^GLuU~1#6k`CRj){U%R^0rH*e{z0WOCL|o0C`?8~P zF`3|Z2=q#9YnR3*GzXe@@JzZS+!^tL7no!W$xX;844$}=_lj4kq@I?&gu-)L`Mxl? zioV8&dHCDsLu>sQ;RZ52W5^axir-r6D9t=*j74 zIeBB0CYiEp2xK0X{L-WCf8=p|#%=kMNyb80{l5pHb&}RmNj8Jh9((C^Xm5@*A$&Bx z0fe11N@UaVZ0@&k8M5Db!`N7G@l!w-7d-i>fnFt=1m788M1OnJO^hjf=gi_Tfd&Pq z#kKRh7Qa#c!CddwnoRWdw?JYmg0pUCqLByCjk<;PlMWVz>B_lAg|E$D(V4E@$#RQq z$gqwkD<`6fF{7IOYh-VF3QXV0NjwZvSXQ^AzBMyLaKMtKL+$Kew_FeYQMem5G5Yw{ z@ew=VHB?}Fen9m5NSo*)RA9OodHq9KUZK)kCqz(AcsN@RrPKZDAV5{Sv;H?(a!ZPX zht`{sCw6O8RA^4IPYnGR`FVhTS2zQ*SYUFhZB@N!NO%GY^J|NqRG~vl~hE6gU3OK zQ|G25D+OgN8~ywd5?a{y=DB+3Xg;2!VzyX^?tYMUT(TSrDzWNsMxmM2G4Fp2L@>qf z@Jkfm7TmI!`D6H$1l3(OhqETLZbo&&**Nv>%+`P*cpeLf%;O{xRTWEjf&lj3WD#wd zD9rsgplzt!Myf6P&NiNC=-_sT3!HfA99$xQpS$?Lh^Ub6f>!ME7ci>vx3$j9XlaMe zC!`Cgjpao%h5G53Ljyk#q<`l-eG6Gvx>i?RG&H4TrobxYCNYB{LzeNkJl5DLz+06E z;KUw;1crS>SPDR-Ua+PQIL3fK4+#vC7Bt+9K{1z)I3-bvYfmcJrdaw*&Lh|08P-#NDsS zu33>wM(mbh0IPs-jbov7qy)G-!z71`fUHMXEKLd{6W$bC{4H&ESiZNmgKJ>sB~mBL zbOx5xbZDcGt!N)#C?1PjREaD9QU_RN>qvVJc#M3o$@1Y8{0#jCp7#9~K6b%E@BOqF zqc1jkoJU*)V=3L5>-1usw_YsnxZ36VtmS5E6QOrhShdt`J&-(jOys8a$P&#$K~LzTFxy`qpO0|;zm)peUnKT@Jv-d~D**e&&nLK!ya zs}rRk(F*;iZWFRRzjvn2&9_&LtJGKf=^rt#k zTQMqas((&rthP&Hc-%{uSOTBdjTpYE6ie;S6qUgPO@Hxt!JxLQw037~@e9m5N2;&d z1sEd5F6392nMHzCgYzr**70%uEGX4#zV9KQ1-upUt=4f5l7|v)qZhW7&NljOp2<9b z8y2C8vlZO-j*d=L(Bf*W+!5Vy{C_}wgC|%&4j)V1p>DGELH0H{DH|MBkS-`wWV!4j zm_~=b3R@M<2a#vdTA!!Kumnnb#0*{>#~y4LvhHj$%Yq0^(@IBZj?m68DNfbz5#@LUVGR=BhGlxulP3xam52 z^Z^$`Hh>i?xaWf1J>D%5sCy3bdp-p6S|gAW*Rc!6BmQk_b-R7Va{=d~N}k`Z=L8MGn%e*MF`OvpfNMJU+ea5# zB^}TX{;p6eZu&&SPko|Q)^UMZkv<#!5q4y$*R1OPGWSzB{(?kMt|z^$`EkyU+{d~hC6!m^L|KmT_BqSj@n zq=>S0c24Tz!t*{?P6; z#ZDS`&p!$86&i}!su1-cArg3nILI-Bgi?gOICs+p^AGap0q(9}{@R?>$r}*a#yzAz z3_b`H&}!gK&r+ZZgO8Y;(o2=Z0h-%;BRqG=e-uE14{a2|t zTc35W3-3%mlc92fede6fOoXdhuxJa@x4D{j({gzZN(PRLZigOX+N<5=aRlr3_7afg zluGU=4;#JWz8vV4u#K%4Bhsy91`nzP4a(H8Gg8lHf&^bs#Tb|nm*GaMM4}v^D5ATP@vJJ-c zyC3???&9t_uC(CESm6t)(#Kq8lElxyZkhc63qEQ++J2%QY;DMk?k;JJQ`{w9x<6GY z@nnEEpL>S0YnIS^_JzLqtNNA=T}8b&4C#C(kMb*~ftN?m^l*a}H>{6zUNWxtx+0yN zFlOgjjay-7DLj#cY4Ai=6xs|El4DHg$uQ0h{KSnHrve{4#7MKa`$L!Cg#B%!ZSINl z1`s_Jx~RMkO5}E?_Qjs5+1F7Q&1tuLJFnQgm5Vv9*yq>mlCd*4T`RTsS$$RPx`>DX zl!t>@`bJ6pVHk0@J_B#GJs?@P_`2aXI(O`sb`J=$`+al1mB zOZE+4v}bU-q2_6q`@KtK3B zWa68Pje5kYa9vU-?hu;QZO^X8DB!|(xQ`H$LVHS!n~`hI(?~_3CDX)K@%OMEr}$fu zqRzK~F8)OdswMLYq;JuU!u%jUf((VS+GuR?r>==zBP>CVwmMJ1YH_Z~Q#5I~Q8x(R z#;?wa?-y~v9qR^mug4;LBy?J-o(8XEdj zDS++5!PJGzzhPyM(}2a-zn1y3waN#L^=q{_-%9CBVSV0)uFpB|-}7fqgS!p=Y#H5w z$@2^=F0dO#L|61DC)?EsB7{iS))uT&;a%?)S9*6~awxbrs3-Ekn3wy?FQS>7A(>9# zvir+GfAq3K*NTr$7P7j#uan1x$MEl3qQg_2KmU?p*}u<5NLmt}Uv9uXkbc$pM^l7z zs&2V&KS%^CIm1@r?gJ)5rvECQ2p<$cu!d=~f5n4zWY_`c^+0+@VU*r`pCP-TT`=s? zT%_?!?ml+a_cZE4N;VULFj2MRV3r2FuLhx}$oOV=z%)zu&;g;Ns1uQd=v7Z(+;Io@ zk4%eCX7zqT&im(la+G~yXp6Xj=J1J=l&m~yq&e*qglPHiLKizNNYHcs%z4~G_jB{z zH<9q!N6=zgIxxYL92PEhr`|L4S|*U`5{+V9SCov7X)T=`kKNf?&|16B2F>p2)CwX3Oesh^$K7Td%Xt$f6x30;evqUJ7 zW6Hz%&Fw+2$_MD(#cXk@i|XJu!0->o1Xpe1;el+Py|l@fYlt zA05P;k_FNl*%E+excM=lIgH{9fg38JyINe}EX<=T1K9oIOE?Gm^x;pLdmsEeVE;Z- z&AQg=JN}$`iy%tHp_4)X#&~jpM4w|(n$yz@Ffw3EGsZUCAmP~asT_6t6K_5HtGde8 zW|R&;HKfvrnoKqn4zAE3Nsb#YLsB!FN4?6YKVx`%RXiRN2IW$mKK*W;+9vKJqKI?f-!!jSqA1DUK$97wHPJD7h zZVmf+tM|)>^@Wl=jQ@w{&*)ow2U13;%OU9;EJg1ln$2uE7>0X`V0)AK)k ze`feSAco@53!U;S68uQt*V@6$ji0OEZSn$<4^egtzO5h#-AE&4?qdNe6&)B`sC)JJ zH7K_5*ZhM1G`v3$(e^lRe@K5gQ{e9iUIte_va4rG-Maz};tKQdhphOa^dhj*MG1;f zgJdWFfm%WP>(7ugfC#k4}|31@F2XTpB0LzJH@Xc)`xoUQ%3nmOz>u0-b*j?iE6p{ z{KFoFLUKI4q59!Xxjef~2yr1yXxu}3lwI2I{A)gW3LuG;foZg$y1SzEZ}nSL_;~Zky~Ok?8Kv6>uPy3LMq!!9^If0q#jYj5lotoz{v8r!U9|o<{$Sw#RU9jL$+bVM z`+ut8cw+eZw(RO&{4n{z_7_Fj_(#_YqOhy2xJZE67PprVL}+Acj)P$ z)6;I|*)+zaFX*x3RS)p^0RF&XZK8vR7$E4rgDX+q`;2^1o4NZZuxy7$?tWB}@bjTl zoi#fZxA&?bWLX(hs3$+AZcqo8SJrN5IhGfz^dBK*7z1$%G?J*$kcDnv!!C5z?hKCN zaR+yY*6tib^&{z#b|q~RTULTPFN3X=g6j*C849QWhpr3Sn{0$$l$^!WbjesoVCy^I zn;(6(BTR7aNbQvB znImmSxD6WI&~t2ZuuCu(PB|88_5%JaXzO!+(vi{qPEH?sVeppzl)nL4_KD7#UCGK< zJKT6f4d%(g4WAyHJcR2x4feYn7dLEZV(J~0?#UFaj=Q98Jmens8Z{i1%*hL*5XIb< z9vzZTm;Z$pW>>N9fyj>O3EsV$b5q&vq%!tcQuM~G!qdChLT*Zu6=j%YxYtZpaBBFi z^`^I<0Ze2Ba*QQ-NqiI`piM@0^#zGo$+OaKuYKOZ-X7z>BGc#akQ-|1x+rK6QyiME z#&DTk$RtghyJIpXM$J)4)Cba+h6vW2kNhdevi3aqE^$3&nEBd!^Ccer4MaG4zlw+9 zvanx{vFYNwFx{c$>F_AhWtc)KXfFMgl;iID*6ic$2Qxhk2+Gr%;ZGf`0)6pey6^#HxC>;^KQi|a3rHT#T^_~fwT}cU$#Y!j3bb8jc|LbDy&Mi4 zsB!6=ny5?Q<$JP_2%<&b~V^VgyzDCmT&*Khg!anh*(;7 zuqFMA$xBH+FuC6aRK{1iFo5V1c4n%AsgM~c59o^fAN0!uz5gW)g!kV?u3ScZ1wLl0 z&tm6PuKy{fM_#Ifs^Y@)SO=|g+KMLo=!4D=Is}KKszuhT$;4=8Hvi`Nv#Z?FyIu+F z@_j`RYHZ1Wc$JytQy3p$g?;5unJ)U>Z*U$b(FH?nwbLpbbs-K%taKnaglMYI=Fbjd zvi;-9#%SOi2rNF42z4W*VtKvy8(a+VIK%n;SyGVJh^TSc{9^=%Nk3pfsMeXPFJO_5 zs!#)3ikdLL;CIU`YdgwplUZ-72_-@Nz)UnH?;JrAx8XOyT_)PY{HT!q& z?-MrTl2LWNr2~BCXCh@LndR-j=HLB9b|G{rye1*PkQVVC(yi_=Mrh7aB)JI0a z3Og&~a^G?tyzUa~CQhc`N zLLoRH-K=hN0(;`F zdAwFn3~ZrG4Zwj?b;0MLR9#o7JKzDd>yyw0_OPaKvVKN7I+7qGG~Eur^!1hHJaR8AgGaKe#`WvzI;52*e^ z^%(UEs36}tP(4HZfKKdR7twXhK(#TMJ5TXjkxF!)`ogQ$A(c_Ki{I#lm(v?3>d67{ zN;!CO#cBTwPW!?u$6P^{UA^!+R&#Fag%?!o`#X5F);}15@&r-ZihRbf;P>zk0SIP! z1r)z7khKQ@^kV~49zNzgm+1_92Bz|O^15-2Tg~CG0E%e?=g%_n3W2NMIFUF^@M$eQ zJE_Z%&CV*f#A^`wW8~STIXJ3TCaKOdIlIwb7TKVaY!sPro!63;%B3G(Ln^PomgHER zY$qD{&3kh0ensFd>HVM9Lw>kjo-|543p)`Zl(_TAP#?NYw{;VO073iP+fejJi}99l zOQ0*hyrdYt;sE{L_lvM!kWKyPHU9ZGN4*cBMn&$S-=Owf1K^*(Bw{b3eP0wj&+|fi zUg$Tdm)M^-yKfY#2~krdTBNw=j!DB{KzGIW!yg|0lMv zktdB?uRC3bWG1yL$5PBk$tmNaetd}%>{$My$dCii!!?nKn3EpXyivxl#zIu*Taf8c zNxGzvChj8Km@v||$QK9HXJtg3GuA~VEzySHr<*X0%Nwqb=ct>$BTjPCScIXr$WbR{ z?>pehDOvA;C#Pkw&srE|o__s*ZuS>%M+ppX>Ac`dmSI7l0d1glq{j1>tNj z{$bjT`{w=^)iA_Tfv*;>9;Dh+!)m!JG+A69T#uMp!4ZM>;ES;gcl99(j5go< zey(K=7Dc@klc>5=)#PV5KMmjoA^`{KFJ55tLg;2%JZxjjLnL zFXpbN%yIaK^$hK?>^u|@DA>`OLqE`rS8gRzI5%_z$qKI7&FeSLV@XkZJhMa>ac6Fc zn1q$o2qfRoWib?=VucKbPSmga?;PFlAN5~2yu)=P4^K!kc20|EGy9uv=18Q!v*lE# z`*N;qO}%R~0VJ~r-=pT%bXmmjY55doExJ|pYk)U#NQWOZ|*;@6G;PMVn5DI@`P!8 z27OUM`T`K}4wzjMTo>iW_Tc7X|5YDXX^fmim`U{q*OtZiHC@V0lui+z_h+A07R)O4 zXBW3FDK4V5D>=Ut^=C(0mqhKg813bb)LuNn+Fx2S7C4;(0dkaQ>zT|O^IKeqLno4$ zeeND0Z90oLz?4iY(?Cl68_?t&^6y|^{`3-(uHifQ*1xKl7b4l{&^*_4=nK1M{ILI2 zetcpcF=e{DtZOH41G>Fce@h2U)~belz2E%%LFpE4-gATbPYwE4l>`f)8iexRg5om2 zoU0iDc!_wO%DJgpBhZ#?UyU6q`uI$0`I+iUZ*+BKZpbSR^YayZl-t7+B|XzBghBji zv8Gdk8IKOKO!3#y=f)o8Ey}o6)l24e>S_||`Mg@G8&f#Fmpy}ob?S*-I2ZP<%X$TY z&;D)|9#&JVq1UX# z;fn<!IUx(Vd@S4`QU#jE@o6y> zlG-;*Cb*xIYcH>8DfVAH`npe1z#73Xzdm0qi@YD-mpXdAKVYt6)3lkMAO1c|`|oM` zFM59XvHX0>|6g+4S7F(Ls%`Um-#s3Gx86~S%if>!(Y9<$g2Po!pYvZF_r@2RE~WOHhigA4ti2FJ z*lIt0MC~56%LnuoGix_p6~CsWX)ZqUOi2vumNZE+G+bVxl9=wED*BC67m%D+#xqHi z?jG*&mir4GHosO7ChPNs_%+d{83Ck90raop#-JEaWolbo_T{lnQ&cl6L2@`d+EB0g z!!`d2HRB&JJ?iQ!roMbnqaW<4)fejZ3XF7i<%s$|?&`Z9^Rm~T)LvN{WhvV);}ODc zYhs2{X7%pEtacevM54{B1l^kbXvJ_xpTeM-TcipnOD4!=&>|Gz6L{49+2$XjwQTxi z&vd)%T=MV`&{i;;I(kXt57Bsb&%*ccM1vl5{gBrJQ(P`-BF}I^!Wyb=X;Niw%!S}a z72$a(Eu>@%!S?bFOp5!P{t)$i*RvWR>l`kK7Ul7F+hf<}yjF$uR8*GKq3h{CCtyN-|tB)c>F!qaxbrZ_kwI5UrSXVaVDY_Nlv z1z`2m0t?~nmG*A(3Vp@yg9k!WRRKQ0x+Ir^Hnc=906K>eSp2tAuh91}0$<3`+5Sp8 zI22Qd!L4zyQ!_JCOU%4X+I$pWxx$oL2rJH~yvZme8pxKE+j!Z(=lOl{*VEMV5~k_H z`I|FB{wB1(V5EOHMC;7w2!8568~$fk|0m-g96A0nu?=~}bVv_q4;kVr306=ZLLF4z z86;u>LH`x0lK|#H?Cz$shS$5W7|gPg;k;}R@t2!E2J1C|6FHt-!~Y~VEfZ$a{C3G4 zDS!>}iPT!G(RKHLL^&EQ*T-S{Jw7Pk&DJC&yJV#jDGKU1RECaL+SV^Wf$A9v53RWQ z!$4idXbFg)zg#D=2E=6x9_y47h(`^~_);Yi-RWX%ceYbGsnng8h-S~UO8ePo@LpD) zJ*yrru`2t6xs$}AS1t$Dm=KX&^);M4>t_U|>Z(6gra0;7=xkB8^%-?B8_bP`Dc14K zZlxYVuHoe9Y@(gbj7{KL4-PI?OOl2b+JbW2V+f5Aofoos;$I z3RYDDcx7#KX;j+fHT3tcQ3w+zvD)pMUF{Iz1(R4h^Q!+ouXrV60J>t5OZgTl%tU5> zMT7~amTXG)gll40&*usoFbVfQP0y)3;1|hE*kqX=VV=Rfi5?zPhs=6t7>}G+zBuy0 zR0!V^>Lkjqq0?n_ic`{RK=g6iq^G8@!i(5>t_fQNSL^$9wbgbPMuZz;%}?i0r%E}i zX?Q9&2LF?O5^QqIcDysRPD{a(KI5+zpXfM)*6|1}lu5k+CHTz7_lNw}u}Ec4Z5tgc z-gF(O0XtR7qT~4+E|flPO^yC`Nb_~_d_8Jvfv$gNrgArfRZi5e)CJ{xs3TMkp`=uN z7a;fN;+GmKP>G2SFpwWSE(pM_)?#pQq3C;7ccZR%HUK{D3kJZ!HKA7G-BwAa$a@2v zozO;6SDKj|z|mkayZ%NDH;51F-=71KgcDb&Bb6{Mo{B)7^4a482WV53I;<|u+5{Fx zuCfv6nEnA3sGV8CwU-n2N1nyMu}C#}_dOHYuhsrKgId>1X)~5)=6^n-&rYWoY-4;U z1*Q5-Pq_aT;JHL&C|6Qu&ZHs#bayg%RBiFnb57)+OFE|37PlM=H;wHxZL93Xsu!3& zem_m-GC=LJ1u^>F*q`4~Blc5+_7m!|QGUr9_S5vK@$Kv<$Zcb`XPVng1aD+B5$-Ue zzTSN&K3m7UHu(z&RW=M@HZ6>Tkd}2Pyfj=;hw0|Cladh>h6mw=Ya0%v8;{c$aHN_* zWA0r13v2*G>Vv(uSsjd0x6XwTFtXA!d zf2u3IZEqgk%wV&S>NU={8Uok>uX(NJ+RIH)}iEV%@csov5nw0Y^Ht z8MP@#?!>hl3Oi99+obK-sZyJ5ORuq=*kLXNtM!1e?`XCiZmXC8Y5nP@9`kCKP4r zeBwSXDPyGp!hGnCo}ED5%$h=cGQ}waayD4%>Q&Fo zC8*tPs&!Yf05N;9HGZLK;d^Gz;WOFhyPB?0O~Mslf z`a<=0yEHjo?^W8O`N2H0KA_}aW_8dq9&5C;JEMb=uTR+4qxwMn_v!~jw>t#n)2XY8 zs6-sKF|f8LqXs|9r3rT<;ZArdSX2#e#QQAzK`QFnTL0yBf!3Qy1`BF*8wls&R!6yBVP>@u(a&xDo1c^0{(#@IFt3IQ zX3pns;+|-0QF&Q$?)Nn9ix~ccn%&%>M59HMoTCbe2!I!eWX}W(_|eVvtSpDP#*)kN zQ$fS{#^4@-bSC_CTkYucytD5O!h}0pCg}`%S+p_<_w{?BOL=gP*gu6~oLonuv zWx2^%ntyA?0i~wGpgX8iR<$dBekFEgC|uTjZPV-_O6*p9IE9-a?E%>S zK3!=&c5-M8IacgE1x!DptC<@PHLpPl_e#22{{CG0Jt?Rl7RpTG=fXMeoN+GjMTGE+ z2w);_v)Y@Y>9Ki!Mfq=-gbou;9LFl}rL#L{obC$T9Bn>WsPAGq7qJp|+yQS`UxCde zD7Pi5ztO*SmcJlxZF-}G! zt=x;k6B=FaCorsR#?4da;bbLB!)_?+%ChU&Mdk|{JZjq)rC~EvVv&y5WN)g7YR76@ zaQ^0P*PmpUXl+4%f)T=qrMTOW@Mh}100z#sB27Vlb(qjK*#iNV!VUr~GG};Wu|*h~ za3q_MbWuN+fFRm>y28pXB3@+4HRf$7@)dd=)?4y;i%JQhoiM`Q5YpQlptp}JIZtov z9lf={n=Sh+#(+^<>jn;tV3Idr82tJRd+IeqMLqS74A(m{T<^$my(7c*bBqkv&lef) zslP)0yFK;I;w5_OmzY}8jY8D+0avf1%=L~k*E`BwKTMge56r~nKY}*%QV(tZGBrKb z9qJ5&TgL|V)ru|5+N5rKduY>hq0Uctaq+QorM_Ix7Xi&0ThNo1O)BELcsdr$MvbqA$h&;EP73Ph1ZVd|@2nmJk*$Xe-Pt=TwAoD zLKl82KZFzJC~RQ^0Aph)BeU3v|Eoz-p(||ewF-+1tFTs2VGE=4EueR}Q&9SUHA^b= z(Jd6)EUlzg8$$(|wE<2X!+$tSDm3NOA2my^g@0#etc6N4Yj2&{0!gHO1SqM{6$MaQ zTmYrDdYbN9NT~(3!?o3LhuXHb9~_@J4_FFp3|G@am9b7#>xRo_{ zz}mTiN*+}^aJ|+DPT<^)*U;ai*`aE7?L9rybricOxV0L}i*?LiZs6qsS#n$FfD;vg z@~41Z@VH4M(I+C?>}~*O+=h8X?ShLm%4y2or4p1@p$AmxyROi;BirmOp;;}g1Tm_) zcHIhX$QL@|wKuAeX*;+nFtTl{W?{1?+uER|2ZdKY$+)enoR63bgfDmf<^^2@@c4ke zFG3p;4P5P4kC7AGF>yxAT$h$bwu!;MM@KlK_saQtQH)b|8iiU1BtJeB(R;z2>8g?ZKz~rOf%Q>8XY#R`^OybN((oTC3un6IiO93g%2V=~3$R)8 znEPZ*Hj0$U0Cy=yj`%fq+luf@Z=N#Hv`$B!$<%yX`Hr}oI>@K_BwwcF+gk+&5$Pv< z#i&K}$8uBR=ANEpDxZk#cWYev*j8;>ztUFORy5K_%cgXQ!0Zk9H4nO@qBRc|`cLO7 zmu*#NBKzI(dg`&}D<9Lbc$!t4KB~3_6@iJ>YPROvkt1%wsnhlL#5%PLr1A-8g>DH} zwMvo1fODis4LIemuA$B%WEuTz*39@i5%8Fc zPKREQ0xZx~*gy$lg3^Wr%hnU!pdvj{`9~I=n7x`qS;u8}wNBtFo{ajRgiCubgF}0&sr}hVo*P!p`=d)X9!t7Yh;ewt~_7gg@`dHX^>x_n~2{E1feIHW$ z&{3DY%Q^$cslGd2_0K*e``_fVTW7-TpVY)$s@%+@o56p@9ED8u0eO1+4wcOHU^>_|E%7>r`w6zp6WD zQKq2+yfnDIjw2B|Ec7_eph3;@paE2>b41^gpoWGJ9&h=QKgKDpQLP~~p}4~g7`@xu zI_G1kEH+`KqIz#Dfl`7kcblSM#gqE6fVqutW@`M%kp*8~{(Mo1^A7$pLGXv8V{;?G z9B7=tm>(y9q{jzO+VY;g>@rwMea}_%XV_j9&d0%znvbbsu2N^%gsdJpA8Q|CK2+?# zaXwW2f6sg@h}wi)UYHO&byBd0b{_i3`49{8Ve_&2+sucG{Ws2ss{e1AkK&J*j}!Ds zC+MHhHzmfmc8M_=g_dk}K~IG_Q2NtthmRa*uRSh*bOIq^MwB_)cldY5`^T7l^EiFh z|IgZY`n`hAJb!+EdB1`oVEXMzY`jQMX<4lN2FR_QbIP9d0N8Kxpnw=1!Z)vg*7y_O z=G8Afro_>~l1W@46I{Hm=%>88vs`ok9A!~reNbiP%I(W7(O~wZ;B(xoBGfzHay%TQ z)(55bx!kf&R-KuJ7e;7)D?3W3dYvafR3ZEI8q>Ww&B!{QTD_mkR_ z(BO*Vja&T0hV;3e$`qux1gQ;v-B!P@t3Lj^pWf2kPcJ6C{*hAWlX~2`o~zVrNIkC4Cnu6OODK%QwGtJb$yN(L`-(?Ye&TWJM=@ z_JnO1J5vv>Tc!#c*9Pf_{n8q%Y<-Y?gwYbla)VTSDDzCaXFCQSO#ZR7GS^QX@H(m_ z0+*|t?9?@U%6^YI&Vv{MwFxtJ&}%zQg@`iE6?kmr+lv9vDKUTIY6|*q1+z=0XKsz) zqB?HxRR8AU;EQGJzG_|BGw#i4!IX-1UvqCnd0)3U|5)u$zE96wO3gN3*Tl0wxr4u$ z*(R?Df7gb;Yr@}$_zi5*{L&>n`{m90+dM``c*@wh)VG1XmYM&(!OWZugSMApt3 z3p_DK-cA(=T;ZxRJsaAI?3^2UJ}_kEPpl;Q@(hA@^O)*jqT#0WBUFX7`>u?#GBN74{l;Kg|`v zcRK)%pEd5vpVvB&-o=~O_B9FUsWnriTMfRcOp+AL-f@@S05_rIXZ*x!Kd}Zp->TG} zL>GVacq&MDaV=csru2mc|BEi2Z9G|ZPu3jBo7Y?McZkzNi7jLgQd??kHZ{LGl;~3gYW)904AhHYMEG(zGCc^foaRm|sLVu}8iY!0GZS=N948c4nM zouQ_(+J^N@odbZMQQ`z$RNi!2ZQ|jjE(k~@E%qS&M>cntL``g$vt=O!i+<@-tLAQx!%sd;Y$+cPX3aFxdR+hoIBKT!1KB4gefq8 zlwaR}bSV380B%rfB$$a7b$0%QI0^(+nsOn-#ovBsXnD6t@38Y{(C`pORkl!hn-->V zgElIg%dqDvq1B1{z|wu4DuVPwiuj&*gd8&F7Yp{YUp)^wmm{l^zry)w=wjYvPmQh7 zO3kX1?aMI~@-ABKZH=8_x9UDJ8}G8qqvN(u<&I8V&YyMwkn<4G1y;di!E){hqPZ&% ztg3fx*2roGmt5oDX`3yP&Harsr8mak^D>7KqjS0v9HTKt!tB4?$0YSmpr7xN7+OMt z$->#2$1ouxh}kK8=b*nXLTo;eyM!u?mOvD|Rlh-U4pkd`U*Gap4iBuM)@>){uHu(# z5qlCw`j77Q8#d-V1ZNU{$u7>F#Pjg}ll zRkQS3K0~jmjh%D!+pyk;V}gQ!>Jl5lX6%`KT=~W>R;4Fu5qqJkFgqO7rx5)q*&Jr_ z>o(QXV#^L3YNa`Xr;Miuyj71$S68LnGO!IC-QSw79K}H<|9QV*4>!w+5aEwht{!rm zd{B3HP;UL?kahZyy{fl8S*3ufFk$c`)H zP)HNbPN$QGv!-FxRJU#1*qEVjs!4qPf-0?%n=qmsm20v(Z3($fvPyI1C-Q&=RCW1{ z0xWdHD`i*bjT;)aQL1ufimkje(kSp$jvUPg2*NcN&kg#F+Sqo83UC-C^| z<5mW#t>GCQu*nh+a>s{Qz2vSSxrHm4f<%{JvPq6#4UhOSUb&XyVLwWdKGHjv(Y^T2 zrDFxJ-pU@30jNn{7>xsL@0D{&;JVFWG{&sp&|IO3gxSEUi`kHCx2CvQn_Eb<>=Q79 zs`>DGuYE4~s1`-GD z__NpkmQYMXpJo0P&$-w6<8#woBPRxP+js#4DvFBaI_0$&DYsjHR`;aHj@EZadF=xl z9S$iR6>PeP1AAV_Yoy?+-|>pRn4sdw=IJP#IOZ6=2lV+do$5?(3jn0Y3;uc=9&oD zs$Q-6>0Vtf4b*<;tMsVp6hFN!{$|Tbz(Z|<+cmuvco>6ewA(ukVcPEZ8&?Na!i;`m zMW>D3Mi&nMJ2p5Q`*Hl-SXDBfKf>4B;|=Wmb3P8f#_2Mn*69>vBA{+~$;LI~wu7;Q z#uePx6}ahaS1w*1YEHJrcPS1@aKB_iA1LfGO60w>yXuq=j`ZCQM`AgMKeq79K?<==XO zsoh)<<5s=40mPhCBDj-@gPz$;*J_1Mv&>vQ1X1mC`Nf9`@2>V6Ihl?giRTr}z7nk< zcV-G+X`*q3U$e=9KHw|o_Cy=7E?-&KDMQ$Nsx1{dZ8_Z?(l8csUTqqo<6nfi4CV!| zO{a3S*vqVC4;cjlI|dW4prl-h%C8ZC+4zb5R;pd>Cp!ZEtLbp_gDK6DgYtzcGjYED zR(8OX;I`PQ0&YKZ#kwC`>A*Rtvh>m~S#@m;ASl04IcwI?x?l5vD>qTw!D7!m=(;;3 z$7^j(&P8iuX1)T_a-u9Ey+3gYpTJULpL!DA`au!FeW%Y9vk(p4EL7Vc3L7ULk`vj= z-{W}*7W-KOSX#+$N&t-7*Qzhkdvsssj);yI*=)f>`RP6Jm;HaXt@XM;(a;1JDX%z& zecJJ0jyW{8(N8jgwx!u|M)3W1VXP32Y)iA&8vTdt$^#t^DgpzqZHM^LiW z?P7NG|K&c;;!$+MKJL^Q%tY!mFurk0ggLHH-sZ&+rulO0sTp@_EXJM|y!ic~6$jv-rCx-|%wc6kA zfYqT?x1U3l8t&@CPJSP^p%3ij$CdaYJNZv6^YJ?wT+2okx&_U`Ux8_D1-Z;#_&sDK`q+J?u!z_yp$_I~t%;T;dyA#S^` z4IMs?7jD11y$?=8n?0Oitz|G&;4(O3lUz0;&oav+6c8d1W+8dshz$2x2Ez+sCAMSk zZx+QWw3X4Tawc~He(gKZ<_^z}(W}~0o1L+4cDN^VqPC>rv}F5yT#Eq z)Ihw~TT!JtZNkfKN~<()eqtF@>VL;(tZEp?AU%HPM(PPUh997$JQ35t^8QFo1&tlV zUnC*}x>DhrdmSAM63e)WGPqy0poSgyGI0Pv-El~rlnMiqINU;2-U+MfWzJ9=CvXs^ z@pY(&5{7py0Gz`+O`mmeI)dME_@~Tkdt6Jfn6u&j#E_pb{zI$t0=!zM)Qiiz3hYGU zVXtjB=^=Zcdf3%0B!mu>bt3(X!I}9(P?Xy zT_|K2)7m6gFC`B}@QHyF(OJ!|PfdofA{B%pMN1y7q7&uzv9zqNUSJz+2bGc!I`V z|4&%SC^p31wp<)oNI=`|E=~+QZV)AFLSAB$=C7nRC>PygR4y44zay}G36a!V_XW&g z>KZ>*D6?$1OkG%8SmwUrGBfn0P{y{<8V&Hfe;79 z4CnlvxQsl`X(`WRW$OcMO|Bl_iy-7J9tzvISZSK(rqb5Q;+`Vjs&S-=!D;$J_U2M~ zz@^S`)8Z!|%DpYejL9}hA@f324`ps1a;N$xs*W%CrOL3pTLPQA{KoPU5heA=;ojAG z6qvhJ+uUYcRsRE3d+pzabkwH$(p-!PW76l4Tdu>zR3j_NJ#mNdGPjU;_%$EDxht*E zK?)(i!W0{6%;}m{WPAPs+4(}B<~8>Tr5U$qB3GFItwBWhu3^!A4DTNl-D66HW8`dD zQ-_J}qezkH{;m|XA1=Drd`z~A)h4tf!{0B}xRc&(W@OHtanE32%6Ajv+a5LHeT9?Z zF_}GRV*Fl{;kn`dmfQqd&6s}!K30b1at(CAYkv+w1&w zyApBV%Me9x2t1nGWgi#uH?FA{)^;*k!=BtM`!lpttNU;t=HJ=Qr-kJw{3a!gCMm%^=Zlcqq3*Z-u?k!kgDF zh;y(8h7%RkWaaKLI1B{ni9K;k^D@o69)8Wux7WVF3JTspnZTRPa&C$hyvzz7$QS%9 zueoaeIQHIkZ^E;=_c)Y~Xj;${P2&B7z&2K?_#(}DY!Izu!v?S8Y*GYlXITCbHvQ9K zVlnC`H*k@tx3y*zx}qSt(N8^cg03j9D8d51;x4Bsy2pN!8-u$I$ezayF;j9$ZU#+= zOcvnluinig0-*TlMr~dmJQnajJ zvHV)rk5d12p-eqtNl}F7SG8^Bad>0P2l2+kw7_9(ldN*j{}wfy*M1j2g(bDMz#N@h zOsd!Z7yKQuq}TI`@+Nl`zoGo*wZHkB5$hY4-;+B)s@MJsfAc5@%+bRuTCCjDN=_l9 zuW?QqxgYoEH~JGixt&&s7i|7)&4H1qpu7p{QXhYHX|vOCA7@7aRT^P-(r{`^C@Ra2 zvH|5cN^fbXQHLk+Kz1rVNAqF45ULtCqTRzvM+>N{kG>|2wxdw!toV{|yXC2n3YumQ zgU3MpC*G=!a7)IjV^nDz5R)D=CLOJv%=Ui?e`(YnX2e_dS>Ak9?i^#rUfi3R5}7A+ zN}BsL4?#GKsPvI|FPgno^Qd+Nzj}gP@9Zg0!qv&1f_ZjBJV&4X(A7)NjUNEPOJ>LJT zAn!jX=JLb&?e}GmFn632>?v>S!~ZAt6lYs>+_tPL^0GpIhkbg4J;f%md=}G(J;mnC zsjV6@sT(hsSnmvV$qhab1o$MnWKa2=y4iqQZI_u&;IMT+orHbNQ<$$B`^=uQT|Ao< z=>1ZTvTDGl>?s&$^7a&jed>l^$8>@l7uxxTUGjQBABT*ec-XHr`%7p~>H2^@<-!8Y zdMkH`?{T_lVCyG9t+#RxX&+)&Df@LvBf=%UAdRRcJm(ZNo z{wwi`GKC!QR{WG_&XMppt}*WBA=k~H{Cw!LZ+31R)9Z@KJbUf>8`s>`@Q@p??~MbY zDGzJx8V7~4#IA8VC@@Fe8ozG}wpc&$NbVU}K|?jU2Y5Pu|Kr}+As3vwJw_NAX zKL-=ll^|JNo2qQW*XcSZQ&eT?K>V2|!cV6za&~>wNyp#h;w<}^9_{=)I6r?19V=}GL-JRI(l!&y3ec;5*6mbdq<(2$b~*|PE{Xsu0Sw(?Xd-OVk*95r;>fiq7K z5`nD9_V(OpKe-{Y{l#~fm81J>@t|eTt$Ie9w#i2H(rbxTN6v9rw;OQP>+|a#^WQVN zJ?HL!NbwTf}G^ z6u0UxC^KSwW?6GYd|dM2xb3wK2Z8;DgYuO_|HgTPy2ry*Q}4PfPG-WZwz?Q^Wc#`Sx7HesOLNsb6+pND1xQZ)>FGrr+8$ zEAPIL#Nn+M1zVon?kcF)H=x=2KT)qk#OALa?2M{kin>Smfn7XsI6t(R$z@a4`eB>d zfxNv#OBLD9QlgWLzk?I*JIqu1Bp_8X4)esBCK1L1I>1%Ok&qN#1BwsHaeP*c_3~C; zrCp|FS{r&sl!-#04HokE^+Y!dX#Dq`(+m!nj~v~L>JNXBjvgrjCmVfF!xafw@ZQx@ z8?ZP~>7muRxBXmR+C+kD9GG`>A3n@U!1<83LV*&)f+=FrZdBPu&elH(sPHOidBHFF zo~vo6B=yuIasyaMxsQgAjr8I~_z21c8lk@PkkbT2dY#oJSa@e)wVN*LH28Rnb8%Ni zM)KDM_;^N|!IAJ06znfL8umc|!JfKBJRArGb%^82VrT?mQwp}#k`0pQhh1HUO)+@2 zu=o|hu&;}*j=;xdgh5p$P-Uk)%~I(5cMdH%x! z4!Y`qBhx70m~4u_^oD#?K?M%p7@*2+#8+{ZOpBMA?*b6p5R1Ixr?NO_zOeMt(E11@ z;sFCB#vaX-jKVzIe2%y3yR2bt^l@SwB_6JgZSdMMBp6cpi6T(3%BO3U1>nv^D4hpB z>Cs1pjw&DJc%jwRayl6IX`wb4`?^hpIi1l8pJgn=@zOlj_`40`#dybh-69L2`MBgesU z^d3%45ZXc!+#97MQ8bvt7 zBEMx=F^HwA;L~#-aOGTjx`MU`Osq%h2sMKDN>hWjbKHxW80x^Qa_`Vm$UhYHHDV%z ziH62f59h9e5j1{ec*tIRwdwGVAD`D=rc^hi`5l9PvRh+%kBQfq-qHem_?Wugn6}B2 ztf1^nt{EQFnqbCb!+uKPpmu%aprZ7{KQdw4I?<`zTs7>xT9RvX3#HKG_IQM?NkZ3& z%6OszI+`FZXg>f4x)R=YTtXU8v6vy-$gAAG5ZMuV_2}y&&$t7xn!s)hCToirt?iUB z8`9Z@UBmcuOi&sU*yjou^U)7r%*pC1LPy(9x{#TPRM5Vy=r#hv;a^MT=Z)9JjXZAe5TnmXp zb+W#D9lAYGxvb{dALzFWS;YzH2`{;R)1oHcvV$<(=QFzw%D|ef1aZ9*r&}Kh_A4It&oRqtsuR|xV zA-l;fHdFdE&%bRjY+*uShI4NK1gqUVJTy~<^K4?&?YNUY=^N0!vyR0 zI^=yQlyZ?}|8N2Q6mxFq4K|tagr4J%4(LN%AHqX8Xnt%EJqvhpbg-qv={~<@KWvUo zrp|tcfN`0U&*wfxBZmJ9g1U*_21S5t#DK!hZu`)Z8E!iHU^B`>xJh-Su`xyr_x;|= zYM~^;3QZi#l;yYg&d9E#eYukjO@`C%pl^8IPd~f`der_>%hdcnDvMMJ4hs9|kHUSF zF3VgS^{Z45PJwZE76*|B#Bnk|hub(AEK5hHa_9i{;=ysR_>1$j^{2>dd3mxfm|RV! zFsxQEu}me(W0qtZM>~|a{a5%J_RS4SOZX6J=$jomRy(nRXIO2{MEh3Ew_<)`Pw0tB zBzOFoyo`i8996RNnfNo?ReJ(>4P0+|!6M1tK+`bLx+7``kPaWvJrtGjU*-i0FB3X~ z%JKI+)MP=;DxyI77YB`FgR|nvZ2A%m8^`N2dJ?-;Z#=QP`Np9{FH&YR>_In1&C?)6 z4;)Q*M-qpI5(l|ACfb_lBh1`D?PQI}TX7}84^peOGe+KuX?jgpi@d{LplUmXaImGC zG(s<457zFr`0Nei5n@9p?6?j`RDM0UeG&nafw}1Sg2wTj=8bTnKvceNu~iZp-Uvo} zTbs`s^0w}UnazIxTnon*Xn%PVcZ&Zn4NFE&zs0KW3~ z`N6C!$TI{bnl1kt(WYEbSpONrf^hfT|MZs};V6F_Y{zX9pIE1dbpyhEmd16Uth!wV z>Q9T>*TcU!L7t^O7ms0`~iYhb1rN8V$REQefn$JI8UgFexbm=_|R0T z-~<>8-y8&$>X)h~`nHgf!a|kL*Y8Wdxl^EtEWJkWe4i737hk3CSLm1Tv%>G<>s4N8 zTHhyy-$fEseogpY+kL`I>$Gp_h+%$JBSL3ggvnPm%Urf8VYX)d9`UP|=y$(g+N9sm zD~Q_K!fam+v(<#zE)27c*Y8W~#_ESg$LN>Z1mdc#QoqzzpcG$7$ z)S%`bEG>TJJ#o{>5wp-5!pqs+@1@JAOr!QYSL@-eh11hvyitzUd~LI!R-XUT3PEGI zVHHVV0udmo*n%(3AgV6-hA1}>t22UYCZUqR49!7-KNzoL(&*sr6X9nU>s#eFnH~1$ zsrD83n1h9*p_zrn#Dhjh$N6c%EYW9>HL;5s10}56s9$_e7IMY|CH9OlW7(6~7tkh2 zK2wAVdREC~H;>VsS!LEw32k9tFM&Y-!LmcigZRv0KQ`kGyciqGSQ-vBYJ5~pc{?B# z<1e}uwGq~5N4403!j4%TOsY*E%wzu~DmX*>e!05pwf(JFS&lkDmAv-bcmX}sOPA7k zFmpxJ?~ONRQ~ydAP^_f(xkB(hI%q1R$!&zP8ADg1*}2P^4aN~%QAQ|sZNot}U%pvT z;m&-+lhyEqAv)!?y&={%-}=8A97d=-K%w+7OOqoTcJ}3`D|fdnwLPqo~F264Y(1^rzsM+b)~?9 z^b;s84z8Po?Y{1D;rX@W92hzXC4keCN!$%n^F5VmO5VAMj#KnfB7Q+szXonX|f1?-P} z1}i=^1gDf_f9;jg=Ev-+7j>8VD&!wlPU5M_HTHOGm(>ynHL+V~+E*=5nbP%SFRX8>7vGBrd=m(*W>aJ*sGmb$)h)jSGqCk(0^Qb_ zcp8m66`V~{$Zoj%2Av@kgfk$s50k=HmtGm4vH@Kl8N(W!^t2zOpS6?rDUj}I?vn((avZ*yo*I2fCW1V6cw z3&C87)sW;0HWKQwve|qPq>@9i^Vu!M+7?0bLg7a3i{$vBZ_LtBz2w2jj`%CI@n-yG z{=(69*^F|Z9)?{_9cpfyG|ao28*k-I?RL;Ho(3qGSL!}gd2vqi;Xtc{(npwJ|L8pb zxiGF8$E6#`${5HLc61B3Pu!p^scow@O!>(jAignYK2m!kP{eJ1bnCp^m@cewypEj} zKPKjni0CWM8(sjrpTiCSR%`yT>Y%i2tY-G1oh(2=gT%i>wEMB9U(_QO>GKoa;R3qy zC(b`&9P{6>jaA_^Aic}ae*z|ayaF)j&?L+7pDw|FeFfYM$`2y;6l3YM$*Sy{hYy

M97>0Fc4LDk6-uApf;Egd7oPVUtRk7PVE6d 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ΝW0GALrjaX~>=_$6TNIEjRuvZJ0C$FNaf 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ξ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