JWS-112 Bumping version of T-Coffee to version 11.00.8cbe486.
[jabaws.git] / binaries / src / tcoffee / t_coffee_source / perl_header_lib.h
1 /******************************COPYRIGHT NOTICE*******************************/
2 /*  (c) Centro de Regulacio Genomica                                                        */
3 /*  and                                                                                     */
4 /*  Cedric Notredame                                                                        */
5 /*  12 Aug 2014 - 22:07.                                                                    */
6 /*All rights reserved.                                                                      */
7 /*This file is part of T-COFFEE.                                                            */
8 /*                                                                                          */
9 /*    T-COFFEE is free software; you can redistribute it and/or modify                      */
10 /*    it under the terms of the GNU General Public License as published by                  */
11 /*    the Free Software Foundation; either version 2 of the License, or                     */
12 /*    (at your option) any later version.                                                   */
13 /*                                                                                          */
14 /*    T-COFFEE is distributed in the hope that it will be useful,                           */
15 /*    but WITHOUT ANY WARRANTY; without even the implied warranty of                        */
16 /*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                         */
17 /*    GNU General Public License for more details.                                          */
18 /*                                                                                          */
19 /*    You should have received a copy of the GNU General Public License                     */
20 /*    along with Foobar; if not, write to the Free Software                                 */
21 /*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA             */
22 /*...............................................                                           */
23 /*  If you need some more information                                                       */
24 /*  cedric.notredame@europe.com                                                             */
25 /*...............................................                                           */
26 /******************************COPYRIGHT NOTICE*******************************/
27 char *PerlScriptName[]={"rec_sum.pl","count.pl","p\
28 rocess_list.pl","make_license.pl","CCsed.script","\
29 msa2bootstrap.pl","t_coffee_dpa","t_coffee_dpa2","\
30 tc_generic_method.pl","rnapdb2protpdb.pl","generic\
31 _method.tc_method","clustalw_method.tc_method","ex\
32 tract_from_pdb","install.pl","clean_cache.pl","nat\
33 ure_protocol.pl","mocca","dalilite.pl","wublast.pl\
34 ","blastpgp.pl","ncbiblast_lwp.pl","wublast_lwp.pl\
35 ","RNAplfold2tclib.pl","fasta_seq2RNAplfold_templa\
36 tefile.pl","fasta_seq2hmmtop_fasta.pl","fasta_seq2\
37 consan_aln.pl","clustalw_aln2fasta_aln.pl","msf_al\
38 n2fasta_aln.pl","blast_aln2fasta_aln.pl","blast_xm\
39 l2fasta_aln.pl","fasta_aln2fasta_aln_unique_name.p\
40 l","newick2name_list.pl","excel2fasta.pl","any_fil\
41 e2unix_file.pl","EndList"};char *PerlScriptFile[]=\
42 {"use File::Copy;\nuse Env qw(HOST);\nuse Env qw(H\
43 OME);\nuse Env qw(USER);\n$x_field=0;\n$y_field=1;\
44 \n$y_field_set=1;\n$nyf=1;\n\n$interval=0;\n$file=\
45 \"stdin\";\n\n$print_avg=1;\n$print_sd=0;\n$print_\
46 sum=0;\n$print_n=0;\nforeach $value ( @ARGV)\n    \
47 {\n     if ($value ne $ARGV[$np]) \n        {\n     ;\n  \
48    }\n  elsif($value eq \"-print_all\")\n           {\n  \
49    $print_sd=$print_avg=$print_n=$print_sum=1;\n         \
50    $np++;\n         }\n elsif($value eq \"-print_sum\"\
51 )\n         {\n     $print_sum=1;\n         $print_avg=0;\\
52 n           $np++;\n        }\n elsif($value eq \"-print_n\\
53 ")\n        {\n     $print_n=1;\n           $print_avg=0;\n\
54             $np++;\n        }\n elsif($value eq \"-print_avg\
55 \")\n       {\n     $print_avg=1;\n         $print_avg=0\
56 ;\n         $np++;\n        }\n elsif($value eq \"-sd\")\\
57 n           {\n     $print_sd=1;\n          $print_avg=0;\n      \
58    $np++;\n         }\n elsif($value eq \"-h\")\n           \
59 {\n         $header=1;\n            $np++;\n        }\n elsif ($\
60 value eq \"-i\")\n          {\n     $interval= $ARGV[++\
61 $np];\n     $np++;\n                }\n elsif ($value eq \
62 \"-r\")\n           {\n     $min= $ARGV[++$np];\n           $m\
63 ax= $ARGV[++$np];\n         $np++;\n                }\n \n      el\
64 sif ($value eq \"-x\")\n            {\n     $x_field= $AR\
65 GV[++$np]-1;\n      $np++;\n                }\n elsif ($va\
66 lue eq \"-y\")\n            {\n     $nyf=0;  \n     while\
67  ($ARGV[$np+1] && !($ARGV[$np+1]=~/\\-/))\n           \
68 {\n             $y_field[$nyf++]=$ARGV[++$np]-1;\n              $y_field_\
69 set=1;\n              }\n\n         $np++;\n                }\n elsi\
70 f ($value eq \"-file\")\n           {\n     $file= $ARGV\
71 [++$np];\n          $file_set=1;\n          $np++;\n               \
72  }       \n     elsif ( $value eq \"h\" ||  $value eq \
73 \"-h\" || $value eq \"-H\" || $value eq \"-help\" \
74 || $value eq \"help\")\n          {\n       print STDOUT \"\
75 data_analyse: Analyse and discretization of data\\\
76 n\";\n      print STDOUT \"       -file:    <file c\
77 ontaining the data to analyze>,.<def=STDIN>\\n\";\\
78 n           print STDOUT \"       -x: <field containing \
79 the X>,...............<Def=0>\\n\";\n       print ST\
80 DOUT \"       -y: <field containing the Y>,.......\
81 ........<Def=1>\\n\";\n     print STDOUT \"       \
82 -i:<Interval size on the X>,...............<Def=0>\
83 \\n\";\n            print STDOUT \"       -i:<0:only one \
84 interval>\\n\";\n           print STDOUT \"       -r:<Ra\
85 nge of the X>\\n\";\n       print STDOUT \"       -s\
86 d: print standard deviation on the Y\";\n           prin\
87 t STDOUT \"       -h  : print column header \\n\";\
88 \n          exit (0);\n   }\n   elsif ($value=~/-/)\n     {\
89 \n          print \"$value is not a valid FLAG[FATAL]\\\
90 n\";\n      exit (0);\n    } \n elsif ($list eq \"\\
91 ") \n       {\n     $file=$ARGV[$np];\n     $np++;\n\
92             }\n \n      \n      }\n\n\n\n\n\nif ($file eq \"st\
93 din\")\n        {\n     $remove_file=1;\n       $file=\"tmp$$\";\n      \
94 open (F, \">$file\");\n while (<STDIN>)\n               {\n             pr\
95 int F $_;\n             }\n     close (F);\n     \n     ;}\n\n\n\n\nif (\
96 $interval && $max)\n  {\n    $interval_size=($max-\
97 $min)/$interval;\n  }\nelsif ($interval)\n  {\n   \
98  open(F,$file);  \n    my $set_max=0;\n    my $set\
99 _min=0;\n    while (<F>)\n      {\n     my $v=$_;\n     ch\
100 omp($v);\n      print \"--$v--\";\n     \n      if ($v<$min ||!$\
101 set_min){$set_min=1;$min=$v;}\n if ($v>$max ||!$se\
102 t_max){$set_max=1;$max=$v;}\n      }\n    close (F\
103 );\n    print \"$min $max uuuu\";\n    $interval_s\
104 ize=($max-$min)/$interval;\n  }\nopen(F,$file);  \\
105 nwhile (<F>)\n  {\n    $line=$_;\n    if (!/\\S/){\
106 next;}\n    @list=($line=~/(\\S+)/g);\n    \n    i\
107 f ($interval==0){$bin=0;}\n    else{$bin=int (($li\
108 st[$x_field]-$min)/($interval_size));}\n\n    \n  \
109   if ($bin && $bin==$interval){$bin--;}\n    for (\
110  $a=0; $a<$nyf; $a++)\n      {\n        $sum{$a}{$bin}+=$\
111 list[$y_field[$a]];\n   $sum2{$a}{$bin}+=$list[$y_fi\
112 eld[$a]]*$list[$y_field[$a]];\n $n{$a}{$bin}++;\n \
113      }\n  }\n\nif (!$interval){$interval=1;}\nfor \
114 ( $a=0; $a<$interval; $a++)\n  {\n    printf ( \"%\
115 4d %4d \", $interval_size*$a, $interval_size*($a+1\
116 ));\n    for ( $b=0; $b<$nyf; $b++)     \n      {\n     $i\
117 =$interval*$a;\n        if ( $n{$b}{$a}==0)\n     {\n       $\
118 avg=0;\n            $sd=0;\n      }\n   else\n    {\n       $avg=\
119 $sum{$b}{$a}/$n{$b}{$a};\n          $sd=sqrt($sum2{$b}{\
120 $a}*$n{$b}{$a}-$sum{$b}{$a}*$sum{$b}{$a})/($n{$b}{\
121 $a}*$n{$b}{$a});\n        }\n   if ($print_n) {printf \"%\
122 15.4f \", $n{$b}{$a};}\n        if ($print_sum){printf \"\
123 %15.4f \", $sum{$b}{$a};}\n     if ($print_avg){printf\
124  \"%15.4f \", $avg}\n   if ($print_sd) {printf \"%15\
125 .4f \", $sd;}\n      }\n    printf (\"\\n\");\n  }\
126 \n\n\nif ( $remove_file){unlink $file;}\n","use Fi\
127 le::Copy;\nuse Env qw(HOST);\nuse Env qw(HOME);\nu\
128 se Env qw(USER);\n\nforeach $v (@ARGV){$cl.=$v;}\n\
129 \n\nif ( $cl=~/-k(\\d+)/){$k=$1;}\nelse {$k=1;}\ni\
130 f ( $cl=~/-w(\\d+)/){$w=$1;}\nelse {$w=-1;}\nif ( \
131 $cl=~/-p(\\d+)/){$p=$1;}\nelse {$p=-1;}\n\nwhile (\
132 <STDIN>)\n  {\n    @l=($_=~/(\\S+)/g);\n    $v=$l[\
133 $k-1];\n    if ( !$h{$v}){@ll=($v, @ll);}\n    \n \
134    if ( $w==-1)\n      {$h{$v}++;}\n    else\n    \
135   {$h{$v}+=$l[$w-1];}\n\n    if ($p!=-1){$print{$v\
136 }=$l[$p-1];}\n\n  }\nforeach $v (@ll)\n  {\n    pr\
137 int \"$v $print{$v} $h{$v}\\n\";\n  }\n","\nuse En\
138 v qw(HOST);\nuse Env qw(HOME);\nuse Env qw(USER);\\
139 n$random_tag=int (rand 10000)+1;\n$unique_prefix=\\
140 "$$.$HOST.$random_tag\";\n$queue=\"distillery.and.\
141 mid\";\n$monitor=0;\n$stderr_file=\"/dev/null\";\n\
142 $stdio_file=\"/dev/null\";\n$log_file=\"/dev/null\\
143 ";\n$pause_time=0;\n$max_sub_jobs=60;\n$min_sub_jo\
144 bs=30;\n$output_all=0;\n$var='\\$';\n\nforeach $va\
145 lue ( @ARGV)\n    {\n   if ($value ne $ARGV[$np]) \n\
146             {\n     ;\n     }\n elsif ($value eq \"-max_s\
147 ub_jobs\")\n        {\n     $max_sub_jobs= $ARGV[++$n\
148 p];\n       $np++;\n                }   \n      elsif ($value eq \\
149 "-min_sub_jobs\" )\n        {\n     $min_sub_jobs= $A\
150 RGV[++$np];\n       $np++;\n                }\n elsif ($val\
151 ue eq \"-para\")\n          {\n     $para=1;\n      $mon\
152 itor=1;\n           $np++;\n                }\n elsif ($value e\
153 q \"-monitor\") \n          {\n     $monitor=1;\n           $\
154 np++;\n     }\n elsif ($value eq \"-no_monitor\") \
155 \n          {\n     $monitor=0;\n           $np++;\n        }\n \
156 elsif ($value eq \"-queue\")\n      {\n     $queue=\
157 $ARGV[++$np];\n     $np++;\n        }   \n      elsif ($valu\
158 e eq \"-stderr_file\")\n            {\n     $stderr_file=\
159 $ARGV[++$np];\n     $np++;\n        }\n elsif ($value\
160  eq \"-stdio_file\")\n      {\n     $stdio_file=$AR\
161 GV[++$np];\n        $np++;\n        }\n elsif ($value eq\
162  \"-output_all\")\n         {\n     $output_all=1;\n     \
163    $np++;\n         }\n elsif ($value eq \"-pause\") \\
164 n           {\n     $pause_time=$ARGV[++$np];\n     $np+\
165 +;\n        }\n elsif ($value eq \"-log\")\n          {\\
166 n              $log=1;\n               \n              if ($ARGV[$np+\
167 1]=~/\\-\\S+/) \n                 {\n             $log_file=\"std\
168 err\";\n                  }\n          else \n            {\\
169 n                 $log_file=$ARGV[++$np]; \n              ++$np;\n               \n      \
170          }\n          }\n       elsif ( $value eq \"-com\")\
171 \n          {\n         \n              if (!$ARGV[$np+1]=~/^\\'/) { $com=\
172 $ARGV[++$np];}\n                else {$com=$ARGV[++$np];}\n\n     \
173    $np++;\n         }\n elsif ( $value eq \"-check\")\\
174 n         {\n       \n      if (!$ARGV[$np+1]=~/^\\'/) { $c\
175 heck=$ARGV[++$np];}\n       else {$check=$ARGV[++$np\
176 ];}\n       $np++;\n      }\n   elsif ($com eq \"\") \n  \
177    {\n      $com_set=1;\n           $com=$ARGV[$np];\n    \
178   \n        $np++;\n        }\n elsif ($list eq \"\") \n\
179             {\n     $list_set=1;\n          $list=$ARGV[$np];\\
180 n           $np++;\n        }\n elsif ( $var_set eq \"\")\n\
181             {\n     $var_set=1;\n           $var=$ARGV[$np];\n  \
182     $np++;\n        }\n }\n\n\n\n\nif ( $com eq \"\")\
183 {print \"You Need to Provide a Command [FATAL]\\n\\
184 ";\n          die;\n         }\n\n\n\nif ($list_set==0) \
185 \n    {\n    $x= int (rand 100000)+1;\n    $tmp_fi\
186 le_name=\"tmp_file_$x\";\n    open ( TMP, \">$tmp_\
187 file_name\");\n    while (<STDIN>)\n      {\n   prin\
188 t TMP $_;\n      }\n    close (TMP);\n    open (F,\
189  $tmp_file_name);\n    }\nelse \n    {\n    open (\
190 F, $list);\n    }\n\nif ($para==0) \n    {\n\n    \
191  @tc_list= <F>;\n     close (F); \n     \n     for\
192 each $val(@tc_list) \n      {\n       \n              \n         \
193      \n       $loc_com=$com;\n        if ($check){$\
194 loc_check=$check;}\n          \n              @i_val=($val=~\
195 /([^\\s]+)/g);\n              \n              if ( $#i_val==0)\n\
196                 {\n               if ($check){$loc_check=~s/$var/$i_val[0]/\
197 g;}\n             $loc_com=~s/$var/$i_val[0]/g;\n               }\n         \
198   else\n                {\n               for ($n=1; $n<=$#i_val+1;$n++ )\n\
199                     {\n               \n                      $sub=\"$var$n\";\n                   \
200    \n                 $loc_com=~s/$sub/$i_val[$n-1]/g;\n                 \
201      if ($check){$loc_check=~s/$var/$i_val[0]/g;}\\
202 n                   }\n         }\n           if ( $check && -e $loc_check\
203 )\n             {\n               print STDERR \"skipping $loc_com...\\n\
204 \";\n             }\n         else\n            {\n               system \"$loc_co\
205 m\";\n          }\n         }\n    exit;\n    }\n\nelsif ($par\
206 a==1) \n    {\n    print STDERR \"do parallel exec\
207 ution of: \\\"$com $list\\\"\\n\";\n    \n    if (\
208 $log==1) \n     {\n     if ($log_file eq \"stdout\" || $lo\
209 g_file eq \"stderr\" ) \n               {\n             $log_file=\"\";\n       \
210         }\n\n        else \n            {\n             system \"echo L\
211 OG FILE> $log_file\";\n         \n              }\n     }\n    els\
212 e       \n      {\n     open ( OUT, \">/dev/null\");\n  }\n     \n    \
213 \n    $id=0;\n    $n_sub=0;\n    while ($val=<F>) \
214 \n          {               \n      $job_log[$id]=\"$HOME/tmp\
215 /$unique_prefix.$id.log_file\";\n           \n      $job=\
216 $unique_prefix.\"_$id\";\n          open (JOB, \">$job\\
217 ");\n       \n      $loc_com=$com;\n        chop $val;\n\
218 \n          $loc_com=~s/\\$/$val/g;\n    \n         print JOB\
219  \"#!/bin/csh\\n\";\n       print JOB \"#\\$ -cwd\\n\
220 \";\n       print JOB \"#\\$ -N $unique_prefix\\n\";\
221 \n          if ($queue && !($queue eq \" \")) {print JO\
222 B \"#\\$ -l $queue\\n\";}\n         print JOB \"#\\n\"\
223 ;           \n            print JOB \"$loc_com\\n\";\n   \
224    print JOB \"echo FINISHED  >> $job_log[$id]\\n\\
225 ";\n        print JOB \"pwd\\n\";\n         \n      close \
226 (JOB);\n            if ( $output_all==1)\n              {\n             system \\
227 "qsub $job >  $unique_prefix\";         \n              }\n       \
228   else\n                {system \"qsub $job -e $stderr_file -o $\
229 stdio_file >$unique_prefix\";           \n              }\
230  \n\n\n\n           print STDERR \"$id: $output_all\\n\"\
231 ;\n         $n_sub++;\n     if ( $max_sub_jobs && $n_s\
232 ub==$max_sub_jobs) \n           {\n             $n_sub=monitor_process\
233 ($min_sub_jobs,@job_log);                \n             \n              }       \n       \
234   \n            unlink $unique_prefix;\n            sleep\
235  $pause_time;\n     $id++;\n        }\n\n    close (O\
236 UT);\n    close (F);\n\n    print STDERR \"Your $i\
237 d Jobs Have Been Submited (NAME=$unique_prefix)\\n\
238 \";\n    monitor_process (0, @job_log);\n    forea\
239 ch $file(@job_log) {if (-e $file) {unlink($file);}\
240 }\n    \n    }\n\nsub monitor_process ( @job_list)\
241 \n    {\n    my (@job_list)=@_;\n    my $min_sub_j\
242 obs=shift (@job_list);\n    my $n_sub_jobs;\n    m\
243 y $finished;\n    my $n=0;\n\n    $n_sub_jobs=-1;\\
244 n    $finished=0;\n    print STDERR \"\\nMonitor B\
245 atch: [$min_sub_jobs]\";\n       \n    while (!$fi\
246 nished && (($n_sub_jobs>$min_sub_jobs)|| $n_sub_jo\
247 bs==-1) ) \n    {\n     $finished=1;\n  $n_sub_jobs=0;\n        $\
248 n=0;\n  foreach $file (@job_list)\n             {\n     \n      \
249         if (-e $file){;}\n              else \n             {\n             $finish\
250 ed=0; $n_sub_jobs++;\n              }\n         }\n\
251         system \"sleep 1\";\n        }\n    \n    return \
252 $n_sub_jobs;\n    }\n    \n    \nif ($tmp_file_nam\
253 e){unlink($tmp_file_name);}\n","\n\nforeach ($np=0\
254 ; $np<=$#ARGV; $np++)\n    {\n    $value=$ARGV[$np\
255 ];\n\n    if ($value eq \"-file\")\n      {\n     \
256  $file= $ARGV[++$np];\n      }\n    elsif ($value \
257 eq \"-type\")\n      {\n        $type= $ARGV[++$np\
258 ];\n      }\n    elsif ($value eq \"-institute\")\\
259 n      {\n        $institute= $ARGV[++$np];\n     \
260  }\n    elsif ($value eq \"-author\")\n      {\n  \
261       $author= $ARGV[++$np];\n      }\n    elsif (\
262 $value eq \"-date\")\n      {\n        $date= $ARG\
263 V[++$np];\n      }\n     elsif ($value eq \"-progr\
264 am\")\n      {\n        $program= $ARGV[++$np];\n \
265      }\n    elsif ($value eq \"-email\")\n      {\\
266 n        $email= $ARGV[++$np];\n      }\n    else\\
267 n      {\n      print \"$value is an unkown argument[FA\
268 TAL]\\n\";\n    exit (1);\n      }\n  }\n\n\n\nopen F\
269 , $file || die;\nprint $INSTITUTE;\nif ( $type eq \
270 \"c\"){print \"/******************************COPY\
271 RIGHT NOTICE*******************************/\\n\";\
272 }\nif ( $type eq \"perl\"){print \"###############\
273 ###############COPYRIGHT NOTICE###################\
274 ###########/\\n\";}\nif ( $type eq \"txt\"){print \
275 \"-------------------------------COPYRIGHT NOTICE-\
276 -----------------------------/\\n\";}\n\n\nwhile (\
277 <F>)\n  {\n  s/\\$INSTITUTE/$institute/g;\n  s/\\$\
278 AUTHOR/$author/g;\n  s/\\$DATE/$date/g;\n  s/\\$PR\
279 OGRAM/$program/g;  \n  s/\\$EMAIL/$email/g;  \n  i\
280 f ( $type eq \"txt\"){print $_;}\n  elsif ($type e\
281 q \"c\"){chop $_; print \"\\/*$_*\\/\\n\";}\n  els\
282 if ($type eq \"perl\"){print \"\\#$_\";}\n}\nclose\
283  (F);\nif ( $type eq \"c\"){print \"/*************\
284 *****************COPYRIGHT NOTICE*****************\
285 **************/\\n\";}\nif ( $type eq \"perl\"){pr\
286 int \"##############################COPYRIGHT NOTI\
287 CE##############################/\\n\";}\nif ( $ty\
288 pe eq \"txt\"){print \"---------------------------\
289 ----COPYRIGHT NOTICE------------------------------\
290 /\\n\";}\n\n","\nwhile (<>)     \n      {\n     s/\\=cc/1234567\
291 89/g;\n s/\\bcc/\\$\\(CC\\)/g;\n        s/123456789/\\=cc\
292 /g;\n   print $_;\n     }\n\n","$version=\"1.00\";\n$rse\
293 ed= int(rand(100000))+1;\n\n\nif ( $#ARGV==-1)\n  \
294 {\n    print \"msa2bootstrap -i <input_file> -inpu\
295 t <seq|msa|matrix|tree> -n <N-Boostrap> -o <outtre\
296 e> -tmode <nj|upgma|parsimony|ml> -dmode <kimura> \
297 -alignpg <t_coffee | muscle | clustalw> -rtree <fi\
298 le> -stype <prot|cdna|dna> -recompute -system <cyg\
299 win|unix>\";\n    print \"\\n\\t-i: input file, ca\
300 n be sequneces, msa, matrix, trees, type is specif\
301 ied via -input\";\n    print \"\\n\\t-input: Type \
302 of input data\";\n    print \"\\n\\t\\tmsa: msa in\
303  fasta format\";\n    print \"\\n\\t\\tseq: comput\
304 e an msa with -alignpg\";\n    print \"\\n\\t\\tma\
305 trix: phylipp distance matrix fed directly to meth\
306 od -tmode [caveat: tmode=nj or upgma]\";\n    prin\
307 t \"\\n\\t\\ttree: list of newick trees directly f\
308 ed to consence in order to generate a bootstraped \
309 tree\";\n    \n    print \"\\n\\t-n: number of boo\
310 tstrap replicates\";\n    print \"\\n\\t-o: name o\
311 f the output tree. Files are not overwritten. Use \
312 -recompute to overwrite existing file\";\n    prin\
313 t \"\\n\\t-tmode: tree mode: nj|upgma|parsimony|ml\
314 \";\n    print \"\\n\\t-dmode: distance mode\";\n \
315    print \"\\n\\t-alignpg: program for aligning se\
316 quences (t_coffee=default)\";\n    print \"\\n\\t-\
317 rtree: replicate tree file (default: no file)\";\n\
318     print \"\\n\\t-rmsa: replicate msa file (defau\
319 lt: no file)\";\n    print \"\\n\\t-rmat: replicat\
320 e matrix file (default: no file)\";\n    print \"\\
321 \n\\t-stype: sequence type: protein, dna or cdna\"\
322 ;\n    print \"\\n\\t-recompute: force files to be\
323  overwritten\";\n    print \"\\n\\t-system: cygwin\
324 |unix\";\n      \n\n    \n    &my_exit (EXIT_FAILU\
325 RE);\n  }\nforeach $arg (@ARGV){$command.=\"$arg \\
326 ";}\n\nprint \"CLINE: $command\\n\";\n$threshold=1\
327 00;\n$trim_msa=0;\n$stype=\"prot\";\nprint \"msa2b\
328 ootstrap \";\n\n$system=\"cygwin\";\nif(($command=\
329 ~/\\-system (\\S+)/))\n  {\n    $system=$1;\n    i\
330 f ( $system eq \"cygwin\")\n      {\n   $exec_extens\
331 ion=\".exe\";\n      }\n    elsif ( $system eq \"u\
332 nix\")\n      {\n       $exec_extension=\"\";\n print \"\
333 system=Unix\";die;\n      }\n    else\n      {\n        p\
334 rint \"msa2boostrap: -system=$system is an unknown\
335  mode [FATAL]\\n\"; die;\n      }\n    \n    print\
336  \"-system $system \";\n  }\nif(($command=~/\\-sty\
337 pe (\\S+)/))\n  {\n    $stype=$1;\n  }\nprint \"-s\
338 type=$stype \";\n\n\n\nif(($command=~/\\-i (\\S+)/\
339 ))\n  {\n    $msa=$1;\n    print \"-i $msa \";\n  \
340 }\n\nif(($command=~/\\-rtree (\\S+)/))\n  {\n    $\
341 rtree=$1;\n    print \"-rtree=$rtree \";\n  }\n\ni\
342 f(($command=~/\\-rmsa (\\S+)/))\n  {\n    $rmsa=$1\
343 ;\n  }\nif(($command=~/\\-rmat (\\S+)/))\n  {\n   \
344  $rmat=$1;\n  }\n$input=\"seq\";\nif(($command=~/\\
345 \-input (\\S+)/))\n  {\n    $input=$1;\n  }\nprint\
346  \"-input=$input \";\n\n$dmode=\"kimura\";\nif(($c\
347 ommand=~/\\-dmode (\\S+)/))\n  {\n    $dmode=$1;\n\
348   }\nprint \"-dmode=$dmode \";\n$alignpg=\"muscle\\
349 ";\nif(($command=~/\\-alignpg (\\S+)/))\n  {\n    \
350 $alignpg=$1;\n  }\nprint \"-alignpg=$dmode \";\n\n\
351 $tmode=\"nj\";\nif(($command=~/\\-tmode (\\S+)/))\\
352 n  {\n    $tmode=$1;\n  }\nprint \"-tmode=$tmode \\
353 ";\n$recompute=0;\nif(($command=~/\\-recompute/))\\
354 n  {\n    $recompute=1;\n    print \"-recompute \"\
355 ;\n  }\n\n$out=$msa;\n$out=~s/\\..*//;\n$out.=\".b\
356 ph\";\nif(($command=~/\\-o (\\S+)/))\n  {\n    $ou\
357 t=$1;\n    \n  }\nprint \"-out=$out \";\nif (-e $o\
358 ut && !$recompute)\n  {\n    print \"\\nNo Computa\
359 tion Required $out already exists\\n\";\n    &my_e\
360 xit (EXIT_SUCCESS);\n    \n  }\n\n$n=100;\nif(($co\
361 mmand=~/\\-n (\\d+)/))\n  {\n    $n=$1;\n  }\nprin\
362 t \"-n=$n \";\n$seed=3;\nif(($command=~/\\-s (\\d+\
363 )/))\n  {\n    $seed=$1;\n  }\nprint \"-s=$seed \"\
364 ;\n\nif(($command=~/\\-run_name (\\d+)/))\n  {\n  \
365   $suffix=$1;\n  }\nelse\n  {\n    $msa=~/([^.]+)/\
366 ;\n    $suffix=$1;\n  }\nprint \"-run_name=$suffix\
367 \\n\";\n\n\nif ( $input eq \"seq\")\n  {\n    $seq\
368 =$msa;\n    $msa=\"$suffix.prot_msa\";\n    \n    \
369 if ($stype eq \"cdna\")\n      {\n      $cdna_seq=$seq;\
370 \n      $clean_cdna_seq=&vtmpnam();\n   $seq=&vtmpnam();\\
371 n       `t_coffee -other_pg seq_reformat -in $cdna_seq -\
372 action +clean_cdna >$clean_cdna_seq`;\n `t_coffee \
373 -other_pg seq_reformat -in $clean_cdna_seq -action\
374  +translate >$seq`;\n   \n      }\n\n    if (!-e $ms\
375 a || $recompute)\n      {\n     print \"\\n#####   Com\
376 pute an MSA With $alignpg\\n\";\n       \n      if ( $alignpg\
377  eq \"t_coffee\")\n       {`$alignpg $seq -outfile=$ms\
378 a >/dev/null 2>/dev/null`;}\n   elsif ( $alignpg eq \
379 \"muscle\")\n     {\n       `$alignpg -in $seq > $msa \
380 2>/dev/null`;\n   }\n   elsif ( $alignpg eq \"clusta\
381 lw\")\n   {\n       `$alignpg -infile=$seq -outfile=\
382 $msa -quicktree >/dev/null 2>/dev/null`;\n        }\n   e\
383 lsif ( $align eq \"mafft\")\n     {\n       `$alignpg \
384 $seq > $msa >/dev/null 2>/dev/null`;\n    }\n   else\\
385 n         {\n       `$alignpg -in=$seq -outfile=$msa`;\n         \
386  }\n      }\n    if (!-e $msa)\n      {\n       print \"\
387 \\nError: $alignpg Could Not produce the MSA $msa \
388 [FATAL]\\n\";\n      }\n\n    if ($stype eq \"cdna\
389 \")\n      {\n  $msa2=\"$suffix.cdna_msa\";\n   `t_co\
390 ffee -other_pg seq_reformat -in $clean_cdna_seq -i\
391 n2 $msa -action +thread_dna_on_prot_aln -output fa\
392 sta_aln  >$msa2`;\n     $msa=$msa2;\n      }\n    \n  \
393   $input=\"msa\";\n  }\n\n\n\n$seqboot_o=&vtmpnam(\
394 );\n$seqboot_c=&vtmpnam();\n\n$protdist_o=&vtmpnam\
395 ();\n$protdist_c=&vtmpnam();\nif ( $input eq \"msa\
396 \")\n  {\n    if ($tmode eq \"nj\" || $tmode eq \"\
397 upgma\"){$input=\"matrix\";}\n    \n    $lmsa= &vt\
398 mpnam ();\n    `t_coffee -other_pg seq_reformat -i\
399 n $msa -output phylip_aln > $lmsa`;\n    \n    if \
400 ( -e \"outfile\"){unlink (\"outfile\");}\n    # ru\
401 n seqboot\n  \n    if ( $n>1)\n      {\n        print \"R\
402 un SeqBoot .....\";\n   open (F, \">$seqboot_c\");\n\
403         print F \"$lmsa\\nR\\n$n\\nY\\n$seed\\n\";\n    clos\
404 e (F);\n        `seqboot$exec_extension  < $seqboot_c`;\n\
405         if ( -e \"outfile\"){ print \"[OK]\\n\";}\n     else \
406 { print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\\
407 n       `mv outfile $seqboot_o`;\n      }\n    else\n   \
408    {\n  `cp $lmsa $seqboot_o`;\n      }\n\n    if (\
409 $rmsa){`cp $seqboot_o $rmsa`;}\n    \n    if ($tmo\
410 de eq \"nj\" || $tmode eq \"upgma\")\n      {\n if\
411  ( $stype eq \"prot\")\n          {\n       # run protdist\\
412 n           print \"Run Protdist [dmode=$dmode]\";\n       \
413  if ($dmode eq \"kimura\")\n          {\n               $dmode=\"P\
414 \\nP\\nP\";\n         }\n           else\n            {\n               prin\
415 t \"\\n$dmode is an unknown mode for Protdist [FAT\
416 AL:msa2bootstrap.pl]\\n\";\n            &my_exit (EXIT_FAILU\
417 RE);\n        }\n           open (F, \">$protdist_c\");\n\
418             if ($n>1){print F \"$seqboot_o\\n$dmode\\nM\\\
419 nD\\n$n\\nY\\n\";}\n        else {printf F \"$seqboot\
420 _o\\n$dmode\\nY\\n\";}\n            close (F);\n            `pro\
421 tdist$exec_extension  < $protdist_c`;\n     if ( -\
422 e \"outfile\"){ print \"[OK]\\n\";}\n       else { p\
423 rint \"[FAILED]\\n\";&my_exit (EXIT_FAILURE);}\n         \
424    `mv outfile $protdist_o`;\n   \n       }\n   elsif ( $\
425 stype eq \"cdna\" || $stype eq \"dna\")\n         {\n     \
426   print \"Run dnadist [dmode=default\";\n           open\
427  (F, \">$protdist_c\");\n           if ($n>1){print F \"\
428 $seqboot_o\\nM\\nD\\n$n\\nY\\n\";}\n        else {pri\
429 ntf F \"$seqboot_o\\nY\\n\";}\n     close (F);\n         \
430    `protdist$exec_extension  < $protdist_c`;\n     \
431  if ( -e \"outfile\"){ print \"[OK]\\n\";}\n        e\
432 lse { print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE\
433 );}\n       `mv outfile $protdist_o`;\n   }\n      }\
434 \n  }\nelsif ( $input eq \"matrix\")\n  {\n    $pr\
435 otdist_o=&vtmpnam();\n    print \"MSA: $msa\\n\";\\
436 n    `cp $msa $protdist_o`;\n    $n=1;\n  }\n\n\n\\
437 n\n\n$nb_o=&vtmpnam();\n$nb_c=&vtmpnam();\nif ($in\
438 put eq \"matrix\" && $tmode ne \"parsimony\" && $t\
439 mode ne \"ml\")\n  {\n    print \"Run neighbor [tm\
440 ode=$tmode]\";\n\n    if ($tmode eq \"nj\")\n     \
441  {\n    $tmode=\"\\nN\\nN\";\n      }\n    elsif ( $t\
442 mode eq \"upgma\")\n      {\n   $tmode = \"\\nN\";\n\
443       }\n    else\n      {\n    print \"\\n ERROR: $t\
444 mode is an unknown tree computation mode\\n\";\n        &\
445 my_exit (EXIT_FAILURE);\n      }\n\n    open (F, \\
446 ">$nb_c\");\n    if ($n>1){print F \"$protdist_o$t\
447 mode\\nM\\n$n\\n$seed\\nY\\n\";}\n    else {print \
448 F \"$protdist_o$tmode\\nY\\n\";}\n    close (F);\n\
449 \n    `neighbor$exec_extension  < $nb_c`;\n    if \
450 ( -e \"outtree\"){ print \"[Neighbor OK]\\n\";}\n \
451    else { print \"[FAILED]\\n\";&my_exit (EXIT_FAI\
452 LURE);}\n    `mv outtree $nb_o`;\n    unlink (\"ou\
453 tfile\");\n  }\nelsif ($input eq \"msa\" && $tmode\
454  eq \"parsimony\")\n  {\n    if ( -e \"outfile\"){\
455 unlink (\"outfile\");}\n    if ( -e \"outtree\"){u\
456 nlink (\"outtree\");}\n    \n    if ($stype eq \"p\
457 rot\")\n      {\n       print \"Run protpars [tmode=$tmo\
458 de]\";\n        open (F, \">$nb_c\");\n if ($n>1){print F\
459  \"$seqboot_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\
460 \n      else {print F \"$seqboot_o\\nY\\n\";}\n close (\
461 F);\n   `protpars$exec_extension  < $nb_c`;\n      }\
462 \n    elsif ( $stype eq \"dna\" || $stype eq \"cdn\
463 a\")\n      {\n print \"Run dnapars [tmode=$tmode]\
464 \";\n   open (F, \">$nb_c\");\n if ($n>1){print F \"\
465 $seqboot_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\n       \
466 else {print F \"$seqboot_o\\nY\\n\";}\n close (F);\
467 \n      `dnapars$exec_extension  < $nb_c`;\n      }\n  \
468   if ( -e \"outtree\"){ print \"[OK]\\n\";}\n    e\
469 lse { print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE\
470 );}\n    `mv outtree $nb_o`;\n   unlink (\"outfile\
471 \");\n  }\nelsif ($input eq \"msa\" && $tmode eq \\
472 "ml\")\n  {\n    if ( -e \"outfile\"){unlink (\"ou\
473 tfile\");}\n    if ( -e \"outtree\"){unlink (\"out\
474 tree\");}\n    \n    if ($stype eq \"prot\")\n    \
475   {\n   print \"Error: ML impossible with Protein Se\
476 quences [ERROR]\";\n    &my_exit (EXIT_FAILURE);\n   \
477    }\n    elsif ( $stype eq \"dna\" || $stype eq \\
478 "cdna\")\n      {\n     print \"Run dnaml [tmode=$tmod\
479 e]\";\n open (F, \">$nb_c\");\n if ($n>1){print F \
480 \"$seqboot_o\\nM\\nD\\n$n\\n$seed\\n10\\nY\\n\";}\\
481 n       else {print F \"$seqboot_o\\nY\\n\";}\n close (F\
482 );\n    `dnaml$exec_extension  < $nb_c`;\n      }\n  \
483   if ( -e \"outtree\"){ print \"[OK]\\n\";}\n    e\
484 lse { print \"[FAILED]\\n\";&my_exit (EXIT_FAILURE\
485 );}\n    `mv outtree $nb_o`;\n   unlink (\"outfile\
486 \");\n  }\n\n\nelse\n  {\n    `cp $msa $nb_o`;\n  \
487   $n=2;\n  }\n\nif ($rmsa && -e $seqboot_o){print \
488 \"\\nOutput List of $n Replicate MSA: $rmsa\\n\";`\
489 cp $seqboot_o $rmsa`;}\nif ($rmat && -e $protdist_\
490 o){print \"\\nOutput List of $n Replicate MATRICES\
491 : $rmat\\n\";`cp $protdist_o $rmat`;}\nif ($rtree \
492 && -e $nb_o){print \"\\nOutput List of $n Replicat\
493 e TREES: $rtree\\n\";`cp $nb_o $rtree`;}\n\n\n\n$c\
494 on_o=&vtmpnam();\n$con_c=&vtmpnam();\nif ($n >1)\n\
495   {\n    print \"Run Consense.....\";\n    open (F\
496 , \">$con_c\");\n    print F \"$nb_o\\nY\\n\";\n  \
497   close (F);\n    `consense$exec_extension  < $con\
498 _c`;\n    if ( -s \"outtree\"  > 0) { print \"[OK]\
499 \\n\";}\n    else { print \"[FAILED]\\n\";&my_exit\
500  (EXIT_FAILURE);}\n    `mv outtree $con_o`;\n    u\
501 nlink (\"outfile\");\n  }\nelse\n  {\n    `cp $nb_\
502 o $con_o`;\n  }\n\n\n`cp $con_o $out`;\nif ( !-e $\
503 out)\n  {\n    print \"Tree Computation failed [FA\
504 ILED]\\n\";\n    &my_exit (EXIT_FAILURE);\n  }\nel\
505 sif ($n>1)\n  {\n    print \"\\nOutput Bootstrappe\
506 d Tree: $out\\n\";\n    $avg=`t_coffee -other_pg s\
507 eq_reformat -in $out -action +avg_bootstrap`;\n   \
508  $avg=~s/\\n//g;\n    print \"$avg\\n\";\n  }\nels\
509 e\n  {\n    print \"\\nOutput Tree: $out\\n\";\n  \
510 }\n\nopen (F, \"$out\");\nwhile (<F>)\n  {\n    \n\
511     $tree.=$_;\n  }\nclose (F);\n$tree=~s/\\n//g;\\
512 nprint \"BPH: $tree\\n\";\n\n\n&my_exit (EXIT_SUCC\
513 ESS);\n\nsub my_exit \n  {\n    my $m=@_[0];\n    \
514 &clean_vtmpnam();\n    exit ($m);\n  }\nsub vtmpna\
515 m \n  {\n    my $file;\n\n\n    $ntmp++;\n    $fil\
516 e=\"tmp4msa2bootstrap.$rseed.$$.$ntmp\";\n    \n  \
517   push (@tmpfile, $file);\n    return $file;\n  }\\
518 nsub clean_vtmpnam \n  {\n    my $t;\n    foreach \
519 $t (@tmpfile)\n      {\n        if ( -e $t){unlink ($t)};\
520 \n      }\n  }\n","use Env;\n$seq_reformat=\"t_cof\
521 fee -other_pg seq_reformat \";\n$VersionTag=\"1.00\
522 \";\n$step=1;\n$unset=\"\";\n$scoreT1=$scoreT2=$ns\
523 eqT=$dp_limit=$unset;\n@tl=();\nchomp($tc_version=\
524 `t_coffee -version`);$tc_version=~s/PROGRAM: //;\n\
525 \n\nprint STDERR \"\\n****************************\
526 *************************************\";\nprint ST\
527 DERR \"\\n*           HIGH LEVEL PROGRAM: T-COFFEE\
528 _DPA Version $VersionTag\";\nprint STDERR \"\\n*  \
529          LOW  LEVEL PROGRAM: $tc_version \";\nprin\
530 t STDERR \"\\n************************************\
531 *****************************\";\n\nif (!@ARGV)\n \
532  {\n    print \"t_coffee_dpa accepts every t_coffe\
533 e_flag.\\nType t_coffee to obtain a list\\n\";\n  \
534   print \"Requires $TC_VERSION\\n\";\n    print \"\
535 Requires \";\n    print \"t_coffee_dpa specific fl\
536 ags:\\n\";\n    print \"\\t-dpa_master_aln........\
537 ............Master alignment: provided OR computed\
538 \\n\";\n    print \"\\t-dpa_master_aln............\
539 ........By default, Computed with t_coffee -very_f\
540 ast\\n\";\n    print \"\\t-dpa_master_aln=<file>..\
541 ...........Use file, (must be an aln in Fasta or C\
542 lustalW\\n\";\n    print \"\\t-dpa_master_aln=<pro\
543 gram>..........Compute aln with pg -in seq -out al\
544 n`\\n\";\n    print \"\\t-dpa_maxnseq.............\
545 ..........Maximum number of sequences in subgroups\
546 \\n\";\n    print \"\\t-dpa_min_score1............\
547 ........Minimum Id for two sequences to be grouped\
548  in ref_aln\\n\";\n    print \"\\t-dpa_min_score2.\
549 ...................Minimum Id within a subgroup\\n\
550 \";\n    print \"\\t-dpa_debug....................\
551 .....Keep Tmp File (for debug purpose)\\n\\n\";\n \
552    \n    exit (0);\n  }\nforeach $arg (@ARGV)\n  {\
553 \n    $arg_list.=\" $arg\";\n  }\n$arg_list=~s/[=,\
554 ;]/ /g;\n\n\n($seq0, $arg_list)=&extract_val_from_\
555 arg_list(\"^\",$arg_list, \"SPLICE\",\"unset\");\n\
556 ($seq1, $arg_list)=&extract_val_from_arg_list(\"-s\
557 eq\",$arg_list, \"SPLICE\",\"unset\");\n($seq2, $a\
558 rg_list)=&extract_val_from_arg_list(\"-in\",$arg_l\
559 ist, \"KEEP\",\"unset\");\n($seq3, $arg_list)=&ext\
560 ract_val_from_arg_list(\"-infile\",$arg_list, \"SP\
561 LICE\",\"unset\");\n($prf,  $arg_list)=&extract_va\
562 l_from_arg_list(\"-profile\",$arg_list, \"SPLICE\"\
563 ,\"unset\");\n\n$gl{'Seq'}=$seq=&vtmpnam();#file c\
564 ontaining all the sequences\n\n   #1-remove sequen\
565 ces from -in\nif ( $arg_list =~/\\-in\\b/)\n  {\n \
566    my $save, $name;\n    while($arg_list=~/\\-in\\\
567 b[^-]+(\\bS[\\w.]+)/)\n      {\n        $name=$1;$name=~s\
568 /^.//;\n        if ( !-e $name){$save.=\" S$name \";}\n\n\
569         $arg_list=~s/S$name/ /;\n      }\n    $arg_list=~\
570 s/\\-in\\b/\\-in $save /;\n  }\n   #2-prepare \n\n\
571 if (!($arg_list=~/\\-outorder/))\n  {\n    \n    $\
572 output_cl .=\" -outorder=$seq\";\n  }\n@output_fla\
573 g=(\"-output\",\"-outfile\", \"-run_name\", \"-out\
574 order\"); \nforeach $v1 (@output_flag)\n  {\n    (\
575 $v2, $arg_list)=&extract_val_from_arg_list($v1,$ar\
576 g_list, \"SPLICE\",\"unset\");\n    if ($v2 ne \"\\
577 ")\n      {\n\n if ($v1 eq \"-run_name\"){$run_nam\
578 e=$v2;$output_cl .=\" $v1 $v2 \";}\n    elsif ( $v1 e\
579 q \"-outorder\")\n        {\n       if ( $v2 eq \"input\"\
580 ){$v2=$seq;}\n      $outorder=$v2;$output_cl .=\" $\
581 v1 $v2 \";\n      }\n   else\n    {\n       $output_cl .=\\
582 " $v1 $v2 \";\n   }\n      }\n }\n\n\n($dpa_master\
583 _aln, $arg_list)  =&extract_val_from_arg_list(\"-d\
584 pa_master_aln\",$arg_list, \"SPLICE\", \"t_coffee\\
585 ");\n$dpa_master_aln=~s/\\s//g;\n($nseqT, $arg_lis\
586 t)           =&extract_val_from_arg_list(\"-dpa_ma\
587 xnseq\",$arg_list, \"SPLICE\", 30);\n($scoreT1, $a\
588 rg_list)         =&extract_val_from_arg_list(\"-dp\
589 a_min_score1\",$arg_list, \"SPLICE\", 80);\n($scor\
590 eT2, $arg_list)         =&extract_val_from_arg_lis\
591 t(\"-dpa_min_score2\"    ,$arg_list, \"SPLICE\", 3\
592 0);\n($dpa_limit, $arg_list)       =&extract_val_f\
593 rom_arg_list(\"-dpa_limit\"        ,$arg_list, \"S\
594 PLICE\", 0);\n($dpa_delta_id, $arg_list)    =&extr\
595 act_val_from_arg_list(\"-dpa_delta_id\"        ,$a\
596 rg_list, \"SPLICE\", 1);\n($dpa_debug, $arg_list) \
597       =&extract_val_from_arg_list(\"-dpa_debug\"  \
598          ,$arg_list, \"SPLICE\", 0);\n\n\n$in_seq=\
599 $seq0.\" \".$seq1.\" \".$seq2.\" \".$seq3;\n$in_pr\
600 f=(($prf ne $unset)?\"$prf \":\"\");\n&exit_dpa ((\
601 $in_seq eq \"\" && $in_prf eq \"\")?1:0, \"ERROR: \
602 You did not Provide any sequences. Use the -seq fl\
603 ag [FATAL: t_coffee_dpa]\\n\", EXIT_FAILURE);\n\n\\
604 nprint STDERR \"\\nSTART DPA COMPUTATION\";\n\n\n\\
605 nif ($in_seq=~/\\S+/)\n  {\n    \n    print STDERR\
606  \"\\n Step $step: Gather all the sequences into t\
607 he tmp file: [$seq]\";$step++;  \n    &my_system (\\
608 "t_coffee $in_seq -convert -quiet -output fasta_se\
609 q -outfile=$seq -maxnseq 0\");\n  }\n\nif ( !-e $s\
610 eq){$seq=\"\";}\n\nif ($in_prf=~/\\S+/)\n  {\n    \
611 $seq_in_type=\"profile\"; \n    $seq.= $in_prf; \n\
612   }\nif ($seq eq \"\"){ &exit_dpa (1, \"\\nERROR: \
613 No Sequence FOund. Provide Sequences with the -seq\
614  flag [FATAL: t_coffee_dpa]\", EXIT_FAILURE);}\n\n\
615  \n\nif ( $run_name)\n  {\n    $suffix=$run_name;\\
616 n  }\nelsif ($in_seq=~/\\b(S[\\w.]+\\b)/)\n  {\n  \
617   my $suffix1, $sufffix2;\n    $suffix1=$suffix2=$\
618 1;\n    $suffix2=~s/^S//;\n    if ( -e $suffix1){$\
619 suffix=$suffix1;}\n    elsif ( -e $suffix2){$suffi\
620 x=$suffix2;}\n    else\n      {\n       $suffix=&vtmpnam\
621 ();     \n      }\n    $suffix=~s/\\.\\w+//;\n  }\n\ne\
622 lse\n  {\n    $suffix=&vtmpnam();\n  }\n\n\nif (!$\
623 run_name){$output_cl.=\" -run_name $suffix \";}\n\\
624 n\n$gl{'Tree'}=&seq2dpa_tree ($seq, \"$suffix.dpad\
625 nd\");\n\nprint STDERR \"\\n Step $step: Prepare g\
626 uide tree: $gl{'Tree'}\";$step++;\n\nprint STDERR \
627 \"\\n Step $step: Identify and Align Closely Relat\
628 ed Groups\";$step++;\n%gl=&make_one_pass (0, $scor\
629 eT1,\"Align\",%gl);\n\nprint STDERR \"\\n Step $st\
630 ep: Make Multiple Group Alignment\";$step++;\nwhil\
631 e (!%gl ||$gl{'Ng'}>$nseqT)\n  {\n    %gl=&make_on\
632 e_pass ($nseqT, $scoreT2,\"t_coffee\",%gl);\n    i\
633 f ( $gl{'Newgroups'}==0){$scoreT2--;}    \n  }\npr\
634 int STDERR \"\\n Step $step: Make The Final Alignm\
635 ent\";$step++;\n\n\n$arg_list .=$output_cl;\n\n\n%\
636 gl=&tree2group (0,0, %gl);\n$gl{$gl{'0'}{'File'}}{\
637 'Output'}=\"\";\n$a=0;\n&align_groups (\"t_coffee\\
638 ",'0', $arg_list, \" \", %gl);\n\n\n\nif ( !$dpa_k\
639 eep_tmpfile){&clean_tmp_file (@tl);}\n\n\n\nsub se\
640 q2dpa_tree \n  {\n    my $seq=@_[0];\n    my $newt\
641 ree=@_[1];\n    my $aln=&vtmpnam ();\n\n    &my_sy\
642 stem (\"t_coffee -special_mode quickaln -in $seq -\
643 outfile $aln -quiet\");\n    &my_system (\"$seq_re\
644 format -in $aln -action +aln2tree +tree2dpatree -o\
645 utput newick >$newtree\");\n    return $newtree;\n\
646   }     \nsub seq2dpa_tree_old \n  {\n    my $aln=@_[0\
647 ];\n    my $newtree=@_[1];\n    \n    \n    &my_sy\
648 stem(\"$seq_reformat -in $aln -action +seq2dpatree\
649  -output newick > $newtree\");\n    return $newtre\
650 e;\n  }\nsub aln2dpa_tree \n  {\n    my $aln=@_[0]\
651 ;\n    my $newtree=&vtmpnam();\n    \n    &my_syst\
652 em(\"$seq_reformat -in $aln -action +aln2tree +tre\
653 e2dpatree -output newick > $newtree\");\n    retur\
654 n $newtree;\n  }\nsub group_file2ngroups\n  {\n   \
655  my $file=@_[0];\n    my $n;\n    \n    open ( F, \
656 $file);\n    while (<F>)\n      {\n     $n+=/\\>/;\n  \
657     }\n    close (F);\n    return $n;\n  }\n\nsub \
658 make_one_pass\n  {\n    my ($N, $ID,$pg, %gl)=@_;\\
659 n    my $a;\n\n    %gl=&tree2group ($N,$ID,%gl);\n\
660     if (!$gl{'Newgroups'}){return %gl;}\n    else\\
661 n      {\n      for ( $a=0; $a< $ng; $a++)\n      {\n       \
662 if ($gl{$gl{$a}{'File'}}{'Ng'}>1){&display_group($\
663 a, %gl);}\n         &align_groups ($pg, $a, $arg_list,\
664  \" -quiet=quiet \", %gl);\n      }\n   return %gl;\n  \
665     }\n  }\n\nsub tree2group \n  {\n    my ($N, $I\
666 D, %gl)=@_;\n    my $prefix=&vtmpnam();\n    my $g\
667 roup_file=&vtmpnam();\n    my $file;\n    my $oldt\
668 ree=&vtmpnam();\n    my $n;\n    my $tree;\n\n\n  \
669   if ( $gl{'Ng'}==1){return %gl;}\n    $tree=$gl{'\
670 Tree'}; \n    \n    #1 extract the groups\n    &my\
671 _system (\"$seq_reformat -in $tree -action +tree2g\
672 roup $N $ID $prefix > $group_file\");\n    $n=grou\
673 p_file2ngroups($group_file);\n    \n    \n    $gl{\
674 'Newgroups'}=1;\n    if ( $n==$gl{'Ng'})\n      {\\
675 n       $gl{'Newgroups'}=0;\n   return %gl;\n      }\n    \
676 $gl{'Iteration'}++;\n    $gl{'MaxNseq'}=$N;$gl{'Mi\
677 nID'}=$ID;\n    $gl{'GroupFile'}=$group_file;$gl{'\
678 Ng'}=$ng=0;\n    #2 Process the group list into th\
679 e hash\n    open (F, $group_file);\n    while (<F>\
680 )\n      {\n    $gl{'File'}.=$_;\n      if (/\\>/)\n      {\n\
681             $line=$_;\n     $line=~s/\\>//;\n       @list=(\
682 $line=~/(\\S+)/g);\n        $file=$gl{$ng}{'File'}=sh\
683 ift @list;\n        $gl{$file}{'Output'}=$file;\n          \
684  \n         $gl{$file}{'Ng'}=$#list+1;\n            if ($gl{$\
685 file}{'Ng'}>1){ $gl{$file}{'Tlist'}=$gl{$file}{'Al\
686 ist'}=\"(\";}\n     foreach $l (@list)\n              {\n\
687         \n              $gl{$file}{'List'}.=\" $l \";\n         \n              if (!$gl\
688 {$l}{'Tlist'})\n                  {\n               $gl{$l}{'Tlist'}=\"$l\
689 \";\n               $gl{$l}{'Alist'}=\"$l\";\n              $gl{$l}\
690 {'Nseq'}=1;\n               $gl{$l}{'Ng'}=1;\n            }\n           $gl{\
691 $file}{'Tlist'}.=\"$gl{$l}{'Tlist'},\";\n               $gl{$fi\
692 le}{'Alist'}.=\"$gl{$l}{'Tlist'}|\";\n          $gl{$file}\
693 {'Nseq'}+=$gl{$l}{'Nseq'};\n          }\n           \n\n          \
694   chop($gl{$file}{'Tlist'});chop($gl{$file}{'Alist\
695 '});\n      if ($gl{$file}{'Ng'}>1){$gl{$file}{'Tli\
696 st'}.=\")\"; $gl{$file}{'Alist'}.=\");\";}\n        $\
697 ng++;\n   }     \n      }\n    $gl{'Ng'}=$ng;\n    clo\
698 se (F);\n    \n    #3 Update the old tree with the\
699  new groups\n    $gl{'Tree'}=&vtmpnam();\n    &my_\
700 system (\"$seq_reformat -in $tree -action +collaps\
701 e_tree $group_file -output newick > $gl{'Tree'}\")\
702 ;\n    \n    return %gl;\n  }\n\nsub display_group\
703  \n  {\n    my ($g,%gl)=@_;\n    my $f;\n    \n   \
704  if ( $g==-1)\n      {\n        print STDERR \"\\nIterati\
705 on $gl{'Iteration'} [MaxN=$gl{'MaxNseq'}][MinID=$g\
706 l{'MinID'}]\";\n      }\n    else\n      {\n\n  $f=\
707 $gl{$g}{'File'};\n      $action=($gl{$f}{'Ng'}==1 || $g\
708 l{'Iteration'}==1)?\"KEEP  \":\"ALIGN \";\n       \
709  print STDERR \"\\n\\t[$action][MaxN=$gl{'MaxNseq'\
710 }][MinID=$gl{'MinID'}][File $f][Nseq=$gl{$f}{'Nseq\
711 '}][Ngroups=$gl{$f}{'Ng'}][$gl{$f}{'Alist'}]\";\n \
712      }\n  }\n      \n\n\nsub align_groups\n  {\n  \
713   my ($pg, $g, $arg, $extra_arg,%gl)=@_;\n    my $\
714 f;\n    my $Output,$Outflag;\n    \n    \n    $f=$\
715 gl{$g}{'File'};\n    $Output=($gl{$f}{'Output'});\\
716 n    \n    if ( $pg eq \"Align\")\n      {\n    if ( \
717 !-e $f)\n         {\n       $command=\"$seq_reformat -in $\
718 gl{'Seq'}  -action +extract_aln $gl{'GroupFile'}\"\
719 ;\n         if ($gl{$f}{'Ng'}>1)\n            {\n               &my_syst\
720 em ($command);\n                $command=\"t_coffee -special_mod\
721 e quick_aln  S$f -outfile=$Output -quiet\";\n       \
722   }\n     }\n   else \n   {$command=\"\";}\n      }\n \
723    elsif ( -e $f)\n      {      \n      $Outflag=($Output)?\\
724 "-outfile=$Output\":\"\";\n     $command=\"$pg -infile\
725  $f $Outflag -quiet stdout $arg $extra_arg -maxnse\
726 q 0 -convert -quiet stdout\";\n      }\n    elsif \
727 ( $gl{$f}{'Ng'}==1)\n      {\n  $action=($dpa_debug\
728 )?\"cp\":\"mv\";\n      $command=\"$action $gl{$f}{'Lis\
729 t'} $Output\";\n      }\n    else\n      {\n    $Outf\
730 lag=($Output)?\"-outfile=$Output\":\"\";\n      $comman\
731 d=\"$pg -profile $gl{$f}{'List'} $Outflag $arg $ex\
732 tra_arg -maxnseq 0\";\n      }\n    \n    &my_syst\
733 em ($command);\n    return $outfile;\n  }\n    \ns\
734 ub my_system \n  {\n    my $command=@_[0];\n    my\
735  $force=@_[1];\n    my $status;\n\n    if ( $dpa_d\
736 ebug) {print STDERR \"\\nCOMMAND: $command\";}\n  \
737   $status=system ($command);\n\n    if (!$force)\n\
738        {\n       &exit_dpa (($status==1), \"Failed in C\
739 ommand:\\n$command\\n[FATAL: t_coffee_dpa]\\n\", E\
740 XIT_FAILURE);\n       }\n    \n    return $status;\
741 \n  }\n\nsub vtmpnam\n  {\n    my $prefix=@_[0];\n\
742     my $tmp_file_name;\n\n    $tmp_prefix=($prefix\
743 )?$prefix:\"dpa_tmp_file_$$\";\n   \n    $tmp_coun\
744 t++;\n    $tmp_file_name=\"$tmp_prefix\".\"$tmp_co\
745 unt\";\n    $tl[$#tl+1]=$tmp_file_name;\n    retur\
746 n $tmp_file_name;\n  }\n\nsub clean_tmp_file\n  {\\
747 n\n    my $list;\n    my $file;\n    \n    if ($dp\
748 a_debug){return;}\n    $list=vtmpnam();\n    `ls -\
749 1 | grep $tmp_prefix>$list`;\n    \n    open (F,$l\
750 ist);\n    while ( <F>)\n      {\n      $file=$_;\n     cho\
751 p $file;\n      if ( -e $file){unlink $file;}\n      }\\
752 n    close (F);\n    unlink $list;\n  }\n\n\nsub e\
753 xit_dpa\n  {\n  my $condition=@_[0];\n  my $error_\
754 msg=@_[1];\n  my $exit_value=@_[2];\n  if ( $condi\
755 tion)\n    {\n      print \"$error_msg\\n\";\n    \
756   exit ($exit_value);\n    }\n  else\n    {\n     \
757  return;\n    }\n  \n}\nsub extract_val_from_arg_l\
758 ist\n  {\n    my $arg=@_[0];\n    my $arg_list=@_[\
759 1];\n    my $keep_flag=@_[2];\n    my $default_val\
760 ue=@_[3];\n    my $val=\"\";\n    \n    #protect\n\
761     $arg_list=~s/\\s-/ \\@/g;\n    $arg=~s/-/\\@/g\
762 ;\n    \n    #search\n    if ($arg eq \"^\")\n    \
763   {\n   $arg_list=~/^([^@]*)/;\n        $val=$1;\n      }\n\
764     else\n      {$arg_list=~/$arg ([^@]*)/;$val=$1\
765 ;}\n    \n    #remove trailing spaces\n    $val=~s\
766 /\\s*$//;\n    \n    #remove the parsed sequence i\
767 f needed\n    if (($val ne \"\") && $keep_flag ne \
768 \"KEEP\")\n      {\n    if ( $arg eq \"^\"){$arg_list\
769 =~s/$val/ /;}\n else {$arg_list=~s/($arg [^@]*)/ /\
770 ;}\n      }\n   \n    #unprotect\n    $arg_list=~s/\\
771 \@/-/g;\n    $arg=~s/\\@/-/g;\n    \n    if (($val\
772  eq \"\") && $default_value ne \"unset\"){$val=$de\
773 fault_value;}\n    \n    return $val, $arg_list;\n\
774   }\n$program=\"T-COFFEE (Version_11.00.8cbe486)\"\
775 ;\\n\n","\n$DEBUG=1;\n$dpa_nseq=10;\n$dpa_sim=0;\n\
776 if (!@ARGV)\n  {\n    `t_coffee`;\n    exit (0);\n\
777   }\nforeach $arg (@ARGV)\n  {\n    $arg_list.=\" \
778 $arg\";\n  }\n$max_nseq=10;\n($seq0, $arg_list)=&e\
779 xtract_val_from_arg_list(\"^\",$arg_list);\n($seq1\
780 , $arg_list)=&extract_val_from_arg_list(\"-seq\",$\
781 arg_list);\n($seq2, $arg_list)=&extract_val_from_a\
782 rg_list(\"-in\",$arg_list, \"KEEP\");\n($seq3, $ar\
783 g_list)=&extract_val_from_arg_list(\"-infile\",$ar\
784 g_list);\n$in_seq=$seq0.\" \".$seq1.\" \".$seq2.\"\
785  \".$seq3;\n\n$seq=vtmpnam();\n`t_coffee $in_seq -\
786 convert -output fasta_seq -outfile=$seq`;\n\n\n($d\
787 pa_nseq, $arg_list)=&extract_val_from_arg_list(\"-\
788 dpa_nseq\",$arg_list);\n($master_aln, $arg_list)=&\
789 extract_val_from_arg_list(\"-master_aln\",$arg_lis\
790 t);\n($sim_matrix, $arg_list)=&extract_val_from_ar\
791 g_list(\"-sim_matrix\",$arg_list);\n($core_seq, $a\
792 rg_list)=&extract_val_from_arg_list(\"-core_seq\",\
793 $arg_list);\n($dpa_sim, $arg_list)=&extract_val_fr\
794 om_arg_list(\"-dpa_sim\",$arg_list);\n($run_name, \
795 $arg_list)=&extract_val_from_arg_list(\"-run_name\\
796 ",$arg_list);\n($output, $arg_list)=&extract_val_f\
797 rom_arg_list(\"-output\",$arg_list);\n\n\n\nif (!$\
798 sim_mat && !$master_aln)#Compute the fast alignmen\
799 t\n  {\n    $ref_aln=vtmpnam();\n    `t_coffee -se\
800 q=$seq -very_fast -outfile=$ref_aln -quiet`;\n    \
801 \n  }\n\nif (!$sim_mat)\n  {\n    $sim_mat=vtmpnam\
802 ();\n    `seq_reformat -in $ref_aln -output sim > \
803 $sim_mat`;\n  }\n\nif ( !$core_seq)\n  {\n    $cor\
804 e_seq=vtmpnam();\n    `seq_reformat -in $ref_aln -\
805 action +trimTC N$max_nseq -output fasta_seq > $cor\
806 e_seq`;\n  }\n@core_name=`seq_reformat -in $core_s\
807 eq -output name `; \n\n@tot_name=`seq_reformat -in\
808  $seq -output name `;\n\nforeach $s (@core_name){$\
809 s=~s/\\s//g;$hcore{$s}=1;}\nforeach $s (@tot_name)\
810 {$s=~s/\\s//g;}\nprint STDERR \"T-Coffee_dpa:\\n\"\
811 ;\nprint STDERR \"\\tTOTAL  SEQ: @tot_name\\n\";\n\
812 print STDERR \"\\tCHOSEN SEQ: @core_name\\n\";\n\n\
813 \n\nopen (F, $sim_mat);\nwhile ( <F>)\n  {\n    @l\
814 =($_=~/(\\b[\\S]+\\b)/g);\n    if (($l[0] eq \"TOP\
815 \" || $l[0] eq \"BOT\"))\n      {\n     $s1=$l[1];$s2=\
816 $l[2];$v=$l[3];\n       if ($hcore{$s1} && !$hcore{$s2})\
817 \n        {\n       if (!$hseq{$s2}{\"sim\"} || $v>$hseq{\
818 $s2}{\"sim\"})\n              {\n               $hseq{$s2}{\"sim\"}=$v\
819 ;$hseq{$s2}{\"seq\"}=$s1;\n           }\n         }\n      }\
820 \n  }\nclose (F);\nforeach $s (@tot_name)\n  {\n\n\
821     if ( !$hseq{$s}{\"seq\"}){;}\n    else\n      \
822 {\n     $s2=$hseq{$s}{\"seq\"};\n       $v=$hseq{$s}{\"sim\"\
823 };\n            \n      if ($v>$dpa_sim)\n        {\n       $hseq{$s}{'u\
824 sed'}=1;\n          $seq_list{$s2}{$seq_list{$s2}{'nseq\
825 '}++}=$s;\n       }\n      }\n  }\nforeach $s (@core_n\
826 ame){$seq_list{$s}{$seq_list{$s}{'nseq'}++}=$s;$hs\
827 eq{$s}{'used'}=1;}\nforeach $s (@tot_name){if (!$h\
828 seq{$s}{'used'}){$seq_list{'unused'}{$seq_list{'un\
829 used'}{'nseq'}++}=$s;}}\n\n\n$n=0;\nforeach $s (@c\
830 ore_name)\n  {\n    $ng++;\n    $n=$seq_list{$s}{'\
831 nseq'};\n    for (@g_list=(), $a=0; $a<$n; $a++){@\
832 g_list=(@g_list,$seq_list{$s}{$a});}\n\n    $g_seq\
833 =vtmpnam();\n    $g_aln=vtmpnam();\n    \n    prin\
834 t STDERR \"Group $ng: $#g_list Seq: @g_list: \";\n\
835     \n    \n    `seq_reformat -in $seq -action +lo\
836 wer +keep_name +extract_seq  @g_list -output fasta\
837 _seq > $g_seq`;\n    \n    \n    if ( $#g_list==0)\
838 \n      {\n     print STDERR \"[No aln]\\n\";\n $g_aln\
839 =$g_seq;\n      }\n    elsif ($#g_list<$max_nseq) \
840 \n      {\n     print STDERR \"[t_coffee]\\n\";\n       `t_c\
841 offee $g_seq -outfile=$g_aln -quiet $arg_list`;\n \
842      }\n    else\n      {\n     print STDERR \"[t_coff\
843 ee_dpa]\\n\";\n `t_coffee_dpa2 $g_seq -outfile=$g_\
844 aln $arg_list -sim_matrix $sim_matrix -dpa_nseq $d\
845 pa_nseq`;\n      }\n    @profile_list=(@profile_li\
846 st, $g_aln);\n  }\n\n\nprint \"UNUSED $seq_list{'u\
847 nused'}{'nseq'}\";\n\nif ($seq_list{'unused'}{'nse\
848 q'})\n    {\n      $prf=vtmpnam();\n      \n      \
849 `t_coffee -profile @profile_list $arg_list -outfil\
850 e=$prf -quiet`;\n      $n=$seq_list{\"unused\"}{'n\
851 seq'};\n      $new_seq=vtmpnam();\n      $new_prf=\
852 vtmpnam();\n      for ($a=0; $a<$n-1; $a++)\n   {\n     \
853   $s=$seq_list{\"unused\"}{$a};\n         print STDERR \\
854 "\\nADD Sequence $s\";\n          \n      `seq_reformat -in \
855 $seq -action +lower +keep_name +extract_seq $s  -o\
856 utput fasta_seq > $new_seq`;\n    `t_coffee -profil\
857 e $prf $new_seq $arg_list -outfile=$new_prf`;\n   \
858 `cp $new_prf $prf`;\n   }\n      $s=$seq_list{\"unus\
859 ed\"}{$a};\n      `seq_reformat -in $seq -action +\
860 lower +keep_name +extract_seq $s  -output fasta_se\
861 q > $new_seq`;\n      @profile_list=($prf, $new_se\
862 q);\n    }\n    \n      \nif ($run_name){$arg_list\
863 .=\" -run_name $run_name\";}\nelse \n  {\n    $in_\
864 seq=~/([\\w-]+)/;\n    $arg_list.=\" -run_name $1\\
865 ";\n  }\nif ( $output){$arg_list.=\" -output $outp\
866 ut \";}\n\n`t_coffee -profile @profile_list $arg_l\
867 ist`;\n\n\n&clean (@tmp_file_list);\n\n\nsub vtmpn\
868 am\n  {\n    my $tmp_file_name;\n    $tmp_name_cou\
869 nter++;\n    $tmp_file_name=\"tmp_file_$tmp_name_c\
870 ounter\\_Pid$$\";\n    $tmp_file_list[$ntmp_file++\
871 ]=$tmp_file_name;\n    return $tmp_file_name;\n  }\
872 \nsub clean\n  {\n  my @fl=@_;\n  my $file;\n  ret\
873 urn;\n\n  foreach $file ( @fl)\n    {\n      if ( \
874 -e $file){unlink($file);}\n    }\n}\nsub extract_v\
875 al_from_arg_list\n  {\n    my $arg=@_[0];\n    my \
876 $arg_list=@_[1];\n    my $keep_flag=@_[2];\n    #p\
877 rotect\n    $arg_list=~s/\\s-/ \\@/g;\n    $arg=~s\
878 /-/\\@/g;\n    \n    #search\n    if ($arg eq \"^\\
879 ")\n      {\n   $arg_list=~/^([^@]*)/;\n        $val=$1;\n \
880      }\n    else\n      {$arg_list=~/$arg ([^@]*)/\
881 ;$val=$1;}\n    \n    #remove the parsed sequence \
882 if needed\n    if ($val && $keep_flag ne \"KEEP\")\
883 \n      {\n     if ( $arg eq \"^\"){$arg_list=~s/$val/\
884  /;}\n  else {$arg_list=~s/($arg [^@]*)/ /;}\n     \
885  }\n    \n    #unprotect\n    $arg_list=~s/\\@/-/g;\n\
886     $arg=~s/\\@/-/g;\n    \n    return $val, $arg_\
887 list;\n  }\n\n","use Env;\nuse FileHandle;\nuse Cw\
888 d;\nuse File::Path;\nuse Sys::Hostname;\n\n\nour $\
889 PIDCHILD;\nour $ERROR_DONE;\nour @TMPFILE_LIST;\no\
890 ur $EXIT_FAILURE=1;\nour $EXIT_SUCCESS=0;\n\nour $\
891 REFDIR=getcwd;\nour $EXIT_SUCCESS=0;\nour $EXIT_FA\
892 ILURE=1;\n\nour $PROGRAM=\"tc_generic_method.pl\";\
893 \nour $CL=$PROGRAM;\n\nour $CLEAN_EXIT_STARTED;\no\
894 ur $debug_lock=$ENV{\"DEBUG_LOCK\"};\nour $debug_g\
895 eneric_method=$ENV{\"DEBUG_GENERIC_METHOD\"};\nour\
896  $LOCKDIR=$ENV{\"LOCKDIR_4_TCOFFEE\"};\nif (!$LOCK\
897 DIR){$LOCKDIR=getcwd();}\nour $ERRORDIR=$ENV{\"ERR\
898 ORDIR_4_TCOFFEE\"};\nour $ERRORFILE=$ENV{\"ERRORFI\
899 LE_4_TCOFFEE\"};\n&set_lock ($$);\nif (isshellpid(\
900 getppid())){lock4tc(getppid(), \"LLOCK\", \"LSET\"\
901 , \"$$\\n\");}\nour %RECODE;\nour $RECODE_N;\n\n\n\
902 \n\nour $BLAST_MAX_NRUNS=2;\nour $COMMAND;\nour $P\
903 IDCHILD;\n\n$REF_EMAIL=\"\";\n$tmp_dir=\"\";\n$ini\
904 t_dir=\"\";\n\n\n$test=0;\nif ($test==1)\n  {\n   \
905  $SERVER=\"NCBI\";\n    $query=$ARGV[0];\n    $hit\
906 f=$ARGV[1];\n    %s=read_fasta_seq($query);\n    @\
907 sl=keys(%s);\n    &blast_xml2profile (\"xx\", $s{$\
908 sl[0]}{seq},$maxid,$minid,$mincov, $hitf);\n    my\
909 exit ($EXIT_FAILURE);\n  }\n\nforeach $v(@ARGV){$c\
910 l.=\"$v \";}\n$COMMAND=$cl;\n($mode)=&my_get_opt (\
911  $cl, \"-mode=\",1,0);\n\n($A)=(&my_get_opt ( $cl,\
912  \"-name1=\",0,0));\n($B)=(&my_get_opt ( $cl, \"-n\
913 ame2=\",0,0));\n($TMPDIR)=(&my_get_opt ( $cl, \"-t\
914 mpdir=\",0,0));\n($CACHE)=(&my_get_opt ( $cl, \"-c\
915 ache=\",0,0));\n($SERVER)=((&my_get_opt ( $cl, \"-\
916 server=\",0,0)));\n($EMAIL)=((&my_get_opt ( $cl, \\
917 "-email=\",0,0)));\n\nif (!$A){$A=\"A\";}\nif (!$B\
918 ){$B=\"B\";}\n\n\nif (!$TMPDIR)\n  {\n    $HOME=$E\
919 NV{HOME};\n    if ($ENV{TMP_4_TCOFFEE}){$TMPDIR=$E\
920 NV{TMP_4_TCOFFEE};}\n    else{$TMPDIR=\"$HOME/.t_c\
921 offee/tmp/\";}\n  }\nif ( ! -d $TMPDIR)\n  {\n    \
922 mkdir $TMPDIR;\n  }\nif ( ! -d $TMPDIR)\n  {\n    \
923 print \"ERROR: Could not create temporary dir: $TM\
924 PDIR\\n\";\n    myexit ($EXIT_FAILURE);\n  }\n\n$E\
925 MAIL=~s/XEMAILX/\\@/g;\nif (!$EMAIL)\n  {\n    if \
926 ($ENV{EMAIL_4_TCOFFEE}){$EMAIL=$ENV{EMAIL_4_TCOFFE\
927 E};}\n    elsif ($ENV{EMAIL}){$EMAIL=$ENV{EMAIL};}\
928 \n    else {$EMAIL=$REF_EMAIL;}\n  }\n\n($maxid,$m\
929 inid,$mincov)=(&my_get_opt ( $cl, \"-maxid=\",0,0,\
930  \"-minid=\",0,0,\"-mincov=\",0,0));\nif (!$cl=~/\\
931 \-maxid\\=/){$maxid=95;}\nif (!$cl=~/\\-minid\\=/)\
932 {$minid=35;}\nif (!$cl=~/\\-mincov\\=/){$mincov=80\
933 ;}\n\n\n\n\nif ($mode eq \"seq_msa\")\n  {\n    &s\
934 eq2msa($mode,&my_get_opt ( $cl, \"-infile=\",1,1, \
935 \"-method=\",1,2, \"-param=\",0,0,\"-outfile=\",1,\
936 0, \"-database=\",0,0));\n  }\nelsif ( $mode eq \"\
937 tblastx_msa\")\n  {\n    &seq2tblastx_lib ($mode,&\
938 my_get_opt ( $cl, \"-infile=\",1,1, \"-outfile=\",\
939 1,0));\n  }\nelsif ( $mode eq \"tblastpx_msa\")\n \
940  {\n    &seq2tblastpx_lib ($mode,&my_get_opt ( $cl\
941 , \"-infile=\",1,1, \"-outfile=\",1,0));\n  }\nels\
942 if ( $mode eq \"thread_pair\")\n  {\n    &seq2thre\
943 ad_pair($mode,&my_get_opt ( $cl, \"-infile=\",1,1,\
944  \"-pdbfile1=\",1,1, \"-method=\",1,2,\"-param=\",\
945 0,0, \"-outfile=\",1,0, ));\n  }\nelsif ( $mode eq\
946  \"pdbid_pair\")\n  {\n    &seq2pdbid_pair($mode,&\
947 my_get_opt ( $cl, \"-pdbfile1=\",1,0, \"-pdbfile2=\
948 \",1,0, \"-method=\",1,2,\"-param=\",0,0, \"-outfi\
949 le=\",1,0, ));\n  }\nelsif ( $mode eq \"pdb_pair\"\
950 )\n  {\n    &seq2pdb_pair($mode,&my_get_opt ( $cl,\
951  \"-pdbfile1=\",1,1, \"-pdbfile2=\",1,1, \"-method\
952 =\",1,2,\"-param=\",0,0, \"-outfile=\",1,0, ));\n \
953  }\nelsif ( $mode eq \"rnapdb_pair\")\n{\n    &seq\
954 2rnapdb_pair($mode,&my_get_opt ( $cl, \"-pdbfile1=\
955 \",1,1, \"-pdbfile2=\",1,1, \"-method=\",1,2,\"-pa\
956 ram=\",0,0, \"-outfile=\",1,0, ));\n}\nelsif ( $mo\
957 de eq \"profile_pair\")\n  {\n     &seq2profile_pa\
958 ir($mode,&my_get_opt ( $cl, \"-profile1=\",1,1, \"\
959 -profile2=\",1,1, \"-method=\",1,2,\"-param=\",0,0\
960 , \"-outfile=\",1,0 ));\n  }\nelsif ($mode eq \"pd\
961 b_template_test\")\n  {\n    &blast2pdb_template_t\
962 est ($mode,&my_get_opt ( $cl, \"-infile=\",1,1));\\
963 n\n  }\nelsif ($mode eq \"psi_template_test\")\n  \
964 {\n    &psiblast2profile_template_test ($mode,&my_\
965 get_opt ( $cl, \"-seq=\",1,1,\"-blast=\",1,1));\n\\
966 n  }\n\nelsif ( $mode eq \"pdb_template\")\n  {\n \
967    &blast2pdb_template ($mode,&my_get_opt ( $cl, \\
968 "-infile=\",1,1, \"-database=\",1,0, \"-method=\",\
969 1,0, \"-outfile=\",1,0,\"-pdb_type=\",1,0));\n  }\\
970 n\nelsif ( $mode eq \"profile_template\")\n  {\n\n\
971     &psiblast2profile_template ($mode,&my_get_opt \
972 ( $cl, \"-infile=\",1,1, \"-database=\",1,0, \"-me\
973 thod=\",1,0, \"-outfile=\",1,0));\n  }\nelsif ( $m\
974 ode eq \"psiprofile_template\")\n  {\n    &psiblas\
975 t2profile_template ($mode,&my_get_opt ( $cl, \"-in\
976 file=\",1,1, \"-database=\",1,0, \"-method=\",1,0,\
977  \"-outfile=\",1,0));\n  }\nelsif ( $mode eq \"RNA\
978 _template\")\n  {\n    &seq2RNA_template ($mode,&m\
979 y_get_opt ( $cl, \"-infile=\",1,1,\"-pdbfile=\",1,\
980 1,\"-outfile=\",1,0));\n  }\nelsif ( $mode eq \"tm\
981 _template\")\n  {\n    &seq2tm_template ($mode, \"\
982 \", &my_get_opt ( $cl, \"-infile=\",1,1,\"-arch=\"\
983 ,1,1,\"-psv=\",1,1, \"-outfile=\",1,0,));\n  }\nel\
984 sif ( $mode eq \"psitm_template\")\n  {\n    &seq2\
985 tm_template ($mode,&my_get_opt ( $cl, \"-database=\
986 \",1,0, \"-infile=\",1,1, \"-arch=\",1,1,\"-psv=\"\
987 ,1,1, \"-outfile=\",1,0,));\n  }\nelsif ( $mode eq\
988  \"ssp_template\")\n  {\n    &seq2ssp_template ($m\
989 ode,&my_get_opt ( $cl, \"-infile=\",1,1,\"-seq=\",\
990 1,1,\"-obs=\",1,1, \"-outfile=\",1,0));\n  }\nelsi\
991 f ( $mode eq \"psissp_template\")\n  {\n    &seq2s\
992 sp_template ($mode,&my_get_opt ( $cl, \"-infile=\"\
993 ,1,1,\"-seq=\",1,1,\"-obs=\",1,1, \"-outfile=\",1,\
994 0));\n  }\n\n\n\nelse\n  {\n    myexit(flush_error\
995 ( \"$mode iss an unknown mode of tc_generic_method\
996 .pl\"));\n  }\nmyexit ($EXIT_SUCCESS);\n\n\nsub se\
997 q2ssp_template\n  {\n  my ($mode, $infile,$gor_seq\
998 ,$gor_obs,$outfile)=@_;\n  my %s, %h;\n  my $resul\
999 t;\n  my (@profiles);\n  &set_temporary_dir (\"set\
1000 \",$infile,\"seq.pep\");\n  %s=read_fasta_seq (\"s\
1001 eq.pep\");\n\n\n  open (R, \">result.aln\");\n\n  \
1002 #print stdout \"\\n\";\n  foreach $seq (keys(%s))\\
1003 n    {\n\n      open (F, \">seqfile\");\n      $s{\
1004 $seq}{seq}=uc$s{$seq}{seq};\n      print (F \">$s{\
1005 $seq}{name}\\n$s{$seq}{seq}\\n\");\n      close (F\
1006 );\n      $lib_name=\"$s{$seq}{name}.ssp\";\n     \
1007  $lib_name=&clean_file_name ($lib_name);\n\n      \
1008 if ($mode eq \"ssp_template\"){&seq2gor_prediction\
1009  ($s{$seq}{name},$s{$seq}{seq}, \"seqfile\", $lib_\
1010 name,$gor_seq, $gor_obs);}\n      elsif ($mode eq \
1011 \"psissp_template\")\n  {\n       &seq2msa_gor_predicti\
1012 on ($s{$seq}{name},$s{$seq}{seq},\"seqfile\", $lib\
1013 _name,$gor_seq, $gor_obs);\n    }\n\n      if ( !-e $\
1014 lib_name)\n     {\n       myexit(flush_error(\"GORIV faile\
1015 d to compute the secondary structure of $s{$seq}{n\
1016 ame}\"));\n       myexit ($EXIT_FAILURE);\n     }\n      e\
1017 lse\n   {\n       print stdout \"!\\tProcess: >$s{$seq}{\
1018 name} _E_ $lib_name \\n\";\n      print R \">$s{$seq}\
1019 {name} _E_ $lib_name\\n\";\n    }\n      unshift (@pr\
1020 ofiles, $lib_name);\n    }\n  close (R);\n  &set_t\
1021 emporary_dir (\"unset\",$mode, $method,\"result.al\
1022 n\",$outfile, @profiles);\n}\n\nsub seq2tm_templat\
1023 e\n  {\n  my ($mode, $db, $infile,$arch,$psv,$outf\
1024 ile)=@_;\n  my %s, %h;\n  my $result;\n  my (@prof\
1025 iles);\n  &set_temporary_dir (\"set\",$infile,\"se\
1026 q.pep\");\n  %s=read_fasta_seq (\"seq.pep\");\n\n\\
1027 n  open (R, \">result.aln\");\n\n  #print stdout \\
1028 "\\n\";\n  foreach $seq (keys(%s))\n    {\n      o\
1029 pen (F, \">seqfile\");\n      print (F \">$s{$seq}\
1030 {name}\\n$s{$seq}{seq}\\n\");\n      close (F);\n \
1031      $lib_name=\"$s{$seq}{name}.tmp\";\n      $lib\
1032 _name=&clean_file_name ($lib_name);\n\n      if ($\
1033 mode eq \"tm_template\")\n      {\n       &safe_system (\"t\
1034 _coffee -other_pg fasta_seq2hmmtop_fasta.pl -in=se\
1035 qfile -out=$lib_name -arch=$arch -psv=$psv\");\n        }\
1036 \n      elsif ( $mode eq \"psitm_template\")\n  {\n\
1037           &seq2msa_tm_prediction ($s{$seq}{name},$s{$seq}\
1038 {seq}, $db, \"seqfile\", $lib_name,$arch, $psv);\n\
1039         }\n      if ( !-e $lib_name)\n  {\n       myexit(flush\
1040 _error(\"hmmtop failed to compute the secondary st\
1041 ructure of $s{$seq}{name}\"));\n          myexit ($EXIT_F\
1042 AILURE);\n      }\n      else\n {\n       print stdout \"!\\
1043 \tProcess: >$s{$seq}{name} _T_ $lib_name\\n\";\n         \
1044  print R \">$s{$seq}{name} _T_ $lib_name\\n\";\n        }\
1045 \n      unshift (@profiles, $lib_name);\n    }\n  \
1046 close (R);\n  &set_temporary_dir (\"unset\",$mode,\
1047  $method,\"result.aln\",$outfile, @profiles);\n}\n\
1048 \n\n\nsub seq2RNA_template\n  {\n    \n    my ($mo\
1049 de, $infile, $pdbfile, $outfile)=@_;\n    my %s, %\
1050 h ;\n    my $result;\n    my (@profiles);\n    my \
1051 ($seq_mode, $pdb_mode, $pwd);\n    \n    #use $seq\
1052 _mode to estimate the template of sequences WITHOU\
1053 T a PDB\n    #use $pdb_mode to estimate the templa\
1054 te of sequences WITH    a PDB\n\n    $seq_mode=$EN\
1055 V{\"SEQ2TEMPLATE4_F_\"};\n    $pdb_mode=$ENV{\"PDB\
1056 2TEMPLATE4_F_\"};\n    \n    if (!$pdb_mode){$pdb_\
1057 mode=\"find_pair-p\";}\n    if (!$seq_mode){$seq_m\
1058 ode=\"RNAplfold\";}\n    \n    my $cwd = cwd();\n \
1059    &set_temporary_dir (\"set\",$infile,\"seq.pep\"\
1060 );\n    %s=read_fasta_seq (\"seq.pep\");\n    %pdb\
1061 _template_h = &read_template_file($pdbfile);\n    \
1062 my $pdb_chain;\n    \n       \n    open (R, \">res\
1063 ult.aln\");\n    #print stdout \"\\n\";\n    forea\
1064 ch $seq (keys(%s))\n      {\n   \n      open (F, \">seqfi\
1065 le\");\n        print (F \">$s{$seq}{name}\\n$s{$seq}{seq\
1066 }\\n\");\n      close (F);\n    $pdb_chain = $pdb_template\
1067 _h{$seq};\n     $lib_name=\"$s{$seq}{name}.rfold\";\n   \
1068 $lib_name=&clean_file_name ($lib_name);\n       if ($pdb\
1069 _template_h{$seq} eq \"\")\n      {\n       if    ($seq\
1070 _mode eq \"RNAplfold\"){RNAplfold2lib (\"seqfile\"\
1071 , \"$lib_name\");}\n        elsif ($seq_mode eq \"no\\
1072 "){$lib_name=0;}\n          else\n            {\n               myexit(ad\
1073 d_error (EXIT_FAILURE,$$,$$,getppid(), \"seq2RNA_t\
1074 emplate failure::method $seq_mode not available fo\
1075 r sequences without PDB structures\"));\n             }\\
1076 n         }\n   elsif ($pdb_template_h{$seq} ne \"\")\n   \
1077 {\n         my $pdbf;\n     if (-e \"$cwd/$pdb_chain\"\
1078 ){$pdbf=\"$cwd/$pdb_chain\";}\n     else {$pdbf=\"\
1079 $CACHE$pdb_chain\";}\n      \n\n            if($pdb_mode e\
1080 q \"x3dna-ssr\")\n            {\n               x3dnassr2lib (\"seqf\
1081 ile\", \"$pdbf\", \"$lib_name\");\n           }\n           \
1082 elsif ($pdb_mode eq \"find_pair-p\")\n        {\n               \
1083 x3dna_find_pair2lib (\"seqfile\", \"$pdbf\", \"$li\
1084 b_name\", \"find_pair -p\");\n        }\n           elsif\
1085  ($pdb_mode eq \"find_pair\")\n       {\n               x3dna_f\
1086 ind_pair2lib (\"seqfile\", \"$pdbf\", \"$lib_name\\
1087 ", \"find_pair\");\n          }\n           elsif ($pdb_mod\
1088 e eq \"RNAplfold\")\n         {\n               RNAplfold2lib (\"\
1089 seqfile\", \"$lib_name\");\n          }\n           elsif (\
1090 $pdb_mode eq \"no\"){$lib_name=0;}\n        else\n        \
1091     {\n         myexit(add_error (EXIT_FAILURE,$$,$$,getp\
1092 pid(), \"seq2RNA_template failure::Could not find \
1093 method $pdb_mode\"));\n       }\n         }\n   if ($lib_n\
1094 ame)\n    {\n       print stdout \"!\\tProcess: >$s{$\
1095 seq}{name} _F_ $lib_name\\n\";\n            print R \">$s\
1096 {$seq}{name} _F_ $lib_name\\n\";\n          unshift (@p\
1097 rofiles, $lib_name);\n    }\n      }\n    close (R)\
1098 ;\n    &set_temporary_dir (\"unset\",$mode, $metho\
1099 d,\"result.aln\",$outfile, @profiles);\n  }\n\n\n\\
1100 nsub psiblast2profile_template_test\n  {\n  my ($m\
1101 ode, $seq,$blast)=@_;\n  my %s, %h, ;\n  my ($resu\
1102 lt,$psiblast_output,$profile_name,@profiles);\n  m\
1103 y $trim=0;\n  my $maxid=100;\n  my $minid=0;\n  my\
1104  $mincov=0;\n  my $maxcov=100;\n\n  %s=read_fasta_\
1105 seq ($seq);\n  open (R, \">result.aln\");\n\n  #pr\
1106 int stdout \"\\n\";\n  foreach $seq (keys(%s))\n  \
1107   {\n\n      open (F, \">seqfile\");\n      print \
1108 (F \">$A\\n$s{$seq}{seq}\\n\");\n      close (F);\\
1109 n      $psiblast_output=$blast;\n      if ( -e $ps\
1110 iblast_output)\n        {\n       %profile=blast_xml2profile(\
1111 $s{$seq}{name}, $s{$seq}{seq},$maxid, $minid,$minc\
1112 ov,$psiblast_output);\n\n\n\n     $profile_name=\"$s\
1113 {$seq}{name}.prf\";\n     $profile_name=&clean_file_\
1114 name ($profile_name);\n   unshift (@profiles, $pro\
1115 file_name);\n     output_profile ($profile_name, \\%\
1116 profile, $trim);\n        print stdout \"!\\tProcess: >\
1117 $s{$seq}{name} _R_ $profile_name [$profile{n} Seq.\
1118 ] [$SERVER/blast/$db][$CACHE_STATUS]\\n\";\n      pri\
1119 nt R \">$s{$seq}{name} _R_ $profile_name\\n\";\n        }\
1120 \n    }\n  close (R);\n\n  die;\n}\nsub psiblast2p\
1121 rofile_template\n  {\n  my ($mode, $infile, $db, $\
1122 method, $outfile)=@_;\n  my %s, %h, ;\n  my ($resu\
1123 lt,$psiblast_output,$profile_name,@profiles);\n  m\
1124 y $trim=0;\n  &set_temporary_dir (\"set\",$infile,\
1125 \"seq.pep\");\n  %s=read_fasta_seq (\"seq.pep\");\\
1126 n  open (R, \">result.aln\");\n\n  #print stdout \\
1127 "\\n\";\n  foreach $seq (keys(%s))\n    {\n      o\
1128 pen (F, \">seqfile\");\n      print (F \">$A\\n$s{\
1129 $seq}{seq}\\n\");\n      close (F);\n      $psibla\
1130 st_output=&run_blast ($s{$seq}{name},$method, $db,\
1131  \"seqfile\",\"outfile\");\n\nif ( -e $psiblast_ou\
1132 tput)\n {\n       %profile=blast_xml2profile($s{$seq}{\
1133 name}, $s{$seq}{seq},$maxid, $minid,$mincov,$psibl\
1134 ast_output);\n    unlink ($psiblast_output);\n\n          \
1135 $profile_name=\"$s{$seq}{name}.prf\";\n   $profile\
1136 _name=&clean_file_name ($profile_name);\n         unshif\
1137 t (@profiles, $profile_name);\n   output_profile (\
1138 $profile_name, \\%profile, $trim);\n      print stdou\
1139 t \"!\\tProcess: >$s{$seq}{name} _R_ $profile_name\
1140  [$profile{n} Seq.] [$SERVER/blast/$db][$CACHE_STA\
1141 TUS]\\n\";\n      print R \">$s{$seq}{name} _R_ $prof\
1142 ile_name\\n\";\n        }\n    }\n  close (R);\n  &set_te\
1143 mporary_dir (\"unset\",$mode, $method,\"result.aln\
1144 \",$outfile, @profiles);\n}\nsub blast2pdb_templat\
1145 e_test\n    {\n      my ($mode,$infile)=@_;\n     \
1146  my ($maxid,$minid,$mincov);\n      $maxid=100;\n \
1147      $minid=0;\n      $mincov=0;\n\n      print \"\
1148 $infile\\n\";\n\n      %p=blast_xml2profile($s{$se\
1149 q}{name}, $s{$seq}{seq},$maxid, $minid,$mincov,$in\
1150 file);\n      $c=1;\n      print stdout \"!\\tProc\
1151 ess: >$s{$seq}{name} [$SERVER/blast/$db][$CACHE_ST\
1152 ATUS]\\n\";\n      while (!$found && $c<$p{n})\n        {\
1153 \n        $pdbid=&id2pdbid($p{$c}{identifyer});\n         if \
1154 ( length ($pdbid)>5){$pdbid=id2pdbid($p{$c}{defini\
1155 tion});}\n\n      if ( length ($pdbid)>5)\n         {\n  \
1156      myexit(add_error (EXIT_FAILURE,$$,$$,getppid(\
1157 ), \"BLAST_FAILURE::Could Not Parse PDBID ($p{$c}{\
1158 identifyer},$p{$c}{definition})\"));\n      }\n\n\n\
1159           if (!&pdb_is_released($pdbid))\n          {\n       \
1160 print stdout \"\\t\\t**$pdbid [PDB NOT RELEASED or\
1161  WITHDRAWN]\\n\";\n           $c++;\n       }\n   elsif \
1162 (!&pdb_has_right_type ($pdbid,$type))\n     {\n   \
1163     my $ptype=&pdb2type ($pdbid);\n           my $etyp\
1164 e=&type2etype($type);\n\n             print stdout \"\\t\
1165 \\t**$pdbid [$ptype cannot be used (expected: $ety\
1166 pe)]\\n\";\n          $c++;\n       }\n   else\n            {\\
1167 n             $found=1;\n           }\n }\n\n      if ($found)\
1168 \n      {\n       print stdout \"\\t\\t >$s{$seq}{name} _P_\
1169  $pdbid\\n\";\n }\n      else\n {\n       print stdout\
1170  \"\\t\\t >$s{$seq}{name} No Template Selected\\n\\
1171 ";\n    }\n      die;\n    }\nsub blast2pdb_template\\
1172 n  {\n  my ($mode, $infile, $db, $method, $outfile\
1173 ,$type)=@_;\n  my %s, %h, ;\n  my ($result,$blast_\
1174 output);\n  &set_temporary_dir (\"set\",$infile,\"\
1175 seq.pep\");\n  %s=read_fasta_seq (\"seq.pep\");\n \
1176  open (R, \">result.aln\");\n\n\n  #print stdout \\
1177 "\\n\";\n  foreach $seq (keys(%s))\n    {\n      m\
1178 y $c;\n      my $found;\n\n      open (F, \">seqfi\
1179 le\");\n      print (F \">$A\\n$s{$seq}{seq}\\n\")\
1180 ;\n      close (F);\n\n      $blast_output=&run_bl\
1181 ast ($s{$seq}{name},$method, $db, \"seqfile\",\"ou\
1182 tfile\");\n\n      %p=blast_xml2profile($s{$seq}{n\
1183 ame}, $s{$seq}{seq},$maxid, $minid,$mincov,$blast_\
1184 output);\n      unlink ($blast_output);\n\n      $\
1185 c=1;\n      print stdout \"!\\tProcess: >$s{$seq}{\
1186 name} [$SERVER/blast/$db][$CACHE_STATUS]\\n\";\n  \
1187     while (!$found && $c<$p{n})\n       {\n       $pdbid=&id\
1188 2pdbid($p{$c}{identifyer});\n     if ( length ($pdbi\
1189 d)>5){$pdbid=id2pdbid($p{$c}{definition});}\n\n   \
1190 if ( length ($pdbid)>5)\n           {\n       myexit(add\
1191 _error (EXIT_FAILURE,$$,$$,getppid(), \"BLAST_FAIL\
1192 URE::Could Not Parse PDBID ($p{$c}{identifyer},$p{\
1193 $c}{definition})\"));\n     }\n\n\n       if (!&pdb_is\
1194 _released($pdbid))\n        {\n       print stdout \"\
1195 \\t\\t**$pdbid [PDB NOT RELEASED or WITHDRAWN]\\n\\
1196 ";\n          $c++;\n       }\n   elsif (!&pdb_has_righ\
1197 t_type ($pdbid,$type))\n            {\n       my $ptype=&\
1198 pdb2type ($pdbid);\n          my $etype=&type2etype($\
1199 type);\n\n            print stdout \"\\t\\t**$pdbid [$p\
1200 type cannot be used (expected: $etype)]\\n\";\n   \
1201     $c++;\n         }\n   else\n            {\n       $found=\
1202 1;\n        }\n }\n\n      if ($found)\n        {\n       print \
1203 R \">$s{$seq}{name} _P_ $pdbid\\n\";\n    print std\
1204 out \"\\t\\t >$s{$seq}{name} _P_ $pdbid\\n\";\n }\\
1205 n      else\n   {\n       print R \">$s{$seq}{name}\\n\"\
1206 ;\n       print stdout \"\\t\\t >$s{$seq}{name} No Tem\
1207 plate Selected\\n\";\n  }\n    }\n  close (R);\n  &\
1208 set_temporary_dir (\"unset\",$mode, $method,\"resu\
1209 lt.aln\",$outfile);\n}\nsub type2etype\n  {\n    m\
1210 y $type=shift;\n    my $etype;\n\n    if ( $type=~\
1211 /n/){$etype.=\"NMR \";}\n    if ( $type=~/d/){$ety\
1212 pe.=\"diffraction \";}\n    if ( $type=~/m/){$etyp\
1213 e.=\"model \";}\n    return $etype;\n  }\nsub pdb2\
1214 type\n  {\n     my $pdb=shift;\n     my $f=vtmpnam\
1215 ();\n\n     my $value= &safe_system (\"t_coffee -o\
1216 ther_pg extract_from_pdb -model_type $pdb > $f\");\
1217 \n     my $r=&file2string ($f);\n     chomp($r);\n\
1218      return $r;\n   }\nsub pdb_has_right_type\n  {\
1219 \n    my $pdb=shift;\n    my $type=shift;\n\n    m\
1220 y $f=vtmpnam();\n\n    my $value= &safe_system (\"\
1221 t_coffee -other_pg extract_from_pdb -model_type $p\
1222 db > $f\");\n    my $r=&file2string ($f);\n    cho\
1223 mp($r);\n\n\n    if ( $r eq \"NMR\" && $type=~/n/)\
1224 {return 1;}\n    elsif ( $r eq \"diffraction\" && \
1225 $type=~/d/){return 1;}\n    elsif ( $r eq \"model\\
1226 " && $type=~/m/){return 1;}\n    else {return 0;}\\
1227 n  }\nsub pdb_is_released\n  {\n    my $pdb=shift;\
1228 \n    my $f=vtmpnam();\n\n    $value= &safe_system\
1229  (\"t_coffee -other_pg extract_from_pdb -is_releas\
1230 ed_pdb_name $pdb > $f\");\n    my $r=&file2string \
1231 ($f);\n    chomp($r);\n    return $r;\n  }\nsub bl\
1232 ast_msa\n  {\n    my ($blast,$infile,$db,$outfile)\
1233 =@_;\n    my ($a, %s1, %s, %qs, %qs1);\n    my $se\
1234 qfile;\n    my $SEQ=new FileHandle;\n    my $seqfi\
1235 le=\"seqfile\";\n    my @txt;\n\n\n    %s1=&read_f\
1236 asta_seq ($db);\n    %s=&fasta_hash2index_hash(%s1\
1237 );\n    %qs1=&read_fasta_seq ($infile);\n    %qs=&\
1238 fasta_hash2index_hash(%qs1);\n\n\n    #&safe_syste\
1239 m (\"formatdb -i $db\");\n    if ($blast eq \"blas\
1240 tp\"){&safe_system  (\"blastall -i $infile -d $db \
1241 -m7 -p blastp -o io\");}\n    elsif ($blast eq \"b\
1242 lastn\"){&safe_system  (\"blastn -query $infile -d\
1243 b $db -outfmt 5 -word_size 4 -out io\");}\n\n    &\
1244 set_blast_type (\"io\");\n\n\n    my %FB=&xml2tag_\
1245 list (\"io\", \"Iteration\");\n    open (F, \">$ou\
1246 tfile\");\n    print F \"! TC_LIB_FORMAT_01\\n\";\\
1247 n    print F \"$s{n}\\n\";\n    for ( my $a=0; $a<\
1248 $s{n}; $a++)\n      {\n print F \"$s{$a}{name} $s{\
1249 $a}{len} $s{$a}{seq}\\n\";\n      }\n\n\n    for (\
1250  my $a=0; $a<$FB{n}; $a++)\n      {\n   my %p=blast_\
1251 xml2profile ($qs{$a}{name}, $qs{$a}{seq},100, 0, 0\
1252 , $FB{$a}{body});\n     my $query=$p{0}{name};\n        my $i\
1253 = $s1{$query}{order}+1;\n       for (my $b=1; $b<$p{n}; \
1254 $b++)\n   {\n       my $l=length ($p{$b}{Qseq});\n       \
1255    my $hit=$p{$b}{definition};\n            my $Qstart=$p\
1256 {$b}{Qstart};\n     my $Hstart=$p{$b}{Hstart};\n         \
1257    my $identity=$p{$b}{identity};\n         my @lrQ=sp\
1258 lit (//,$p{$b}{Qseq});\n            my @lrH=split (//,$p{\
1259 $b}{Hseq});\n\n     my $j= $s1{$hit}{order}+1;\n         \
1260    #if ( $j==$i){next;}\n           printf F \"# %d %d\\\
1261 n\", $i, $j;\n      #  print  F \"\\n$p{$b}{Qseq} (\
1262 $Qstart)\\n$p{$b}{Hseq} ($Hstart)\";\n      for ($c\
1263 =0; $c<$l; $c++)\n            {\n               my $rQ=$lrQ[$c];\n              \
1264 my $rH=$lrH[$c];\n              my $n=0;\n\n            if ($rQ ne \"-\"\
1265 ){$n++, $Qstart++;}\n           if ($rH ne \"-\"){$n++; $Hs\
1266 tart++;}\n\n            if ( $n==2)\n             {\n               printf F \\
1267 "\\t%d %d %d\\n\", $Qstart-1, $Hstart-1,$identity;\
1268 \n                }\n         }\n         }\n      }\n    print F \"! \
1269 SEQ_1_TO_N\\n\";\n    close (F);\n    return $outp\
1270 ut;\n  }\n\nsub blast_msa_old\n  {\n    my ($infil\
1271 e,$outfile)=@_;\n    my ($a, %seq);\n    %s1=&read\
1272 _fasta_seq ($infile);\n    foreach $s (keys (%s1))\
1273 \n      {\n     $i=$s1{$s}{order};\n    $s{$i}{name}=$s;\\
1274 n       $s{$i}{seq}=$s1{$s}{seq};\n     $s{$i}{len}=length( \
1275 $s{$i}{seq});\n $s{n}++;\n      }\n    &safe_syste\
1276 m (\"formatdb -i $infile\");\n    &safe_system (\"\
1277 blastall -i $infile -d $infile -m7 -o io\");\n    \
1278 &set_blast_type (\"io\");\n\n    %FB=&xml2tag_list\
1279  (\"io\", \"Iteration\");\n\n    open (F, \">$outf\
1280 ile\");\n    print F \"! TC_LIB_FORMAT_01\\n\";\n \
1281    print F \"$s{n}\\n\";\n    for ( $a=0; $a<$s{n}\
1282 ; $a++)\n      {\n      print F \"$s{$a}{name} $s{$a}{l\
1283 en} $s{$a}{seq}\\n\";\n      }\n    for ( $a=0; $a\
1284 <$FB{n}; $a++)\n      {\n       %p=blast_xml2profile ($s\
1285 {$a}{name}, $s{$a}{seq},100, 0, 0, $FB{$a}{body});\
1286 \n      for ($b=1; $b<$p{n}; $b++)\n      {\n       my $l=le\
1287 ngth ($p{$b}{Qseq});\n      my $hit=$p{$b}{definiti\
1288 on};\n      my $Qstart=$p{$b}{Qstart};\n            my $Hs\
1289 tart=$p{$b}{Hstart};\n      my $identity=$p{$b}{ide\
1290 ntity};\n           my @lrQ=split (//,$p{$b}{Qseq});\n   \
1291    my @lrH=split (//,$p{$b}{Hseq});\n       my $i= $\
1292 s1{$s{$a}{name}}{order}+1;\n        my $j= $s1{$hit}{\
1293 order}+1;\n         #if ( $j==$i){next;}\n          printf \
1294 F \"# %d %d\\n\", $i, $j;\n         #  print  F \"\\n$\
1295 p{$b}{Qseq} ($Qstart)\\n$p{$b}{Hseq} ($Hstart)\";\\
1296 n           for ($c=0; $c<$l; $c++)\n         {\n               my $rQ=\
1297 $lrQ[$c];\n             my $rH=$lrH[$c];\n              my $n=0;\n\n            if \
1298 ($rQ ne \"-\"){$n++, $Qstart++;}\n              if ($rH ne \"-\
1299 \"){$n++; $Hstart++;}\n\n               if ( $n==2)\n             {\n            \
1300    printf F \"\\t%d %d %d\\n\", $Qstart-1, $Hstart\
1301 -1,$identity;\n           }\n         }\n         }\n      }\n   \
1302  print F \"! SEQ_1_TO_N\\n\";\n    close (F);\n   \
1303  return $output;\n\n  }\n\nsub seq2msa\n  {\n    m\
1304 y ($mode, $infile, $method, $param, $outfile,$data\
1305 base)=@_;\n    &set_temporary_dir (\"set\",$infile\
1306 ,\"seq.pep\", $database, \"db.pep\");\n    $param.\
1307 =\" >/dev/null 2>&1 \";\n\n\n    #make sure test.p\
1308 ep is in FASTA\n    &safe_system (\"t_coffee -othe\
1309 r_pg seq_reformat -in seq.pep -output fasta_seq > \
1310 x\");\n    `mv x seq.pep`;\n\n    if ( $method eq \
1311 \"blastp\")\n      {\n  &blast_msa (\"blastp\",\"se\
1312 q.pep\",$database,\"result.aln\");\n      }\n    e\
1313 lsif ( $method eq \"blastn\")\n      {\n        &blast_ms\
1314 a (\"blastn\",\"seq.pep\",$database,\"result.aln\"\
1315 );\n      }\n\n    elsif ( $method eq \"muscle\")\\
1316 n      {\n      `muscle -in seq.pep -out result.aln $pa\
1317 ram`;\n      }\n    elsif ( $method eq \"probcons\\
1318 ")\n      {\n   `probcons seq.pep >result.aln 2>/dev\
1319 /null`;\n      }\n    elsif ( $method eq \"mafft\"\
1320 )\n      {\n    `mafft --quiet --localpair --maxitera\
1321 te 1000 seq.pep> result.aln  2>/dev/null`\n      }\
1322 \n    elsif ( $method=~/prank/)\n      {\n      `$metho\
1323 d -d=seq.pep -o=result.aln -quiet 2>/dev/null`;\n       \
1324 `mv result.aln.1.fas result.aln`;\n      }\n    el\
1325 sif ($method eq \"clustalo\")\n      {\n        `clustalo\
1326  -i seq.pep > result.aln`;\n      }\n    else\n   \
1327    {\n  `$method -infile=seq.pep -outfile=result.al\
1328 n`;\n      }\n\n    &set_temporary_dir (\"unset\",\
1329 $mode, $method,\"result.aln\",$outfile);\n    myex\
1330 it ($EXIT_SUCCESS);\n  }\n\nsub seq2thread_pair\n \
1331  {\n    my ($mode, $infile, $pdbfile1, $method, $p\
1332 aram, $outfile)=@_;\n    &set_temporary_dir (\"set\
1333 \",$infile,\"seq.pep\",$pdbfile1,\"struc.pdb\");\n\
1334     if ($method eq \"fugueali\")\n      {\n     #Env V\
1335 ariable that need to be defined for Fugue\n     if (!$\
1336 ENV{FUGUE_LIB_LIST}){$ENV{FUGUE_LIB_LIST}=\"DUMMY\\
1337 ";}\n   if (!$ENV{HOMSTRAD_PATH})  {$ENV{HOMSTRAD_PA\
1338 TH}=\"DUMMY\";}\n       if (!$ENV{HOMS_PATH}){$ENV{HOMS_\
1339 PATH}=\"DUMMY\";}\n\n   `joy struc.pdb >x 2>x`;\n       &c\
1340 heck_file(\"struc.tem\", \"Joy failed [FATAL:$PROG\
1341 RAM/$method]\");\n      `melody -t struc.tem >x 2>x`;\n\
1342         &check_file(\"struc.tem\", \"Melody failed [FATAL\
1343 :$PROGRAM/$method]\");\n        `fugueali -seq seq.pep -p\
1344 rf struc.fug -print > tmp_result.aln`;\n\n      &check_\
1345 file(\"tmp_result.aln\", \"Fugue failed [FATAL:$PR\
1346 OGRAM/$method]\");\n    &safe_system (\"t_coffee -oth\
1347 er_pg seq_reformat -in tmp_result.aln -output fast\
1348 a_aln >result.aln\");\n      }\n    elsif ( $metho\
1349 d eq \"t_coffee\")\n      {\n   &safe_system (\"t_co\
1350 ffee -in Pstruc.pdb Sseq.pep Mslow_pair -outfile r\
1351 esult.aln -quiet\");\n      }\n    else\n      {\n\
1352         &safe_system (\"$method -infile=seq.pep -pdbfile1\
1353 =struc.pdb -outfile=result.aln $param>x 2>x\");\n \
1354      }\n    &set_temporary_dir (\"unset\",$mode,$m\
1355 ethod,\"result.aln\",$outfile);\n    myexit ($EXIT\
1356 _SUCCESS);\n  }\nsub seq2pdbid_pair\n  {\n    my (\
1357 $mode, $pdbfile1, $pdbfile2, $method, $param, $out\
1358 file)=@_;\n    my ($name);\n\n\n    &set_temporary\
1359 _dir (\"set\");\n    $name=$pdbfile1.\" \".$pdbfil\
1360 e2;\n\n    if (    &cache_file(\"GET\",\"\",\"$nam\
1361 e\",\"$method\",\"dali\",$outfile,\"EBI\"))\n     \
1362  {return $outfile;}\n    else\n      {\n        if ($meth\
1363 od eq \"daliweb\")\n      {\n       $pdbfile1=~/(....)(\
1364 .)/;\n      $id1=$1; $c1=$2;\n\n            $pdbfile2=~/(.\
1365 ...)(.)/;\n         $id2=$1; $c2=$2;\n\n            $command=\
1366 \"t_coffee -other_pg dalilite.pl --pdb1 $id1 --cha\
1367 inid1 $c1 --pdb2 $id2 --chainid2 $c2 --email=$EMAI\
1368 L  >dali_stderr 2>dali_stderr\";\n          $dali=`$com\
1369 mand`;\n\n          open (F, \"dali_stderr\");\n            wh\
1370 ile (<F>)\n           {\n               if ( /JobId: dalilite-(\\S+\
1371 )/)\n           {\n               $jobid=$1;\n          }\n           }\n           clos\
1372 e (F);\n            unlink (\"dali_stderr\");\n\n           $ou\
1373 tput1=\"dalilite-$jobid.txt\";\n            if ( -e $outp\
1374 ut1)\n        {\n               unlink ($output1);\n            &url2file \
1375 (\"http://www.ebi.ac.uk/Tools/es/cgi-bin/jobresult\
1376 s.cgi/dalilite/dalilite-$jobid/aln.html\", \"outpu\
1377 t2\");\n\n              if ( -e \"output2\")\n            {\n               my \
1378 ($seq1, $seq2);\n                   $seq1=$seq2=\"\";\n\n                   \
1379 open (F, \"output2\");\n                    while (<F>)\n                    \
1380  {\n                    $l=$_;\n                        if ( $l=~/Query\\s+(\\S+)/)\n                   \
1381   {\n                       $seq1.=$1;\n                          }\n                   elsif ( $l=~/Sb\
1382 jct\\s+(\\S+)/)\n                         {\n                       $seq2.=$1;\n                          }\
1383 \n                    }\n                   close (F);\n                    unlink (\"out\
1384 put2\");\n                  if ($seq1 ne \"\" && $seq2 ne \"\"\
1385 )\n                   {\n                       $output3=\">$A\\n$seq1\\n>$B\\n$s\
1386 eq2\\n\";\n                     $output3=~s/\\./-/g;\n                  open (F, \"\
1387 >result.aln\");\n                       print F \"$output3\";\n                 clos\
1388 e (F);\n                      }\n                 }\n         }\n         }\n      }\\
1389 n    &cache_file(\"SET\",\"\",\"$name\",\"$method\\
1390 ",\"dali\",\"result.aln\",\"EBI\");\n    &set_temp\
1391 orary_dir (\"unset\",$mode, $method, \"result.aln\\
1392 ",$outfile);\n    myexit ($EXIT_SUCCESS);\n  }\nsu\
1393 b seq2pdb_pair\n  {\n    my ($mode, $pdbfile1, $pd\
1394 bfile2, $method, $param, $outfile)=@_;\n\n    &set\
1395 _temporary_dir (\"set\",$pdbfile1,\"pdb1.pdb\",$pd\
1396 bfile2,\"pdb2.pdb\");\n    if ($method eq \"t_coff\
1397 ee\")\n      {\n        &safe_system (\"t_coffee -in Ppdb\
1398 1.pdb Ppdb2.pdb -quiet -outfile=result.aln\");\n  \
1399     }\n    elsif ( $method eq \"DaliLite\")\n     \
1400  {\n    if ( &safe_system (\"DaliLite -pairwise pdb1.\
1401 pdb pdb2.pdb >tmp1\")==$EXIT_SUCCESS)\n   {\n       \
1402  my ($seq1, $seq2);\n        $seq1=$seq2=\"\";\n\n       \
1403     open (F, \"tmp1\");\n            while (<F>)\n           \
1404   {\n            $l=$_;\n                if ( $l=~/Query\\s+(\\S+)/)\n          \
1405    {\n               $seq1.=$1;\n                  }\n           elsif ( $l=~/S\
1406 bjct\\s+(\\S+)/)\n                 {\n               $seq2.=$1;\n                  \
1407 }\n            }\n           close (F);\n            unlink (\"tm\
1408 p1\");\n             if ($seq1 ne \"\" && $seq2 ne \"\")\\
1409 n              {\n               my $output3=\">$A\\n$seq1\\n>$B\\n$\
1410 seq2\\n\";\n             $output3=~s/\\./-/g;\n          open (F, \\
1411 ">result.aln\");\n               print F \"$output3\";\n                 clo\
1412 se (F);\n              }\n         }\n  else\n    {\n       print\
1413  \"ERROR: DalLite failed to align the considered s\
1414 tructures[tc_generic_method.pl]\\n\";\n   }\n     \
1415  }\n    elsif ( $method eq \"TMalign\")\n      {\n\
1416         if ( &safe_system (\"TMalign pdb1.pdb pdb2.pdb >t\
1417 mp1\")==$EXIT_SUCCESS)\n          {\n       `tail -4 tmp1 >\
1418  tmp2`;\n\n         open (F, \"tmp2\");\n           while (<\
1419 F>)\n         {\n               unshift(@l, $_);\n            }\n           \
1420 close (F);\n        open (F, \">result.aln\");\n            \
1421 $l[3]=~s/[^a-zA-Z0-9-]/\\-/g;\n     $l[1]=~s/[^a-z\
1422 A-Z0-9-]/\\-/g;\n           print F \">$A\\n$l[3]\\n>$B\\
1423 \n$l[1]\\n\";\n     close (F);\n          }\n   else\n    {\\
1424 n           print \"ERROR: TMalign failed to align the c\
1425 onsidered structures[tc_generic_method.pl]\\n\";\n\
1426             `rm result.aln >/dev/null 2>/dev/null`;\n     }\
1427 \n      }\n    elsif ( $method eq \"mustang\")\n  \
1428     {\n if ( &safe_system (\"mustang -i pdb1.pdb p\
1429 db2.pdb -F fasta >/dev/null 2>/dev/null\")==$EXIT_\
1430 SUCCESS)\n        {\n       `mv results.afasta result.aln\
1431 `;\n      }\n   else\n    {\n       print \"ERROR: mustang\
1432  failed to align the considered structures[tc_gene\
1433 ric_method.pl]\\n\";\n      `rm result.aln >/dev/nu\
1434 ll 2>/dev/null`;\n        }\n      }\n    else\n      {\
1435 \n      if ( &safe_system (\"$method -pdbfile1=pdb1.pep\
1436  -pdbfile2=pdb2.pdb -outfile=result.aln $param>x 2\
1437 >x\")==$EXIT_SUCCESS)\n   {\n       `mv results.afas\
1438 ta result.aln`;\n         }\n   else\n    {\n       print \"E\
1439 RROR: $method failed to align the considered struc\
1440 tures[tc_generic_method.pl]\\n\";\n         `rm result\
1441 .aln >/dev/null 2>/dev/null`;\n   }\n      }\n    \
1442 &set_temporary_dir (\"unset\",$mode, $method, \"re\
1443 sult.aln\",$outfile);\n    myexit ($EXIT_SUCCESS);\
1444 \n  }\n\nsub seq2rnapdb_pair\n  {\n    my ($mode, \
1445 $pdbfile1, $pdbfile2, $method, $param, $outfile)=@\
1446 _;\n    \n    if ($method eq \"runsara.py\")\n    \
1447   {\n   my $path=$ENV{PATH};\n  \n      if ($ENV{X3DNA_4_S\
1448 ARA}){$ENV{PATH}=\"$ENV{X3DNA_4_SARA}:$path\";}\n       \
1449 \n      open(TMP,\"<$pdbfile1\");\n     my $count = 0;\n        my\
1450  $line;\n       while (<TMP>)\n   {\n       $line = $_;\n       \
1451     if ($count ==1)\n         {\n               last;\n       }\n\
1452             $count += 1;\n        }\n   \n      \n      $chain1 = substr($\
1453 line,length($line)-3,1);\n      \n      close TMP;\n    open(TM\
1454 P,\"<$pdbfile2\");\n    my $count = 0;\n        while (<TMP>\
1455 )\n       {\n       $line = $_;\n           if ($count ==1)\n   \
1456       {\n               last;\n       }\n           $count += 1;\n        \
1457 }\n     $chain2 = substr($line,length($line)-3,1);\n    c\
1458 lose TMP;\n     \n      $tmp_file=&vtmpnam();\n \n      safe_sys\
1459 tem(\"runsara.py $pdbfile1 $chain1 $pdbfile2 $chai\
1460 n2 -s -o $tmp_file --limitation 5000 > /dev/null 2\
1461 > /dev/null\");\n       if ($ENV{X3DNA_4_SARA}){$ENV{PAT\
1462 H}=$path;}\n    \n      open(TMP,\"<$tmp_file\") or die \"\
1463 cannot open the sara tmp file:$!\\n\";\n        open(OUT,\
1464 \">$outfile\") or die \"cannot open the $outfile f\
1465 ile:$!\\n\";\n  \n      my $switch = 0;\n       my $seqNum = 0\
1466 ;\n     foreach my $line (<TMP>)\n        {\n       next unle\
1467 ss ($line=~/SARAALI/);\n            if ($line=~/>/)\n      \
1468    {\n          $switch =0;\n           print OUT \">seq$seqNum\\n\\
1469 ";\n            $seqNum++;\n          }\n           if ($switch < 2){\
1470 \n            $switch++;\n            next;\n       }\n     \n\
1471             if ($line =~/REMARK\\s+SARAALI\\s+([^\\*]+)\\\
1472 */)\n         {\n               my $string = $1;\n              print OUT \"$\
1473 string\\n\";\n        }\n         }\n   close TMP;\n    close \
1474 OUT;\n  unlink($tmp_file);\n      }\n  }\nsub seq2p\
1475 rofile_pair\n{\n        my ($mode, $profile1, $profile2, \
1476 $method, $param, $outfile)=@_;\n\n\n    if ($method e\
1477 q \"clustalw\")\n       {\n             &set_temporary_dir (\"set\"\
1478 ,$profile1,\"prf1.aln\",$profile2,\"prf2.aln\");\n\
1479                 `clustalw -profile1=prf1.aln -profile2=prf2.aln \
1480 -outfile=result.aln`;\n         &set_temporary_dir (\"uns\
1481 et\",$mode, $method, \"result.aln\",$outfile);\n        }\
1482 \n      elsif ( $method eq \"clustalo\")\n      {\n             `clusta\
1483 lo --p1 $profile1 --p2 $profile2 -o $outfile --for\
1484 ce`;\n  }\n     elsif ( $method eq \"hhalign\")\n       {\n             \
1485 hhalign ( $profile1,$profile2,$outfile,$param);\n       \
1486 }\n     else\n  {\n             `$method -profile1=prf1.aln -profi\
1487 le2=prf2.aln -outfile=result.aln $param>x 2>x`;\n       \
1488 }\n     myexit ($EXIT_SUCCESS);\n}\n\nsub pg_is_instal\
1489 led\n  {\n    my @ml=@_;\n    my ($r, $p, $m);\n  \
1490   my $supported=0;\n\n    my $p=shift (@ml);\n    \
1491 if ($p=~/::/)\n      {\n        if (safe_system (\"perl -\
1492 M$p -e 1\")==$EXIT_SUCCESS){return 1;}\n        else {ret\
1493 urn 0;}\n      }\n    else\n      {\n   $r=`which $p\
1494  2>/dev/null`;\n        if ($r eq \"\"){$r=0;}\n        else {$r\
1495 =1;}\n\n        if ($r==0 && is_blast_package ($p)){retur\
1496 n pg_is_installed (\"legacy_blast.pl\");}\n     else {\
1497 return $r;}\n      }\n  }\n\nsub is_blast_package\\
1498 n  {\n    my $p=shift;\n    if ( $p=~/blastp/){ret\
1499 urn 1;}\n    elsif ($p=~/blastall/){return 1;}\n  \
1500   elsif ($p=~/blastn/){return 1;}\n    elsif ($p=~\
1501 /blastx/){return 1;}\n    elsif ($p=~/formatdb/){r\
1502 eturn 1;}\n    else {return 0;}\n  }\n\nsub check_\
1503 internet_connection\n  {\n    my $internet;\n    m\
1504 y $tmp;\n    &check_configuration ( \"wget\");\n\n\
1505     $tmp=&vtmpnam ();\n\n    if     (&pg_is_instal\
1506 led    (\"wget\")){`wget www.google.com -O$tmp >/d\
1507 ev/null 2>/dev/null`;}\n    elsif  (&pg_is_install\
1508 ed    (\"curl\")){`curl www.google.com -o$tmp >/de\
1509 v/null 2>/dev/null`;}\n\n    if ( !-e $tmp || -s $\
1510 tmp < 10){$internet=0;}\n    else {$internet=1;}\n\
1511     if (-e $tmp){unlink $tmp;}\n\n    return $inte\
1512 rnet;\n  }\nsub check_pg_is_installed\n  {\n    my\
1513  @ml=@_;\n    my $r=&pg_is_installed (@ml);\n    i\
1514 f (!$r && $p=~/::/)\n      {\n  print STDERR \"\\nY\
1515 ou Must Install the perl package $p on your system\
1516 .\\nRUN:\\n\\tsudo perl -MCPAN -e 'install $pg'\\n\
1517 \";\n      }\n    elsif (!$r)\n      {\n        myexit(fl\
1518 ush_error(\"\\nProgram $p Supported but Not Instal\
1519 led on your system\"));\n      }\n    else\n      \
1520 {\n     return 1;\n      }\n  }\nsub set_temporary_dir\
1521 \n  {\n    my @list=@_;\n    my $dir_mode, $a, $mo\
1522 de, $method;\n\n    $dir_mode=shift (@list);\n\n\n\
1523     if ( $dir_mode eq \"set\")\n      {\n       $initial\
1524 _dir=cwd();\n   if ( !$tmp_dir)\n         {\n       $rand=ra\
1525 nd (100000);\n      $tmp_dir=\"$TMPDIR/tmp4tcoffee_\
1526 profile_pair_dir_$$\\_P_$rand\";\n        }\n   if ( !-d \
1527 $tmp_dir)\n       {\n       push (@TMPDIR_LIST, $tmp_dir\
1528 );\n        `mkdir $tmp_dir`;\n   }\n\n for ( $a=0; $\
1529 a<=$#list; $a+=2)\n           {\n               if (-e $list[$a]){ \
1530 `cp $list[$a] $tmp_dir/$list[$a+1]`;}\n       }\n       \
1531 chdir $tmp_dir;\n      }\n    elsif ( $dir_mode eq\
1532  \"unset\")\n      {\n  $mode=shift (@list);\n  $met\
1533 hod=shift (@list);\n\n  if (!-e $list[0])\n       {\n    \
1534   myexit(flush_error(\"Program $method failed to p\
1535 roduce $list[1]\" ));\n     myexit ($EXIT_FAILURE)\
1536 ;\n       }\n   else\n    {\n       chdir $initial_dir;\n        \
1537    # `t_coffee -other_pg seq_reformat -in $tmp_dir\
1538 /$list[0] -output fasta_aln -out $tmp_dir/result2.\
1539 aln`;\n     `cp $tmp_dir/$list[0] $tmp_dir/result2\
1540 .aln`;\n            if ( $list[1] eq \"stdout\")\n            \
1541 {\n             open (F, \"$tmp_dir/result2.aln\");\n           while \
1542 (<F>){print $_;}close(F);\n           }\n           else\n       \
1543      {\n                `mv $tmp_dir/result2.aln $list[1]`;\n     \
1544     }\n     shift (@list); shift (@list);\n         fo\
1545 reach $f (@list)\n            {\n               if (-e (\"$tmp_dir/$\
1546 f\")){`mv $tmp_dir/$f .`;}\n          }\n         }\n      \
1547 }\n  }\n\n\n\n\nsub my_get_opt\n  {\n    my @list=\
1548 @_;\n    my ($cl, $a, $argv, @argl);\n\n    \n    \
1549 @argl=();\n    $cl=shift @list;\n    for ( my $a=0\
1550 ; $a<=$#list; $a+=3)\n      {\n my $option=$list[$\
1551 a];\n   my $optional=$list[$a+1];\n     my $status=$list\
1552 [$a+2];\n       my $argv=\"\";\n        if ($cl=~/$option(\\S+)\
1553 /){$argv=$1;}\n @argl=(@argl,$argv);\n\n\n      #$optio\
1554 nal:0=>optional\n       #$optional:1=>must be set\n     #$st\
1555 atus: 0=>no requirement\n       #$status: 1=>must be an \
1556 existing file\n #$status: 2=>must be an installed \
1557 package\n       \n\n    if ($optional==0){;}\n  elsif ( $opt\
1558 ional==1 && $argv eq \"\")\n      {\n       myexit(flus\
1559 h_error( \"ERROR: Option $option must be set\"));\\
1560 n           myexit ($EXIT_FAILURE);\n     }\n   if ($status=\
1561 =0){;}\n        elsif ($status ==1 && $argv ne \"\" && !-\
1562 e $argv)\n        {\n       myexit(flush_error( \"File [$\
1563 argv] must exist\"));\n     myexit ($EXIT_FAILURE)\
1564 ;\n       }\n   elsif ( $status==2 && $argv ne \"\" && &\
1565 check_pg_is_installed ($argv)==0)\n       {\n       myex\
1566 it(flush_error( \" $argv is not installed\"));\n         \
1567    myexit ($EXIT_FAILURE);\n      }\n      }\n    ret\
1568 urn @argl;\n    }\n\nsub check_file\n  {\n    my (\
1569 $file, $msg)=@_;\n\n    if ( !-e $file)\n      {\n\
1570         myexit(flush_error(\"$msg\"));\n      }\n    }\ns\
1571 ub hhalign\n  {\n    my ($aln1, $aln2, $outfile, $\
1572 param)=@_;\n    my $h1, $h2;\n\n    $h{0}{index}=0\
1573 ;\n    $h{1}{index}=1;\n\n    $h{0}{aln}=$aln1;\n \
1574    $h{1}{aln}=$aln2;\n\n\n\n    %{$h{0}}=aln2psi_p\
1575 rofile (%{$h{0}});\n    %{$h{1}}=aln2psi_profile (\
1576 %{$h{1}});\n\n    $param=~s/#S/ /g;\n    $param=~s\
1577 /#M/\\-/g;\n    $param=~s/#E/\\=/g;\n\n\n\n    $co\
1578 mmand=\"hhalign -i $h{0}{a3m} -t $h{1}{a3m} -tc $o\
1579 utfile.tmp -rank 1 -mapt 0 $param\";\n    `$comman\
1580 d`;\n\n  #  `hhalign -i $h{0}{a3m} -t $h{1}{a3m} -\
1581 tc $outfile.tmp -rank 1 -mapt 0 -gapf 0.8 -gapg 0.\
1582 8`;\n\n\n    # To run global use the following\n\n\
1583     open (I, \"$outfile.tmp\");\n    open (O, \">$\
1584 outfile\");\n    $h{0}{cons}=s/\\./x/g;\n    $h{1}\
1585 {cons}=s/\\./x/g;\n\n    print O \"! TC_LIB_FORMAT\
1586 _01\\n2\\n$h{0}{name} $h{0}{len} $h{0}{seq}\\n$h{1\
1587 }{name} $h{1}{len} $h{1}{seq}\\n#1 2\\n\";\n\n    \
1588 while (<I>)\n      {\n  if (/(\\d+)\\s+(\\d+)\\s+(\\
1589 \d+)/)\n          {\n       print O \"\\t$h{0}{$1}\\t$h{1}{\
1590 $2}\\t$3\\n\";\n          }\n      }\n    print O \"! SEQ\
1591 _1_TO_N\\n\";\n\n    close (O);\n    close (I);\n \
1592  }\n\nsub aln2psi_profile\n  {\n    my (%h)=@_;\n \
1593    my ($aln,$i,$hv, $a, @c, $n);\n\n\n    $i=$h{in\
1594 dex};\n    $aln=$h{aln};\n\n    `cp $aln $$.hhh_al\
1595 n`;\n    $command=\"t_coffee -other_pg seq_reforma\
1596 t -in $aln -output hasch\";\n    $hv=`$command`;ch\
1597 omp ($hv);\n\n    $h{a2m}=\"$tmp/$hv.tmp4hhpred.a2\
1598 m\";\n    $h{a3m}=\"$tmp/$hv.tmp4hhpred.a3m\";\n  \
1599   if ( -e $h{a3m}){;}\n    else\n      {\n      $x=`whi\
1600 ch hhconsensus`;\n      `hhconsensus  -M 50 -i $h{aln} \
1601 -oa2m $h{a2m}`;\n       if (!-e $h{a2m})\n        {\n       pri\
1602 nt STDERR \"Program tc_generic_method.pl FAILED to\
1603  run:\\n\\thhconsensus  -M 50 -i $h{aln} -oa2m $h{\
1604 a2m}\";\n           myexit ($EXIT_FAILURE);\n     }\n\n `h\
1605 hconsensus  -M 50 -i $h{aln} -oa3m $h{a3m}`;\n  if \
1606 (!-e $h{a3m})\n   {\n       print STDERR \"Program t\
1607 c_generic_method.pl FAILED to run:\\n\\thhconsensu\
1608 s  -M 50 -i $h{aln} -oa3m $h{a3m}\";\n      myexit \
1609 ($EXIT_FAILURE);\n        }\n       `buildali.pl $h{a3m\
1610 } -n 1`;\n      }\n\n\n    $h{a2m_seq}=`head -n 2 \
1611 $h{a2m} | grep -v \">\"`;chomp ($h{a2m_seq});\n   \
1612  $h{a3m_seq}=`head -n 2 $h{a3m} | grep -v \">\"`;c\
1613 homp ($h{a3m_seq});\n    $h{cons}=$h{a2m_seq};\n  \
1614   $h{seq}=`head -n 2 $h{aln} | grep -v \">\"`;chom\
1615 p ($h{seq});\n\n\n\n    @c=split (//, $h{cons});\n\
1616     $h{len}=$#c+1;\n    for ($n=0,$a=0, $b=0; $a<$\
1617 h{len};$a++)\n      {\n if ( $c[$a]=~/[A-Z]/)\n   \
1618 {\n         $h{++$n}=++$b;\n\n    }\n   elsif ( $c[$a]=~/\
1619 [a-z\\.]/)\n      {\n       ++$b;\n       }\n      }\n\n   \
1620  $name=`head -n 2 $h{aln} | grep \">\"`;\n    $nam\
1621 e=~/\\>(\\S+)/;\n    $h{name}=$1;\n\n    `cp $h{a2\
1622 m} $i.a2m`;\n    `cp $h{a3m} $i.a3m`;\n    `cp $h{\
1623 aln} $i.hh_aln`;\n\n    return %h;\n  }\nsub read_\
1624 fasta_seq_index\n  {\n    my $f=@_[0];\n    my %hs\
1625 eq;\n    my (@seq, @com, @name);\n    my ($a, $s,$\
1626 nseq);\n\n    open (F, $f);\n    while (<F>)\n    \
1627   {\n   $s.=$_;\n      }\n    close (F);\n\n\n    @n\
1628 ame=($s=~/>(\\S*).*\\n[^>]*/g);\n\n    @seq =($s=~\
1629 />.*.*\\n([^>]*)/g);\n    @com =($s=~/>\\S*(.*)\\n\
1630 ([^>]*)/g);\n\n\n    $nseq=$#name+1;\n\n    for ($\
1631 a=0; $a<$nseq; $a++)\n      {\n my $s;\n        my $n=$na\
1632 me[$a];\n       $hseq{$a}{name}=$n;\n   $seq[$a]=~s/[^A-Za\
1633 -z]//g;\n       $hseq{$a}{order}=$a;\n  $hseq{$a}{seq}=$s\
1634 eq[$a];\n       $hseq{$a}{com}=$com[$a];\n\n      }\n   \
1635  return %hseq;\n  }\nsub read_fasta_seq\n  {\n    \
1636 my $f=@_[0];\n    my %hseq;\n    my (@seq, @com, @\
1637 name);\n    my ($a, $s,$nseq);\n\n    open (F, $f)\
1638 ;\n    while (<F>)\n      {\n   $s.=$_;\n      }\n  \
1639   close (F);\n\n\n    @name=($s=~/>(\\S*).*\\n[^>]\
1640 */g);\n\n    @seq =($s=~/>.*.*\\n([^>]*)/g);\n    \
1641 @com =($s=~/>\\S*(.*)\\n([^>]*)/g);\n\n\n    $nseq\
1642 =$#name+1;\n\n    for ($a=0; $a<$nseq; $a++)\n    \
1643   {\n   my $s;\n        my $n=$name[$a];\n      $hseq{$n}{name}=\
1644 $n;\n   $seq[$a]=~s/[^A-Za-z]//g;\n     $hseq{$n}{order}\
1645 =$a;\n  $hseq{$n}{seq}=$seq[$a];\n      $hseq{$n}{com}=$\
1646 com[$a];\n\n      }\n    return %hseq;\n  }\n\n\ns\
1647 ub read_fasta_aln\n  {\n    my $f=@_[0];\n    my %\
1648 hseq;\n    my (@seq, @com, @name);\n    my ($a, $s\
1649 ,$nseq);\n\n    open (F, $f);\n    while (<F>)\n  \
1650     {\n $s.=$_;\n      }\n    close (F);\n\n\n    \
1651 @name=($s=~/>(\\S*).*\\n[^>]*/g);\n\n    @seq =($s\
1652 =~/>.*.*\\n([^>]*)/g);\n    @com =($s=~/>\\S*(.*)\\
1653 \n([^>]*)/g);\n\n\n    $nseq=$#name+1;\n\n    for \
1654 ($a=0; $a<$nseq; $a++)\n      {\n       my $s;\n        my $n=$\
1655 name[$a];\n     $hseq{$n}{name}=$n;\n   $seq[$a]=~s/[^A-\
1656 Za-z-.()[\\]]//g;\n     $hseq{$n}{order}=$a;\n  $hseq{$\
1657 n}{seq}=$seq[$a];\n     $hseq{$n}{com}=$com[$a];\n\n  \
1658     }\n    return %hseq;\n  }\n\nsub recode_name2\\
1659 n{\n    my ($in)=shift;\n       my $mode=shift;\n\n     my %seq\
1660 ;\n     my $new_name;\n\n       if (! -e $in){return;}\n\n      #\
1661 needed by ClustalOmega to avoid very long names\n       \
1662 open (INFILE, \"+<$in\");\n\n   my $line;\n\n   if ($m\
1663 ode eq \"code\")\n      {\n             chomp($line = <INFILE>);\n\
1664                 my $line_length = length($line);\n              $new_name=++\
1665 $RECODE_N;\n            $new_name=\">$new_name\";\n             my $new\
1666 _length = length($new_name);\n          $RECODE {$new_name\
1667 }=$line;\n              for ($count = $new_length; $count < $l\
1668 ine_length; $count++)\n         {\n                     $new_name .= \" \";\
1669 \n              }\n             $new_name=\"$new_name\\n\";\n           seek INFIL\
1670 E, 0, 0\n                       or die \"could not seek: $!\";\n                prin\
1671 t INFILE \"$new_name\";\n       }\n     else\n  {\n             my $n_fo\
1672 und = 0;\n              my $file_pos=0;\n               $file_pos=tell INFI\
1673 LE;\n           while (<INFILE>)\n              {\n                     $line=$_;\n                     $li\
1674 ne =~ s/\\s*$//;\n\n                    $old_name= $RECODE{$line};\\
1675 n                       if ($old_name ne \"\")\n                        {\n                             seek INFILE,\
1676  $file_pos, 0\n                                 or die \"could not seek: $!\";\
1677 \n                              print INFILE \"$old_name\\n\";\n                                $file_po\
1678 s++;\n                          if ($file_pos == 2)\n                           {\n                                     print \\
1679 "stop\\n\";\n                                   break;\n                                }\n                     }\n                     $file_po\
1680 s=tell INFILE;\n                }\n\n   }\n\n\n close INFILE;\n}\n\
1681 \n\nsub recode_name\n{\n        my ($in)=shift;\n       my $mod\
1682 e=shift;\n      my $f=new FileHandle;\n my %seq;\n      my $\
1683 new_name;\n\n   if (! -e $in){return;}\n\n      #needed b\
1684 y ClustalOmega to avoid very long names\n       %seq=rea\
1685 d_fasta_aln ($in);\n\n  open ($f, \">$in\");\n  fore\
1686 ach my $s (keys(%seq))\n        {\n             if ($mode eq \"code\\
1687 ")\n            {\n                     $new_name=++$RECODE_N;\n                        $RECODE {$n\
1688 ew_name}=$seq{$s}{name};\n              }\n             else\n          {\n                     $ne\
1689 w_name=$RECODE{$seq{$s}{name}};\n               }\n             print $f \\
1690 ">$new_name\\n$seq{$s}{seq}\\n\";\n     }\n     close $f;\\
1691 n}\n\nsub fasta_hash2index_hash\n  {\n    my %s1=@\
1692 _;\n    my %s;\n    foreach my $s (keys (%s1))\n  \
1693     {\n my $i=$s1{$s}{order};\n $s{$i}{name}=$s;\n\
1694         $s{$i}{seq}=$s1{$s}{seq};\n     $s{$i}{len}=length( $\
1695 s{$i}{seq});\n  $s{n}++;\n      }\n    return %s;\n\
1696   }\nsub file_contains\n  {\n    my ($file, $tag, \
1697 $max)=(@_);\n    my ($n);\n    $n=0;\n\n    if ( !\
1698 -e $file && ($file =~/$tag/)) {return 1;}\n    els\
1699 if ( !-e $file){return 0;}\n    else\n      {\n op\
1700 en (FC, \"$file\");\n   while ( <FC>)\n   {\n       if\
1701  ( ($_=~/$tag/))\n            {\n               close (FC);\n           retur\
1702 n 1;\n        }\n           elsif ($max && $n>$max)\n      \
1703    {\n          close (FC);\n           return 0;\n           }\n           $\
1704 n++;\n    }\n      }\n    close (FC);\n    return 0\
1705 ;\n  }\n\n\nsub file2string\n  {\n    my $f=@_[0];\
1706 \n    my $string, $l;\n    open (F,\"$f\");\n    w\
1707 hile (<F>)\n      {\n\n $l=$_;\n        #chomp ($l);\n  $s\
1708 tring.=$l;\n      }\n    close (F);\n    $string=~\
1709 s/\\r\\n//g;\n    $string=~s/\\n//g;\n    return $\
1710 string;\n  }\n\n\nsub tag2value\n  {\n\n    my $ta\
1711 g=(@_[0]);\n    my $word=(@_[1]);\n    my $return;\
1712 \n\n    $tag=~/$word=\"([^\"]+)\"/;\n    $return=$\
1713 1;\n    return $return;\n  }\n\nsub hit_tag2pdbid\\
1714 n  {\n    my $tag=(@_[0]);\n    my $pdbid;\n\n    \
1715 $tag=~/id=\"(\\S+)\"/;\n    $pdbid=$1;\n    $pdbid\
1716 =~s/_//;\n    return $pdbid;\n  }\nsub id2pdbid\n \
1717  {\n    my $in=@_[0];\n    my $id;\n\n    $in=~/(\\
1718 \S+)/;\n    $id=$in;\n    $id=~s/PDB/pdb/g;\n\n   \
1719  if ($id =~/pdb(.*)/){$id=$1;}\n    elsif ( $id=~/\
1720 (\\S+)\\s+mol:protein/){$id=$1;}\n    $id=~s/[:|ï¿\
1721 ½ï¿½_]//g;\n    return $id;\n  }\nsub set_blast_ty\
1722 pe\n  {\n    my $file =@_[0];\n    if (&file_conta\
1723 ins ($file,\"EBIApplicationResult\",100)){$BLAST_T\
1724 YPE=\"EBI\";}\n    elsif (&file_contains ($file,\"\
1725 NCBI_BlastOutput\",100)) {$BLAST_TYPE=\"NCBI\";}\n\
1726     else\n      {\n     $BLAST_TYPE=\"\";\n      }\n  \
1727   return $BLAST_TYPE;\n  }\nsub is_valid_blast_xml\
1728 \n    {\n      my $file=shift;\n      my $line;\n\\
1729 n\n      if ( !-e $file) {return 0;}\n      $line=\
1730 &file2tail ($file,100);\n\n      if ( $line=~/<\\/\
1731 EBIApplicationResult/ || $line=~/<\\/NCBI_BlastOut\
1732 put/ || $line=~/<\\/BlastOutput/ ){return 1;}\n   \
1733    return 0;\n    }\nsub file2blast_flavor\n      \
1734 {\n     my $file=shift;\n       if (&file_contains ($file,\"\
1735 EBIApplicationResult\",100)){return \"EBI\";}\n el\
1736 sif (&file_contains ($file,\"NCBI_BlastOutput\",10\
1737 0)){return \"NCBI\";}\n else {return \"UNKNOWN\";}\
1738 \n      }\nsub blast_xml2profile\n  {\n    my ($na\
1739 me,$seq,$maxid, $minid, $mincov, $file)=(@_);\n   \
1740  my (%p, $a, $string, $n);\n\n\n\n    if ($BLAST_T\
1741 YPE eq \"EBI\" || &file_contains ($file,\"EBIAppli\
1742 cationResult\",100)){%p=ebi_blast_xml2profile(@_);\
1743 }\n    elsif ($BLAST_TYPE eq \"NCBI\" || &file_con\
1744 tains ($file,\"NCBI_BlastOutput\",100)){%p=ncbi_bl\
1745 ast_xml2profile(@_);}\n    else\n      {\n      myexit(\
1746 add_error ( $$,$$,getppid(), \"BLAST_FAILURE::unko\
1747 wn XML\",$CL));\n      }\n    for ($a=0; $a<$p{n};\
1748  $a++)\n      {\n       my $name=$p{$a}{name};\n        $p{$nam\
1749 e}{seq}=$p{$a}{seq};\n  $p{$name}{index}=$a;\n     \
1750  }\n    return %p;\n  }\nsub ncbi_tblastx_xml2lib_\
1751 file\n  {\n    my  ($outlib,$string)=(@_);\n    my\
1752  ($L,$l, $a,$b,$c,$d,$i,$nhits,@identifyerL);\n   \
1753  my (%ITERATION);\n\n    open (F, \">>$outlib\");\\
1754 n\n    $seq=~s/[^a-zA-Z]//g;\n    $L=length ($seq)\
1755 ;\n\n    %ITERATION=xml2tag_list ($string, \"Itera\
1756 tion\");\n    for ($i=0; $i<$ITERATION{n};$i++)\n \
1757      {\n        my ($qindex, $qlen, %hit, $string);\n   $st\
1758 ring=$ITERATION{$i}{body};\n\n  $qindex=xmltag2valu\
1759 e($string,\"Iteration_iter-num\");\n    $qlen  =xmlta\
1760 g2value($string,\"Iteration_query-len\");\n     %hit=&\
1761 xml2tag_list  ($string, \"Hit\");\n\n   for ($a=0; $\
1762 a<$hit{n}; $a++)\n        {\n       my ($string);\n         $\
1763 string=$hit{$a}{body};\n\n          $hindex=xmltag2valu\
1764 e($string,\"Hit_accession\")+1;\n           if ($hindex<\
1765 =$qindex){next;}\n          else  {print F  \"# $qindex\
1766  $hindex\\n\";}\n\n\n       $hlen=xmltag2value  ($st\
1767 ring,\"Hit_len\");\n        %HSP=&xml2tag_list  ($str\
1768 ing, \"Hsp\");\n\n          for ($b=0; $b<$HSP{n}; $b++\
1769 )\n           {\n               my ($string, $qs,$qe,$qf,$hs,$he,$h\
1770 f,$s, $d, $e);\n                $string=$HSP{$b}{body};\n\n             $qs\
1771 =xmltag2value  ($string,\"Hsp_query-from\");\n          $q\
1772 e=xmltag2value  ($string,\"Hsp_query-to\");\n           $qf\
1773 =xmltag2value  ($string,\"Hsp_query-frame\");\n\n       \
1774         $hs=xmltag2value  ($string,\"Hsp_hit-from\");\n         \
1775 $he=xmltag2value  ($string,\"Hsp_hit-to\");\n           $hf\
1776 =xmltag2value  ($string,\"Hsp_hit-frame\");\n\n         $\
1777 s=xmltag2value  ($string,\"Hsp_identity\");\n           $l=\
1778 xmltag2value  ($string,\"Hsp_align-len\");\n            $s=i\
1779 nt(($s*100)/$l);\n\n            if ($qf>0)\n              {$rqs=$qs; $\
1780 rqe=$qe;}\n             else\n            {\n               $rqe=($qlen-$qs)+1\
1781 ;\n                 $rqs=($qlen-$qe)+1;\n                 }\n\n         if ($hf>0\
1782 )\n               {$rhs=$hs; $rhe=$he;}\n               else\n            {\n              \
1783  $rhe=($hlen-$hs)+1;\n              $rhs=($hlen-$he)+1;\n       \
1784           }\n           for ($d=0,$e=$rqs; $e<$rqe; $e++,$d++)\n                \
1785   {\n               my ($r1,$r2);\n                 $r1=$e;\n               $r2\
1786 =$rhs+$d;\n                 print F \" $r1 $r2 $s 0\\n\";\n             \
1787   }\n         }\n         }\n      }\n    print F \"! SEQ_\
1788 1_TO_N\\n\";\n\n    close (F);\n    return %lib;\n\
1789   }\n\nsub ncbi_tblastpx_xml2lib_file\n  {\n    my\
1790   ($outlib,$string,%s)=(@_);\n    my ($L,$l, $a,$b\
1791 ,$c,$d,$i,$nhits,@identifyerL);\n    my (%ITERATIO\
1792 N,%hdes, %qdes);\n\n    open (F, \">>$outlib\");\n\
1793 \n    $seq=~s/[^a-zA-Z]//g;\n    $L=length ($seq);\
1794 \n\n    %ITERATION=xml2tag_list ($string, \"Iterat\
1795 ion\");\n    for ($i=0; $i<$ITERATION{n};$i++)\n  \
1796     {\n my ($qindex, $qlen, %hit, $string);\n   $str\
1797 ing=$ITERATION{$i}{body};\n\n   $qdef=xmltag2value($\
1798 string,\"Iteration_query-def\");\n      %qdes=&tblastpx\
1799 _name2description($qdef,%s);\n  $qlen  =xmltag2valu\
1800 e($string,\"Iteration_query-len\");\n   %hit=&xml2ta\
1801 g_list  ($string, \"Hit\");\n\n for ($a=0; $a<$hit\
1802 {n}; $a++)\n      {\n       my ($string);\n         $string\
1803 =$hit{$a}{body};\n          $hdef=xmltag2value($string,\
1804 \"Hit_def\");\n     %hdes=&tblastpx_name2descripti\
1805 on($hdef,%s);\n     if ($hdes{index}<=$qdes{index}\
1806 ){next;}\n          else  {print F  \"# $qdes{index} $h\
1807 des{index}\\n\";}\n\n\n     $hlen=xmltag2value  ($\
1808 string,\"Hit_len\");\n      %HSP=&xml2tag_list  ($s\
1809 tring, \"Hsp\");\n\n        for ($b=0; $b<$HSP{n}; $b\
1810 ++)\n         {\n               my ($string, $l,$qs,$qe,$qf,$hs,$\
1811 he,$hf,$s, $d, $e, @s1, @s2);\n         $string=$HSP{$b}{\
1812 body};\n\n              $qs=xmltag2value  ($string,\"Hsp_query\
1813 -from\");\n             $qe=xmltag2value  ($string,\"Hsp_quer\
1814 y-to\");\n              $qf=$qdes{frame};\n             $qseq=xmltag2valu\
1815 e  ($string,\"Hsp_qseq\");\n\n          $hs=xmltag2value  \
1816 ($string,\"Hsp_hit-from\");\n           $he=xmltag2value  (\
1817 $string,\"Hsp_hit-to\");\n              $hf=$hdes{frame};\n             $\
1818 hseq=xmltag2value  ($string,\"Hsp_hseq\");\n\n          $s\
1819 =xmltag2value  ($string,\"Hsp_identity\");\n            $l=x\
1820 mltag2value  ($string,\"Hsp_align-len\");\n             $s=in\
1821 t(($s*100)/$l);\n               @s1=tblastpx_hsp2coordinates($q\
1822 seq,$qs,$qe,%qdes);\n           @s2=tblastpx_hsp2coordinate\
1823 s($hseq,$hs,$he,%hdes);\n\n\n           for ($f=0; $f<=$#s1\
1824 ; $f++)\n                 {\n               if ($s1[$f]==-1 || $s2[$f]==\
1825 -1){next;}\n                else\n                    {\n                       print F \" $\
1826 s1[$f] $s2[$f] $s 0\\n\";\n                   }\n                 }\n       \
1827   }\n     }\n      }\n    print F \"! SEQ_1_TO_N\\n\\
1828 ";\n\n    close (F);\n    return %lib;\n  }\nsub t\
1829 blastpx_hsp2coordinates\n  {\n    my ($seq, $s, $e\
1830 , %des)=@_;\n    my @list;\n    my @sa;\n    my @g\
1831 ap=(-1,-1,-1);\n\n    $s=$des{start}+3*($s-1);\n\n\
1832     if ($des{strand} eq \"d\"){;}\n    else {$s=($\
1833 des{length}-$s)+1;}\n\n    foreach $c (split (//,$\
1834 seq))\n      {\n        if ( $c eq '-'){push (@list,@gap)\
1835 ;}\n    elsif ($des{strand} eq \"d\")\n   {\n       pus\
1836 h(@list,$s++,$s++,$s++);\n        }\n   else\n    {\n       \
1837 push(@list, $s--,$s--,$s--);\n    }\n      }\n    r\
1838 eturn @list;\n  }\n\nsub tblastpx_name2description\
1839 \n  {\n    my ($name, %s)=@_;\n    my @at=split(\"\
1840 __\", $name);\n    my %des;\n\n    $des{name}=$at[\
1841 0];\n    $des{strand}=$at[1];\n\n    $des{start}=$\
1842 at[2];\n    $des{end}=$at[3];\n    $des{length}=$a\
1843 t[4];\n    $des{index}=$s{$at[0]}{order}+1;\n    r\
1844 eturn %des;\n  }\nsub ncbi_blast_xml2profile\n  {\\
1845 n    my ($name,$seq,$maxid, $minid, $mincov, $stri\
1846 ng)=(@_);\n    my ($L,$l, $a,$b,$c,$d,$nhits,@iden\
1847 tifyerL);\n\n\n    $seq=~s/[^a-zA-Z]//g;\n    $L=l\
1848 ength ($seq);\n\n    #This is causing the NCBI par\
1849 ser to fail when Iteration_query-def is missing\n \
1850    #%query=&xml2tag_list ($string, \"Iteration_que\
1851 ry-def\");\n    #$name=$query{0}{body};\n\n    %hi\
1852 t=&xml2tag_list ($string, \"Hit\");\n\n\n    for (\
1853 $nhits=0,$a=0; $a<$hit{n}; $a++)\n      {\n     my ($l\
1854 db,$id, $identity, $expectation, $start, $end, $co\
1855 verage, $r);\n  my (%ID,%DE,%HSP);\n\n  $ldb=\"\";\n\
1856 \n      %ID=&xml2tag_list ($hit{$a}{body}, \"Hit_id\");\
1857 \n      $identifyer=$ID{0}{body};\n\n   %DE=&xml2tag_list\
1858  ($hit{$a}{body}, \"Hit_def\");\n       $definition=$DE{\
1859 0}{body};\n\n   %HSP=&xml2tag_list ($hit{$a}{body}, \
1860 \"Hsp\");\n     for ($b=0; $b<$HSP{n}; $b++)\n    {\n    \
1861    my (%START,%END,%E,%I,%Q,%M);\n\n\n      %START=\
1862 &xml2tag_list ($HSP{$b}{body}, \"Hsp_query-from\")\
1863 ;\n         %HSTART=&xml2tag_list ($HSP{$b}{body}, \"H\
1864 sp_hit-from\");\n\n         %LEN=  &xml2tag_list ($HSP\
1865 {$b}{body}, \"Hsp_align-len\");\n           %END=  &xml2\
1866 tag_list ($HSP{$b}{body}, \"Hsp_query-to\");\n     \
1867  %HEND=  &xml2tag_list ($HSP{$b}{body}, \"Hsp_hit-\
1868 to\");\n            %E=&xml2tag_list     ($HSP{$b}{body},\
1869  \"Hsp_evalue\");\n         %I=&xml2tag_list     ($HSP\
1870 {$b}{body}, \"Hsp_identity\");\n            %Q=&xml2tag_l\
1871 ist     ($HSP{$b}{body}, \"Hsp_qseq\");\n           %M=&\
1872 xml2tag_list     ($HSP{$b}{body}, \"Hsp_hseq\");\n\
1873 \n          for ($e=0; $e<$Q{n}; $e++)\n\n            {\n               $\
1874 qs=$Q{$e}{body};\n              $ms=$M{$e}{body};\n\n           $expect\
1875 ation=$E{$e}{body};\n           $identity=($LEN{$e}{body}==\
1876 0)?0:$I{$e}{body}/$LEN{$e}{body}*100;\n         $start=$S\
1877 TART{$e}{body};\n               $end=$END{$e}{body};\n          $Hstart\
1878 =$HSTART{$e}{body};\n           $Hend=$HEND{$e}{body};\n\n      \
1879         $coverage=($L)?(($end-$start)*100)/$L:0;\n\n            if \
1880 ($identity>$maxid || $identity<$minid || $coverage\
1881 <$mincov){next;}\n              @lr1=(split (//,$qs));\n                @lr2\
1882 =(split (//,$ms));\n            $l=$#lr1+1;\n           for ($c=0;$c<\
1883 $L;$c++){$p[$nhits][$c]=\"-\";}\n               for ($d=0,$c=0;\
1884  $c<$l; $c++)\n           {\n               $r=$lr1[$c];\n                  if\
1885  ( $r=~/[A-Za-z]/)\n                  {\n\n                     $p[$nhits][$d \
1886 + $start-1]=$lr2[$c];\n                 $d++;\n               }\n                 }\\
1887 n               $Qseq[$nhits]=$qs;\n            $Hseq[$nhits]=$ms;\n            $Qs\
1888 tartL[$nhits]=$start;\n         $HstartL[$nhits]=$Hstart;\
1889 \n              $identityL[$nhits]=$identity;\n         $endL[$nhits]\
1890 =$end;\n                $definitionL[$nhits]=$definition;\n             $id\
1891 entifyerL[$nhits]=$identifyer;\n                $comment[$nhits]\
1892 =\"$ldb|$identifyer [Eval=$expectation][id=$identi\
1893 ty%][start=$Hstart end=$Hend]\";\n              $nhits++;\n       \
1894     }\n   }\n      }\n\n\n    $profile{n}=0;\n    \
1895 $profile{$profile{n}}{name}=$name;\n    $profile{$\
1896 profile{n}}{seq}=$seq;\n    $profile {n}++;\n\n   \
1897  for ($a=0; $a<$nhits; $a++)\n      {\n $n=$a+1;\n\
1898 \n      $profile{$n}{name}=\"$name\\_$a\";\n    $profile{$\
1899 n}{seq}=\"\";\n $profile{$n}{Qseq}=$Qseq[$a];\n $p\
1900 rofile{$n}{Hseq}=$Hseq[$a];\n   $profile{$n}{Qstart}\
1901 =$QstartL[$a];\n        $profile{$n}{Hstart}=$HstartL[$a]\
1902 ;\n     $profile{$n}{identity}=$identityL[$a];\n        $prof\
1903 ile{$n}{definition}=$definitionL[$a];\n $profile{$\
1904 n}{identifyer}=$identifyerL[$a];\n      $profile{$n}{co\
1905 mment}=$comment[$a];\n\n        for ($b=0; $b<$L; $b++)\n\
1906           {\n       if ($p[$a][$b])\n         {\n               $profile{$\
1907 n}{seq}.=$p[$a][$b];\n        }\n           else\n            \
1908 {\n             $profile{$n}{seq}.=\"-\";\n           }\n         }\n  \
1909     }\n\n    $profile{n}=$nhits+1;\n    return %pr\
1910 ofile;\n  }\nsub ebi_blast_xml2profile\n  {\n    m\
1911 y ($name,$seq,$maxid, $minid, $mincov, $string)=(@\
1912 _);\n    my ($L,$l, $a,$b,$c,$d,$nhits,@identifyer\
1913 L,$identifyer);\n\n\n\n    $seq=~s/[^a-zA-Z]//g;\n\
1914     $L=length ($seq);\n    %hit=&xml2tag_list ($st\
1915 ring, \"hit\");\n\n    for ($nhits=0,$a=0; $a<$hit\
1916 {n}; $a++)\n      {\n   my ($ldb,$id, $identity, $ex\
1917 pectation, $start, $end, $coverage, $r);\n      my (%Q,\
1918 %M,%E,%I);\n\n  $ldb=&tag2value ($hit{$a}{open}, \"\
1919 database\");\n  $identifyer=&tag2value ($hit{$a}{op\
1920 en}, \"id\");\n\n       $description=&tag2value ($hit{$a\
1921 }{open}, \"description\");\n\n  %Q=&xml2tag_list ($\
1922 hit{$a}{body}, \"querySeq\");\n %M=&xml2tag_list (\
1923 $hit{$a}{body}, \"matchSeq\");\n        %E=&xml2tag_list \
1924 ($hit{$a}{body}, \"expectation\");\n    %I=&xml2tag_l\
1925 ist ($hit{$a}{body}, \"identity\");\n\n\n       for ($b=\
1926 0; $b<$Q{n}; $b++)\n      {\n\n     $qs=$Q{$b}{body};\
1927 \n          $ms=$M{$b}{body};\n\n           $expectation=$E{$\
1928 b}{body};\n         $identity=$I{$b}{body};\n\n\n           \
1929 $start=&tag2value ($Q{$b}{open}, \"start\");\n     \
1930  $end=&tag2value ($Q{$b}{open}, \"end\");\n         $s\
1931 tartM=&tag2value ($M{$b}{open}, \"start\");\n       \
1932 $endM=&tag2value ($M{$b}{open}, \"end\");\n         $c\
1933 overage=(($end-$start)*100)/$L;\n\n        # print \"$\
1934 id: ID: $identity COV: $coverage [$start $end]\\n\\
1935 ";\n\n      if ($identity>$maxid || $identity<$mini\
1936 d || $coverage<$mincov){next;}\n            # print \"KEE\
1937 P\\n\";\n\n\n       @lr1=(split (//,$qs));\n        @lr\
1938 2=(split (//,$ms));\n       $l=$#lr1+1;\n           for ($\
1939 c=0;$c<$L;$c++){$p[$nhits][$c]=\"-\";}\n            for (\
1940 $d=0,$c=0; $c<$l; $c++)\n             {\n               $r=$lr1[$c];\\
1941 n               if ( $r=~/[A-Za-z]/)\n            {\n\n             $p[$nhits]\
1942 [$d + $start-1]=$lr2[$c];\n                 $d++;\n               }\n     \
1943     }\n\n           $Qseq[$nhits]=$qs;\n            $Hseq[$nhit\
1944 s]=$ms;\n           $QstartL[$nhits]=$start;\n      $Hsta\
1945 rtL[$nhits]=$Hstart;\n      $identityL[$nhits]=$ide\
1946 ntity;\n            $endL[$nhits]=$end;\n           $definition\
1947 L[$nhits]=$definition;\n            $identifyerL[$nhits]=\
1948 $identifyer;\n      $comment[$nhits]=\"$ldb|$identi\
1949 fyer [Eval=$expectation][id=$identity%][start=$sta\
1950 rtM end=$endM]\";\n         $nhits++;\n   }\n      }\n\
1951 \n    $profile{n}=0;\n    $profile{$profile{n}}{na\
1952 me}=$name;\n    $profile{$profile{n}}{seq}=$seq;\n\
1953     $profile {n}++;\n\n    for ($a=0; $a<$nhits; $\
1954 a++)\n      {\n $n=$a+1;\n      $profile{$n}{name}=\"$n\
1955 ame\\_$a\";\n   $profile{$n}{seq}=\"\";\n       $profile{$\
1956 n}{Qseq}=$Qseq[$a];\n   $profile{$n}{Hseq}=$Hseq[$a]\
1957 ;\n     $profile{$n}{Qstart}=$QstartL[$a];\n    $profile{\
1958 $n}{Hstart}=$HstartL[$a];\n     $profile{$n}{identity}\
1959 =$identityL[$a];\n      $profile{$n}{definition}=$defin\
1960 itionL[$a];\n   $profile{$n}{identifyer}=$identifyer\
1961 L[$a];\n        $profile{$n}{comment}=$comment[$a];\n\n f\
1962 or ($b=0; $b<$L; $b++)\n          {\n       if ($p[$a][$b])\
1963 \n            {\n               $profile{$n}{seq}.=$p[$a][$b];\n           \
1964    }\n      else\n            {\n               $profile{$n}{seq}.=\"\
1965 -\";\n        }\n         }\n      }\n    $profile{n}=$nh\
1966 its+1;\n\n    return %profile;\n  }\nsub output_pr\
1967 ofile\n  {\n    my ($outfile,$profileR, $trim)=(@_\
1968 );\n    my ($a);\n    my %profile=%$profileR;\n   \
1969  my $P= new FileHandle;\n    my $tmp=vtmpnam();\n\\
1970 n    open ($P, \">$tmp\");\n    for ($a=0; $a<$pro\
1971 file{n}; $a++)\n      {\n       print $P \">$profile{$a}\
1972 {name} $profile{$a}{comment}\\n$profile{$a}{seq}\\\
1973 n\";\n      }\n    close ($P);\n\n    if ( $trim)\\
1974 n      {\n      &safe_system (\"t_coffee -other_pg seq_\
1975 reformat -in $tmp -action +trim _aln_%%$trim\\_K1 \
1976 -output fasta_aln -out $outfile\");\n      }\n    \
1977 else\n      {\n &safe_system (\"mv $tmp $outfile\"\
1978 );\n      }\n    return;\n  }\nsub blast_xml2hit_l\
1979 ist\n  {\n    my $string=(@_[0]);\n    return &xml\
1980 2tag_list ($string, \"hit\");\n  }\nsub xmltag2val\
1981 ue\n  {\n    my ($string_in, $tag)=@_;\n    my %TA\
1982 G;\n    %TAG=xml2tag_list ($string_in, $tag);\n   \
1983  return $TAG{0}{body};\n  }\n\nsub xml2tag_list\n \
1984  {\n    my ($string_in,$tag)=@_;\n    my $tag_in, \
1985 $tag_out;\n    my %tag;\n\n    if (-e $string_in)\\
1986 n      {\n      $string=&file2string ($string_in);\n   \
1987    }\n    else\n      {\n       $string=$string_in;\n   \
1988    }\n    $tag_in1=\"<$tag \";\n    $tag_in2=\"<$t\
1989 ag>\";\n    $tag_out=\"/$tag>\";\n    $string=~s/>\
1990 />##1/g;\n    $string=~s/</##2</g;\n    $string=~s\
1991 /##1/<#/g;\n    $string=~s/##2/#>/g;\n    @l=($str\
1992 ing=~/(\\<[^>]+\\>)/g);\n    $tag{n}=0;\n    $in=0\
1993 ;$n=-1;\n\n\n\n    foreach $t (@l)\n      {\n\n $t\
1994 =~s/<#//;\n     $t=~s/#>//;\n\n if ( $t=~/$tag_in1/ ||\
1995  $t=~/$tag_in2/)\n        {\n\n     $in=1;\n        $tag{$\
1996 tag{n}}{open}=$t;\n         $n++;\n\n     }\n   elsif ($t=\
1997 ~/$tag_out/)\n    {\n\n\n           $tag{$tag{n}}{close}=\
1998 $t;\n       $tag{n}++;\n            $in=0;\n      }\n   elsif ($\
1999 in)\n     {\n\n     $tag{$tag{n}}{body}.=$t;\n    }\n\
2000       }\n\n    return %tag;\n  }\n\n\nsub seq2gor_\
2001 prediction\n  {\n    my ($name, $seq,$infile, $out\
2002 file, $gor_seq, $gor_obs)=(@_);\n    my ($l);\n\n \
2003    `gorIV -prd $infile -seq $gor_seq -obs $gor_obs\
2004  > gor_tmp`;\n    open (GR, \">$outfile\");\n    o\
2005 pen (OG, \"gor_tmp\");\n\n    while (<OG>)\n      \
2006 {\n\n   $l=$_;\n        if ($l=~/\\>/){print GR \"$l\";}\n      \
2007 elsif ( $l=~/Predicted Sec. Struct./)\n   {\n       \
2008 $l=~s/Predicted Sec. Struct\\.//;\n         print GR \\
2009 "$l\";\n          }\n      }\n    close (GR);\n    close \
2010 (OG);\n    return;\n  }\nsub seq2msa_tm_prediction\
2011 \n  {\n    my ($name, $seq, $db, $infile, $outfile\
2012 , $arch, $psv)=(@_);\n    my (%p,%gseq,%R, $blast_\
2013 output, %s, $l);\n    my $R2=new FileHandle;\n    \
2014 my $db=\"uniprot\";\n    my $method=\"psitm\";\n  \
2015   my $SERVER=\"EBI\";\n\n    $blast_output=&run_bl\
2016 ast ($name,\"blastp\", $db, $infile, \"outfile\");\
2017 \n\n    if (&cache_file(\"GET\",$infile,$name,$met\
2018 hod,$db,$outfile,$SERVER))\n      {\n   print \"\\tP\
2019 SITM: USE Cache\\n\";\n return $outfile;\n      }\\
2020 n    else\n      {\n    $CACHE_STATUS=\"COMPUTE CACHE\
2021 \";\n   %p=blast_xml2profile($name,$seq,$maxid, $min\
2022 id,$mincov,$blast_output);\n\n\n        open (F, \">tm_in\
2023 put\");\n       for (my $a=0; $a<$p{n}; $a++)\n   {\n     \
2024   my $s;\n\n        $s=$p{$a}{seq};\n       $s=uc($s);\\
2025 n           print F \">$p{$a}{name}\\n$s\\n\";\n            #pr\
2026 int stdout \">$p{$a}{name}\\n$s\\n\";\n   }\n   clos\
2027 e (F);\n        print \"\\tPSITM: kept  $p{n} Homologues \
2028 for Sequence $p{0}{name}\\n\";\n        &safe_system (\"t\
2029 _coffee -other_pg fasta_seq2hmmtop_fasta.pl -in=tm\
2030 _input -out=$outfile -output=cons -cov=70 -trim=95\
2031  -arch=$arch -psv=$psv\");\n    unlink (\"tm_input\")\
2032 ;\n     &cache_file(\"SET\",$infile,$name,$method,$db,\
2033 $outfile,$SERVER);\n    return;\n      }\n  }\n\n\nsu\
2034 b seq2msa_gor_prediction\n  {\n    my ($name, $seq\
2035 ,$infile, $outfile, $gor_seq, $gor_obs)=(@_);\n   \
2036  my (%p,%gseq,%R, $blast_output, %s, $l);\n    my \
2037 $R2=new FileHandle;\n    my $db=\"uniprot\";\n    \
2038 my $method=\"psigor\";\n    my $SERVER=\"EBI\";\n\\
2039 n    $blast_output=&run_blast ($name,\"blastp\", \\
2040 "uniprot\", $infile, \"outfile\");\n\n    if (&cac\
2041 he_file(\"GET\",$infile,$name,$method,$db,$outfile\
2042 ,$SERVER))\n      {\n   print \"\\tPSIGOR: USE Cache\
2043 \\n\";\n        return $outfile;\n      }\n    else\n    \
2044   {\n   $CACHE_STATUS=\"COMPUTE CACHE\";\n      %p=blast_\
2045 xml2profile($name,$seq,$maxid, $minid,$mincov,$bla\
2046 st_output);\n\n\n       open (F, \">gor_input\");\n     for \
2047 (my $a=0; $a<$p{n}; $a++)\n       {\n       my $s;\n\n   \
2048    $s=$p{$a}{seq};\n        $s=uc($s);\n            print F \
2049 \">$p{$a}{name}\\n$s\\n\";\n        #print stdout \">\
2050 $p{$a}{name}\\n$s\\n\";\n         }\n   close (F);\n    print\
2051  \"\\tGORTM: kept  $p{n} Homologues for Sequence $\
2052 p{0}{name}\\n\";\n      &safe_system (\"t_coffee -other\
2053 _pg fasta_seq2hmmtop_fasta.pl -in=gor_input -out=$\
2054 outfile -output=cons -cov=70 -trim=95 -gor_seq=$go\
2055 r_seq -gor_obs=$gor_obs -mode=gor\");\n unlink (\"\
2056 tm_input\");\n  &cache_file(\"SET\",$infile,$name,$\
2057 method,$db,$outfile,$SERVER);\n return;\n      }\n\
2058   }\n\n\n\nsub run_blast\n  {\n    my ($name, $met\
2059 hod, $db, $infile, $outfile, $run)=(@_);\n    if (\
2060 !$run){$run=1;}\n    my $error_log=vtmpnam();\n\n \
2061    if (&cache_file(\"GET\",$infile,$name,$method,$\
2062 db,$outfile,$SERVER) && is_valid_blast_xml ($outfi\
2063 le))\n      {return $outfile;}\n    else\n      {\\
2064 n       $CACHE_STATUS=\"COMPUTE CACHE\";\n      if ( $SERVER \
2065 eq \"EBI_SOAP\")\n        {\n       &check_configuration \
2066 (\"EMAIL\",\"SOAP::Light\",\"INTERNET\");\n\n       \
2067 $cl_method=$method;\n       if ($cl_method =~/wu/)\n\
2068               {\n               $cl_method=~s/wu//;\n           if ( $cl_method\
2069  eq \"psiblast\")\n               {\n               add_warning($$,$$,\
2070 \"PSI BLAST cannot be used with the wuBLAST Client\
2071 . Use server=EBI Or server=LOCAL. blastp will be u\
2072 sed instead\");\n                   $cl_method=\"blastp\";\n             \
2073  }\n\n          $command=\"t_coffee -other_pg wublast.pl -\
2074 -email $EMAIL $infile -D $db -p $cl_method --outfi\
2075 le $outfile -o xml>/dev/null 2>$error_log\";\n          &s\
2076 afe_system ( $command);\n               if (-e \"$outfile.xml\"\
2077 ) {`mv $outfile.xml $outfile`;}\n             }\n           el\
2078 se\n          {\n               if ($cl_method eq \"psiblast\"){$c\
2079 l_method =\"blastp -j5\";}\n\n          $command=\"t_coffe\
2080 e -other_pg blastpgp.pl --email $EMAIL $infile -d \
2081 $db --outfile $outfile -p $cl_method --mode PSI-Bl\
2082 ast>/dev/null 2>$error_log\";\n         &safe_system ( $c\
2083 ommand);\n\n            if (-e \"$outfile.xml\") {`mv $outfi\
2084 le.xml $outfile`;}\n          }\n         }\n   elsif ($SERVE\
2085 R eq \"EBI_REST\" || $SERVER eq \"EBI\")\n        {\n    \
2086    $cl_method=$method;\n            &check_configuration(\
2087 \"EMAIL\",\"XML::Simple\", \"INTERNET\");\n         if\
2088  ($db eq \"uniprot\"){$db1=\"uniprotkb\";}\n        e\
2089 lse {$db1=$db;}\n\n        \n       if ($cl_method =~/wu\
2090 /)\n          {\n               $cl_method=~s/wu//;\n           if ( $cl_me\
2091 thod eq \"psiblast\"){$cl_method=\"blastp\";}\n\n       \
2092         $command=\"t_coffee -other_pg wublast_lwp.pl --em\
2093 ail $EMAIL -D $db1 -p $cl_method --outfile $outfil\
2094 e --align 5 --stype protein $infile>/dev/null 2>er\
2095 ror_log\";\n          }\n           else\n            {\n               if ( \
2096 $cl_method =~/psiblast/){$cl_method =\"blastp -j5\\
2097 ";}\n           $command=\"t_coffee -other_pg ncbiblast_lwp\
2098 .pl --email $EMAIL -D $db1 -p $cl_method --outfile\
2099  $outfile --align 5 --stype protein $infile>/dev/n\
2100 ull 2>$error_log\";\n         }\n           &safe_system (\
2101  $command,5);\n     if (-e \"$outfile.out.xml\") {\
2102 `mv $outfile.out.xml $outfile`;}\n          elsif (-e \\
2103 "$outfile.xml.xml\"){`mv $outfile.xml.xml $outfile\
2104 `;}\n       elsif (-e \"$outfile.out..xml\") {`mv $o\
2105 utfile.out..xml $outfile`;}\n       elsif (-e \"$out\
2106 file.xml..xml\"){`mv $outfile.xml..xml $outfile`;}\
2107 \n        }\n   elsif ($SERVER eq \"NCBI\")\n     {\n       &\
2108 check_configuration (\"INTERNET\");\n       if ($db \
2109 eq \"uniprot\"){$cl_db=\"swissprot\";}\n            else \
2110 {$cl_db=$db;}\n\n           if ( $method eq \"psiblast\"\
2111 )\n           {\n               add_warning($$,$$,\"PSI BLAST canno\
2112 t be used with the NCBI BLAST Client. Use server=E\
2113 BI Or server=LOCAL. blastp will be used instead\")\
2114 ;\n             $cl_method=\"blastp\";\n              }\n           else\n\
2115               {\n               $cl_method=$method;\n         }\n             \
2116 \n          &check_configuration ($cl_method);  \n          \
2117 $command=\"$cl_method -db $cl_db -query $infile -o\
2118 ut $outfile -outfmt 5 -remote\";\n          &safe_syste\
2119 m ($command);\n   }\n   elsif ($SERVER =~/CLIENT_(.*\
2120 )/)\n     {\n       my $client=$1;\n        $command=\"$c\
2121 lient -p $method -d $db -i $infile -o $outfile -m \
2122 7\";\n      &safe_system ($command);\n    }\n   elsif \
2123 ( $SERVER eq \"LOCAL_blastall\")\n        {\n       &chec\
2124 k_configuration (\"blastall\");\n           if ($method \
2125 eq \"blastp\")\n              {\n               $command=\"blastall -d\
2126  $db -i $infile -o $outfile -m7 -p blastp\";\n     \
2127    }\n      &safe_system ($command);\n    }\n   elsif \
2128 ( $SERVER eq \"LOCAL\")\n         {\n\n     if ($ENV{\"B\
2129 LAST_DB_DIR\"})\n             {\n               $x=$ENV{\"BLAST_DB_DI\
2130 R\"};\n         $cl_db=\"$x$db\";\n           }\n           else\n      \
2131       {\n               $cl_db=$db;\n         }\n\n        ##\n         \
2132 ## BLAST+ provide different binaries names and CLI\
2133  options\n              ## Use the 'legacy_blast.pl' to keep c\
2134 ompatibility with old blast commands\n          ##\n            $pat\
2135 h=`which legacy_blast.pl 2>/dev/null`;  \n              $path=\
2136 `dirname $path`; \n             chomp($path);\n     if ($meth\
2137 od eq \"blastp\")\n           {\n               &check_configuratio\
2138 n(\"legacy_blast.pl\");\n               $command=\"legacy_blast\
2139 .pl blastpgp --path $path -d $cl_db -i $infile -o \
2140 $outfile -m7 -j1\";\n         }\n           elsif ($method\
2141  eq \"psiblast\")\n           {\n               &check_configuratio\
2142 n(\"legacy_blast.pl\");\n               $command=\"legacy_blast\
2143 .pl blastpgp --path $path -d $cl_db -i $infile -o \
2144 $outfile -m7 -j5\";\n         }\n           elsif ($method\
2145  eq \"blastn\")\n             {\n               &check_configuration(\
2146 \"legacy_blast.pl\");\n         $command=\"legacy_blast.p\
2147 l blastall --path $path -p blastn -d $cl_db -i $in\
2148 file -o $outfile -m7 -W6\";\n         }\n           &safe_\
2149 system ($command);\n      }\n   else\n    {\n\n     myex\
2150 it(add_error (EXIT_FAILURE,$$,$$,getppid(), \"BLAS\
2151 T_FAILURE::UnknownServer\",$CL));\n       }\n\n\n       #Che\
2152 ck that everything went well\n\n        if ( !-e $outfile\
2153  || !&is_valid_blast_xml($outfile))\n     {\n\n     \
2154 if ( -e $outfile)\n           {\n               add_warning ($$,$$,\
2155 \"Corrupted Blast Output (Run $run)\");\n               unlink(\
2156 $outfile);\n          }\n           if ( -e $error_log)\n        \
2157      {\n\n              my $error_msg=file2string ($error_log)\
2158 ;\n\n           if ( $error_msg =~/enter a valid email/)\n      \
2159           {\n               myexit(add_error (EXIT_FAILURE,$$,$$,g\
2160 etppid(), \"BLAST_FAILURE::Invalid_or_rejected_ema\
2161 il::$EMAIL\", \"$command\"));\n           }\n         }\n        \
2162    if ( $run==$BLAST_MAX_NRUNS)\n             {\n\n             mye\
2163 xit(add_error (EXIT_FAILURE,$$,$$,getppid(), \"BLA\
2164 ST_FAILURE::UnknownReason\", \"$command\"));\n     \
2165    }\n      else\n            {\n               my $out;\n              if ($SERV\
2166 ER eq \"NCBI\") {$SERVER=\"EBI\"; }\n           elsif ($SER\
2167 VER eq \"EBI\"){$SERVER=\"NCBI\";}\n            add_warning \
2168 ($$,$$,\"Blast for $name failed (Run: $run out of \
2169 $BLAST_MAX_NRUNS. Use $SERVER)\");\n            $out=&run_bl\
2170 ast ($name, $method, $db,$infile, $outfile, $run+1\
2171 );\n            if ($SERVER eq \"NCBI\") {$SERVER=\"EBI\"; }\
2172 \n              elsif ($SERVER eq \"EBI\"){$SERVER=\"NCBI\";}\\
2173 n               return $out;\n        }\n         }\n\n &cache_file(\"\
2174 SET\",$infile,$name,$method,$db,$outfile,$SERVER);\
2175 \n      #system (\"cp $outfile ~/Dropbox/tmp/cedric.out\
2176 \");\n  #die;\n return $outfile;\n      }\n  }\n\ns\
2177 ub cache_file\n  {\n    my ($cache_mode,$infile,$n\
2178 ame,$method,$db, $outfile,$server)=(@_);\n    my $\
2179 cache_file;\n    #Protect names so that they can b\
2180 e turned into legal filenames\n    $name=&clean_fi\
2181 le_name ($name);\n\n    if ($db=~/\\//)\n      {\n\
2182         $db=~/([^\\/]+)$/;\n    $db=$1;\n      }\n    $cache\
2183 _file_sh=\"$name.$method.$db.$server.tmp\";\n    $\
2184 cache_file=\"$CACHE/$name.$method.$db.$server.tmp\\
2185 ";\n\n    if ($infile ne \"\")\n      {\n       $cache_f\
2186 ile_infile_sh=\"$name.$method.$db.$server.infile.t\
2187 mp\";\n $cache_file_infile=\"$CACHE/$name.$method.\
2188 $db.$server.infile.tmp\";\n      }\n\n    if ($cac\
2189 he_mode eq \"GET\")\n      {\n  if ($CACHE eq \"\" \
2190 || $CACHE eq \"no\" || $CACHE eq \"ignore\"  || $C\
2191 ACHE eq \"local\" || $CACHE eq \"update\"){return \
2192 0;}\n   elsif ( !-d $CACHE)\n     {\n       print STDERR\
2193  \"ERROR: Cache Dir: $CACHE Does not Exist\";\n   \
2194   return 0;\n     }\n   else\n    {\n       if ( -e $cach\
2195 e_file && &fasta_file1_eq_fasta_file2($infile,$cac\
2196 he_file_infile)==1)\n         {\n               `cp $cache_file $\
2197 outfile`;\n             $CACHE_STATUS=\"READ CACHE\";\n         retu\
2198 rn 1;\n       }\n         }\n      }\n    elsif ($cache_\
2199 mode eq \"SET\")\n      {\n     if ($CACHE eq \"\" || \
2200 $CACHE eq \"no\" || $CACHE eq \"ignore\"  || $CACH\
2201 E eq \"local\" || $CACHE eq \"update\"){return 0;}\
2202 \n      elsif ( !-d $CACHE)\n     {\n       print STDERR \"\
2203 ERROR: Cache Dir: $CACHE Does not Exist\";\n        r\
2204 eturn 0;\n        }\n   elsif (-e $outfile)\n     {\n       `\
2205 cp $outfile $cache_file`;\n         if ($cache_file_in\
2206 file ne \"\"){ `cp $infile $cache_file_infile`;}\n\
2207 \n          #functions for updating the cache\n     #`t\
2208 _coffee -other_pg clean_cache.pl -file $cache_file\
2209 _sh -dir $CACHE`;\n         #`t_coffee -other_pg clean\
2210 _cache.pl -file $cache_file_infile_sh -dir $CACHE`\
2211 ;\n         return 1;\n   }\n      }\n    $CACHE_STATU\
2212 S=\"COMPUTE CACHE\";\n    return 0;\n  }\nsub file\
2213 1_eq_file2\n  {\n    my ($f1, $f2)=@_;\n    if ( $\
2214 f1 eq \"\"){return 1;}\n    elsif ( $f2 eq \"\"){r\
2215 eturn 1;}\n    elsif ( !-e $f1){return 0;}\n    el\
2216 sif ( !-e $f2){return 0;}\n    elsif ($f1 eq \"\" \
2217 || $f2 eq \"\" || `diff $f1 $f2` eq \"\"){return 1\
2218 ;}\n\n    return 0;\n  }\nsub clean_file_name\n  {\
2219 \n    my $name=@_[0];\n\n    $name=~s/[^A-Za-z1-9.\
2220 -]/_/g;\n    return $name;\n  }\nsub url2file\n  {\
2221 \n    my ($address, $out)=(@_);\n\n    if (&pg_is_\
2222 installed (\"wget\"))\n {\n       return &safe_system \
2223 (\"wget $address -O$out >/dev/null 2>/dev/null\");\
2224 \n      }\n    elsif (&pg_is_installed (\"curl\"))\n   \
2225    {\n  return &safe_system (\"curl $address -o$out\
2226  >/dev/null 2>/dev/null\");\n      }\n    else\n  \
2227     {\n myexit(flus_error(\"neither curl nor wget \
2228 are installed. Imnpossible to fectch remote file\"\
2229 ));\n   exit ($EXIT_FAILURE);\n      }\n  }\nsub fas\
2230 ta_file1_eq_fasta_file2\n  {\n    my ($f1, $f2)=@_\
2231 ;\n    my (%s1, %s2);\n    my @names;\n    %s1=rea\
2232 d_fasta_seq ($f1);\n    %s2=read_fasta_seq ($f2);\\
2233 n\n    @names=(keys (%s1));\n\n    foreach $n (key\
2234 s(%s1))\n      {\n      if ($s1{$n}{seq} ne $s2{$n}{seq\
2235 }){return 0;}\n      }\n\n    foreach $n (keys(%s2\
2236 ))\n      {\n   if ($s1{$n}{seq} ne $s2{$n}{seq}){re\
2237 turn 0;}\n      }\n    return 1;\n  }\n\n\n\nsub r\
2238 ead_template_file\n  {\n    my $pdb_templates = @_\
2239 [0];\n    my $tmp=new FileHandle;\n    open ($tmp,\
2240  \"<$pdb_templates\");\n    my %temp_h;\n    my ($\
2241 skip,$seq, $temp);\n\n    #supports both a simple \
2242 [seq pdb] format and the regular fasta like templa\
2243 te format\n    while (<$tmp>)\n      {\n        \n      $line \
2244 = $_;\n if ($line=~/\\>(\\S+)\\s_._\\s(\\S+)/){$te\
2245 mp_h{$1}= $2;}\n        elsif ($line =~/(\\S+)\\s(\\S+)/)\
2246 {$temp_h{$1}= $2;}\n      }\n    close($tmp);\n   \
2247  return %temp_h;\n  }\n\n\n\n\n\n\nsub seq2tblastx\
2248 _lib\n  {\n    my ($mode, $infile, $outfile)=@_;\n\
2249     my (%s, $method,$nseq);\n\n    $method=$mode;\\
2250 n    &set_temporary_dir (\"set\",$infile,\"infile\\
2251 ");\n    %s=read_fasta_seq(\"infile\");\n\n\n    f\
2252 oreach $seq (keys(%s))\n      {\n       $slist[$s{$seq}{\
2253 order}]=$s{$seq}{seq};\n        $sname[$s{$seq}{order}]=$\
2254 s{$seq}{name};\n        $slen[$s{$seq}{order}]=length ($s\
2255 {$seq}{seq});\n      }\n    $nseq=$#sname+1;\n    \
2256 open (F, \">outfile\");\n    print F \"! TC_LIB_FO\
2257 RMAT_01\\n\";\n    print F \"$nseq\\n\";\n    for \
2258 ($a=0; $a<$nseq;$a++)\n      {\n        print F \"$sname[\
2259 $a] $slen[$a]  $slist[$a]\\n\"\n      }\n    close\
2260  (F);\n    &safe_system (\"formatdb -i infile -p F\
2261 \");\n    &safe_system (\"blastall -p tblastx -i i\
2262 nfile -d infile -m 7 -S1>blast.output\");\n\n    n\
2263 cbi_tblastx_xml2lib_file (\"outfile\", file2string\
2264  (\"blast.output\"));\n    &set_temporary_dir (\"u\
2265 nset\",$mode, $method, \"outfile\",$outfile);\n   \
2266  myexit ($EXIT_SUCCESS);\n    }\nsub seq2tblastpx_\
2267 lib\n  {\n    my ($mode, $infile, $outfile)=@_;\n \
2268    my (%s, $method,$nseq);\n    $method=$mode;\n  \
2269   &set_temporary_dir (\"set\",$infile,\"infile\");\
2270 \n    %s=read_fasta_seq(\"infile\");\n\n    foreac\
2271 h $seq (keys(%s))\n      {\n    $slist[$s{$seq}{order\
2272 }]=$s{$seq}{seq};\n     $sname[$s{$seq}{order}]=$s{$se\
2273 q}{name};\n     $slen[$s{$seq}{order}]=length ($s{$seq\
2274 }{seq});\n      }\n    $nseq=$#sname+1;\n    open \
2275 (F, \">outfile\");\n    print F \"! TC_LIB_FORMAT_\
2276 01\\n\";\n    print F \"$nseq\\n\";\n    for ($a=0\
2277 ; $a<$nseq;$a++)\n      {\n     print F \"$sname[$a] $\
2278 slen[$a]  $slist[$a]\\n\"\n      }\n    close (F);\
2279 \n    &safe_system(\"t_coffee -other_pg seq_reform\
2280 at -in infile -output tblastx_db1 > tblastxdb\");\\
2281 n    &safe_system (\"formatdb -i tblastxdb -p T\")\
2282 ;\n    &safe_system (\"blastall -p blastp -i tblas\
2283 txdb -d tblastxdb -m7 >blast.output\");\n    ncbi_\
2284 tblastpx_xml2lib_file (\"outfile\", file2string (\\
2285 "blast.output\"), %s);\n    &set_temporary_dir (\"\
2286 unset\",$mode, $method, \"outfile\",$outfile);\n  \
2287   myexit ($EXIT_SUCCESS);\n    }\n\nsub x3dna_find\
2288 _pair2lib\n      {\n      my ($seq, $pdb, $lib, $p\
2289 g)=@_;\n      my $outfile1=\"dssr-2ndstrs.dbn\";\n\
2290       my $outfile2=\"simple.output\";\n      my $f\
2291 = new FileHandle;\n      my ($rnaSS,$pdbSS);\n    \
2292   my $command;\n      my %s_pdb;\n      my %s_seq;\
2293 \n      \n      #$pg: \"find_pair\" OR \"find_pair\
2294  -p\"\n      \n      if (!pg_is_installed (\"find_\
2295 pair\"))\n      {\n       add_warning ($$,$$, \"x3dna/find_\
2296 pairs could not be used to extract RNA secondary s\
2297 tructures. Secondary structures will be extracted \
2298 by x3dna-ssr instead\");\n        return x3dnassr2lib (\
2299 $seq, $pdb, $lib);\n    }\n      \n      #get PDB seq\
2300 uence\n      safe_system (\"t_coffee -other_pg ext\
2301 ract_from_pdb $pdb -seq >$outfile1\");\n      \n  \
2302     #get find_pair contacts\n      $command=\"$pg \
2303 $pdb simple.output > /dev/null 2>/dev/null\";\n   \
2304    safe_system ($command);\n\n      if (($command=\
2305 ~/find_pair -p/)){$outfile2=\"allpairs.ana\";}\n  \
2306     else {$outfile2=\"simple.output\";}\n      \n \
2307      if ( !-e $outfile2)\n      {\n       myexit(flush_erro\
2308 r(\"x3dna failed to compute the secondary structur\
2309 e file $outfile2 for $pdb\"));\n          myexit ($EXIT_F\
2310 AILURE);\n      }\n      \n\n      #Handle situations w\
2311 hen the pdb sequence differs from the RNA sequence\
2312 \n      #my @out=file2array($outfile1);\n      %s_\
2313 pdb=read_fasta_seq_index ($outfile1);\n      %s_se\
2314 q=read_fasta_seq_index ($seq);\n      my $rnaS=uc(\
2315 $s_seq{0}{seq});\n      my $pdbS=uc($s_pdb{0}{seq}\
2316 );\n      \n      my $vienna;\n      my @lu;\n    \
2317 \n      if ($rnaS ne $pdbS)\n   {\n       \n      my ($rna,\
2318 $pdb);\n          $rnaSS=$rnaS;\n         $pdbSS=$pdbS;\n         $rn\
2319 aSS=~s/T/U/g;\n   $pdbSS=~s/T/U/g;\n      ($rnaSS,$pd\
2320 bSS)=nw ($rnaS, $pdbS);\n         \n      my @rnaA =split (\
2321 //,$rnaSS);\n     my @pdbA=split (//,$pdbSS);\n   my\
2322  $l=@rnaA;\n      \n      #print \"\\n--- $s_seq{0}{name\
2323 } $rnaSS\\n--- $s_seq{0}{name} $pdbSS\\n\\n\";\n         \
2324  \n       for (my $b=0,my $a=0; $a<$l; $a++)\n      {\n\
2325               if   ($rnaA[$a] ne '-' && $pdbA[$a] ne '-')\
2326 {$lu[++$pdb]=++$rna;}\n       elsif($rnaA[$a] eq '\
2327 -'){$lu[++$pdb]=-1;}\n        elsif($pdbA[$a] eq '-\
2328 '){++$rna;}\n       }\n }\n      else\n {\n       for (m\
2329 y $a=0; $a<=length ($rnaS); $a++)\n         {\n       \
2330 $lu[$a]=$a;\n       }\n }\n      my $l=length ($rnaS\
2331 );\n      open ($f, \">$lib\");\n      print $f \"\
2332 ! TC_LIB_FORMAT_01\\n\";\n      print $f \"1\\n\";\
2333 \n      print $f \"$s_seq{0}{name} $l $rnaS\\n\";\\
2334 n      print $f \"!CMT: [SOURCE] >$s_seq{0}{name} \
2335 3D contact library Generated by $pg (x3dna)\\n\";\\
2336 n      print $f \"#1 1\\n\";\n      \n      my $ne\
2337 ;\n      my @array=file2array($outfile2);\n      f\
2338 or (my $a=0; $a<5; $a++){shift (@array);}\n      w\
2339 hile (!($array[0]=~/####/))\n   {\n       my $line= shif\
2340 t (@array);\n     my @l=($line=~/(\\d+)/g);\n     \n     \
2341 \n        my $f1=$lu[$l[0]];\n    my $s1=$lu[$l[1]];\n\n\
2342           #print \"\\n$line\\n$l[0] --> $f1\\n$l[1] --> $\
2343 s1\\n\\n\"; \n    \n      if (!$f1 || !$s1)\n       {\n \
2344       print \"\\n---- $rnaSS\\n---- $pdbSS\\n$line\
2345 \\n[$l[0] --- $l[1]]<---->[$f1 --- $s1]\\n\";\n   \
2346     myexit(flush_error(\"Error while parsing s3dna\
2347 ::find_pair output\"));\n           }\n   elsif ($f1==-1\
2348  || $s1==-1){;}\n         elsif ($f1<$s1){print $f \"$f1\
2349  $s1 100\\n\";}\n         else {print $f \"$s1 $f1 100\\\
2350 n\";$ne++;}\n   }\n      print $f \"! SEQ_1_TO_N\\n\\
2351 ";\n      close ($f);\n      return;\n    }\nsub R\
2352 NAplfold2lib\n  {\n    my ($seq, $lib)=@_;\n    my\
2353  $f= new FileHandle;\n    \n    &safe_system (\"t_\
2354 coffee -other_pg RNAplfold2tclib.pl -in=$seq -out=\
2355 $lib\");\n    \n    if ( !-e $lib)\n    {\n      myexit(f\
2356 lush_error(\"RNAplfold failed to compute the secon\
2357 dary structure of $s{$seq}{name}\"));\n  myexit ($\
2358 EXIT_FAILURE);\n       }\n    open ($f, \">>$lib\"\
2359 );\n    print $f \"!CMT: [SOURCE] 2D contact libra\
2360 ry Generated by RNAPlfold (Vienna Package)\\n\";\n\
2361     close $f;\n    return;\n  }\nsub x3dnassr2lib\\
2362 n    {\n      my ($seq, $pdb, $lib)=@_;\n      my \
2363 $outfile=\"dssr-2ndstrs.dbn\";\n      my $f= new F\
2364 ileHandle;\n      \n\n      if (!pg_is_installed (\
2365 \"x3dna-ssr\"))\n       {\n       add_warning ($$,$$, \"x3dn\
2366 a-ssr could not be used to extract RNA secondary s\
2367 tructures. Secondary structures will be predicted \
2368 ab-initio instead with RNAPlfold\");\n    return RN\
2369 Aplfold2lib ($seq,$lib);\n      }\n      \n      safe_s\
2370 ystem (\"x3dna-ssr -i=$pdb >/dev/null 2>/dev/null\\
2371 ");\n      if ( !-e $outfile)\n {\n       myexit(flush\
2372 _error(\"x3dna-ssr failed to compute the secondary\
2373  structure file \"));\n   myexit ($EXIT_FAILURE);\\
2374 n       }\n\n      #Handle situations when the pdb seque\
2375 nce differs from the RNA sequence\n      @out=file\
2376 2array($outfile);\n      my %s=read_fasta_seq ($se\
2377 q);\n      my @names=keys (%s);\n      my $rnaS=uc\
2378 ($s{$names[0]}{seq});\n      my $pdbS=uc($out[1]);\
2379 \n      my $vienna;\n      \n      #x3dna returns \
2380 non legitimate nucleotides\n       $pdbS=~s/[^AGCT\
2381 U]//g;\n      \n      if ($rnaS ne $pdbS)\n     {\n       \
2382 my ($rna,$pdb);\n         my $rnaSS=$rnaS;\n      my $pdbSS\
2383 =$pdbS;\n         $rnaSS=~s/T/U/g;\n      $pdbSS=~s/T/U/g;\\
2384 n         ($rnaSS,$pdbSS)=nw ($rnaSS, $pdbSS);\n          my @r\
2385 naA =split (//,$rnaSS);\n         my @pdbA=split (//,$pd\
2386 bSS);\n   my @SS=split (//, $out[2]);\n   \n      my \
2387 $l=@rnaA;\n       for (my $b=0,my $a=0; $a<$l; $a++)\n\
2388             {\n       if   ($rnaA[$a] ne '-' && $pdbA[$a]\
2389  ne '-'){$vienna.=$SS[$b++];}\n       elsif($rnaA[\
2390 $a] eq '-'){$b++;}\n          elsif($pdbA[$a] eq '-')\
2391 {$vienna.='.';}\n           }\n }\n      else\n {\n       $v\
2392 ienna=$out[2];\n        }\n    \n\n      open ($f, \">seq\
2393 \");\n      print $f \">$names[0]\\n$rnaS\\n\";\n \
2394      close $f;\n      \n      open ($f, \">str\");\
2395 \n      print $f \">$names[0]\\n$vienna\\n\";\n   \
2396    close $f;\n      \n      safe_system (\"t_coffe\
2397 e -other_pg seq_reformat -in seq -in2 str -output \
2398 vienna2tc_lib >$lib\");\n      if ( !-e $lib)\n   \
2399   {\n         myexit(flush_error(\"seq_reformat fail\
2400 ed to convert your secondary structure\"));\n       \
2401   myexit ($EXIT_FAILURE);\n         }\n      \n      o\
2402 pen ($f, \">>$lib\");\n      print $f \"!CMT: [SOU\
2403 RCE] >$names[0] 2D Contact library generated by x3\
2404 dna-ssr\\n\";\n      #print $f \"! Vienna_Format: \
2405 >$names[0]\\n\";\n      #print $f \"! Vienna_Forma\
2406 t: $vienna\\n\";\n      \n      close $f;\n      r\
2407 eturn;\n    }\n\n\nsub file2head\n      {\n     my $fi\
2408 le = shift;\n   my $size = shift;\n     my $f= new FileH\
2409 andle;\n        my $line;\n     open ($f,$file);\n      read ($f,$\
2410 line, $size);\n close ($f);\n   return $line;\n     \
2411  }\nsub file2tail\n      {\n    my $file = shift;\n     m\
2412 y $size = shift;\n      my $f= new FileHandle;\n        my $li\
2413 ne;\n\n open ($f,$file);\n      seek ($f,$size*-1, 2);\\
2414 n       read ($f,$line, $size);\n       close ($f);\n   return $\
2415 line;\n      }\n\n\nsub vtmpnam\n      {\n      my $r=r\
2416 and(100000);\n  my $f=\"file.$r.$$\";\n while (-e $\
2417 f)\n      {\n       $f=vtmpnam();\n       }\n   push (@TMPFIL\
2418 E_LIST, $f);\n  return $f;\n      }\n\nsub myexit\n\
2419   {\n    my $code=@_[0];\n    if ($CLEAN_EXIT_STAR\
2420 TED==1){return;}\n    else {$CLEAN_EXIT_STARTED=1;\
2421 }\n    ### ONLY BARE EXIT\n    exit ($code);\n  }\\
2422 nsub set_error_lock\n    {\n      my $name = shift\
2423 ;\n      my $pid=$$;\n\n\n      &lock4tc ($$,\"LER\
2424 ROR\", \"LSET\", \"$$ -- ERROR: $name $PROGRAM\\n\\
2425 ");\n      return;\n    }\nsub set_lock\n  {\n    \
2426 my $pid=shift;\n    my $msg= shift;\n    my $p=get\
2427 ppid();\n    &lock4tc ($pid,\"LLOCK\",\"LRESET\",\\
2428 "$p$msg\\n\");\n  }\nsub unset_lock\n   {\n\n    m\
2429 y $pid=shift;\n    &lock4tc ($pid,\"LLOCK\",\"LREL\
2430 EASE\",\"\");\n  }\nsub shift_lock\n  {\n    my $f\
2431 rom=shift;\n    my $to=shift;\n    my $from_type=s\
2432 hift;\n    my $to_type=shift;\n    my $action=shif\
2433 t;\n    my $msg;\n\n    if (!&lock4tc($from, $from\
2434 _type, \"LCHECK\", \"\")){return 0;}\n    $msg=&lo\
2435 ck4tc ($from, $from_type, \"LREAD\", \"\");\n    &\
2436 lock4tc ($from, $from_type,\"LRELEASE\", $msg);\n \
2437    &lock4tc ($to, $to_type, $action, $msg);\n    r\
2438 eturn;\n  }\nsub isshellpid\n  {\n    my $p=shift;\
2439 \n    if (!lock4tc ($p, \"LLOCK\", \"LCHECK\")){re\
2440 turn 0;}\n    else\n      {\n   my $c=lock4tc($p, \"\
2441 LLOCK\", \"LREAD\");\n  if ( $c=~/-SHELL-/){return \
2442 1;}\n      }\n    return 0;\n  }\nsub isrootpid\n \
2443  {\n    if(lock4tc (getppid(), \"LLOCK\", \"LCHECK\
2444 \")){return 0;}\n    else {return 1;}\n  }\nsub lo\
2445 ck4tc\n {\n       my ($pid,$type,$action,$value)=@_;\n\
2446           my $fname;\n    my $host=hostname;\n\n          if ($ty\
2447 pe eq \"LLOCK\"){$fname=\"$LOCKDIR/.$pid.$host.loc\
2448 k4tcoffee\";}\n   elsif ( $type eq \"LERROR\"){ $f\
2449 name=\"$LOCKDIR/.$pid.$host.error4tcoffee\";}\n   \
2450 elsif ( $type eq \"LWARNING\"){ $fname=\"$LOCKDIR/\
2451 .$pid.$host.warning4tcoffee\";}\n\n       if ($debug_l\
2452 ock)\n      {\n       print STDERR \"\\n\\t---lock4\
2453 tc(tcg): $action => $fname =>$value (RD: $LOCKDIR)\
2454 \\n\";\n            }\n\n         if    ($action eq \"LCHECK\")\
2455  {return -e $fname;}\n    elsif ($action eq \"LREAD\
2456 \"){return file2string($fname);}\n        elsif ($actio\
2457 n eq \"LSET\") {return string2file ($value, $fname\
2458 , \">>\");}\n     elsif ($action eq \"LRESET\") {ret\
2459 urn string2file ($value, $fname, \">\");}\n       elsi\
2460 f ($action eq \"LRELEASE\")\n       {\n       if ( $\
2461 debug_lock)\n           {\n               my $g=new FileHandle;\n                 o\
2462 pen ($g, \">>$fname\");\n                 print $g \"\\nDestroy\
2463 ed by $$\\n\";\n                  close ($g);\n           safe_system (\
2464 \"mv $fname $fname.old\");\n            }\n           else\n            {\\
2465 n                 unlink ($fname);\n            }\n         }\n   return \"\"\
2466 ;\n     }\n\nsub file2string\n  {\n       my $file=@_[0];\n\
2467           my $f=new FileHandle;\n         my $r;\n        open ($f, \
2468 \"$file\");\n     while (<$f>){$r.=$_;}\n         close ($\
2469 f);\n     return $r;\n  }\nsub file2array\n     {\n       my \
2470 $file=@_[0];\n    my $f=new FileHandle;\n         my @r;\\
2471 n         open ($f, \"$file\");\n         while (<$f>){@r=(@r,\
2472 $_);}\n   close ($f);\n   return @r;\n  }\nsub stri\
2473 ng2file\n    {\n    my ($s,$file,$mode)=@_;\n    m\
2474 y $f=new FileHandle;\n\n    open ($f, \"$mode$file\
2475 \");\n    print $f  \"$s\";\n    close ($f);\n  }\\
2476 n\nBEGIN\n    {\n      srand;\n\n      $SIG{'SIGUP\
2477 '}='signal_cleanup';\n      $SIG{'SIGINT'}='signal\
2478 _cleanup';\n      $SIG{'SIGQUIT'}='signal_cleanup'\
2479 ;\n      $SIG{'SIGILL'}='signal_cleanup';\n      $\
2480 SIG{'SIGTRAP'}='signal_cleanup';\n      $SIG{'SIGA\
2481 BRT'}='signal_cleanup';\n      $SIG{'SIGEMT'}='sig\
2482 nal_cleanup';\n      $SIG{'SIGFPE'}='signal_cleanu\
2483 p';\n\n      $SIG{'SIGKILL'}='signal_cleanup';\n  \
2484     $SIG{'SIGPIPE'}='signal_cleanup';\n      $SIG{\
2485 'SIGSTOP'}='signal_cleanup';\n      $SIG{'SIGTTIN'\
2486 }='signal_cleanup';\n      $SIG{'SIGXFSZ'}='signal\
2487 _cleanup';\n      $SIG{'SIGINFO'}='signal_cleanup'\
2488 ;\n\n      $SIG{'SIGBUS'}='signal_cleanup';\n     \
2489  $SIG{'SIGALRM'}='signal_cleanup';\n      $SIG{'SI\
2490 GTSTP'}='signal_cleanup';\n      $SIG{'SIGTTOU'}='\
2491 signal_cleanup';\n      $SIG{'SIGVTALRM'}='signal_\
2492 cleanup';\n      $SIG{'SIGUSR1'}='signal_cleanup';\
2493 \n\n\n      $SIG{'SIGSEGV'}='signal_cleanup';\n   \
2494    $SIG{'SIGTERM'}='signal_cleanup';\n      $SIG{'\
2495 SIGCONT'}='signal_cleanup';\n      $SIG{'SIGIO'}='\
2496 signal_cleanup';\n      $SIG{'SIGPROF'}='signal_cl\
2497 eanup';\n      $SIG{'SIGUSR2'}='signal_cleanup';\n\
2498 \n      $SIG{'SIGSYS'}='signal_cleanup';\n      $S\
2499 IG{'SIGURG'}='signal_cleanup';\n      $SIG{'SIGCHL\
2500 D'}='signal_cleanup';\n      $SIG{'SIGXCPU'}='sign\
2501 al_cleanup';\n      $SIG{'SIGWINCH'}='signal_clean\
2502 up';\n\n      $SIG{'INT'}='signal_cleanup';\n     \
2503  $SIG{'TERM'}='signal_cleanup';\n      $SIG{'KILL'\
2504 }='signal_cleanup';\n      $SIG{'QUIT'}='signal_cl\
2505 eanup';\n\n      our $debug_lock=$ENV{\"DEBUG_LOCK\
2506 \"};\n\n\n\n\n      foreach my $a (@ARGV){$CL.=\" \
2507 $a\";}\n      if ( $debug_lock ){print STDERR \"\\\
2508 n\\n\\n********** START PG: $PROGRAM *************\
2509 \\n\";}\n      if ( $debug_lock ){print STDERR \"\\
2510 \n\\n\\n**********(tcg) LOCKDIR: $LOCKDIR $$ *****\
2511 ********\\n\";}\n      if ( $debug_lock ){print ST\
2512 DERR \"\\n --- $$ -- $CL\\n\";}\n\n\n\n\n    }\nsu\
2513 b flush_error\n  {\n    my $msg=shift;\n    return\
2514  add_error ($EXIT_FAILURE,$$, $$,getppid(), $msg, \
2515 $CL);\n  }\nsub add_error\n  {\n    my $code=shift\
2516 ;\n    my $rpid=shift;\n    my $pid=shift;\n    my\
2517  $ppid=shift;\n    my $type=shift;\n    my $com=sh\
2518 ift;\n\n    $ERROR_DONE=1;\n    lock4tc ($rpid, \"\
2519 LERROR\",\"LSET\",\"$pid -- ERROR: $type\\n\");\n \
2520    lock4tc ($$, \"LERROR\",\"LSET\", \"$pid -- COM\
2521 : $com\\n\");\n    lock4tc ($$, \"LERROR\",\"LSET\\
2522 ", \"$pid -- STACK: $ppid -> $pid\\n\");\n\n    re\
2523 turn $code;\n  }\nsub add_warning\n  {\n    my $rp\
2524 id=shift;\n    my $pid =shift;\n    my $command=sh\
2525 ift;\n    my $msg=\"$$ -- WARNING: $command\\n\";\\
2526 n    print STDERR \"$msg\";\n    lock4tc ($$, \"LW\
2527 ARNING\", \"LSET\", $msg);\n  }\n\nsub signal_clea\
2528 nup\n  {\n    print dtderr \"\\n**** $$ (tcg) was \
2529 killed\\n\";\n    &cleanup;\n    exit ($EXIT_FAILU\
2530 RE);\n  }\nsub clean_dir\n  {\n    my $dir=@_[0];\\
2531 n    if ( !-d $dir){return ;}\n    elsif (!($dir=~\
2532 /tmp/)){return ;}#safety check 1\n    elsif (($dir\
2533 =~/\\*/)){return ;}#safety check 2\n    else\n    \
2534   {\n   `rm -rf $dir`;\n      }\n    return;\n  }\ns\
2535 ub cleanup\n  {\n    #print stderr \"\\n----tc: $$\
2536  Kills $PIDCHILD\\n\";\n    #kill (SIGTERM,$PIDCHI\
2537 LD);\n    my $p=getppid();\n    $CLEAN_EXIT_STARTE\
2538 D=1;\n\n\n\n    if (&lock4tc($$,\"LERROR\", \"LCHE\
2539 CK\", \"\"))\n      {\n my $ppid=getppid();\n   if (\
2540 !$ERROR_DONE)\n   {\n       &lock4tc($$,\"LERROR\", \
2541 \"LSET\", \"$$ -- STACK: $p -> $$\\n\");\n          &lo\
2542 ck4tc($$,\"LERROR\", \"LSET\", \"$$ -- COM: $CL\\n\
2543 \");\n    }\n      }\n    my $warning=&lock4tc($$, \
2544 \"LWARNING\", \"LREAD\", \"\");\n    my $error=&lo\
2545 ck4tc($$,  \"LERROR\", \"LREAD\", \"\");\n    #rel\
2546 ease error and warning lock if root\n\n    if (isr\
2547 ootpid() && ($warning || $error) )\n      {\n\n pr\
2548 int STDERR \"**************** Summary ************\
2549 *\\n$error\\n$warning\\n\";\n\n &lock4tc($$,\"LERR\
2550 OR\",\"RELEASE\",\"\");\n       &lock4tc($$,\"LWARNING\"\
2551 ,\"RELEASE\",\"\");\n      }\n\n\n    foreach my $\
2552 f (@TMPFILE_LIST)\n      {\n    if (-e $f){unlink ($f\
2553 );}\n      }\n    foreach my $d (@TMPDIR_LIST)\n  \
2554     {\n clean_dir ($d);\n      }\n    #No More Loc\
2555 k Release\n    #&lock4tc($$,\"LLOCK\",\"LRELEASE\"\
2556 ,\"\"); #release lock\n\n    if ( $debug_lock ){pr\
2557 int STDERR \"\\n\\n\\n********** END PG: $PROGRAM \
2558 ($$) *************\\n\";}\n    if ( $debug_lock ){\
2559 print STDERR \"\\n\\n\\n**********(tcg) LOCKDIR: $\
2560 LOCKDIR $$ *************\\n\";}\n  }\nEND\n  {\n\n\
2561     &cleanup();\n  }\n\nsub blast_com2new_blast_co\
2562 m\n    {\n      my $com=shift;\n          if ($com=~/form\
2563 atdb/)\n            {\n       $com=~s/formatdb/makeblastd\
2564 b/;\n         $com=~s/\\-i/\\-in/;\n          if ($com \
2565 =~/pF/){$com=~s/\\-pF/\\-dbtype nucl/;}\n             if\
2566  ($com =~/p F/){$com=~s/\\-p F/\\-dbtype nucl/;}\n\
2567               $com=\"$com -logfile /dev/null\";\n             r\
2568 eturn $com;\n       }\n   else {return $com;}\n\n   \
2569  }\nsub safe_system\n{\n  my $com=shift;\n  my $nt\
2570 ry=shift;\n  my $ctry=shift;\n  my $pid;\n  my $st\
2571 atus;\n  my $ppid=getppid();\n  if ($com eq \"\"){\
2572 return 1;}\n\n  if ( ($com=~/^blast/) ||($com=~/^f\
2573 ormatdb/)){$com=&blast_com2new_blast_com($com);}\n\
2574 \n  if (($pid = fork ()) < 0){return (-1);}\n  if \
2575 ($pid == 0)\n    {\n      set_lock($$, \" -SHELL- \
2576 $com (tcg)\");\n      if( $debug_generic_method ) \
2577 { printf \"~ exec: %s\\n\", $com; }\n      exec ($\
2578 com);\n      if( $debug_generic_method ) { printf \
2579 \"~ exitcode: %s\\n\", $?; }\n    }\n  else\n    {\
2580 \n      lock4tc ($$, \"LLOCK\", \"LSET\", \"$pid\\\
2581 n\");#update parent\n      $PIDCHILD=$pid;\n    }\\
2582 n  if ($debug_lock){printf STDERR \"\\n\\t .... sa\
2583 fe_system (fasta_seq2hmm)  p: $$ c: $pid COM: $com\
2584 \\n\";}\n\n  waitpid ($pid,WTERMSIG);\n\n  shift_l\
2585 ock ($pid,$$, \"LWARNING\",\"LWARNING\", \"LSET\")\
2586 ;\n\n  if ($? == $EXIT_FAILURE || lock4tc($pid, \"\
2587 LERROR\", \"LCHECK\", \"\"))\n    {\n      if ($nt\
2588 ry && $ctry <$ntry)\n   {\n\n     add_warning ($$,$$,\\
2589 "$com failed [retry: $ctry out of $ntry]\");\n    l\
2590 ock4tc ($pid, \"LRELEASE\", \"LERROR\", \"\");\n         \
2591  #if ($com=~/EBI/){$com=~s/EBI/NCBI/;}\n          #elsif \
2592 ($com=~/NCBI/){$com=~s/NCBI/EBI/;}\n\n    return sa\
2593 fe_system ($com, $ntry, ++$ctry);\n     }\n      elsif\
2594  ($ntry == -1)\n        {\n       if (!shift_lock ($pid, $$, \
2595 \"LERROR\", \"LWARNING\", \"LSET\"))\n      {\n    \
2596    add_warning ($$,$$,\"$com failed\");\n           }\n \
2597   else\n            {\n       lock4tc ($pid, \"LRELEASE\"\
2598 , \"LERROR\", \"\");\n      }\n   return $?;}\n    \
2599   else\n        {\n       if (!shift_lock ($pid,$$, \"LERROR\\
2600 ",\"LERROR\", \"LSET\"))\n          {\n       myexit(ad\
2601 d_error ($EXIT_FAILURE,$$,$pid,getppid(), \"UNSPEC\
2602 IFIED system\", $com));\n           }\n }\n    }\n  retu\
2603 rn $?;\n}\n\nsub check_configuration\n    {\n     \
2604  my @l=@_;\n      my $v;\n      foreach my $p (@l)\
2605 \n      {\n\n     if   ( $p eq \"EMAIL\")\n         {\n      \
2606  if ( !($EMAIL=~/@/))\n         {\n             add_warning($$,$$,\"\
2607 Could Not Use EMAIL\");\n               myexit(add_error ($EXIT\
2608 _FAILURE,$$,$$,getppid(),\"EMAIL\",\"$CL\"));\n   \
2609     }\n     }\n   elsif( $p eq \"INTERNET\")\n     \
2610  {\n          if ( !&check_internet_connection())\n             \
2611 {\n               myexit(add_error ($EXIT_FAILURE,$$,$$,getpp\
2612 id(),\"INTERNET\",\"$CL\"));\n          }\n         }\n   elsi\
2613 f( $p eq \"wget\")\n        {\n       if (!&pg_is_ins\
2614 talled (\"wget\") && !&pg_is_installed (\"curl\"))\
2615 \n              {\n               myexit(add_error ($EXIT_FAILURE,$$,$$,g\
2616 etppid(),\"PG_NOT_INSTALLED:wget\",\"$CL\"));\n         }\
2617 \n          }\n   elsif( !(&pg_is_installed ($p)))\n      \
2618   {\n         myexit(add_error ($EXIT_FAILURE,$$,$$,\
2619 getppid(),\"PG_NOT_INSTALLED:$p\",\"$CL\"));\n     \
2620  }\n    }\n      return 1;\n    }\nsub nw\n      {\n    \
2621 my($A,$B)=@_;\n my ($i,$j, $s);\n       my $gep=-2;\n   my\
2622  $match=+2;\n   my $mismatch=0;\n       my ($sub, $ins, $d\
2623 el);\n\n\n      if ($A eq $B){return ($A,$B);}\n        \n      $A=\
2624 ~s/[\\s\\d]//g; \n      $B=~s/[\\s\\d]//g;      \n\n\n  my @r\
2625 A=split ('',$A);\n      my @rB=split ('',$B);\n \n      #eva\
2626 luate substitutions\n   my $lenA=@rA;\n my $lenB=@rB\
2627 ;\n     \n      for ($i=0; $i<=$lenA; $i++){$smat[$i][0]=$i\
2628 *$gep;$tb[$i][0 ]= 1;}\n        for ($j=0; $j<=$lenB; $j+\
2629 +){$smat[0][$j]=$j*$gep;$tb[0 ][$j]=-1;}\n      \n      for \
2630 ($i=1; $i<=$lenA; $i++)\n         {\n       for ($j=1; $j<\
2631 =$lenB; $j++)\n       {\n               if ($rA[$i-1] eq $rB[$j\
2632 -1]){$s=$match;}\n              else {$s=$mismatch;}\n          \n              $s\
2633 ub=$smat[$i-1][$j-1]+$s;\n              $del=$smat[$i  ][$j-1]\
2634 +$gep;\n                $ins=$smat[$i-1][$j  ]+$gep;\n          \n              if  \
2635  ($sub>=$del && $sub>=$ins){$smat[$i][$j]=$sub;$tb\
2636 [$i][$j]=0;}\n          elsif($del>$ins){$smat[$i][$j]=$de\
2637 l;$tb[$i][$j]=-1;}\n            else {$smat[$i][$j]=$ins;$tb\
2638 [$i][$j]=1;}\n          }\n       }\n   #print \"\\n---- SCORE=$\
2639 smat[$lenA][$lenB]\\n\";\n      \n      $i=$lenA;\n     $j=$lenB\
2640 ;\n     my $aln_len=0;\n\n      while (!($i==0 && $j==0))\n\
2641           {\n       if ($tb[$i][$j]==0)\n           {\n       $aA\
2642 [$aln_len]=$rA[--$i];\n       $aB[$aln_len]=$rB[--\
2643 $j];\n      }\n   elsif ($tb[$i][$j]==-1)\n         {\n\
2644               $aA[$aln_len]='-';\n            $aB[$aln_len]=$r\
2645 B[--$j];\n          }\n   elsif ($tb[$i][$j]==1)\n          \
2646 {\n           $aA[$aln_len]=$rA[--$i];\n              $aB[$al\
2647 n_len]='-';\n       }\n   $aln_len++;\n   }\n   \n      \n      \
2648 @aA=reverse (@aA);\n    @aB=reverse (@aB);\n    my $sA=j\
2649 oin('',@aA);\n  my $sB=join('',@aB);\n  return ($sA,\
2650 $sB);\n      }\n      \n$program=\"T-COFFEE (Versi\
2651 on_11.00.8cbe486)\";\\n\n","use Env;\nuse FileHand\
2652 le;\nuse Cwd;\nuse File::Path;\nuse Sys::Hostname;\
2653 \nmy $f = new FileHandle;\n\nopen ($f, $ARGV[1]);\\
2654 n$atom=$ARGV[0];\n\n$atom=~s/PRIME/\\'/;\nwhile (<\
2655 $f>)\n  {\n    my $l=$_;\n\n    $l=~s/$atom/CA /;\\
2656 n    \n    \n    $l=~s/  G /GLY /g;\n    $l=~s/  C\
2657  /CYS /g;\n    $l=~s/  T /THR /g;\n    $l=~s/  A /\
2658 ALA /g;\n    $l=~s/  U /THR /g;\n    \n    $l=~s/ \
2659 DG /GLY /g;\n    $l=~s/ DC /CYS /g;\n    $l=~s/ DT\
2660  /THR /g;\n    $l=~s/ DA /ALA /g;\n    $l=~s/ DU /\
2661 THR /g;\n    \n    print $l;\n  }\n\n\n\n","*TC_ME\
2662 THOD_FORMAT_01\n******************generic_method.t\
2663 c_method*************\n*\n*       Incorporating ne\
2664 w methods in T-Coffee\n*       Cedric Notredame 26\
2665 /08/08\n*\n***************************************\
2666 ****************\n*This file is a method file\n*Co\
2667 py it and adapt it to your need so that the method\
2668  \n*you want to use can be incorporated within T-C\
2669 offee\n*******************************************\
2670 ************\n*                  USAGE            \
2671                   *\n*****************************\
2672 **************************\n*This file is passed t\
2673 o t_coffee via -in:\n*\n*       t_coffee -in Mgeneric_me\
2674 thod.method\n*\n*       The method is passed to the shel\
2675 l using the following\n*call:\n*<EXECUTABLE><PARAM\
2676 1><IN_FLAG><seq_file><PARAM2><OUT_FLAG><outname><P\
2677 ARAM>\n*\n*Conventions:\n*<FLAG_NAME>   <TYPE>          <VA\
2678 LUE>\n*<VALUE>: no_name         <=> Replaced with a space\
2679 \n*<VALUE>:     &nbsp   <=> Replaced with a space\n*\n**\
2680 **************************************************\
2681 ***\n*                  ALN_MODE                  \
2682          *\n**************************************\
2683 *****************\n*pairwise   ->all Vs all (no se\
2684 lf )[(n2-n)/2aln]\n*m_pairwise ->all Vs all (no se\
2685 lf)[n^2-n]^2\n*s_pairwise ->all Vs all (self): [n^\
2686 2-n]/2 + n\n*multiple   ->All the sequences in one\
2687  go\n*\nALN_MODE                pairwise\n*\n*******************\
2688 ************************************\n*           \
2689        OUT_MODE                           *\n*****\
2690 **************************************************\
2691 \n* mode for the output:\n*External methods: \n* a\
2692 ln -> alignmnent File (Fasta or ClustalW Format)\n\
2693 * lib-> Lib file (TC_LIB_FORMAT_01)\n*Internal Met\
2694 hods:\n* fL -> Internal Function returning a List \
2695 (Librairie)\n* fA -> Internal Function returning a\
2696 n Alignmnent\n*\nOUT_MODE               aln\n******************\
2697 *************************************\n*          \
2698         SEQ_TYPE                           *\n****\
2699 **************************************************\
2700 *\n*G: Genomic, S: Sequence, P: PDB, R: Profile\n*\
2701 Examples:\n*SEQTYPE     S       sequences against sequences \
2702 (default)\n*SEQTYPE     S_P     sequence against structure\
2703 \n*SEQTYPE      P_P     structure against structure\n*SEQTY\
2704 PE      PS      mix of sequences and structure  \n*\nSEQ_TYPE\
2705         S\n*\n\n*****************************************\
2706 **************\n*                COMMAND LINE     \
2707                     *\n*EXECUTABLE PARAM1 IN_FLAG \
2708 OUT_FLAG PARAM             *\n********************\
2709 ***********************************\n*************\
2710 ******************************************\n*     \
2711              EXECUTABLE                         *\\
2712 n*************************************************\
2713 ******\n*name of the executable\n*passed to the sh\
2714 ell: executable\n*      \nEXECUTABLE    tc_generic_method.\
2715 pl\n*\n*******************************************\
2716 ************\n*                  IN_FLAG          \
2717                    *\n****************************\
2718 ***************************\n*IN_FLAG\n*flag indic\
2719 ating the name of the in coming sequences\n*IN_FLA\
2720 G S no_name ->no flag\n*IN_FLAG S &bnsp-in&bnsp ->\
2721  \" -in \"\n*\nIN_FLAG          -infile=\n*\n*************\
2722 ******************************************\n*     \
2723              OUT_FLAG                           *\\
2724 n*************************************************\
2725 ******\n*OUT_FLAG\n*flag indicating the name of th\
2726 e out-coming data\n*same conventions as IN_FLAG\n*\
2727 OUT_FLAG        S no_name ->no flag\n*if you want to redi\
2728 rect, pass the parameters via PARAM1\n*set OUT_FLA\
2729 G to >\n*\nOUT_FLAG             -outfile=\n*\n***************\
2730 ****************************************\n*       \
2731            PARAM_1                              *\\
2732 n*************************************************\
2733 ******\n*<EXECUTABLE><PARAM1><IN_FLAG><seq_file><P\
2734 ARAM2><OUT_FLAG><outname><PARAM>\n*Parameters sent\
2735  to the EXECUTABLE and specified *before* IN_FLAG \
2736 \n*If there is more than 1 PARAM line, the lines a\
2737 re\n*concatenated\n*Command_line: @EP@PARAM@-gapop\
2738 en%e10%s-gapext%e20\n*  %s white space\n*       %e equal \
2739 sign\n*\n*PARAM1        \n*\n*\n*\n**********************\
2740 *********************************\n*              \
2741     PARAM_2                              *\n******\
2742 *************************************************\\
2743 n*<EXECUTABLE><PARAM1><IN_FLAG><seq_file><PARAM2><\
2744 OUT_FLAG><outname><PARAM>\n*Parameters sent to the\
2745  EXECUTABLE and specified \n*after* IN_FLAG and *b\
2746 efore* OUT_FLAG\n*If there is more than 1 PARAM li\
2747 ne, the lines are\n*concatenated\n*\n*PARAM1    \n*\n\
2748 *\n***********************************************\
2749 ********\n*                  PARAM                \
2750               *\n*********************************\
2751 **********************\n*<EXECUTABLE><PARAM1><IN_F\
2752 LAG><seq_file><PARAM2><OUT_FLAG><outname><PARAM>\n\
2753 *Parameters sent to the EXECUTABLE and specified *\
2754 after* OUT_FLAG\n*If there is more than 1 PARAM li\
2755 ne, the lines are\n*concatenated\n*\nPARAM      -mode=s\
2756 eq_msa -method=clustalw\nPARAM   -OUTORDER=INPUT -\
2757 NEWTREE=core -align -gapopen=-15\n*\n*************\
2758 ******************************************\n*     \
2759              END                                *\\
2760 n*************************************************\
2761 ******\n","*TC_METHOD_FORMAT_01\n***************cl\
2762 ustalw_method.tc_method*********\nEXECUTABLE    clust\
2763 alw\nALN_MODE           pairwise\nIN_FLAG               -INFILE=\nOUT_FL\
2764 AG              -OUTFILE=\nOUT_MODE             aln\nPARAM              -gapopen=-10\\
2765 nSEQ_TYPE               S\n************************************\
2766 *************\n","$VersionTag =                   \
2767                                                   \
2768                                                   \
2769             2.43;\nuse Env;\nuse FileHandle;\nuse \
2770 Cwd;\nuse File::Path;\nuse Sys::Hostname;\nour $PI\
2771 DCHILD;\nour $ERROR_DONE;\nour @TMPFILE_LIST;\nour\
2772  $EXIT_FAILURE=1;\nour $EXIT_SUCCESS=0;\n\nour $RE\
2773 FDIR=getcwd;\nour $EXIT_SUCCESS=0;\nour $EXIT_FAIL\
2774 URE=1;\n\nour $PROGRAM=\"extract_from_pdb\";\nour \
2775 $CL=$PROGRAM;\n\nour $CLEAN_EXIT_STARTED;\nour $de\
2776 bug_lock=$ENV{\"DEBUG_LOCK\"};\nour $LOCKDIR=$ENV{\
2777 \"LOCKDIR_4_TCOFFEE\"};\nif (!$LOCKDIR){$LOCKDIR=g\
2778 etcwd();}\nour $ERRORDIR=$ENV{\"ERRORDIR_4_TCOFFEE\
2779 \"};\nour $ERRORFILE=$ENV{\"ERRORFILE_4_TCOFFEE\"}\
2780 ;\n&set_lock ($$);\nif (isshellpid(getppid())){loc\
2781 k4tc(getppid(), \"LLOCK\", \"LSET\", \"$$\\n\");}\\
2782 n      \nour $SILENT=\" >/dev/null 2>/dev/null\";\\
2783 nour $INTERNET=-1;\n\n\n\n\n\n\n\nour $BLAST_MAX_N\
2784 RUNS=2;\nour $EXIT_SUCCESS=0;\nour $EXIT_FAILURE=1\
2785 ;\nour $CONFIGURATION=-1;\nour $REF_EMAIL=\"\";\no\
2786 ur $PROGRAM=\"extract_from_pdb\";\n\n\nmy %onelett\
2787 _prot=&fill_onelett_prot();\nmy %threelett_prot=&f\
2788 ill_threelett_prot();\nmy %onelett_RNA=&fill_onele\
2789 tt_RNA();\nmy %threelett_RNA=&fill_threelett_RNA()\
2790 ;\nmy %onelett_DNA=&fill_onelett_DNA();\nmy %three\
2791 lett_DNA=&fill_threelett_DNA();\n\n\n\n\n\nmy %one\
2792 lett = (\n'P' => \\%onelett_prot,\n'D' => \\%onele\
2793 tt_DNA,\n'R' => \\%onelett_RNA\n);\n\n\nmy %threel\
2794 ett = (\n'P' => \\%threelett_prot,\n'D' => \\%thre\
2795 elett_DNA,\n'R' => \\%threelett_RNA\n);\n\n\n\n\n\\
2796 n\n\nif($ARGV[0]=~/help/ ||$ARGV[0]=~/man/ || $ARG\
2797 V[0]=~/HELP/ || $ARGV[0]=~/Man/ || $ARGV[0] eq \"-\
2798 h\"  || $ARGV[0] eq \"-H\"  )\n{die \"SYNTAX: extr\
2799 act_from_pdb Version $VersionTag        \n      Minimum:      \
2800        [extract_from_pdb file] \n                          OR \n                           \
2801   [... | extract_from_pdb]\n    Flags (Default setti\
2802 ng on the first line)\n    -version...............\
2803 ....[Returns the Version Number]\n           -forc\
2804 e.....................[Forces the file to be treat\
2805 ed like a PDB file]\n                             \
2806          [Regenerates the header and SEQRES fields\
2807 ]\n           -force_name................[Forces t\
2808 he file to be named after name]]\n           -infi\
2809 le.....file...........[Flag can be omited]\n                       \
2810            [File must be pdb or fro pgm]\n        \
2811                               [File can also be co\
2812 mpressed Z or gz]\n                               \
2813        [In the case of a compressed file, you can \
2814 omit the gz|Z extension]\n           -netfile.....\
2815 ..............[File will be fetch from the net usi\
2816 ng wget]\n                                      [w\
2817 get or curl must be installed]\n                  \
2818                     [ftp://ftp.gnu.org/pub/gnu/wge\
2819 t/]\n                                      [http:/\
2820 /curl.haxx.se/]\n                                 \
2821      [Must also be used to retrieve the file from \
2822 a local pdb copy (cf netaddress)]\n           -net\
2823 address................[Address used for the retri\
2824 eving the netfile]\n                              \
2825         [http://www.rcsb.org/pdb/cgi/export.cgi/%%\
2826 .pdb.gz?format=PDB&pdbId=%%&compression=gz]\n     \
2827                                  [http://www.expas\
2828 y.ch/cgi-bin/get-pdb-entry.pl?%%]\n               \
2829                        [local -> will get the file\
2830  from pdb_dir (see pdb_dir)]\n           -netcompr\
2831 ession............[Extension if the netfile comes \
2832 compressed]\n                                     \
2833  [gz]\n           -pdb_dir...................[addr\
2834 ess of the repertory where the pdb is installed]\n\
2835                                       [Supports st\
2836 andard ftp style installation OR every stru in DIR\
2837 ]\n                                      [Give the\
2838  ..../pdb/structure/ dir]\n                       \
2839                [If value omitted, the pg gets it f\
2840 rom the env variable PDB_DIR]\n           -netcomp\
2841 ression_pg.........[gunzip]\n           -is_pdb_na\
2842 me..........name.[Returns 1 if the name is a PDB I\
2843 D, 0 otherwise]\n           -model_type...........\
2844 name.[Returns the model type if valid PDB name]\n \
2845           -is_released_pdb_name name.[Returns 1 if\
2846  the name corresponds to a released PDB file]\n   \
2847         -get_pdb_chains.....name...[Returns the li\
2848 st of chains corresponding to the entry]\n        \
2849    -get_pdb_id.........name...[Returns the PDB id \
2850 within the provided pdb file]\n           -get_fug\
2851 ue_name.....name...[Turns a name into a name valid\
2852  for fugue]\n                                     \
2853  [Uses the netaddress to do so]\n          -chain......F\
2854 IRST..........[Extract the first chain only]\n            \
2855      A B C..........[Extract Several chains if nee\
2856 ded]\n                 ALL............[Extract all the cha\
2857 ins]    \n           -ligand.....ALL............[Extr\
2858 act the ligands in the chain (HETATM)]\n          \
2859              <name1>,<name2>[Extract All the named\
2860  lignds]\n         -ligand_only...............[Extract \
2861 only the ligands]\n           -ligand_list........\
2862 .......[Extract the list of ligands]\n     -coor...\
2863 ....<start>..<end>.[Coordinates of the fragment to\
2864  extract]\n                                   [Omit end to include t\
2865 he Cter]\n           -num........absolute.......[a\
2866 bsolute: relative to the seq] \n                  \
2867      file...........[file: relative to file]\n    \
2868        -num_out....new............[new: start 1->L\
2869 ]\n                       old............[old: kee\
2870 p the file coordinates]\n           -delete.....<s\
2871 tart>..<end>.[Delete from residue start to residue\
2872  end]\n    -atom.......CA.............[Atoms to in\
2873 clude, ALL for all of them]\n                  CA O N......\
2874 ...[Indicate several atoms if needed]\n    -code..\
2875 .....3..............[Use the 1 letter code or the \
2876 3 letters code]\n          -mode.......raw............[O\
2877 utput original pdb file]\n                       p\
2878 db............[Output something that looks like pd\
2879 b]\n                   fasta..........[Output the sequences \
2880 in fasta format]\n                     simple.........[Output \
2881 a format easy to parse in C ]\n            -seq_fi\
2882 eld..ATOM...........[Field used to extract the seq\
2883 uence]\n                       SEQRES.........[Use the complete \
2884 sequence]\n        -seq.......................[Equival\
2885 ent to  -mode fasta]\n     -model......1...........\
2886 ...[Chosen Model in an NMR file]\n           -nodi\
2887 agnostic..............[Switches Error Messages off\
2888 ]\n           -debug.....................[Sets the\
2889  DEBUG ON]\n           -no_remote_pdb_dir.........\
2890 [Do not look for a remote file]\n           -cache\
2891 _pdb.................[Cache Value, default is $HOM\
2892 E/.t_coffee/cache, other values: NO<=> No cache]\n\
2893 \n      Environement Variables\n           These v\
2894 ariables can be set from the environement\n       \
2895     Command line values with the corresponding fla\
2896 g superseed evironement value\n           NO_REMOT\
2897 E_PDB_DIR..........[Prevents the program from sear\
2898 ching remote file: faster]\n           PDB_DIR....\
2899 ................[Indicates where PDB file must be \
2900 fetched (localy)]\n\n    PROBLEMS: please contact ce\
2901 dric.notredame\\@europe.com\\n\";\n      exit ($EXIT_S\
2902 UCCESS);\n}\n\n$np=0;\n$n_para=$#ARGV;\n$model=1;\\
2903 n$pdb_dir=$ENV{'PDB_DIR'};if ($pdb_dir){$pdb_dir.=\
2904 \"/\";}\n$debug=$ENV{'DEBUG_EXTRACT_FROM_PDB'};\n\\
2905 n$no_remote_pdb_dir=$ENV{NO_REMOTE_PDB_DIR};\n$HOM\
2906 E=$ENV{'HOME'};\nif ( $ENV{CACHE_4_TCOFFEE})\n{$ca\
2907 che=$ENV{CACHE_4_TCOFFEE};}\nelse\n{\n    $cache=\\
2908 "$HOME/.t_coffee/cache/\";\n}\n\n   \n$netaddress=\
2909 \"http://www.rcsb.org/pdb/files/%%.pdb.gz\";\n$net\
2910 compression_pg=\"gunzip\";\n$netcompression=\"gz\"\
2911 ;\n\nforeach ($np=0; $np<=$n_para; $np++)\n  {    \
2912     \n    $value=$ARGV[$np];\n   \n    if  ($np==0\
2913  && !($value=~/^-.*/))\n      { \n      $pdb_file= $ARG\
2914 V[$np];\n      }\n    elsif ( !($value=~/^-.*/))\n\
2915       {\n       print \"@ARGV\";\n      die;\n      } \n    \\
2916 n    elsif ($value eq \"-nodiagnostic\"){$nodiagno\
2917 stic=1;}\n    elsif ($value eq \"-force\")\n      \
2918 {\n     $force_pdb=1;\n      }\n    elsif ($value eq \\
2919 "-force_name\")\n      {\n      $force_name=$ARGV[++$np\
2920 ];\n    $force_pdb=1;\n      }\n    \n    elsif ($val\
2921 ue eq \"-is_pdb_name\")\n      {\n      $pdb_file= $ARG\
2922 V[++$np];       \n      $is_pdb_name=1; \n      } \n    elsif\
2923  ($value eq \"-is_released_pdb_name\")\n      {\n       \
2924 $pdb_file= $ARGV[++$np];        \n      $is_released_pdb_name=\
2925 1;\n      }\n    elsif ($value eq \"-model_type\")\
2926 \n      {\n     $pdb_file= $ARGV[++$np];        \n      $model_typ\
2927 e=1;\n      }\n    elsif ($value eq \"-debug\")\n{\
2928 \n      $debug=1;\n}\n    elsif ($value eq \"-get_pdb_c\
2929 hains\")\n{\n   $pdb_file= $ARGV[++$np];\n      $get_pdb_\
2930 chains=1;\n}\n    elsif ($value eq \"-get_pdb_liga\
2931 nds\")\n{\n     $get_pdb_ligands=1;\n}\n    \n    elsi\
2932 f ($value eq \"-get_pdb_id\")\n{\n      $pdb_file= $ARG\
2933 V[++$np];\n     $get_pdb_id=1;\n        \n}\n    \n    elsif \
2934 ( $value eq \"-get_fugue_name\")\n{\n   $pdb_file= $\
2935 ARGV[++$np];\n  $get_fugue_name=1;\n}\n    elsif ( \
2936 $value eq \"-infile\")\n{\n       $pdb_file= $ARGV\
2937 [++$np];\n} \n    elsif ($value eq \"-netfile\")\n\
2938 {\n     $netfile=1;\n   if ( !($ARGV[$np+1]=~/^-.*/)){$p\
2939 db_file= $ARGV[++$np];}\n}\n    elsif (  $value eq\
2940  \"-num\")\n{\n       $numbering= $ARGV[++$np];\n}\
2941 \n    elsif (  $value eq \"-num_out\")\n{\n       \
2942 $numbering_out= $ARGV[++$np];\n}\n    elsif ( $val\
2943 ue eq \"-netaddress\")\n{\n     $netadress=$ARGV[++$np\
2944 ];\n}\n     \n    elsif ( $value eq \"-netcompress\
2945 ion\")\n{\n      $netcompression=$ARGV[++$np];\n}\n   \
2946  elsif ( $value eq \"-pdb_dir\")\n{\n    if ( !($ARG\
2947 V[$np+1]=~/^-.*/)){$pdb_dir= \"$ARGV[++$np]/\";}\n\
2948 }\n     elsif ( $value eq \"-no_remote_pdb_dir\")\\
2949 n{\n    $no_remote_pdb_dir=1;\n if ( !($ARGV[$np+1]=~\
2950 /^-.*/)){$pdb_dir= \"$ARGV[++$np]/\";}\n}\n    els\
2951 if ( $value eq \"-cache\")\n{\n $cache=$ARGV[++$np\
2952 ];\n}\n    \n    elsif ($value eq \"-netcompressio\
2953 n_pg\")\n{\n      $netcompression_pg=$ARGV[++$np];\n}\
2954 \n     elsif ($value eq \"-mode\")\n{\n       $MOD\
2955 E=$ARGV[++$np];\n}\n\n    elsif ( $value eq \"-mod\
2956 el\")\n{\n       $model= $ARGV[++$np];\n}\n    els\
2957 if ($value eq \"-seq_field\" )\n{\n       $seq_fie\
2958 ld= $ARGV[++$np];\n}   \n    elsif ($value eq \"-c\
2959 oor\" )\n{\n       $start= $ARGV[++$np];\n  \n    \
2960    if (($ARGV[$np+1] eq \"\") ||($ARGV[$np+1]=~/^-\
2961 .*/)){$end=\"*\";} \n       else {$end=   $ARGV[++\
2962 $np];}     \n       $coor_set=1;\n}\n    elsif ($v\
2963 alue eq \"-delete\" )\n{\n       $delete_start= $A\
2964 RGV[++$np];\n       $delete_end= $ARGV[++$np];\n  \
2965      $delete_set=1;\n}\n    elsif  ($value eq \"-c\
2966 ode\")\n{\n       $code= $ARGV[++$np];\n}\n    els\
2967 if  ($value eq \"-no_hetatm\")\n{\n       $no_heta\
2968 tm=1;\n}\n    elsif ($value eq \"-chain\")\n{\n   \
2969     while (!($ARGV[$np+1] eq \"\") &&!($ARGV[$np+1\
2970 ]=~/^-.*/))\n{\n              ++$np;\n        @c_chain=(@c\
2971 hain,  $ARGV[$np]);\n         $hc_chain{$ARGV[$np]}=\
2972 $#c_chain+1;\n}           \n}\n    elsif ($value e\
2973 q \"-atom\")\n{\n\n       while (!($ARGV[$np+1] eq\
2974  \"\") && !($ARGV[$np+1]=~/^-.*/))\n{\n       ++$n\
2975 p;\n          $atom[$n_atom++]=  $ARGV[$np];\n        \
2976 $atom_list{$ARGV[$np]}=1;             \n} \n       \n}\n\
2977     elsif ( $value eq \"-unfold\")\n{\n $unfold=1;\
2978 \n}\n    elsif ($value eq \"-seq\" ||$value eq \"-\
2979 fasta\" )\n{\n       $MODE=\"fasta\";\n}\n    elsi\
2980 f ( $value eq \"-version\")\n{\n        print STDERR  \"\\
2981 \nextract_from_pdb: Version $VersionTag\\n\";\n &m\
2982 yexit ($EXIT_SUCCESS);\n}\n    elsif ( $value eq \\
2983 "-ligand\")\n{\n        while (!($ARGV[$np+1] eq \"\") &&\
2984  !($ARGV[$np+1]=~/^-.*/))\n{\n      ++$np;\n        $l\
2985 igand=1;\n          $ligand_list{$ARGV[$np]}=1;       \\
2986 n} \n   $hc_chain{'LIGAND'}=1;\n}\n    elsif ( $valu\
2987 e eq \"-ligand_only\")\n{\n     $ligand_only=1;\n}\n}\\
2988 nif ( $debug)\n{\n    print STDERR \"\\n[DEBUG:ext\
2989 ract_from_pdb] NO_REMOTE_PDB_DIR: $no_remote_pdb_d\
2990 ir\\n\";\n    print STDERR \"\\n[DEBUG:extract_fro\
2991 m_pdb] PDB_DIR: $pdb_dir\\n\";\n}\n\n\nif ( $is_pd\
2992 b_name)\n  {\n    if (&remote_is_pdb_name($pdb_fil\
2993 e))\n      {\n  print \"1\";\n      }\n    else\n  \
2994     {\n print \"0\";\n      }\n    exit ($EXIT_SUC\
2995 CESS);\n  }\n\nif ( $is_released_pdb_name)\n  {\n \
2996    \n    if (&is_released($pdb_file))\n      {\n        p\
2997 rint \"1\";\n      }\n    else\n      {\n       print \"\
2998 0\";\n      }\n    exit ($EXIT_SUCCESS);\n  }\nif \
2999 ($model_type)\n  {\n   \n    printf \"%s\", &pdb2m\
3000 odel_type($pdb_file);\n    exit ($EXIT_SUCCESS);\n\
3001     \n  }\n    \n\nif (!$force_name)\n{\n    $pdb_\
3002 file=~/([^\\/]*)$/;\n    $force_name=$1;\n}\n\n$lo\
3003 cal_pdb_file=$pdb_file;\n\nif ( $debug){print STDE\
3004 RR \"\\n[DEBUG: extract_from_pdb] Scan For $local_\
3005 pdb_file\\n\";}\n\n$mem=$no_remote_pdb_dir;\n$no_r\
3006 emote_pdb_dir=1;\n$tmp_pdb_file=get_pdb_file ($loc\
3007 al_pdb_file);\n\nif ( !-e $tmp_pdb_file || $tmp_pd\
3008 b_file eq \"\")\n  {\n    $local_pdb_file=$pdb_fil\
3009 e;\n    ($local_pdb_file, $suffix_chain)=&pdb_name\
3010 2name_and_chain($local_pdb_file);\n\n    if ($loca\
3011 l_pdb_file)\n      {\n  if ( $debug){print STDERR \\
3012 "\\nSplit $pdb_file into $local_pdb_file and $suff\
3013 ix_chain \\n\";}\n      $tmp_pdb_file=get_pdb_file ($lo\
3014 cal_pdb_file);\n        if ( $tmp_pdb_file ne \"\")\n     {\
3015 \n          @c_chain=();\n          @c_chain=($suffix_chain)\
3016 ;\n         %hc_chain=();\n         $hc_chain{$suffix_chai\
3017 n}=1;\n   }\n      }\n  }\n\n$no_remote_pdb_dir=$m\
3018 em;\nif ($no_remote_pdb_dir==0)\n  {\n    \n    if\
3019  ( !-e $tmp_pdb_file || $tmp_pdb_file eq \"\")\n  \
3020     {\n \n      $local_pdb_file=$pdb_file;\n    ($local_pd\
3021 b_file, $suffix_chain)=&pdb_name2name_and_chain($l\
3022 ocal_pdb_file);\n       if ($local_pdb_file)\n    {\n      \
3023  \n         if ( $debug){print STDERR \"\\nSplit $pdb_\
3024 file into $local_pdb_file and $suffix_chain \\n\";\
3025 }\n         \n      $tmp_pdb_file=get_pdb_file ($local_\
3026 pdb_file);    \n            \n      if ( $tmp_pdb_file ne \
3027 \"\")\n       {\n               @c_chain=();\n          @c_chain=($suff\
3028 ix_chain);\n            %hc_chain=();\n         $hc_chain{$suffix_c\
3029 hain}=1;\n            }\n         }\n      }\n  }\n\nif ( $de\
3030 bug){print STDERR \"\\n$pdb_file copied into ##$tm\
3031 p_pdb_file##\\n\";}\n\nif ( !-e $tmp_pdb_file || $\
3032 tmp_pdb_file eq \"\")\n{\n      if ($is_pdb_name)\n{\n  \
3033     print \"0\\n\"; exit ($EXIT_SUCCESS);\n}\n  els\
3034 e\n{\n  \n          print \"\\nEXTRACT_FROM_PDB: NO RES\
3035 ULT for $pdb_file\\n\";\n           &myexit ($EXIT_SUCCE\
3036 SS);    \n}\n}\n\n\n\n\n%molecule_type=&pdbfile2chain\
3037 type($tmp_pdb_file);\nif ( $debug){print STDERR \"\
3038 \\n\\tSequence Type determined\\n\";}\n\n$pdb_id=&\
3039 get_pdb_id ($tmp_pdb_file);\nif ( $debug){print ST\
3040 DERR \"\\n\\tID: $pdb_id (for $tmp_pdb_file)\\n\";\
3041 }\n\nif ( $pdb_id eq \"\"){$pdb_id=$force_name;}\n\
3042 \n@f_chain=&get_chain_list ($tmp_pdb_file);\nif ( \
3043 $debug){print STDERR \"\\n\\tChain_list:@f_chain\\\
3044 n\";}\n\nif ( $get_pdb_chains)\n{\n    print \"@f_\
3045 chain\\n\";\n    &myexit ($EXIT_SUCCESS);\n}\nif (\
3046  $get_pdb_ligands)\n{\n    %complete_ligand_list=&\
3047 get_ligand_list ($tmp_pdb_file);\n    print $compl\
3048 ete_ligand_list{\"result\"};\n    &myexit ($EXIT_S\
3049 UCCESS);\n}\n\nelsif ( $get_pdb_id ||$get_fugue_na\
3050 me )\n{\n    if    (@c_chain && $c_chain[0] eq \"F\
3051 IRST\"){$pdb_id=$pdb_id.$f_chain[0];}\n    elsif (\
3052 @c_chain && $c_chain[0] ne \" \"){$pdb_id=$pdb_id.\
3053 $c_chain[0];}\n    \n    print \"$pdb_id\\n\";\n  \
3054   &myexit ($EXIT_SUCCESS);\n    \n}\nelsif ( $is_p\
3055 db_name)\n{\n    printf \"1\\n\";\n    &myexit ($E\
3056 XIT_SUCCESS);\n}\n\n\n\n$structure_file=vtmpnam();\
3057 \n\nif ( $debug){print STDERR \"\\n\\tCheck_point \
3058 #1: $tmp_pdb_file  $structure_file\\n\";}\n\n$INFI\
3059 LE=vfopen (\"$tmp_pdb_file\", \"r\"); \nmy $TMP=vf\
3060 open (\"$structure_file\", \"w\");\n\n$print_model\
3061 =1;\n$in_model=0;\n\nif ( $debug){print STDERR \"\\
3062 \n\\tCheck_point #2\\n\";}\nwhile ( <$INFILE>)\n{\\
3063 n  my $first_model=0;\n  $line=$_;\n\n  if ( !$fir\
3064 st_model && ($line =~/^MODEL\\s*(\\d*)/))\n    {\n\
3065       $first_model=$1;\n      if ($model==1){$mode\
3066 l=$first_model;}\n    }\n  \n  if (($line =~/^MODE\
3067 L\\s*(\\d*)/))\n    {\n      if ($1==$model)\n  {\n\
3068           $in_model=1;\n          $print_model=1;\n       $is_nmr=1;\
3069 \n      }\n      elsif ( $in_model==0)\n        {\n       $print_m\
3070 odel=0;\n       }\n      elsif ( $in_model==1)\n        {\n       l\
3071 ast;\n  }\n    }\n  if ($print_model){print $TMP $l\
3072 ine;}  \n}\nclose ($TMP);\nclose ($INFILE);\n\nif \
3073 ( $debug){print STDERR \"\\n\\tCheck_point #3\\n\"\
3074 ;}      \n\n  if ($numbering eq \"\"){$numbering=\"abso\
3075 lute\";}\n  if ($numbering_out eq \"\"){$numbering\
3076 _out=\"new\";}\n\n  if ( $delete_set && $coor_set)\
3077  {die \"-delete and -coor are mutually exclusive, \
3078 sorry\\n\";}\n  if ( $n_atom==0){$atom_list[$n_ato\
3079 m++]=\"ALL\";$atom_list{$atom_list[0]}=1;}\n  if (\
3080  $seq_field eq \"\"){$seq_field=\"ATOM\";}\n  \n  \
3081 if ( $MODE eq \"\"){$MODE=\"pdb\";}\n  elsif ( $MO\
3082 DE eq \"simple\" && $code==0){$code=1;}\n\n  if ( \
3083 $code==0){$code=3;}\n\n\nif ($f_chain[0] eq \" \")\
3084 {$hc_chain{' '}=1;$c_chain[0]=\" \";}\nelsif (!@c_\
3085 chain){$hc_chain{FIRST}=1;$c_chain[0]=\"FIRST\";}#\
3086 make sure the first chain is taken by default\n\ni\
3087 f    ($hc_chain{ALL}) \n{\n      @c_chain=@f_chain\
3088 ;\n      foreach $e (@c_chain){$hc_chain{$e}=1;}\n\
3089 }\nelsif($hc_chain{FIRST})\n{\n @c_chain=($f_chain\
3090 [0]);\n $hc_chain{$f_chain[0]}=1;\n}\n\n\n$MAIN_HO\
3091 M_CODE=&get_main_hom_code ($structure_file);\n$INF\
3092 ILE=vfopen ($structure_file, \"r\");\n\n\nif ( $MO\
3093 DE eq \"raw_pdb\" || $MODE eq \"raw\")\n{\n    whi\
3094 le (<$INFILE>)\n{       print \"$_\";}\n    close ( $INF\
3095 ILE);\n    &myexit($EXIT_SUCCESS);\n}    \nif ( $M\
3096 ODE eq \"raw4fugue\" )\n{\n    while (<$INFILE>)\n\
3097 {       \n      $l=$_;\n        if ($l=~/^SEQRES/)\n{\n     \n      $\
3098 c= substr($l,11,1);\n       if ($hc_chain {$c}){prin\
3099 t \"$l\";}\n}\n elsif ( $l=~/^ATOM/)\n{\n           $c=s\
3100 ubstr($l,21,1);\n           if ($hc_chain {$c}){print \"\
3101 $l\";}\n}\n}\n    close ( $INFILE);\n    &myexit($\
3102 EXIT_SUCCESS);\n}    \n\nif ( $MODE eq \"pdb\")\n{\
3103 \n\n    $read_header=0;\n    while (<$INFILE>) \n{\
3104 \n          $line=$_;\n     if    ($line =~ /^HEADER/){\
3105 print \"$line\";$read_header=1;}\n}\n    close ($I\
3106 NFILE);\n\n    if (!$read_header)\n{\n  print \"HEA\
3107 DER    UNKNOWN                                 00-\
3108 JAN-00   $force_name\\n\";\n}\n\n    $INFILE=vfope\
3109 n ($structure_file, \"r\");\n    \n    print \"COM\
3110 PND   1 CHAIN:\";\n    $last=pop(@c_chain);\n    f\
3111 oreach $c ( @c_chain){ print \" $c,\";}\n    if ( \
3112 $last eq \" \"){print \" NULL;\\n\";}\n    else \n\
3113 {\n      print \" $last;\\n\";\n}\n    @c_chain=(@\
3114 c_chain, $last);\n    \n    print \"REMARK Output \
3115 of the program extract_from_pdb (Version $VersionT\
3116 ag)\\n\";\n    print \"REMARK Legal PDB format not\
3117  Guaranteed\\n\";\n    print \"REMARK This format \
3118 is not meant to be used in place of the PDB format\
3119 \\n\";\n    print \"REMARK The header refers to th\
3120 e original entry\\n\";\n    print \"REMARK The seq\
3121 uence from the original file has been taken in the\
3122  field: $seq_field\\n\";\n    print \"REMARK extra\
3123 ct_from_pdb, 2001, 2002, 2003, 2004, 2005 2006 (c)\
3124  CNRS and Cedric Notredame\\n\";   \n    if ( $coo\
3125 r_set)\n{\n       print \"REMARK Partial chain: St\
3126 art $start End $end\\n\";\n}\n    if ( $is_nmr)\n{\
3127 \n       print \"REMARK NMR structure: MODEL $mode\
3128 l\\n\";\n}\n   \n    if ( $n_atom!=0)\n{\n       p\
3129 rint \"REMARK Contains Coordinates of: \";\n      \
3130  foreach $a (@atom){print \"$a \";}\n       print \
3131 \"\\n\";\n}  \n}\n\n\n\n\nmy $residue_index = -999\
3132 ;\nmy $old_c = \"TemporaryChain\";\n\nwhile (<$INF\
3133 ILE>) \n{\n     $line=$_;\n\n\n if ($line =~ /^SEQRES/\
3134 )\n{\n\n                @field=/(\\S*)\\s*/g;\n\n               $c= substr($_\
3135 ,11,1);\n\n             \n              $l=$#field;\n           for ($a=4; $a<$#fi\
3136 eld ;)\n{\n                     if (!$onelett{$molecule_type{$c}}->{\
3137 $field[$a]})\n{\n                               splice @field, $a, 1;\n}\n                      \
3138 else \n{\n                              $a++;\n}\n}\n   \n              if ( $c ne $in_cha\
3139 in)\n{\n                        $pdb_chain_list[$n_pdb_chains]=$c;\n                    \
3140 $pdb_chain_len [$n_pdb_chains]=$len;\n                  $in_chain\
3141 =$c;\n                  $n_pdb_chains++;\n}\n   \n              for ( $a=4; $a<\
3142 $#field;$a++)\n{\n                      $complete_seq{$c}[$complete_s\
3143 eq_len{$c}++]=$field[$a];\n}\n}\n    elsif ( $line\
3144 =~/^ATOM/ || ($line=~/^HETATM/ && &is_aa(substr($l\
3145 ine,17,3),substr($line,21,1)) && !$no_hetatm))\n{\\
3146 n\n      \n    $RAW_AT_ID=$AT_ID=substr($line,12,4);\n\
3147         $RES_ID=&is_aa(substr($line,17,3),substr($line,21\
3148 ,1));\n $CHAIN=substr($line,21,1);\n\n    $RES_NO=\
3149 substr($line,22,4);\n   $HOM_CODE=substr ($line, 26,\
3150  1);\n  $TEMP=substr($line,60,6);\n     \n      $TEMP=~s/\\s\
3151 //g;\n        $AT_ID=~s/\\s//g;\n       $RES_ID=~s/\\s//\
3152 g;\n        $RES_NO=~s/\\s//g;\n                \n      if ( $HOM_COD\
3153 E ne $MAIN_HOM_CODE){next;}\n   elsif ( $already_rea\
3154 d2{$CHAIN}{$RES_ID}{$AT_ID}{$RES_NO}){next;}\n  els\
3155 e{$already_read2{$CHAIN}{$RES_ID}{$AT_ID}{$RES_NO}\
3156 =1;}\n  \n      \n      if ($coor_set && $numbering eq \"file\
3157 \" && $residue_index ne $RES_NO)\n{\n       \n      i\
3158 f ( $RES_NO<=$start){$real_start{$CHAIN}++;}\n     \
3159  if ( $RES_NO<=$end){$real_end{$CHAIN}++;}\n}\n el\
3160 sif ($numbering eq \"absolute\")\n{\n       $real_st\
3161 art{$CHAIN}=$start;\n       $real_end{$CHAIN}=$end;\\
3162 n}\n\n        $KEY=\"ALL\";\n        if ( $CHAIN n\
3163 e $in_atom_chain)\n{\n      \n    $pdb_atom_chain_li\
3164 st[$n_pdb_atom_chains]=$c;\n      $pdb_atom_chain_len\
3165  [$n_pdb_atom_chains]=$len;\n     $in_atom_chain=$c;\
3166 \n        $n_pdb_atom_chains++;\n}\n    \n      if ( $residue_i\
3167 ndex ne $RES_NO)\n{\n        $residue_index = $RES_N\
3168 O;\n         $atom_seq{$CHAIN}[$atom_seq_len{$CHAIN}+\
3169 +]=$RES_ID;;\n}\n}\n\n}\nclose ($INFILE);\n\n\n\n\\
3170 n\n\n$INFILE=vfopen ($structure_file, \"r\");\nfor\
3171 each $c (@c_chain)\n{\n\n       if    ( $seq_field eq \"\
3172 SEQRES\"){@pdb_seq=@{$complete_seq{$c}};}\n     elsif \
3173 ( $seq_field eq \"ATOM\")  {@pdb_seq=@{$atom_seq{$\
3174 c}};}\n \n\n    $full_length=$l=$#pdb_seq+1;\n          \n      if\
3175  ( $real_end{$c}==\"*\"){$real_end{$c}=$full_lengt\
3176 h;}\n   if ( $coor_set)\n{         \n\n    if ( $real_end\
3177 {$c} < $l){splice @pdb_seq, $real_end{$c}, $l;}\n       \
3178    if ( $real_start{$c} < $l){splice @pdb_seq, 0, \
3179 $real_start{$c}-1;}                \n      $l=$#pdb_seq;\n}\n\
3180 \n      elsif ( $delete_set)\n{\n          splice @pdb_seq, $\
3181 delete_start, $delete_end-$delete_start+1;\n       $l\
3182 =$#pdb_seq;\n}\n        \n      $new_fasta_name=\"$pdb_id$c\";\
3183 \n      if ( $coor_set)\n{\n       if ( $n_pdb_chains==0){\
3184 $new_fasta_name=\"$new_fasta_name$c\";}\n          $new_\
3185 fasta_name= $new_fasta_name.\"\\_$start\\_$end\";\\
3186 n}\n       \n   if ( $MODE eq \"pdb\")\n{\n        $nl=1;\n\
3187            $n=0;\n         \n      foreach $res ( @pdb_seq)\n           {\
3188 \n              if ( !$n)\n             {\n             \n               printf \"SEQRES %3d %1s\
3189  %4d  \", $nl,$c, $l;\n          $nl++;\n       }\n          $res=~\
3190 s/\\s//g;\n          \n      if ($code==1){ printf \"%\
3191 3s \",$onelett{$molecule_type{$c}}->{$res};}\n     \
3192   elsif  ($code==3){ printf \"%3s \",$res};\n       \
3193  \n          $n++;                \n         if ( $n==13){$n=0;print \
3194 \"\\n\";}\n}\n    if ( $n!=0){print \"\\n\"; $n=0;}\
3195 \n}\n   elsif ( $MODE eq \"simple\")\n{\n         print \"\
3196 # SIMPLE_PDB_FORMAT\\n\";\n       if ( $new_fasta_name\
3197  eq \" \"){$new_fasta_name=\"dummy_name\";}\n     pr\
3198 int \">$new_fasta_name\\n\";\n\n          foreach $res ( \
3199 @pdb_seq)\n{\n        print \"$onelett{$molecule_ty\
3200 pe{$c}}->{$res}\";\n}\n   print \"\\n\";\n}\n   elsi\
3201 f ( $MODE eq \"fasta\")\n{\n      $n=0;\n         print \">\
3202 $new_fasta_name\\n\";\n   \n      foreach $res ( @pdb\
3203 _seq)\n{\n\n          print \"$onelett{$molecule_type\
3204 {$c}}->{$res}\";\n              $n++;\n       if (\
3205  $n==60){print \"\\n\"; $n=0;}\n}\n       print \"\\n\\
3206 "; \n}\n}\n\nif ( $MODE eq \"fasta\")\n{\n     &my\
3207 exit($EXIT_SUCCESS);\n  \n}\n\n  \n  $charcount=0;\
3208 \n  $inchain=\"BEGIN\";\n  $n=0;\n  while (<$INFIL\
3209 E>) \n{\n    $line=$_;\n     \n    if ($line =~/^A\
3210 TOM/  ||  ($line=~/^HETATM/))\n{\n      $line_header=\"\
3211 UNKNWN\";\n     $RES_ID=substr($line,17,3);\n   $chain =\
3212  substr($line,21,1);\n\n        if ($line =~/^ATOM/)\n{\n\
3213             $line_header=\"ATOM\";\n        $RES_ID=(&is_aa(\
3214 $RES_ID,$chain))?&is_aa($RES_ID,$chain):$RES_ID;\n\
3215 }\n     elsif ($line=~/^HETATM/ && ($ligand_list {$RES\
3216 _ID} ||$ligand_list {'ALL'} || !&is_aa($RES_ID,$ch\
3217 ain)))\n{\n         $line_header=\"HETATM\";\n}\n       elsi\
3218 f ($line=~/^HETATM/ && (&is_aa($RES_ID,$chain) && \
3219 !$no_hetatm))\n{\n          $line_header=\"ATOM\";\n      \
3220   $RES_ID=&is_aa($RES_ID,$chain);\n}\n  else\n{\n        \
3221    next;\n}\n\n \n\n    $X=substr($line,30,8);     \n\
3222         $Y=substr($line,38,8);\n        $Z=substr($line,46,8);\n\
3223         $TEMP=substr($line,60,6);\n     \n      $RAW_AT_ID=$AT_ID=\
3224 substr($line,12,4);\n   $CHAIN=substr($line,21,1);\n\
3225         $RES_NO=substr($line,22,4);\n   $HOM_CODE=substr ($\
3226 line, 26, 1);\n \n      $X=~s/\\s//g;\n $Y=~s/\\s//g;\n\
3227         $Z=~s/\\s//g;\n $TEMP=~s/\\s//g;\n      \n      $AT_ID=~s/\\
3228 \s//g;\n        $RES_ID=~s/\\s//g;\n    $RES_NO=~s/\\s//g;\n\
3229 \n      \n      if ( $HOM_CODE ne $MAIN_HOM_CODE){next;}\n      e\
3230 lsif ( $already_read{$CHAIN}{$RES_ID}{$AT_ID}{$RES\
3231 _NO}){next;}\n  else{$already_read{$CHAIN}{$RES_ID}\
3232 {$AT_ID}{$RES_NO}=1;}\n \n      $KEY=\"ALL\";\n\n      \
3233         if ( $RES_NO ==0){$start_at_zero=1;}\n\n        $RES_NO+\
3234 =$start_at_zero;    \n  \n      if ( $current_chain ne $\
3235 CHAIN)\n{\n         $current_chain=$CHAIN;\n        $pos=\
3236 $current_residue=0;\n       $offset=($coor_set)?($re\
3237 al_start{$CHAIN}-1):0;\n            if    ( $seq_field eq\
3238  \"SEQRES\"){@ref_seq=@{$complete_seq{$CHAIN}};}\n\
3239             elsif ( $seq_field eq \"ATOM\")  {@ref_seq=@{\
3240 $atom_seq{$CHAIN}};}\n}\n       \n      if ($current_residue \
3241 != $RES_NO)\n{\n            $current_residue=$RES_NO;\n  \
3242    if    ( $seq_field eq \"SEQRES\"){$pos=$current\
3243 _residue;}\n        elsif ( $seq_field eq \"ATOM\"){$\
3244 pos++;}\n}\n    \n      \n      if ($n_atom==0 || $atom_list{$A\
3245 T_ID}==1 || $atom_list{$KEY}==1)\n{     \n          \n     \
3246  $do_it=(!@c_chain || $hc_chain{$CHAIN} ||$hc_chai\
3247 n{'LIGAND'} );\n            \n      $do_it= ($do_it==1) &&\
3248  ($coor_set==0 ||($pos>=$real_start{$CHAIN} && $po\
3249 s<=$real_end{$CHAIN}));\n           $do_it= ($do_it==1) \
3250 && ($delete_set==0 || $pos<$delete_start ||$pos>$d\
3251 elete_end );\n      if ($ligand==0 && $line_header \
3252 eq \"HETATM\" ){$do_it=0;}\n        if ($ligand_only=\
3253 =1 && $line_header eq \"ATOM\" ){$do_it=0;}\n       \
3254 if ($ligand==1 && $line_header eq \"HETATM\" && $l\
3255 igand_list{$RES_ID}==0 && $ligand_list{\"ALL\"}==0\
3256 ){$do_it=0;} \n     \n      \n      if ( $do_it)\n{\\
3257 n               $n++;\n         $out_pos=$pos;\n                \n             if ( $dele\
3258 te_set)\n{\n              if ( $out_pos< $delete_start){;}\n\
3259                   else {$offset=$delete_end-$delete_start;}\n}  \
3260      \n        \n              if ( $numbering_out eq \"\
3261 new\"){$out_pos-=$offset;}\n           elsif ( $numbe\
3262 ring_out eq \"old\"){$out_pos=$RES_NO;}\n              \\
3263 n       \n             \n              if ( $code==1){$RES_ID\
3264 =$onelett{$molecule_type{$c}}->{$RES_ID};}\n        \\
3265 n              if ($unfold)\n{\n                   $unfolded_x+=5;\n            \
3266    $X=$unfolded_x;\n               $Y=0;\n                 $Z=0;\n                 $\
3267 float=1;\n}\n          else\n{\n                   $float=3;\n}\n\\
3268 n              if ( $MODE eq \"pdb\")\n{\n                 printf \"\
3269 %-6s%5d %-4s %3s %s%4d    %8.3f%8.3f%8.3f  1.00 %5\
3270 .2f\\n\",$line_header, $n, $RAW_AT_ID,$RES_ID,$CHA\
3271 IN,$out_pos, $X, $Y, $Z,$TEMP;            \n}\n        els\
3272 if ( $MODE eq \"simple\")\n{\n              if ( $RES_ID e\
3273 q \"\"){$RES_ID=\"X\";}\n                 printf \"%-6s %5s %s \
3274 %2s %4d    %8.3f %8.3f %8.3f\\n\",$line_header, $A\
3275 T_ID, $RES_ID,($CHAIN eq\"\" || $CHAIN eq \" \")?\\
3276 "A\":$CHAIN,$out_pos, $X, $Y, $Z,$TEMP;\n}\n\n}\n}\
3277 \n}\n}\nprint \"\\n\";\nclose($INFILE);\n\n\nif ( \
3278 $error ne \"\") \n{$error=$error.\"\\nDiagnostic: \
3279    SEQRES and the residues in ATOM are probably In\
3280 compatible\\n\";\n    $error=$error.  \"Recomendat\
3281 ion: Rerun with '-fix 1' in order to ignore the SE\
3282 QRES sequences\\n\";\n}\nif (!$nodiagnostic){print\
3283  STDERR $error;}\n&myexit ( $EXIT_SUCCESS);\n\nsub\
3284  is_released \n  {\n    my ($r);\n    my $in=@_[0]\
3285 ;\n    my $name=&remote_is_pdb_name ($in);\n    my\
3286  $hold=&remote_is_on_hold($in);\n    \n    $r=($na\
3287 me && !$hold)?1:0;\n    return $r;\n  }\nsub remot\
3288 e_is_pdb_name \n{\n    my $in=@_[0];\n    my ($ref\
3289 _file, $pdb);\n    my ($value,$value1,$value2);\n \
3290    my $max=2;\n    \n    $ref_file=\"$cache/pdb_en\
3291 try_type.txt\";\n    \n    if ( $in=~/[^\\w\\d\\:\\
3292 \_]/){return 0;}\n    elsif ($no_remote_pdb_dir==1\
3293 )\n      {\n    my $pdbdir=$ENV{'PDB_DIR'};\n   \n      my $\
3294 r1=\"$pdbdir/derived_data/pdb_entry_type.txt\";\n       \
3295 my $r2=$ref_file;\n     if    (-e $r1){$ref_file=$r1;}\
3296 \n      elsif (-e $r2){$ref_file=$r2;}\n        else\n    {\n    \
3297    my $p=substr ($in,0, 4);\n       add_warning (\"C\
3298 annot find pdb_entry_type.txt;  $p is assumed to b\
3299 e valid; add ftp://ftp.wwpdb.org/pub/pdb/derived_d\
3300 ata/pdb_entry_type.txt in $cache to check name sta\
3301 tus\");\n         }\n      }\n    elsif ( !-e $ref_file \
3302 || (-M $ref_file)>$max || -z $ref_file)\n      {\n\
3303         &url2file(\"ftp://ftp.wwpdb.org/pub/pdb/derived_d\
3304 ata/pdb_entry_type.txt\", $ref_file);\n      }\n  \
3305   $pdb=substr ($in,0, 4);\n    chomp(($value1=`gre\
3306 p -c $pdb $ref_file`));\n    $pdb=lc($pdb);\n    c\
3307 homp(($value2=`grep -c $pdb $ref_file`));\n    $va\
3308 lue=($value1 || $value2)?1:0;\n    $value=($value>\
3309 0)?1:0;\n    \n    return $value;\n  }\n\nsub pdb2\
3310 model_type\n{\n    my $in=@_[0];\n    my ($ref_fil\
3311 e, $pdb);\n    my ($value, $ret);\n\n    if ( $in=\
3312 ~/[^\\w\\d\\:\\_]/){return 0;}\n    $ref_file=\"$c\
3313 ache/pdb_entry_type.txt\";\n    \n    if ( !-e $re\
3314 f_file || (-M $ref_file)>2 || -z $ref_file)\n     \
3315  {\n    &url2file(\"ftp://ftp.wwpdb.org/pub/pdb/deriv\
3316 ed_data/pdb_entry_type.txt\", $ref_file);\n      }\
3317 \n    $pdb=substr ($in,0, 4);\n    $pdb=lc($pdb);\\
3318 n    \n    chomp(($value=`grep $pdb $ref_file`));\\
3319 n    \n    $value=~/^\\S+\\s+\\S+\\s+(\\S+)/;\n   \
3320  $ret=$1;\n    if ( $ret eq\"\"){return \"UNKNOWN\\
3321 ";}\n    \n    return $ret;\n  }\nsub remote_is_on\
3322 _hold\n  {\n    my $in=@_[0];\n    my ($ref_file, \
3323 $pdb);\n    my ($value1, $value2,$value);\n    \n \
3324    if ($no_rmote_pdb==1){return 0;}\n    elsif ( $\
3325 in=~/[^\\w\\d\\:\\_]/){return 0;}\n    $ref_file=\\
3326 "$cache/unreleased.xml\";\n    \n    if ( !-e $ref\
3327 _file || (-M $ref_file)>2 || -z $ref_file)\n      \
3328 {\n     &url2file(\"http://www.rcsb.org/pdb/rest/getUn\
3329 released\",$ref_file);\n      }\n    \n    $pdb=su\
3330 bstr ($in,0, 4);\n    chomp(($value1=`grep -c $pdb\
3331  $ref_file`));\n    $pdb=lc($pdb);\n    chomp(($va\
3332 lue2=`grep -c $pdb $ref_file`));\n    $value=($val\
3333 ue1 || $value2)?1:0;\n    $value=($value>0)?1:0;\n\
3334     return $value;\n  }\nsub is_pdb_file\n{\n    m\
3335 y @arg=@_;\n\n    if ( !-e $arg[0]){return 0;}\n  \
3336   \n    $F=vfopen ($arg[0], \"r\");\n    while ( <\
3337 $F>)\n{\n       if (/^HEADER/)\n{\n         close $F;\n     \
3338 return 1;\n}\n  elsif ( /^SEQRES/)\n{\n     close $\
3339 F;\n        return 1;\n}\n      elsif ( /^ATOM/)\n{\n       \
3340 close $F;\n         return 1;\n}\n}\n    return 0;\n}\\
3341 nsub get_pdb_id\n{\n    my $header_file=@_[0];\n  \
3342   my $id;\n    my $F= new FileHandle;\n    \n    \\
3343 n    $F=vfopen (\"$header_file\", \"r\");\n\n    w\
3344 hile ( <$F>)\n      {\n if ( /HEADER/)\n          {\n      \
3345  if ($debug){print \"$_\";}\n       $id=substr($_,62\
3346 ,4 );\n     return $id;\n         }\n      }\n    close \
3347 ($F);\n    \n    return \"\";\n}\n\nsub get_ligand\
3348 _list\n{\n    my $pdb_file=@_[0];\n    my $chain;\\
3349 n    my $ligand;\n    my %complete_ligand_list;\n \
3350    \n\n    $F=vfopen ($pdb_file, \"r\");\n    whil\
3351 e ( <$F>)\n{\n  if ( /^HETATM/)\n{\n        $line=$_;\\
3352 n           $chain=substr($line,21,1);\n            $ligand=sub\
3353 str($line,17,3);\n          \n      if (!$complete_ligan\
3354 d_list{$chain}{$ligand})\n{\n           \n              $complete_ligan\
3355 d_list{\"result\"}.=\"CHAIN $chain LIGAND $ligand\\
3356 \n\";\n         $complete_ligand_list{$chain}{$ligand}=1;\
3357 \n}\n}\n}\n    close ($F);\n    return %complete_l\
3358 igand_list;\n}\n\nsub get_chain_list \n{\n    my $\
3359 header_file;\n    my @chain_list;\n    my @list;\n\
3360     my $n_chains;\n    my %chain_hasch;\n    my $p\
3361 db_file=@_[0];\n    my $c;\n    my %hasch;\n    my\
3362  $chain;\n  \n    \n    $F=vfopen ($pdb_file, \"r\\
3363 ");\n    while ( <$F>)\n{\n\n\n if (/SEQRES\\s+\\d\
3364 +\\s+(\\S+)/)\n   {\n       $chain = substr($_,11,1)\
3365 ;$chain=~s/\\s//g;if ( $chain eq \"\"){$chain=\" \\
3366 ";}\n       if (!$hasch{$chain}){$hasch{$chain}=1;pu\
3367 sh @chain_list, $chain;}\n        }\n   if (/^ATOM/ || /^\
3368 HETATM/)\n        {\n       $chain = substr($_,21,1); $ch\
3369 ain=~s/\\s//g;if ( $chain eq \"\"){$chain=\" \";}\\
3370 n           if (!$hasch{$chain}){$hasch{$chain}=1;push @\
3371 chain_list, $chain;}\n    }\n      }\n\n\nclose ($F\
3372 );\nif (!@chain_list)\n  {\n    @chain_list=(\"A\"\
3373 );\n  }\n\n\nreturn @chain_list;\n}\n\nsub token_i\
3374 s_in_list\n{\n\n    my @list=@_;\n    my $a;\n    \
3375 \n    for ($a=1; $a<=$#list; $a++)\n{\n if ( $list\
3376 [$a] eq $list[0]){return $a;}\n}\n}\n\nsub pdb_nam\
3377 e2name_and_chain \n{\n    my $pdb_file=@_[0];\n   \
3378  my $pdb_file_in;\n    my @array;\n    my $chain;\\
3379 n    my $c;\n\n    $pdb_file_in=$pdb_file;\n\n    \
3380 $pdb_file=~/^(.{4})/;$pdb_id=$1;\n    @array=($pdb\
3381 _file=~/([\\w])/g);\n  \n  \n    $chain=uc ($array\
3382 [4]);\n    $chain=($chain eq \"\")?\"FIRST\":$chai\
3383 n;\n    \n    return ( $pdb_id, $chain);\n\n    if\
3384  ( $#array==3){return ($pdb_id, \"FIRST\");}\n    \
3385 elsif ( $#array<4){ return ($pdb_id, \"\");}\n    \
3386 else {return ( $pdb_id, $chain);}\n      \n    \n \
3387    \n}\nsub get_main_hom_code \n{\n    my $pdb_fil\
3388 e=@_[0];\n    my %hom, $n, $best, $best_h;\n    op\
3389 en (F, $pdb_file);\n    while (<F>)\n{\n        if ( $_=~\
3390 /^ATOM/)\n{\n       $h=substr ($_,26, 1);\n         $n=+\
3391 +$hom{$h};\n        if ($n>$best)\n{\n          $best=$n;\n             \
3392 $best_h=$h;\n}\n}\n}\n    close (F);\n    return $\
3393 best_h;\n}\n\n\nsub get_pdb_file \n{\n    my ($pdb\
3394 _file_in)=(@_);\n    my $result;\n    my @letter;\\
3395 n    my @chain;\n    my $v;\n    my $pdb_file=$pdb\
3396 _file_in;\n\n    $pdb_file=($pdb_file_in=~/\\S+_S_\
3397 (\\S+)/)?$1:$pdb_file_in;\n    \n    if ($no_remot\
3398 e_pdb_dir==0)\n      {\n        $no_remote_pdb_dir=1;\n $\
3399 result=get_pdb_file3 ($pdb_file);\n     $no_remote_pdb\
3400 _dir=0;\n       if ( $result){return $result;}\n        else\n  \
3401   {\n       \n      lc ($pdb_file);\n       $result=get\
3402 _pdb_file3($pdb_file);\n            return  $result;\n    \
3403 }\n      }\n    else\n      {\n return get_pdb_fil\
3404 e3 ($pdb_file);\n      }\n    \n  }\n\nsub get_pdb\
3405 _file3 \n{\n    my $pdb_file_in=@_[0];\n    my $re\
3406 sult;\n    my @letter;\n    my @chain;\n    my $lc\
3407 file;\n    my $ucfile;\n    my $pdb_file=$pdb_file\
3408 _in;\n    \n    $lcfile=lc $pdb_file;\n    $ucfile\
3409 =uc $pdb_file;\n\n    if ( ($result=get_pdb_file2 \
3410 ($pdb_file))){return $result;}\n    \n\n    if ($l\
3411 cfile ne $pdb_file && ($result=get_pdb_file2 ($lcf\
3412 ile))){return $result;}\n    if ($ucfile ne $pdb_f\
3413 ile && ($result=get_pdb_file2 ($ucfile))){return $\
3414 result;}\n    \n   \n    \n    return \"\";\n}\nsu\
3415 b get_pdb_file2\n{\n    my $pdb_file=@_[0];\n    m\
3416 y $return_value;\n    \n    $return_value=\"\";\n \
3417    \n    if ( ($result=get_pdb_file1 ($pdb_file)))\
3418 {$return_value=$result;}\n    elsif ( !($pdb_file=\
3419 ~/\\.pdb/) && !($pdb_file=~/\\.PDB/))\n{\n      if ( ($\
3420 result=get_pdb_file1 (\"$pdb_file.pdb\"))){$return\
3421 _value=$result;}\n      elsif ( ($result=get_pdb_file1 \
3422 (\"$pdb_file.PDB\"))){$return_value=$result;}\n\n       \
3423 elsif ( ($result=get_pdb_file1 (\"pdb$pdb_file.pdb\
3424 \"))){$return_value=$result;}   \n      elsif ( ($result=\
3425 get_pdb_file1 (\"pdb$pdb_file.PDB\"))){$return_val\
3426 ue=$result;}\n  elsif ( ($result=get_pdb_file1 (\"P\
3427 DB$pdb_file.PDB\"))){$return_value=$result;}\n  els\
3428 if ( ($result=get_pdb_file1 (\"PDB$pdb_file.pdb\")\
3429 )){$return_value=$result;}\n    \n      \n      elsif ( ($resul\
3430 t=get_pdb_file1 (\"$pdb_file.ent\"))){$return_valu\
3431 e=$result;}\n   elsif ( ($result=get_pdb_file1 (\"pd\
3432 b$pdb_file.ent\"))){$return_value=$result;}\n   elsi\
3433 f ( ($result=get_pdb_file1 (\"PDB$pdb_file.ent\"))\
3434 ){$return_value=$result;}\n\n   elsif ( ($result=get\
3435 _pdb_file1 (\"$pdb_file.ENT\"))){$return_value=$re\
3436 sult;}\n        elsif ( ($result=get_pdb_file1 (\"pdb$pdb\
3437 _file.ENT\"))){$return_value=$result;}\n        elsif ( (\
3438 $result=get_pdb_file1 (\"PDB$pdb_file.ENT\"))){$re\
3439 turn_value=$result;}\n  \n      \n      \n}\n    return $retu\
3440 rn_value;\n}\n    \nsub get_pdb_file1\n{\n    my (\
3441 $pdb_file)=(@_);\n    my $return_value;\n    \n\n \
3442    $return_value=\"\";\n    if ( ($result=get_pdb_\
3443 file0 ($pdb_file))){$return_value=$result;}\n    e\
3444 lsif ( ($result=get_pdb_file0 (\"$pdb_file.Z\"))){\
3445 $return_value=$result;}\n    elsif ( ($result=get_\
3446 pdb_file0 (\"$pdb_file.gz\"))){$return_value=$resu\
3447 lt;}\n    elsif ( ($result=get_pdb_file0 (\"$pdb_f\
3448 ile.GZ\"))){$return_value=$result;}\n    return $r\
3449 eturn_value;\n}\nsub get_pdb_file0 \n{ \n    my ($\
3450 pdb_file, $attempt)=(@_);\n    my $pdb_file=@_[0];\
3451 \n    my $tmp_pdb_file;    \n    my $return_value;\
3452 \n\n    if ( !$attempt){$attempt=1;}\n    \n    $l\
3453 ocal_pdb_file=\"$pdb_file\";\n    if ( $local_pdb_\
3454 file eq \"\")\n{\n      $tmp_pdb_file=vtmpnam();\n      open\
3455  F, \">$tmp_pdb_file\";\n       \n      while (<STDIN>){print\
3456  F \"$_\";}\n   close (F);\n    \n      if (-e $tmp_pdb_file\
3457  && &is_pdb_file ( $local_pdb_file))\n{return $tmp\
3458 _pdb_file;}\n}\n\n    $local_pdb_file=\"$pdb_file\\
3459 ";\n    &debug_print (\"\\nTry access local file: \
3460 $local_pdb_file\");\n    \n    $local_pdb_file=&ch\
3461 eck_pdb_file4compression ($local_pdb_file);\n    i\
3462 f ( -e $local_pdb_file && (&is_pdb_file ($local_pd\
3463 b_file) || $force_pdb))\n{\n    &debug_print ( \"\\n\\
3464 \tIs in Current Dir\");\n       $tmp_pdb_file=vtmpnam();\
3465 \n      `cp $local_pdb_file $tmp_pdb_file`;\n   return $t\
3466 mp_pdb_file;\n}\n    else\n{\n  &debug_print (\"\\n\
3467 \\tFile Not in Current Dir\");\n}\n\n    if ($pdb_\
3468 file=~/^pdb/||$pdb_file=~/^PDB/){$pdb_div=substr (\
3469 $pdb_file, 4, 2);}\n    else\n{\n         $pdb_div=subst\
3470 r ($pdb_file, 1, 2);\n}\n    $local_pdb_file=\"$pd\
3471 b_dir/$pdb_div/$pdb_file\";\n    $local_pdb_file=&\
3472 check_pdb_file4compression ( $local_pdb_file);\n  \
3473   &debug_print (\"\\nTry access file From PDB_DIR:\
3474  $local_pdb_file\");\n    if ($pdb_dir && -e $loca\
3475 l_pdb_file && &is_pdb_file ($local_pdb_file))\n{\n\
3476         &debug_print ( \"\\n\\tIs in Local PDB DIR\");\n        \
3477 $tmp_pdb_file=vtmpnam();\n      `cp $local_pdb_file $tm\
3478 p_pdb_file`;\n  return $tmp_pdb_file;\n}\n\n    $lo\
3479 cal_pdb_file=\"$pdb_dir/$pdb_file\";\n    $local_p\
3480 db_file=&check_pdb_file4compression ( $local_pdb_f\
3481 ile);\n    &debug_print (\"\\nTry access file From\
3482  PDB_DIR: local_pdb_file\");\n    if ($pdb_dir && \
3483 -e $local_pdb_file && &is_pdb_file ($local_pdb_fil\
3484 e))\n{\n        &debug_print ( \"\\n\\tIs in Local PDB DI\
3485 R\");\n $tmp_pdb_file=vtmpnam();\n      `cp $local_pdb_\
3486 file $tmp_pdb_file`;\n  return $tmp_pdb_file;\n}\n\\
3487 n    $local_pdb_file=\"$pdb_dir$pdb_file\";\n    $\
3488 local_pdb_file=&check_pdb_file4compression ( $loca\
3489 l_pdb_file);\n    &debug_print (\"\\nTry access fi\
3490 le From PDB_DIR: $local_pdb_file\");\n    if ($pdb\
3491 _dir && -e $local_pdb_file && &is_pdb_file ($local\
3492 _pdb_file))\n{\n        &debug_print ( \"\\n\\tIs in Loca\
3493 l PDB DIR\");\n $tmp_pdb_file=vtmpnam();\n      `cp $lo\
3494 cal_pdb_file $tmp_pdb_file`;\n  return $tmp_pdb_fil\
3495 e;\n}\n    else\n{&debug_print ( \"\\n\\tNot In Lo\
3496 cal Pdb Dir\");}\n\n    if ($cache ne \"NO\" && $c\
3497 ache ne \"no\")\n{\n\n  $local_pdb_file=\"$cache/$p\
3498 db_file\";\n    $local_pdb_file=&check_pdb_file4compr\
3499 ession ( $local_pdb_file);\n    &debug_print(\"\\nTry\
3500  access file From Cache: $local_pdb_file\");\n  if \
3501 (-e $local_pdb_file && &is_pdb_file ($local_pdb_fi\
3502 le))\n{\n           &debug_print ( \"\\n\\tIs in T-Coffe\
3503 e Cache\");\n       $tmp_pdb_file=vtmpnam();\n      `\
3504 cp $local_pdb_file $tmp_pdb_file`;\n        return $t\
3505 mp_pdb_file;\n}\n       else{&debug_print ( \"\\n\\tNot \
3506 in Cache Dir\");}\n}\n\nif (!$no_remote_pdb_dir) \\
3507 n  {\n    my $value=&is_released ($pdb_file);\n   \
3508  my $return_value=\"\";\n    if ($value==1)\n     \
3509  {\n    \n      &debug_print (\"\\n***********************\
3510 ******************************\\nTry Remote Access\
3511  for $pdb_file\");\n    $tmp_pdb_file=vtmpnam();\n      $n\
3512 etcommand=$netaddress;\n        $netcommand=~s/%%/$pdb_fi\
3513 le/g;\n &url2file(\"$netcommand\", \"$tmp_pdb_file\
3514 .$netcompression\");\n  &debug_print(\"\\nREMOTE: $\
3515 netcommand\\n\");\n     \n      $compressed_tmp_file_name=\\
3516 "$tmp_pdb_file.$netcompression\";\n     \n      if ($netcom\
3517 pression && -B $compressed_tmp_file_name)\n       {\n   \
3518     my $r;\n        &debug_print (\"\\n\\tFile Found \
3519 Remotely\");\n      if (($r=safe_system ( \"$netcom\
3520 pression_pg $compressed_tmp_file_name\")!=$EXIT_SU\
3521 CCESS) && $attempts<5)\n              {\n               &debug_print (\
3522 \"\\n\\tProper Download Failed Try again\");\n          un\
3523 link $compressed_tmp_file_name;\n               print \"\\nFail\
3524 ed to Download $compressed_tmp_file_name. New Atte\
3525 mpt $attempt/5\\n\";\n          return &get_pdb_file0($pdb\
3526 _file, $attempt+1);\n         }\n           elsif ($r== $E\
3527 XIT_SUCCESS)\n        {\n               &debug_print (\"\\n\\tPr\
3528 oper Download Succeeded \");\n          $return_value=$tmp\
3529 _pdb_file;\n          }\n           else\n            {\n               &debu\
3530 g_print (\"\\n\\tProper Download Failed \");\n          &d\
3531 ebug_print (\"\\nFile Not Found Remotely\");\n          un\
3532 link $compressed_tmp_file_name;\n             }\n         }\n   \
3533 else\n    {\n\n     &debug_print (\"\\nFile Not Fou\
3534 nd Remotely\");\n           unlink $compressed_tmp_file_\
3535 name;\n   }\n   #Update cache if required\n     if ($cac\
3536 he ne \"no\" && $cache ne \"update\" && -e $return\
3537 _value)\n         {\n       `cp $return_value $cache/$pdb_\
3538 file.pdb`;\n        #`t_coffee -other_pg clean_cache.\
3539 pl -file $pdb_file.pdb -dir $cache`;\n    }\n      \
3540 }\n    &debug_print (\"\\nRemote Download Finished\
3541 \");\n    return $return_value;\n  }\nreturn \"\";\
3542 \n}\n\nsub check_pdb_file4compression \n{\n    my \
3543 $file=@_[0];\n    my $tmp;\n    my $r;\n    \n    \
3544 $tmp=&vtmpnam();\n    if (-e $tmp){unlink $tmp;}\n\
3545     \n    $file=~s/\\/\\//\\//g;\n    if    (-B $f\
3546 ile && ($file=~/\\.Z/)) {`cp $file $tmp.Z`;`rm $tm\
3547 p`;`gunzip $tmp.Z $SILENT`;$r=$tmp;}\n    elsif (-\
3548 B $file && ($file=~/\\.gz/)){`cp $file $tmp.gz`;`g\
3549 unzip $tmp.gz $SILENT`;return $r=$tmp;}\n    elsif\
3550  (-B $file ){`cp $file $tmp.gz`;`gunzip $tmp.gz $S\
3551 ILENT`;$r=$tmp;}\n    elsif ( -e $file ) {$r= $fil\
3552 e;}\n    elsif ( -e \"$file.gz\" ){ `cp $file.gz $\
3553 tmp.gz`;`gunzip     $tmp.gz $SILENT`;$r=$tmp;}    \
3554 \n    elsif ( -e \"$file.Z\") {`cp $file.Z  $tmp.Z\
3555 `; `gunzip $tmp.Z $SILENT`;$r=$tmp;}\n    else  {$\
3556 r= $file;}\n\n    if ( -e \"$tmp.Z\"){unlink \"$tm\
3557 p.Z\";}\n    if ( -e \"$tmp.gz\"){unlink \"$tmp.gz\
3558 \";}\n    \n    return $r;\n    \n}\n\n\n\n\n\n   \
3559  \n\n\n\n\n\n\n\nsub vfopen \n{\n    my $file=@_[0\
3560 ];\n    my $mode=@_[1];\n    my $tmp;\n    my $F =\
3561  new FileHandle;\n    \n    \n    $tmp=$file;\n \n\
3562     \n    if ( $mode eq \"r\" && !-e $file){ myexi\
3563 t(flush_error (\"Cannot open file $file\"));}\n   \
3564  elsif ($mode eq \"w\"){$tmp=\">$file\";}\n    els\
3565 if ($mode eq \"a\"){$tmp=\">>$file\";}\n    \n    \
3566 \n    open ($F,$tmp);\n    return $F;\n}\nsub debu\
3567 g_print\n{\n    my $message =@_[0];\n    if ($debu\
3568 g){print STDERR \"NO_REMOTE_PDB_DIR: $no_remote_pd\
3569 b_dir - $message [DEBUG:extract_from_pdb]\";}\n   \
3570  return;\n}\nsub is_aa \n{\n    my ($aa, $chain) =\
3571 @_;\n\n    my $one;\n    my $trhee;\n    \n    if \
3572 ( $onelett{$molecule_type{$chain}}->{$aa} eq 'X' |\
3573 | !$onelett{$molecule_type{$chain}}->{$aa} ){retur\
3574 n '';}\n    else\n      {\n     $one=$onelett{$molecul\
3575 e_type{$chain}}->{$aa};\n\n     $three=$threelett{$mol\
3576 ecule_type{$chain}}->{$one};\n  \n\n    return $three;\
3577 \n      }\n  }\n\n\n\n\n\nsub url2file\n{\n    my \
3578 ($address, $out, $wget_arg, $curl_arg)=(@_);\n    \
3579 my ($pg, $flag, $r, $arg, $count);\n    \n    if (\
3580 !$CONFIGURATION){&check_configuration (\"wget\", \\
3581 "INTERNET\", \"gzip\");$CONFIGURATION=1;}\n    \n \
3582    if (&pg_is_installed (\"wget\"))   {$pg=\"wget\\
3583 "; $flag=\"-O\";$arg=$wget_arg;}\n    elsif (&pg_i\
3584 s_installed (\"curl\")){$pg=\"curl\"; $flag=\"-o\"\
3585 ;$arg=$curl_arg;}\n    return safe_system (\"$pg $\
3586 flag$out $address >/dev/null 2>/dev/null\");\n\n}\\
3587 n\n\n\n\nsub pdbfile2chaintype\n  {\n    my $file=\
3588 @_[0];\n    my %ct;\n    my $F;\n    \n    $F=vfop\
3589 en ($file, \"r\");\n    while (<$F>)\n      {\n my\
3590  $line=$_;\n    if ($line =~/^ATOM/)\n    {\n       my $\
3591 C=substr($line,21,1);\n     if (!$ct{$C})\n           \
3592 {       \n              my $r=substr($line,17,3);\n             $r=~s/\\s+//;\n\
3593                 if (length ($r)==1){$ct{$C}=\"R\";}\n           elsif (le\
3594 ngth ($r)==2){$ct{$C}=\"D\";}\n         elsif (length ($r\
3595 )==3){$ct{$C}=\"P\";}\n         else \n           {\n               myexi\
3596 t(flush_error(\"ERROR: Could not read RES_ID field\
3597  in file $file\"));\n             }\n         }\n         }\n      \
3598 }\n    close ($F);\n    return %ct;\n  }\n   \n   \
3599  \n\n\n\nsub fill_threelett_RNA\n{\n\n  my %threele\
3600 tt=(\n  'A', '  A',\n   'T', '  T',\n   'U', '  U',\n   '\
3601 C', '  C',\n    'G', '  G',\n   'I', '  I', #Inosine\n  \
3602 );\n    \n      return %threelett;\n\n}\n\n\nsub fill_onel\
3603 ett_RNA\n{\n    my   %onelett=(\n       '  A' => 'A',\n '  \
3604 T' => 'T',\n    '  U' => 'U',\n '  C' => 'C',\n '  G'\
3605  => 'G',\n      'CSL' => 'X',\n 'UMS' => 'X',\n '  I' =\
3606 > 'I',\n        'A' => 'A',\n   'T' => 'T',\n   'U' => 'U',\n\
3607         'C' => 'C',\n   'G' => 'G',\n   'I' => 'I',\n   );\n\n  \
3608 return %onelett;\n\n}\n\n\nsub fill_onelett_DNA\n{\
3609 \n      my   %onelett=(\n       ' DA', 'A',\n   ' DT', 'T',\n   '\
3610  DC', 'C',\n    ' DG', 'G',\n   'DA', 'A',\n    'DT', 'T',\
3611 \n      'DC', 'C',\n    'DG', 'G',\n    );\n\n  return %onelet\
3612 t;\n\n}\n\nsub fill_threelett_DNA\n{\n\n        my %three\
3613 lett=(\n        'A', ' DA',\n   'T', ' DT',\n   'C', ' DC',\n\
3614         'G', ' DG',\n   );\n\n  return %threelett;\n\n}\n\n\\
3615 n\n\nsub fill_threelett_prot\n{  \n  my %threelett\
3616 ;\n\n  %threelett=(\n'A', 'ALA',\n'C', 'CYS',\n'D'\
3617 , 'ASP',\n'E', 'GLU',\n'F', 'PHE',\n'G', 'GLY',\n'\
3618 H', 'HIS',\n'I', 'ILE',\n'K', 'LYS',\n'L', 'LEU',\\
3619 n'N', 'ASN',\n'M', 'MET',\n'P', 'PRO',\n'Q', 'GLN'\
3620 ,\n'R', 'ARG',\n'S', 'SER',\n'T', 'THR',\n'V', 'VA\
3621 L',\n'W', 'TRP',\n'Y', 'TYR',\n);\n\nreturn %three\
3622 lett;\n\n\n}\n\nsub fill_onelett_prot\n{\n    my %\
3623 onelett;\n    \n    %onelett=(\n\n'10A', 'X',\n'11\
3624 O', 'X',\n'12A', 'X',\n'13P', 'X',\n'13R', 'X',\n'\
3625 13S', 'X',\n'14W', 'X',\n'15P', 'X',\n'16A', 'X',\\
3626 n'16G', 'X',\n'1AN', 'X',\n'1AP', 'X',\n'1AR', 'X'\
3627 ,\n'1BH', 'X',\n'1BO', 'X',\n'1C5', 'X',\n'1CU', '\
3628 X',\n'1DA', 'X',\n'1GL', 'X',\n'1GN', 'X',\n'1IN',\
3629  'X',\n'1LU', 'L',\n'1MA', 'X',\n'1MC', 'X',\n'1MG\
3630 ', 'X',\n'1MZ', 'X',\n'1NA', 'X',\n'1NB', 'X',\n'1\
3631 NI', 'X',\n'1PA', 'A',\n'1PC', 'X',\n'1PE', 'X',\n\
3632 '1PG', 'X',\n'1PI', 'A',\n'1PM', 'X',\n'1PN', 'X',\
3633 \n'1PU', 'X',\n'1PY', 'X',\n'1UN', 'X',\n'24T', 'X\
3634 ',\n'25T', 'X',\n'26P', 'X',\n'2AB', 'X',\n'2AM', \
3635 'X',\n'2AN', 'X',\n'2AP', 'X',\n'2AR', 'X',\n'2AS'\
3636 , 'D',\n'2BL', 'X',\n'2BM', 'X',\n'2CP', 'X',\n'2D\
3637 A', 'X',\n'2DG', 'X',\n'2DP', 'X',\n'2DT', 'X',\n'\
3638 2EP', 'X',\n'2EZ', 'X',\n'2FG', 'X',\n'2FL', 'X',\\
3639 n'2FP', 'X',\n'2FU', 'X',\n'2GL', 'X',\n'2GP', 'X'\
3640 ,\n'2HP', 'X',\n'2IB', 'X',\n'2IP', 'X',\n'2LU', '\
3641 L',\n'2MA', 'X',\n'2MD', 'X',\n'2ME', 'X',\n'2MG',\
3642  'X',\n'2ML', 'L',\n'2MO', 'X',\n'2MR', 'R',\n'2MU\
3643 ', 'X',\n'2MZ', 'X',\n'2NO', 'X',\n'2NP', 'X',\n'2\
3644 OG', 'X',\n'2PA', 'X',\n'2PC', 'X',\n'2PE', 'X',\n\
3645 '2PG', 'X',\n'2PH', 'X',\n'2PI', 'X',\n'2PL', 'X',\
3646 \n'2PP', 'X',\n'2PU', 'X',\n'2SI', 'X',\n'2TB', 'X\
3647 ',\n'34C', 'X',\n'35G', 'X',\n'3AA', 'X',\n'3AD', \
3648 'X',\n'3AH', 'H',\n'3AN', 'X',\n'3AP', 'X',\n'3AT'\
3649 , 'X',\n'3BT', 'X',\n'3CH', 'X',\n'3CN', 'X',\n'3C\
3650 O', 'X',\n'3CP', 'X',\n'3DR', 'X',\n'3EP', 'X',\n'\
3651 3FM', 'X',\n'3GA', 'X',\n'3GP', 'X',\n'3HB', 'X',\\
3652 n'3HC', 'X',\n'3HP', 'X',\n'3IB', 'X',\n'3ID', 'X'\
3653 ,\n'3IN', 'X',\n'3MA', 'X',\n'3MB', 'X',\n'3MC', '\
3654 X',\n'3MD', 'D',\n'3MF', 'X',\n'3MP', 'X',\n'3MT',\
3655  'X',\n'3OL', 'X',\n'3PA', 'X',\n'3PG', 'X',\n'3PO\
3656 ', 'X',\n'3PP', 'X',\n'3PY', 'X',\n'49A', 'X',\n'4\
3657 AB', 'X',\n'4AM', 'X',\n'4AN', 'X',\n'4AP', 'X',\n\
3658 '4BA', 'X',\n'4BT', 'X',\n'4CA', 'X',\n'4CO', 'X',\
3659 \n'4HP', 'X',\n'4IP', 'X',\n'4MO', 'X',\n'4MV', 'X\
3660 ',\n'4MZ', 'X',\n'4NC', 'X',\n'4NP', 'X',\n'4OX', \
3661 'X',\n'4PB', 'X',\n'4PN', 'X',\n'4PP', 'X',\n'4SC'\
3662 , 'X',\n'4SU', 'X',\n'4TB', 'X',\n'55C', 'X',\n'5A\
3663 D', 'X',\n'5AN', 'X',\n'5AT', 'X',\n'5CM', 'X',\n'\
3664 5GP', 'X',\n'5HP', 'E',\n'5HT', 'X',\n'5IT', 'X',\\
3665 n'5IU', 'X',\n'5MB', 'X',\n'5MC', 'X',\n'5MD', 'X'\
3666 ,\n'5MP', 'X',\n'5MU', 'X',\n'5NC', 'X',\n'5OB', '\
3667 X',\n'5PA', 'X',\n'5PV', 'X',\n'6AB', 'X',\n'6CT',\
3668  'X',\n'6HA', 'X',\n'6HC', 'X',\n'6HG', 'X',\n'6HT\
3669 ', 'X',\n'6IN', 'X',\n'6MO', 'X',\n'6MP', 'X',\n'6\
3670 PG', 'X',\n'6WO', 'X',\n'70U', 'X',\n'7DG', 'X',\n\
3671 '7HP', 'X',\n'7I2', 'X',\n'7MG', 'X',\n'7MQ', 'X',\
3672 \n'7NI', 'X',\n'87Y', 'X',\n'8AD', 'X',\n'8BR', 'X\
3673 ',\n'8IG', 'X',\n'8IN', 'X',\n'8OG', 'X',\n'95A', \
3674 'X',\n'9AD', 'X',\n'9AM', 'X',\n'9AP', 'X',\n'9DG'\
3675 , 'X',\n'9DI', 'X',\n'9HX', 'X',\n'9OH', 'X',\n'9T\
3676 A', 'X',\n'A12', 'X',\n'A15', 'X',\n'A23', 'X',\n'\
3677 A24', 'X',\n'A26', 'X',\n'A2G', 'X',\n'A2P', 'X',\\
3678 n'A32', 'X',\n'A3P', 'X',\n'A4P', 'X',\n'A5P', 'X'\
3679 ,\n'A70', 'X',\n'A76', 'X',\n'A77', 'X',\n'A78', '\
3680 X',\n'A79', 'X',\n'A80', 'X',\n'A85', 'X',\n'A88',\
3681  'X',\n'A9A', 'X',\n'AA3', 'X',\n'AA4', 'X',\n'AA6\
3682 ', 'X',\n'AAA', 'X',\n'AAB', 'X',\n'AAC', 'X',\n'A\
3683 AE', 'X',\n'AAG', 'R',\n'AAH', 'X',\n'AAM', 'X',\n\
3684 'AAN', 'X',\n'AAP', 'X',\n'AAR', 'R',\n'AAS', 'X',\
3685 \n'AAT', 'X',\n'ABA', 'X',\n'ABC', 'X',\n'ABD', 'X\
3686 ',\n'ABE', 'X',\n'ABH', 'X',\n'ABI', 'X',\n'ABK', \
3687 'X',\n'ABM', 'X',\n'ABN', 'X',\n'ABP', 'X',\n'ABR'\
3688 , 'X',\n'ABS', 'X',\n'ABU', 'X',\n'AC1', 'X',\n'AC\
3689 2', 'X',\n'ACA', 'X',\n'ACB', 'D',\n'ACC', 'C',\n'\
3690 ACD', 'X',\n'ACE', 'X',\n'ACH', 'X',\n'ACI', 'X',\\
3691 n'ACL', 'R',\n'ACM', 'X',\n'ACN', 'X',\n'ACO', 'X'\
3692 ,\n'ACP', 'X',\n'ACQ', 'X',\n'ACR', 'X',\n'ACS', '\
3693 X',\n'ACT', 'X',\n'ACV', 'V',\n'ACX', 'X',\n'ACY',\
3694  'X',\n'AD2', 'X',\n'AD3', 'X',\n'ADC', 'X',\n'ADD\
3695 ', 'X',\n'ADE', 'X',\n'ADH', 'X',\n'ADI', 'X',\n'A\
3696 DM', 'X',\n'ADN', 'X',\n'ADP', 'X',\n'ADQ', 'X',\n\
3697 'ADR', 'X',\n'ADS', 'X',\n'ADT', 'X',\n'ADU', 'X',\
3698 \n'ADW', 'X',\n'ADX', 'X',\n'AE2', 'X',\n'AEA', 'X\
3699 ',\n'AEB', 'X',\n'AEI', 'D',\n'AEN', 'X',\n'AET', \
3700 'T',\n'AF1', 'X',\n'AF3', 'X',\n'AFA', 'D',\n'AFP'\
3701 , 'X',\n'AG7', 'X',\n'AGB', 'X',\n'AGF', 'X',\n'AG\
3702 L', 'X',\n'AGM', 'R',\n'AGN', 'X',\n'AGP', 'X',\n'\
3703 AGS', 'X',\n'AGU', 'X',\n'AH0', 'X',\n'AH1', 'X',\\
3704 n'AHA', 'X',\n'AHB', 'D',\n'AHC', 'X',\n'AHF', 'X'\
3705 ,\n'AHG', 'X',\n'AHH', 'X',\n'AHM', 'X',\n'AHO', '\
3706 X',\n'AHP', 'X',\n'AHS', 'X',\n'AHT', 'Y',\n'AHU',\
3707  'X',\n'AHX', 'X',\n'AI1', 'X',\n'AI2', 'X',\n'AIB\
3708 ', 'X',\n'AIC', 'X',\n'AIM', 'X',\n'AIP', 'X',\n'A\
3709 IQ', 'X',\n'AIR', 'X',\n'AJ3', 'X',\n'AKB', 'X',\n\
3710 'AKG', 'X',\n'AKR', 'X',\n'AL1', 'X',\n'AL2', 'X',\
3711 \n'AL3', 'X',\n'AL4', 'X',\n'AL5', 'X',\n'AL6', 'X\
3712 ',\n'AL7', 'X',\n'AL8', 'X',\n'AL9', 'X',\n'ALA', \
3713 'A',\n'ALB', 'X',\n'ALC', 'X',\n'ALD', 'L',\n'ALE'\
3714 , 'X',\n'ALF', 'X',\n'ALG', 'X',\n'ALL', 'X',\n'AL\
3715 M', 'A',\n'ALN', 'A',\n'ALO', 'T',\n'ALP', 'X',\n'\
3716 ALQ', 'X',\n'ALR', 'X',\n'ALS', 'X',\n'ALT', 'A',\\
3717 n'ALY', 'K',\n'ALZ', 'X',\n'AMA', 'X',\n'AMB', 'X'\
3718 ,\n'AMC', 'X',\n'AMD', 'X',\n'AMG', 'X',\n'AMH', '\
3719 X',\n'AMI', 'X',\n'AML', 'X',\n'AMN', 'X',\n'AMO',\
3720  'X',\n'AMP', 'X',\n'AMQ', 'X',\n'AMR', 'X',\n'AMS\
3721 ', 'X',\n'AMT', 'X',\n'AMU', 'X',\n'AMW', 'X',\n'A\
3722 MX', 'X',\n'AMY', 'X',\n'ANA', 'X',\n'ANB', 'X',\n\
3723 'ANC', 'X',\n'AND', 'X',\n'ANE', 'X',\n'ANI', 'X',\
3724 \n'ANL', 'X',\n'ANO', 'X',\n'ANP', 'X',\n'ANS', 'X\
3725 ',\n'ANT', 'X',\n'AOE', 'X',\n'AOP', 'X',\n'AP1', \
3726 'X',\n'AP2', 'X',\n'AP3', 'X',\n'AP4', 'X',\n'AP5'\
3727 , 'X',\n'AP6', 'X',\n'APA', 'X',\n'APB', 'X',\n'AP\
3728 C', 'X',\n'APE', 'F',\n'APF', 'X',\n'APG', 'X',\n'\
3729 APH', 'A',\n'API', 'X',\n'APL', 'X',\n'APM', 'X',\\
3730 n'APN', 'G',\n'APP', 'X',\n'APQ', 'X',\n'APR', 'X'\
3731 ,\n'APS', 'X',\n'APT', 'X',\n'APU', 'X',\n'APX', '\
3732 X',\n'APY', 'X',\n'APZ', 'X',\n'AQS', 'X',\n'AR1',\
3733  'X',\n'AR2', 'X',\n'ARA', 'X',\n'ARB', 'X',\n'ARC\
3734 ', 'X',\n'ARD', 'X',\n'ARG', 'R',\n'ARH', 'X',\n'A\
3735 RI', 'X',\n'ARM', 'R',\n'ARN', 'X',\n'ARO', 'R',\n\
3736 'ARP', 'X',\n'ARQ', 'X',\n'ARS', 'X',\n'AS1', 'R',\
3737 \n'AS2', 'X',\n'ASA', 'D',\n'ASB', 'D',\n'ASC', 'X\
3738 ',\n'ASD', 'X',\n'ASE', 'X',\n'ASF', 'X',\n'ASI', \
3739 'X',\n'ASK', 'D',\n'ASL', 'X',\n'ASM', 'N',\n'ASO'\
3740 , 'X',\n'ASP', 'D',\n'ASQ', 'X',\n'ASU', 'X',\n'AT\
3741 A', 'X',\n'ATC', 'X',\n'ATD', 'X',\n'ATF', 'X',\n'\
3742 ATG', 'X',\n'ATH', 'X',\n'ATM', 'X',\n'ATO', 'X',\\
3743 n'ATP', 'X',\n'ATQ', 'X',\n'ATR', 'X',\n'ATT', 'X'\
3744 ,\n'ATY', 'X',\n'ATZ', 'X',\n'AUC', 'X',\n'AUR', '\
3745 X',\n'AVG', 'X',\n'AXP', 'X',\n'AYA', 'A',\n'AZ2',\
3746  'X',\n'AZA', 'X',\n'AZC', 'X',\n'AZD', 'X',\n'AZE\
3747 ', 'X',\n'AZI', 'X',\n'AZL', 'X',\n'AZM', 'X',\n'A\
3748 ZR', 'X',\n'AZT', 'X',\n'B12', 'X',\n'B1F', 'F',\n\
3749 'B2A', 'A',\n'B2F', 'F',\n'B2I', 'I',\n'B2V', 'V',\
3750 \n'B3I', 'X',\n'B3P', 'X',\n'B7G', 'X',\n'B96', 'X\
3751 ',\n'B9A', 'X',\n'BA1', 'X',\n'BAA', 'X',\n'BAB', \
3752 'X',\n'BAC', 'X',\n'BAF', 'X',\n'BAH', 'X',\n'BAI'\
3753 , 'X',\n'BAK', 'X',\n'BAL', 'A',\n'BAM', 'X',\n'BA\
3754 O', 'X',\n'BAP', 'X',\n'BAR', 'X',\n'BAS', 'X',\n'\
3755 BAT', 'F',\n'BAY', 'X',\n'BAZ', 'X',\n'BB1', 'X',\\
3756 n'BB2', 'X',\n'BBA', 'X',\n'BBH', 'X',\n'BBS', 'X'\
3757 ,\n'BBT', 'X',\n'BBZ', 'X',\n'BCA', 'X',\n'BCB', '\
3758 X',\n'BCC', 'X',\n'BCD', 'X',\n'BCL', 'X',\n'BCN',\
3759  'X',\n'BCR', 'X',\n'BCS', 'C',\n'BCT', 'X',\n'BCY\
3760 ', 'X',\n'BCZ', 'X',\n'BDA', 'X',\n'BDG', 'X',\n'B\
3761 DK', 'X',\n'BDM', 'X',\n'BDN', 'X',\n'BDS', 'X',\n\
3762 'BE1', 'X',\n'BE2', 'X',\n'BEA', 'X',\n'BEF', 'X',\
3763 \n'BEN', 'X',\n'BEO', 'X',\n'BEP', 'X',\n'BER', 'X\
3764 ',\n'BES', 'X',\n'BET', 'X',\n'BEZ', 'X',\n'BF2', \
3765 'X',\n'BFA', 'X',\n'BFD', 'X',\n'BFP', 'X',\n'BFS'\
3766 , 'X',\n'BFU', 'X',\n'BG6', 'X',\n'BGF', 'X',\n'BG\
3767 G', 'X',\n'BGL', 'X',\n'BGN', 'X',\n'BGP', 'X',\n'\
3768 BGX', 'X',\n'BH4', 'X',\n'BHA', 'X',\n'BHC', 'X',\\
3769 n'BHD', 'D',\n'BHO', 'X',\n'BHS', 'X',\n'BIC', 'X'\
3770 ,\n'BIN', 'X',\n'BIO', 'X',\n'BIP', 'X',\n'BIS', '\
3771 X',\n'BIZ', 'X',\n'BJH', 'X',\n'BJI', 'X',\n'BJP',\
3772  'X',\n'BLA', 'X',\n'BLB', 'X',\n'BLE', 'L',\n'BLG\
3773 ', 'P',\n'BLI', 'X',\n'BLM', 'X',\n'BLV', 'X',\n'B\
3774 LY', 'K',\n'BM1', 'X',\n'BM2', 'X',\n'BM5', 'X',\n\
3775 'BM9', 'X',\n'BMA', 'X',\n'BMD', 'X',\n'BME', 'X',\
3776 \n'BMP', 'X',\n'BMQ', 'X',\n'BMS', 'X',\n'BMT', 'T\
3777 ',\n'BMU', 'X',\n'BMY', 'X',\n'BMZ', 'X',\n'BNA', \
3778 'X',\n'BNG', 'X',\n'BNI', 'X',\n'BNN', 'F',\n'BNO'\
3779 , 'L',\n'BNS', 'X',\n'BNZ', 'X',\n'BO3', 'X',\n'BO\
3780 4', 'X',\n'BOC', 'X',\n'BOG', 'X',\n'BOM', 'X',\n'\
3781 BOT', 'X',\n'BOX', 'X',\n'BOZ', 'X',\n'BPA', 'X',\\
3782 n'BPB', 'X',\n'BPD', 'X',\n'BPG', 'X',\n'BPH', 'X'\
3783 ,\n'BPI', 'X',\n'BPJ', 'X',\n'BPM', 'X',\n'BPN', '\
3784 X',\n'BPO', 'X',\n'BPP', 'X',\n'BPT', 'X',\n'BPY',\
3785  'X',\n'BRB', 'X',\n'BRC', 'X',\n'BRE', 'X',\n'BRI\
3786 ', 'X',\n'BRL', 'X',\n'BRM', 'X',\n'BRN', 'X',\n'B\
3787 RO', 'X',\n'BRS', 'X',\n'BRU', 'X',\n'BRZ', 'X',\n\
3788 'BSB', 'X',\n'BSI', 'X',\n'BSP', 'X',\n'BT1', 'X',\
3789 \n'BT2', 'X',\n'BT3', 'X',\n'BTA', 'L',\n'BTB', 'X\
3790 ',\n'BTC', 'C',\n'BTD', 'X',\n'BTN', 'X',\n'BTP', \
3791 'X',\n'BTR', 'W',\n'BU1', 'X',\n'BUA', 'X',\n'BUB'\
3792 , 'X',\n'BUC', 'X',\n'BUG', 'X',\n'BUL', 'X',\n'BU\
3793 M', 'X',\n'BUQ', 'X',\n'BUT', 'X',\n'BVD', 'X',\n'\
3794 BX3', 'X',\n'BYS', 'X',\n'BZ1', 'X',\n'BZA', 'X',\\
3795 n'BZB', 'X',\n'BZC', 'X',\n'BZD', 'X',\n'BZF', 'X'\
3796 ,\n'BZI', 'X',\n'BZM', 'X',\n'BZO', 'X',\n'BZP', '\
3797 X',\n'BZQ', 'X',\n'BZS', 'X',\n'BZT', 'X',\n'C02',\
3798  'X',\n'C11', 'X',\n'C1O', 'X',\n'C20', 'X',\n'C24\
3799 ', 'X',\n'C2F', 'X',\n'C2O', 'X',\n'C2P', 'X',\n'C\
3800 3M', 'X',\n'C3P', 'X',\n'C3X', 'X',\n'C48', 'X',\n\
3801 'C4M', 'X',\n'C4X', 'X',\n'C5C', 'X',\n'C5M', 'X',\
3802 \n'C5P', 'X',\n'C5X', 'X',\n'C60', 'X',\n'C6C', 'X\
3803 ',\n'C6M', 'X',\n'C78', 'X',\n'C8E', 'X',\n'CA3', \
3804 'X',\n'CA5', 'X',\n'CAA', 'X',\n'CAB', 'X',\n'CAC'\
3805 , 'X',\n'CAD', 'X',\n'CAF', 'C',\n'CAG', 'X',\n'CA\
3806 H', 'X',\n'CAL', 'X',\n'CAM', 'X',\n'CAN', 'X',\n'\
3807 CAO', 'X',\n'CAP', 'X',\n'CAQ', 'X',\n'CAR', 'X',\\
3808 n'CAS', 'C',\n'CAT', 'X',\n'CAV', 'X',\n'CAY', 'C'\
3809 ,\n'CAZ', 'X',\n'CB3', 'X',\n'CB4', 'X',\n'CBA', '\
3810 X',\n'CBD', 'X',\n'CBG', 'X',\n'CBI', 'X',\n'CBL',\
3811  'X',\n'CBM', 'X',\n'CBN', 'X',\n'CBO', 'X',\n'CBP\
3812 ', 'X',\n'CBS', 'X',\n'CBX', 'X',\n'CBZ', 'X',\n'C\
3813 C0', 'X',\n'CC1', 'X',\n'CCC', 'X',\n'CCH', 'X',\n\
3814 'CCI', 'X',\n'CCM', 'X',\n'CCN', 'X',\n'CCO', 'X',\
3815 \n'CCP', 'X',\n'CCR', 'X',\n'CCS', 'C',\n'CCV', 'X\
3816 ',\n'CCY', 'X',\n'CD1', 'X',\n'CDC', 'X',\n'CDE', \
3817 'X',\n'CDF', 'X',\n'CDI', 'X',\n'CDL', 'X',\n'CDM'\
3818 , 'X',\n'CDP', 'X',\n'CDR', 'X',\n'CDU', 'X',\n'CE\
3819 1', 'X',\n'CEA', 'C',\n'CEB', 'X',\n'CEC', 'X',\n'\
3820 CED', 'X',\n'CEF', 'X',\n'CEH', 'X',\n'CEM', 'X',\\
3821 n'CEO', 'X',\n'CEP', 'X',\n'CEQ', 'X',\n'CER', 'X'\
3822 ,\n'CES', 'G',\n'CET', 'X',\n'CFC', 'X',\n'CFF', '\
3823 X',\n'CFM', 'X',\n'CFO', 'X',\n'CFP', 'X',\n'CFS',\
3824  'X',\n'CFX', 'X',\n'CGN', 'X',\n'CGP', 'X',\n'CGS\
3825 ', 'X',\n'CGU', 'E',\n'CH2', 'X',\n'CH3', 'X',\n'C\
3826 HA', 'X',\n'CHB', 'X',\n'CHD', 'X',\n'CHF', 'X',\n\
3827 'CHG', 'G',\n'CHI', 'X',\n'CHN', 'X',\n'CHO', 'X',\
3828 \n'CHP', 'G',\n'CHR', 'X',\n'CHS', 'F',\n'CHT', 'X\
3829 ',\n'CHX', 'X',\n'CIC', 'X',\n'CIN', 'X',\n'CIP', \
3830 'X',\n'CIR', 'X',\n'CIT', 'X',\n'CIU', 'X',\n'CKI'\
3831 , 'X',\n'CL1', 'X',\n'CL2', 'X',\n'CLA', 'X',\n'CL\
3832 B', 'A',\n'CLC', 'S',\n'CLD', 'A',\n'CLE', 'L',\n'\
3833 CLF', 'X',\n'CLK', 'S',\n'CLL', 'X',\n'CLM', 'X',\\
3834 n'CLN', 'X',\n'CLO', 'X',\n'CLP', 'X',\n'CLQ', 'X'\
3835 ,\n'CLR', 'X',\n'CLS', 'X',\n'CLT', 'X',\n'CLX', '\
3836 X',\n'CLY', 'X',\n'CMA', 'R',\n'CMC', 'X',\n'CMD',\
3837  'X',\n'CME', 'C',\n'CMG', 'X',\n'CMK', 'X',\n'CMN\
3838 ', 'X',\n'CMO', 'X',\n'CMP', 'X',\n'CMR', 'X',\n'C\
3839 MS', 'X',\n'CMT', 'C',\n'CMX', 'X',\n'CNA', 'X',\n\
3840 'CNC', 'X',\n'CND', 'X',\n'CNH', 'X',\n'CNM', 'X',\
3841 \n'CNN', 'X',\n'CNO', 'X',\n'CNP', 'X',\n'CO2', 'X\
3842 ',\n'CO3', 'X',\n'CO5', 'X',\n'CO8', 'X',\n'COA', \
3843 'X',\n'COB', 'X',\n'COC', 'X',\n'COD', 'X',\n'COE'\
3844 , 'X',\n'COF', 'X',\n'COH', 'X',\n'COI', 'X',\n'CO\
3845 J', 'X',\n'COL', 'X',\n'COM', 'X',\n'CON', 'X',\n'\
3846 COP', 'X',\n'COR', 'X',\n'COS', 'X',\n'COT', 'X',\\
3847 n'COY', 'X',\n'CP1', 'G',\n'CP2', 'X',\n'CP4', 'X'\
3848 ,\n'CPA', 'X',\n'CPB', 'X',\n'CPC', 'X',\n'CPD', '\
3849 X',\n'CPG', 'X',\n'CPH', 'X',\n'CPI', 'X',\n'CPM',\
3850  'X',\n'CPN', 'G',\n'CPO', 'X',\n'CPP', 'X',\n'CPQ\
3851 ', 'X',\n'CPR', 'X',\n'CPS', 'X',\n'CPT', 'X',\n'C\
3852 PU', 'X',\n'CPV', 'X',\n'CPY', 'X',\n'CR1', 'X',\n\
3853 'CR6', 'X',\n'CRA', 'X',\n'CRB', 'X',\n'CRC', 'X',\
3854 \n'CRG', 'X',\n'CRH', 'X',\n'CRO', 'T',\n'CRP', 'X\
3855 ',\n'CRQ', 'X',\n'CRS', 'X',\n'CRT', 'X',\n'CRY', \
3856 'X',\n'CSA', 'C',\n'CSB', 'X',\n'CSD', 'C',\n'CSE'\
3857 , 'C',\n'CSH', 'X',\n'CSI', 'X',\n'CSN', 'X',\n'CS\
3858 O', 'C',\n'CSP', 'C',\n'CSR', 'C',\n'CSS', 'C',\n'\
3859 CST', 'X',\n'CSW', 'C',\n'CSX', 'C',\n'CSY', 'X',\\
3860 n'CSZ', 'C',\n'CT3', 'X',\n'CTA', 'X',\n'CTB', 'X'\
3861 ,\n'CTC', 'X',\n'CTD', 'X',\n'CTH', 'T',\n'CTO', '\
3862 X',\n'CTP', 'X',\n'CTR', 'X',\n'CTS', 'X',\n'CTT',\
3863  'X',\n'CTY', 'X',\n'CTZ', 'X',\n'CU1', 'X',\n'CUA\
3864 ', 'X',\n'CUC', 'X',\n'CUL', 'X',\n'CUO', 'X',\n'C\
3865 UZ', 'X',\n'CVI', 'X',\n'CXF', 'X',\n'CXL', 'X',\n\
3866 'CXM', 'M',\n'CXN', 'X',\n'CXP', 'X',\n'CXS', 'X',\
3867 \n'CY1', 'C',\n'CY3', 'X',\n'CYB', 'X',\n'CYC', 'X\
3868 ',\n'CYF', 'C',\n'CYG', 'C',\n'CYH', 'X',\n'CYL', \
3869 'X',\n'CYM', 'C',\n'CYN', 'X',\n'CYO', 'X',\n'CYP'\
3870 , 'X',\n'CYQ', 'C',\n'CYS', 'C',\n'CYU', 'X',\n'CY\
3871 Y', 'X',\n'CYZ', 'X',\n'CZH', 'X',\n'CZZ', 'C',\n'\
3872 D12', 'X',\n'D13', 'X',\n'D16', 'X',\n'D18', 'X',\\
3873 n'D19', 'X',\n'D1P', 'X',\n'D24', 'X',\n'D34', 'X'\
3874 ,\n'D35', 'X',\n'D4D', 'X',\n'D4T', 'X',\n'D6G', '\
3875 X',\n'DA2', 'R',\n'DA3', 'X',\n'DA6', 'X',\n'DA7',\
3876  'X',\n'DAA', 'X',\n'DAB', 'X',\n'DAC', 'X',\n'DAD\
3877 ', 'X',\n'DAE', 'X',\n'DAF', 'X',\n'DAG', 'X',\n'D\
3878 AH', 'A',\n'DAJ', 'X',\n'DAK', 'X',\n'DAL', 'A',\n\
3879 'DAM', 'A',\n'DAN', 'X',\n'DAO', 'X',\n'DAP', 'X',\
3880 \n'DAQ', 'X',\n'DAR', 'R',\n'DAS', 'D',\n'DAT', 'X\
3881 ',\n'DAU', 'X',\n'DAV', 'X',\n'DBA', 'X',\n'DBD', \
3882 'X',\n'DBF', 'X',\n'DBG', 'X',\n'DBI', 'X',\n'DBV'\
3883 , 'X',\n'DBY', 'Y',\n'DCA', 'X',\n'DCB', 'X',\n'DC\
3884 E', 'X',\n'DCF', 'X',\n'DCG', 'X',\n'DCH', 'X',\n'\
3885 DCI', 'I',\n'DCL', 'X',\n'DCM', 'X',\n'DCP', 'X',\\
3886 n'DCS', 'X',\n'DCT', 'X',\n'DCY', 'C',\n'DCZ', 'X'\
3887 ,\n'DDA', 'X',\n'DDB', 'X',\n'DDC', 'X',\n'DDF', '\
3888 X',\n'DDG', 'X',\n'DDH', 'X',\n'DDL', 'X',\n'DDM',\
3889  'X',\n'DDO', 'L',\n'DDP', 'X',\n'DDQ', 'X',\n'DDT\
3890 ', 'Y',\n'DDU', 'X',\n'DEA', 'X',\n'DEB', 'X',\n'D\
3891 EC', 'X',\n'DEF', 'X',\n'DEL', 'X',\n'DEM', 'X',\n\
3892 'DEN', 'X',\n'DEP', 'X',\n'DEQ', 'X',\n'DES', 'X',\
3893 \n'DET', 'X',\n'DFC', 'X',\n'DFG', 'X',\n'DFI', 'X\
3894 ',\n'DFL', 'X',\n'DFO', 'X',\n'DFP', 'X',\n'DFR', \
3895 'X',\n'DFT', 'X',\n'DFV', 'X',\n'DFX', 'X',\n'DG2'\
3896 , 'X',\n'DG3', 'X',\n'DG6', 'X',\n'DGA', 'X',\n'DG\
3897 D', 'X',\n'DGG', 'X',\n'DGL', 'E',\n'DGN', 'Q',\n'\
3898 DGP', 'X',\n'DGT', 'X',\n'DGX', 'X',\n'DH2', 'X',\\
3899 n'DHA', 'A',\n'DHB', 'X',\n'DHC', 'X',\n'DHD', 'X'\
3900 ,\n'DHE', 'X',\n'DHF', 'X',\n'DHG', 'X',\n'DHI', '\
3901 H',\n'DHL', 'X',\n'DHM', 'X',\n'DHN', 'V',\n'DHP',\
3902  'X',\n'DHQ', 'X',\n'DHR', 'X',\n'DHS', 'X',\n'DHT\
3903 ', 'X',\n'DHU', 'X',\n'DHY', 'X',\n'DHZ', 'X',\n'D\
3904 I2', 'X',\n'DI3', 'G',\n'DI4', 'X',\n'DI5', 'X',\n\
3905 'DIA', 'X',\n'DIC', 'X',\n'DIF', 'X',\n'DIG', 'X',\
3906 \n'DII', 'X',\n'DIL', 'I',\n'DIM', 'X',\n'DIO', 'X\
3907 ',\n'DIP', 'X',\n'DIQ', 'X',\n'DIS', 'X',\n'DIT', \
3908 'X',\n'DIV', 'V',\n'DIX', 'X',\n'DIY', 'X',\n'DKA'\
3909 , 'X',\n'DLA', 'X',\n'DLE', 'L',\n'DLF', 'X',\n'DL\
3910 S', 'K',\n'DLY', 'K',\n'DM1', 'X',\n'DM2', 'X',\n'\
3911 DM3', 'X',\n'DM4', 'X',\n'DM5', 'X',\n'DM6', 'X',\\
3912 n'DM7', 'X',\n'DM8', 'X',\n'DM9', 'X',\n'DMA', 'X'\
3913 ,\n'DMB', 'X',\n'DMC', 'X',\n'DMD', 'X',\n'DME', '\
3914 X',\n'DMF', 'X',\n'DMG', 'G',\n'DMH', 'N',\n'DMI',\
3915  'X',\n'DMJ', 'X',\n'DML', 'X',\n'DMM', 'X',\n'DMN\
3916 ', 'X',\n'DMO', 'X',\n'DMP', 'X',\n'DMQ', 'X',\n'D\
3917 MR', 'X',\n'DMS', 'X',\n'DMT', 'X',\n'DMV', 'X',\n\
3918 'DMY', 'X',\n'DNC', 'X',\n'DND', 'X',\n'DNH', 'X',\
3919 \n'DNJ', 'X',\n'DNN', 'X',\n'DNP', 'X',\n'DNQ', 'X\
3920 ',\n'DNR', 'X',\n'DO2', 'X',\n'DO3', 'X',\n'DOA', \
3921 'X',\n'DOB', 'X',\n'DOC', 'X',\n'DOH', 'D',\n'DOM'\
3922 , 'X',\n'DOS', 'X',\n'DOX', 'X',\n'DP5', 'X',\n'DP\
3923 7', 'X',\n'DPA', 'X',\n'DPC', 'X',\n'DPD', 'X',\n'\
3924 DPE', 'X',\n'DPG', 'X',\n'DPH', 'F',\n'DPM', 'X',\\
3925 n'DPN', 'F',\n'DPO', 'X',\n'DPP', 'X',\n'DPR', 'P'\
3926 ,\n'DPS', 'X',\n'DPT', 'X',\n'DPX', 'X',\n'DPY', '\
3927 X',\n'DPZ', 'X',\n'DQH', 'X',\n'DQN', 'X',\n'DR1',\
3928  'X',\n'DRB', 'X',\n'DRC', 'X',\n'DRI', 'X',\n'DRP\
3929 ', 'X',\n'DRT', 'X',\n'DRU', 'X',\n'DSA', 'X',\n'D\
3930 SB', 'X',\n'DSC', 'X',\n'DSD', 'X',\n'DSE', 'S',\n\
3931 'DSI', 'X',\n'DSN', 'S',\n'DSP', 'D',\n'DSR', 'X',\
3932 \n'DSS', 'X',\n'DSX', 'X',\n'DSY', 'X',\n'DTB', 'X\
3933 ',\n'DTD', 'X',\n'DTH', 'T',\n'DTN', 'X',\n'DTO', \
3934 'X',\n'DTP', 'X',\n'DTQ', 'X',\n'DTR', 'W',\n'DTT'\
3935 , 'X',\n'DTY', 'Y',\n'DUD', 'X',\n'DUO', 'X',\n'DU\
3936 R', 'X',\n'DUT', 'X',\n'DVA', 'V',\n'DVR', 'X',\n'\
3937 DX9', 'X',\n'DXA', 'X',\n'DXB', 'X',\n'DXC', 'X',\\
3938 n'DXG', 'X',\n'DXX', 'X',\n'DZF', 'X',\n'E09', 'X'\
3939 ,\n'E20', 'X',\n'E2P', 'X',\n'E3G', 'X',\n'E4N', '\
3940 X',\n'E4P', 'X',\n'E64', 'X',\n'E6C', 'X',\n'E96',\
3941  'X',\n'E97', 'X',\n'EA2', 'X',\n'EAA', 'X',\n'EAP\
3942 ', 'X',\n'EBP', 'X',\n'EBW', 'X',\n'ECO', 'X',\n'E\
3943 DA', 'X',\n'EDC', 'X',\n'EDE', 'X',\n'EDO', 'X',\n\
3944 'EDR', 'X',\n'EEB', 'X',\n'EEE', 'X',\n'EFC', 'X',\
3945 \n'EFZ', 'X',\n'EG1', 'X',\n'EG2', 'X',\n'EG3', 'X\
3946 ',\n'EGC', 'X',\n'EGL', 'X',\n'EHP', 'A',\n'EIC', \
3947 'X',\n'EJT', 'X',\n'ELA', 'X',\n'EMB', 'X',\n'EMC'\
3948 , 'X',\n'EMD', 'X',\n'EMM', 'X',\n'EMO', 'X',\n'EM\
3949 P', 'X',\n'EMR', 'X',\n'ENA', 'X',\n'ENC', 'X',\n'\
3950 ENH', 'X',\n'ENO', 'X',\n'ENP', 'X',\n'EOA', 'X',\\
3951 n'EOH', 'X',\n'EOT', 'X',\n'EOX', 'X',\n'EPA', 'X'\
3952 ,\n'EPE', 'X',\n'EPH', 'X',\n'EPI', 'X',\n'EPN', '\
3953 X',\n'EPO', 'X',\n'EPT', 'X',\n'EPU', 'X',\n'EPX',\
3954  'X',\n'EPY', 'X',\n'EQI', 'X',\n'EQP', 'X',\n'EQU\
3955 ', 'X',\n'ERG', 'X',\n'ERI', 'X',\n'ERY', 'X',\n'E\
3956 SC', 'X',\n'ESD', 'X',\n'ESI', 'X',\n'ESO', 'X',\n\
3957 'ESP', 'X',\n'EST', 'X',\n'ESX', 'X',\n'ETA', 'X',\
3958 \n'ETC', 'X',\n'ETD', 'X',\n'ETF', 'X',\n'ETH', 'X\
3959 ',\n'ETI', 'X',\n'ETN', 'X',\n'ETO', 'X',\n'ETP', \
3960 'X',\n'ETR', 'X',\n'ETS', 'X',\n'ETY', 'X',\n'EU3'\
3961 , 'X',\n'EUG', 'X',\n'EYS', 'C',\n'F09', 'X',\n'F2\
3962 B', 'X',\n'F3S', 'X',\n'F42', 'X',\n'F43', 'X',\n'\
3963 F4S', 'X',\n'F6B', 'X',\n'F6P', 'X',\n'F89', 'X',\\
3964 n'FA1', 'X',\n'FA5', 'F',\n'FAA', 'X',\n'FAB', 'X'\
3965 ,\n'FAC', 'X',\n'FAD', 'X',\n'FAF', 'X',\n'FAG', '\
3966 X',\n'FAM', 'X',\n'FAR', 'X',\n'FAS', 'X',\n'FAT',\
3967  'X',\n'FBA', 'X',\n'FBE', 'X',\n'FBI', 'X',\n'FBP\
3968 ', 'X',\n'FBQ', 'X',\n'FBS', 'X',\n'FBT', 'X',\n'F\
3969 BU', 'X',\n'FCA', 'X',\n'FCB', 'X',\n'FCI', 'X',\n\
3970 'FCN', 'X',\n'FCO', 'X',\n'FCR', 'X',\n'FCT', 'X',\
3971 \n'FCX', 'X',\n'FCY', 'C',\n'FD1', 'F',\n'FD2', 'F\
3972 ',\n'FD3', 'F',\n'FD4', 'F',\n'FDA', 'X',\n'FDC', \
3973 'X',\n'FDI', 'X',\n'FDP', 'X',\n'FDS', 'X',\n'FE2'\
3974 , 'X',\n'FEA', 'X',\n'FEL', 'X',\n'FEM', 'X',\n'FE\
3975 N', 'X',\n'FEO', 'X',\n'FEP', 'X',\n'FER', 'X',\n'\
3976 FES', 'X',\n'FFB', 'X',\n'FFC', 'X',\n'FFF', 'X',\\
3977 n'FFO', 'X',\n'FGL', 'G',\n'FHB', 'X',\n'FHC', 'X'\
3978 ,\n'FHP', 'X',\n'FHU', 'X',\n'FID', 'X',\n'FII', '\
3979 X',\n'FIP', 'X',\n'FK5', 'X',\n'FKA', 'X',\n'FKI',\
3980  'X',\n'FKP', 'X',\n'FL2', 'X',\n'FL9', 'X',\n'FLA\
3981 ', 'A',\n'FLC', 'X',\n'FLD', 'X',\n'FLE', 'L',\n'F\
3982 LF', 'X',\n'FLO', 'X',\n'FLP', 'X',\n'FLT', 'Y',\n\
3983 'FLU', 'X',\n'FLX', 'X',\n'FM1', 'X',\n'FM2', 'X',\
3984 \n'FMA', 'X',\n'FMB', 'X',\n'FMC', 'X',\n'FME', 'M\
3985 ',\n'FMN', 'X',\n'FMP', 'X',\n'FMR', 'X',\n'FMS', \
3986 'X',\n'FMT', 'X',\n'FNE', 'X',\n'FNP', 'X',\n'FNS'\
3987 , 'X',\n'FOC', 'X',\n'FOE', 'X',\n'FOG', 'F',\n'FO\
3988 H', 'X',\n'FOK', 'X',\n'FOL', 'X',\n'FON', 'X',\n'\
3989 FOP', 'X',\n'FOR', 'X',\n'FOS', 'X',\n'FPA', 'X',\\
3990 n'FPC', 'X',\n'FPI', 'X',\n'FPO', 'X',\n'FPP', 'X'\
3991 ,\n'FPT', 'X',\n'FQP', 'X',\n'FRA', 'X',\n'FRD', '\
3992 F',\n'FRU', 'X',\n'FS3', 'X',\n'FS4', 'X',\n'FSB',\
3993  'X',\n'FSO', 'X',\n'FSX', 'X',\n'FTC', 'X',\n'FTP\
3994 ', 'X',\n'FTR', 'W',\n'FTT', 'X',\n'FTY', 'Y',\n'F\
3995 UA', 'X',\n'FUC', 'X',\n'FUM', 'X',\n'FUP', 'X',\n\
3996 'FVF', 'X',\n'FXP', 'X',\n'FXV', 'X',\n'FYA', 'F',\
3997 \n'G16', 'X',\n'G1P', 'X',\n'G20', 'X',\n'G21', 'X\
3998 ',\n'G23', 'X',\n'G26', 'X',\n'G28', 'X',\n'G2F', \
3999 'X',\n'G37', 'X',\n'G39', 'X',\n'G3H', 'X',\n'G3P'\
4000 , 'X',\n'G4D', 'X',\n'G6D', 'X',\n'G6P', 'X',\n'G6\
4001 Q', 'X',\n'G7M', 'X',\n'GA2', 'X',\n'GAA', 'X',\n'\
4002 GAB', 'X',\n'GAC', 'X',\n'GAI', 'X',\n'GAL', 'X',\\
4003 n'GAM', 'X',\n'GAN', 'X',\n'GAO', 'X',\n'GAP', 'X'\
4004 ,\n'GAR', 'G',\n'GAS', 'X',\n'GAT', 'X',\n'GBC', '\
4005 X',\n'GBI', 'X',\n'GBP', 'X',\n'GBS', 'X',\n'GBX',\
4006  'X',\n'GC4', 'X',\n'GCA', 'X',\n'GCD', 'X',\n'GCG\
4007 ', 'G',\n'GCH', 'G',\n'GCK', 'X',\n'GCL', 'X',\n'G\
4008 CM', 'X',\n'GCN', 'X',\n'GCO', 'X',\n'GCP', 'X',\n\
4009 'GCR', 'X',\n'GCS', 'X',\n'GCU', 'X',\n'GD3', 'X',\
4010 \n'GDB', 'X',\n'GDM', 'X',\n'GDN', 'X',\n'GDP', 'X\
4011 ',\n'GDS', 'X',\n'GDU', 'X',\n'GE1', 'X',\n'GE2', \
4012 'X',\n'GE3', 'X',\n'GEA', 'X',\n'GEL', 'X',\n'GEM'\
4013 , 'X',\n'GEN', 'X',\n'GEP', 'X',\n'GER', 'X',\n'GF\
4014 P', 'X',\n'GGB', 'X',\n'GGL', 'E',\n'GGP', 'X',\n'\
4015 GHP', 'G',\n'GIP', 'X',\n'GIS', 'X',\n'GKR', 'X',\\
4016 n'GL2', 'X',\n'GL3', 'G',\n'GL4', 'X',\n'GL5', 'X'\
4017 ,\n'GL7', 'X',\n'GL9', 'X',\n'GLA', 'X',\n'GLB', '\
4018 X',\n'GLC', 'X',\n'GLD', 'X',\n'GLE', 'X',\n'GLF',\
4019  'X',\n'GLG', 'X',\n'GLH', 'Q',\n'GLI', 'X',\n'GLL\
4020 ', 'X',\n'GLM', 'G',\n'GLN', 'Q',\n'GLO', 'X',\n'G\
4021 LP', 'X',\n'GLR', 'X',\n'GLS', 'X',\n'GLT', 'X',\n\
4022 'GLU', 'E',\n'GLV', 'X',\n'GLW', 'X',\n'GLY', 'G',\
4023 \n'GLZ', 'X',\n'GM1', 'X',\n'GMA', 'X',\n'GMC', 'X\
4024 ',\n'GMH', 'X',\n'GMP', 'X',\n'GMY', 'X',\n'GN7', \
4025 'X',\n'GNA', 'X',\n'GNB', 'X',\n'GNH', 'X',\n'GNP'\
4026 , 'X',\n'GNT', 'X',\n'GOA', 'X',\n'GOL', 'X',\n'GO\
4027 X', 'X',\n'GP1', 'X',\n'GP3', 'X',\n'GP4', 'X',\n'\
4028 GP6', 'X',\n'GP8', 'X',\n'GPB', 'E',\n'GPC', 'X',\\
4029 n'GPE', 'X',\n'GPG', 'X',\n'GPI', 'X',\n'GPJ', 'X'\
4030 ,\n'GPL', 'K',\n'GPM', 'X',\n'GPN', 'G',\n'GPP', '\
4031 X',\n'GPR', 'X',\n'GPS', 'X',\n'GPX', 'X',\n'GR1',\
4032  'X',\n'GR3', 'X',\n'GR4', 'X',\n'GSA', 'X',\n'GSB\
4033 ', 'X',\n'GSC', 'G',\n'GSE', 'S',\n'GSH', 'X',\n'G\
4034 SP', 'X',\n'GSR', 'X',\n'GSS', 'X',\n'GT9', 'C',\n\
4035 'GTA', 'X',\n'GTB', 'X',\n'GTD', 'X',\n'GTE', 'X',\
4036 \n'GTH', 'T',\n'GTN', 'X',\n'GTO', 'X',\n'GTP', 'X\
4037 ',\n'GTR', 'X',\n'GTS', 'X',\n'GTT', 'X',\n'GTX', \
4038 'X',\n'GTZ', 'X',\n'GU7', 'X',\n'GUA', 'X',\n'GUD'\
4039 , 'X',\n'GUM', 'X',\n'GUN', 'X',\n'GUP', 'X',\n'GU\
4040 R', 'X',\n'GW3', 'X',\n'GZZ', 'X',\n'H2B', 'X',\n'\
4041 H2P', 'H',\n'H2S', 'X',\n'H2U', 'X',\n'H4B', 'X',\\
4042 n'H5M', 'P',\n'H5P', 'X',\n'HAA', 'X',\n'HAB', 'X'\
4043 ,\n'HAC', 'A',\n'HAD', 'X',\n'HAE', 'X',\n'HAG', '\
4044 X',\n'HAI', 'X',\n'HAM', 'X',\n'HAP', 'X',\n'HAQ',\
4045  'X',\n'HAR', 'R',\n'HAS', 'X',\n'HAV', 'V',\n'HAX\
4046 ', 'X',\n'HAZ', 'X',\n'HBA', 'X',\n'HBC', 'X',\n'H\
4047 BD', 'X',\n'HBI', 'X',\n'HBO', 'X',\n'HBU', 'X',\n\
4048 'HBY', 'X',\n'HC0', 'X',\n'HC1', 'X',\n'HC4', 'X',\
4049 \n'HCA', 'X',\n'HCC', 'X',\n'HCI', 'X',\n'HCS', 'X\
4050 ',\n'HDA', 'X',\n'HDD', 'X',\n'HDF', 'X',\n'HDN', \
4051 'X',\n'HDS', 'X',\n'HDZ', 'X',\n'HE1', 'X',\n'HE6'\
4052 , 'X',\n'HEA', 'X',\n'HEB', 'X',\n'HEC', 'X',\n'HE\
4053 D', 'X',\n'HEE', 'X',\n'HEF', 'X',\n'HEG', 'X',\n'\
4054 HEM', 'X',\n'HEN', 'X',\n'HEO', 'X',\n'HEP', 'X',\\
4055 n'HEU', 'X',\n'HEV', 'X',\n'HEX', 'X',\n'HEZ', 'X'\
4056 ,\n'HF1', 'X',\n'HFA', 'X',\n'HFP', 'X',\n'HGA', '\
4057 Q',\n'HGB', 'X',\n'HGC', 'X',\n'HGI', 'X',\n'HGU',\
4058  'X',\n'HHO', 'X',\n'HHP', 'X',\n'HIB', 'X',\n'HIC\
4059 ', 'H',\n'HII', 'X',\n'HIN', 'X',\n'HIO', 'X',\n'H\
4060 IP', 'H',\n'HIS', 'H',\n'HLE', 'X',\n'HLT', 'X',\n\
4061 'HMA', 'A',\n'HMB', 'X',\n'HMC', 'X',\n'HMD', 'X',\
4062 \n'HMF', 'A',\n'HMG', 'X',\n'HMH', 'X',\n'HMI', 'L\
4063 ',\n'HMM', 'X',\n'HMN', 'X',\n'HMO', 'X',\n'HMP', \
4064 'X',\n'HMR', 'R',\n'HNI', 'X',\n'HNP', 'X',\n'HOA'\
4065 , 'X',\n'HOE', 'X',\n'HOH', 'X',\n'HOM', 'X',\n'HO\
4066 P', 'X',\n'HOQ', 'X',\n'HP1', 'A',\n'HP2', 'A',\n'\
4067 HP3', 'X',\n'HPA', 'X',\n'HPB', 'X',\n'HPC', 'X',\\
4068 n'HPD', 'X',\n'HPE', 'A',\n'HPG', 'X',\n'HPH', 'F'\
4069 ,\n'HPP', 'X',\n'HPQ', 'F',\n'HPR', 'X',\n'HPT', '\
4070 X',\n'HPY', 'X',\n'HQO', 'X',\n'HQQ', 'X',\n'HQU',\
4071  'X',\n'HRG', 'R',\n'HRI', 'X',\n'HSA', 'X',\n'HSE\
4072 ', 'S',\n'HSF', 'X',\n'HSM', 'X',\n'HSO', 'H',\n'H\
4073 SP', 'X',\n'HT1', 'X',\n'HT2', 'X',\n'HTA', 'X',\n\
4074 'HTL', 'X',\n'HTO', 'X',\n'HTP', 'X',\n'HTR', 'W',\
4075 \n'HUP', 'X',\n'HUX', 'X',\n'HV5', 'A',\n'HV7', 'X\
4076 ',\n'HV8', 'X',\n'HXA', 'X',\n'HXC', 'X',\n'HXP', \
4077 'X',\n'HY1', 'X',\n'HYA', 'X',\n'HYB', 'X',\n'HYD'\
4078 , 'X',\n'HYG', 'X',\n'HYP', 'P',\n'I06', 'X',\n'I1\
4079 0', 'X',\n'I11', 'X',\n'I17', 'X',\n'I2P', 'X',\n'\
4080 I3N', 'X',\n'I3P', 'X',\n'I40', 'X',\n'I48', 'X',\\
4081 n'I4B', 'X',\n'I52', 'X',\n'I5P', 'X',\n'I84', 'G'\
4082 ,\n'IAG', 'G',\n'IAS', 'X',\n'IB2', 'X',\n'IBB', '\
4083 X',\n'IBP', 'X',\n'IBR', 'X',\n'IBS', 'X',\n'IBZ',\
4084  'X',\n'IC1', 'X',\n'ICA', 'X',\n'ICI', 'X',\n'ICL\
4085 ', 'X',\n'ICP', 'X',\n'ICT', 'X',\n'ICU', 'X',\n'I\
4086 D2', 'X',\n'IDC', 'X',\n'IDG', 'X',\n'IDH', 'X',\n\
4087 'IDM', 'X',\n'IDO', 'X',\n'IDP', 'X',\n'IDR', 'X',\
4088 \n'IDS', 'X',\n'IDT', 'X',\n'IDU', 'X',\n'IFG', 'X\
4089 ',\n'IFP', 'X',\n'IGL', 'X',\n'IGN', 'X',\n'IGP', \
4090 'X',\n'IGU', 'X',\n'IH1', 'X',\n'IH2', 'X',\n'IH3'\
4091 , 'X',\n'IHB', 'X',\n'IHN', 'X',\n'IHP', 'X',\n'II\
4092 C', 'X',\n'IIL', 'I',\n'IIP', 'X',\n'IK2', 'X',\n'\
4093 IKT', 'X',\n'ILA', 'I',\n'ILE', 'I',\n'ILG', 'X',\\
4094 n'ILO', 'X',\n'ILX', 'I',\n'IM1', 'X',\n'IM2', 'X'\
4095 ,\n'IMC', 'X',\n'IMD', 'X',\n'IME', 'X',\n'IMF', '\
4096 X',\n'IMG', 'X',\n'IMH', 'X',\n'IMI', 'X',\n'IML',\
4097  'I',\n'IMM', 'X',\n'IMN', 'X',\n'IMO', 'X',\n'IMP\
4098 ', 'X',\n'IMR', 'X',\n'IMU', 'X',\n'IN0', 'D',\n'I\
4099 N1', 'R',\n'IN2', 'K',\n'IN3', 'L',\n'IN4', 'X',\n\
4100 'IN5', 'A',\n'IN6', 'L',\n'IN7', 'X',\n'IN8', 'X',\
4101 \n'IN9', 'X',\n'INA', 'L',\n'INB', 'X',\n'INC', 'X\
4102 ',\n'IND', 'X',\n'INE', 'X',\n'INF', 'F',\n'ING', \
4103 'F',\n'INH', 'R',\n'INI', 'X',\n'INJ', 'X',\n'INK'\
4104 , 'X',\n'INL', 'X',\n'INM', 'X',\n'INN', 'A',\n'IN\
4105 O', 'X',\n'INP', 'X',\n'INQ', 'X',\n'INR', 'X',\n'\
4106 INS', 'X',\n'INT', 'V',\n'INU', 'X',\n'INV', 'X',\\
4107 n'INW', 'X',\n'INX', 'X',\n'INY', 'X',\n'INZ', 'X'\
4108 ,\n'IOA', 'X',\n'IOB', 'X',\n'IOC', 'X',\n'IOD', '\
4109 X',\n'IOE', 'X',\n'IOF', 'X',\n'IOH', 'X',\n'IOL',\
4110  'X',\n'IOP', 'X',\n'IP1', 'X',\n'IP2', 'X',\n'IP3\
4111 ', 'X',\n'IP4', 'X',\n'IPA', 'X',\n'IPB', 'X',\n'I\
4112 PD', 'X',\n'IPG', 'G',\n'IPH', 'X',\n'IPL', 'X',\n\
4113 'IPM', 'X',\n'IPN', 'X',\n'IPO', 'F',\n'IPP', 'X',\
4114 \n'IPS', 'X',\n'IPT', 'X',\n'IPU', 'X',\n'IPY', 'A\
4115 ',\n'IQB', 'X',\n'IQP', 'X',\n'IQS', 'X',\n'IR3', \
4116 'X',\n'IRI', 'X',\n'IRP', 'X',\n'ISA', 'X',\n'ISF'\
4117 , 'X',\n'ISO', 'X',\n'ISP', 'X',\n'ISQ', 'X',\n'IS\
4118 U', 'X',\n'ITM', 'X',\n'ITP', 'X',\n'ITR', 'W',\n'\
4119 ITS', 'X',\n'ITU', 'X',\n'IU5', 'X',\n'IUM', 'X',\\
4120 n'IUR', 'X',\n'IVA', 'X',\n'IYG', 'G',\n'IYR', 'Y'\
4121 ,\n'J77', 'X',\n'J78', 'X',\n'J80', 'X',\n'JE2', '\
4122 X',\n'JEN', 'X',\n'JST', 'X',\n'K21', 'X',\n'KAH',\
4123  'X',\n'KAI', 'X',\n'KAM', 'X',\n'KAN', 'X',\n'KAP\
4124 ', 'X',\n'KCP', 'X',\n'KCX', 'K',\n'KDO', 'X',\n'K\
4125 EF', 'X',\n'KET', 'X',\n'KGR', 'X',\n'KH1', 'X',\n\
4126 'KIF', 'X',\n'KIV', 'V',\n'KNI', 'X',\n'KPH', 'K',\
4127 \n'KTH', 'X',\n'KTN', 'X',\n'KTP', 'X',\n'KWT', 'X\
4128 ',\n'L04', 'X',\n'L1P', 'X',\n'L24', 'E',\n'L2P', \
4129 'X',\n'L34', 'E',\n'L37', 'E',\n'L3P', 'X',\n'L4P'\
4130 , 'X',\n'L75', 'X',\n'LAC', 'X',\n'LAD', 'X',\n'LA\
4131 K', 'X',\n'LAM', 'X',\n'LAR', 'X',\n'LAT', 'X',\n'\
4132 LAX', 'X',\n'LCO', 'X',\n'LCP', 'X',\n'LCS', 'X',\\
4133 n'LDA', 'X',\n'LDO', 'L',\n'LDP', 'X',\n'LEA', 'X'\
4134 ,\n'LEO', 'X',\n'LEU', 'L',\n'LG2', 'X',\n'LG6', '\
4135 X',\n'LGC', 'X',\n'LGP', 'X',\n'LHG', 'X',\n'LHY',\
4136  'F',\n'LI1', 'X',\n'LIG', 'X',\n'LIL', 'X',\n'LIM\
4137 ', 'X',\n'LIN', 'X',\n'LIO', 'X',\n'LIP', 'X',\n'L\
4138 LA', 'X',\n'LLP', 'K',\n'LLY', 'K',\n'LMG', 'X',\n\
4139 'LML', 'X',\n'LMT', 'X',\n'LMU', 'X',\n'LMZ', 'X',\
4140 \n'LNK', 'X',\n'LNL', 'X',\n'LNO', 'X',\n'LOF', 'X\
4141 ',\n'LOL', 'L',\n'LOM', 'X',\n'LOR', 'X',\n'LOS', \
4142 'X',\n'LOV', 'L',\n'LOX', 'X',\n'LP1', 'X',\n'LP2'\
4143 , 'R',\n'LPA', 'X',\n'LPC', 'X',\n'LPF', 'X',\n'LP\
4144 L', 'X',\n'LPM', 'X',\n'LPP', 'X',\n'LRB', 'X',\n'\
4145 LRU', 'X',\n'LS1', 'X',\n'LS2', 'X',\n'LS3', 'X',\\
4146 n'LS4', 'X',\n'LS5', 'X',\n'LTA', 'X',\n'LTL', 'X'\
4147 ,\n'LTR', 'W',\n'LUM', 'X',\n'LVS', 'L',\n'LXC', '\
4148 X',\n'LY2', 'X',\n'LY3', 'X',\n'LYA', 'X',\n'LYB',\
4149  'X',\n'LYC', 'X',\n'LYD', 'X',\n'LYM', 'K',\n'LYN\
4150 ', 'X',\n'LYS', 'K',\n'LYT', 'X',\n'LYW', 'X',\n'L\
4151 YZ', 'K',\n'M1A', 'X',\n'M1G', 'X',\n'M2G', 'X',\n\
4152 'M3L', 'K',\n'M6P', 'X',\n'M6T', 'X',\n'M7G', 'X',\
4153 \n'MA1', 'X',\n'MA2', 'X',\n'MA3', 'X',\n'MA4', 'X\
4154 ',\n'MA6', 'X',\n'MAA', 'A',\n'MAB', 'X',\n'MAC', \
4155 'X',\n'MAE', 'X',\n'MAG', 'X',\n'MAH', 'X',\n'MAI'\
4156 , 'R',\n'MAK', 'X',\n'MAL', 'X',\n'MAM', 'X',\n'MA\
4157 N', 'X',\n'MAO', 'X',\n'MAP', 'X',\n'MAR', 'X',\n'\
4158 MAS', 'X',\n'MAT', 'X',\n'MAU', 'X',\n'MAZ', 'X',\\
4159 n'MBA', 'X',\n'MBD', 'X',\n'MBG', 'X',\n'MBH', 'X'\
4160 ,\n'MBN', 'X',\n'MBO', 'X',\n'MBR', 'X',\n'MBS', '\
4161 X',\n'MBV', 'X',\n'MBZ', 'X',\n'MCA', 'X',\n'MCD',\
4162  'X',\n'MCE', 'X',\n'MCG', 'G',\n'MCI', 'X',\n'MCN\
4163 ', 'X',\n'MCP', 'X',\n'MCT', 'X',\n'MCY', 'X',\n'M\
4164 D2', 'X',\n'MDA', 'X',\n'MDC', 'X',\n'MDG', 'X',\n\
4165 'MDH', 'X',\n'MDL', 'X',\n'MDM', 'X',\n'MDN', 'X',\
4166 \n'MDP', 'X',\n'ME6', 'X',\n'MEB', 'X',\n'MEC', 'X\
4167 ',\n'MEL', 'X',\n'MEN', 'N',\n'MEP', 'X',\n'MER', \
4168 'X',\n'MES', 'X',\n'MET', 'M',\n'MEV', 'X',\n'MF2'\
4169 , 'X',\n'MF3', 'M',\n'MFB', 'X',\n'MFD', 'X',\n'MF\
4170 U', 'X',\n'MG7', 'X',\n'MGA', 'X',\n'MGB', 'X',\n'\
4171 MGD', 'X',\n'MGG', 'R',\n'MGL', 'X',\n'MGN', 'Q',\\
4172 n'MGO', 'X',\n'MGP', 'X',\n'MGR', 'X',\n'MGS', 'X'\
4173 ,\n'MGT', 'X',\n'MGU', 'X',\n'MGY', 'G',\n'MHB', '\
4174 X',\n'MHF', 'X',\n'MHL', 'L',\n'MHM', 'X',\n'MHO',\
4175  'M',\n'MHS', 'H',\n'MHZ', 'X',\n'MIA', 'X',\n'MIC\
4176 ', 'X',\n'MID', 'X',\n'MIL', 'X',\n'MIM', 'X',\n'M\
4177 IN', 'G',\n'MIP', 'X',\n'MIS', 'S',\n'MIT', 'X',\n\
4178 'MJI', 'X',\n'MK1', 'X',\n'MKC', 'X',\n'MLA', 'X',\
4179 \n'MLC', 'X',\n'MLE', 'L',\n'MLN', 'X',\n'MLT', 'X\
4180 ',\n'MLY', 'K',\n'MLZ', 'K',\n'MM3', 'X',\n'MM4', \
4181 'X',\n'MMA', 'X',\n'MMC', 'X',\n'MME', 'M',\n'MMO'\
4182 , 'R',\n'MMP', 'X',\n'MMQ', 'X',\n'MMT', 'X',\n'MN\
4183 1', 'X',\n'MN2', 'X',\n'MN3', 'X',\n'MN5', 'X',\n'\
4184 MN7', 'X',\n'MN8', 'X',\n'MNA', 'X',\n'MNB', 'X',\\
4185 n'MNC', 'X',\n'MNG', 'X',\n'MNL', 'L',\n'MNO', 'X'\
4186 ,\n'MNP', 'X',\n'MNQ', 'X',\n'MNS', 'X',\n'MNT', '\
4187 X',\n'MNV', 'V',\n'MO1', 'X',\n'MO2', 'X',\n'MO3',\
4188  'X',\n'MO4', 'X',\n'MO5', 'X',\n'MO6', 'X',\n'MOA\
4189 ', 'X',\n'MOB', 'X',\n'MOC', 'X',\n'MOE', 'X',\n'M\
4190 OG', 'X',\n'MOH', 'X',\n'MOL', 'X',\n'MOO', 'X',\n\
4191 'MOP', 'X',\n'MOR', 'X',\n'MOS', 'X',\n'MOT', 'X',\
4192 \n'MOX', 'X',\n'MP1', 'X',\n'MP3', 'X',\n'MPA', 'X\
4193 ',\n'MPB', 'X',\n'MPC', 'X',\n'MPD', 'X',\n'MPG', \
4194 'X',\n'MPH', 'M',\n'MPI', 'X',\n'MPJ', 'M',\n'MPL'\
4195 , 'X',\n'MPN', 'X',\n'MPO', 'X',\n'MPP', 'X',\n'MP\
4196 Q', 'G',\n'MPR', 'X',\n'MPS', 'X',\n'MQ0', 'X',\n'\
4197 MQ7', 'X',\n'MQ8', 'X',\n'MQ9', 'X',\n'MQI', 'X',\\
4198 n'MR2', 'X',\n'MRC', 'X',\n'MRM', 'X',\n'MRP', 'X'\
4199 ,\n'MS2', 'X',\n'MSA', 'X',\n'MSB', 'X',\n'MSD', '\
4200 X',\n'MSE', 'M',\n'MSF', 'X',\n'MSI', 'X',\n'MSO',\
4201  'M',\n'MSQ', 'X',\n'MST', 'X',\n'MSU', 'X',\n'MTA\
4202 ', 'X',\n'MTB', 'X',\n'MTC', 'X',\n'MTD', 'X',\n'M\
4203 TE', 'X',\n'MTF', 'X',\n'MTG', 'X',\n'MTO', 'X',\n\
4204 'MTS', 'X',\n'MTT', 'X',\n'MTX', 'X',\n'MTY', 'Y',\
4205 \n'MUG', 'X',\n'MUP', 'X',\n'MUR', 'X',\n'MVA', 'V\
4206 ',\n'MW1', 'X',\n'MW2', 'X',\n'MXA', 'X',\n'MXY', \
4207 'X',\n'MYA', 'X',\n'MYC', 'X',\n'MYG', 'X',\n'MYR'\
4208 , 'X',\n'MYS', 'X',\n'MYT', 'X',\n'MZM', 'X',\n'N1\
4209 T', 'X',\n'N25', 'X',\n'N2B', 'X',\n'N3T', 'X',\n'\
4210 N4B', 'X',\n'NA2', 'X',\n'NA5', 'X',\n'NA6', 'X',\\
4211 n'NAA', 'X',\n'NAB', 'X',\n'NAC', 'X',\n'NAD', 'X'\
4212 ,\n'NAE', 'X',\n'NAF', 'X',\n'NAG', 'X',\n'NAH', '\
4213 X',\n'NAI', 'X',\n'NAL', 'A',\n'NAM', 'A',\n'NAN',\
4214  'X',\n'NAO', 'X',\n'NAP', 'X',\n'NAQ', 'X',\n'NAR\
4215 ', 'X',\n'NAS', 'X',\n'NAU', 'X',\n'NAV', 'X',\n'N\
4216 AW', 'X',\n'NAX', 'X',\n'NAY', 'X',\n'NBA', 'X',\n\
4217 'NBD', 'X',\n'NBE', 'X',\n'NBG', 'X',\n'NBN', 'X',\
4218 \n'NBP', 'X',\n'NBS', 'X',\n'NBU', 'X',\n'NCA', 'X\
4219 ',\n'NCB', 'A',\n'NCD', 'X',\n'NCH', 'X',\n'NCM', \
4220 'X',\n'NCN', 'X',\n'NCO', 'X',\n'NCR', 'X',\n'NCS'\
4221 , 'X',\n'ND4', 'X',\n'NDA', 'X',\n'NDC', 'X',\n'ND\
4222 D', 'X',\n'NDO', 'X',\n'NDP', 'X',\n'NDT', 'X',\n'\
4223 NEA', 'X',\n'NEB', 'X',\n'NED', 'X',\n'NEM', 'H',\\
4224 n'NEN', 'X',\n'NEO', 'X',\n'NEP', 'H',\n'NEQ', 'X'\
4225 ,\n'NES', 'X',\n'NET', 'X',\n'NEV', 'X',\n'NFA', '\
4226 F',\n'NFE', 'X',\n'NFG', 'X',\n'NFP', 'X',\n'NFS',\
4227  'X',\n'NG6', 'X',\n'NGA', 'X',\n'NGL', 'X',\n'NGM\
4228 ', 'X',\n'NGO', 'X',\n'NGP', 'X',\n'NGT', 'X',\n'N\
4229 GU', 'X',\n'NH2', 'X',\n'NH3', 'X',\n'NH4', 'X',\n\
4230 'NHD', 'X',\n'NHE', 'X',\n'NHM', 'X',\n'NHP', 'X',\
4231 \n'NHR', 'X',\n'NHS', 'X',\n'NI1', 'X',\n'NI2', 'X\
4232 ',\n'NIC', 'X',\n'NID', 'X',\n'NIK', 'X',\n'NIO', \
4233 'X',\n'NIP', 'X',\n'NIT', 'X',\n'NIU', 'X',\n'NIY'\
4234 , 'Y',\n'NLA', 'X',\n'NLE', 'L',\n'NLG', 'X',\n'NL\
4235 N', 'L',\n'NLP', 'L',\n'NM1', 'X',\n'NMA', 'A',\n'\
4236 NMB', 'X',\n'NMC', 'G',\n'NMD', 'X',\n'NME', 'X',\\
4237 n'NMN', 'X',\n'NMO', 'X',\n'NMQ', 'X',\n'NMX', 'X'\
4238 ,\n'NMY', 'X',\n'NNH', 'R',\n'NNO', 'X',\n'NO2', '\
4239 X',\n'NO3', 'X',\n'NOA', 'X',\n'NOD', 'X',\n'NOJ',\
4240  'X',\n'NON', 'X',\n'NOP', 'X',\n'NOR', 'X',\n'NOS\
4241 ', 'X',\n'NOV', 'X',\n'NOX', 'X',\n'NP3', 'X',\n'N\
4242 PA', 'X',\n'NPC', 'X',\n'NPD', 'X',\n'NPE', 'X',\n\
4243 'NPF', 'X',\n'NPH', 'C',\n'NPI', 'X',\n'NPL', 'X',\
4244 \n'NPN', 'X',\n'NPO', 'X',\n'NPP', 'X',\n'NPT', 'X\
4245 ',\n'NPY', 'X',\n'NRG', 'R',\n'NRI', 'X',\n'NS1', \
4246 'X',\n'NS5', 'X',\n'NSP', 'X',\n'NTA', 'X',\n'NTB'\
4247 , 'X',\n'NTC', 'X',\n'NTH', 'X',\n'NTM', 'X',\n'NT\
4248 P', 'X',\n'NTS', 'X',\n'NTU', 'X',\n'NTZ', 'X',\n'\
4249 NU1', 'X',\n'NVA', 'V',\n'NVI', 'X',\n'NVP', 'X',\\
4250 n'NW1', 'X',\n'NYP', 'X',\n'O4M', 'X',\n'OAA', 'X'\
4251 ,\n'OAI', 'X',\n'OAP', 'X',\n'OAR', 'X',\n'OAS', '\
4252 S',\n'OBA', 'X',\n'OBN', 'X',\n'OC1', 'X',\n'OC2',\
4253  'X',\n'OC3', 'X',\n'OC4', 'X',\n'OC5', 'X',\n'OC6\
4254 ', 'X',\n'OC7', 'X',\n'OCL', 'X',\n'OCM', 'X',\n'O\
4255 CN', 'X',\n'OCO', 'X',\n'OCP', 'X',\n'OCS', 'C',\n\
4256 'OCT', 'X',\n'OCV', 'K',\n'OCY', 'C',\n'ODA', 'X',\
4257 \n'ODS', 'X',\n'OES', 'X',\n'OET', 'X',\n'OF1', 'X\
4258 ',\n'OF2', 'X',\n'OF3', 'X',\n'OFL', 'X',\n'OFO', \
4259 'X',\n'OHE', 'X',\n'OHO', 'X',\n'OHT', 'X',\n'OIC'\
4260 , 'X',\n'OIP', 'X',\n'OKA', 'X',\n'OLA', 'X',\n'OL\
4261 E', 'X',\n'OLI', 'X',\n'OLO', 'X',\n'OMB', 'X',\n'\
4262 OMC', 'X',\n'OMD', 'X',\n'OME', 'X',\n'OMG', 'X',\\
4263 n'OMP', 'X',\n'OMT', 'M',\n'OMU', 'X',\n'ONE', 'X'\
4264 ,\n'ONL', 'L',\n'ONP', 'X',\n'OPA', 'X',\n'OPD', '\
4265 X',\n'OPE', 'X',\n'OPG', 'X',\n'OPH', 'X',\n'OPN',\
4266  'X',\n'OPP', 'X',\n'OPR', 'R',\n'ORN', 'X',\n'ORO\
4267 ', 'X',\n'ORP', 'X',\n'OSB', 'X',\n'OSS', 'X',\n'O\
4268 TA', 'X',\n'OTB', 'X',\n'OTE', 'X',\n'OTG', 'X',\n\
4269 'OUT', 'X',\n'OVA', 'X',\n'OWQ', 'X',\n'OXA', 'X',\
4270 \n'OXE', 'X',\n'OXI', 'X',\n'OXL', 'X',\n'OXM', 'X\
4271 ',\n'OXN', 'X',\n'OXO', 'X',\n'OXP', 'X',\n'OXS', \
4272 'X',\n'OXY', 'X',\n'P11', 'A',\n'P24', 'X',\n'P28'\
4273 , 'X',\n'P2P', 'X',\n'P2U', 'X',\n'P3M', 'X',\n'P4\
4274 C', 'X',\n'P4P', 'X',\n'P5P', 'X',\n'P6G', 'X',\n'\
4275 PA1', 'X',\n'PA2', 'X',\n'PA3', 'X',\n'PA4', 'X',\\
4276 n'PA5', 'X',\n'PAA', 'X',\n'PAB', 'X',\n'PAC', 'X'\
4277 ,\n'PAD', 'X',\n'PAE', 'X',\n'PAG', 'X',\n'PAH', '\
4278 X',\n'PAI', 'X',\n'PAL', 'D',\n'PAM', 'X',\n'PAN',\
4279  'X',\n'PAO', 'X',\n'PAP', 'A',\n'PAQ', 'F',\n'PAR\
4280 ', 'X',\n'PAS', 'X',\n'PAT', 'W',\n'PBA', 'X',\n'P\
4281 BB', 'X',\n'PBC', 'X',\n'PBF', 'F',\n'PBG', 'X',\n\
4282 'PBI', 'X',\n'PBM', 'X',\n'PBN', 'X',\n'PBP', 'X',\
4283 \n'PBR', 'X',\n'PBZ', 'X',\n'PC2', 'X',\n'PCA', 'E\
4284 ',\n'PCB', 'X',\n'PCD', 'X',\n'PCE', 'X',\n'PCG', \
4285 'X',\n'PCH', 'X',\n'PCL', 'X',\n'PCM', 'X',\n'PCP'\
4286 , 'X',\n'PCR', 'X',\n'PCS', 'X',\n'PCU', 'X',\n'PC\
4287 V', 'X',\n'PCY', 'X',\n'PD1', 'X',\n'PDA', 'X',\n'\
4288 PDC', 'X',\n'PDD', 'A',\n'PDE', 'A',\n'PDI', 'X',\\
4289 n'PDL', 'A',\n'PDN', 'X',\n'PDO', 'X',\n'PDP', 'X'\
4290 ,\n'PDT', 'X',\n'PDU', 'X',\n'PE2', 'X',\n'PE6', '\
4291 X',\n'PEA', 'X',\n'PEB', 'X',\n'PEC', 'X',\n'PED',\
4292  'X',\n'PEE', 'X',\n'PEF', 'X',\n'PEG', 'X',\n'PEL\
4293 ', 'X',\n'PEO', 'X',\n'PEP', 'X',\n'PEQ', 'X',\n'P\
4294 ER', 'X',\n'PET', 'X',\n'PFB', 'X',\n'PFC', 'X',\n\
4295 'PFG', 'X',\n'PFL', 'X',\n'PFM', 'X',\n'PFZ', 'X',\
4296 \n'PG4', 'X',\n'PG5', 'X',\n'PG6', 'X',\n'PGA', 'X\
4297 ',\n'PGC', 'X',\n'PGD', 'X',\n'PGE', 'X',\n'PGG', \
4298 'G',\n'PGH', 'X',\n'PGL', 'X',\n'PGO', 'X',\n'PGP'\
4299 , 'X',\n'PGQ', 'X',\n'PGR', 'X',\n'PGS', 'X',\n'PG\
4300 U', 'X',\n'PGX', 'X',\n'PGY', 'G',\n'PH1', 'X',\n'\
4301 PH2', 'X',\n'PH3', 'X',\n'PHA', 'F',\n'PHB', 'X',\\
4302 n'PHC', 'X',\n'PHD', 'X',\n'PHE', 'F',\n'PHG', 'X'\
4303 ,\n'PHH', 'X',\n'PHI', 'F',\n'PHL', 'F',\n'PHM', '\
4304 X',\n'PHN', 'X',\n'PHO', 'X',\n'PHP', 'X',\n'PHQ',\
4305  'X',\n'PHS', 'H',\n'PHT', 'X',\n'PHW', 'P',\n'PHY\
4306 ', 'X',\n'PI1', 'X',\n'PI2', 'X',\n'PI3', 'X',\n'P\
4307 I4', 'X',\n'PI5', 'X',\n'PI6', 'X',\n'PI7', 'X',\n\
4308 'PI8', 'X',\n'PI9', 'X',\n'PIA', 'X',\n'PIB', 'X',\
4309 \n'PIC', 'X',\n'PID', 'X',\n'PIG', 'X',\n'PIH', 'X\
4310 ',\n'PIM', 'X',\n'PIN', 'X',\n'PIO', 'X',\n'PIP', \
4311 'X',\n'PIQ', 'X',\n'PIR', 'X',\n'PIV', 'X',\n'PKF'\
4312 , 'X',\n'PL1', 'X',\n'PL9', 'X',\n'PLA', 'D',\n'PL\
4313 C', 'X',\n'PLE', 'L',\n'PLG', 'G',\n'PLH', 'X',\n'\
4314 PLM', 'X',\n'PLP', 'X',\n'PLS', 'S',\n'PLT', 'W',\\
4315 n'PLU', 'L',\n'PLY', 'X',\n'PMA', 'X',\n'PMB', 'X'\
4316 ,\n'PMC', 'X',\n'PME', 'F',\n'PML', 'X',\n'PMM', '\
4317 X',\n'PMO', 'X',\n'PMP', 'X',\n'PMS', 'X',\n'PMY',\
4318  'X',\n'PN2', 'X',\n'PNA', 'X',\n'PNB', 'X',\n'PNC\
4319 ', 'G',\n'PND', 'X',\n'PNE', 'A',\n'PNF', 'X',\n'P\
4320 NG', 'X',\n'PNI', 'X',\n'PNL', 'X',\n'PNM', 'X',\n\
4321 'PNN', 'X',\n'PNO', 'X',\n'PNP', 'X',\n'PNQ', 'X',\
4322 \n'PNS', 'X',\n'PNT', 'X',\n'PNU', 'X',\n'PO2', 'X\
4323 ',\n'PO4', 'X',\n'POB', 'X',\n'POC', 'X',\n'POL', \
4324 'X',\n'POM', 'P',\n'PON', 'X',\n'POP', 'X',\n'POR'\
4325 , 'X',\n'POS', 'X',\n'PP1', 'X',\n'PP2', 'X',\n'PP\
4326 3', 'A',\n'PP4', 'X',\n'PP5', 'X',\n'PP6', 'X',\n'\
4327 PP7', 'X',\n'PP8', 'N',\n'PP9', 'X',\n'PPB', 'X',\\
4328 n'PPC', 'X',\n'PPD', 'X',\n'PPE', 'E',\n'PPG', 'X'\
4329 ,\n'PPH', 'F',\n'PPI', 'X',\n'PPJ', 'V',\n'PPL', '\
4330 X',\n'PPM', 'X',\n'PPN', 'A',\n'PPO', 'X',\n'PPP',\
4331  'X',\n'PPQ', 'X',\n'PPR', 'X',\n'PPS', 'X',\n'PPT\
4332 ', 'X',\n'PPU', 'X',\n'PPX', 'F',\n'PPY', 'X',\n'P\
4333 PZ', 'X',\n'PQ0', 'X',\n'PQN', 'X',\n'PQQ', 'X',\n\
4334 'PR1', 'X',\n'PR2', 'X',\n'PR3', 'X',\n'PRA', 'X',\
4335 \n'PRB', 'X',\n'PRC', 'X',\n'PRD', 'X',\n'PRE', 'X\
4336 ',\n'PRF', 'X',\n'PRH', 'X',\n'PRI', 'P',\n'PRL', \
4337 'X',\n'PRN', 'X',\n'PRO', 'P',\n'PRP', 'X',\n'PRR'\
4338 , 'A',\n'PRS', 'P',\n'PRZ', 'X',\n'PS0', 'X',\n'PS\
4339 A', 'X',\n'PSD', 'X',\n'PSE', 'X',\n'PSF', 'S',\n'\
4340 PSG', 'X',\n'PSI', 'X',\n'PSO', 'X',\n'PSQ', 'X',\\
4341 n'PSS', 'X',\n'PST', 'X',\n'PSU', 'X',\n'PT1', 'X'\
4342 ,\n'PT3', 'X',\n'PTA', 'X',\n'PTC', 'X',\n'PTD', '\
4343 X',\n'PTE', 'X',\n'PTH', 'Y',\n'PTL', 'X',\n'PTM',\
4344  'Y',\n'PTN', 'X',\n'PTO', 'X',\n'PTP', 'X',\n'PTR\
4345 ', 'Y',\n'PTS', 'X',\n'PTT', 'X',\n'PTU', 'X',\n'P\
4346 TY', 'X',\n'PUA', 'X',\n'PUB', 'X',\n'PUR', 'X',\n\
4347 'PUT', 'X',\n'PVA', 'X',\n'PVB', 'X',\n'PVH', 'H',\
4348 \n'PVL', 'X',\n'PXA', 'X',\n'PXF', 'X',\n'PXG', 'X\
4349 ',\n'PXP', 'X',\n'PXY', 'X',\n'PXZ', 'X',\n'PY2', \
4350 'X',\n'PY4', 'X',\n'PY5', 'X',\n'PY6', 'X',\n'PYA'\
4351 , 'A',\n'PYC', 'X',\n'PYD', 'X',\n'PYE', 'X',\n'PY\
4352 L', 'X',\n'PYM', 'X',\n'PYO', 'X',\n'PYP', 'X',\n'\
4353 PYQ', 'X',\n'PYR', 'X',\n'PYS', 'X',\n'PYT', 'X',\\
4354 n'PYX', 'X',\n'PYY', 'X',\n'PYZ', 'X',\n'PZQ', 'X'\
4355 ,\n'Q82', 'X',\n'QNC', 'X',\n'QND', 'X',\n'QSI', '\
4356 Q',\n'QTR', 'X',\n'QUA', 'X',\n'QUE', 'X',\n'QUI',\
4357  'X',\n'QUO', 'X',\n'R11', 'X',\n'R12', 'X',\n'R13\
4358 ', 'X',\n'R18', 'X',\n'R1P', 'X',\n'R56', 'X',\n'R\
4359 5P', 'X',\n'RA2', 'X',\n'RAD', 'X',\n'RAI', 'X',\n\
4360 'RAL', 'X',\n'RAM', 'X',\n'RAN', 'X',\n'RAP', 'X',\
4361 \n'RBF', 'X',\n'RBU', 'X',\n'RCA', 'X',\n'RCL', 'X\
4362 ',\n'RCO', 'X',\n'RDC', 'X',\n'RDF', 'W',\n'RE9', \
4363 'X',\n'REA', 'X',\n'RED', 'K',\n'REO', 'X',\n'REP'\
4364 , 'X',\n'RET', 'X',\n'RFA', 'X',\n'RFB', 'X',\n'RF\
4365 L', 'X',\n'RFP', 'X',\n'RG1', 'X',\n'RGS', 'X',\n'\
4366 RH1', 'X',\n'RHA', 'X',\n'RHC', 'X',\n'RHD', 'X',\\
4367 n'RHM', 'X',\n'RHO', 'X',\n'RHQ', 'X',\n'RHS', 'X'\
4368 ,\n'RIA', 'X',\n'RIB', 'X',\n'RIC', 'X',\n'RIF', '\
4369 X',\n'RIN', 'X',\n'RIP', 'X',\n'RIT', 'X',\n'RMB',\
4370  'X',\n'RMN', 'X',\n'RMP', 'X',\n'RNG', 'X',\n'RNS\
4371 ', 'X',\n'RNT', 'X',\n'RO2', 'X',\n'RO4', 'X',\n'R\
4372 OC', 'N',\n'ROI', 'X',\n'ROM', 'X',\n'RON', 'V',\n\
4373 'ROP', 'X',\n'ROS', 'X',\n'ROX', 'X',\n'RPA', 'X',\
4374 \n'RPD', 'X',\n'RPH', 'X',\n'RPL', 'X',\n'RPP', 'X\
4375 ',\n'RPR', 'X',\n'RPX', 'X',\n'RQ3', 'X',\n'RR1', \
4376 'X',\n'RR6', 'X',\n'RRS', 'X',\n'RS1', 'X',\n'RS2'\
4377 , 'X',\n'RS7', 'X',\n'RSS', 'X',\n'RTA', 'X',\n'RT\
4378 B', 'X',\n'RTC', 'X',\n'RTL', 'X',\n'RUB', 'X',\n'\
4379 RUN', 'X',\n'RWJ', 'X',\n'RXP', 'X',\n'S02', 'X',\\
4380 n'S11', 'X',\n'S1H', 'S',\n'S27', 'X',\n'S2C', 'C'\
4381 ,\n'S3P', 'X',\n'S4U', 'X',\n'S57', 'X',\n'S58', '\
4382 X',\n'S5H', 'X',\n'S6G', 'X',\n'S80', 'X',\n'SAA',\
4383  'X',\n'SAB', 'X',\n'SAC', 'S',\n'SAD', 'X',\n'SAE\
4384 ', 'X',\n'SAF', 'X',\n'SAH', 'C',\n'SAI', 'C',\n'S\
4385 AL', 'X',\n'SAM', 'M',\n'SAN', 'X',\n'SAP', 'X',\n\
4386 'SAR', 'X',\n'SAS', 'X',\n'SB1', 'X',\n'SB2', 'X',\
4387 \n'SB3', 'X',\n'SB4', 'X',\n'SB5', 'X',\n'SB6', 'X\
4388 ',\n'SBA', 'L',\n'SBB', 'X',\n'SBD', 'A',\n'SBI', \
4389 'X',\n'SBL', 'A',\n'SBN', 'X',\n'SBO', 'X',\n'SBR'\
4390 , 'X',\n'SBS', 'X',\n'SBT', 'X',\n'SBU', 'X',\n'SB\
4391 X', 'X',\n'SC4', 'X',\n'SCA', 'X',\n'SCC', 'X',\n'\
4392 SCD', 'X',\n'SCH', 'C',\n'SCI', 'X',\n'SCL', 'X',\\
4393 n'SCM', 'X',\n'SCN', 'X',\n'SCO', 'X',\n'SCP', 'S'\
4394 ,\n'SCR', 'X',\n'SCS', 'X',\n'SCV', 'C',\n'SCY', '\
4395 C',\n'SD8', 'X',\n'SDK', 'X',\n'SDZ', 'X',\n'SE4',\
4396  'X',\n'SEA', 'X',\n'SEB', 'S',\n'SEC', 'X',\n'SEG\
4397 ', 'A',\n'SEI', 'X',\n'SEL', 'S',\n'SEM', 'X',\n'S\
4398 EO', 'X',\n'SEP', 'S',\n'SER', 'S',\n'SES', 'X',\n\
4399 'SET', 'S',\n'SEU', 'X',\n'SF4', 'X',\n'SFG', 'X',\
4400 \n'SFN', 'X',\n'SFO', 'X',\n'SGA', 'X',\n'SGC', 'X\
4401 ',\n'SGL', 'X',\n'SGM', 'X',\n'SGN', 'X',\n'SGP', \
4402 'X',\n'SHA', 'X',\n'SHC', 'X',\n'SHF', 'X',\n'SHH'\
4403 , 'X',\n'SHP', 'G',\n'SHR', 'E',\n'SHT', 'T',\n'SH\
4404 U', 'X',\n'SI2', 'X',\n'SIA', 'X',\n'SIF', 'X',\n'\
4405 SIG', 'X',\n'SIH', 'X',\n'SIM', 'X',\n'SIN', 'X',\\
4406 n'SKD', 'X',\n'SKF', 'X',\n'SLB', 'X',\n'SLE', 'X'\
4407 ,\n'SLZ', 'K',\n'SMA', 'X',\n'SMC', 'C',\n'SME', '\
4408 M',\n'SML', 'X',\n'SMM', 'M',\n'SMN', 'X',\n'SMP',\
4409  'X',\n'SMS', 'X',\n'SN1', 'X',\n'SN6', 'X',\n'SN7\
4410 ', 'X',\n'SNC', 'C',\n'SNN', 'X',\n'SNP', 'X',\n'S\
4411 O1', 'X',\n'SO2', 'X',\n'SO3', 'X',\n'SO4', 'X',\n\
4412 'SOA', 'X',\n'SOC', 'C',\n'SOM', 'X',\n'SOR', 'X',\
4413 \n'SOT', 'X',\n'SOX', 'X',\n'SPA', 'X',\n'SPB', 'X\
4414 ',\n'SPC', 'X',\n'SPD', 'X',\n'SPE', 'X',\n'SPG', \
4415 'X',\n'SPH', 'X',\n'SPI', 'X',\n'SPK', 'X',\n'SPM'\
4416 , 'X',\n'SPN', 'X',\n'SPO', 'X',\n'SPP', 'X',\n'SP\
4417 S', 'X',\n'SPY', 'X',\n'SQU', 'X',\n'SRA', 'X',\n'\
4418 SRB', 'X',\n'SRD', 'X',\n'SRL', 'X',\n'SRM', 'X',\\
4419 n'SRS', 'X',\n'SRY', 'X',\n'SSA', 'X',\n'SSB', 'X'\
4420 ,\n'SSG', 'X',\n'SSP', 'X',\n'ST1', 'X',\n'ST2', '\
4421 X',\n'ST3', 'X',\n'ST4', 'X',\n'ST5', 'X',\n'ST6',\
4422  'X',\n'STA', 'X',\n'STB', 'X',\n'STE', 'X',\n'STG\
4423 ', 'X',\n'STI', 'X',\n'STL', 'X',\n'STN', 'X',\n'S\
4424 TO', 'X',\n'STP', 'X',\n'STR', 'X',\n'STU', 'X',\n\
4425 'STY', 'Y',\n'SU1', 'X',\n'SU2', 'X',\n'SUC', 'X',\
4426 \n'SUI', 'X',\n'SUL', 'X',\n'SUR', 'X',\n'SVA', 'S\
4427 ',\n'SWA', 'X',\n'T16', 'X',\n'T19', 'X',\n'T23', \
4428 'X',\n'T29', 'X',\n'T33', 'X',\n'T3P', 'X',\n'T42'\
4429 , 'A',\n'T44', 'X',\n'T5A', 'X',\n'T6A', 'T',\n'T6\
4430 P', 'X',\n'T80', 'X',\n'T87', 'X',\n'TA1', 'X',\n'\
4431 TAA', 'X',\n'TAB', 'X',\n'TAC', 'X',\n'TAD', 'X',\\
4432 n'TAF', 'X',\n'TAM', 'X',\n'TAP', 'X',\n'TAR', 'X'\
4433 ,\n'TAS', 'X',\n'TAU', 'X',\n'TAX', 'X',\n'TAZ', '\
4434 X',\n'TB9', 'X',\n'TBA', 'X',\n'TBD', 'X',\n'TBG',\
4435  'G',\n'TBH', 'X',\n'TBM', 'T',\n'TBO', 'X',\n'TBP\
4436 ', 'X',\n'TBR', 'X',\n'TBS', 'X',\n'TBT', 'X',\n'T\
4437 BU', 'X',\n'TBZ', 'X',\n'TC4', 'X',\n'TCA', 'X',\n\
4438 'TCB', 'X',\n'TCH', 'X',\n'TCK', 'X',\n'TCL', 'X',\
4439 \n'TCM', 'X',\n'TCN', 'X',\n'TCP', 'X',\n'TCR', 'W\
4440 ',\n'TCS', 'X',\n'TCZ', 'X',\n'TDA', 'X',\n'TDB', \
4441 'X',\n'TDG', 'X',\n'TDP', 'X',\n'TDR', 'X',\n'TDX'\
4442 , 'X',\n'TEA', 'X',\n'TEM', 'X',\n'TEN', 'X',\n'TE\
4443 O', 'X',\n'TEP', 'X',\n'TER', 'X',\n'TES', 'X',\n'\
4444 TET', 'X',\n'TFA', 'X',\n'TFB', 'X',\n'TFH', 'X',\\
4445 n'TFI', 'X',\n'TFK', 'X',\n'TFP', 'X',\n'THA', 'X'\
4446 ,\n'THB', 'X',\n'THC', 'T',\n'THD', 'X',\n'THE', '\
4447 X',\n'THF', 'X',\n'THJ', 'X',\n'THK', 'X',\n'THM',\
4448  'X',\n'THN', 'X',\n'THO', 'T',\n'THP', 'X',\n'THQ\
4449 ', 'X',\n'THR', 'T',\n'THS', 'X',\n'THT', 'X',\n'T\
4450 HU', 'X',\n'THX', 'X',\n'THZ', 'X',\n'TI1', 'X',\n\
4451 'TI2', 'X',\n'TI3', 'P',\n'TIA', 'X',\n'TIH', 'A',\
4452 \n'TK4', 'X',\n'TLA', 'X',\n'TLC', 'X',\n'TLM', 'X\
4453 ',\n'TLN', 'X',\n'TLX', 'X',\n'TM5', 'X',\n'TM6', \
4454 'X',\n'TMA', 'X',\n'TMB', 'T',\n'TMC', 'X',\n'TMD'\
4455 , 'T',\n'TME', 'X',\n'TMF', 'X',\n'TML', 'K',\n'TM\
4456 M', 'X',\n'TMN', 'X',\n'TMP', 'X',\n'TMQ', 'X',\n'\
4457 TMR', 'X',\n'TMT', 'X',\n'TMZ', 'X',\n'TNB', 'C',\\
4458 n'TND', 'X',\n'TNK', 'X',\n'TNP', 'X',\n'TNT', 'X'\
4459 ,\n'TOA', 'X',\n'TOB', 'X',\n'TOC', 'X',\n'TOL', '\
4460 X',\n'TOP', 'X',\n'TOS', 'X',\n'TOT', 'X',\n'TP1',\
4461  'G',\n'TP2', 'P',\n'TP3', 'E',\n'TP4', 'E',\n'TP7\
4462 ', 'T',\n'TPA', 'X',\n'TPE', 'X',\n'TPF', 'X',\n'T\
4463 PI', 'X',\n'TPL', 'W',\n'TPM', 'X',\n'TPN', 'G',\n\
4464 'TPO', 'T',\n'TPP', 'X',\n'TPQ', 'A',\n'TPR', 'P',\
4465 \n'TPS', 'X',\n'TPT', 'X',\n'TPV', 'X',\n'TPX', 'X\
4466 ',\n'TPY', 'X',\n'TQ3', 'X',\n'TQ4', 'X',\n'TQ5', \
4467 'X',\n'TQ6', 'X',\n'TR1', 'X',\n'TRA', 'X',\n'TRB'\
4468 , 'X',\n'TRC', 'X',\n'TRD', 'X',\n'TRE', 'X',\n'TR\
4469 F', 'W',\n'TRG', 'K',\n'TRH', 'X',\n'TRI', 'X',\n'\
4470 TRJ', 'X',\n'TRM', 'X',\n'TRN', 'W',\n'TRO', 'W',\\
4471 n'TRP', 'W',\n'TRQ', 'X',\n'TRS', 'X',\n'TRX', 'W'\
4472 ,\n'TRZ', 'X',\n'TS2', 'X',\n'TS3', 'X',\n'TS4', '\
4473 X',\n'TS5', 'X',\n'TSA', 'X',\n'TSB', 'X',\n'TSI',\
4474  'X',\n'TSM', 'X',\n'TSN', 'X',\n'TSP', 'X',\n'TSU\
4475 ', 'X',\n'TTA', 'X',\n'TTE', 'X',\n'TTN', 'X',\n'T\
4476 TO', 'X',\n'TTP', 'X',\n'TTX', 'X',\n'TXL', 'X',\n\
4477 'TYA', 'Y',\n'TYB', 'Y',\n'TYD', 'X',\n'TYI', 'Y',\
4478 \n'TYL', 'X',\n'TYM', 'W',\n'TYN', 'Y',\n'TYQ', 'Y\
4479 ',\n'TYR', 'Y',\n'TYS', 'Y',\n'TYV', 'X',\n'TYY', \
4480 'A',\n'TZB', 'X',\n'TZC', 'X',\n'TZE', 'X',\n'TZL'\
4481 , 'X',\n'TZO', 'X',\n'TZP', 'X',\n'U01', 'X',\n'U0\
4482 2', 'X',\n'U03', 'X',\n'U04', 'X',\n'U05', 'X',\n'\
4483 U0E', 'X',\n'U10', 'X',\n'U18', 'X',\n'U2G', 'X',\\
4484 n'U3P', 'X',\n'U49', 'X',\n'U55', 'X',\n'U5P', 'X'\
4485 ,\n'U66', 'X',\n'U89', 'X',\n'U8U', 'X',\n'UAA', '\
4486 X',\n'UAG', 'A',\n'UAP', 'X',\n'UAR', 'X',\n'UC1',\
4487  'X',\n'UC2', 'X',\n'UC3', 'X',\n'UC4', 'X',\n'UD1\
4488 ', 'X',\n'UD2', 'X',\n'UDP', 'X',\n'UDX', 'X',\n'U\
4489 FG', 'X',\n'UFM', 'X',\n'UFP', 'X',\n'UGA', 'X',\n\
4490 'UIN', 'X',\n'UKP', 'A',\n'UM3', 'X',\n'UMA', 'A',\
4491 \n'UMG', 'X',\n'UMP', 'X',\n'UNA', 'X',\n'UND', 'X\
4492 ',\n'UNI', 'X',\n'UNK', 'X',\n'UNN', 'X',\n'UNX', \
4493 'X',\n'UP5', 'X',\n'UP6', 'X',\n'UPA', 'X',\n'UPF'\
4494 , 'X',\n'UPG', 'X',\n'UPP', 'X',\n'UQ1', 'X',\n'UQ\
4495 2', 'X',\n'UQ6', 'X',\n'UR2', 'X',\n'URA', 'X',\n'\
4496 URE', 'X',\n'URF', 'X',\n'URI', 'X',\n'URS', 'X',\\
4497 n'UTP', 'X',\n'UVC', 'X',\n'UVW', 'X',\n'V35', 'X'\
4498 ,\n'V36', 'X',\n'V4O', 'X',\n'V7O', 'X',\n'VAA', '\
4499 V',\n'VAC', 'X',\n'VAD', 'V',\n'VAF', 'V',\n'VAG',\
4500  'X',\n'VAL', 'V',\n'VAN', 'X',\n'VAS', 'X',\n'VAX\
4501 ', 'X',\n'VDX', 'X',\n'VDY', 'X',\n'VG1', 'X',\n'V\
4502 IB', 'X',\n'VIR', 'X',\n'VIT', 'X',\n'VK3', 'X',\n\
4503 'VO3', 'X',\n'VO4', 'X',\n'VS1', 'F',\n'VS2', 'F',\
4504 \n'VS3', 'F',\n'VS4', 'F',\n'VXA', 'X',\n'W01', 'X\
4505 ',\n'W02', 'X',\n'W03', 'X',\n'W11', 'X',\n'W33', \
4506 'X',\n'W35', 'X',\n'W42', 'X',\n'W43', 'X',\n'W54'\
4507 , 'X',\n'W56', 'X',\n'W59', 'X',\n'W71', 'X',\n'W8\
4508 4', 'X',\n'W8R', 'X',\n'W91', 'X',\n'WAY', 'X',\n'\
4509 WCC', 'X',\n'WO2', 'X',\n'WO4', 'X',\n'WRB', 'X',\\
4510 n'WRR', 'X',\n'WRS', 'X',\n'WW7', 'X',\n'X2F', 'X'\
4511 ,\n'X7O', 'X',\n'XAA', 'X',\n'XAN', 'X',\n'XAO', '\
4512 X',\n'XBB', 'X',\n'XBP', 'X',\n'XDN', 'X',\n'XDP',\
4513  'X',\n'XIF', 'X',\n'XIM', 'X',\n'XK2', 'X',\n'XL1\
4514 ', 'X',\n'XLS', 'X',\n'XMP', 'X',\n'XN1', 'X',\n'X\
4515 N2', 'X',\n'XN3', 'X',\n'XUL', 'X',\n'XV6', 'X',\n\
4516 'XYD', 'X',\n'XYH', 'X',\n'XYL', 'X',\n'XYP', 'X',\
4517 \n'XYS', 'X',\n'YOF', 'Y',\n'YRR', 'X',\n'YT3', 'X\
4518 ',\n'YZ9', 'X',\n'Z34', 'G',\n'Z5A', 'X',\n'ZAF', \
4519 'X',\n'ZAP', 'X',\n'ZEB', 'X',\n'ZEN', 'X',\n'ZES'\
4520 , 'X',\n'ZID', 'X',\n'ZMR', 'X',\n'ZN3', 'X',\n'ZN\
4521 H', 'X',\n'ZNO', 'X',\n'ZO3', 'X',\n'ZPR', 'P',\n'\
4522 ZRA', 'A',\n'ZST', 'X',\n'ZYA', 'A',\n\n\n'ASN','N\
4523 ');\n} \n\n\nsub file2head\n      {\n   my $file = s\
4524 hift;\n my $size = shift;\n     my $f= new FileHandle;\
4525 \n      my $line;\n     open ($f,$file);\n      read ($f,$line, \
4526 $size);\n       close ($f);\n   return $line;\n      }\nsu\
4527 b file2tail\n      {\n  my $file = shift;\n     my $siz\
4528 e = shift;\n    my $f= new FileHandle;\n        my $line;\n     \
4529 \n      open ($f,$file);\n      seek ($f,$size*-1, 2);\n        rea\
4530 d ($f,$line, $size);\n  close ($f);\n   return $line;\
4531 \n      }\n\n\nsub vtmpnam\n      {\n   my $r=rand(1\
4532 00000);\n       my $f=\"file.$r.$$\";\n while (-e $f)\n \
4533   {\n       $f=vtmpnam();\n       }\n   push (@TMPFILE_LIS\
4534 T, $f);\n       return $f;\n      }\n\nsub myexit\n  {\n\
4535     my $code=@_[0];\n    if ($CLEAN_EXIT_STARTED==\
4536 1){return;}\n    else {$CLEAN_EXIT_STARTED=1;}\n  \
4537   ### ONLY BARE EXIT\n    exit ($code);\n  }\nsub \
4538 set_error_lock\n    {\n      my $name = shift;\n  \
4539     my $pid=$$;\n\n      \n      &lock4tc ($$,\"LE\
4540 RROR\", \"LSET\", \"$$ -- ERROR: $name $PROGRAM\\n\
4541 \");\n      return;\n    }\nsub set_lock\n  {\n   \
4542  my $pid=shift;\n    my $msg= shift;\n    my $p=ge\
4543 tppid();\n    &lock4tc ($pid,\"LLOCK\",\"LRESET\",\
4544 \"$p$msg\\n\");\n  }\nsub unset_lock\n   {\n     \\
4545 n    my $pid=shift;\n    &lock4tc ($pid,\"LLOCK\",\
4546 \"LRELEASE\",\"\");\n  }\nsub shift_lock\n  {\n   \
4547  my $from=shift;\n    my $to=shift;\n    my $from_\
4548 type=shift;\n    my $to_type=shift;\n    my $actio\
4549 n=shift;\n    my $msg;\n    \n    if (!&lock4tc($f\
4550 rom, $from_type, \"LCHECK\", \"\")){return 0;}\n  \
4551   $msg=&lock4tc ($from, $from_type, \"LREAD\", \"\\
4552 ");\n    &lock4tc ($from, $from_type,\"LRELEASE\",\
4553  $msg);\n    &lock4tc ($to, $to_type, $action, $ms\
4554 g);\n    return;\n  }\nsub isshellpid\n  {\n    my\
4555  $p=shift;\n    if (!lock4tc ($p, \"LLOCK\", \"LCH\
4556 ECK\")){return 0;}\n    else\n      {\n my $c=lock\
4557 4tc($p, \"LLOCK\", \"LREAD\");\n        if ( $c=~/-SHELL-\
4558 /){return 1;}\n      }\n    return 0;\n  }\nsub is\
4559 rootpid\n  {\n    if(lock4tc (getppid(), \"LLOCK\"\
4560 , \"LCHECK\")){return 0;}\n    else {return 1;}\n \
4561  }\nsub lock4tc\n       {\n       my ($pid,$type,$action,$va\
4562 lue)=@_;\n        my $fname;\n    my $host=hostname;\n   \
4563  \n       if ($type eq \"LLOCK\"){$fname=\"$LOCKDIR/.$\
4564 pid.$host.lock4tcoffee\";}\n      elsif ( $type eq \"\
4565 LERROR\"){ $fname=\"$LOCKDIR/.$pid.$host.error4tco\
4566 ffee\";}\n        elsif ( $type eq \"LWARNING\"){ $fnam\
4567 e=\"$LOCKDIR/.$pid.$host.warning4tcoffee\";}\n    \\
4568 n         if ($debug_lock)\n        {\n       print STDERR \
4569 \"\\n\\t---lock4tc(tcg): $action => $fname =>$valu\
4570 e (RD: $LOCKDIR)\\n\";\n            }\n\n         if    ($actio\
4571 n eq \"LCHECK\") {return -e $fname;}\n    elsif ($a\
4572 ction eq \"LREAD\"){return file2string($fname);}\n\
4573           elsif ($action eq \"LSET\") {return string2file\
4574  ($value, $fname, \">>\");}\n     elsif ($action eq \
4575 \"LRESET\") {return string2file ($value, $fname, \\
4576 ">\");}\n         elsif ($action eq \"LRELEASE\") \n       \
4577  {\n          if ( $debug_lock)\n               {\n               my $g=new F\
4578 ileHandle;\n              open ($g, \">>$fname\");\n              prin\
4579 t $g \"\\nDestroyed by $$\\n\";\n                 close ($g);\n\
4580                   safe_system (\"mv $fname $fname.old\");\n             }\n\
4581               else\n            {\n               unlink ($fname);\n            }\n         \
4582 }\n       return \"\";\n        }\n     \nsub file2string\n     {\n      \
4583  my $file=@_[0];\n        my $f=new FileHandle;\n         my \
4584 $r;\n     open ($f, \"$file\");\n         while (<$f>){$r.\
4585 =$_;}\n   close ($f);\n   return $r;\n  }\nsub stri\
4586 ng2file \n    {\n    my ($s,$file,$mode)=@_;\n    \
4587 my $f=new FileHandle;\n    \n    open ($f, \"$mode\
4588 $file\");\n    print $f  \"$s\";\n    close ($f);\\
4589 n  }\n\nBEGIN\n    {\n      srand;\n    \n      $S\
4590 IG{'SIGUP'}='signal_cleanup';\n      $SIG{'SIGINT'\
4591 }='signal_cleanup';\n      $SIG{'SIGQUIT'}='signal\
4592 _cleanup';\n      $SIG{'SIGILL'}='signal_cleanup';\
4593 \n      $SIG{'SIGTRAP'}='signal_cleanup';\n      $\
4594 SIG{'SIGABRT'}='signal_cleanup';\n      $SIG{'SIGE\
4595 MT'}='signal_cleanup';\n      $SIG{'SIGFPE'}='sign\
4596 al_cleanup';\n      \n      $SIG{'SIGKILL'}='signa\
4597 l_cleanup';\n      $SIG{'SIGPIPE'}='signal_cleanup\
4598 ';\n      $SIG{'SIGSTOP'}='signal_cleanup';\n     \
4599  $SIG{'SIGTTIN'}='signal_cleanup';\n      $SIG{'SI\
4600 GXFSZ'}='signal_cleanup';\n      $SIG{'SIGINFO'}='\
4601 signal_cleanup';\n      \n      $SIG{'SIGBUS'}='si\
4602 gnal_cleanup';\n      $SIG{'SIGALRM'}='signal_clea\
4603 nup';\n      $SIG{'SIGTSTP'}='signal_cleanup';\n  \
4604     $SIG{'SIGTTOU'}='signal_cleanup';\n      $SIG{\
4605 'SIGVTALRM'}='signal_cleanup';\n      $SIG{'SIGUSR\
4606 1'}='signal_cleanup';\n\n\n      $SIG{'SIGSEGV'}='\
4607 signal_cleanup';\n      $SIG{'SIGTERM'}='signal_cl\
4608 eanup';\n      $SIG{'SIGCONT'}='signal_cleanup';\n\
4609       $SIG{'SIGIO'}='signal_cleanup';\n      $SIG{\
4610 'SIGPROF'}='signal_cleanup';\n      $SIG{'SIGUSR2'\
4611 }='signal_cleanup';\n\n      $SIG{'SIGSYS'}='signa\
4612 l_cleanup';\n      $SIG{'SIGURG'}='signal_cleanup'\
4613 ;\n      $SIG{'SIGCHLD'}='signal_cleanup';\n      \
4614 $SIG{'SIGXCPU'}='signal_cleanup';\n      $SIG{'SIG\
4615 WINCH'}='signal_cleanup';\n      \n      $SIG{'INT\
4616 '}='signal_cleanup';\n      $SIG{'TERM'}='signal_c\
4617 leanup';\n      $SIG{'KILL'}='signal_cleanup';\n  \
4618     $SIG{'QUIT'}='signal_cleanup';\n      \n      \
4619 our $debug_lock=$ENV{\"DEBUG_LOCK\"};\n      \n   \
4620    \n      \n      \n      foreach my $a (@ARGV){$\
4621 CL.=\" $a\";}\n      if ( $debug_lock ){print STDE\
4622 RR \"\\n\\n\\n********** START PG: $PROGRAM ******\
4623 *******\\n\";}\n      if ( $debug_lock ){print STD\
4624 ERR \"\\n\\n\\n**********(tcg) LOCKDIR: $LOCKDIR $\
4625 $ *************\\n\";}\n      if ( $debug_lock ){p\
4626 rint STDERR \"\\n --- $$ -- $CL\\n\";}\n      \n         \
4627     \n      \n      \n    }\nsub flush_error\n  {\\
4628 n    my $msg=shift;\n    return add_error ($EXIT_F\
4629 AILURE,$$, $$,getppid(), $msg, $CL);\n  }\nsub add\
4630 _error \n  {\n    my $code=shift;\n    my $rpid=sh\
4631 ift;\n    my $pid=shift;\n    my $ppid=shift;\n   \
4632  my $type=shift;\n    my $com=shift;\n    \n    $E\
4633 RROR_DONE=1;\n    lock4tc ($rpid, \"LERROR\",\"LSE\
4634 T\",\"$pid -- ERROR: $type\\n\");\n    lock4tc ($$\
4635 , \"LERROR\",\"LSET\", \"$pid -- COM: $com\\n\");\\
4636 n    lock4tc ($$, \"LERROR\",\"LSET\", \"$pid -- S\
4637 TACK: $ppid -> $pid\\n\");\n   \n    return $code;\
4638 \n  }\nsub add_warning \n  {\n    my $rpid=shift;\\
4639 n    my $pid =shift;\n    my $command=shift;\n    \
4640 my $msg=\"$$ -- WARNING: $command\\n\";\n    print\
4641  STDERR \"$msg\";\n    lock4tc ($$, \"LWARNING\", \
4642 \"LSET\", $msg);\n  }\n\nsub signal_cleanup\n  {\n\
4643     print dtderr \"\\n**** $$ (tcg) was killed\\n\\
4644 ";\n    &cleanup;\n    exit ($EXIT_FAILURE);\n  }\\
4645 nsub clean_dir\n  {\n    my $dir=@_[0];\n    if ( \
4646 !-d $dir){return ;}\n    elsif (!($dir=~/tmp/)){re\
4647 turn ;}#safety check 1\n    elsif (($dir=~/\\*/)){\
4648 return ;}#safety check 2\n    else\n      {\n   `rm \
4649 -rf $dir`;\n      }\n    return;\n  }\nsub cleanup\
4650 \n  {\n    #print stderr \"\\n----tc: $$ Kills $PI\
4651 DCHILD\\n\";\n    #kill (SIGTERM,$PIDCHILD);\n    \
4652 my $p=getppid();\n    $CLEAN_EXIT_STARTED=1;\n    \
4653 \n    \n    \n    if (&lock4tc($$,\"LERROR\", \"LC\
4654 HECK\", \"\"))\n      {\n       my $ppid=getppid();\n   if\
4655  (!$ERROR_DONE) \n        {\n       &lock4tc($$,\"LERROR\\
4656 ", \"LSET\", \"$$ -- STACK: $p -> $$\\n\");\n       \
4657 &lock4tc($$,\"LERROR\", \"LSET\", \"$$ -- COM: $CL\
4658 \\n\");\n         }\n      }\n    my $warning=&lock4tc($\
4659 $, \"LWARNING\", \"LREAD\", \"\");\n    my $error=\
4660 &lock4tc($$,  \"LERROR\", \"LREAD\", \"\");\n    #\
4661 release error and warning lock if root\n    \n    \
4662 if (isrootpid() && ($warning || $error) )\n      {\
4663 \n      \n      print STDERR \"**************** Summary ****\
4664 *********\\n$error\\n$warning\\n\";\n\n &lock4tc($\
4665 $,\"LERROR\",\"RELEASE\",\"\");\n       &lock4tc($$,\"LW\
4666 ARNING\",\"RELEASE\",\"\");\n      } \n    \n    \\
4667 n    foreach my $f (@TMPFILE_LIST)\n      {\n   if (\
4668 -e $f){unlink ($f);} \n      }\n    foreach my $d \
4669 (@TMPDIR_LIST)\n      {\n       clean_dir ($d);\n      }\
4670 \n    #No More Lock Release\n    #&lock4tc($$,\"LL\
4671 OCK\",\"LRELEASE\",\"\"); #release lock \n\n    if\
4672  ( $debug_lock ){print STDERR \"\\n\\n\\n*********\
4673 * END PG: $PROGRAM ($$) *************\\n\";}\n    \
4674 if ( $debug_lock ){print STDERR \"\\n\\n\\n*******\
4675 ***(tcg) LOCKDIR: $LOCKDIR $$ *************\\n\";}\
4676 \n  }\nEND \n  {\n    \n    &cleanup();\n  }\n   \\
4677 n\nsub safe_system \n{\n  my $com=shift;\n  my $nt\
4678 ry=shift;\n  my $ctry=shift;\n  my $pid;\n  my $st\
4679 atus;\n  my $ppid=getppid();\n  if ($com eq \"\"){\
4680 return 1;}\n  \n  \n\n  if (($pid = fork ()) < 0){\
4681 return (-1);}\n  if ($pid == 0)\n    {\n      set_\
4682 lock($$, \" -SHELL- $com (tcg)\");\n      exec ($c\
4683 om);\n    }\n  else\n    {\n      lock4tc ($$, \"L\
4684 LOCK\", \"LSET\", \"$pid\\n\");#update parent\n   \
4685    $PIDCHILD=$pid;\n    }\n  if ($debug_lock){prin\
4686 tf STDERR \"\\n\\t .... safe_system (fasta_seq2hmm\
4687 )  p: $$ c: $pid COM: $com\\n\";}\n\n  waitpid ($p\
4688 id,WTERMSIG);\n\n  shift_lock ($pid,$$, \"LWARNING\
4689 \",\"LWARNING\", \"LSET\");\n\n  if ($? == $EXIT_F\
4690 AILURE || lock4tc($pid, \"LERROR\", \"LCHECK\", \"\
4691 \"))\n    {\n      if ($ntry && $ctry <$ntry)\n {\\
4692 n         add_warning ($$,$$,\"$com failed [retry: $ctry\
4693 ]\");\n   lock4tc ($pid, \"LRELEASE\", \"LERROR\",\
4694  \"\");\n         return safe_system ($com, $ntry, ++$ct\
4695 ry);\n  }\n      elsif ($ntry == -1)\n  {\n       if (!s\
4696 hift_lock ($pid, $$, \"LERROR\", \"LWARNING\", \"L\
4697 SET\"))\n           {\n       add_warning ($$,$$,\"$com \
4698 failed\");\n        }\n   else\n            {\n       lock4t\
4699 c ($pid, \"LRELEASE\", \"LERROR\", \"\");\n         }\\
4700 n         return $?;}\n      else\n     {\n       if (!shift_loc\
4701 k ($pid,$$, \"LERROR\",\"LERROR\", \"LSET\"))\n   \
4702   {\n         myexit(add_error ($EXIT_FAILURE,$$,$pi\
4703 d,getppid(), \"UNSPECIFIED system\", $com));\n     \
4704  }\n    }\n    }\n  return $?;\n}\n\nsub check_config\
4705 uration \n    {\n      my @l=@_;\n      my $v;\n  \
4706     foreach my $p (@l)\n        {\n       \n      if   ( $p eq \\
4707 "EMAIL\")\n         { \n              if ( !($EMAIL=~/@/))\n    \
4708         {\n             add_warning($$,$$,\"Could Not Use EMAIL\");\\
4709 n               myexit(add_error ($EXIT_FAILURE,$$,$$,getppid()\
4710 ,\"EMAIL\",\"$CL\"));\n       }\n           }\n   elsif(\
4711  $p eq \"INTERNET\")\n      {\n       if ( !&check_\
4712 internet_connection())\n                {\n               myexit(add_error \
4713 ($EXIT_FAILURE,$$,$$,getppid(),\"INTERNET\",\"$CL\\
4714 "));\n          }\n         }\n   elsif( $p eq \"wget\")\n         \
4715  {\n          if (!&pg_is_installed (\"wget\") && !&p\
4716 g_is_installed (\"curl\"))\n            {\n               myexit(add_er\
4717 ror ($EXIT_FAILURE,$$,$$,getppid(),\"PG_NOT_INSTAL\
4718 LED:wget\",\"$CL\"));\n         }\n         }\n   elsif( !(&p\
4719 g_is_installed ($p)))\n     {\n       myexit(add_e\
4720 rror ($EXIT_FAILURE,$$,$$,getppid(),\"PG_NOT_INSTA\
4721 LLED:$p\",\"$CL\"));\n      }\n }\n      return 1;\\
4722 n    }\nsub pg_is_installed\n  {\n    my @ml=@_;\n\
4723     my $r, $p, $m;\n    my $supported=0;\n    \n  \
4724   my $p=shift (@ml);\n    if ($p=~/::/)\n      {\n\
4725         if (safe_system (\"perl -M$p -e 1\")==$EXIT_SUCCE\
4726 SS){return 1;}\n        else {return 0;}\n      }\n    el\
4727 se\n      {\n   $r=`which $p 2>/dev/null`;\n    if ($r \
4728 eq \"\"){return 0;}\n   else {return 1;}\n      }\n \
4729  }\n\n\n\nsub check_internet_connection\n  {\n    \
4730 my $internet;\n    my $tmp;\n    &check_configurat\
4731 ion ( \"wget\"); \n    \n    $tmp=&vtmpnam ();\n  \
4732   \n    if     (&pg_is_installed    (\"wget\")){`w\
4733 get www.google.com -O$tmp >/dev/null 2>/dev/null`;\
4734 }\n    elsif  (&pg_is_installed    (\"curl\")){`cu\
4735 rl www.google.com -o$tmp >/dev/null 2>/dev/null`;}\
4736 \n    \n    if ( !-e $tmp || -s $tmp < 10){$intern\
4737 et=0;}\n    else {$internet=1;}\n    if (-e $tmp){\
4738 unlink $tmp;}\n\n    return $internet;\n  }\nsub c\
4739 heck_pg_is_installed\n  {\n    my @ml=@_;\n    my \
4740 $r=&pg_is_installed (@ml);\n    if (!$r && $p=~/::\
4741 /)\n      {\n   print STDERR \"\\nYou Must Install t\
4742 he perl package $p on your system.\\nRUN:\\n\\tsud\
4743 o perl -MCPAN -e 'install $pg'\\n\";\n      }\n   \
4744  elsif (!$r)\n      {\n myexit(flush_error(\"\\nPr\
4745 ogram $p Supported but Not Installed on your syste\
4746 m\"));\n      }\n    else\n      {\n    return 1;\n  \
4747     }\n  }\n\n\n","use Cwd;\nuse Env;\nuse File::P\
4748 ath;\nuse FileHandle;\nuse strict;\n\n\nour (%MODE\
4749 , %PG, %ENV_SET, %SUPPORTED_OS);\n\n\nour $EXIT_SU\
4750 CCESS=0;\nour $EXIT_FAILURE=1;\nour $INTERNET=0;\n\
4751 \nour $CP=\"cp \"; #was causing a crash on MacOSX\\
4752 nour $SILENT=\">/dev/null 2>/dev/null\";\nour $WEB\
4753 _BASE=\"http://www.tcoffee.org\";\nour $TCLINKDB_A\
4754 DDRESS=\"$WEB_BASE/Resources/tclinkdb.txt\";\nour \
4755 $OS=get_os();\nour $ROOT=&get_root();\nour $CD=cwd\
4756 ();\nour $CDIR=$CD;\nour $HOME=$ENV{'HOME'};\n\nou\
4757 r $OSNAME=$ENV{'OSNAME'};\nour $OSARCH=$ENV{'OSARC\
4758 H'};\nour $REPO_ROOT=\"\";\n\nour $TCDIR;\nour $TC\
4759 CACHE;\nour $TCTMP;\nour $TCM;\nour $TCMETHODS;\no\
4760 ur $TCPLUGINS;\nour $PLUGINS_DIR=\"\";\nour $INSTA\
4761 LL_DIR=\"\";\n\nour $CXX=\"g++\";\nour $CXXFLAGS=\\
4762 "\";\n\nour $CPP=\"g++\";\nour $CPPFLAGS=\"\";\n\n\
4763 our $CC=\"gcc\";\nour $CFLAGS=$ENV{'CFLAGS'};\n\no\
4764 ur $FC=\"f77\";\nour $FFLAGS=\"\";\n\nmy $install=\
4765 \"all\";\nmy $default_update_action=\"no_update\";\
4766 \nmy @required_applications=(\"wget_OR_curl\");\nm\
4767 y @smode=(\"all\", \"clean\", \"install\");\n\n&in\
4768 itialize_PG();\n\nmy $cl=join( \" \", @ARGV);\nif \
4769 ($#ARGV==-1 || ($cl=~/-h/) ||($cl=~/-H/) )\n  {\n \
4770     print \"\\n!!!!!!! ./install  t_coffee        \
4771      --> installs t_coffee only\";\n     print \"\\
4772 \n!!!!!!! ./install  all                  --> inst\
4773 alls all the modes [mcoffee, expresso, psicoffee,r\
4774 coffee..]\";\n     print \"\\n!!!!!!! ./install  [\
4775 mcoffee|rcoffee|..] --> installs the specified mod\
4776 e\";\n     print \"\\n!!!!!!! ./install  -h       \
4777             --> print usage\\n\\n\";\n     if ( $#\
4778 ARGV==-1){exit ($EXIT_FAILURE);}\n   }\n     \nif \
4779 (($cl=~/-h/) ||($cl=~/-H/) )\n  {\n    my $m;\n   \
4780  print \"\\n\\n!!!!!!! advanced mode\\n\";\n    fo\
4781 reach $m ((keys (%MODE)),@smode)\n      {\n     print \
4782 \"!!!!!!!       ./install $m\\n\";\n      }\n    \\
4783 n    print \"!!!!!!! ./install [target:package|mod\
4784 e|] [-update|-force|-exec=dir|-dis=dir|-root|-tcli\
4785 nkdb=file|-] [CC=|FCC=|CXX=|CFLAGS=|CXXFLAGS=]\\n\\
4786 ";\n    print \"!!!!!!! ./install clean    [remove\
4787 s all executables]\\n\";\n    print \"!!!!!!! ./in\
4788 stall [optional:target] -update               [upd\
4789 ates package already installed]\\n\";\n    print \\
4790 "!!!!!!! ./install [optional:target] -force       \
4791          [Forces recompilation over everything]\\n\
4792 \";\n    \n    print \"!!!!!!! ./install [optional\
4793 :target] -root                 [You are running as\
4794  root]\\n\";\n    print \"!!!!!!! ./install [optio\
4795 nal:target] -exec=/foo/bar/       [address for the\
4796  T-Coffee executable]\\n\";\n    print \"!!!!!!! .\
4797 /install [optional:target] -dis=/foo/bar/        [\
4798 Address where distributions should be stored]\\n\"\
4799 ;\n    print \"!!!!!!! ./install [optional:target]\
4800  -tclinkdb=foo|update  [file containing all the pa\
4801 ckages to be installed]\\n\";\n    print \"!!!!!!!\
4802  ./install [optional:target] -clean               \
4803  [clean everything]\\n\";\n    print \"!!!!!!! ./i\
4804 nstall [optional:target] -plugins              [pl\
4805 ugins directory]\\n\";\n    print \"!!!!!!! ./inst\
4806 all [optional:target] -tcdir=/foor/bar      [base \
4807 path where T-Coffee will be installed]\\n\";\n    \
4808 print \"!!!!!!! ./install [optional:target] -repo=\
4809 /path/to/repo   [binaries repository root director\
4810 y]\\n\";\n    print \"!!!!!!! mode:\";\n    foreac\
4811 h $m (keys(%MODE)){print \"$m \";}\n    print \"\\\
4812 n\";\n    print \"!!!!!!! Packages:\";\n    foreac\
4813 h $m (keys (%PG)){print \"$m \";}\n    print \"\\n\
4814 \";\n    \n    print \"\\n\\n\";\n    exit ($EXIT_\
4815 FAILURE);\n  }\n\n\n\nmy (@argl)=($cl=~/(\\S+=[^=]\
4816 +)\\s\\w+=/g);\npush (@argl, ($cl=~/(\\S+=[^=]+\\S\
4817 )\\s*$/g));\n\nforeach $a (@argl)\n  {\n    if ( (\
4818 $cl=~/CXX=(.*)/)){$CXX=$1;}\n    if ( ($cl=~/-CC=(\
4819 .*)/    )){$CC=$1;}\n    if ( ($cl=~/-FC=(.*)/    \
4820 )){$FC=$1;}\n    if ( ($cl=~/-CFLAGS=(.*)/)){$CFLA\
4821 GS=$1;}\n    if ( ($cl=~/-CXXFLAGS=(.*)/)){$CXXFLA\
4822 GS=$1;}\n  }\nour ($ROOT_INSTALL, $NO_QUESTION, $d\
4823 efault_update_action,$BINARIES_ONLY,$force, $defau\
4824 lt_update_action, $INSTALL_DIR, $PLUGINS_DIR, $DIS\
4825 TRIBUTIONS,$tclinkdb, $proxy, $clean);\nif ( ($cl=\
4826 ~/-root/)){$ROOT_INSTALL=1;}\nif ( ($cl=~/-no_ques\
4827 tion/)){$NO_QUESTION=1;}\nif ( ($cl=~/-update/)){$\
4828 default_update_action=\"update\";}\nif ( ($cl=~/-b\
4829 inaries/)){$BINARIES_ONLY=1;}\nif ( ($cl=~/-force/\
4830 )){$force=1;$default_update_action=\"update\"}\nif\
4831  ( ($cl=~/-exec=\\s*(\\S+)/)){$INSTALL_DIR=$1;}\ni\
4832 f ( ($cl=~/-plugins=\\s*(\\S+)/)){$PLUGINS_DIR=$1;\
4833 }\nif ( ($cl=~/-dis=\\s*(\\S+)/)){$DISTRIBUTIONS=$\
4834 1;}\n\nif ( ($cl=~/-tclinkdb=\\s*(\\S+)/)){$tclink\
4835 db=$1;}\nif ( ($cl=~/-proxy=\\s*(\\S+)/)){$proxy=$\
4836 1;}\nif ( ($cl=~/-clean/)){$clean=1;}\nif ( ($cl=~\
4837 /-repo=\\s*(\\S+)/)){ $REPO_ROOT=$1; }\nif ( ($cl=\
4838 ~/-tcdir=\\s*(\\S+)/)){ $TCDIR=$1; }\nif ($tclinkd\
4839 b){&update_tclinkdb ($tclinkdb);}\n\n\nif( $REPO_R\
4840 OOT ne \"\" ) {\n       if( $OSNAME eq \"\" ) { print \"\
4841 You have specified the repository folder but the r\
4842 equired \\\"OSNAME\\\" enviroment variable is miss\
4843 ing. \\n\"; exit 1; } \n        if( $OSARCH eq \"\" ) { p\
4844 rint \"You have specified the repository folder bu\
4845 t the required \\\"OSARCH\\\" enviroment variable \
4846 is missing. \\n\"; exit 1; } \n}\n\n\nif(!$TCDIR) \
4847 { $TCDIR=\"$HOME/.t_coffee\"; }\n&add_dir ($TCDIR)\
4848 ;\n&add_dir ($TCCACHE=\"$TCDIR/cache\");\n&add_dir\
4849  ($TCTMP=\"$CDIR/tmp\");\n&add_dir ($TCM=\"$TCDIR/\
4850 mcoffee\");\n&add_dir ($TCMETHODS=\"$TCDIR/methods\
4851 \");\n&add_dir ($TCPLUGINS=\"$TCDIR/plugins/$OS\")\
4852 ;\n\n\nour $BASE=\"$CD/bin\";\nour $BIN=\"$BASE/bi\
4853 naries/$OS\";\nour $DOWNLOAD_DIR=\"$BASE/download\\
4854 ";\nour $DOWNLOAD_FILE=\"$DOWNLOAD_DIR/files\";\no\
4855 ur $TMP=\"$BASE/tmp\";\n\n&add_dir($BASE);\n&add_d\
4856 ir($BIN);\n&add_dir($DOWNLOAD_DIR);\n&add_dir($DOW\
4857 NLOAD_FILE);\nif (!$DISTRIBUTIONS){$DISTRIBUTIONS=\
4858 \"$DOWNLOAD_DIR/distributions\";}\n&add_dir ($DIST\
4859 RIBUTIONS);\n&add_dir ($TMP);\n\n\nif    (!$PLUGIN\
4860 S_DIR && !$ROOT_INSTALL){$PLUGINS_DIR=$TCPLUGINS;}\
4861 \nelsif (!$PLUGINS_DIR &&  $ROOT_INSTALL){$PLUGINS\
4862 _DIR=\"/usr/local/bin/\";}\n\nif    (!$INSTALL_DIR\
4863  && !$ROOT_INSTALL){$INSTALL_DIR=\"$HOME/bin/\";mk\
4864 path ($INSTALL_DIR);}\nelsif (!$INSTALL_DIR &&  $R\
4865 OOT_INSTALL){$INSTALL_DIR=\"/usr/local/bin/\";}\n\\
4866 nif (-d \"mcoffee\"){`cp mcoffee/* $TCM`;}\n\n\nou\
4867 r $ENV_FILE=\"$TCDIR/t_coffee_env\";\n&env_file2pu\
4868 tenv ($ENV_FILE);\n&set_proxy($proxy);\nmy ($targe\
4869 t, $p, $r);\n$target=$p;\n\nforeach $p (  ((keys (\
4870 %PG)),(keys(%MODE)),(@smode)) )\n  {\n    if ($ARG\
4871 V[0] eq $p && $target eq \"\"){$target=$p;}\n  }\n\
4872 if ($target eq \"\"){exit ($EXIT_FAILURE);}\n\n\nf\
4873 oreach $r (@required_applications)\n  {\n    my @a\
4874 pp_list;\n    my $i;\n    $i=0;\n    \n    @app_li\
4875 st=split (/_OR_/, $r);\n    foreach my $pg (@app_l\
4876 ist)\n      {\n $i+=&pg_is_installed ($pg);\n     \
4877  }\n    if ($i==0)\n      {\n      print \"One of \
4878 the following packages must be installed to procee\
4879 d: \";\n      foreach my $pg (@app_list)\n      {\n       p\
4880 rint (\"$pg \");\n      }\n      die;\n    }\n  }\n\n\n\
4881 \n\n\n\n&sign_license_ni();\n\n\n$PG{C}{compiler}=\
4882 get_C_compiler($CC);\n$PG{Fortran}{compiler}=get_F\
4883 _compiler($FC);\n$PG{CXX}{compiler}=$PG{CPP}{compi\
4884 ler}=$PG{GPP}{compiler}=get_CXX_compiler($CXX);\ni\
4885 f ($CXXFLAGS){$PG{CPP}{options}=$PG{GPP}{options}=\
4886 $PG{CXX}{options}=$CXXFLAGS;}\nif ($CFLAGS ne \"\"\
4887  ){$PG{C}{options}=$CFLAGS;}\nforeach my $c (keys(\
4888 %PG))\n  {\n    my $arguments;\n    if ($PG{$c}{co\
4889 mpiler})\n      {\n     $arguments=\"$PG{$c}{compiler_\
4890 flag}=$PG{$c}{compiler} \";\n   if ($PG{$c}{options}\
4891 )\n       {\n       $arguments.=\"$PG{$c}{options_flag}=\
4892 '\" . $PG{$c}{options} . \"' \";\n        }\n   $PG{$c}{a\
4893 rguments}=$arguments;\n      }\n  }\n\nif ($PG{$ta\
4894 rget}){$PG{$target}{install}=1;}\nelse\n  {\n    f\
4895 oreach my $pg (keys(%PG))\n      {\n    if ( $target \
4896 eq \"all\" || ($PG{$pg}{mode}=~/$target/))\n      {\n\
4897             $PG{$pg} {install}=1;\n       }\n      }\n  }\n\n\
4898 foreach my $pg (keys(%PG))\n  {\n    if (!$PG{$pg}\
4899 {update_action}){$PG{$pg}{update_action}=$default_\
4900 update_action;}\n    elsif ($PG{$pg}{update_action\
4901 } eq \"never\"){$PG{$pg}{install}=0;}\n    if ( $f\
4902 orce && $PG{$pg}{install})\n      {\n   `rm $BIN/$pg\
4903  $BIN/$pg.exe $SILENT`;\n      }\n    if ($PG{$pg}\
4904 {update_action} eq \"update\" && $PG{$pg}{install}\
4905 ){$PG{$pg}{update}=1;}\n  }\n\nif (($target=~/clea\
4906 n/))\n  {\n    print \"------- cleaning executable\
4907 s -----\\n\";\n    `rm bin/* $SILENT`;\n    exit (\
4908 $EXIT_SUCCESS);\n  }\n\nif ( !$PG{$target}){print \
4909 \"------- Installing T-Coffee Modes\\n\";}\n\nfore\
4910 ach my $m (keys(%MODE))\n  {\n    if ( $target eq \
4911 \"all\" || $target eq $m)\n      {\n    print \"\\n--\
4912 ----- The installer will now install the $m compon\
4913 ents $MODE{$m}{description}\\n\";\n     foreach my $pg\
4914  (keys(%PG))\n    {\n       if ( $PG{$pg}{mode} =~/$m\
4915 / && $PG{$pg}{install})\n             {\n               if ($PG{$pg}{\
4916 touched}){print \"------- $PG{$pg}{dname}: already\
4917  processed\\n\";}\n             else {$PG{$pg}{success}=&inst\
4918 all_pg($pg);$PG{$pg}{touched}=1;}\n           }\n         }\\
4919 n      }\n  }\n\nif ( $PG{$target}){print \"------\
4920 - Installing Individual Package\\n\";}\nforeach my\
4921  $pg (keys (%PG))\n  {\n    \n    if ( $PG{$pg}{in\
4922 stall} && !$PG{$pg}{touched})\n      {\n        print \"\\
4923 \n------- Install $pg\\n\";\n   $PG{$pg}{success}=&i\
4924 nstall_pg($pg);$PG{$pg}{touched}=1;\n      }\n  }\\
4925 nprint \"------- Finishing The installation\\n\";\\
4926 nmy $final_report=&install ($INSTALL_DIR);\n\nprin\
4927 t \"\\n\";\nprint \"******************************\
4928 ***************************************\\n\";\npri\
4929 nt \"********              INSTALLATION SUMMARY   \
4930        *****************\\n\";\nprint \"**********\
4931 **************************************************\
4932 *********\\n\";\nprint \"------- SUMMARY package I\
4933 nstallation:\\n\";\nprint \"-------   Executable I\
4934 nstalled in: $PLUGINS_DIR\\n\";\n\nforeach my $pg \
4935 (keys(%PG))\n  {\n    if ( $PG{$pg}{install})\n   \
4936    {\n  my $bin_status=($PG{$pg}{from_binary} && $P\
4937 G{$pg}{success})?\"[from binary]\":\"\";\n      if     \
4938 ( $PG{$pg}{new} && !$PG{$pg}{old})                \
4939      {print \"*------        $PG{$pg}{dname}: inst\
4940 alled $bin_status\\n\"; $PG{$pg}{status}=1;}\n  els\
4941 if  ( $PG{$pg}{new} &&  $PG{$pg}{old})            \
4942          {print \"*------        $PG{$pg}{dname}: \
4943 updated $bin_status\\n\"  ; $PG{$pg}{status}=1;} \\
4944 n       elsif  (!$PG{$pg}{new} &&  $PG{$pg}{old} && !$PG\
4945 {$pg}{update}){print \"*------        $PG{$pg}{dna\
4946 me}: previous\\n\" ; $PG{$pg}{status}=1;}\n     elsif \
4947  (!$PG{$pg}{new} &&  $PG{$pg}{old} &&  $PG{$pg}{up\
4948 date}){print \"*------        $PG{$pg}{dname}: fai\
4949 led update (previous installation available)\\n\";\
4950 $PG{$pg}{status}=0;}\n  else                       \
4951                                    {print \"*-----\
4952 -        $PG{$pg}{dname}: failed installation\\n\"\
4953 ;$PG{$pg}{status}=0;}\n      }\n  }\nmy $failure;\\
4954 n\nif ( !$PG{$target}){print \"*------ SUMMARY mod\
4955 e Installation:\\n\";}\nforeach my $m (keys(%MODE)\
4956 )\n  {\n  \n    if ( $target eq \"all\" || $target\
4957  eq $m)\n      {\n      my $succesful=1;\n      foreach my $\
4958 pg (keys(%PG))\n          {\n       if (($PG{$pg}{mode}=~/$\
4959 m/) && $PG{$pg}{install} && $PG{$pg}{status}==0)\n\
4960               {\n               $succesful=0;\n         print \"*!!!!!!      \
4961  $PG{$pg}{dname}: Missing\\n\";\n             }\n         }\n   \
4962 if ( $succesful)\n        {\n       $MODE{$m}{status}=1;\\
4963 n           print \"*------       MODE $MODE{$m}{dname} \
4964 SUCCESSFULLY installed\\n\";\n    }\n   else\n    {\n   \
4965     $failure++;\n           $MODE{$m}{status}=0;\n          p\
4966 rint \"*!!!!!!       MODE $MODE{$m}{dname} UNSUCCE\
4967 SSFULLY installed\\n\";\n         }\n      }\n  }\n\n   \
4968  \n      \nif ($clean==1 && ($BASE=~/install4tcoff\
4969 ee/) ){print \"*------ Clean Installation Director\
4970 y: $BASE\\n\";`rm -rf $BASE`;}\nforeach my $pg (ke\
4971 ys(%PG)){if ($PG{$pg}{install} && $PG{$pg}{status}\
4972 ==0){exit ($EXIT_FAILURE);}}\n\nif ($failure)\n  {\
4973 \n    print \"************************************\
4974 *********************************\\n\";\n    print\
4975  \"********     SOME PACKAGES FAILED TO INSTALL   \
4976      *****************\\n\";\n    print \"********\
4977 **************************************************\
4978 ***********\\n\";\n    print \"\\nSome of the repo\
4979 rted failures may be due to connectivity problems\\
4980 ";\n    print \"\\nRerun the installation and the \
4981 installer will specifically try to install the mis\
4982 sing packages\";\n    print \"\\nIf this Fails, go\
4983  to the original website and install the package m\
4984 anually\";\n  }\n\nprint \"***********************\
4985 **********************************************\\n\\
4986 ";\nprint \"********              FINALIZE YOUR IN\
4987 STALLATION    *****************\\n\";\nprint \"***\
4988 **************************************************\
4989 ****************\\n\";\nprint \"------- Your execu\
4990 tables are in:\\n\"; \nprint \"-------       $PLUG\
4991 INS_DIR:\\n\";\nprint \"------- Add this directory\
4992  to your path with the following command:\\n\";\np\
4993 rint \"-------       export PATH=$PLUGINS_DIR:\\$P\
4994 ATH\\n\";\nprint \"------- Make this permanent by \
4995 adding this line to the file:\\n\";\nprint \"-----\
4996 --       $HOME/.bashrc\\n\";\nexit ($EXIT_SUCCESS)\
4997 ;  \n  \nsub get_CXX_compiler\n  {\n    my $c=@_[0\
4998 ];\n    my (@clist)=(\"g++\");\n    \n    return g\
4999 et_compil ($c, @clist);\n }\nsub get_C_compiler\n \
5000  {\n    my $c=@_[0];\n    my (@clist)=(\"gcc\", \"\
5001 cc\", \"icc\");\n    \n    return get_compil ($c, \
5002 @clist);\n }\n\nsub get_F_compiler\n  {\n    my ($\
5003 c)=@_[0];\n    my @clist=(\"f77\", \"g77\",\"g95\"\
5004 , \"gfortran\", \"ifort\");\n    return get_compil\
5005  ($c, @clist);\n  } \n       \nsub get_compil\n  {\
5006 \n    my ($fav,@clist)=(@_);\n    \n    #return th\
5007 e first compiler found installed in the system. Ch\
5008 eck first the favorite\n    foreach my $c ($fav,@c\
5009 list)\n      {\n        if  (&pg_is_installed ($c)){retur\
5010 n $c;}\n      }\n    return \"\";\n  }\nsub exit_i\
5011 f_pg_not_installed\n  {\n    my (@arg)=(@_);\n    \
5012 \n    foreach my $p (@arg)\n      {\n   if ( !&pg_is\
5013 _installed ($p))\n        {\n       print \"!!!!!!!! The \
5014 $p utility must be installed for this installation\
5015  to proceed [FATAL]\\n\";\n         die;\n        }\n      \
5016 }\n    return 1;\n  }\nsub set_proxy\n  {\n    my \
5017 ($proxy)=(@_);\n    my (@list,$p);\n    \n    @lis\
5018 t= (\"HTTP_proxy\", \"http_proxy\", \"HTTP_PROXY\"\
5019 , \"ALL_proxy\", \"all_proxy\",\"HTTP_proxy_4_TCOF\
5020 FEE\",\"http_proxy_4_TCOFFEE\");\n    \n    if (!$\
5021 proxy)\n      {\n       foreach my $p (@list)\n   {\n     \
5022   if ( ($ENV_SET{$p}) || $ENV{$p}){$proxy=$ENV{$p}\
5023 ;}\n      }\n      }\n    foreach my $p(@list){$ENV{$\
5024 p}=$proxy;}\n  }\n      \nsub check_internet_connection\
5025 \n  {\n    my $internet;\n    \n    if ( -e \"x\")\
5026 {unlink (\"x\");}\n    if     (&pg_is_installed   \
5027  (\"wget\")){`wget www.google.com -Ox >/dev/null 2\
5028 >/dev/null`;}\n    elsif  (&pg_is_installed    (\"\
5029 curl\")){`curl www.google.com -ox >/dev/null 2>/de\
5030 v/null`;}\n    else\n      {\n  printf stderr \"\\n\
5031 ERROR: No pg for remote file fetching [wget or cur\
5032 l][FATAL]\\n\";\n       exit ($EXIT_FAILURE);\n      }\n\
5033     \n    if ( !-e \"x\" || -s \"x\" < 10){$intern\
5034 et=0;}\n    else {$internet=1;}\n    if (-e \"x\")\
5035 {unlink \"x\";}\n    return $internet;\n  }\nsub u\
5036 rl2file\n  {\n    my ($cmd, $file,$wget_arg, $curl\
5037 _arg)=(@_);\n    my ($exit,$flag, $pg, $arg);\n   \
5038  \n    if ($INTERNET || check_internet_connection \
5039 ()){$INTERNET=1;}\n    else\n      {\n  print STDER\
5040 R \"ERROR: No Internet Connection [FATAL:install.p\
5041 l]\\n\";\n      exit ($EXIT_FAILURE);\n      }\n    \n \
5042    if     (&pg_is_installed    (\"wget\")){$pg=\"w\
5043 get\"; $flag=\"-O\";$arg=\"--tries=2 --connect-tim\
5044 eout=10 $wget_arg\";}\n    elsif  (&pg_is_installe\
5045 d    (\"curl\")){$pg=\"curl\"; $flag=\"-o\";$arg=$\
5046 curl_arg;}\n    else\n      {\n printf stderr \"\\\
5047 nERROR: No pg for remote file fetching [wget or cu\
5048 rl][FATAL]\\n\";\n      exit ($EXIT_FAILURE);\n      }\\
5049 n    \n    \n    if (-e $file){unlink($file);}\n  \
5050   $exit=system \"$pg $cmd $flag$file $arg\";\n    \
5051 return $exit;\n  }\n\nsub pg_is_installed\n  {\n  \
5052   my ($p, $dir)=(@_);\n    my ($r,$m, $ret);\n    \
5053 my ($supported, $language, $compil);\n    \n  \n  \
5054   if ( $PG{$p})\n      {\n      $language=$PG{$p}{langu\
5055 age2};\n        $compil=$PG{$language}{compiler};\n      \
5056 }\n    \n    if ( $compil eq \"CPAN\")\n      {\n       \
5057 if ( system (\"perl -M$p -e 1\")==$EXIT_SUCCESS){$\
5058 ret=1;}\n       else {$ret=0;}\n      }\n    elsif ($dir\
5059 )\n      {\n    if (-e \"$dir/$p\" || -e \"$dir/$p\\.\
5060 exe\"){$ret=1;}\n       else {$ret=0;}\n      }\n    els\
5061 if (-e \"$PLUGINS_DIR/$p\" || -e \"$PLUGINS_DIR/$p\
5062 .exe\"){$ret=1;}\n    else\n      {\n   $r=`which $p\
5063  2>/dev/null`;\n        if ($r eq \"\"){$ret=0;}\n      else {\
5064 $ret=1;}\n      }\n   \n    return $ret;\n  }\nsub\
5065  install\n  {\n    my ($new_bin)=(@_);\n    my ($c\
5066 opied, $report);\n\n    \n    if (!$ROOT_INSTALL)\\
5067 n      {\n      \n      if (-e \"$BIN/t_coffee\"){`$CP $BIN/\
5068 t_coffee $INSTALL_DIR`};\n      `cp $BIN/* $PLUGINS_DIR\
5069 `;\n    $copied=1;\n      }\n    else\n      {\n        $cop\
5070 ied=&root_run (\"You must be root to finalize the \
5071 installation\", \"$CP $BIN/* $INSTALL_DIR $SILENT\\
5072 ");\n      }\n    \n     \n  if ( !$copied)\n    {\
5073 \n      $report=\"*!!!!!! Installation unsuccesful\
5074 . The executables have been left in $BASE/bin\\n\"\
5075 ;\n    }\n  elsif ( $copied && $ROOT)\n    {\n    \
5076   $report=\"*------ Installation succesful. Your e\
5077 xecutables have been copied in $new_bin and are on\
5078  your PATH\\n\";\n    }\n  elsif ( $copied && !$RO\
5079 OT)\n    {\n      $report= \"*!!!!!! T-Coffee and \
5080 associated packages have been copied in: $new_bin\\
5081 \n\";\n      $report.=\"*!!!!!! This address is NO\
5082 T in your PATH sytem variable\\n\";\n      $report\
5083 .=\"*!!!!!! You can do so by adding the following \
5084 line in your ~/.bashrc file:\\n\";\n      $report.\
5085 =\"*!!!!!! export PATH=$new_bin:\\$PATH\\n\";\n   \
5086  }\n  return $report;\n}\n\nsub sign_license_ni\n \
5087  {\n    my $F=new FileHandle;\n    open ($F, \"lic\
5088 ense.txt\");\n    while (<$F>)\n      {\n       print \"\
5089 $_\";\n      }\n    close ($F);\n    \n    return;\
5090 \n  }\n\nsub install_pg\n  {\n    my ($pg)=(@_);\n\
5091     my ($report, $previous, $language, $compiler, \
5092 $return);\n    \n    if (!$PG{$pg}{install}){retur\
5093 n 1;}\n    \n    $previous=&pg_is_installed ($pg);\
5094 \n    \n    if ($PG{$pg}{update_action} eq \"no_up\
5095 date\" && $previous)\n      {\n $PG{$pg}{old}=1;\n\
5096         $PG{$pg}{new}=0;\n      $return=1;\n      }\n    else\\
5097 n      {\n      $PG{$pg}{old}=$previous;\n      \n      if ($PG{$\
5098 pg} {language2} eq \"Perl\"){&install_perl_package\
5099  ($pg);}\n      elsif ($BINARIES_ONLY && &install_binar\
5100 y_package ($pg)){$PG{$pg}{from_binary}=1;}\n    elsif\
5101  (&install_source_package ($pg)){;}\n   else \n   {\\
5102 n           \n      if (!&supported_os($OS))\n        {\n       \
5103         print \"!!!!!!!! $pg compilation failed, binary u\
5104 nsupported for $OS\\n\"; \n           }\n           elsif (!\
5105 ($PG{$pg}{from_binary}=&install_binary_package ($p\
5106 g)))\n        {\n               print \"!!!!!!!! $pg compilation\
5107  and  binary installation failed\\n\";\n              }\n\
5108           }\n   $PG{$pg}{new}=$return=&pg_is_installed ($pg\
5109 ,$BIN);\n      }\n\n    \n    return $return;\n  }\
5110 \nsub install_perl_package\n  {\n    my ($pg)=(@_)\
5111 ;\n    my ($report, $language, $compiler);\n    \n\
5112     $language=$PG{$pg} {language2};\n    $compiler\
5113 =$PG{$language}{compiler};\n    \n    if (!&pg_is_\
5114 installed ($pg))\n      {\n     if ( $OS eq \"windows\\
5115 "){`perl -M$compiler -e 'install $pg'`;}\n      elsif (\
5116  $ROOT eq \"sudo\"){system (\"sudo perl -M$compile\
5117 r -e 'install $pg'\");}\n       else {system (\"su root \
5118 -c perl -M$compiler -e 'install $pg'\");}\n      }\
5119 \n    return &pg_is_installed ($pg);\n  }\n\n\n\ns\
5120 ub install_source_package\n  {\n    my ($pg)=(@_);\
5121 \n    my ($report, $download, $arguments, $languag\
5122 e, $address, $name, $ext, $main_dir, $distrib);\n \
5123    my $wget_tmp=\"$TMP/wget.tmp\";\n    my (@fl);\\
5124 n    if ( -e \"$BIN/$pg\" || -e \"$BIN/$pg.exe\"){\
5125 return 1;}\n    \n    #\n    # check if the module\
5126  exists in the repository cache \n    #\n       if( repo\
5127 _load($pg) ) {\n                return 1;\n     }\n    \n    if ($pg\
5128  eq \"t_coffee\")  {return   &install_t_coffee ($p\
5129 g);}\n    elsif ($pg eq \"TMalign\"){return   &ins\
5130 tall_TMalign ($pg);}\n    \n    chdir $DISTRIBUTIO\
5131 NS;\n    \n    $download=$PG{$pg}{source};\n    \n\
5132     if (($download =~/tgz/))\n      {\n ($address,\
5133 $name,$ext)=($download=~/(.+\\/)([^\\/]+)(\\.tgz).\
5134 */);\n      }\n    elsif (($download=~/tar\\.gz/))\
5135 \n      {\n     ($address,$name,$ext)=($download=~/(.+\
5136 \\/)([^\\/]+)(\\.tar\\.gz).*/);\n      }\n    elsi\
5137 f (($download=~/tar/))\n      {\n       ($address,$name,\
5138 $ext)=($download=~/(.+\\/)([^\\/]+)(\\.tar).*/);\n\
5139       }\n    else\n      {\n    ($address,$name)=($do\
5140 wnload=~/(.+\\/)([^\\/]+)/);\n  $ext=\"\";\n      }\
5141 \n    $distrib=\"$name$ext\";\n    \n    if ( !-d \
5142 $pg){mkdir $pg;}\n    chdir $pg;\n   \n    #get th\
5143 e distribution if available\n    if ( -e \"$DOWNLO\
5144 AD_DIR/$distrib\")\n      {\n   `$CP $DOWNLOAD_DIR/$\
5145 distrib .`;\n      }\n    #UNTAR and Prepare every\
5146 thing\n    if (!-e \"$name.tar\" && !-e \"$name\")\
5147 \n      {\n     &check_rm ($wget_tmp);\n        print \"\\n--\
5148 ----- Downloading/Installing $pg\\n\";\n        \n      if (!-\
5149 e $distrib && &url2file (\"$download\", \"$wget_tm\
5150 p\")==$EXIT_SUCCESS)\n    {\n       \n      `mv $wget_\
5151 tmp $distrib`;\n            `$CP $distrib $DOWNLOAD_DIR/`\
5152 ;\n       }\n\n if (!-e $distrib)\n       {\n       print \"\
5153 !!!!!!! Download of $pg distribution failed\\n\";\\
5154 n           print \"!!!!!!! Check Address: $PG{$pg}{sour\
5155 ce}\\n\";\n         return 0;\n   }\n   print \"\\n-----\
5156 -- unzipping/untaring $name\\n\";\n     if (($ext =~/z\
5157 /))\n     { \n      &flush_command (\"gunzip $name$ex\
5158 t\");\n     \n    }\n   if (($ext =~/tar/) || ($ext =\
5159 ~/tgz/))\n        {\n       &flush_command(\"tar -xvf $na\
5160 me.tar\");\n      }\n      }\n    #Guess and enter th\
5161 e distribution directory\n    @fl=ls($p);\n    for\
5162 each my $f (@fl)\n      {\n     if (-d $f)\n      {\n      \
5163  $main_dir=$f;\n          }\n      }\n    if (-d $main_di\
5164 r)\n      \n      {\n   chdir $main_dir;}\n    else\n  \
5165     {\n print \"Error: $main_dir does not exist\";\
5166 \n      }\n    print \"\\n------- Compiling/Instal\
5167 ling $pg\\n\";\n    `make clean $SILENT`;\n    \n \
5168    \n    #\n    # SAP module\n    #\n    if ($pg e\
5169 q \"sap\")\n      {\n   if (-e \"./configure\")\n         \
5170 {\n         #new sap distribution\n         \n      &flush_\
5171 command (\"./configure\");\n        &flush_command (\\
5172 "make clean\");\n           &flush_command (\"make\");\n\
5173             &check_cp (\"./src/$pg\", \"$BIN\");\n          re\
5174 po_store(\"./src/$pg\");\n        }\n   else\n    {\n       \
5175 #old style distribution\n           `rm *.o sap  sap.exe\
5176  ./util/aa/*.o  ./util/wt/.o $SILENT`;\n            &flus\
5177 h_command (\"make $arguments sap\");\n      &check_\
5178 cp ($pg, \"$BIN\");\n       repo_store($pg);\n    }\n\
5179       }\n    \n    #\n    # CLUSTALW2 module\n    \
5180 #\n    elsif ($pg eq \"clustalw2\")\n      {\n  &fl\
5181 ush_command(\"./configure\");\n &flush_command(\"m\
5182 ake $arguments\");\n    &check_cp (\"./src/$pg\", \"$\
5183 BIN\");\n       repo_store(\"./src/$pg\");\n      }\n\n \
5184    #\n    # CLUSTAL-OMEGA module\n    #\n    elsif\
5185  ($pg eq \"clustalo\")\n      {\n       &flush_command(\\
5186 "./configure\");\n      &flush_command(\"make $argument\
5187 s\");\n &check_cp (\"./src/$pg\", \"$BIN\");\n  rep\
5188 o_store(\"./src/$pg\");\n      }\n\n    #\n    # S\
5189 TRIKE module\n    #\n    elsif ($pg eq \"strike\")\
5190 \n      {\n     &flush_command(\"make $arguments\");\n\
5191         &check_cp (\"./bin/$pg\", \"$BIN\");\n  repo_store\
5192 (\"./bin/$pg\");\n      }\n    \n    #\n    # FSA \
5193 module\n    # \n    elsif ($pg eq \"fsa\")\n      \
5194 {\n     &flush_command(\"./configure --prefix=$BIN\");\
5195 \n      &flush_command(\"make $arguments\");\n  &flush_c\
5196 ommand (\"make install\");\n\n  repo_store(\"fsa\",\
5197  \"$BIN/bin\");\n       `mv $BIN/bin/* $BIN`;\n `rmdir $\
5198 BIN/bin`;\n      }\n    \n    #\n    # CLUSTALW mo\
5199 dule\n    #\n    elsif ($pg eq \"clustalw\")\n    \
5200   {\n   &flush_command(\"make $arguments clustalw\")\
5201 ;\n     `$CP $pg $BIN $SILENT`;\n       repo_store($pg);\n  \
5202     }\n    \n    #\n    # MAFFT module\n    #\n   \
5203  elsif ($pg eq \"mafft\")\n      {\n    my $base=cwd(\
5204 );\n    my $c;\n        \n      #compile core\n mkpath (\"./mafft\
5205 /bin\");\n      mkpath (\"./mafft/lib\");\n     chdir \"$ba\
5206 se/core\";\n    `make clean $SILENT`;\n &flush_comman\
5207 d (\"make $arguments\");\n      &flush_command (\"make \
5208 install LIBDIR=../mafft/lib BINDIR=../mafft/bin\")\
5209 ;\n     \n      #compile extension\n    chdir \"$base/extensio\
5210 ns\";\n `make clean $SILENT`;\n &flush_command (\"\
5211 make $arguments\");\n   &flush_command (\"make insta\
5212 ll LIBDIR=../mafft/lib BINDIR=../mafft/bin\");\n        \\
5213 n       #put everything in mafft and copy the compiled s\
5214 tuff in bin\n   chdir \"$base\";\n      if ($ROOT_INSTALL\
5215 )\n       {\n       &root_run (\"You Must be Root to Ins\
5216 tall MAFFT\\n\", \"mkdir /usr/local/mafft/;$CP maf\
5217 ft/lib/* /usr/local/mafft;$CP mafft/lib/mafft* /us\
5218 r/local/bin ;$CP mafft/bin/mafft /usr/local/bin/; \
5219 \");\n    }\n   else\n    {\n       `$CP mafft/lib/*  $B\
5220 IN`;\n      `$CP mafft/bin/mafft  $BIN`;\n        }\n   `t\
5221 ar -cvf mafft.tar mafft`;\n     `gzip mafft.tar`;\n     `m\
5222 v mafft.tar.gz $BIN`;\n \n      repo_store(\"mafft/bin/\
5223 mafft\", \"mafft/lib/\", \"$BIN/mafft.tar.gz\");\n\
5224       }\n      \n    #\n    # DIALIGN-TX module\n \
5225    #\n    elsif ( $pg eq \"dialign-tx\" )\n      {\
5226 \n      my $f;\n        my $base=cwd();\n\n     chdir \"./source\"\
5227 ;\n     if ($OS eq \"macosx\"){&flush_command (\"cp ma\
5228 kefile.MAC_OS makefile\");}\n\n &flush_command (\"\
5229  make CPPFLAGS='-O3 -funroll-loops' all\");\n   \n      c\
5230 hdir \"..\";\n  &check_cp (\"./source/$pg\", \"$BIN\
5231 \");\n  repo_store(\"./source/$pg\");\n      }\n   \
5232    \n    #\n    # DIALIGN-T module \n    # (is the\
5233  same as dialign-tx, but it is mantained for backw\
5234 ard name compatibility with tcoffee)\n    #\n    e\
5235 lsif ( $pg eq \"dialign-t\" )\n      {\n        my $f;\n        \
5236 my $base=cwd();\n\n     chdir \"./source\";\n   if ($OS \
5237 eq \"macosx\"){&flush_command (\"cp makefile.MAC_O\
5238 S makefile\");}\n\n     &flush_command (\" make CPPFLA\
5239 GS='-O3 -funroll-loops' all\");\n       \n      chdir \"..\";\
5240 \n      &check_cp (\"./source/dialign-tx\", \"$BIN/dial\
5241 ign-t\");\n     repo_store(\"$BIN/dialign-t\"); \n    \
5242   }      \n      \n    #\n    # POA module\n    #\\
5243 n    elsif ($pg eq \"poa\")\n      {\n  &flush_comm\
5244 and (\"make $arguments poa\");\n        &check_cp (\"$pg\\
5245 ", \"$BIN\");\n repo_store(\"$pg\");\n      }\n   \
5246   \n     \n    #\n    # PROBCONS module\n    #\n  \
5247   elsif ( $pg eq \"probcons\")\n      {\n       &add_C_l\
5248 ibraries(\"./ProbabilisticModel.h\", \"list\", \"c\
5249 string\");\n    \n      `rm *.exe $SILENT`;\n   &flush_comma\
5250 nd (\"make $arguments probcons\");\n    &check_cp(\"$\
5251 pg\", \"$BIN/$pg\");\n  repo_store(\"$pg\");\n     \
5252  }\n      \n    #\n    # PROBCONS RNA module\n    \
5253 #\n    elsif ( $pg eq \"probconsRNA\")\n      {\n       \
5254 &add_C_libraries(\"./ProbabilisticModel.h\", \"lis\
5255 t\", \"cstring\");\n    &add_C_libraries(\"./Main.cc\\
5256 ", \"iomanip\", \"cstring\",\"climits\");\n     `rm *.\
5257 exe $SILENT`;\n &flush_command (\"make $arguments \
5258 probcons\");\n  &check_cp(\"probcons\", \"$BIN/$pg\\
5259 ");\n   repo_store(\"$BIN/$pg\");\n      }\n\n  #\n     #\
5260  MUSCLE module\n        #\n    elsif (  $pg eq \"muscle\"\
5261 )\n      {      \n      `rm *.o muscle muscle.exe $SILENT`;\\
5262 n       if ($OS eq \"macosx\" || $OS eq \"linux\")\n      {\
5263 \n          &replace_line_in_file (\"./Makefile\", \"LD\
5264 LIBS = -lm -static\",  \"LDLIBS = -lm\");\n       }\n   \
5265 elsif ($OS eq \"windows\")\n      {\n       &replace_li\
5266 ne_in_file (\"./intmath.cpp\",  \"double log2e\", \
5267      \"double cedric_log\");\n      &replace_line_i\
5268 n_file (\"./intmath.cpp\",  \"double log2\",      \
5269  \"double log_notuse\");\n          &replace_line_in_fi\
5270 le (\"./intmath.cpp\",  \"double cedric_log\", \"d\
5271 ouble log2e\");\n         }\n   &flush_command (\"make $ar\
5272 guments all\");\n       &check_cp(\"$pg\", \"$BIN\");\n \
5273 repo_store(\"$pg\");    \n      }\n      \n     #\n  \
5274    # MUS4 module\n     #\n     elsif (  $pg eq \"m\
5275 us4\")\n      {\n       `rm *.o muscle muscle.exe $SILEN\
5276 T`;\n   &flush_command (\"./mk\");\n    &check_cp(\"$pg\
5277 \", \"$BIN\");\n        repo_store(\"$pg\");    \n      }\n \
5278      \n    #\n    # PCMA module\n    #\n    elsif \
5279 ( $pg eq \"pcma\")\n      {\n   if ($OS eq \"macosx\\
5280 ")\n      {\n       &replace_line_in_file (\"./alcomp2.\
5281 c\", \"malloc.h\",  \"\");\n      }\n   &flush_command \
5282 (\"make $arguments pcma\");\n   &check_cp(\"$pg\", \\
5283 "$BIN\");\n     repo_store(\"$pg\");    \n      }\n      \
5284 \n    #\n    # KALIGN module\n    #\n    elsif ($p\
5285 g eq \"kalign\")\n      {\n     &flush_command (\"./co\
5286 nfigure\");\n   &flush_command(\"make $arguments\");\
5287 \n      &check_cp (\"$pg\",$BIN);\n     repo_store(\"$pg\")\
5288 ;       \n      }\n      \n    #\n    # AMAP module\n   \
5289  #\n    elsif ( $pg eq \"amap\")\n      {\n     &add_C\
5290 _libraries(\"./Amap.cc\", \"iomanip\", \"cstring\"\
5291 ,\"climits\");  \n      `make clean $SILENT`;\n &flush_c\
5292 ommand (\"make $arguments all\");\n     &check_cp (\"$\
5293 pg\", $BIN);\n  repo_store(\"$pg\");    \n      }\n   \
5294    \n    #\n    # PRODA module\n    #\n    elsif (\
5295  $pg eq \"proda\")\n      {\n   &add_C_libraries(\"A\
5296 lignedFragment.h\", \"vector\", \"iostream\", \"cs\
5297 tring\",\"cstdlib\");\n &add_C_libraries(\"Main.cc\
5298 \", \"vector\", \"climits\");   \n      &add_C_libraries(\
5299 \"Sequence.cc\", \"stdlib.h\", \"cstdio\");     \n      &fl\
5300 ush_command (\"make $arguments all\");\n        &check_cp\
5301  (\"$pg\", $BIN);\n     repo_store(\"$pg\");    \n      }\
5302 \n      \n    #\n    # PRANK module\n    #\n    el\
5303 sif ( $pg eq \"prank\")\n      {\n      &flush_command \
5304 (\"make $arguments all\");\n    &check_cp (\"$pg\", $\
5305 BIN);\n repo_store(\"$pg\");    \n      }\n      \n  \
5306   #\n    # !!!! MUSTANG module\n    #\n     elsif \
5307 ( $pg eq \"mustang\")\n      {\n        &flush_command (\\
5308 "rm ./bin/*\");\n       &flush_command (\"make $argument\
5309 s all\");\n\n   if ( $OS=~/windows/){&flush_command(\
5310 \"cp ./bin/* $BIN/mustang.exe\");}\n    else {&flush_\
5311 command(\"cp ./bin/* $BIN/mustang\");}\n        \n      repo_s\
5312 tore(\"$BIN/mustang\");\n      }\n\n    #\n     # RNAplfo\
5313 ld module\n     #\n    elsif ( $pg eq \"RNAplfold\")\n\
5314       {\n       &flush_command(\"./configure\");\n      &flus\
5315 h_command (\"make $arguments all\");\n  &check_cp(\\
5316 "./Progs/RNAplfold\", \"$BIN\");\n      &check_cp(\"./P\
5317 rogs/RNAalifold\", \"$BIN\");\n &check_cp(\"./Prog\
5318 s/RNAfold\", \"$BIN\");\n       \n      repo_store(\"./Progs/\
5319 RNAplfold\", \"./Progs/RNAalifold\", \"./Progs/RNA\
5320 fold\");\n      }\n      \n    #\n    # !!! RETREE\
5321  module\n    #\n    elsif ( $pg eq \"retree\")\n  \
5322     {\n chdir \"src\";\n        &flush_command (\"make $a\
5323 rguments all\");\n      &flush_command (\"make put\");\\
5324 n       system \"cp ../exe/* $BIN\";\n  \n      repo_store(\"r\
5325 etree\", \"../exe\");\n      }\n        \n    chdir $CDIR\
5326 ;\n    return &pg_is_installed ($pg, $BIN);\n  }\n\
5327 \nsub install_t_coffee\n  {\n    my ($pg)=(@_);\n \
5328    my ($report,$cflags, $arguments, $language, $co\
5329 mpiler) ;\n    #1-Install T-Coffee\n    chdir \"t_\
5330 coffee_source\";\n    &flush_command (\"make clean\
5331 \");\n    print \"\\n------- Compiling T-Coffee\\n\
5332 \";\n    $language=$PG{$pg} {language2};\n    $arg\
5333 uments=$PG{$language}{arguments};\n\n    if ( $CC \
5334 ne \"\"){\n      print \"make -i $arguments t_coff\
5335 ee \\n\";\n      &flush_command (\"make -i $argume\
5336 nts t_coffee\");\n    }\n    &check_cp ($pg, $BIN)\
5337 ;\n    \n    chdir $CDIR;\n    return &pg_is_insta\
5338 lled ($pg, $BIN);\n  }\nsub install_TMalign\n  {\n\
5339     my ($pg)=(@_);\n    my $report;\n    chdir \"t\
5340 _coffee_source\";\n    print \"\\n------- Compilin\
5341 g TMalign\\n\";\n    `rm TMalign TMalign.exe $SILE\
5342 NT`;\n    if ( $FC ne \"\"){&flush_command (\"make\
5343  -i $PG{Fortran}{arguments} TMalign\");}\n    &che\
5344 ck_cp ($pg, $BIN);\n    repo_store($pg);\n\n    if\
5345  ( !-e \"$BIN/$pg\" && pg_has_binary_distrib ($pg)\
5346 )\n      {\n    print \"!!!!!!! Compilation of $pg im\
5347 possible. Will try to install from binary\\n\";\n       \
5348 return &install_binary_package ($pg);\n      }\n  \
5349   chdir $CDIR;\n    return &pg_is_installed ($pg, \
5350 $BIN);\n  }\n\nsub pg_has_binary_distrib\n  {\n   \
5351  my ($pg)=(@_);\n    if ($PG{$pg}{windows}){return\
5352  1;}\n    elsif ($PG{$pg}{osx}){return 1;}\n    el\
5353 sif ($PG{$pg}{linux}){return 1;}\n    return 0;\n \
5354  }\nsub install_binary_package\n  {\n    my ($pg)=\
5355 (@_);\n    my ($base,$report,$name, $download, $ar\
5356 guments, $language, $dir);\n    my $isdir;\n    &i\
5357 nput_os();\n    \n    #\n    # - paolodt - Check i\
5358 f the module exists in the repository cache \n    \
5359 #\n     if( repo_load($pg) ) {\n            $PG{$pg}{from_bin\
5360 ary}=1;\n               return 1;\n     }\n    # - paolodt - end \n\
5361     \n    if (!&supported_os($OS)){return 0;}\n   \
5362  if ( $PG{$pg}{binary}){$name=$PG{$pg}{binary};}\n\
5363     else \n      {\n    $name=$pg;\n    if ( $OS eq \"wi\
5364 ndows\"){$name.=\".exe\";}\n      }\n    \n    $do\
5365 wnload=\"$WEB_BASE/Packages/Binaries/$OS/$name\";\\
5366 n    \n    $base=cwd();\n    chdir $TMP;\n    \n  \
5367   if (!-e $name)\n      {\n     `rm x $SILENT`;\n       if (\
5368  url2file(\"$download\",\"x\")==$EXIT_SUCCESS)\n         \
5369  {\n        `mv x $name`;\n       }\n      }\n    \n    i\
5370 f (!-e $name)\n      {\n        print \"!!!!!!! $PG{$pg}{\
5371 dname}: Download of $pg binary failed\\n\";\n   prin\
5372 t \"!!!!!!! $PG{$pg}{dname}: Check Address: $downl\
5373 oad\\n\";\n     return 0;\n      }\n    print \"\\n---\
5374 ---- Installing $pg\\n\";\n    \n    if ($name =~/\
5375 tar\\.gz/)\n      {\n   `gunzip  $name`;\n      `tar -xvf\
5376  $pg.tar`;\n    chdir $pg;\n    if ( $pg eq \"mafft\")\n\
5377           {\n       if ($ROOT_INSTALL)\n              {\n               &root_r\
5378 un (\"You Must be Roor to Install MAFFT\\n\", \"$C\
5379 P mafft/bin/* /usr/local/mafft;mkdir /usr/local/ma\
5380 fft/; $CP mafft/lib/* /usr/local/bin/\");\n           \
5381 }\n         else\n            {\n               `$CP $TMP/$pg/bin/* $BIN\
5382  $SILENT`;\n            `$CP $TMP/$pg/lib/* $BIN $SILENT`;\n\
5383               }\n         }\n   else\n    {\n       if (-e \"$TMP/$p\
5384 g/data\"){`$CP $TMP/$pg/data/* $TCM $SILENT`;}\n         \
5385    if (!($pg=~/\\*/)){`rm -rf $pg`;}\n    }\n      \
5386 }\n    else\n      {\n  &check_cp (\"$pg\", \"$BIN\\
5387 ");\n   `chmod u+x $BIN/$pg`; \n        unlink ($pg);\n    \
5388   }\n    chdir $base;\n    $PG{$pg}{from_binary}=1\
5389 ;\n    return &pg_is_installed ($pg, $BIN);\n  }\n\
5390 \nsub add_dir \n  {\n    my $dir=@_[0];\n    \n   \
5391  if (!-e $dir && !-d $dir)\n      {\n   my @l;\n        uma\
5392 sk (0000);\n    @l=mkpath ($dir,{mode => 0777});\n      \n\
5393       }\n    else\n      {\n    return 0;\n      }\n \
5394  }\nsub check_rm \n  {\n    my ($file)=(@_);\n    \
5395 \n    if ( -e $file)\n      {\n return unlink($fil\
5396 e);\n      }\n    return 0;\n  }\nsub check_cp\n  \
5397 {\n    my ($from, $to)=(@_);\n    if ( !-e $from &\
5398 & -e \"$from\\.exe\"){$from=\"$from\\.exe\";}\n   \
5399  if ( !-e $from){return 0;}\n        \n    `$CP $f\
5400 rom $to`;\n    return 1;\n  }\n\nsub repo_store \n\
5401 {\n   # check that all required data are available\
5402 \n   if( $REPO_ROOT eq \"\" ) { return; }\n\n\n   \
5403  # extract the package name from the specified pat\
5404 h\n    my $pg =`basename $_[0]`;\n    chomp($pg);\\
5405 n       \n    my $VER = $PG{$pg}{version};\n    my $CACH\
5406 E = \"$REPO_ROOT/$pg/$VER/$OSNAME-$OSARCH\"; \n   \
5407  \n    print \"-------- Storing package: \\\"$pg\\\
5408 \" to path: $CACHE\\n\";\n    \n    # clean the ca\
5409 che path if exists and create it again\n    `rm -r\
5410 f $CACHE`;\n    `mkdir -p $CACHE`;\n    \n      for my\
5411  $path (@_) {\n\n           # check if it is a single fi\
5412 le \n           if( -f $path ) {\n              `cp $path $CACHE`;\
5413 \n              }\n             # .. or a directory, in this case copy al\
5414 l the content \n                elsif( -d $path ) {\n                   opendir(\
5415 IMD, $path);\n                  my @thefiles= readdir(IMD);\n                   c\
5416 losedir(IMD);\n                 \n                      for my $_file (@thefiles) {\
5417 \n                              if( $_file ne \".\" && $_file ne \"..\") {\n\
5418                                 `cp $path/$_file $CACHE`;\n                             }\n                     }\n             \
5419 } \n    }          \n    \n     \n}   \n\nsub repo_load \n{\n  \
5420   my ($pg)=(@_);\n\n    # check that all required \
5421 data are available\n    if( $REPO_ROOT eq \"\" ) {\
5422  return 0; }\n\n    my $VER = $PG{$pg}{version};\n\
5423     my $CACHE = \"$REPO_ROOT/$pg/$VER/$OSNAME-$OSA\
5424 RCH\"; \n    if( !-e \"$CACHE/$pg\" ) {\n               pri\
5425 nt \"-------- Module \\\"$pg\\\" NOT found on repo\
5426 sitory cache.\\n\";\n           return 0;\n    }\n    \n\
5427     print \"-------- Module \\\"$pg\\\" found on r\
5428 epository cache. Using copy on path: $CACHE\\n\";\\
5429 n    `cp $CACHE/* $BIN`;\n    return 1;\n}\n\nsub \
5430 check_file_list_exists \n  {\n    my ($base, @flis\
5431 t)=(@_);\n    my $f;\n\n    foreach $f (@flist)\n \
5432      {\n        if ( !-e \"$base/$f\"){return 0;}\n      \
5433 }\n    return 1;\n  }\nsub ls\n  {\n    my $f=@_[0\
5434 ];\n    my @fl;\n    chomp(@fl=`ls -1 $f`);\n    r\
5435 eturn @fl;\n  }\nsub flush_command\n  {\n    my $c\
5436 ommand=@_[0];\n    my $F=new FileHandle;\n    open\
5437  ($F, \"$command|\");\n    while (<$F>){print \"  \
5438   --- $_\";}\n    close ($F);\n  }    \n\nsub inpu\
5439 t_installation_directory\n  {\n    my $dir=@_[0];\\
5440 n    my $new;\n    \n    print \"------- The curre\
5441 nt installation directory is: [$dir]\\n\";\n    pr\
5442 int \"??????? Return to keep the default or new va\
5443 lue:\";\n   \n    if ($NO_QUESTION==0)\n      {\n       \
5444 chomp ($new=<stdin>);\n while ( $new ne \"\" && !i\
5445 nput_yes (\"You have entered $new. Is this correct\
5446 ? ([y]/n):\"))\n          {\n       print \"???????New inst\
5447 allation directory:\";\n            chomp ($new=<stdin>);\
5448 \n        }\n   $dir=($new eq \"\")?$dir:$new;\n        $dir=~s/\
5449 \\/$//;\n      }\n    \n    if ( -d $dir){return $\
5450 dir;}\n    elsif (&root_run (\"You must be root to\
5451  create $dir\",\"mkdir $dir\")==$EXIT_SUCCESS){ret\
5452 urn $dir;}\n    else\n      {\n print \"!!!!!!! $d\
5453 ir could not be created\\n\";\n if ( $NO_QUESTION)\
5454 \n        {\n       return \"\";\n        }\n   elsif ( &input_y\
5455 es (\"??????? Do you want to provide a new directo\
5456 ry([y]/n)?:\"))\n         {\n       return input_installat\
5457 ion_directory ($dir);\n   }\n   else\n    {\n       ret\
5458 urn \"\";\n       }\n      }\n    \n  }\nsub input_yes\
5459 \n  {\n    my $question =@_[0];\n    my $answer;\n\
5460 \n    if ($NO_QUESTION==1){return 1;}\n    \n    i\
5461 f ($question eq \"\"){$question=\"??????? Do you w\
5462 ish to proceed ([y]/n)?:\";}\n    print $question;\
5463 \n    chomp($answer=lc(<STDIN>));\n    if (($answe\
5464 r=~/^y/) || $answer eq \"\"){return 1;}\n    elsif\
5465  ( ($answer=~/^n/)){return 0;}\n    else\n      {\\
5466 n       return input_yes($question);\n      }\n  }\nsub \
5467 root_run\n  {\n    my ($txt, $cmd)=(@_);\n    \n  \
5468   if ( system ($cmd)==$EXIT_SUCCESS){return $EXIT_\
5469 SUCCESS;}\n    else \n      {\n print \"------- $t\
5470 xt\\n\";\n      if ( $ROOT eq \"sudo\"){return system (\
5471 \"sudo $cmd\");}\n      else {return system (\"su root \
5472 -c \\\"$cmd\\\"\");}\n      }\n  }\nsub get_root\n\
5473   {\n    if (&pg_is_installed (\"sudo\")){return \\
5474 "sudo\";}\n    else {return \"su\";}\n  }\n\nsub g\
5475 et_os\n  {\n    my $raw_os=`uname`;\n    my $os;\n\
5476 \n    $raw_os=lc ($raw_os);\n    \n    if ($raw_os\
5477  =~/cygwin/){$os=\"windows\";}\n    elsif ($raw_os\
5478  =~/linux/){$os=\"linux\";}\n    elsif ($raw_os =~\
5479 /osx/){$os=\"macosx\";}\n    elsif ($raw_os =~/dar\
5480 win/){$os=\"macosx\";}\n    else\n      {\n     $os=$r\
5481 aw_os;\n      }\n    return $os;\n  }\nsub input_o\
5482 s\n  {\n    my $answer;\n    if ($OS) {return $OS;\
5483 }\n    \n    print \"??????? which os do you use: \
5484 [w]indows, [l]inux, [m]acosx:?\";\n    $answer=lc(\
5485 <STDIN>);\n\n    if (($answer=~/^m/)){$OS=\"macosx\
5486 \";}\n    elsif ( ($answer=~/^w/)){$OS=\"windows\"\
5487 ;}\n    elsif ( ($answer=~/^linux/)){$OS=\"linux\"\
5488 ;}\n    \n    else\n      {\n   return &input_os();\\
5489 n      }\n    return $OS;\n  }\n\nsub supported_os\
5490 \n  {\n    my ($os)=(@_[0]);\n    return $SUPPORTE\
5491 D_OS{$os};\n  }\n    \n    \n\n\nsub update_tclink\
5492 db \n  {\n    my $file =@_[0];\n    my $name;\n   \
5493  my $F=new FileHandle;\n    my ($download, $addres\
5494 s, $name, $l, $db);\n    \n    if ( $file eq \"upd\
5495 ate\"){$file=$TCLINKDB_ADDRESS;}\n    \n    if ( $\
5496 file =~/http:\\/\\// || $file =~/ftp:\\/\\//)\n   \
5497    {\n  ($address, $name)=($download=~/(.*)\\/([^\\\
5498 /]+)$/);\n      `rm x $SILENT`;\n       if (&url2file ($file,\
5499 \"x\")==$EXIT_SUCCESS)\n          {\n       print \"-------\
5500  Susscessful upload of $name\";\n           `mv x $name`\
5501 ;\n         $file=$name;\n        }\n      }\n    open ($F,\
5502  \"$file\");\n    while (<$F>)\n      {\n       my $l=$_\
5503 ;\n     if (($l =~/^\\/\\//) || ($db=~/^#/)){;}\n       elsi\
5504 f ( !($l =~/\\w/)){;}\n else\n    {\n       my @v=spl\
5505 it (/\\s+/, $l);\n          if ( $l=~/^MODE/)\n       {\
5506 \n              $MODE{$v[1]}{$v[2]}=$v[3];\n          }\n           els\
5507 if ($l=~/^PG/)\n              {\n               $PG{$v[1]}{$v[2]}=$v[3\
5508 ];\n          }\n         }\n      }\n    close ($F);\n    \
5509 &post_process_PG();\n    return;\n  }\n\n\n\nsub i\
5510 nitialize_PG\n  {\n\n$PG{\"t_coffee\"}{\"4_TCOFFEE\
5511 \"}=\"TCOFFEE\";\n$PG{\"t_coffee\"}{\"type\"}=\"se\
5512 quence_multiple_aligner\";\n$PG{\"t_coffee\"}{\"AD\
5513 DRESS\"}=\"http://www.tcoffee.org\";\n$PG{\"t_coff\
5514 ee\"}{\"language\"}=\"C++\";\n$PG{\"t_coffee\"}{\"\
5515 language2\"}=\"CXX\";\n$PG{\"t_coffee\"}{\"source\\
5516 "}=\"http://www.tcoffee.org/Packages/T-COFFEE_dist\
5517 ribution.tar.gz\";\n$PG{\"t_coffee\"}{\"update_act\
5518 ion\"}=\"always\";\n$PG{\"t_coffee\"}{\"mode\"}=\"\
5519 tcoffee,mcoffee,rcoffee,expresso,3dcoffee\";\n$PG{\
5520 \"clustalo\"}{\"4_TCOFFEE\"}=\"CLUSTALO\";\n$PG{\"\
5521 clustalo\"}{\"type\"}=\"sequence_multiple_aligner\\
5522 ";\n$PG{\"clustalo\"}{\"ADDRESS\"}=\"http://www.cl\
5523 ustal.org/omega/\";\n$PG{\"clustalo\"}{\"language\\
5524 "}=\"C++\";\n$PG{\"clustalo\"}{\"language2\"}=\"C+\
5525 +\";\n$PG{\"clustalo\"}{\"source\"}=\"http://www.c\
5526 lustal.org/omega/clustal-omega-1.1.0.tar.gz\";\n$P\
5527 G{\"clustalo\"}{\"mode\"}=\"mcoffee\";\n$PG{\"clus\
5528 talo\"}{\"version\"}=\"1.1.0\";\n$PG{\"strike\"}{\\
5529 "4_TCOFFEE\"}=\"STRIKE\";\n$PG{\"strike\"}{\"type\\
5530 "}=\"sequence_alignment_scoring\";\n$PG{\"strike\"\
5531 }{\"ADDRESS\"}=\"http://www.tcoffee.org/Projects/s\
5532 trike/index.html\";\n$PG{\"strike\"}{\"language\"}\
5533 =\"C++\";\n$PG{\"strike\"}{\"language2\"}=\"CXX\";\
5534 \n$PG{\"strike\"}{\"source\"}=\"http://www.tcoffee\
5535 .org/Projects/strike/strike_v1.2.tar.bz2\";\n$PG{\\
5536 "strike\"}{\"mode\"}=\"tcoffee,expresso\";\n$PG{\"\
5537 strike\"}{\"version\"}=\"1.2\";\n$PG{\"clustalw2\"\
5538 }{\"4_TCOFFEE\"}=\"CLUSTALW2\";\n$PG{\"clustalw2\"\
5539 }{\"type\"}=\"sequence_multiple_aligner\";\n$PG{\"\
5540 clustalw2\"}{\"ADDRESS\"}=\"http://www.clustal.org\
5541 \";\n$PG{\"clustalw2\"}{\"language\"}=\"C++\";\n$P\
5542 G{\"clustalw2\"}{\"language2\"}=\"CXX\";\n$PG{\"cl\
5543 ustalw2\"}{\"source\"}=\"http://www.clustal.org/do\
5544 wnload/2.0.10/clustalw-2.0.10-src.tar.gz\";\n$PG{\\
5545 "clustalw2\"}{\"mode\"}=\"mcoffee,rcoffee\";\n$PG{\
5546 \"clustalw2\"}{\"version\"}=\"2.0.10\";\n$PG{\"clu\
5547 stalw\"}{\"4_TCOFFEE\"}=\"CLUSTALW\";\n$PG{\"clust\
5548 alw\"}{\"type\"}=\"sequence_multiple_aligner\";\n$\
5549 PG{\"clustalw\"}{\"ADDRESS\"}=\"http://www.clustal\
5550 .org\";\n$PG{\"clustalw\"}{\"language\"}=\"C\";\n$\
5551 PG{\"clustalw\"}{\"language2\"}=\"C\";\n$PG{\"clus\
5552 talw\"}{\"source\"}=\"http://www.clustal.org/downl\
5553 oad/1.X/ftp-igbmc.u-strasbg.fr/pub/ClustalW/clusta\
5554 lw1.82.UNIX.tar.gz\";\n$PG{\"clustalw\"}{\"mode\"}\
5555 =\"mcoffee,rcoffee\";\n$PG{\"clustalw\"}{\"version\
5556 \"}=\"1.82\";\n$PG{\"dialign-t\"}{\"4_TCOFFEE\"}=\\
5557 "DIALIGNT\";\n$PG{\"dialign-t\"}{\"type\"}=\"seque\
5558 nce_multiple_aligner\";\n$PG{\"dialign-t\"}{\"ADDR\
5559 ESS\"}=\"http://dialign-tx.gobics.de/\";\n$PG{\"di\
5560 align-t\"}{\"DIR\"}=\"/usr/share/dialign-tx/\";\n$\
5561 PG{\"dialign-t\"}{\"language\"}=\"C\";\n$PG{\"dial\
5562 ign-t\"}{\"language2\"}=\"C\";\n$PG{\"dialign-t\"}\
5563 {\"source\"}=\"http://dialign-tx.gobics.de/DIALIGN\
5564 -TX_1.0.2.tar.gz\";\n$PG{\"dialign-t\"}{\"mode\"}=\
5565 \"mcoffee\";\n$PG{\"dialign-t\"}{\"binary\"}=\"dia\
5566 lign-t\";\n$PG{\"dialign-t\"}{\"version\"}=\"1.0.2\
5567 \";\n$PG{\"dialign-tx\"}{\"4_TCOFFEE\"}=\"DIALIGNT\
5568 X\";\n$PG{\"dialign-tx\"}{\"type\"}=\"sequence_mul\
5569 tiple_aligner\";\n$PG{\"dialign-tx\"}{\"ADDRESS\"}\
5570 =\"http://dialign-tx.gobics.de/\";\n$PG{\"dialign-\
5571 tx\"}{\"DIR\"}=\"/usr/share/dialign-tx/\";\n$PG{\"\
5572 dialign-tx\"}{\"language\"}=\"C\";\n$PG{\"dialign-\
5573 tx\"}{\"language2\"}=\"C\";\n$PG{\"dialign-tx\"}{\\
5574 "source\"}=\"http://dialign-tx.gobics.de/DIALIGN-T\
5575 X_1.0.2.tar.gz\";\n$PG{\"dialign-tx\"}{\"mode\"}=\\
5576 "mcoffee\";\n$PG{\"dialign-tx\"}{\"binary\"}=\"dia\
5577 lign-tx\";\n$PG{\"dialign-tx\"}{\"version\"}=\"1.0\
5578 .2\";\n$PG{\"poa\"}{\"4_TCOFFEE\"}=\"POA\";\n$PG{\\
5579 "poa\"}{\"type\"}=\"sequence_multiple_aligner\";\n\
5580 $PG{\"poa\"}{\"ADDRESS\"}=\"http://www.bioinformat\
5581 ics.ucla.edu/poa/\";\n$PG{\"poa\"}{\"language\"}=\\
5582 "C\";\n$PG{\"poa\"}{\"language2\"}=\"C\";\n$PG{\"p\
5583 oa\"}{\"source\"}=\"http://downloads.sourceforge.n\
5584 et/poamsa/poaV2.tar.gz\";\n$PG{\"poa\"}{\"DIR\"}=\\
5585 "/usr/share/\";\n$PG{\"poa\"}{\"FILE1\"}=\"blosum8\
5586 0.mat\";\n$PG{\"poa\"}{\"mode\"}=\"mcoffee\";\n$PG\
5587 {\"poa\"}{\"binary\"}=\"poa\";\n$PG{\"poa\"}{\"ver\
5588 sion\"}=\"2.0\";\n$PG{\"probcons\"}{\"4_TCOFFEE\"}\
5589 =\"PROBCONS\";\n$PG{\"probcons\"}{\"type\"}=\"sequ\
5590 ence_multiple_aligner\";\n$PG{\"probcons\"}{\"ADDR\
5591 ESS\"}=\"http://probcons.stanford.edu/\";\n$PG{\"p\
5592 robcons\"}{\"language2\"}=\"CXX\";\n$PG{\"probcons\
5593 \"}{\"language\"}=\"C++\";\n$PG{\"probcons\"}{\"so\
5594 urce\"}=\"http://probcons.stanford.edu/probcons_v1\
5595 _12.tar.gz\";\n$PG{\"probcons\"}{\"mode\"}=\"mcoff\
5596 ee\";\n$PG{\"probcons\"}{\"binary\"}=\"probcons\";\
5597 \n$PG{\"probcons\"}{\"version\"}=\"1.12\";\n$PG{\"\
5598 mafft\"}{\"4_TCOFFEE\"}=\"MAFFT\";\n$PG{\"mafft\"}\
5599 {\"type\"}=\"sequence_multiple_aligner\";\n$PG{\"m\
5600 afft\"}{\"ADDRESS\"}=\"http://align.bmr.kyushu-u.a\
5601 c.jp/mafft/online/server/\";\n$PG{\"mafft\"}{\"lan\
5602 guage\"}=\"C\";\n$PG{\"mafft\"}{\"language\"}=\"C\\
5603 ";\n$PG{\"mafft\"}{\"source\"}=\"http://align.bmr.\
5604 kyushu-u.ac.jp/mafft/software/mafft-6.603-with-ext\
5605 ensions-src.tgz\";\n$PG{\"mafft\"}{\"windows\"}=\"\
5606 http://align.bmr.kyushu-u.ac.jp/mafft/software/maf\
5607 ft-6.603-mingw.tar\";\n$PG{\"mafft\"}{\"mode\"}=\"\
5608 mcoffee,rcoffee\";\n$PG{\"mafft\"}{\"binary\"}=\"m\
5609 afft.tar.gz\";\n$PG{\"mafft\"}{\"version\"}=\"6.60\
5610 3\";\n$PG{\"muscle\"}{\"4_TCOFFEE\"}=\"MUSCLE\";\n\
5611 $PG{\"muscle\"}{\"type\"}=\"sequence_multiple_alig\
5612 ner\";\n$PG{\"muscle\"}{\"ADDRESS\"}=\"http://www.\
5613 drive5.com/muscle/\";\n$PG{\"muscle\"}{\"language\\
5614 "}=\"C++\";\n$PG{\"muscle\"}{\"language2\"}=\"GPP\\
5615 ";\n$PG{\"muscle\"}{\"source\"}=\"http://www.drive\
5616 5.com/muscle/downloads3.7/muscle3.7_src.tar.gz\";\\
5617 n$PG{\"muscle\"}{\"windows\"}=\"http://www.drive5.\
5618 com/muscle/downloads3.7/muscle3.7_win32.zip\";\n$P\
5619 G{\"muscle\"}{\"linux\"}=\"http://www.drive5.com/m\
5620 uscle/downloads3.7/muscle3.7_linux_ia32.tar.gz\";\\
5621 n$PG{\"muscle\"}{\"mode\"}=\"mcoffee,rcoffee\";\n$\
5622 PG{\"muscle\"}{\"version\"}=\"3.7\";\n$PG{\"mus4\"\
5623 }{\"4_TCOFFEE\"}=\"MUS4\";\n$PG{\"mus4\"}{\"type\"\
5624 }=\"sequence_multiple_aligner\";\n$PG{\"mus4\"}{\"\
5625 ADDRESS\"}=\"http://www.drive5.com/muscle/\";\n$PG\
5626 {\"mus4\"}{\"language\"}=\"C++\";\n$PG{\"mus4\"}{\\
5627 "language2\"}=\"GPP\";\n$PG{\"mus4\"}{\"source\"}=\
5628 \"http://www.drive5.com/muscle/muscle4.0_src.tar.g\
5629 z\";\n$PG{\"mus4\"}{\"mode\"}=\"mcoffee,rcoffee\";\
5630 \n$PG{\"mus4\"}{\"version\"}=\"4.0\";\n$PG{\"pcma\\
5631 "}{\"4_TCOFFEE\"}=\"PCMA\";\n$PG{\"pcma\"}{\"type\\
5632 "}=\"sequence_multiple_aligner\";\n$PG{\"pcma\"}{\\
5633 "ADDRESS\"}=\"ftp://iole.swmed.edu/pub/PCMA/\";\n$\
5634 PG{\"pcma\"}{\"language\"}=\"C\";\n$PG{\"pcma\"}{\\
5635 "language2\"}=\"C\";\n$PG{\"pcma\"}{\"source\"}=\"\
5636 ftp://iole.swmed.edu/pub/PCMA/pcma.tar.gz\";\n$PG{\
5637 \"pcma\"}{\"mode\"}=\"mcoffee\";\n$PG{\"pcma\"}{\"\
5638 version\"}=\"1.0\";\n$PG{\"kalign\"}{\"4_TCOFFEE\"\
5639 }=\"KALIGN\";\n$PG{\"kalign\"}{\"type\"}=\"sequenc\
5640 e_multiple_aligner\";\n$PG{\"kalign\"}{\"ADDRESS\"\
5641 }=\"http://msa.cgb.ki.se\";\n$PG{\"kalign\"}{\"lan\
5642 guage\"}=\"C\";\n$PG{\"kalign\"}{\"language2\"}=\"\
5643 C\";\n$PG{\"kalign\"}{\"source\"}=\"http://msa.cgb\
5644 .ki.se/downloads/kalign/current.tar.gz\";\n$PG{\"k\
5645 align\"}{\"mode\"}=\"mcoffee\";\n$PG{\"kalign\"}{\\
5646 "version\"}=\"1.0\";\n$PG{\"amap\"}{\"4_TCOFFEE\"}\
5647 =\"AMAP\";\n$PG{\"amap\"}{\"type\"}=\"sequence_mul\
5648 tiple_aligner\";\n$PG{\"amap\"}{\"ADDRESS\"}=\"htt\
5649 p://bio.math.berkeley.edu/amap/\";\n$PG{\"amap\"}{\
5650 \"language\"}=\"C++\";\n$PG{\"amap\"}{\"language2\\
5651 "}=\"CXX\";\n$PG{\"amap\"}{\"source\"}=\"http://am\
5652 ap-align.googlecode.com/files/amap.2.0.tar.gz\";\n\
5653 $PG{\"amap\"}{\"mode\"}=\"mcoffee\";\n$PG{\"amap\"\
5654 }{\"version\"}=\"2.0\";\n$PG{\"proda\"}{\"4_TCOFFE\
5655 E\"}=\"PRODA\";\n$PG{\"proda\"}{\"type\"}=\"sequen\
5656 ce_multiple_aligner\";\n$PG{\"proda\"}{\"ADDRESS\"\
5657 }=\"http://proda.stanford.edu\";\n$PG{\"proda\"}{\\
5658 "language\"}=\"C++\";\n$PG{\"proda\"}{\"language2\\
5659 "}=\"CXX\";\n$PG{\"proda\"}{\"source\"}=\"http://p\
5660 roda.stanford.edu/proda_1_0.tar.gz\";\n$PG{\"proda\
5661 \"}{\"mode\"}=\"mcoffee\";\n$PG{\"proda\"}{\"versi\
5662 on\"}=\"1.0\";\n$PG{\"fsa\"}{\"4_TCOFFEE\"}=\"FSA\\
5663 ";\n$PG{\"fsa\"}{\"type\"}=\"sequence_multiple_ali\
5664 gner\";\n$PG{\"fsa\"}{\"ADDRESS\"}=\"http://fsa.so\
5665 urceforge.net/\";\n$PG{\"fsa\"}{\"language\"}=\"C+\
5666 +\";\n$PG{\"fsa\"}{\"language2\"}=\"CXX\";\n$PG{\"\
5667 fsa\"}{\"source\"}=\"http://sourceforge.net/projec\
5668 ts/fsa/files/fsa-1.15.3.tar.gz/download/\";\n$PG{\\
5669 "fsa\"}{\"mode\"}=\"mcoffee\";\n$PG{\"fsa\"}{\"ver\
5670 sion\"}=\"1.15.3\";\n$PG{\"prank\"}{\"4_TCOFFEE\"}\
5671 =\"PRANK\";\n$PG{\"prank\"}{\"type\"}=\"sequence_m\
5672 ultiple_aligner\";\n$PG{\"prank\"}{\"ADDRESS\"}=\"\
5673 http://www.ebi.ac.uk/goldman-srv/prank/\";\n$PG{\"\
5674 prank\"}{\"language\"}=\"C++\";\n$PG{\"prank\"}{\"\
5675 language2\"}=\"CXX\";\n$PG{\"prank\"}{\"source\"}=\
5676 \"http://www.ebi.ac.uk/goldman-srv/prank/src/prank\
5677 /prank.src.100802.tgz\";\n$PG{\"prank\"}{\"mode\"}\
5678 =\"mcoffee\";\n$PG{\"prank\"}{\"version\"}=\"10030\
5679 3\";\n$PG{\"sap\"}{\"4_TCOFFEE\"}=\"SAP\";\n$PG{\"\
5680 sap\"}{\"type\"}=\"structure_pairwise_aligner\";\n\
5681 $PG{\"sap\"}{\"ADDRESS\"}=\"http://mathbio.nimr.mr\
5682 c.ac.uk/wiki/Software\";\n$PG{\"sap\"}{\"language\\
5683 "}=\"C\";\n$PG{\"sap\"}{\"language2\"}=\"C\";\n$PG\
5684 {\"sap\"}{\"source\"}=\"http://mathbio.nimr.mrc.ac\
5685 .uk/download/SAP/sap-1.1.3.tar.gz\";\n$PG{\"sap\"}\
5686 {\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"sap\"}{\"\
5687 version\"}=\"1.1.3\";\n$PG{\"TMalign\"}{\"4_TCOFFE\
5688 E\"}=\"TMALIGN\";\n$PG{\"TMalign\"}{\"type\"}=\"st\
5689 ructure_pairwise_aligner\";\n$PG{\"TMalign\"}{\"AD\
5690 DRESS\"}=\"http://zhanglab.ccmb.med.umich.edu/TM-a\
5691 lign/TMalign.f\";\n$PG{\"TMalign\"}{\"language\"}=\
5692 \"Fortran\";\n$PG{\"TMalign\"}{\"language2\"}=\"Fo\
5693 rtran\";\n$PG{\"TMalign\"}{\"source\"}=\"http://zh\
5694 anglab.ccmb.med.umich.edu/TM-align/TMalign.f\";\n$\
5695 PG{\"TMalign\"}{\"linux\"}=\"http://zhanglab.ccmb.\
5696 med.umich.edu/TM-align/TMalign_32.gz\";\n$PG{\"TMa\
5697 lign\"}{\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"TM\
5698 align\"}{\"version\"}=\"2013.05.11\";\n$PG{\"musta\
5699 ng\"}{\"4_TCOFFEE\"}=\"MUSTANG\";\n$PG{\"mustang\"\
5700 }{\"type\"}=\"structure_pairwise_aligner\";\n$PG{\\
5701 "mustang\"}{\"ADDRESS\"}=\"http://www.cs.mu.oz.au/\
5702 ~arun/mustang\";\n$PG{\"mustang\"}{\"language\"}=\\
5703 "C++\";\n$PG{\"mustang\"}{\"language2\"}=\"CXX\";\\
5704 n$PG{\"mustang\"}{\"source\"}=\"http://ww2.cs.mu.o\
5705 z.au/~arun/mustang/mustang_v3.2.1.tgz\";\n$PG{\"mu\
5706 stang\"}{\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"m\
5707 ustang\"}{\"version\"}=\"3.2.1\";\n$PG{\"lsqman\"}\
5708 {\"4_TCOFFEE\"}=\"LSQMAN\";\n$PG{\"lsqman\"}{\"typ\
5709 e\"}=\"structure_pairwise_aligner\";\n$PG{\"lsqman\
5710 \"}{\"ADDRESS\"}=\"empty\";\n$PG{\"lsqman\"}{\"lan\
5711 guage\"}=\"empty\";\n$PG{\"lsqman\"}{\"language2\"\
5712 }=\"empty\";\n$PG{\"lsqman\"}{\"source\"}=\"empty\\
5713 ";\n$PG{\"lsqman\"}{\"update_action\"}=\"never\";\\
5714 n$PG{\"lsqman\"}{\"mode\"}=\"expresso,3dcoffee\";\\
5715 n$PG{\"align_pdb\"}{\"4_TCOFFEE\"}=\"ALIGN_PDB\";\\
5716 n$PG{\"align_pdb\"}{\"type\"}=\"structure_pairwise\
5717 _aligner\";\n$PG{\"align_pdb\"}{\"ADDRESS\"}=\"emp\
5718 ty\";\n$PG{\"align_pdb\"}{\"language\"}=\"empty\";\
5719 \n$PG{\"align_pdb\"}{\"language2\"}=\"empty\";\n$P\
5720 G{\"align_pdb\"}{\"source\"}=\"empty\";\n$PG{\"ali\
5721 gn_pdb\"}{\"update_action\"}=\"never\";\n$PG{\"ali\
5722 gn_pdb\"}{\"mode\"}=\"expresso,3dcoffee\";\n$PG{\"\
5723 fugueali\"}{\"4_TCOFFEE\"}=\"FUGUE\";\n$PG{\"fugue\
5724 ali\"}{\"type\"}=\"structure_pairwise_aligner\";\n\
5725 $PG{\"fugueali\"}{\"ADDRESS\"}=\"http://www-cryst.\
5726 bioc.cam.ac.uk/fugue/download.html\";\n$PG{\"fugue\
5727 ali\"}{\"language\"}=\"empty\";\n$PG{\"fugueali\"}\
5728 {\"language2\"}=\"empty\";\n$PG{\"fugueali\"}{\"so\
5729 urce\"}=\"empty\";\n$PG{\"fugueali\"}{\"update_act\
5730 ion\"}=\"never\";\n$PG{\"fugueali\"}{\"mode\"}=\"e\
5731 xpresso,3dcoffee\";\n$PG{\"dalilite.pl\"}{\"4_TCOF\
5732 FEE\"}=\"DALILITEc\";\n$PG{\"dalilite.pl\"}{\"type\
5733 \"}=\"structure_pairwise_aligner\";\n$PG{\"dalilit\
5734 e.pl\"}{\"ADDRESS\"}=\"built_in\";\n$PG{\"dalilite\
5735 .pl\"}{\"ADDRESS2\"}=\"http://www.ebi.ac.uk/Tools/\
5736 webservices/services/dalilite\";\n$PG{\"dalilite.p\
5737 l\"}{\"language\"}=\"Perl\";\n$PG{\"dalilite.pl\"}\
5738 {\"language2\"}=\"Perl\";\n$PG{\"dalilite.pl\"}{\"\
5739 source\"}=\"empty\";\n$PG{\"dalilite.pl\"}{\"updat\
5740 e_action\"}=\"never\";\n$PG{\"dalilite.pl\"}{\"mod\
5741 e\"}=\"expresso,3dcoffee\";\n$PG{\"probconsRNA\"}{\
5742 \"4_TCOFFEE\"}=\"PROBCONSRNA\";\n$PG{\"probconsRNA\
5743 \"}{\"type\"}=\"RNA_multiple_aligner\";\n$PG{\"pro\
5744 bconsRNA\"}{\"ADDRESS\"}=\"http://probcons.stanfor\
5745 d.edu/\";\n$PG{\"probconsRNA\"}{\"language\"}=\"C+\
5746 +\";\n$PG{\"probconsRNA\"}{\"language2\"}=\"CXX\";\
5747 \n$PG{\"probconsRNA\"}{\"source\"}=\"http://probco\
5748 ns.stanford.edu/probconsRNA.tar.gz\";\n$PG{\"probc\
5749 onsRNA\"}{\"mode\"}=\"mcoffee,rcoffee\";\n$PG{\"pr\
5750 obconsRNA\"}{\"version\"}=\"1.0\";\n$PG{\"sfold\"}\
5751 {\"4_TCOFFEE\"}=\"CONSAN\";\n$PG{\"sfold\"}{\"type\
5752 \"}=\"RNA_pairwise_aligner\";\n$PG{\"sfold\"}{\"AD\
5753 DRESS\"}=\"http://selab.janelia.org/software/consa\
5754 n/\";\n$PG{\"sfold\"}{\"language\"}=\"empty\";\n$P\
5755 G{\"sfold\"}{\"language2\"}=\"empty\";\n$PG{\"sfol\
5756 d\"}{\"source\"}=\"empty\";\n$PG{\"sfold\"}{\"upda\
5757 te_action\"}=\"never\";\n$PG{\"sfold\"}{\"mode\"}=\
5758 \"rcoffee\";\n$PG{\"RNAplfold\"}{\"4_TCOFFEE\"}=\"\
5759 RNAPLFOLD\";\n$PG{\"RNAplfold\"}{\"type\"}=\"RNA_s\
5760 econdarystructure_predictor\";\n$PG{\"RNAplfold\"}\
5761 {\"ADDRESS\"}=\"http://www.tbi.univie.ac.at/~ivo/R\
5762 NA/\";\n$PG{\"RNAplfold\"}{\"language\"}=\"C\";\n$\
5763 PG{\"RNAplfold\"}{\"language2\"}=\"C\";\n$PG{\"RNA\
5764 plfold\"}{\"source\"}=\"http://www.tbi.univie.ac.a\
5765 t/~ivo/RNA/ViennaRNA-1.7.2.tar.gz\";\n$PG{\"RNAplf\
5766 old\"}{\"mode\"}=\"rcoffee,\";\n$PG{\"RNAplfold\"}\
5767 {\"version\"}=\"1.7.2\";\n$PG{\"retree\"}{\"4_TCOF\
5768 FEE\"}=\"PHYLIP\";\n$PG{\"retree\"}{\"type\"}=\"RN\
5769 A_secondarystructure_predictor\";\n$PG{\"retree\"}\
5770 {\"ADDRESS\"}=\"http://evolution.gs.washington.edu\
5771 /phylip/\";\n$PG{\"retree\"}{\"language\"}=\"C\";\\
5772 n$PG{\"retree\"}{\"language2\"}=\"C\";\n$PG{\"retr\
5773 ee\"}{\"source\"}=\"http://evolution.gs.washington\
5774 .edu/phylip/download/phylip-3.69.tar.gz\";\n$PG{\"\
5775 retree\"}{\"mode\"}=\"trmsd,\";\n$PG{\"retree\"}{\\
5776 "version\"}=\"3.69\";\n$PG{\"hmmtop\"}{\"4_TCOFFEE\
5777 \"}=\"HMMTOP\";\n$PG{\"hmmtop\"}{\"type\"}=\"prote\
5778 in_secondarystructure_predictor\";\n$PG{\"hmmtop\"\
5779 }{\"ADDRESS\"}=\"www.enzim.hu/hmmtop/\";\n$PG{\"hm\
5780 mtop\"}{\"language\"}=\"C\";\n$PG{\"hmmtop\"}{\"la\
5781 nguage2\"}=\"C\";\n$PG{\"hmmtop\"}{\"source\"}=\"e\
5782 mpty\";\n$PG{\"hmmtop\"}{\"binary\"}=\"hmmtop\";\n\
5783 $PG{\"hmmtop\"}{\"update_action\"}=\"never\";\n$PG\
5784 {\"hmmtop\"}{\"mode\"}=\"tcoffee\";\n$PG{\"hmmtop\\
5785 "}{\"version\"}=\"2.1\";\n$PG{\"gorIV\"}{\"4_TCOFF\
5786 EE\"}=\"GOR4\";\n$PG{\"gorIV\"}{\"type\"}=\"protei\
5787 n_secondarystructure_predictor\";\n$PG{\"gorIV\"}{\
5788 \"ADDRESS\"}=\"http://mig.jouy.inra.fr/logiciels/g\
5789 orIV/\";\n$PG{\"gorIV\"}{\"language\"}=\"C\";\n$PG\
5790 {\"gorIV\"}{\"language2\"}=\"C\";\n$PG{\"gorIV\"}{\
5791 \"source\"}=\"http://mig.jouy.inra.fr/logiciels/go\
5792 rIV/GOR_IV.tar.gz\";\n$PG{\"gorIV\"}{\"update_acti\
5793 on\"}=\"never\";\n$PG{\"gorIV\"}{\"mode\"}=\"tcoff\
5794 ee\";\n$PG{\"wublast.pl\"}{\"4_TCOFFEE\"}=\"EBIWUB\
5795 LASTc\";\n$PG{\"wublast.pl\"}{\"type\"}=\"protein_\
5796 homology_predictor\";\n$PG{\"wublast.pl\"}{\"ADDRE\
5797 SS\"}=\"built_in\";\n$PG{\"wublast.pl\"}{\"ADDRESS\
5798 2\"}=\"http://www.ebi.ac.uk/Tools/webservices/serv\
5799 ices/wublast\";\n$PG{\"wublast.pl\"}{\"language\"}\
5800 =\"Perl\";\n$PG{\"wublast.pl\"}{\"language2\"}=\"P\
5801 erl\";\n$PG{\"wublast.pl\"}{\"source\"}=\"empty\";\
5802 \n$PG{\"wublast.pl\"}{\"update_action\"}=\"never\"\
5803 ;\n$PG{\"wublast.pl\"}{\"mode\"}=\"psicoffee,expre\
5804 sso,accurate\";\n$PG{\"blastpgp.pl\"}{\"4_TCOFFEE\\
5805 "}=\"EBIBLASTPGPc\";\n$PG{\"blastpgp.pl\"}{\"type\\
5806 "}=\"protein_homology_predictor\";\n$PG{\"blastpgp\
5807 .pl\"}{\"ADDRESS\"}=\"built_in\";\n$PG{\"blastpgp.\
5808 pl\"}{\"ADDRESS2\"}=\"http://www.ebi.ac.uk/Tools/w\
5809 ebservices/services/blastpgp\";\n$PG{\"blastpgp.pl\
5810 \"}{\"language\"}=\"Perl\";\n$PG{\"blastpgp.pl\"}{\
5811 \"language2\"}=\"Perl\";\n$PG{\"blastpgp.pl\"}{\"s\
5812 ource\"}=\"empty\";\n$PG{\"blastpgp.pl\"}{\"update\
5813 _action\"}=\"never\";\n$PG{\"blastpgp.pl\"}{\"mode\
5814 \"}=\"psicoffee,expresso,accurate\";\n$PG{\"blasta\
5815 ll\"}{\"4_TCOFFEE\"}=\"blastall\";\n$PG{\"blastall\
5816 \"}{\"type\"}=\"protein_homology_predictor\";\n$PG\
5817 {\"blastall\"}{\"ADDRESS\"}=\"ftp://ftp.ncbi.nih.g\
5818 ov/blast/executables/LATEST\";\n$PG{\"blastall\"}{\
5819 \"language\"}=\"C\";\n$PG{\"blastall\"}{\"language\
5820 2\"}=\"C\";\n$PG{\"blastall\"}{\"source\"}=\"empty\
5821 \";\n$PG{\"blastall\"}{\"update_action\"}=\"never\\
5822 ";\n$PG{\"blastall\"}{\"mode\"}=\"psicoffee,expres\
5823 so,3dcoffee\";\n$PG{\"legacy_blast.pl\"}{\"4_TCOFF\
5824 EE\"}=\"NCBIBLAST\";\n$PG{\"legacy_blast.pl\"}{\"t\
5825 ype\"}=\"protein_homology_predictor\";\n$PG{\"lega\
5826 cy_blast.pl\"}{\"ADDRESS\"}=\"ftp://ftp.ncbi.nih.g\
5827 ov/blast/executables/LATEST\";\n$PG{\"legacy_blast\
5828 .pl\"}{\"language\"}=\"C\";\n$PG{\"legacy_blast.pl\
5829 \"}{\"language2\"}=\"C\";\n$PG{\"legacy_blast.pl\"\
5830 }{\"source\"}=\"empty\";\n$PG{\"legacy_blast.pl\"}\
5831 {\"update_action\"}=\"never\";\n$PG{\"legacy_blast\
5832 .pl\"}{\"mode\"}=\"psicoffee,expresso,3dcoffee\";\\
5833 n$PG{\"SOAP::Lite\"}{\"4_TCOFFEE\"}=\"SOAPLITE\";\\
5834 n$PG{\"SOAP::Lite\"}{\"type\"}=\"library\";\n$PG{\\
5835 "SOAP::Lite\"}{\"ADDRESS\"}=\"http://cpansearch.pe\
5836 rl.org/src/MKUTTER/SOAP-Lite-0.710.08/Makefile.PL\\
5837 ";\n$PG{\"SOAP::Lite\"}{\"language\"}=\"Perl\";\n$\
5838 PG{\"SOAP::Lite\"}{\"language2\"}=\"Perl\";\n$PG{\\
5839 "SOAP::Lite\"}{\"source\"}=\"empty\";\n$PG{\"blast\
5840 pgp\"}{\"update_action\"}=\"never\";\n$PG{\"SOAP::\
5841 Lite\"}{\"mode\"}=\"none\";\n$PG{\"XML::Simple\"}{\
5842 \"4_TCOFFEE\"}=\"XMLSIMPLE\";\n$PG{\"XML::Simple\"\
5843 }{\"type\"}=\"library\";\n$PG{\"XML::Simple\"}{\"A\
5844 DDRESS\"}=\"http://search.cpan.org/~grantm/XML-Sim\
5845 ple-2.18/lib/XML/Simple.pm\";\n$PG{\"XML::Simple\"\
5846 }{\"language\"}=\"Perl\";\n$PG{\"XML::Simple\"}{\"\
5847 language2\"}=\"Perl\";\n$PG{\"XML::Simple\"}{\"sou\
5848 rce\"}=\"empty\";\n$PG{\"XML::Simple\"}{\"mode\"}=\
5849 \"psicoffee,expresso,accurate\";\n$MODE{\"tcoffee\\
5850 "}{\"name\"}=\"tcoffee\";\n$MODE{\"rcoffee\"}{\"na\
5851 me\"}=\"rcoffee\";\n$MODE{\"3dcoffee\"}{\"name\"}=\
5852 \"3dcoffee\";\n$MODE{\"mcoffee\"}{\"name\"}=\"mcof\
5853 fee\";\n$MODE{\"expresso\"}{\"name\"}=\"expresso\"\
5854 ;\n$MODE{\"trmsd\"}{\"name\"}=\"trmsd\";\n$MODE{\"\
5855 accurate\"}{\"name\"}=\"accurate\";\n$MODE{\"seq_r\
5856 eformat\"}{\"name\"}=\"seq_reformat\";\n\n\n$PG{C}\
5857 {compiler}=\"gcc\";\n$PG{C}{compiler_flag}=\"CC\";\
5858 \n$PG{C}{options}=\"\";\n$PG{C}{options_flag}=\"CF\
5859 LAGS\";\n$PG{C}{type}=\"compiler\";\n\n$PG{\"CXX\"\
5860 }{compiler}=\"g++\";\n$PG{\"CXX\"}{compiler_flag}=\
5861 \"CXX\";\n$PG{\"CXX\"}{options}=\"\";\n$PG{\"CXX\"\
5862 }{options_flag}=\"CXXFLAGS\";\n$PG{CXX}{type}=\"co\
5863 mpiler\";\n\n$PG{\"CPP\"}{compiler}=\"g++\";\n$PG{\
5864 \"CPP\"}{compiler_flag}=\"CPP\";\n$PG{\"CPP\"}{opt\
5865 ions}=\"\";\n$PG{\"CPP\"}{options_flag}=\"CPPFLAGS\
5866 \";\n$PG{CPP}{type}=\"compiler\";\n\n$PG{\"GPP\"}{\
5867 compiler}=\"g++\";\n$PG{\"GPP\"}{compiler_flag}=\"\
5868 GPP\";\n$PG{\"GPP\"}{options}=\"\";\n$PG{\"GPP\"}{\
5869 options_flag}=\"CFLAGS\";\n$PG{GPP}{type}=\"compil\
5870 er\";\n\n$PG{Fortran}{compiler}=\"g77\";\n$PG{Fort\
5871 ran}{compiler_flag}=\"FCC\";\n$PG{Fortran}{type}=\\
5872 "compiler\";\n\n$PG{Perl}{compiler}=\"CPAN\";\n$PG\
5873 {Perl}{type}=\"compiler\";\n\n$SUPPORTED_OS{macox}\
5874 =\"Macintosh\";\n$SUPPORTED_OS{linux}=\"Linux\";\n\
5875 $SUPPORTED_OS{windows}=\"Cygwin\";\n\n\n\n$MODE{t_\
5876 coffee}{description}=\" for regular multiple seque\
5877 nce alignments\";\n$MODE{rcoffee} {description}=\"\
5878  for RNA multiple sequence alignments\";\n\n$MODE{\
5879 psicoffee} {description}=\" for Homology Extended \
5880 multiple sequence alignments\";\n$MODE{expresso}{d\
5881 escription}=\" for very accurate structure based m\
5882 ultiple sequence alignments\";\n$MODE{\"3dcoffee\"\
5883 }{description}=\" for multiple structure alignment\
5884 s\";\n$MODE{mcoffee} {description}=\" for combinin\
5885 g alternative multiple sequence alignment packages\
5886 \\n------- into a unique meta-package. The install\
5887 er will upload several MSA packages and compile th\
5888 em\\n\n\";\n\n\n&post_process_PG();\nreturn;\n}\n\\
5889 nsub post_process_PG\n  {\n    my $p;\n    \n    %\
5890 PG=&name2dname (%PG);\n    %MODE=&name2dname(%MODE\
5891 );\n    foreach $p (keys(%PG)){if ( $PG{$p}{type} \
5892 eq \"compiler\"){$PG{$p}{update_action}=\"never\";\
5893 }}\n    \n  }\n\nsub name2dname\n  {\n    my (%L)=\
5894 (@_);\n    my ($l, $ml);\n    \n    foreach my $pg\
5895  (keys(%L))\n      {\n  $l=length ($pg);\n      if ( $l>\
5896 $ml){$ml=$l;}\n      }\n    $ml+=1;\n    foreach m\
5897 y $pg (keys(%L))\n      {\n     my $name;\n     $l=$ml-len\
5898 gth ($pg);\n    $name=$pg;\n    for ( $b=0; $b<$l; $b++)\
5899 \n        {\n       $name .=\" \";\n      }\n   $L{$pg}{dname}\
5900 =$name;\n      }\n    return %L;\n  }\n\nsub env_f\
5901 ile2putenv\n  {\n    my $f=@_[0];\n    my $F=new F\
5902 ileHandle;\n    my $n;\n    \n    open ($F, \"$f\"\
5903 );\n    while (<$F>)\n      {\n my $line=$_;\n  my(\
5904 $var, $value)=($_=~/(\\S+)\\=(\\S*)/);\n        $ENV{$var\
5905 }=$value;\n     $ENV_SET{$var}=1;\n     $n++;\n      }\n  \
5906   close ($F);\n    return $n;\n  }\n\nsub replace_\
5907 line_in_file\n  {\n    my ($file, $wordin, $wordou\
5908 t)=@_;\n    my $O=new FileHandle;\n    my $I=new F\
5909 ileHandle;\n    my $l;\n    if (!-e $file){return;\
5910 }\n    \n    system (\"mv $file $file.old\");\n   \
5911  open ($O, \">$file\");\n    open ($I, \"$file.old\
5912 \");\n    while (<$I>)\n      {\n       $l=$_;\n        if (!($\
5913 l=~/$wordin/)){print $O \"$l\";}\n      elsif ( $wordou\
5914 t ne \"\"){$l=~s/$wordin/$wordout/g;print $O \"$l\\
5915 ";}\n      }\n    close ($O);\n    close ($I);\n  \
5916   return;\n  }\n\nsub add_C_libraries\n  {\n   my \
5917 ($file,$first,@list)=@_;\n   \n    my $O=new FileH\
5918 andle;\n    my $I=new FileHandle;\n    my ($l,$anc\
5919 hor);\n    if (!-e $file){return;}\n   \n    $anch\
5920 or=\"#include <$first>\";\n      \n    system (\"mv $f\
5921 ile $file.old\");\n    open ($O, \">$file\");\n   \
5922  open ($I, \"$file.old\");\n    while (<$I>)\n    \
5923   {\n   $l=$_;\n        print $O \"$l\";\n      if (!($l=~/$anch\
5924 or/))\n    {\n      \n      foreach my $lib (@list)\\
5925 n              {\n                  print $O \"#include \
5926 <$lib>\\n\";\n         }\n           }\n      }\n  \
5927   close ($O);\n    close ($I);\n    return;\n    }\
5928 \n","use Env;\nuse Cwd;\n@suffix=(\"tmp\", \"temp\\
5929 ", \"cache\", \"t_coffee\", \"core\", \"tcoffee\")\
5930 ;\n\nif ($#ARGV==-1)\n  {\n    print \"clean_cache\
5931 .pl -file <file to add in -dir> -dir=<dir> -size=<\
5932 value in Mb>\\n0: unlimited -1 always.\\nWill only\
5933  clean directories matching:[\";\n    foreach $k(@\
5934 suffix){print \"*$k* \";}\n    print \"]\\n\";\n  \
5935   exit (EXIT_FAILURE);\n  }\n\n$cl=join (\" \",@AR\
5936 GV);\nif (($cl=~/\\-no_action/))\n  {\n    exit (E\
5937 XIT_SUCCESS);\n  }\n\nif (($cl=~/\\-debug/))\n  {\\
5938 n    $DEBUG=1;\n  }\nelse\n  {\n    $DEBUG=0;\n  }\
5939 \n\nif (($cl=~/\\-dir=(\\S+)/))\n  {\n    $dir=$1;\
5940 \n  }\nelse\n  {\n    $dir=\"./\";\n  }\n\nif ($cl\
5941 =~/\\-file=(\\S+)/)\n  {\n    $file=$1;\n  }\nelse\
5942 \n  {\n    $file=0;\n  }\n\nif ($cl=~/\\-size=(\\S\
5943 +)/)\n  {\n    $max_size=$1;\n  }\nelse\n  {\n    \
5944 $max_size=0;#unlimited\n  }\nif ($cl=~/\\-force/)\\
5945 n  {\n    $force=1;\n  }\nelse\n  {\n    $force=0;\
5946 \n  }\n\nif ($cl=~/\\-age=(\\S+)/)\n  {\n    $max_\
5947 age=$1;\n  }\nelse\n  {\n    $max_age=0;#unlimited\
5948 \n  }\n\n$max_size*=1000000;\nif ( ! -d $dir)\n  {\
5949 \n    print STDERR \"\\nCannot process $dir: does \
5950 not exist \\n\";\n    exit (EXIT_FAILURE);\n  }\n\\
5951 nif ( !($dir=~/^\\//))\n  {\n    $base=cwd();\n   \
5952  $dir=\"$base/$dir\";\n  }\n\n$proceed=0;\nforeach\
5953  $s (@suffix)\n  {\n    \n    if (($dir=~/$s/)){$p\
5954 roceed=1;}\n    $s=uc ($s);\n    if (($dir=~/$s/))\
5955 {$proceed=1;}\n  }\nif ( $proceed==0)\n  {\n    pr\
5956 int STDERR \"Clean_cache.pl can only clean directo\
5957 ries whose absolute path name contains the followi\
5958 ng strings:\";\n    foreach $w (@suffix) {print ST\
5959 DERR \"$w \";$w=lc($w); print STDERR \"$w \";}\n  \
5960   print STDERR \"\\nCannot process $dir\\n\";\n   \
5961  exit (EXIT_FAILURE);\n  }\n\n$name_file=\"$dir/na\
5962 me_file.txt\";\n$size_file=\"$dir/size_file.txt\";\
5963 \nif ( $force){&create_ref_file ($dir,$name_file,$\
5964 size_file);}\nif ($file){&add_file ($dir, $name_fi\
5965 le, $size_file, $file);}\n&clean_dir ($dir, $name_\
5966 file, $size_file, $max_size,$max_age);\nexit (EXIT\
5967 _SUCCESS);\n\nsub clean_dir \n  {\n    my ($dir, $\
5968 name_file, $size_file, $max_size, $max_age)=@_;\n \
5969    my ($tot_size, $size, $f, $s);\n\n  \n    $tot_\
5970 size=&get_tot_size ($dir, $name_file, $size_file);\
5971 \n\n    if ( $tot_size<=$max_size){return ;}\n    \
5972 else {$max_size/=2;}\n    \n    #recreate the name\
5973  file in case some temprary files have not been pr\
5974 operly registered\n    &create_ref_file ($dir, $na\
5975 me_file, $size_file, $max_age);\n  \n    $new_name\
5976 _file=&vtmpnam();\n    open (R, \"$name_file\");\n\
5977     open (W, \">$new_name_file\");\n    while (<R>\
5978 )\n      {\n    my $line=$_;\n  \n      ($f, $s)=($line=~/(\
5979 \\S+) (\\S+)/);\n       if ( !($f=~/\\S/)){next;}\n     \n      e\
5980 lsif ($max_size && $tot_size>=$max_size && !($f=~/\
5981 name_file/))\n    {\n       remove ( \"$dir/$f\");\n    \
5982     $tot_size-=$s;\n      }\n   elsif ( $max_age && -M(\
5983 \"$dir/$f\")>=$max_age)\n         {\n       remove ( \"$di\
5984 r/$f\");\n          $tot_size-=$s;\n      }\n   else\n    {\n\
5985             print W \"$f $s\\n\";\n       }\n      }\n    clo\
5986 se (R);\n    close (W);\n    open (F, \">$size_fil\
5987 e\");\n    print F \"$tot_size\";\n    if ( -e $ne\
5988 w_name_file){`mv $new_name_file $name_file`;}\n   \
5989  close (F);\n  }\nsub get_tot_size\n  {\n    my ($\
5990 dir, $name_file, $size_file)=@_;\n    my $size;\n \
5991    \n    if ( !-d $dir){return 0;}\n    if ( !-e $\
5992 name_file)\n      {\n   \n      &create_ref_file ($dir, $\
5993 name_file, $size_file);\n      }\n    open (F, \"$\
5994 size_file\");\n    $size=<F>;\n    close (F);\n   \
5995  chomp ($size);\n    return $size;\n  }\nsub size \
5996 \n  {\n    my $f=@_[0];\n\n    if ( !-d $f){return\
5997  -s($f);}\n    else {return &dir2size($f);}\n  }\n\
5998 sub dir2size\n  {\n    my $d=@_[0];\n    my ($s, $\
5999 f);\n    \n    if ( !-d $d) {return 0;}\n    \n   \
6000  foreach $f (&dir2list ($d))\n      {\n if ( -d $f\
6001 ){$s+=&dir2size (\"$d/$f\");}\n else {$s+= -s \"$d\
6002 ir/$f\";}\n      }\n    return $s;\n  }\n\nsub rem\
6003 ove \n  {\n    my $file=@_[0];\n    my ($f);\n    \
6004 \n    debug_print( \"--- $file ---\\n\");\n    if \
6005 (($file eq \".\") || ($file eq \"..\") || ($file=~\
6006 /\\*/)){return EXIT_FAILURE;}\n    elsif ( !-d $fi\
6007 le)\n      {\n  debug_print (\"unlink $file\\n\");\\
6008 n       if (-e $file){unlink ($file);}\n      }\n    els\
6009 if ( -d $file)\n      {\n       debug_print (\"++++++++ \
6010 $file +++++++\\n\");\n  foreach $f (&dir2list($file\
6011 ))\n      {\n       &remove (\"$file/$f\");\n     }\n   deb\
6012 ug_print (\"rmdir $file\\n\");\n        rmdir $file;\n   \
6013    }\n    else\n      {\n       debug_print (\"?????????\
6014  $file ????????\\n\");\n      }\n    return EXIT_S\
6015 UCCESS;\n  }\n\nsub dir2list\n  {\n    my $dir=@_[\
6016 0];\n    my (@list1, @list2,@list3, $l);\n\n    op\
6017 endir (DIR,$dir);\n    @list1=readdir (DIR);\n    \
6018 closedir (DIR);\n    \n    foreach $l (@list1)\n  \
6019     {\n if ( $l ne \".\" && $l ne \"..\"){@list2=(\
6020 @list2, $l);}\n      }\n    @list3 = sort { (-M \"\
6021 $dir/$list2[$b]\") <=> (-M \"$dir/$list2[$a]\")} @\
6022 list2;\n    return @list3;\n    \n  }\n\nsub debug\
6023 _print\n  {\n    \n    if ($DEBUG==1){print @_;}\n\
6024     \n  }\nsub create_ref_file\n  {\n    my ($dir,\
6025 $name_file,$size_file)=@_;\n    my ($f, $s, $tot_s\
6026 ize, @l);\n    \n    if ( !-d $dir){return;}\n    \
6027 \n    @l=&dir2list ($dir);\n    open (F, \">$name_\
6028 file\");\n    foreach $f (@l)\n      {\n        $s=&size(\
6029 \"$dir/$f\");\n $tot_size+=$s;\n        print F \"$f $s\\\
6030 n\";\n      }\n    &myecho ($tot_size, \">$size_fi\
6031 le\");\n    close (F);\n  }\nsub add_file \n  {\n \
6032    my ($dir,$name_file,$size_file,$file)=@_;\n    \
6033 my ($s, $tot_size);\n    \n    if ( !-d $dir)   {r\
6034 eturn;}\n    if ( !-e \"$dir/$file\" ) {return;}\n\
6035     if ( !-e $name_file){&create_ref_file ($dir,$n\
6036 ame_file,$size_file);}\n                                            \n    $s=&size(\"\
6037 $dir/$file\");\n    open (F, \">>$name_file\");\n \
6038    print F \"$file\\n\";\n    close (F);\n\n    $t\
6039 ot_size=&get_tot_size ($dir,$name_file,$size_file)\
6040 ;\n    $tot_size+=$s;\n    &myecho ($tot_size, \">\
6041 $size_file\");\n    \n  }\n     \nsub myecho\n  {\n   \
6042  my ($string, $file)=@_;\n    open (ECHO, $file) |\
6043 | die;\n    print ECHO \"$string\";\n    close (EC\
6044 HO);\n  }\n    \n               \n      \nsub vtmpnam\n  {\n    my $\
6045 tmp_file_name;\n    $tmp_name_counter++;\n    $tmp\
6046 _file_name=\"tmp_file_for_clean_cache_pdb$$.$tmp_n\
6047 ame_counter\";\n    $tmp_file_list[$ntmp_file++]=$\
6048 tmp_file_name;\n    if ( -e $tmp_file_name) {retur\
6049 n &vtmpnam ();}\n    else {return $tmp_file_name;}\
6050 \n  }\n","\nmy $address=\"http://www.tcoffee.org/D\
6051 ata/Datasets/NatureProtocolsDataset.tar.gz\";\nmy \
6052 $out=\"NatureProtocolsDataset.tar.gz\";\n&url2file\
6053  ($address,$out);\n\nif ( -e $out)\n  {\n    \n   \
6054  system (\"gunzip NatureProtocolsDataset.tar.gz\")\
6055 ;\n    system (\"tar -xvf NatureProtocolsDataset.t\
6056 ar\");\n        system (\"rm -rf NatureProtocolsDataset\
6057 .tar\");  \n    print \"Your Data Set is in the Fo\
6058 lder 'NatureProtocolsDataset'\\n\";\n  }\nelse \n \
6059  {\n    print \"Could not Download Dataset --- Web\
6060  site may be down -- Try again later\\n\";\n  }\n\\
6061 n\n\n\nsub url2file\n{\n    my ($address, $out, $w\
6062 get_arg, $curl_arg)=(@_);\n    my ($pg, $flag, $r,\
6063  $arg, $count);\n    \n    if (!$CONFIGURATION){&c\
6064 heck_configuration (\"wget\", \"INTERNET\", \"gzip\
6065 \");$CONFIGURATION=1;}\n    \n    if (&pg_is_insta\
6066 lled (\"wget\"))   {$pg=\"wget\"; $flag=\"-O\";$ar\
6067 g=$wget_arg;}\n    elsif (&pg_is_installed (\"curl\
6068 \")){$pg=\"curl\"; $flag=\"-o\";$arg=$curl_arg;}\n\
6069     return system (\"$pg $address $flag $out>/dev/\
6070 null 2>/dev/null\");\n\n}\n\nsub pg_is_installed\n\
6071   {\n    my @ml=@_;\n    my $r, $p, $m;\n    my $s\
6072 upported=0;\n    \n    my $p=shift (@ml);\n    if \
6073 ($p=~/::/)\n      {\n   if (system (\"perl -M$p -e 1\
6074 \")==$EXIT_SUCCESS){return 1;}\n        else {return 0;}\\
6075 n      }\n    else\n      {\n   $r=`which $p 2>/dev/\
6076 null`;\n        if ($r eq \"\"){return 0;}\n    else {return\
6077  1;}\n      }\n  }\nsub check_configuration \n    \
6078 {\n      my @l=@_;\n      my $v;\n      foreach my\
6079  $p (@l)\n      {\n       \n      if   ( $p eq \"EMAIL\")\n       \
6080   { \n        if ( !($EMAIL=~/@/))\n            {\n               exit (\
6081 EXIT_FAILURE);\n                }\n         }\n   elsif( $p eq \"INT\
6082 ERNET\")\n          {\n       if ( !&check_internet_con\
6083 nection())\n            {\n               exit (EXIT_FAILURE);\n                }\n      \
6084    }\n    elsif( $p eq \"wget\")\n          {\n       if\
6085  (!&pg_is_installed (\"wget\") && !&pg_is_installe\
6086 d (\"curl\"))\n         {\n               exit (EXIT_FAILURE);\n                }\\
6087 n           }\n   elsif( !(&pg_is_installed ($p)))\n       \
6088  {\n          exit (EXIT_FAILURE);\n        }\n }\n     \
6089  return 1;\n    }\nsub check_internet_connection\n\
6090   {\n    my $internet;\n    my $tmp;\n    &check_c\
6091 onfiguration ( \"wget\"); \n    \n    $tmp=&vtmpna\
6092 m ();\n    \n    if     (&pg_is_installed    (\"wg\
6093 et\")){`wget www.google.com -O$tmp >/dev/null 2>/d\
6094 ev/null`;}\n    elsif  (&pg_is_installed    (\"cur\
6095 l\")){`curl www.google.com -o$tmp >/dev/null 2>/de\
6096 v/null`;}\n    \n    if ( !-e $tmp || -s $tmp < 10\
6097 ){$internet=0;}\n    else {$internet=1;}\n    if (\
6098 -e $tmp){unlink $tmp;}\n\n    return $internet;\n \
6099  }\n\nsub vtmpnam\n      {\n    my $r=rand(100000);\n\
6100         my $f=\"file.$r.$$\";\n while (-e $f)\n   {\n      \
6101  $f=vtmpnam();\n          }\n   push (@TMPFILE_LIST, $f);\n\
6102         return $f;\n      }\n\n","\n$t_coffee=\"t_coffee\\
6103 ";\n\nforeach $value ( @ARGV)\n  {\n    $seq_file=\
6104 $seq_file.\" \".$value;\n  }\n\n$name=$ARGV[0];\n$\
6105 name=~s/\\.[^\\.]*$//;\n$lib_name=\"$name.mocca_li\
6106 b\";\n$type=`t_coffee $seq_file -get_type -quiet`;\
6107 \nchop ($type);\n\nif ( $type eq \"PROTEIN\"){$lib\
6108 _mode=\"lalign_rs_s_pair -lalign_n_top 20\";}\nels\
6109 if ( $type eq\"DNA\"){$lib_mode=\"lalign_rs_s_dna_\
6110 pair -lalign_n_top 40\";}\n\nif ( !(-e $lib_name))\
6111 \n  {\n   \n  $command=\"$t_coffee -mocca -seq_wei\
6112 ght=no -cosmetic_penalty=0 -mocca_interactive -in \
6113 $lib_mode -out_lib $lib_name -infile $seq_file\";\\
6114 n  \n  }\nelsif ( (-e $lib_name))\n  {\n  $command\
6115 =\"$t_coffee -mocca -seq_weight=no -cosmetic_penal\
6116 ty=0 -mocca_interactive -in $lib_name -infile $seq\
6117 _file\";\n  \n  }\n\nsystem ($command);\n\nexit;\n\
6118 \n","my $WSDL = 'http://www.ebi.ac.uk/Tools/webser\
6119 vices/wsdl/WSDaliLite.wsdl';\n\nuse SOAP::Lite;\nu\
6120 se Data::Dumper;\nuse Getopt::Long qw(:config no_i\
6121 gnore_case bundling);\nuse File::Basename;\n\nmy $\
6122 checkInterval = 5;\n\nmy %params=(\n        'async' =\
6123 > '1', # Use async mode and simulate sync mode in \
6124 client\n            );\nGetOptions(\n    'pdb1=s'     => \
6125 \\$params{'sequence1'},\n    'chainid1=s' => \\$pa\
6126 rams{'chainid1'},\n    'pdb2=s'     => \\$params{'\
6127 sequence2'},\n    'chainid2=s' => \\$params{'chain\
6128 id2'},\n    \"help|h\"   => \\$help, # Usage info\n\
6129     \"async|a\"  => \\$async, # Asynchronous submi\
6130 ssion\n    \"polljob\"   => \\$polljob, # Get resul\
6131 ts\n    \"status\"       => \\$status, # Get status\n  \
6132   \"jobid|j=s\"  => \\$jobid, # JobId\n    \"email\
6133 |S=s\"  => \\$params{email}, # E-mail address\n   \
6134  \"trace\"      => \\$trace, # SOAP messages\n    \
6135 \"sequence=s\" => \\$sequence, # Input PDB\n    );\
6136 \n\nmy $scriptName = basename($0, ());\nif($help) \
6137 {\n    &usage();\n    exit(0);\n}\n\nif($trace) {\\
6138 n    print \"Tracing active\\n\";\n    SOAP::Lite-\
6139 >import(+trace => 'debug');\n}\n\nmy $soap = SOAP:\
6140 :Lite\n    ->service($WSDL)\n    ->on_fault(sub {\\
6141 n        my $soap = shift;\n        my $res = shif\
6142 t;\n        # Throw an exception for all faults\n \
6143        if(ref($res) eq '') {\n            die($res\
6144 );\n        } else {\n            die($res->faults\
6145 tring);\n        }\n        return new SOAP::SOM;\\
6146 n    }\n               );\n\nif( !($polljob || $st\
6147 atus) &&\n    !( defined($params{'sequence1'}) && \
6148 defined($params{'sequence2'}) )\n    ) {\n    prin\
6149 t STDERR 'Error: bad option combination', \"\\n\";\
6150 \n    &usage();\n    exit(1);\n}\nelsif($polljob &\
6151 & defined($jobid)) {\n    print \"Getting results \
6152 for job $jobid\\n\";\n    getResults($jobid);\n}\n\
6153 elsif($status && defined($jobid)) {\n    print STD\
6154 ERR \"Getting status for job $jobid\\n\";\n    my \
6155 $result = $soap->checkStatus($jobid);\n    print S\
6156 TDOUT \"$result\", \"\\n\";\n    if($result eq 'DO\
6157 NE') {\n        print STDERR \"To get results: $scriptNam\
6158 e --polljob --jobid $jobid\\n\";\n    }\n}\nelse {\
6159 \n    if(-f $params{'sequence1'}) {\n   $params{'seq\
6160 uence1'} = read_file($params{'sequence1'});\n    }\
6161 \n    if(-f $params{'sequence2'}) {\n   $params{'seq\
6162 uence2'} = read_file($params{'sequence2'});\n    }\
6163 \n\n    my $jobid;\n    my $paramsData = SOAP::Dat\
6164 a->name('params')->type(map=>\\%params);\n    # Fo\
6165 r SOAP::Lite 0.60 and earlier parameters are passe\
6166 d directly\n    if($SOAP::Lite::VERSION eq '0.60' \
6167 || $SOAP::Lite::VERSION =~ /0\\.[1-5]/) {\n       \
6168  $jobid = $soap->runDaliLite($paramsData);\n    }\\
6169 n    # For SOAP::Lite 0.69 and later parameter han\
6170 dling is different, so pass\n    # undef's for tem\
6171 plated params, and then pass the formatted args.\n\
6172     else {\n        $jobid = $soap->runDaliLite(un\
6173 def,\n                               $paramsData);\n    }\n\n    if (def\
6174 ined($async)) {\n       print STDOUT $jobid, \"\\n\";\n \
6175        print STDERR \"To check status: $scriptName\
6176  --status --jobid $jobid\\n\";\n    } else { # Syn\
6177 chronous mode\n        print STDERR \"JobId: $jobi\
6178 d\\n\";\n        sleep 1;\n        getResults($job\
6179 id);\n    }\n}\n\nsub clientPoll($) {\n    my $job\
6180 id = shift;\n    my $result = 'PENDING';\n    # Ch\
6181 eck status and wait if not finished\n    #print ST\
6182 DERR \"Checking status: $jobid\\n\";\n    while($r\
6183 esult eq 'RUNNING' || $result eq 'PENDING') {\n   \
6184      $result = $soap->checkStatus($jobid);\n      \
6185   print STDERR \"$result\\n\";\n        if($result\
6186  eq 'RUNNING' || $result eq 'PENDING') {\n        \
6187     # Wait before polling again.\n            slee\
6188 p $checkInterval;\n        }\n    }\n}\n\nsub getR\
6189 esults($) {\n    $jobid = shift;\n    # Check stat\
6190 us, and wait if not finished\n    clientPoll($jobi\
6191 d);\n    # Use JobId if output file name is not de\
6192 fined\n    unless(defined($outfile)) {\n        $o\
6193 utfile=$jobid;\n    }\n    # Get list of data type\
6194 s\n    my $resultTypes = $soap->getResults($jobid)\
6195 ;\n    # Get the data and write it to a file\n    \
6196 if(defined($outformat)) { # Specified data type\n \
6197        my $selResultType;\n        foreach my $res\
6198 ultType (@$resultTypes) {\n            if($resultT\
6199 ype->{type} eq $outformat) {\n                $sel\
6200 ResultType = $resultType;\n            }\n        \
6201 }\n        $res=$soap->poll($jobid, $selResultType\
6202 ->{type});\n        write_file($outfile.'.'.$selRe\
6203 sultType->{ext}, $res);\n    } else { # Data types\
6204  available\n        # Write a file for each output\
6205  type\n        for my $resultType (@$resultTypes){\
6206 \n            #print \"Getting $resultType->{type}\
6207 \\n\";\n            $res=$soap->poll($jobid, $resu\
6208 ltType->{type});\n            write_file($outfile.\
6209 '.'.$resultType->{ext}, $res);\n        }\n    }\n\
6210 }\n\nsub read_file($) {\n    my $filename = shift;\
6211 \n    open(FILE, $filename);\n    my $content;\n  \
6212   my $buffer;\n    while(sysread(FILE, $buffer, 10\
6213 24)) {\n        $content.= $buffer;\n    }\n    close(FIL\
6214 E);\n    return $content;\n}\n\nsub write_file($$)\
6215  {\n    my ($tmp,$entity) = @_;\n    print STDERR \
6216 \"Creating result file: \".$tmp.\"\\n\";\n    unle\
6217 ss(open (FILE, \">$tmp\")) {\n  return 0;\n    }\n \
6218    syswrite(FILE, $entity);\n    close (FILE);\n  \
6219   return 1;\n}\n\nsub usage {\n    print STDERR <<\
6220 EOF\nDaliLite\n========\n\nPairwise comparison of \
6221 protein structures\n\n[Required]\n\n  --pdb1      \
6222           : str  : PDB ID for structure 1\n  --pdb\
6223 2                : str  : PDB ID for structure 2\n\
6224 \n[Optional]\n\n  --chain1              : str  : C\
6225 hain identifer in structure 1\n  --chain2         \
6226      : str  : Chain identifer in structure 2\n\n[G\
6227 eneral]\n\n  -h, --help            :      : prints\
6228  this help text\n  -S, --email           : str  : \
6229 user email address\n  -a, --async           :     \
6230  : asynchronous submission\n      --status        \
6231   :      : poll for the status of a job\n      --p\
6232 olljob         :      : poll for the results of a \
6233 job\n  -j, --jobid           : str  : jobid for an\
6234  asynchronous job\n  -O, --outfile         : str  \
6235 : file name for results (default is jobid)\n      \
6236 --trace         :      : show SOAP messages being \
6237 interchanged \n\nSynchronous job:\n\n  The results\
6238 /errors are returned as soon as the job is finishe\
6239 d.\n  Usage: $scriptName --email <your\\@email> [o\
6240 ptions] pdbFile [--outfile string]\n  Returns: sav\
6241 es the results to disk\n\nAsynchronous job:\n\n  U\
6242 se this if you want to retrieve the results at a l\
6243 ater time. The results \n  are stored for up to 24\
6244  hours. \n  The asynchronous submission mode is re\
6245 commended when users are submitting \n  batch jobs\
6246  or large database searches     \n  Usage: $scriptName\
6247  --email <your\\@email> --async [options] pdbFile\\
6248 n  Returns: jobid\n\n  Use the jobid to query for \
6249 the status of the job. \n  Usage: $scriptName --st\
6250 atus --jobid <jobId>\n  Returns: string indicating\
6251  the status of the job:\n    DONE - job has finish\
6252 ed\n    RUNNING - job is running\n    NOT_FOUND - \
6253 job cannot be found\n    ERROR - the jobs has enco\
6254 untered an error\n\n  When done, use the jobid to \
6255 retrieve the status of the job. \n  Usage: $script\
6256 Name --polljob --jobid <jobId> [--outfile string]\\
6257 n\n[Help]\n\n  For more detailed help information \
6258 refer to\n  http://www.ebi.ac.uk/DaliLite/\nEOF\n;\
6259 \n}\n","my $WSDL = 'http://www.ebi.ac.uk/Tools/web\
6260 services/wsdl/WSWUBlast.wsdl';\n\nuse strict;\nuse\
6261  SOAP::Lite;\nuse Getopt::Long qw(:config no_ignor\
6262 e_case bundling);\nuse File::Basename;\n\nmy $chec\
6263 kInterval = 15;\n\nmy $numOpts = scalar(@ARGV);\nm\
6264 y ($outfile, $outformat, $help, $async, $polljob, \
6265 $status, $ids, $jobid, $trace, $sequence);\nmy %pa\
6266 rams= ( # Defaults\n          'async' => 1, # Force i\
6267 nto async mode\n              'exp' => 10.0, # E-value th\
6268 reshold\n             'numal' => 50, # Maximum number of\
6269  alignments\n         'scores' => 100, # Maximum num\
6270 ber of scores\n            );\nGetOptions( # Map t\
6271 he options into variables\n    \"program|p=s\"    \
6272  => \\$params{program}, # BLAST program\n    \"dat\
6273 abase|D=s\"    => \\$params{database}, # Search da\
6274 tabase\n    \"matrix|m=s\"      => \\$params{matri\
6275 x}, # Scoring matrix\n    \"exp|E=f\"         => \\
6276 \$params{exp}, # E-value threshold\n    \"echofilt\
6277 er|e\"    => \\$params{echofilter}, # Display filt\
6278 ered sequence\n    \"filter|f=s\"      => \\$param\
6279 s{filter}, # Low complexity filter name\n    \"ali\
6280 gnments|b=i\"  => \\$params{numal}, # Number of al\
6281 ignments\n    \"scores|s=i\"      => \\$params{sco\
6282 res}, # Number of scores\n    \"sensitivity|S=s\" \
6283 => \\$params{sensitivity}, # Search sensitivity\n \
6284    \"sort|t=s\"       => \\$params{sort}, # Sort h\
6285 its by...\n    \"stats|T=s\"       => \\$params{st\
6286 ats}, # Scoring statistic to use\n    \"strand|d=s\
6287 \"      => \\$params{strand}, # Strand to use in D\
6288 NA vs. DNA search\n    \"topcombon|c=i\"   => \\$p\
6289 arams{topcombon}, # Consistent sets of HSPs\n    \\
6290 "outfile=s\"       => \\$outfile, # Output file\n \
6291    \"outformat|o=s\"   => \\$outformat, # Output f\
6292 ormat\n    \"help|h\"         => \\$help, # Usage in\
6293 fo\n    \"async|a\"           => \\$async, # Asynchron\
6294 ous mode\n    \"polljob\"             => \\$polljob, # G\
6295 et results\n    \"status\"            => \\$status, # G\
6296 et job status\n    \"ids\"             => \\$ids, \
6297 # Get ids from result\n    \"jobid|j=s\"       => \
6298 \\$jobid, # JobId\n    \"email=s\"         => \\$p\
6299 arams{email}, # E-mail address\n    \"trace\"     \
6300       => \\$trace, # SOAP trace\n    \"sequence=s\\
6301 "      => \\$sequence, # Query sequence\n    );\n\\
6302 nmy $scriptName = basename($0, ());\nif($help || $\
6303 numOpts == 0) {\n    &usage();\n    exit(0);\n}\n\\
6304 nif($trace){\n    print STDERR \"Tracing active\\n\
6305 \";\n    SOAP::Lite->import(+trace => 'debug');\n}\
6306 \n\nmy $soap = SOAP::Lite\n    ->service($WSDL)\n \
6307    ->proxy('http://localhost/',\n    #proxy => ['h\
6308 ttp' => 'http://your.proxy.server/'], # HTTP proxy\
6309 \n    timeout => 600, # HTTP connection timeout\n \
6310    )\n    ->on_fault(sub { # SOAP fault handler\n \
6311        my $soap = shift;\n        my $res = shift;\
6312 \n        # Throw an exception for all faults\n   \
6313      if(ref($res) eq '') {\n            die($res);\
6314 \n        } else {\n            die($res->faultstr\
6315 ing);\n        }\n        return new SOAP::SOM;\n \
6316    }\n               );\n\nif( !($polljob || $stat\
6317 us || $ids) &&\n    !( defined($ARGV[0]) || define\
6318 d($sequence) )\n    ) {\n    print STDERR 'Error: \
6319 bad option combination', \"\\n\";\n    &usage();\n\
6320     exit(1);\n}\nelsif($polljob && defined($jobid)\
6321 ) {\n    print \"Getting results for job $jobid\\n\
6322 \";\n    getResults($jobid);\n}\nelsif($status && \
6323 defined($jobid)) {\n    print STDERR \"Getting sta\
6324 tus for job $jobid\\n\";\n    my $result = $soap->\
6325 checkStatus($jobid);\n    print STDOUT \"$result\\\
6326 n\";\n    if($result eq 'DONE') {\n     print STDERR \\
6327 "To get results: $scriptName --polljob --jobid $jo\
6328 bid\\n\";\n    }\n}  \nelsif($ids && defined($jobi\
6329 d)) {\n    print STDERR \"Getting ids from job $jo\
6330 bid\\n\";\n    getIds($jobid);\n}\nelse {\n    # P\
6331 repare input data\n    my $content;\n    my (@cont\
6332 ents) = ();\n    if(-f $ARGV[0] || $ARGV[0] eq '-'\
6333 ) {     \n      $content={type=>'sequence',content=>read_fi\
6334 le($ARGV[0])};  \n    }\n    if($sequence) {    \n      if(\
6335 -f $sequence || $sequence eq '-') {     \n          $conten\
6336 t={type=>'sequence',content=>read_file($ARGV[0])};\
6337         \n      } else {\n          $content={type=>'sequence',cont\
6338 ent=>$sequence};\n      }\n    }\n    push @contents, $\
6339 content;\n\n    # Submit the job\n    my $paramsDa\
6340 ta = SOAP::Data->name('params')->type(map=>\\%para\
6341 ms);\n    my $contentData = SOAP::Data->name('cont\
6342 ent')->value(\\@contents);\n    # For SOAP::Lite 0\
6343 .60 and earlier parameters are passed directly\n  \
6344   if($SOAP::Lite::VERSION eq '0.60' || $SOAP::Lite\
6345 ::VERSION =~ /0\\.[1-5]/) {\n        $jobid = $soa\
6346 p->runWUBlast($paramsData, $contentData);\n    }\n\
6347     # For SOAP::Lite 0.69 and later parameter hand\
6348 ling is different, so pass\n    # undef's for temp\
6349 lated params, and then pass the formatted args.\n \
6350    else {\n        $jobid = $soap->runWUBlast(unde\
6351 f, undef,\n                                $paramsData, $contentData);\n   \
6352  }\n\n    # Asynchronous mode: output jobid and ex\
6353 it.\n    if (defined($async)) {\n       print STDOUT $jo\
6354 bid, \"\\n\";\n        print STDERR \"To check sta\
6355 tus: $scriptName --status --jobid $jobid\\n\";\n  \
6356   }\n    # Synchronous mode: try to get results\n \
6357    else {\n        print STDERR \"JobId: $jobid\\n\
6358 \";\n        sleep 1;\n        getResults($jobid);\
6359 \n    }\n}\n\nsub getIds($) {\n    my $jobid = shi\
6360 ft;\n    my $results = $soap->getIds($jobid);\n   \
6361  for my $result (@$results){\n  print \"$result\\n\\
6362 ";\n    }\n}\n\nsub clientPoll($) {\n    my $jobid\
6363  = shift;\n    my $result = 'PENDING';\n    # Chec\
6364 k status and wait if not finished\n    while($resu\
6365 lt eq 'RUNNING' || $result eq 'PENDING') {\n      \
6366   $result = $soap->checkStatus($jobid);\n        p\
6367 rint STDERR \"$result\\n\";\n        if($result eq\
6368  'RUNNING' || $result eq 'PENDING') {\n           \
6369  # Wait before polling again.\n            sleep $\
6370 checkInterval;\n        }\n    }\n}\n\nsub getResu\
6371 lts($) {\n    my $jobid = shift;\n    my $res;\n  \
6372   # Check status, and wait if not finished\n    cl\
6373 ientPoll($jobid);\n    # Use JobId if output file \
6374 name is not defined\n    unless(defined($outfile))\
6375  {\n        $outfile=$jobid;\n    }\n    # Get lis\
6376 t of data types\n    my $resultTypes = $soap->getR\
6377 esults($jobid);\n    # Get the data and write it t\
6378 o a file\n    if(defined($outformat)) { # Specifie\
6379 d data type\n   if($outformat eq 'xml') {$outformat \
6380 = 'toolxml';}\n if($outformat eq 'txt') {$outforma\
6381 t = 'tooloutput';}\n        my $selResultType;\n  \
6382       foreach my $resultType (@$resultTypes) {\n  \
6383           if($resultType->{type} eq $outformat) {\\
6384 n                $selResultType = $resultType;\n  \
6385           }\n        }\n        $res=$soap->poll($\
6386 jobid, $selResultType->{type});\n       if($outfile eq '\
6387 -') {\n      write_file($outfile, $res);\n      } else \
6388 {\n         write_file($outfile.'.'.$selResultType->{e\
6389 xt}, $res);\n   }\n    } else { # Data types availab\
6390 le\n        # Write a file for each output type\n \
6391        for my $resultType (@$resultTypes){\n      \
6392       #print STDERR \"Getting $resultType->{type}\\
6393 \n\";\n            $res=$soap->poll($jobid, $resul\
6394 tType->{type});\n           if($outfile eq '-') {\n             wri\
6395 te_file($outfile, $res);\n          } else {\n          write_f\
6396 ile($outfile.'.'.$resultType->{ext}, $res);\n       \
6397 }\n        }\n    }\n}\n\nsub read_file($) {\n    \
6398 my $filename = shift;\n    my ($content, $buffer);\
6399 \n    if($filename eq '-') {\n  while(sysread(STDIN\
6400 , $buffer, 1024)) {\n       $content .= $buffer;\n      }\
6401 \n    }\n    else { # File\n    open(FILE, $filename)\
6402  or die \"Error: unable to open input file\";\n wh\
6403 ile(sysread(FILE, $buffer, 1024)) {\n       $content\
6404  .= $buffer;\n  }\n     close(FILE);\n    }\n    return\
6405  $content;\n}\n\nsub write_file($$) {\n    my ($fi\
6406 lename, $data) = @_;\n    print STDERR 'Creating r\
6407 esult file: ' . $filename . \"\\n\";\n    if($file\
6408 name eq '-') {\n        print STDOUT $data;\n    }\n    e\
6409 lse {\n open(FILE, \">$filename\") or die \"Error:\
6410  unable to open output file\";\n        syswrite(FILE, $d\
6411 ata);\n close(FILE);\n    }\n}\n\nsub usage {\n   \
6412  print STDERR <<EOF\nWU-BLAST\n========\n\nRapid s\
6413 equence database search programs utilizing the BLA\
6414 ST algorithm.\n   \n[Required]\n\n      --email   \
6415     : str  : user email address \n  -p, --program       \
6416     : str  : BLAST program to use: blastn, blastp,\
6417  blastx, \n                             tblastn or\
6418  tblastx\n  -D, --database    : str  : database to\
6419  search\n  seqFile           : file : query sequen\
6420 ce data file (\"-\" for STDIN)\n\n[Optional]\n\n  \
6421 -m, --matrix        : str  : scoring matrix\n  -E, --\
6422 exp         : real : 0<E<= 1000. Statistical significa\
6423 nce threshold\n                             for re\
6424 porting database sequence matches.\n  -e, --echofi\
6425 lter  :      : display the filtered query sequence\
6426  in the output\n  -f, --filter      : str  : activa\
6427 tes filtering of the query sequence\n  -b, --align\
6428 ments  : int  : number of alignments to be reporte\
6429 d\n  -s, --scores           : int  : number of scores to\
6430  be reported\n  -S, --sensitivity : str  :\n  -t, \
6431 --sort      : str  :\n  -T, --stats       : str  :\\
6432 n  -d, --strand      : str  : DNA strand to search\
6433  with in DNA vs. DNA searches \n  -c, --topcombon \
6434   :      :\n\n[General] \n\n  -h, --help       :  \
6435     : prints this help text\n  -a, --async      : \
6436      : forces to make an asynchronous query\n     \
6437  --status     :      : poll for the status of a jo\
6438 b\n      --polljob    :      : poll for the result\
6439 s of a job\n  -j, --jobid      : str  : jobid that\
6440  was returned when an asynchronous job \n         \
6441                    was submitted.\n  -O, --outfile\
6442     : str  : name of the file results should be wr\
6443 itten to \n                            (default is\
6444  based on the jobid; \"-\" for STDOUT)\n  -o, --ou\
6445 tformat  : str  : txt or xml output (no file is wr\
6446 itten)\n      --trace      :      : show SOAP messag\
6447 es being interchanged \n\nSynchronous job:\n\n  Th\
6448 e results/errors are returned as soon as the job i\
6449 s finished.\n  Usage: $scriptName --email <your\\@\
6450 email> [options...] seqFile\n  Returns: saves the \
6451 results to disk\n\nAsynchronous job:\n\n  Use this\
6452  if you want to retrieve the results at a later ti\
6453 me. The results \n  are stored for up to 24 hours.\
6454  \n  The asynchronous submission mode is recommend\
6455 ed when users are submitting \n  batch jobs or lar\
6456 ge database searches    \n  Usage: $scriptName --asyn\
6457 c --email <your\\@email> [options...] seqFile\n  R\
6458 eturns : jobid\n\n  Use the jobid to query for the\
6459  status of the job. \n  Usage: $scriptName --statu\
6460 s --jobid <jobId>\n  Returns : string indicating t\
6461 he status of the job:\n    DONE - job has finished\
6462 \n    RUNNING - job is running\n    NOT_FOUND - jo\
6463 b cannot be found\n    ERROR - the jobs has encoun\
6464 tered an error\n\n  When done, use the jobid to re\
6465 trieve the status of the job. \n  Usage: $scriptNa\
6466 me --polljob --jobid <jobId> [--outfile string]\n \
6467  Returns: saves the results to disk\n\n[Help]\n\nF\
6468 or more detailed help information refer to \nhttp:\
6469 //www.ebi.ac.uk/blast2/WU-Blast2_Help_frame.html\n\
6470  \nEOF\n;\n}\n","\nmy $WSDL = 'http://www.ebi.ac.u\
6471 k/Tools/webservices/wsdl/WSBlastpgp.wsdl';\n\nuse \
6472 SOAP::Lite;\nuse Getopt::Long qw(:config no_ignore\
6473 _case bundling);\nuse File::Basename;\n\nmy $check\
6474 Interval = 15;\n\nmy %params=(\n            'async' => '1\
6475 ', # Use async mode and simulate sync mode in clie\
6476 nt\n        );\nGetOptions(\n    \"mode=s\"          \
6477  => \\$params{mode}, # Search mode: PSI-Blast or P\
6478 HI-Blast\n    \"database|d=s\"     => \\$params{da\
6479 tabase}, # Database to search\n    \"matrix|M=s\" \
6480       => \\$params{matrix},# Scoring maxtrix\n    \
6481 \"exp|e=f\"          => \\$params{exp}, # E-value\\
6482 n    \"expmulti|h=f\"     => \\$params{expmulti}, \
6483 # E-value\n    \"filter|F=s\"       => \\$params{f\
6484 ilter}, # Low complexity filter\n    \"dropoff|X=i\
6485 \"      => \\$params{dropoff}, # Dropoff score\n  \
6486   \"finaldropoff|Z=i\" => \\$params{finaldropoff},\
6487  # Final dropoff score\n    \"scores|v=i\"       =\
6488 > \\$params{scores}, # Max number of scores\n    \\
6489 "align=i\"          => \\$params{align}, # Alignme\
6490 nt view\n    \"startregion|S=i\"  => \\$params{sta\
6491 rtregion}, # Start of region in query\n    \"endre\
6492 gion|H=i\"    => \\$params{endregion}, # End of re\
6493 gion in query\n    \"maxpasses|j=i\"    => \\$para\
6494 ms{maxpasses}, # Number of PSI iterations\n    \"o\
6495 pengap|G=i\"      => \\$params{opengap}, # Gap ope\
6496 n penalty\n    \"extendgap|E=i\"    => \\$params{e\
6497 xtendgap}, # Gap extension penalty\n    \"pattern=\
6498 s\"        => \\$params{pattern}, # PHI-BLAST patt\
6499 ern\n    \"usagemode|p=s\"    => \\$params{usagemo\
6500 de}, # PHI-BLAST program\n    \"appxml=s\"        \
6501  => \\$params{appxml}, # Application XML\n    \"se\
6502 quence=s\"       => \\$sequence, # Query sequence\\
6503 n    \"help\"          => \\$help, # Usage info\n   \
6504  \"polljob\"           => \\$polljob, # Get results\n\
6505     \"status\"         => \\$status, # Get status\n\
6506     \"ids\"                    => \\$ids, # Get ids from\
6507  result\n    \"jobid=s\"          => \\$jobid, # J\
6508 obId\n    \"outfile=s\"        => \\$outfile, # Ou\
6509 tput filename\n    \"outformat|o=s\"    => \\$outf\
6510 ormat, # Output file format\n    \"async|a\"         \
6511   => \\$async, # Async submission\n    \"email=s\"\
6512           => \\$params{email}, # User e-mail addre\
6513 ss\n    \"trace\"            => \\$trace, # Show S\
6514 OAP messages\n    );\n\nmy $scriptName = basename(\
6515 $0, ());\nif($help) {\n    &usage();\n    exit(0);\
6516 \n}\n\nif ($trace){\n    print \"Tracing active\\n\
6517 \";\n    SOAP::Lite->import(+trace => 'debug');\n}\
6518 \n\nmy $soap = SOAP::Lite\n    ->service($WSDL)\n \
6519    ->on_fault(sub {\n        my $soap = shift;\n  \
6520       my $res = shift;\n        # Throw an excepti\
6521 on for all faults\n        if(ref($res) eq '') {\n\
6522             die($res);\n        } else {\n        \
6523     die($res->faultstring);\n        }\n        re\
6524 turn new SOAP::SOM;\n    }\n               );\n\ni\
6525 f( !($polljob || $status || $ids) &&\n    !( (defi\
6526 ned($ARGV[0]) && -f $ARGV[0]) || defined($sequence\
6527 ) )\n    ) {\n    print STDERR 'Error: bad option \
6528 combination', \"\\n\";\n    &usage();\n    exit(1)\
6529 ;\n}\nelsif($polljob && defined($jobid)) {\n    pr\
6530 int \"Getting results for job $jobid\\n\";\n    ge\
6531 tResults($jobid);\n}\nelsif($status && defined($jo\
6532 bid)) {\n    print STDERR \"Getting status for job\
6533  $jobid\\n\";\n    my $result = $soap->checkStatus\
6534 ($jobid);\n    print STDOUT $result, \"\\n\";\n   \
6535  if($result eq 'DONE') {\n      print STDERR \"To get r\
6536 esults: $scriptName --polljob --jobid $jobid\\n\";\
6537 \n    }\n}  \nelsif($ids && defined($jobid)) {\n  \
6538   print STDERR \"Getting ids from job $jobid\\n\";\
6539 \n    getIds($jobid);\n}\nelse {\n    if(-f $ARGV[\
6540 0]) {   \n      $content={type=>'sequence', content=>read\
6541 _file($ARGV[0])};       \n    }\n    if($sequence) {    \n      \
6542 if(-f $sequence) {\n        $content={type=>'sequence\
6543 ', content=>read_file($sequence)};      \n      } else {\n       \
6544    $content={type=>'sequence', content=>$sequence}\
6545 ;\n     }\n    }\n    push @content, $content;\n\n    \
6546 my $jobid;\n    my $paramsData = SOAP::Data->name(\
6547 'params')->type(map=>\\%params);\n    my $contentD\
6548 ata = SOAP::Data->name('content')->value(\\@conten\
6549 t);\n    # For SOAP::Lite 0.60 and earlier paramet\
6550 ers are passed directly\n    if($SOAP::Lite::VERSI\
6551 ON eq '0.60' || $SOAP::Lite::VERSION =~ /0\\.[1-5]\
6552 /) {\n        $jobid = $soap->runBlastpgp($paramsD\
6553 ata, $contentData);\n    }\n    # For SOAP::Lite 0\
6554 .69 and later parameter handling is different, so \
6555 pass\n    # undef's for templated params, and then\
6556  pass the formatted args.\n    else {\n        $jo\
6557 bid = $soap->runBlastpgp(undef, undef,\n                                    $p\
6558 aramsData, $contentData);\n    }\n\n    if (define\
6559 d($async)) {\n  print STDOUT $jobid, \"\\n\";\n    \
6560     print STDERR \"To check status: $scriptName --\
6561 status --jobid $jobid\\n\";\n    } else { # Synchr\
6562 onous mode\n        print STDERR \"JobId: $jobid\\\
6563 n\";\n        sleep 1;\n        getResults($jobid)\
6564 ;\n    }\n}\n\nsub getIds($) {\n    $jobid = shift\
6565 ;\n    my $results = $soap->getIds($jobid);\n    f\
6566 or $result (@$results){\n       print \"$result\\n\";\n \
6567    }\n}\n\nsub clientPoll($) {\n    my $jobid = sh\
6568 ift;\n    my $result = 'PENDING';\n    # Check sta\
6569 tus and wait if not finished\n    #print STDERR \"\
6570 Checking status: $jobid\\n\";\n    while($result e\
6571 q 'RUNNING' || $result eq 'PENDING') {\n        $r\
6572 esult = $soap->checkStatus($jobid);\n        print\
6573  STDERR \"$result\\n\";\n        if($result eq 'RU\
6574 NNING' || $result eq 'PENDING') {\n            # W\
6575 ait before polling again.\n            sleep $chec\
6576 kInterval;\n        }\n    }\n}\n\nsub getResults(\
6577 $) {\n    $jobid = shift;\n    # Check status, and\
6578  wait if not finished\n    clientPoll($jobid);\n  \
6579   # Use JobId if output file name is not defined\n\
6580     unless(defined($outfile)) {\n        $outfile=\
6581 $jobid;\n    }\n    # Get list of data types\n    \
6582 my $resultTypes = $soap->getResults($jobid);\n    \
6583 # Get the data and write it to a file\n    if(defi\
6584 ned($outformat)) { # Specified data type\n        \
6585 my $selResultType;\n        foreach my $resultType\
6586  (@$resultTypes) {\n            if($resultType->{t\
6587 ype} eq $outformat) {\n                $selResultT\
6588 ype = $resultType;\n            }\n        }\n    \
6589     $res=$soap->poll($jobid, $selResultType->{type\
6590 });\n        write_file($outfile.'.'.$selResultTyp\
6591 e->{ext}, $res);\n    } else { # Data types availa\
6592 ble\n        # Write a file for each output type\n\
6593         for my $resultType (@$resultTypes){\n     \
6594        #print \"Getting $resultType->{type}\\n\";\\
6595 n            $res=$soap->poll($jobid, $resultType-\
6596 >{type});\n            write_file($outfile.'.'.$re\
6597 sultType->{ext}, $res);\n        }\n    }\n}\n\nsu\
6598 b read_file($) {\n    my $filename = shift;\n    o\
6599 pen(FILE, $filename);\n    my $content;\n    my $b\
6600 uffer;\n    while(sysread(FILE, $buffer, 1024)) {\\
6601 n       $content.= $buffer;\n    }\n    close(FILE);  \n\
6602     return $content;\n}\n\nsub write_file($$) {\n \
6603    my ($tmp,$entity) = @_;\n    print STDERR \"Cre\
6604 ating result file: \".$tmp.\"\\n\";\n    unless(op\
6605 en (FILE, \">$tmp\")) {\n       return 0;\n    }\n    sy\
6606 swrite(FILE, $entity);\n    close (FILE);\n    ret\
6607 urn 1;\n}\n\nsub usage {\n    print STDERR <<EOF\n\
6608 Blastpgp\n========\n   \nThe blastpgp program impl\
6609 ements the PSI-BLAST and PHI-BLAST variations\nof \
6610 NCBI BLAST.\n\nFor more detailed help information \
6611 refer to\nhttp://www.ebi.ac.uk/blastpgp/blastpsi_h\
6612 elp_frame.html\n \nBlastpgp specific options:\n\n[\
6613 Required]\n\n      --mode            : str  : sear\
6614 ch mode to use: PSI-Blast or PHI-Blast\n  -d, --da\
6615 tabase        : str  : protein database to search\\
6616 n  seqFile               : file : query sequence\n\
6617 \n[Optional]\n\n  -M, --matrix          : str  : s\
6618 coring matrix\n  -e, --exp             : real : Ex\
6619 pectation value\n  -h, --expmulti        : real : \
6620 threshold (multipass model)\n  -F, --filter       \
6621    : str  : filter query sequence with SEG [T,F]\n\
6622   -m, --align           : int  : alignment view op\
6623 tion:\n                                 0 - pairwi\
6624 se, 1 - M/S identities,\n                         \
6625         2 - M/S non-identities, 3 - Flat identitie\
6626 s,\n                                 4 - Flat non-\
6627 identities\n  -G, --opengap         : int  : cost \
6628 to open a gap\n  -E, --extendgap       : int  : co\
6629 st to extend a gap\n  -g, --gapalign        : str \
6630  : Gapped [T,F]\n  -v, --scores          : int  : \
6631 number of scores to be reported\n  -j, --maxpasses\
6632        : int  : number of iterations\n  -X, --drop\
6633 off         : int  : Dropoff score\n  -Z, --finald\
6634 ropoff    : int  : Dropoff for final alignment\n  \
6635 -S, --startregion     : int  : Start of required r\
6636 egion in query\n  -H, --endregion       : int  : E\
6637 nd of required region in query\n  -k, --pattern   \
6638       : str  : Hit File (PHI-BLAST only)\n  -p, --\
6639 usagemode       : str  : Program option (PHI-BLAST\
6640  only):\n                                 blastpgp\
6641 , patseedp, seedp\n\n[General]\n\n      --help    \
6642         :      : prints this help text\n  -a, --as\
6643 ync           :      : forces to make an asynchron\
6644 ous query\n      --status          :      : poll f\
6645 or the status of a job\n      --polljob         : \
6646      : poll for the results of a job\n      --jobi\
6647 d           : str  : jobid of an asynchronous job\\
6648 n      --ids             :      : get hit identifi\
6649 ers for result \n  -O, --outfile         : str  : \
6650 name of the file results should be written to\n   \
6651                               (default is based on\
6652  the jobid)\n  -o, --outformat       : str  : txt \
6653 or xml output (no file is written)\n      --trace \
6654           :      : show SOAP messages being interc\
6655 hanged\n\nSynchronous job:\n\n  The results/errors\
6656  are returned as soon as the job is finished.\n  U\
6657 sage: blastpgp.pl --email <your@email> [options...\
6658 ] seqfile\n  Returns: saves the results to disk\n\\
6659 nAsynchronous job:\n\n  Use this if you want to re\
6660 trieve the results at a later time. The results\n \
6661  are stored for up to 24 hours.\n  The asynchronou\
6662 s submission mode is recommended when users are su\
6663 bmitting\n  batch jobs or large database searches\\
6664 n  Usage: blastpgp.pl --email <your@email> --async\
6665  [options...] seqFile\n  Returns: jobid\n\n  Use t\
6666 he jobid to query for the status of the job.\n  Us\
6667 age: blastpgp.pl --status --jobid <jobId>\n  Retur\
6668 ns: string indicating the status of the job\n    D\
6669 ONE - job has finished\n    RUNNING - job is runni\
6670 ng\n    NOT_FOUND - job cannot be found\n    ERROR\
6671  - the jobs has encountered an error\n\n  When don\
6672 e, use the jobid to retrieve the results of the jo\
6673 b.\n  Usage: blastpgp.pl --polljob --jobid <jobId>\
6674  [--outfile <fileName>]\n  Returns: saves the resu\
6675 lts to disk\nEOF\n;\n}\n","\n=head1 NAME\n\nncbibl\
6676 ast_lwp.pl\n\n=head1 DESCRIPTION\n\nNCBI BLAST (RE\
6677 ST) web service Perl client using L<LWP>.\n\nTeste\
6678 d with:\n\n=over\n\n=item *\nL<LWP> 5.79, L<XML::S\
6679 imple> 2.12 and Perl 5.8.3\n\n=item *\nL<LWP> 5.80\
6680 8, L<XML::Simple> 2.18 and Perl 5.8.8 (Ubuntu 8.04\
6681  LTS)\n\n=item *\nL<LWP> 5.834, L<XML::Simple> 2.1\
6682 8 and Perl 5.10.1 (Ubuntu 10.04 LTS)\n\n=item *\nL\
6683 <LWP> 6.03, L<XML::Simple> 2.18 and Perl 5.14.2 (U\
6684 buntu 12.04 LTS)\n\n=back\n\nFor further informati\
6685 on see:\n\n=over\n\n=item *\nL<http://www.ebi.ac.u\
6686 k/Tools/webservices/services/sss/ncbi_blast_rest>\\
6687 n\n=item *\nL<http://www.ebi.ac.uk/Tools/webservic\
6688 es/tutorials/perl>\n\n=back\n\n=head1 LICENSE\n\nC\
6689 opyright 2012-2013 EMBL - European Bioinformatics \
6690 Institute\n\nLicensed under the Apache License, Ve\
6691 rsion 2.0 (the \"License\");\nyou may not use this\
6692  file except in compliance with the License.\nYou \
6693 may obtain a copy of the License at\n\n    http://\
6694 www.apache.org/licenses/LICENSE-2.0\n\nUnless requ\
6695 ired by applicable law or agreed to in writing, so\
6696 ftware\ndistributed under the License is distribut\
6697 ed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR C\
6698 ONDITIONS OF ANY KIND, either express or implied.\\
6699 nSee the License for the specific language governi\
6700 ng permissions and\nlimitations under the License.\
6701 \n\n=head1 VERSION\n\n$Id: ncbiblast_lwp.pl 2560 2\
6702 013-03-20 12:56:31Z hpm $\n\n=cut\n\nuse strict;\n\
6703 use warnings;\n\nuse English;\nuse LWP;\nuse XML::\
6704 Simple;\nuse Getopt::Long qw(:config no_ignore_cas\
6705 e bundling);\nuse File::Basename;\nuse Data::Dumpe\
6706 r;\n\nmy $baseUrl = 'http://www.ebi.ac.uk/Tools/se\
6707 rvices/rest/ncbiblast';\n\nmy $checkInterval = 3;\\
6708 n\nmy $outputLevel = 1;\n\nmy $numOpts = scalar(@A\
6709 RGV);\nmy %params = ( 'debugLevel' => 0 );\n\nmy %\
6710 tool_params = ();\nGetOptions(\n\n      # Tool specific\
6711  options\n      'program|p=s'  => \\$tool_params{'progr\
6712 am'},   # blastp, blastn, blastx, etc.\n        'database\
6713 |D=s' => \\$params{'database'},       # Database(s\
6714 ) to search\n   'matrix|m=s'   => \\$tool_params{'ma\
6715 trix'},    # Scoring martix to use\n    'exp|E=f'    \
6716   => \\$tool_params{'exp'},       # E-value thresh\
6717 old\n   'filter|f=s'   => \\$tool_params{'filter'}, \
6718    # Low complexity filter\n    'align|A=i'    => \\$\
6719 tool_params{'align'},     # Pairwise alignment for\
6720 mat\n   'scores|s=i'   => \\$tool_params{'scores'}, \
6721    # Number of scores\n 'alignments|n=i' => \\$too\
6722 l_params{'alignments'},   # Number of alignments\n\
6723         'dropoff|d=i'    => \\$tool_params{'dropoff'},   \
6724    # Dropoff score\n    'match_scores=s' => \\$tool_p\
6725 arams{'match_scores'}, # Match/missmatch scores\n       \
6726 'match|u=i'      => \\$params{'match'},           \
6727   # Match score\n       'mismatch|v=i'   => \\$params{'m\
6728 ismatch'},          # Mismatch score\n  'gapopen|o=\
6729 i'    => \\$tool_params{'gapopen'},      # Open ga\
6730 p penalty\n     'gapext|x=i'     => \\$tool_params{'ga\
6731 pext'},       # Gap extension penality\n        'gapalign\
6732 |g'     => \\$tool_params{'gapalign'},     # Optim\
6733 ise gap alignments\n    'stype=s' => \\$tool_params{'\
6734 stype'},    # Sequence type\n   'seqrange=s' => \\$t\
6735 ool_params{'seqrange'},    # Query subsequence\n        '\
6736 sequence=s' => \\$params{'sequence'},         # Qu\
6737 ery sequence\n  'multifasta' => \\$params{'multifas\
6738 ta'},       # Multiple fasta input\n\n  # Compatabi\
6739 lity options, old command-line\n        'numal|n=i'     =\
6740 > \\$params{'numal'},        # Number of alignment\
6741 s\n     'opengap|o=i'   => \\$params{'opengap'},      \
6742 # Open gap penalty\n    'extendgap|x=i' => \\$params{\
6743 'extendgap'},    # Gap extension penality\n     \n      # G\
6744 eneric options\n        'email=s'       => \\$params{'ema\
6745 il'},          # User e-mail address\n  'title=s'  \
6746      => \\$params{'title'},          # Job title\n\
6747         'outfile=s'     => \\$params{'outfile'},        #\
6748  Output file name\n     'outformat=s'   => \\$params{'\
6749 outformat'},      # Output file type\n  'jobid=s'  \
6750      => \\$params{'jobid'},          # JobId\n  'he\
6751 lp|h'        => \\$params{'help'},           # Usa\
6752 ge help\n       'async'         => \\$params{'async'},  \
6753         # Asynchronous submission\n     'polljob'     \
6754   => \\$params{'polljob'},        # Get results\n       \
6755 'resultTypes'   => \\$params{'resultTypes'},    # \
6756 Get result types\n      'status'        => \\$params{'s\
6757 tatus'},         # Get status\n 'params'        =>\
6758  \\$params{'params'},         # List input paramet\
6759 ers\n   'paramDetail=s' => \\$params{'paramDetail'},\
6760     # Get details for parameter\n       'quiet'         \
6761 => \\$params{'quiet'},          # Decrease output \
6762 level\n 'verbose'       => \\$params{'verbose'},  \
6763       # Increase output level\n 'debugLevel=i'  =>\
6764  \\$params{'debugLevel'},     # Debug output level\
6765 \n      'baseUrl=s'     => \\$baseUrl,                 \
6766  # Base URL for service.\n);\nif ( $params{'verbos\
6767 e'} ) { $outputLevel++ }\nif ( $params{'quiet'} ) \
6768  { $outputLevel-- }\n\n&print_debug_message( 'MAIN\
6769 ', 'LWP::VERSION: ' . $LWP::VERSION,\n  1 );\n\n&pr\
6770 int_debug_message( 'MAIN', \"params:\\n\" . Dumper\
6771 ( \\%params ),           11 );\n&print_debug_messa\
6772 ge( 'MAIN', \"tool_params:\\n\" . Dumper( \\%tool_\
6773 params ), 11 );\n\nmy $ua;\n\nmy $scriptName = bas\
6774 ename( $0, () );\n\nif ( $params{'help'} || $numOp\
6775 ts == 0 ) {\n   &usage();\n     exit(0);\n}\n\n&print_de\
6776 bug_message( 'MAIN', 'baseUrl: ' . $baseUrl, 1 );\\
6777 n\nif (\n       !(\n               $params{'polljob'}\n         || $param\
6778 s{'resultTypes'}\n              || $params{'status'}\n          || $pa\
6779 rams{'params'}\n                || $params{'paramDetail'}\n     )\n     \
6780 && !( defined( $ARGV[0] ) || defined( $params{'seq\
6781 uence'} ) )\n  )\n{\n\n # Bad argument combination\
6782 , so print error message and usage\n    print STDERR \
6783 'Error: bad option combination', \"\\n\";\n     &usage\
6784 ();\n   exit(1);\n}\n\nelsif ( $params{'params'} ) {\
6785 \n      &print_tool_params();\n}\n\nelsif ( $params{'pa\
6786 ramDetail'} ) {\n       &print_param_details( $params{'p\
6787 aramDetail'} );\n}\n\nelsif ( $params{'status'} &&\
6788  defined( $params{'jobid'} ) ) {\n      &print_job_stat\
6789 us( $params{'jobid'} );\n}\n\nelsif ( $params{'res\
6790 ultTypes'} && defined( $params{'jobid'} ) ) {\n &p\
6791 rint_result_types( $params{'jobid'} );\n}\n\nelsif\
6792  ( $params{'polljob'} && defined( $params{'jobid'}\
6793  ) ) {\n        &get_results( $params{'jobid'} );\n}\n\ne\
6794 lse {\n\n       # Multiple input sequence mode, assume f\
6795 asta format.\n  if ( $params{'multifasta'} ) {\n                &\
6796 multi_submit_job();\n   }\n\n   # Entry identifier lis\
6797 t file.\n       elsif (( defined( $params{'sequence'} ) \
6798 && $params{'sequence'} =~ m/^\\@/ )\n           || ( define\
6799 d( $ARGV[0] ) && $ARGV[0] =~ m/^\\@/ ) )\n      {\n             my\
6800  $list_filename = $params{'sequence'} || $ARGV[0];\
6801 \n              $list_filename =~ s/^\\@//;\n           &list_file_subm\
6802 it_job($list_filename);\n       }\n\n   # Default: single \
6803 sequence/identifier.\n  else {\n\n              # Load the sequ\
6804 ence data and submit.\n         &submit_job( &load_data()\
6805  );\n   }\n}\n\n=head1 FUNCTIONS\n\n=cut\n\n\n=head2\
6806  rest_user_agent()\n\nGet a LWP UserAgent to use t\
6807 o perform REST requests.\n\n  my $ua = &rest_user_\
6808 agent();\n\n=cut\n\nsub rest_user_agent() {\n   prin\
6809 t_debug_message( 'rest_user_agent', 'Begin', 21 );\
6810 \n      # Create an LWP UserAgent for making HTTP calls\
6811 .\n     my $ua = LWP::UserAgent->new();\n       # Set 'User-\
6812 Agent' HTTP header to identifiy the client.\n   '$Re\
6813 vision: 2560 $' =~ m/(\\d+)/;\n $ua->agent(\"EBI-S\
6814 ample-Client/$1 ($scriptName; $OSNAME) \" . $ua->a\
6815 gent());\n      # Configure HTTP proxy support from env\
6816 ironment.\n     $ua->env_proxy;\n       print_debug_message(\
6817  'rest_user_agent', 'End', 21 );\n      return $ua;\n}\\
6818 n\n=head2 rest_error()\n\nCheck a REST response fo\
6819 r an error condition. An error is mapped to a die.\
6820 \n\n  &rest_error($response, $content_data);\n\n=c\
6821 ut\n\nsub rest_error() {\n      print_debug_message( 'r\
6822 est_error', 'Begin', 21 );\n    my $response = shift;\
6823 \n      my $contentdata;\n      if(scalar(@_) > 0) {\n          $con\
6824 tentdata = shift;\n     }\n     if(!defined($contentdata) \
6825 || $contentdata eq '') {\n              $contentdata = $respon\
6826 se->content();\n        }\n     # Check for HTTP error codes\\
6827 n       if ( $response->is_error ) {\n          my $error_messag\
6828 e = '';\n               # HTML response.\n              if(     $contentdata =~\
6829  m/<h1>([^<]+)<\\/h1>/ ) {\n                    $error_message = $1\
6830 ;\n             }\n             #  XML response.\n              elsif($contentdata =\
6831 ~ m/<description>([^<]+)<\\/description>/) {\n                  $\
6832 error_message = $1;\n           }\n             die 'http status: ' . \
6833 $response->code . ' ' . $response->message . '  ' \
6834 . $error_message;\n     }\n     print_debug_message( 'rest\
6835 _error', 'End', 21 );\n}\n\n=head2 rest_request()\\
6836 n\nPerform a REST request (HTTP GET).\n\n  my $res\
6837 ponse_str = &rest_request($url);\n\n=cut\n\nsub re\
6838 st_request {\n  print_debug_message( 'rest_request'\
6839 , 'Begin', 11 );\n      my $requestUrl = shift;\n       print\
6840 _debug_message( 'rest_request', 'URL: ' . $request\
6841 Url, 11 );\n\n  # Get an LWP UserAgent.\n       $ua = &re\
6842 st_user_agent() unless defined($ua);\n  # Available\
6843  HTTP compression methods.\n    my $can_accept;\n       eva\
6844 l {\n       $can_accept = HTTP::Message::decodable()\
6845 ;\n     };\n    $can_accept = '' unless defined($can_acce\
6846 pt);\n  # Perform the request\n my $response = $ua-\
6847 >get($requestUrl,\n             'Accept-Encoding' => $can_acc\
6848 ept, # HTTP compression.\n      );\n    print_debug_messag\
6849 e( 'rest_request', 'HTTP status: ' . $response->co\
6850 de,\n           11 );\n print_debug_message( 'rest_request'\
6851 ,\n             'response length: ' . length($response->conte\
6852 nt()), 11 );\n  print_debug_message( 'rest_request'\
6853 ,\n             'request:' .\"\\n\" . $response->request()->a\
6854 s_string(), 32 );\n     print_debug_message( 'rest_req\
6855 uest',\n                'response: ' . \"\\n\" . $response->as_s\
6856 tring(), 32 );\n        # Unpack possibly compressed resp\
6857 onse.\n my $retVal;\n   if ( defined($can_accept) &&\
6858  $can_accept ne '') {\n     $retVal = $response->d\
6859 ecoded_content();\n     }\n     # If unable to decode use \
6860 orginal content.\n      $retVal = $response->content() \
6861 unless defined($retVal);\n      # Check for an error.\n\
6862         &rest_error($response, $retVal);\n      print_debug_me\
6863 ssage( 'rest_request', 'retVal: ' . $retVal, 12 );\
6864 \n      print_debug_message( 'rest_request', 'End', 11 \
6865 );\n\n  # Return the response data\n    return $retVal\
6866 ;\n}\n\n=head2 rest_get_parameters()\n\nGet list o\
6867 f tool parameter names.\n\n  my (@param_list) = &r\
6868 est_get_parameters();\n\n=cut\n\nsub rest_get_para\
6869 meters {\n      print_debug_message( 'rest_get_paramete\
6870 rs', 'Begin', 1 );\n    my $url                = $bas\
6871 eUrl . '/parameters/';\n        my $param_list_xml_str = \
6872 rest_request($url);\n   my $param_list_xml     = XML\
6873 in($param_list_xml_str);\n      my (@param_list)       \
6874 = @{ $param_list_xml->{'id'} };\n       print_debug_mess\
6875 age( 'rest_get_parameters', 'End', 1 );\n       return (\
6876 @param_list);\n}\n\n=head2 rest_get_parameter_deta\
6877 ils()\n\nGet details of a tool parameter.\n\n  my \
6878 $paramDetail = &rest_get_parameter_details($param_\
6879 name);\n\n=cut\n\nsub rest_get_parameter_details {\
6880 \n      print_debug_message( 'rest_get_parameter_detail\
6881 s', 'Begin', 1 );\n     my $parameterId = shift;\n      pri\
6882 nt_debug_message( 'rest_get_parameter_details',\n       \
6883         'parameterId: ' . $parameterId, 1 );\n  my $url   \
6884                = $baseUrl . '/parameterdetails/' .\
6885  $parameterId;\n        my $param_detail_xml_str = rest_r\
6886 equest($url);\n my $param_detail_xml     = XMLin($\
6887 param_detail_xml_str);\n        print_debug_message( 'res\
6888 t_get_parameter_details', 'End', 1 );\n return ($p\
6889 aram_detail_xml);\n}\n\n=head2 rest_run()\n\nSubmi\
6890 t a job.\n\n  my $job_id = &rest_run($email, $titl\
6891 e, \\%params );\n\n=cut\n\nsub rest_run {\n     print_\
6892 debug_message( 'rest_run', 'Begin', 1 );\n      my $ema\
6893 il  = shift;\n  my $title  = shift;\n   my $params = \
6894 shift;\n        print_debug_message( 'rest_run', 'email: \
6895 ' . $email, 1 );\n      if ( defined($title) ) {\n              pri\
6896 nt_debug_message( 'rest_run', 'title: ' . $title, \
6897 1 );\n  }\n     print_debug_message( 'rest_run', 'param\
6898 s: ' . Dumper($params), 1 );\n\n        # Get an LWP User\
6899 Agent.\n        $ua = &rest_user_agent() unless defined($\
6900 ua);\n\n        # Clean up parameters\n my (%tmp_params) \
6901 = %{$params};\n $tmp_params{'email'} = $email;\n        $\
6902 tmp_params{'title'} = $title;\n foreach my $param_\
6903 name ( keys(%tmp_params) ) {\n          if ( !defined( $tm\
6904 p_params{$param_name} ) ) {\n                   delete $tmp_params\
6905 {$param_name};\n                }\n     }\n\n   # Submit the job as a \
6906 POST\n  my $url = $baseUrl . '/run';\n  my $response\
6907  = $ua->post( $url, \\%tmp_params );\n  print_debug\
6908 _message( 'rest_run', 'HTTP status: ' . $response-\
6909 >code, 11 );\n  print_debug_message( 'rest_run',\n      \
6910         'request:' .\"\\n\" . $response->request()->as_st\
6911 ring(), 11 );\n print_debug_message( 'rest_run',\n\
6912                 'response: ' . length($response->as_string()) . \
6913 \"\\n\" . $response->as_string(), 11 );\n\n     # Chec\
6914 k for an error.\n       &rest_error($response);\n\n     # Th\
6915 e job id is returned\n  my $job_id = $response->con\
6916 tent();\n       print_debug_message( 'rest_run', 'End', \
6917 1 );\n  return $job_id;\n}\n\n=head2 rest_get_statu\
6918 s()\n\nCheck the status of a job.\n\n  my $status \
6919 = &rest_get_status($job_id);\n\n=cut\n\nsub rest_g\
6920 et_status {\n   print_debug_message( 'rest_get_statu\
6921 s', 'Begin', 1 );\n     my $job_id = shift;\n   print_de\
6922 bug_message( 'rest_get_status', 'jobid: ' . $job_i\
6923 d, 2 );\n       my $status_str = 'UNKNOWN';\n   my $url   \
6924      = $baseUrl . '/status/' . $job_id;\n       $status_\
6925 str = &rest_request($url);\n    print_debug_message( \
6926 'rest_get_status', 'status_str: ' . $status_str, 2\
6927  );\n   print_debug_message( 'rest_get_status', 'End\
6928 ', 1 );\n       return $status_str;\n}\n\n=head2 rest_ge\
6929 t_result_types()\n\nGet list of result types for f\
6930 inished job.\n\n  my (@result_types) = &rest_get_r\
6931 esult_types($job_id);\n\n=cut\n\nsub rest_get_resu\
6932 lt_types {\n    print_debug_message( 'rest_get_result\
6933 _types', 'Begin', 1 );\n        my $job_id = shift;\n   pri\
6934 nt_debug_message( 'rest_get_result_types', 'jobid:\
6935  ' . $job_id, 2 );\n    my (@resultTypes);\n    my $url \
6936                      = $baseUrl . '/resulttypes/' \
6937 . $job_id;\n    my $result_type_list_xml_str = &rest_\
6938 request($url);\n        my $result_type_list_xml     = XM\
6939 Lin($result_type_list_xml_str);\n       (@resultTypes) =\
6940  @{ $result_type_list_xml->{'type'} };\n        print_deb\
6941 ug_message( 'rest_get_result_types',\n          scalar(@re\
6942 sultTypes) . ' result types', 2 );\n    print_debug_m\
6943 essage( 'rest_get_result_types', 'End', 1 );\n  ret\
6944 urn (@resultTypes);\n}\n\n=head2 rest_get_result()\
6945 \n\nGet result data of a specified type for a fini\
6946 shed job.\n\n  my $result = rest_get_result($job_i\
6947 d, $result_type);\n\n=cut\n\nsub rest_get_result {\
6948 \n      print_debug_message( 'rest_get_result', 'Begin'\
6949 , 1 );\n        my $job_id = shift;\n   my $type   = shift;\
6950 \n      print_debug_message( 'rest_get_result', 'jobid:\
6951  ' . $job_id, 1 );\n    print_debug_message( 'rest_ge\
6952 t_result', 'type: ' . $type,    1 );\n  my $url    \
6953 = $baseUrl . '/result/' . $job_id . '/' . $type;\n\
6954         my $result = &rest_request($url);\n     print_debug_m\
6955 essage( 'rest_get_result', length($result) . ' cha\
6956 racters',\n             1 );\n  print_debug_message( 'rest_get\
6957 _result', 'End', 1 );\n return $result;\n}\n\n\n=h\
6958 ead2 print_debug_message()\n\nPrint debug message \
6959 at specified debug level.\n\n  &print_debug_messag\
6960 e($method_name, $message, $level);\n\n=cut\n\nsub \
6961 print_debug_message {\n my $function_name = shift;\
6962 \n      my $message       = shift;\n    my $level         \
6963 = shift;\n      if ( $level <= $params{'debugLevel'} ) \
6964 {\n             print STDERR '[', $function_name, '()] ', $me\
6965 ssage, \"\\n\";\n       }\n}\n\n=head2 print_tool_params\
6966 ()\n\nPrint list of tool parameters.\n\n  &print_t\
6967 ool_params();\n\n=cut\n\nsub print_tool_params {\n\
6968         print_debug_message( 'print_tool_params', 'Begin'\
6969 , 1 );\n        my (@param_list) = &rest_get_parameters()\
6970 ;\n     foreach my $param ( sort(@param_list) ) {\n             p\
6971 rint $param, \"\\n\";\n }\n     print_debug_message( '\
6972 print_tool_params', 'End', 1 );\n}\n\n=head2 print\
6973 _param_details()\n\nPrint details of a tool parame\
6974 ter.\n\n  &print_param_details($param_name);\n\n=c\
6975 ut\n\nsub print_param_details {\n       print_debug_mess\
6976 age( 'print_param_details', 'Begin', 1 );\n     my $pa\
6977 ramName = shift;\n      print_debug_message( 'print_par\
6978 am_details', 'paramName: ' . $paramName, 2 );\n my\
6979  $paramDetail = &rest_get_parameter_details($param\
6980 Name);\n        print $paramDetail->{'name'}, \"\\t\", $p\
6981 aramDetail->{'type'}, \"\\n\";\n        print $paramDetai\
6982 l->{'description'}, \"\\n\";\n  if(defined($paramDe\
6983 tail->{'values'}->{'value'})) {\n               if(ref($paramDe\
6984 tail->{'values'}->{'value'}) eq 'ARRAY') {\n                    for\
6985 each my $value ( @{ $paramDetail->{'values'}->{'va\
6986 lue'} } ) {\n                           &print_param_value($value);\n                   }\
6987 \n              }\n             else {\n                                &print_param_value($paramDeta\
6988 il->{'values'}->{'value'});\n           }\n     }\n     print_debug\
6989 _message( 'print_param_details', 'End', 1 );\n}\n\\
6990 n=head2 print_param_value()\n\nPrint details of a \
6991 tool parameter value.\n\n  &print_param_details($p\
6992 aram_value);\n\nUsed by print_param_details() to h\
6993 andle both singluar and array values.\n\n=cut\n\ns\
6994 ub print_param_value {\n        my $value = shift;\n    prin\
6995 t $value->{'value'};\n  if ( $value->{'defaultValue\
6996 '} eq 'true' ) {\n              print \"\\t\", 'default';\n     }\\
6997 n       print \"\\n\";\n        print \"\\t\", $value->{'label'\
6998 }, \"\\n\";\n   if ( defined( $value->{'properties'}\
6999  ) ) {\n                foreach\n                 my $key ( sort( keys( %{ $v\
7000 alue->{'properties'}{'property'} } ) ) )\n              {\n                     \
7001 if ( ref( $value->{'properties'}{'property'}{$key}\
7002  ) eq 'HASH'\n                          && defined( $value->{'properties\
7003 '}{'property'}{$key}{'value'} )\n                         )\n                   {\n                     \
7004         print \"\\t\", $key, \"\\t\",\n                           $value->{'pr\
7005 operties'}{'property'}{$key}{'value'}, \"\\n\";\n       \
7006                 }\n                     else {\n                                print \"\\t\", $value->{'prope\
7007 rties'}{'property'}{'key'},\n                             \"\\t\", $value\
7008 ->{'properties'}{'property'}{'value'}, \"\\n\";\n       \
7009                         last;\n                 }\n             }\n     }\n}\n\n=head2 print_job_sta\
7010 tus()\n\nPrint status of a job.\n\n  &print_job_st\
7011 atus($job_id);\n\n=cut\n\nsub print_job_status {\n\
7012         print_debug_message( 'print_job_status', 'Begin',\
7013  1 );\n my $jobid = shift;\n    print_debug_message( \
7014 'print_job_status', 'jobid: ' . $jobid, 1 );\n  if \
7015 ( $outputLevel > 0 ) {\n                print STDERR 'Getting st\
7016 atus for job ', $jobid, \"\\n\";\n      }\n     my $result \
7017 = &rest_get_status($jobid);\n   print \"$result\\n\"\
7018 ;\n     if ( $result eq 'FINISHED' && $outputLevel > 0\
7019  ) {\n          print STDERR \"To get results: $scriptName\
7020  --polljob --jobid \" . $jobid\n                  . \"\\n\";\n  }\
7021 \n      print_debug_message( 'print_job_status', 'End',\
7022  1 );\n}\n\n=head2 print_result_types()\n\nPrint a\
7023 vailable result types for a job.\n\n  &print_resul\
7024 t_types($job_id);\n\n=cut\n\nsub print_result_type\
7025 s {\n   print_debug_message( 'result_types', 'Begin'\
7026 , 1 );\n        my $jobid = shift;\n    print_debug_message(\
7027  'result_types', 'jobid: ' . $jobid, 1 );\n     if ( $\
7028 outputLevel > 0 ) {\n           print STDERR 'Getting resul\
7029 t types for job ', $jobid, \"\\n\";\n   }\n     my $stat\
7030 us = &rest_get_status($jobid);\n        if ( $status eq '\
7031 PENDING' || $status eq 'RUNNING' ) {\n          print STDE\
7032 RR 'Error: Job status is ', $status,\n            '. To ge\
7033 t result types the job must be finished.', \"\\n\"\
7034 ;\n     }\n     else {\n                my (@resultTypes) = &rest_get_re\
7035 sult_types($jobid);\n           if ( $outputLevel > 0 ) {\n\
7036                         print STDOUT 'Available result types:', \"\\n\"\
7037 ;\n             }\n             foreach my $resultType (@resultTypes) {\\
7038 n                       print STDOUT $resultType->{'identifier'}, \"\\\
7039 n\";\n                  if ( defined( $resultType->{'label'} ) ) \
7040 {\n                             print STDOUT \"\\t\", $resultType->{'label'\
7041 }, \"\\n\";\n                   }\n                     if ( defined( $resultType->{\
7042 'description'} ) ) {\n                          print STDOUT \"\\t\", $r\
7043 esultType->{'description'}, \"\\n\";\n                  }\n                     if \
7044 ( defined( $resultType->{'mediaType'} ) ) {\n                           p\
7045 rint STDOUT \"\\t\", $resultType->{'mediaType'}, \\
7046 "\\n\";\n                       }\n                     if ( defined( $resultType->{'fil\
7047 eSuffix'} ) ) {\n                               print STDOUT \"\\t\", $result\
7048 Type->{'fileSuffix'}, \"\\n\";\n                        }\n             }\n             if ( \
7049 $status eq 'FINISHED' && $outputLevel > 0 ) {\n                 \
7050 print STDERR \"\\n\", 'To get results:', \"\\n\",\\
7051 n                         \"  $scriptName --polljob --jobid \" . $para\
7052 ms{'jobid'} . \"\\n\",\n                          \"  $scriptName --pol\
7053 ljob --outformat <type> --jobid \"\n                      . $params\
7054 {'jobid'} . \"\\n\";\n          }\n     }\n     print_debug_messag\
7055 e( 'result_types', 'End', 1 );\n}\n\n=head2 submit\
7056 _job()\n\nSubmit a job to the service.\n\n  &submi\
7057 t_job($seq);\n\n=cut\n\nsub submit_job {\n      print_d\
7058 ebug_message( 'submit_job', 'Begin', 1 );\n\n   # Se\
7059 t input sequence\n      $tool_params{'sequence'} = shif\
7060 t;\n\n  # Load parameters\n     &load_params();\n\n     # S\
7061 ubmit the job\n my $jobid = &rest_run( $params{'em\
7062 ail'}, $params{'title'}, \\%tool_params );\n\n  # S\
7063 imulate sync/async mode\n       if ( defined( $params{'a\
7064 sync'} ) ) {\n          print STDOUT $jobid, \"\\n\";\n         i\
7065 f ( $outputLevel > 0 ) {\n                      print STDERR\n                    \"\
7066 To check status: $scriptName --status --jobid $job\
7067 id\\n\";\n              }\n     }\n     else {\n                if ( $outputLevel > \
7068 0 ) {\n                 print STDERR \"JobId: $jobid\\n\";\n            }\\
7069 n               sleep 1;\n              &get_results($jobid);\n }\n     print_d\
7070 ebug_message( 'submit_job', 'End', 1 );\n}\n\n=hea\
7071 d2 multi_submit_job()\n\nSubmit multiple jobs assu\
7072 ming input is a collection of fasta formatted sequ\
7073 ences.\n\n  &multi_submit_job();\n\n=cut\n\nsub mu\
7074 lti_submit_job {\n      print_debug_message( 'multi_sub\
7075 mit_job', 'Begin', 1 );\n       my $jobIdForFilename = 1\
7076 ;\n     $jobIdForFilename = 0 if ( defined( $params{'o\
7077 utfile'} ) );\n my (@filename_list) = ();\n\n   # Qu\
7078 ery sequence\n  if ( defined( $ARGV[0] ) ) {    # B\
7079 are option\n            if ( -f $ARGV[0] || $ARGV[0] eq '-' \
7080 ) {    # File\n                 push( @filename_list, $ARGV[0] )\
7081 ;\n             }\n             else {\n                        warn 'Warning: Input file \"'\
7082  . $ARGV[0] . '\" does not exist'\n             }\n     }\n     if ( \
7083 $params{'sequence'} ) {                   # Via --\
7084 sequence\n              if ( -f $params{'sequence'} || $params\
7085 {'sequence'} eq '-' ) {    # File\n                     push( @filen\
7086 ame_list, $params{'sequence'} );\n              }\n             else {\n        \
7087                 warn 'Warning: Input file \"' . $params{'sequenc\
7088 e'} . '\" does not exist'\n             }\n     }\n\n   $/ = '>';\n\
7089         foreach my $filename (@filename_list) {\n               my $IN\
7090 FILE;\n         if($filename eq '-') { # STDIN.\n                       open(\
7091  $INFILE, '<-' )\n                        or die 'Error: unable to ST\
7092 DIN (' . $! . ')';\n            } else { # File.\n                      open( $\
7093 INFILE, '<', $filename )\n                        or die 'Error: unab\
7094 le to open file ' . $filename . ' (' . $! . ')';\n\
7095                 }\n             while (<$INFILE>) {\n                   my $seq = $_;\n                 $\
7096 seq =~ s/>$//;\n                        if ( $seq =~ m/(\\S+)/ ) {\n                    \
7097         print STDERR \"Submitting job for: $1\\n\"\n                             \
7098  if ( $outputLevel > 0 );\n                             $seq = '>' . $seq;\\
7099 n                               &print_debug_message( 'multi_submit_job', $se\
7100 q, 11 );\n                              &submit_job($seq);\n                            $params{'out\
7101 file'} = undef if ( $jobIdForFilename == 1 );\n                 \
7102 }\n             }\n             close $INFILE;\n        }\n     print_debug_message\
7103 ( 'multi_submit_job', 'End', 1 );\n}\n\n=head2 lis\
7104 t_file_submit_job()\n\nSubmit multiple jobs using \
7105 a file containing a list of entry identifiers as \\
7106 ninput.\n\n  &list_file_submit_job($list_filename)\
7107 \n\n=cut\n\nsub list_file_submit_job {\n        my $filen\
7108 ame         = shift;\n  my $jobIdForFilename = 1;\n\
7109         $jobIdForFilename = 0 if ( defined( $params{'outf\
7110 ile'} ) );\n\n  # Iterate over identifiers, submitt\
7111 ing each job\n  my $LISTFILE;\n if($filename eq '-'\
7112 ) { # STDIN.\n          open( $LISTFILE, '<-' )\n                 or di\
7113 e 'Error: unable to STDIN (' . $! . ')';\n      } else \
7114 { # File.\n             open( $LISTFILE, '<', $filename )\n             \
7115   or die 'Error: unable to open file ' . $filename\
7116  . ' (' . $! . ')';\n   }\n     while (<$LISTFILE>) {\n \
7117         my $line = $_;\n                chomp($line);\n         if ( $line ne \
7118 '' ) {\n                        &print_debug_message( 'list_file_submit\
7119 _job', 'line: ' . $line, 2 );\n                 if ( $line =~ m/\
7120 \\w:\\w/ ) {    # Check this is an identifier\n                 \
7121         print STDERR \"Submitting job for: $line\\n\"\n         \
7122                   if ( $outputLevel > 0 );\n                            &submit_job($lin\
7123 e);\n                   }\n                     else {\n                                print STDERR\n\"Warning:\
7124  line \\\"$line\\\" is not recognised as an identi\
7125 fier\\n\";\n                    }\n             }\n             $params{'outfile'} = unde\
7126 f if ( $jobIdForFilename == 1 );\n      }\n     close $LIST\
7127 FILE;\n}\n\n=head2 load_data()\n\nLoad sequence da\
7128 ta from file or option specified on the command-li\
7129 ne.\n\n  &load_data();\n\n=cut\n\nsub load_data {\\
7130 n       print_debug_message( 'load_data', 'Begin', 1 );\\
7131 n       my $retSeq;\n\n # Query sequence\n      if ( defined(\
7132  $ARGV[0] ) ) {    # Bare option\n              if ( -f $ARGV[\
7133 0] || $ARGV[0] eq '-' ) {    # File\n                   $retSeq = \
7134 &read_file( $ARGV[0] );\n               }\n             else {            \
7135                          # DB:ID or sequence\n                  $\
7136 retSeq = $ARGV[0];\n            }\n     }\n     if ( $params{'sequen\
7137 ce'} ) {                   # Via --sequence\n           if \
7138 ( -f $params{'sequence'} || $params{'sequence'} eq\
7139  '-' ) {    # File\n                    $retSeq = &read_file( $para\
7140 ms{'sequence'} );\n             }\n             else {    # DB:ID or seq\
7141 uence\n                 $retSeq = $params{'sequence'};\n                }\n     }\\
7142 n       print_debug_message( 'load_data', 'End', 1 );\n \
7143 return $retSeq;\n}\n\n=head2 load_params()\n\nLoad\
7144  job parameters from command-line options.\n\n  &l\
7145 oad_params();\n\n=cut\n\nsub load_params {\n    print\
7146 _debug_message( 'load_params', 'Begin', 1 );\n\n        #\
7147  Database(s) to search\n        my (@dbList) = split /[ ,\
7148 ]/, $params{'database'};\n      $tool_params{'database'\
7149 } = \\@dbList;\n\n      # Match/missmatch\n     if ( $param\
7150 s{'match'} && $params{'missmatch'} ) {\n                $tool_pa\
7151 rams{'match_scores'} =\n                  $params{'match'} . ','\
7152  . $params{'missmatch'};\n      }\n     \n      # Compatability \
7153 options, old command-line\n     if(!$tool_params{'alig\
7154 nments'} && $params{'numal'}) {\n               $tool_params{'a\
7155 lignments'} = $params{'numal'};\n       }\n     if(!$tool_pa\
7156 rams{'gapopen'} && $params{'opengap'}) {\n              $tool_\
7157 params{'gapopen'} = $params{'opengap'};\n       }\n     if(!\
7158 $tool_params{'gapext'} && $params{'extendgap'}) {\\
7159 n               $tool_params{'gapext'} = $params{'extendgap'};\\
7160 n       }\n\n   print_debug_message( 'load_params', 'End',\
7161  1 );\n}\n\n=head2 client_poll()\n\nClient-side jo\
7162 b polling.\n\n  &client_poll($job_id);\n\n=cut\n\n\
7163 sub client_poll {\n     print_debug_message( 'client_p\
7164 oll', 'Begin', 1 );\n   my $jobid  = shift;\n   my $st\
7165 atus = 'PENDING';\n\n   my $errorCount = 0;\n   while \
7166 ($status eq 'RUNNING'\n         || $status eq 'PENDING'\n\
7167                 || ( $status eq 'ERROR' && $errorCount < 2 ) )\n\
7168         {\n             $status = rest_get_status($jobid);\n            print \
7169 STDERR \"$status\\n\" if ( $outputLevel > 0 );\n                \
7170 if ( $status eq 'ERROR' ) {\n                   $errorCount++;\n                \
7171 }\n             elsif ( $errorCount > 0 ) {\n                   $errorCount--\
7172 ;\n             }\n             if (   $status eq 'RUNNING'\n                   || $stat\
7173 us eq 'PENDING'\n                       || $status eq 'ERROR' )\n               {\n\
7174 \n                      # Wait before polling again.\n                  sleep $check\
7175 Interval;\n             }\n     }\n     print_debug_message( 'client_\
7176 poll', 'End', 1 );\n    return $status;\n}\n\n=head2 \
7177 get_results()\n\nGet the results for a job identif\
7178 ier.\n\n  &get_results($job_id);\n\n=cut\n\nsub ge\
7179 t_results {\n   print_debug_message( 'get_results', \
7180 'Begin', 1 );\n my $jobid = shift;\n    print_debug_m\
7181 essage( 'get_results', 'jobid: ' . $jobid, 1 );\n\\
7182 n       # Verbose\n     if ( $outputLevel > 1 ) {\n             print '\
7183 Getting results for job ', $jobid, \"\\n\";\n   }\n\\
7184 n       # Check status, and wait if not finished\n      clien\
7185 t_poll($jobid);\n\n     # Use JobId if output file nam\
7186 e is not defined\n      unless ( defined( $params{'outf\
7187 ile'} ) ) {\n           $params{'outfile'} = $jobid;\n  }\n\\
7188 n       # Get list of data types\n      my (@resultTypes) = r\
7189 est_get_result_types($jobid);\n\n       # Get the data a\
7190 nd write it to a file\n if ( defined( $params{'out\
7191 format'} ) ) {    # Specified data type\n               my $sel\
7192 ResultType;\n           foreach my $resultType (@resultType\
7193 s) {\n                  if ( $resultType->{'identifier'} eq $para\
7194 ms{'outformat'} ) {\n                           $selResultType = $resultT\
7195 ype;\n                  }\n             }\n             if ( defined($selResultType) ) \
7196 {\n                     my $result =\n                    rest_get_result( $jobid, \
7197 $selResultType->{'identifier'} );\n                     if ( $params\
7198 {'outfile'} eq '-' ) {\n                                write_file( $params{'o\
7199 utfile'}, $result );\n                  }\n                     else {\n                                write_f\
7200 ile(\n                                  $params{'outfile'} . '.'\n                                        . $sel\
7201 ResultType->{'identifier'} . '.'\n                                        . $selRes\
7202 ultType->{'fileSuffix'},\n                                      $result\n                               );\n            \
7203         }\n             }\n             else {\n                        die 'Error: unknown result f\
7204 ormat \"' . $params{'outformat'} . '\"';\n              }\n     }\\
7205 n       else {    # Data types available\n                    # Writ\
7206 e a file for each output type\n         for my $resultTyp\
7207 e (@resultTypes) {\n                    if ( $outputLevel > 1 ) {\n\
7208                                 print STDERR 'Getting ', $resultType->{'identi\
7209 fier'}, \"\\n\";\n                      }\n                     my $result = rest_get_r\
7210 esult( $jobid, $resultType->{'identifier'} );\n                 \
7211 if ( $params{'outfile'} eq '-' ) {\n                            write_file\
7212 ( $params{'outfile'}, $result );\n                      }\n                     else {\\
7213 n                               write_file(\n                                   $params{'outfile'} . '.'\n      \
7214                                   . $resultType->{'identifier'} . '.'\n                                   \
7215 . $resultType->{'fileSuffix'},\n                                        $result\n                               \
7216 );\n                    }\n             }\n     }\n     print_debug_message( 'get_resu\
7217 lts', 'End', 1 );\n}\n\n=head2 read_file()\n\nRead\
7218  a file into a scalar. The special filename '-' ca\
7219 n be used to read from \nstandard input (STDIN).\n\
7220 \n  my $data = &read_file($filename);\n\n=cut\n\ns\
7221 ub read_file {\n        print_debug_message( 'read_file',\
7222  'Begin', 1 );\n        my $filename = shift;\n print_deb\
7223 ug_message( 'read_file', 'filename: ' . $filename,\
7224  2 );\n my ( $content, $buffer );\n     if ( $filename\
7225  eq '-' ) {\n           while ( sysread( STDIN, $buffer, 10\
7226 24 ) ) {\n                      $content .= $buffer;\n          }\n     }\n     else \
7227 {    # File\n           open( my $FILE, '<', $filename )\n      \
7228           or die \"Error: unable to open input file $file\
7229 name ($!)\";\n          while ( sysread( $FILE, $buffer, 1\
7230 024 ) ) {\n                     $content .= $buffer;\n          }\n             close($\
7231 FILE);\n        }\n     print_debug_message( 'read_file', 'En\
7232 d', 1 );\n      return $content;\n}\n\n=head2 write_fil\
7233 e()\n\nWrite data to a file. The special filename \
7234 '-' can be used to write to \nstandard output (STD\
7235 OUT).\n\n  &write_file($filename, $data);\n\n=cut\\
7236 n\nsub write_file {\n   print_debug_message( 'write_\
7237 file', 'Begin', 1 );\n  my ( $filename, $data ) = @\
7238 _;\n    print_debug_message( 'write_file', 'filename:\
7239  ' . $filename, 2 );\n  if ( $outputLevel > 0 ) {\n\
7240                 print STDERR 'Creating result file: ' . $filenam\
7241 e . \"\\n\";\n  }\n     if ( $filename eq '-' ) {\n             pr\
7242 int STDOUT $data;\n     }\n     else {\n                open( my $FILE, \
7243 '>', $filename )\n                or die \"Error: unable to op\
7244 en output file $filename ($!)\";\n              syswrite( $FIL\
7245 E, $data );\n           close($FILE);\n }\n     print_debug_mes\
7246 sage( 'write_file', 'End', 1 );\n}\n\n=head2 usage\
7247 ()\n\nPrint program usage message.\n\n  &usage();\\
7248 n\n=cut\n\nsub usage {\n        print STDERR <<EOF\nNCBI \
7249 BLAST\n==========\n   \nRapid sequence database se\
7250 arch programs utilizing the BLAST algorithm\n    \\
7251 n[Required]\n\n  -p, --program      : str  : BLAST\
7252  program to use, see --paramDetail program\n  -D, \
7253 --database     : str  : database(s) to search, spa\
7254 ce separated. See\n                              -\
7255 -paramDetail database\n      --stype        : str \
7256  : query sequence type, see --paramDetail stype\n \
7257  seqFile            : file : query sequence (\"-\"\
7258  for STDIN, \\@filename for\n                     \
7259          identifier list file)\n\n[Optional]\n\n  \
7260 -m, --matrix       : str  : scoring matrix, see --\
7261 paramDetail matrix\n  -e, --exp          : real : \
7262 0<E<= 1000. Statistical significance threshold \n \
7263                              for reporting databas\
7264 e sequence matches.\n  -f, --filter       :      :\
7265  filter the query sequence for low complexity \n  \
7266                             regions, see --paramDe\
7267 tail filter\n  -A, --align        : int  : pairwis\
7268 e alignment format, see --paramDetail align\n  -s,\
7269  --scores       : int  : number of scores to be re\
7270 ported\n  -n, --alignments   : int  : number of al\
7271 ignments to report\n  -u, --match        : int  : \
7272 Match score (BLASTN only)\n  -v, --mismatch     : \
7273 int  : Mismatch score (BLASTN only)\n  -o, --gapop\
7274 en      : int  : Gap open penalty\n  -x, --gapext \
7275       : int  : Gap extension penalty\n  -d, --drop\
7276 off      : int  : Drop-off\n  -g, --gapalign     :\
7277       : Optimise gapped alignments\n      --seqran\
7278 ge     : str  : region within input to use as quer\
7279 y\n      --multifasta   :      : treat input as a \
7280 set of fasta formatted sequences\n\n[General]\n\n \
7281  -h, --help         :      : prints this help text\
7282 \n      --async        :      : forces to make an \
7283 asynchronous query\n      --email        : str  : \
7284 e-mail address\n      --title        : str  : titl\
7285 e for job\n      --status       :      : get job s\
7286 tatus\n      --resultTypes  :      : get available\
7287  result types for job\n      --polljob      :     \
7288  : poll for the status of a job\n      --jobid    \
7289     : str  : jobid that was returned when an async\
7290 hronous job \n                              was su\
7291 bmitted.\n      --outfile      : str  : file name \
7292 for results (default is jobid;\n                  \
7293             \"-\" for STDOUT)\n      --outformat  \
7294   : str  : result format to retrieve\n      --para\
7295 ms       :      : list input parameters\n      --p\
7296 aramDetail  : str  : display details for input par\
7297 ameter\n      --quiet        :      : decrease out\
7298 put\n      --verbose      :      : increase output\
7299 \n   \nSynchronous job:\n\n  The results/errors ar\
7300 e returned as soon as the job is finished.\n  Usag\
7301 e: $scriptName --email <your\\@email> [options...]\
7302  seqFile\n  Returns: results as an attachment\n\nA\
7303 synchronous job:\n\n  Use this if you want to retr\
7304 ieve the results at a later time. The results \n  \
7305 are stored for up to 24 hours.  \n  Usage: $script\
7306 Name --async --email <your\\@email> [options...] s\
7307 eqFile\n  Returns: jobid\n\n  Use the jobid to que\
7308 ry for the status of the job. If the job is finish\
7309 ed, \n  it also returns the results/errors.\n  Usa\
7310 ge: $scriptName --polljob --jobid <jobId> [--outfi\
7311 le string]\n  Returns: string indicating the statu\
7312 s of the job and if applicable, results \n  as an \
7313 attachment.\n\nFurther information:\n\n  http://ww\
7314 w.ebi.ac.uk/Tools/webservices/services/sss/ncbi_bl\
7315 ast_rest\n  http://www.ebi.ac.uk/Tools/webservices\
7316 /tutorials/perl\n\nSupport/Feedback:\n\n  http://w\
7317 ww.ebi.ac.uk/support/\nEOF\n}\n\n=head1 FEEDBACK/S\
7318 UPPORT\n\nPlease contact us at L<http://www.ebi.ac\
7319 .uk/support/> if you have any \nfeedback, suggesti\
7320 ons or issues with the service or this client.\n\n\
7321 =cut\n","\n=head1 NAME\n\nwublast_lwp.pl\n\n=head1\
7322  DESCRIPTION\n\nWU-BLAST (REST) web service Perl c\
7323 lient using L<LWP>.\n\nTested with:\n\n=over\n\n=i\
7324 tem *\nL<LWP> 5.79, L<XML::Simple> 2.12 and Perl 5\
7325 .8.3\n\n=item *\nL<LWP> 5.808, L<XML::Simple> 2.18\
7326  and Perl 5.8.8 (Ubuntu 8.04 LTS)\n\n=item *\nL<LW\
7327 P> 5.834, L<XML::Simple> 2.18 and Perl 5.10.1 (Ubu\
7328 ntu 10.04 LTS)\n\n=item *\nL<LWP> 6.03, L<XML::Sim\
7329 ple> 2.18 and Perl 5.14.2 (Ubuntu 12.04 LTS)\n\n=b\
7330 ack\n\nFor further information see:\n\n=over\n\n=i\
7331 tem *\nL<http://www.ebi.ac.uk/Tools/webservices/se\
7332 rvices/sss/wu_blast_rest>\n\n=item *\nL<http://www\
7333 .ebi.ac.uk/Tools/webservices/tutorials/perl>\n\n=b\
7334 ack\n\n=head1 LICENSE\n\nCopyright 2012-2013 EMBL \
7335 - European Bioinformatics Institute\n\nLicensed un\
7336 der the Apache License, Version 2.0 (the \"License\
7337 \");\nyou may not use this file except in complian\
7338 ce with the License.\nYou may obtain a copy of the\
7339  License at\n\n    http://www.apache.org/licenses/\
7340 LICENSE-2.0\n\nUnless required by applicable law o\
7341 r agreed to in writing, software\ndistributed unde\
7342 r the License is distributed on an \"AS IS\" BASIS\
7343 ,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, e\
7344 ither express or implied.\nSee the License for the\
7345  specific language governing permissions and\nlimi\
7346 tations under the License.\n\n=head1 VERSION\n\n$I\
7347 d: wublast_lwp.pl 2560 2013-03-20 12:56:31Z hpm $\\
7348 n\n=cut\n\nuse strict;\nuse warnings;\n\nuse Engli\
7349 sh;\nuse LWP;\nuse XML::Simple;\nuse Getopt::Long \
7350 qw(:config no_ignore_case bundling);\nuse File::Ba\
7351 sename;\nuse Data::Dumper;\n\nmy $baseUrl = 'http:\
7352 //www.ebi.ac.uk/Tools/services/rest/wublast';\n\nm\
7353 y $checkInterval = 3;\n\nmy $outputLevel = 1;\n\nm\
7354 y $numOpts = scalar(@ARGV);\nmy %params = ( 'debug\
7355 Level' => 0 );\n\nmy %tool_params = ();\nGetOption\
7356 s(\n\n  # Tool specific options\n       'program|p=s'    \
7357  => \\$tool_params{'program'},      # BLAST progra\
7358 m\n     'database|D=s'    => \\$params{'database'},   \
7359   # Search database\n   'matrix|m=s'      => \\$tool\
7360 _params{'matrix'},       # Scoring matrix\n     'exp|E\
7361 =f'         => \\$tool_params{'exp'},          # E\
7362 -value threshold\n      'viewfilter|e'    => \\$tool_pa\
7363 rams{'viewfilter'},   # Display filtered sequence\\
7364 n       'filter|f=s'      => \\$tool_params{'filter'},  \
7365      # Low complexity filter name\n     'alignments|n=\
7366 i'  => \\$tool_params{'alignments'},   # Number of\
7367  alignments\n   'scores|s=i'      => \\$tool_params{\
7368 'scores'},       # Number of scores\n   'sensitivity\
7369 |S=s' => \\$tool_params{'sensitivity'},  # Search \
7370 sensitivity\n   'sort|t=s'        => \\$tool_params{\
7371 'sort'},         # Sort hits by...\n    'stats|T=s'  \
7372      => \\$tool_params{'stats'},        # Scoring \
7373 statistic to use\n      'strand|d=s'      => \\$tool_pa\
7374 rams{'strand'},       # Strand to use\n 'topcombon\
7375 |c=i'   => \\$tool_params{'topcombon'},    # Consi\
7376 stent sets of HSPs\n    'align|A=i'       => \\$tool_\
7377 params{'align'},   # Pairwise alignment format\n        '\
7378 stype=s' => \\$tool_params{'stype'},    # Sequence\
7379  type 'protein' or 'dna'\n      'sequence=s' => \\$para\
7380 ms{'sequence'},         # Query sequence file or D\
7381 B:ID\n  'multifasta' => \\$params{'multifasta'},   \
7382     # Multiple fasta input\n\n  # Compatability opt\
7383 ions, old command-line.\n       'echofilter|e'    => \\$\
7384 params{'echofilter'},   # Display filtered sequenc\
7385 e\n     'b=i'  => \\$params{'numal'},        # Number \
7386 of alignments\n 'appxml=s'        => \\$params{'ap\
7387 pxml'},       # Application XML\n\n     # Generic opti\
7388 ons\n   'email=s'       => \\$params{'email'},      \
7389     # User e-mail address\n     'title=s'       => \\$\
7390 params{'title'},          # Job title\n 'outfile=s\
7391 '     => \\$params{'outfile'},        # Output fil\
7392 e name\n        'outformat=s'   => \\$params{'outformat'}\
7393 ,      # Output file type\n     'jobid=s'       => \\$\
7394 params{'jobid'},          # JobId\n     'help|h'      \
7395   => \\$params{'help'},           # Usage help\n        '\
7396 async'         => \\$params{'async'},          # A\
7397 synchronous submission\n        'polljob'       => \\$par\
7398 ams{'polljob'},        # Get results\n  'resultType\
7399 s'   => \\$params{'resultTypes'},    # Get result \
7400 types\n 'status'        => \\$params{'status'},   \
7401       # Get status\n    'params'        => \\$params{\
7402 'params'},         # List input parameters\n    'para\
7403 mDetail=s' => \\$params{'paramDetail'},    # Get d\
7404 etails for parameter\n  'quiet'         => \\$param\
7405 s{'quiet'},          # Decrease output level\n  've\
7406 rbose'       => \\$params{'verbose'},        # Inc\
7407 rease output level\n    'debugLevel=i'  => \\$params{\
7408 'debugLevel'},     # Debug output level\n       'baseUrl\
7409 =s'     => \\$baseUrl,                  # Base URL\
7410  for service.\n);\nif ( $params{'verbose'} ) { $ou\
7411 tputLevel++ }\nif ( $params{'quiet'} )  { $outputL\
7412 evel-- }\n\n&print_debug_message( 'MAIN', 'LWP::VE\
7413 RSION: ' . $LWP::VERSION,\n     1 );\n\n&print_debug_m\
7414 essage( 'MAIN', \"params:\\n\" . Dumper( \\%params\
7415  ),           11 );\n&print_debug_message( 'MAIN',\
7416  \"tool_params:\\n\" . Dumper( \\%tool_params ), 1\
7417 1 );\n\nmy $ua;\n\nmy $scriptName = basename( $0, \
7418 () );\n\nif ( $params{'help'} || $numOpts == 0 ) {\
7419 \n      &usage();\n     exit(0);\n}\n\n&print_debug_message\
7420 ( 'MAIN', 'baseUrl: ' . $baseUrl, 1 );\n\nif (\n        !\
7421 (\n                $params{'polljob'}\n         || $params{'resultTy\
7422 pes'}\n         || $params{'status'}\n          || $params{'param\
7423 s'}\n           || $params{'paramDetail'}\n     )\n     && !( defin\
7424 ed( $ARGV[0] ) || defined( $params{'sequence'} ) )\
7425 \n  )\n{\n\n    # Bad argument combination, so print \
7426 error message and usage\n       print STDERR 'Error: bad\
7427  option combination', \"\\n\";\n        &usage();\n     exit(\
7428 1);\n}\n\nelsif ( $params{'params'} ) {\n       &print_t\
7429 ool_params();\n}\n\nelsif ( $params{'paramDetail'}\
7430  ) {\n  &print_param_details( $params{'paramDetail'\
7431 } );\n}\n\nelsif ( $params{'status'} && defined( $\
7432 params{'jobid'} ) ) {\n &print_job_status( $params\
7433 {'jobid'} );\n}\n\nelsif ( $params{'resultTypes'} \
7434 && defined( $params{'jobid'} ) ) {\n    &print_result\
7435 _types( $params{'jobid'} );\n}\n\nelsif ( $params{\
7436 'polljob'} && defined( $params{'jobid'} ) ) {\n &g\
7437 et_results( $params{'jobid'} );\n}\n\nelse {\n\n        #\
7438  Multiple input sequence mode, assume fasta format\
7439 .\n     if ( $params{'multifasta'} ) {\n                &multi_submi\
7440 t_job();\n      }\n\n   # Entry identifier list file.\n e\
7441 lsif (( defined( $params{'sequence'} ) && $params{\
7442 'sequence'} =~ m/^\\@/ )\n              || ( defined( $ARGV[0]\
7443  ) && $ARGV[0] =~ m/^\\@/ ) )\n {\n             my $list_file\
7444 name = $params{'sequence'} || $ARGV[0];\n               $list_f\
7445 ilename =~ s/^\\@//;\n          &list_file_submit_job($lis\
7446 t_filename);\n  }\n\n   # Default: single sequence/id\
7447 entifier.\n     else {\n\n              # Load the sequence data a\
7448 nd submit.\n            &submit_job( &load_data() );\n  }\n}\\
7449 n\n=head1 FUNCTIONS\n\n=cut\n\n\n=head2 rest_user_\
7450 agent()\n\nGet a LWP UserAgent to use to perform R\
7451 EST requests.\n\n  my $ua = &rest_user_agent();\n\\
7452 n=cut\n\nsub rest_user_agent() {\n      print_debug_mes\
7453 sage( 'rest_user_agent', 'Begin', 21 );\n       # Create\
7454  an LWP UserAgent for making HTTP calls.\n      my $ua \
7455 = LWP::UserAgent->new();\n      # Set 'User-Agent' HTTP\
7456  header to identifiy the client.\n      '$Revision: 256\
7457 0 $' =~ m/(\\d+)/;\n    $ua->agent(\"EBI-Sample-Clien\
7458 t/$1 ($scriptName; $OSNAME) \" . $ua->agent());\n       \
7459 # Configure HTTP proxy support from environment.\n\
7460         $ua->env_proxy;\n       print_debug_message( 'rest_user\
7461 _agent', 'End', 21 );\n return $ua;\n}\n\n=head2 r\
7462 est_error()\n\nCheck a REST response for an error \
7463 condition. An error is mapped to a die.\n\n  &rest\
7464 _error($response, $content_data);\n\n=cut\n\nsub r\
7465 est_error() {\n print_debug_message( 'rest_error',\
7466  'Begin', 21 );\n       my $response = shift;\n my $cont\
7467 entdata;\n      if(scalar(@_) > 0) {\n          $contentdata = \
7468 shift;\n        }\n     if(!defined($contentdata) || $content\
7469 data eq '') {\n         $contentdata = $response->content\
7470 ();\n   }\n     # Check for HTTP error codes\n  if ( $res\
7471 ponse->is_error ) {\n           my $error_message = '';\n               \
7472 # HTML response.\n              if(     $contentdata =~ m/<h1>([^<\
7473 ]+)<\\/h1>/ ) {\n                       $error_message = $1;\n          }\n             #\
7474   XML response.\n               elsif($contentdata =~ m/<descri\
7475 ption>([^<]+)<\\/description>/) {\n                     $error_messa\
7476 ge = $1;\n              }\n             die 'http status: ' . $response->\
7477 code . ' ' . $response->message . '  ' . $error_me\
7478 ssage;\n        }\n     print_debug_message( 'rest_error', 'E\
7479 nd', 21 );\n}\n\n=head2 rest_request()\n\nPerform \
7480 a REST request (HTTP GET).\n\n  my $response_str =\
7481  &rest_request($url);\n\n=cut\n\nsub rest_request \
7482 {\n     print_debug_message( 'rest_request', 'Begin', \
7483 11 );\n my $requestUrl = shift;\n       print_debug_mess\
7484 age( 'rest_request', 'URL: ' . $requestUrl, 11 );\\
7485 n\n     # Get an LWP UserAgent.\n       $ua = &rest_user_age\
7486 nt() unless defined($ua);\n     # Available HTTP compr\
7487 ession methods.\n       my $can_accept;\n       eval {\n            $\
7488 can_accept = HTTP::Message::decodable();\n      };\n    $c\
7489 an_accept = '' unless defined($can_accept);\n   # Pe\
7490 rform the request\n     my $response = $ua->get($reque\
7491 stUrl,\n                'Accept-Encoding' => $can_accept, # HTTP\
7492  compression.\n );\n    print_debug_message( 'rest_re\
7493 quest', 'HTTP status: ' . $response->code,\n            11 )\
7494 ;\n     print_debug_message( 'rest_request',\n          'respo\
7495 nse length: ' . length($response->content()), 11 )\
7496 ;\n     print_debug_message( 'rest_request',\n          'reque\
7497 st:' .\"\\n\" . $response->request()->as_string(),\
7498  32 );\n        print_debug_message( 'rest_request',\n          '\
7499 response: ' . \"\\n\" . $response->as_string(), 32\
7500  );\n   # Unpack possibly compressed response.\n        my \
7501 $retVal;\n      if ( defined($can_accept) && $can_accep\
7502 t ne '') {\n        $retVal = $response->decoded_cont\
7503 ent();\n        }\n     # If unable to decode use orginal con\
7504 tent.\n $retVal = $response->content() unless defi\
7505 ned($retVal);\n # Check for an error.\n &rest_erro\
7506 r($response, $retVal);\n        print_debug_message( 'res\
7507 t_request', 'retVal: ' . $retVal, 12 );\n       print_de\
7508 bug_message( 'rest_request', 'End', 11 );\n\n   # Re\
7509 turn the response data\n        return $retVal;\n}\n\n=he\
7510 ad2 rest_get_parameters()\n\nGet list of tool para\
7511 meter names.\n\n  my (@param_list) = &rest_get_par\
7512 ameters();\n\n=cut\n\nsub rest_get_parameters {\n       \
7513 print_debug_message( 'rest_get_parameters', 'Begin\
7514 ', 1 );\n       my $url                = $baseUrl . '/pa\
7515 rameters/';\n   my $param_list_xml_str = rest_reques\
7516 t($url);\n      my $param_list_xml     = XMLin($param_l\
7517 ist_xml_str);\n my (@param_list)       = @{ $param\
7518 _list_xml->{'id'} };\n  print_debug_message( 'rest_\
7519 get_parameters', 'End', 1 );\n  return (@param_list\
7520 );\n}\n\n=head2 rest_get_parameter_details()\n\nGe\
7521 t details of a tool parameter.\n\n  my $paramDetai\
7522 l = &rest_get_parameter_details($param_name);\n\n=\
7523 cut\n\nsub rest_get_parameter_details {\n       print_de\
7524 bug_message( 'rest_get_parameter_details', 'Begin'\
7525 , 1 );\n        my $parameterId = shift;\n      print_debug_me\
7526 ssage( 'rest_get_parameter_details',\n          'parameter\
7527 Id: ' . $parameterId, 1 );\n    my $url              \
7528     = $baseUrl . '/parameterdetails/' . $parameter\
7529 Id;\n   my $param_detail_xml_str = rest_request($url\
7530 );\n    my $param_detail_xml     = XMLin($param_detai\
7531 l_xml_str);\n   print_debug_message( 'rest_get_param\
7532 eter_details', 'End', 1 );\n    return ($param_detail\
7533 _xml);\n}\n\n=head2 rest_run()\n\nSubmit a job.\n\\
7534 n  my $job_id = &rest_run($email, $title, \\%param\
7535 s );\n\n=cut\n\nsub rest_run {\n        print_debug_messa\
7536 ge( 'rest_run', 'Begin', 1 );\n my $email  = shift\
7537 ;\n     my $title  = shift;\n   my $params = shift;\n   pr\
7538 int_debug_message( 'rest_run', 'email: ' . $email,\
7539  1 );\n if ( defined($title) ) {\n              print_debug_me\
7540 ssage( 'rest_run', 'title: ' . $title, 1 );\n   }\n     \
7541 print_debug_message( 'rest_run', 'params: ' . Dump\
7542 er($params), 1 );\n\n   # Get an LWP UserAgent.\n       $u\
7543 a = &rest_user_agent() unless defined($ua);\n\n # \
7544 Clean up parameters\n   my (%tmp_params) = %{$params\
7545 };\n    $tmp_params{'email'} = $email;\n        $tmp_params{\
7546 'title'} = $title;\n    foreach my $param_name ( keys\
7547 (%tmp_params) ) {\n             if ( !defined( $tmp_params{$p\
7548 aram_name} ) ) {\n                      delete $tmp_params{$param_nam\
7549 e};\n           }\n     }\n\n   # Submit the job as a POST\n    my $\
7550 url = $baseUrl . '/run';\n      my $response = $ua->pos\
7551 t( $url, \\%tmp_params );\n     print_debug_message( '\
7552 rest_run', 'HTTP status: ' . $response->code, 11 )\
7553 ;\n     print_debug_message( 'rest_run',\n              'request:'\
7554  .\"\\n\" . $response->request()->as_string(), 11 \
7555 );\n    print_debug_message( 'rest_run',\n              'response\
7556 : ' . length($response->as_string()) . \"\\n\" . $\
7557 response->as_string(), 11 );\n\n        # Check for an er\
7558 ror.\n  &rest_error($response);\n\n     # The job id is\
7559  returned\n     my $job_id = $response->content();\n    p\
7560 rint_debug_message( 'rest_run', 'End', 1 );\n   retu\
7561 rn $job_id;\n}\n\n=head2 rest_get_status()\n\nChec\
7562 k the status of a job.\n\n  my $status = &rest_get\
7563 _status($job_id);\n\n=cut\n\nsub rest_get_status {\
7564 \n      print_debug_message( 'rest_get_status', 'Begin'\
7565 , 1 );\n        my $job_id = shift;\n   print_debug_message\
7566 ( 'rest_get_status', 'jobid: ' . $job_id, 2 );\n        m\
7567 y $status_str = 'UNKNOWN';\n    my $url        = $bas\
7568 eUrl . '/status/' . $job_id;\n  $status_str = &rest\
7569 _request($url);\n       print_debug_message( 'rest_get_s\
7570 tatus', 'status_str: ' . $status_str, 2 );\n    print\
7571 _debug_message( 'rest_get_status', 'End', 1 );\n        r\
7572 eturn $status_str;\n}\n\n=head2 rest_get_result_ty\
7573 pes()\n\nGet list of result types for finished job\
7574 .\n\n  my (@result_types) = &rest_get_result_types\
7575 ($job_id);\n\n=cut\n\nsub rest_get_result_types {\\
7576 n       print_debug_message( 'rest_get_result_types', 'B\
7577 egin', 1 );\n   my $job_id = shift;\n   print_debug_me\
7578 ssage( 'rest_get_result_types', 'jobid: ' . $job_i\
7579 d, 2 );\n       my (@resultTypes);\n    my $url            \
7580           = $baseUrl . '/resulttypes/' . $job_id;\\
7581 n       my $result_type_list_xml_str = &rest_request($ur\
7582 l);\n   my $result_type_list_xml     = XMLin($result\
7583 _type_list_xml_str);\n  (@resultTypes) = @{ $result\
7584 _type_list_xml->{'type'} };\n   print_debug_message(\
7585  'rest_get_result_types',\n             scalar(@resultTypes) \
7586 . ' result types', 2 );\n       print_debug_message( 're\
7587 st_get_result_types', 'End', 1 );\n     return (@resul\
7588 tTypes);\n}\n\n=head2 rest_get_result()\n\nGet res\
7589 ult data of a specified type for a finished job.\n\
7590 \n  my $result = rest_get_result($job_id, $result_\
7591 type);\n\n=cut\n\nsub rest_get_result {\n       print_de\
7592 bug_message( 'rest_get_result', 'Begin', 1 );\n my\
7593  $job_id = shift;\n     my $type   = shift;\n   print_de\
7594 bug_message( 'rest_get_result', 'jobid: ' . $job_i\
7595 d, 1 );\n       print_debug_message( 'rest_get_result', \
7596 'type: ' . $type,    1 );\n     my $url    = $baseUrl \
7597 . '/result/' . $job_id . '/' . $type;\n my $result\
7598  = &rest_request($url);\n       print_debug_message( 're\
7599 st_get_result', length($result) . ' characters',\n\
7600                 1 );\n  print_debug_message( 'rest_get_result', '\
7601 End', 1 );\n    return $result;\n}\n\n\n=head2 print_\
7602 debug_message()\n\nPrint debug message at specifie\
7603 d debug level.\n\n  &print_debug_message($method_n\
7604 ame, $message, $level);\n\n=cut\n\nsub print_debug\
7605 _message {\n    my $function_name = shift;\n    my $mess\
7606 age       = shift;\n    my $level         = shift;\n    \
7607 if ( $level <= $params{'debugLevel'} ) {\n              print \
7608 STDERR '[', $function_name, '()] ', $message, \"\\\
7609 n\";\n  }\n}\n\n=head2 print_tool_params()\n\nPrint\
7610  list of tool parameters.\n\n  &print_tool_params(\
7611 );\n\n=cut\n\nsub print_tool_params {\n print_debu\
7612 g_message( 'print_tool_params', 'Begin', 1 );\n my\
7613  (@param_list) = &rest_get_parameters();\n      foreach\
7614  my $param ( sort(@param_list) ) {\n            print $param\
7615 , \"\\n\";\n    }\n     print_debug_message( 'print_tool_\
7616 params', 'End', 1 );\n}\n\n=head2 print_param_deta\
7617 ils()\n\nPrint details of a tool parameter.\n\n  &\
7618 print_param_details($param_name);\n\n=cut\n\nsub p\
7619 rint_param_details {\n  print_debug_message( 'print\
7620 _param_details', 'Begin', 1 );\n        my $paramName = s\
7621 hift;\n print_debug_message( 'print_param_details'\
7622 , 'paramName: ' . $paramName, 2 );\n    my $paramDeta\
7623 il = &rest_get_parameter_details($paramName);\n pr\
7624 int $paramDetail->{'name'}, \"\\t\", $paramDetail-\
7625 >{'type'}, \"\\n\";\n   print $paramDetail->{'descri\
7626 ption'}, \"\\n\";\n     if(defined($paramDetail->{'val\
7627 ues'}->{'value'})) {\n          if(ref($paramDetail->{'val\
7628 ues'}->{'value'}) eq 'ARRAY') {\n                       foreach my $va\
7629 lue ( @{ $paramDetail->{'values'}->{'value'} } ) {\
7630 \n                              &print_param_value($value);\n                   }\n             }\n             el\
7631 se {\n                          &print_param_value($paramDetail->{'value\
7632 s'}->{'value'});\n              }\n     }\n     print_debug_message( '\
7633 print_param_details', 'End', 1 );\n}\n\n=head2 pri\
7634 nt_param_value()\n\nPrint details of a tool parame\
7635 ter value.\n\n  &print_param_details($param_value)\
7636 ;\n\nUsed by print_param_details() to handle both \
7637 singluar and array values.\n\n=cut\n\nsub print_pa\
7638 ram_value {\n   my $value = shift;\n    print $value->{\
7639 'value'};\n     if ( $value->{'defaultValue'} eq 'true\
7640 ' ) {\n         print \"\\t\", 'default';\n     }\n     print \"\\
7641 \n\";\n print \"\\t\", $value->{'label'}, \"\\n\";\
7642 \n      if ( defined( $value->{'properties'} ) ) {\n            f\
7643 oreach\n                  my $key ( sort( keys( %{ $value->{'pro\
7644 perties'}{'property'} } ) ) )\n         {\n                     if ( ref( $\
7645 value->{'properties'}{'property'}{$key} ) eq 'HASH\
7646 '\n                             && defined( $value->{'properties'}{'propert\
7647 y'}{$key}{'value'} )\n                    )\n                   {\n                             print \"\\\
7648 t\", $key, \"\\t\",\n                             $value->{'properties'}{\
7649 'property'}{$key}{'value'}, \"\\n\";\n                  }\n                     els\
7650 e {\n                           print \"\\t\", $value->{'properties'}{'pr\
7651 operty'}{'key'},\n                                \"\\t\", $value->{'propert\
7652 ies'}{'property'}{'value'}, \"\\n\";\n                          last;\n \
7653                 }\n             }\n     }\n}\n\n=head2 print_job_status()\n\nPr\
7654 int status of a job.\n\n  &print_job_status($job_i\
7655 d);\n\n=cut\n\nsub print_job_status {\n print_debu\
7656 g_message( 'print_job_status', 'Begin', 1 );\n  my \
7657 $jobid = shift;\n       print_debug_message( 'print_job_\
7658 status', 'jobid: ' . $jobid, 1 );\n     if ( $outputLe\
7659 vel > 0 ) {\n           print STDERR 'Getting status for jo\
7660 b ', $jobid, \"\\n\";\n }\n     my $result = &rest_get\
7661 _status($jobid);\n      print \"$result\\n\";\n if ( $r\
7662 esult eq 'FINISHED' && $outputLevel > 0 ) {\n           pri\
7663 nt STDERR \"To get results: $scriptName --polljob \
7664 --jobid \" . $jobid\n             . \"\\n\";\n  }\n     print_de\
7665 bug_message( 'print_job_status', 'End', 1 );\n}\n\\
7666 n=head2 print_result_types()\n\nPrint available re\
7667 sult types for a job.\n\n  &print_result_types($jo\
7668 b_id);\n\n=cut\n\nsub print_result_types {\n    print\
7669 _debug_message( 'result_types', 'Begin', 1 );\n my\
7670  $jobid = shift;\n      print_debug_message( 'result_ty\
7671 pes', 'jobid: ' . $jobid, 1 );\n        if ( $outputLevel\
7672  > 0 ) {\n              print STDERR 'Getting result types for\
7673  job ', $jobid, \"\\n\";\n      }\n     my $status = &rest_\
7674 get_status($jobid);\n   if ( $status eq 'PENDING' ||\
7675  $status eq 'RUNNING' ) {\n             print STDERR 'Error: \
7676 Job status is ', $status,\n               '. To get result ty\
7677 pes the job must be finished.', \"\\n\";\n      }\n     els\
7678 e {\n           my (@resultTypes) = &rest_get_result_types(\
7679 $jobid);\n              if ( $outputLevel > 0 ) {\n                     print ST\
7680 DOUT 'Available result types:', \"\\n\";\n              }\n             f\
7681 oreach my $resultType (@resultTypes) {\n                        print S\
7682 TDOUT $resultType->{'identifier'}, \"\\n\";\n                   if\
7683  ( defined( $resultType->{'label'} ) ) {\n                              prin\
7684 t STDOUT \"\\t\", $resultType->{'label'}, \"\\n\";\
7685 \n                      }\n                     if ( defined( $resultType->{'descriptio\
7686 n'} ) ) {\n                             print STDOUT \"\\t\", $resultType->\
7687 {'description'}, \"\\n\";\n                     }\n                     if ( defined( \
7688 $resultType->{'mediaType'} ) ) {\n                              print STDOUT\
7689  \"\\t\", $resultType->{'mediaType'}, \"\\n\";\n                \
7690         }\n                     if ( defined( $resultType->{'fileSuffix'} )\
7691  ) {\n                          print STDOUT \"\\t\", $resultType->{'fil\
7692 eSuffix'}, \"\\n\";\n                   }\n             }\n             if ( $status eq \
7693 'FINISHED' && $outputLevel > 0 ) {\n                    print STDER\
7694 R \"\\n\", 'To get results:', \"\\n\",\n                          \"  $\
7695 scriptName --polljob --jobid \" . $params{'jobid'}\
7696  . \"\\n\",\n                     \"  $scriptName --polljob --outf\
7697 ormat <type> --jobid \"\n                         . $params{'jobid'} .\
7698  \"\\n\";\n             }\n     }\n     print_debug_message( 'result_\
7699 types', 'End', 1 );\n}\n\n=head2 submit_job()\n\nS\
7700 ubmit a job to the service.\n\n  &submit_job($seq)\
7701 ;\n\n=cut\n\nsub submit_job {\n print_debug_messag\
7702 e( 'submit_job', 'Begin', 1 );\n\n      # Set input seq\
7703 uence\n $tool_params{'sequence'} = shift;\n\n   # Lo\
7704 ad parameters\n &load_params();\n\n     # Submit the j\
7705 ob\n    my $jobid = &rest_run( $params{'email'}, $par\
7706 ams{'title'}, \\%tool_params );\n\n     # Simulate syn\
7707 c/async mode\n  if ( defined( $params{'async'} ) ) \
7708 {\n             print STDOUT $jobid, \"\\n\";\n         if ( $output\
7709 Level > 0 ) {\n                 print STDERR\n                    \"To check st\
7710 atus: $scriptName --status --jobid $jobid\\n\";\n       \
7711         }\n     }\n     else {\n                if ( $outputLevel > 0 ) {\n                     p\
7712 rint STDERR \"JobId: $jobid\\n\";\n             }\n             sleep 1;\
7713 \n              &get_results($jobid);\n }\n     print_debug_messag\
7714 e( 'submit_job', 'End', 1 );\n}\n\n=head2 multi_su\
7715 bmit_job()\n\nSubmit multiple jobs assuming input \
7716 is a collection of fasta formatted sequences.\n\n \
7717  &multi_submit_job();\n\n=cut\n\nsub multi_submit_\
7718 job {\n print_debug_message( 'multi_submit_job', '\
7719 Begin', 1 );\n  my $jobIdForFilename = 1;\n     $jobIdF\
7720 orFilename = 0 if ( defined( $params{'outfile'} ) \
7721 );\n    my (@filename_list) = ();\n\n   # Query sequenc\
7722 e\n     if ( defined( $ARGV[0] ) ) {    # Bare option\\
7723 n               if ( -f $ARGV[0] || $ARGV[0] eq '-' ) {    # Fi\
7724 le\n                    push( @filename_list, $ARGV[0] );\n             }\n             e\
7725 lse {\n                 warn 'Warning: Input file \"' . $ARGV[0]\
7726  . '\" does not exist'\n                }\n     }\n     if ( $params{'se\
7727 quence'} ) {                   # Via --sequence\n       \
7728         if ( -f $params{'sequence'} || $params{'sequence'\
7729 } eq '-' ) {    # File\n                        push( @filename_list, $\
7730 params{'sequence'} );\n         }\n             else {\n                        warn 'War\
7731 ning: Input file \"' . $params{'sequence'} . '\" d\
7732 oes not exist'\n                }\n     }\n\n   $/ = '>';\n     foreach my\
7733  $filename (@filename_list) {\n         my $INFILE;\n           if\
7734 ($filename eq '-') { # STDIN.\n                 open( $INFILE, '\
7735 <-' )\n                   or die 'Error: unable to STDIN (' . $!\
7736  . ')';\n               } else { # File.\n                      open( $INFILE, '<'\
7737 , $filename )\n                   or die 'Error: unable to open \
7738 file ' . $filename . ' (' . $! . ')';\n         }\n             whil\
7739 e (<$INFILE>) {\n                       my $seq = $_;\n                 $seq =~ s/>$\
7740 //;\n                   if ( $seq =~ m/(\\S+)/ ) {\n                            print STDE\
7741 RR \"Submitting job for: $1\\n\"\n                                if ( $outp\
7742 utLevel > 0 );\n                                $seq = '>' . $seq;\n                            &print\
7743 _debug_message( 'multi_submit_job', $seq, 11 );\n       \
7744                         &submit_job($seq);\n                            $params{'outfile'} = un\
7745 def if ( $jobIdForFilename == 1 );\n                    }\n             }\n             c\
7746 lose $INFILE;\n }\n     print_debug_message( 'multi_su\
7747 bmit_job', 'End', 1 );\n}\n\n=head2 list_file_subm\
7748 it_job()\n\nSubmit multiple jobs using a file cont\
7749 aining a list of entry identifiers as \ninput.\n\n\
7750   &list_file_submit_job($list_filename)\n\n=cut\n\\
7751 nsub list_file_submit_job {\n   print_debug_message(\
7752  'list_file_submit_job', 'Begin', 11 );\n       my $file\
7753 name         = shift;\n my $jobIdForFilename = 1;\\
7754 n       $jobIdForFilename = 0 if ( defined( $params{'out\
7755 file'} ) );\n\n # Iterate over identifiers, submit\
7756 ting each job\n my $LISTFILE;\n if($filename eq '-\
7757 ') { # STDIN.\n         open( $LISTFILE, '<-' )\n                 or d\
7758 ie 'Error: unable to STDIN (' . $! . ')';\n     } else\
7759  { # File.\n            open( $LISTFILE, '<', $filename )\n     \
7760           or die 'Error: unable to open file ' . $filenam\
7761 e . ' (' . $! . ')';\n  }\n     while (<$LISTFILE>) {\n\
7762                 my $line = $_;\n                chomp($line);\n         if ( $line ne\
7763  '' ) {\n                       &print_debug_message( 'list_file_submi\
7764 t_job', 'line: ' . $line, 2 );\n                        if ( $line =~ m\
7765 /\\w:\\w/ ) {    # Check this is an identifier\n                \
7766                 print STDERR \"Submitting job for: $line\\n\"\n \
7767                           if ( $outputLevel > 0 );\n                            &submit_job($li\
7768 ne);\n                  }\n                     else {\n                                print STDERR\n\"Warning\
7769 : line \\\"$line\\\" is not recognised as an ident\
7770 ifier\\n\";\n                   }\n             }\n             $params{'outfile'} = und\
7771 ef if ( $jobIdForFilename == 1 );\n     }\n     close $LIS\
7772 TFILE;\n        print_debug_message( 'list_file_submit_jo\
7773 b', 'End', 11 );\n}\n\n=head2 load_data()\n\nLoad \
7774 sequence data from file or option specified on the\
7775  command-line.\n\n  &load_data();\n\n=cut\n\nsub l\
7776 oad_data {\n    print_debug_message( 'load_data', 'Be\
7777 gin', 1 );\n    my $retSeq;\n\n # Query sequence\n      if\
7778  ( defined( $ARGV[0] ) ) {    # Bare option\n           if \
7779 ( -f $ARGV[0] || $ARGV[0] eq '-' ) {    # File\n                \
7780         $retSeq = &read_file( $ARGV[0] );\n             }\n             else { \
7781                                     # DB:ID or seq\
7782 uence\n                 $retSeq = $ARGV[0];\n           }\n     }\n     if ( $par\
7783 ams{'sequence'} ) {                   # Via --sequ\
7784 ence\n          if ( -f $params{'sequence'} || $params{'se\
7785 quence'} eq '-' ) {    # File\n                 $retSeq = &read_\
7786 file( $params{'sequence'} );\n          }\n             else {    # D\
7787 B:ID or sequence\n                      $retSeq = $params{'sequence'}\
7788 ;\n             }\n     }\n     print_debug_message( 'load_data', 'En\
7789 d', 1 );\n      return $retSeq;\n}\n\n=head2 load_param\
7790 s()\n\nLoad job parameters from command-line optio\
7791 ns.\n\n  &load_params();\n\n=cut\n\nsub load_param\
7792 s {\n   print_debug_message( 'load_params', 'Begin',\
7793  1 );\n\n       # Database(s) to search\n       my (@dbList) =\
7794  split /[ ,]/, $params{'database'};\n   $tool_params\
7795 {'database'} = \\@dbList;\n\n   # Compatability opti\
7796 ons, old command-line.\n        if(!$tool_params{'viewfil\
7797 ter'} && $params{'echofilter'}) {\n             $tool_params{\
7798 'viewfilter'} = 'true';\n       }\n     if(!$tool_params{'al\
7799 ignments'} && $params{'numal'}) {\n             $tool_params{\
7800 'alignments'} = $params{'numal'};\n     }\n     # TODO: se\
7801 t alignment format option to get NCBI BLAST XML.\n\
7802         if($params{'appxml'}) {\n               $tool_params{'align'} \
7803 = '';\n }\n\n   print_debug_message( 'load_params', \
7804 'End', 1 );\n}\n\n=head2 client_poll()\n\nClient-s\
7805 ide job polling.\n\n  &client_poll($job_id);\n\n=c\
7806 ut\n\nsub client_poll {\n       print_debug_message( 'cl\
7807 ient_poll', 'Begin', 1 );\n     my $jobid  = shift;\n   \
7808 my $status = 'PENDING';\n\n     my $errorCount = 0;\n   \
7809 while ($status eq 'RUNNING'\n           || $status eq 'PEND\
7810 ING'\n          || ( $status eq 'ERROR' && $errorCount < 2\
7811  ) )\n  {\n             $status = rest_get_status($jobid);\n            \
7812 print STDERR \"$status\\n\" if ( $outputLevel > 0 \
7813 );\n            if ( $status eq 'ERROR' ) {\n                   $errorCount+\
7814 +;\n            }\n             elsif ( $errorCount > 0 ) {\n                   $errorC\
7815 ount--;\n               }\n             if (   $status eq 'RUNNING'\n                   ||\
7816  $status eq 'PENDING'\n                 || $status eq 'ERROR' )\\
7817 n               {\n\n                   # Wait before polling again.\n                  sleep \
7818 $checkInterval;\n               }\n     }\n     print_debug_message( 'c\
7819 lient_poll', 'End', 1 );\n      return $status;\n}\n\n=\
7820 head2 get_results()\n\nGet the results for a job i\
7821 dentifier.\n\n  &get_results($job_id);\n\n=cut\n\n\
7822 sub get_results {\n     print_debug_message( 'get_resu\
7823 lts', 'Begin', 1 );\n   my $jobid = shift;\n    print_d\
7824 ebug_message( 'get_results', 'jobid: ' . $jobid, 1\
7825  );\n\n # Verbose\n     if ( $outputLevel > 1 ) {\n             p\
7826 rint 'Getting results for job ', $jobid, \"\\n\";\\
7827 n       }\n\n   # Check status, and wait if not finished\n\
7828         client_poll($jobid);\n\n        # Use JobId if output fi\
7829 le name is not defined\n        unless ( defined( $params\
7830 {'outfile'} ) ) {\n             $params{'outfile'} = $jobid;\\
7831 n       }\n\n   # Get list of data types\n      my (@resultType\
7832 s) = rest_get_result_types($jobid);\n\n # Get the \
7833 data and write it to a file\n   if ( defined( $param\
7834 s{'outformat'} ) ) {    # Specified data type\n         m\
7835 y $selResultType;\n             foreach my $resultType (@resu\
7836 ltTypes) {\n                    if ( $resultType->{'identifier'} eq\
7837  $params{'outformat'} ) {\n                             $selResultType = $r\
7838 esultType;\n                    }\n             }\n             if ( defined($selResultTy\
7839 pe) ) {\n                       my $result =\n                    rest_get_result( $j\
7840 obid, $selResultType->{'identifier'} );\n                       if ( $\
7841 params{'outfile'} eq '-' ) {\n                          write_file( $par\
7842 ams{'outfile'}, $result );\n                    }\n                     else {\n                                w\
7843 rite_file(\n                                    $params{'outfile'} . '.'\n                                        \
7844 . $selResultType->{'identifier'} . '.'\n                                          . $\
7845 selResultType->{'fileSuffix'},\n                                        $result\n                               \
7846 );\n                    }\n             }\n             else {\n                        die 'Error: unknown re\
7847 sult format \"' . $params{'outformat'} . '\"';\n                \
7848 }\n     }\n     else {    # Data types available\n                    \
7849 # Write a file for each output type\n           for my $res\
7850 ultType (@resultTypes) {\n                      if ( $outputLevel > 1\
7851  ) {\n                          print STDERR 'Getting ', $resultType->{'\
7852 identifier'}, \"\\n\";\n                        }\n                     my $result = rest\
7853 _get_result( $jobid, $resultType->{'identifier'} )\
7854 ;\n                     if ( $params{'outfile'} eq '-' ) {\n                            writ\
7855 e_file( $params{'outfile'}, $result );\n                        }\n                     e\
7856 lse {\n                         write_file(\n                                   $params{'outfile'} . \
7857 '.'\n                                     . $resultType->{'identifier'} . '.'\n \
7858                                   . $resultType->{'fileSuffix'},\n                                      $result\
7859 \n                              );\n                    }\n             }\n     }\n     print_debug_message( 'ge\
7860 t_results', 'End', 1 );\n}\n\n=head2 read_file()\n\
7861 \nRead a file into a scalar. The special filename \
7862 '-' can be used to read from \nstandard input (STD\
7863 IN).\n\n  my $data = &read_file($filename);\n\n=cu\
7864 t\n\nsub read_file {\n  print_debug_message( 'read_\
7865 file', 'Begin', 1 );\n  my $filename = shift;\n pri\
7866 nt_debug_message( 'read_file', 'filename: ' . $fil\
7867 ename, 2 );\n   my ( $content, $buffer );\n     if ( $fi\
7868 lename eq '-' ) {\n             while ( sysread( STDIN, $buff\
7869 er, 1024 ) ) {\n                        $content .= $buffer;\n          }\n     }\n\
7870         else {    # File\n              open( my $FILE, '<', $filenam\
7871 e )\n             or die \"Error: unable to open input file\
7872  $filename ($!)\";\n            while ( sysread( $FILE, $buf\
7873 fer, 1024 ) ) {\n                       $content .= $buffer;\n          }\n             c\
7874 lose($FILE);\n  }\n     print_debug_message( 'read_file\
7875 ', 'End', 1 );\n        return $content;\n}\n\n=head2 wri\
7876 te_file()\n\nWrite data to a file. The special fil\
7877 ename '-' can be used to write to \nstandard outpu\
7878 t (STDOUT).\n\n  &write_file($filename, $data);\n\\
7879 n=cut\n\nsub write_file {\n     print_debug_message( '\
7880 write_file', 'Begin', 1 );\n    my ( $filename, $data\
7881  ) = @_;\n      print_debug_message( 'write_file', 'fil\
7882 ename: ' . $filename, 2 );\n    if ( $outputLevel > 0\
7883  ) {\n          print STDERR 'Creating result file: ' . $f\
7884 ilename . \"\\n\";\n    }\n     if ( $filename eq '-' ) {\
7885 \n              print STDOUT $data;\n   }\n     else {\n                open( my $\
7886 FILE, '>', $filename )\n                  or die \"Error: unable\
7887  to open output file $filename ($!)\";\n                syswrite\
7888 ( $FILE, $data );\n             close($FILE);\n }\n     print_deb\
7889 ug_message( 'write_file', 'End', 1 );\n}\n\n=head2\
7890  usage()\n\nPrint program usage message.\n\n  &usa\
7891 ge();\n\n=cut\n\nsub usage {\n  print STDERR <<EOF\\
7892 nWU-BLAST\n========\n   \nRapid sequence database \
7893 search programs utilizing the BLAST algorithm\n   \
7894  \n[Required]\n\n  -p, --program      : str  : BLA\
7895 ST program to use, see --paramDetail program\n  -D\
7896 , --database     : str  : database(s) to search, s\
7897 pace separated. See\n                             \
7898  --paramDetail database\n      --stype        : st\
7899 r  : query sequence type, see --paramDetail stype\\
7900 n  seqFile            : file : query sequence (\"-\
7901 \" for STDIN, \\@filename for\n                   \
7902            identifier list file)\n\n[Optional]\n\n\
7903   -m, --matrix       : str  : scoring matrix, see \
7904 --paramDetail matrix\n  -e, --exp          : real \
7905 : 0<E<= 1000. Statistical significance threshold \\
7906 n                              for reporting datab\
7907 ase sequence matches.\n  -e, --viewfilter   :     \
7908  : display the filtered query sequence\n  -f, --fi\
7909 lter       : str  : filter the query sequence for \
7910 low complexity \n                              reg\
7911 ions, see --paramDetail filter\n  -A, --align     \
7912    : int  : pairwise alignment format, see --param\
7913 Detail align\n  -s, --scores       : int  : number\
7914  of scores to be reported\n  -b, --alignments   : \
7915 int  : number of alignments to report\n  -S, --sen\
7916 sitivity  : str  : sensitivity of the search, \n  \
7917                             see --paramDetail sens\
7918 itivity\n  -t, --sort        : str  : sort order for\
7919  hits, see --paramDetail sort\n  -T, --stats      \
7920   : str  : statistical model, see --paramDetail st\
7921 ats\n  -d, --strand       : str  : DNA strand to s\
7922 earch with,\n                              see --p\
7923 aramDetail strand\n  -c, --topcombon    : str  : c\
7924 onsistent sets of HSPs\n      --multifasta   :    \
7925   : treat input as a set of fasta formatted sequen\
7926 ces\n\n[General]\n\n  -h, --help         :      : \
7927 prints this help text\n      --async        :     \
7928  : forces to make an asynchronous query\n      --e\
7929 mail        : str  : e-mail address\n      --title\
7930         : str  : title for job\n      --status    \
7931    :      : get job status\n      --resultTypes  :\
7932       : get available result types for job\n      \
7933 --polljob      :      : poll for the status of a j\
7934 ob\n      --jobid        : str  : jobid that was r\
7935 eturned when an asynchronous job \n               \
7936                was submitted.\n      --outfile    \
7937   : str  : file name for results (default is jobid\
7938 ;\n                              \"-\" for STDOUT)\
7939 \n      --outformat    : str  : result format to r\
7940 etrieve\n      --params       :      : list input \
7941 parameters\n      --paramDetail  : str  : display \
7942 details for input parameter\n      --quiet        \
7943 :      : decrease output\n      --verbose      :  \
7944     : increase output\n   \nSynchronous job:\n\n  \
7945 The results/errors are returned as soon as the job\
7946  is finished.\n  Usage: $scriptName --email <your\\
7947 \@email> [options...] seqFile\n  Returns: results \
7948 as an attachment\n\nAsynchronous job:\n\n  Use thi\
7949 s if you want to retrieve the results at a later t\
7950 ime. The results \n  are stored for up to 24 hours\
7951 .       \n  Usage: $scriptName --async --email <your\\@\
7952 email> [options...] seqFile\n  Returns: jobid\n\n \
7953  Use the jobid to query for the status of the job.\
7954  If the job is finished, \n  it also returns the r\
7955 esults/errors.\n  Usage: $scriptName --polljob --j\
7956 obid <jobId> [--outfile string]\n  Returns: string\
7957  indicating the status of the job and if applicabl\
7958 e, results \n  as an attachment.\n\nFurther inform\
7959 ation:\n\n  http://www.ebi.ac.uk/Tools/webservices\
7960 /services/sss/wu_blast_rest\n  http://www.ebi.ac.u\
7961 k/Tools/webservices/tutorials/perl\n\nSupport/Feed\
7962 back:\n\n  http://www.ebi.ac.uk/support/\nEOF\n}\n\
7963 \n=head1 FEEDBACK/SUPPORT\n\nPlease contact us at \
7964 L<http://www.ebi.ac.uk/support/> if you have any \\
7965 nfeedback, suggestions or issues with the service \
7966 or this client.\n\n=cut\n","\n\n\nmy $PROBTRESH = \
7967 0.3;# base pairs below this prob threshold will be\
7968  ignored\nmy $WEIGHT = 100.0; # float!!\nmy $NUCAL\
7969 PH = \"ACGTUNRYMKSWHBVD\";\nuse vars qw($NUCALPH $\
7970 WEIGHT);\n\nmy $myname = basename($0);\n\nuse stri\
7971 ct;\nuse warnings;\n\nuse File::Basename;\nuse Get\
7972 opt::Long;\nuse File::Glob ':glob';\nuse File::Spe\
7973 c;\nuse File::Temp qw/ tempfile tempdir /;\n\n\n\n\
7974 \nsub tcoffeelib_header($;$)\n{\n    my ($nseq, $f\
7975 d) = @_;\n    if (! defined($fd)) {\n        $fd =\
7976  *STDOUT;\n    }\n    printf $fd \"! TC_LIB_FORMAT\
7977 _01\\n\";\n    printf $fd \"%d\\n\", $nseq;\n}\n\n\
7978 \nsub tcoffeelib_header_addseq($$;$)\n{\n    my ($\
7979 id, $seq, $fd) = @_;\n    if (! defined($fd)) {\n \
7980        $fd = *STDOUT;\n    }\n    printf $fd \"%s \
7981 %d %s\\n\", $id, length($seq), $seq;\n}\n\n\nsub t\
7982 coffeelib_comment($;$)\n{\n    my ($comment, $fd) \
7983 = @_;\n    if (! defined($fd)) {\n        $fd = *S\
7984 TDOUT;\n    }\n    printf $fd \"!\" . $comment . \\
7985 "\\n\";\n}\n\n\nsub tcoffeelib_struct($$$;$)\n{\n \
7986    my ($nseq, $len, $bpm, $fd) = @_;\n\n    if (! \
7987 defined($fd)) {\n        $fd = *STDOUT;\n    }\n\n\
7988     # output basepair indices with fixed weight\n \
7989    printf $fd \"#%d %d\\n\", $nseq, $nseq;\n    # \
7990 output basepairs (only once) and with unit-offset\\
7991 n    for (my $i=0; $i<$len; $i++) {\n        for (\
7992 my $j=$i+1; $j<$len; $j++) {\n            if (! de\
7993 fined($bpm->[$i][$j])) {\n                print ST\
7994 DERR \"ERROR: \\$bpm->[$i][$j] undefined\\n\";\n  \
7995           }\n            if ($bpm->[$i][$j]>0) {\n\
7996                 print $fd $i+1;\n                p\
7997 rint $fd \" \";\n                print $fd $j+1;\n\
7998                 print $fd \" \" . $bpm->[$i][$j] .\
7999  \"\\n\";\n            }\n        }\n    }\n}\n\n\\
8000 nsub tcoffeelib_footer(;$)\n{\n    my ($fd) = @_;\\
8001 n    if (! defined($fd)) {\n        $fd = *STDOUT;\
8002 \n    }\n    print $fd \"! SEQ_1_TO_N\\n\";\n}\n\n\
8003 \n    \nsub plfold($$$)\n{    \n    my ($id, $seq,\
8004  $probtresh) = @_;\n    my (@struct);# return\n   \
8005  my ($templ, $fhtmp, $fnametmp, $cmd, $ctr, $windo\
8006 w_size);\n    our $ntemp++;\n    \n    $templ = $m\
8007 yname . \".pid-\" . $$ .$ntemp .\".XXXXXX\";\n    \
8008 ($fhtmp, $fnametmp) = tempfile($templ, UNLINK => 1\
8009 ); \n    print $fhtmp \">$id\\n$seq\\n\";\n\n    #\
8010  --- init basepair array\n    #\n    for (my $i=0;\
8011  $i<length($seq); $i++) {\n        for (my $j=$i+1\
8012 ; $j<length($seq); $j++) {\n            $struct[$i\
8013 ][$j]=0;\n        }\n    }\n\n\n    # --- call rna\
8014 plfold and drop a readme\n    #\n    $window_size=\
8015 (length($seq)<70)?length($seq):70;\n    $cmd = \"R\
8016 NAplfold -W $window_size < $fnametmp >/dev/null\";\
8017 \n    system($cmd);\n    \n    if ($? != 0) {\n   \
8018      printf STDERR \"ERROR: RNAplfold ($cmd) exite\
8019 d with error status %d\\n\", $? >> 8;\n        ret\
8020 urn;\n    }\n    #unlink($fnametmp);\n    my $fps \
8021 = sprintf(\"%s_dp.ps\", $id); # check long name\n \
8022    \n    if (! -s $fps) {\n      {\n\n  $fps = spri\
8023 ntf(\"%s_dp.ps\", substr($id,0,12)); # check short\
8024  name\n         if (! -s $fps)\n          {\n       die(\"couldn't\
8025  find expected file $fps\\n\");\n           return;\n     \
8026 }\n      }\n    }\n\n    \n    # --- read base pai\
8027 rs from created postscript\n    #\n    open(FH, $f\
8028 ps);\n    while (my $line = <FH>) {\n        my ($\
8029 nti, $ntj, $prob);\n        chomp($line);        \\
8030 n        # line: bp bp sqrt-prob ubox\n        my \
8031 @match = ($line =~ m/^([0-9]+) +([0-9]+) +([0-9\\.\
8032 ]+) +ubox$/);\n        if (scalar(@match)) {\n    \
8033         $nti=$1;\n            $ntj=$2;\n          \
8034   $prob=$3*$3;# prob stored as square root\n\n    \
8035         if ($prob>$probtresh) {\n                #\
8036 printf STDERR \"\\$struct[$nti][$ntj] sqrtprob=$3 \
8037 prob=$prob > $probtresh\\n\";\n                $st\
8038 ruct[$nti-1][$ntj-1] = $WEIGHT\n            }\n   \
8039          # store with zero-offset\n        }\n    \
8040 }\n    close(FH);\n\n    # remove or gzi postscrip\
8041 t\n    #\n    unlink($fps);\n    #\n    # or gzip\\
8042 n    #$cmd = \"gzip -qf $fps\";\n    #system($cmd)\
8043 ;\n    #if ($? != 0) {\n    #    printf STDERR \"E\
8044 RROR: gzip ($cmd) exited with error status %d\\n\"\
8045 , $? >> 8;\n    #}\n\n    return \\@struct;\n}\n\n\
8046 \n\n\n\nsub rnaseqfmt($)\n{\n    my ($seq) = @_;\n\
8047     # remove gaps\n    $seq =~ s/-//g;\n    # uppe\
8048 rcase RNA\n    $seq = uc($seq);\n    # T -> U\n   \
8049  $seq =~ s/T/U/g;\n    # check for invalid charate\
8050 rs\n    $_ = $seq;\n    s/[^$NUCALPH]//g;\n    ret\
8051 urn $_;\n}\n\n\n\n\nsub usage(;$)\n{    \n    my (\
8052 $errmsg) = @_;\n    if ($errmsg) {\n        print \
8053 STDERR \"ERROR: $errmsg\\n\";\n    }\n    print ST\
8054 DERR << \"EOF\";\n$myname:\n Creates a T-Coffee RN\
8055 A structure library from RNAplfold prediction.\n S\
8056 ee FIXME:citation\nUsage:\n $myname -in seq_file -\
8057 out tcoffee_lib\nEOF\n    exit(1);\n}\n\nsub read_\
8058 fasta_seq \n  {\n    my $f=$_[0];\n    my %hseq;\n\
8059     my (@seq, @com, @name);\n    my ($a, $s,$nseq)\
8060 ;\n\n    open (F, $f);\n    while (<F>)\n      {\n\
8061         $s.=$_;\n      }\n    close (F);\n\n    \n    @na\
8062 me=($s=~/>(\\S*).*\\n[^>]*/g);\n    \n    @seq =($\
8063 s=~/>.*.*\\n([^>]*)/g);\n    @com =($s=~/>(\\S*)(.\
8064 *)\\n([^>]*)/g);\n\n\n    $nseq=$#name+1;\n  \n   \
8065  for ($a=0; $a<$nseq; $a++)\n      {\n  my $n=$name\
8066 [$a];\n my $s;\n        $hseq{$n}{name}=$n;\n   $s=$seq[$a]\
8067 ;$s=~s/\\s//g;\n        \n      $hseq{$n}{seq}=$s;\n    $hseq{$n}\
8068 {com}=$com[$a];\n      }\n    return %hseq;\n  }\n\
8069 \n\n\n\n\n\n\nmy $fmsq = \"\";\nmy $flib = \"\";\n\
8070 my %OPTS;\nmy %seq;\nmy ($id, $nseq, $i);\nmy @nl;\
8071 \n\nGetOptions(\"in=s\" => \\$fmsq, \"out=s\" => \\
8072 \$flib);\n\nif (! -s $fmsq) {\n    usage(\"empty o\
8073 r non-existant file \\\"$fmsq\\\"\")\n}\nif (lengt\
8074 h($flib)==0) {\n    usage(\"empty out-filename\")\\
8075 n}\n\n\n\n\n\n\n%seq=read_fasta_seq($fmsq);\n\n\n@\
8076 nl=keys(%seq);\n\n$nseq=$#nl+1;\nopen FD_LIB, \">$\
8077 flib\" or die \"can't open $flib!\";\ntcoffeelib_h\
8078 eader($nseq, *FD_LIB);\nforeach $id (keys (%seq))\\
8079 n  {\n    my ($seq, $fmtseq);\n    \n    $seq = $s\
8080 eq{$id}{seq};\n    \n    $fmtseq = rnaseqfmt($seq)\
8081 ;# check here, formatting for folding important la\
8082 ter\n    if (length($seq)!=length($fmtseq)) {\n   \
8083      print STDERR \"ERROR: invalid sequence $id is\
8084  not an RNA sequence. read seq is: $seq\\n\";\n   \
8085      exit\n      }\n   \n    tcoffeelib_header_add\
8086 seq($id, uc($seq), *FD_LIB);\n  }\ntcoffeelib_comm\
8087 ent(\"generated by $myname on \" . localtime(), *F\
8088 D_LIB);\n\n\n\n$i=0;\nforeach $id (keys (%seq))\n \
8089  {\n    my ($cleanid, $seq, $bpm);\n    $seq=$seq{\
8090 $id}{seq};\n    $cleanid = $id;\n    $cleanid =~ s\
8091 ,[/ ],_,g;# needed for rnaplfold\n    $seq = rnase\
8092 qfmt($seq);\n    \n    $bpm = plfold($cleanid, rna\
8093 seqfmt($seq), $PROBTRESH);       \n    \n    tcoff\
8094 eelib_struct($i+1, length($seq), $bpm, *FD_LIB);\n\
8095     $i++;\n}\n\n\ntcoffeelib_footer(*FD_LIB);\nclo\
8096 se FD_LIB;\nexit (0);\n\n","\n\n\n\n\n$cmd=join ' \
8097 ', @ARGV;\nif ($cmd=~/-infile=(\\S+)/){ $seqfile=$\
8098 1;}\nif ($cmd=~/-outfile=(\\S+)/){ $libfile=$1;}\n\
8099 \n\n\n%s=read_fasta_seq ($seqfile);\n\nopen (F, \"\
8100 >$libfile\");\nforeach $name (keys (%s))\n  {\n   \
8101  my $tclib=\"$name.RNAplfold_tclib\";\n    print (\
8102 F \">$name _F_ $tclib\\n\");\n    seq2RNAplfold2tc\
8103 lib ($name, $s{$name}{seq}, $tclib);\n  }\nclose (\
8104 F);\nexit (EXIT_SUCCESS);\n\nsub seq2RNAplfold2tcl\
8105 ib\n  {\n    my ($name, $seq, $tclib)=@_;\n    my \
8106 ($tmp);\n    $n++;\n    $tmp=\"tmp4seq2RNAplfold_t\
8107 clib.$$.$n.pep\";\n    open (RF, \">$tmp\");\n    \
8108 print (RF \">$name\\n$seq\\n\");\n    close (RF);\\
8109 n    \n    system \"t_coffee -other_pg RNAplfold2t\
8110 clib.pl -in=$tmp -out=$tclib\";\n    \n    unlink \
8111 ($tmp);\n    return $tclib;\n  }\n    \n    \nsub \
8112 read_fasta_seq \n  {\n    my $f=@_[0];\n    my %hs\
8113 eq;\n    my (@seq, @com, @name);\n    my ($a, $s,$\
8114 nseq);\n\n    open (F, $f);\n    while (<F>)\n    \
8115   {\n   $s.=$_;\n      }\n    close (F);\n\n    \n  \
8116   @name=($s=~/>(\\S*).*\\n[^>]*/g);\n    \n    @se\
8117 q =($s=~/>.*.*\\n([^>]*)/g);\n    @com =($s=~/>\\S\
8118 *(.*)\\n([^>]*)/g);\n\n    \n    $nseq=$#name+1;\n\
8119     \n    for ($a=0; $a<$nseq; $a++)\n      {\n my\
8120  $n=$name[$a];\n        $hseq{$n}{name}=$n;\n   $hseq{$n}{s\
8121 eq}=$seq[$a];\n $hseq{$n}{com}=$com[$a];\n      }\\
8122 n    return %hseq;\n  }\n","use Getopt::Long;\nuse\
8123  File::Path;\nuse Env;\nuse FileHandle;\nuse Cwd;\\
8124 nuse Sys::Hostname;\nour $PIDCHILD;\nour $ERROR_DO\
8125 NE;\nour @TMPFILE_LIST;\nour $EXIT_FAILURE=1;\nour\
8126  $EXIT_SUCCESS=0;\n\nour $REFDIR=getcwd;\nour $EXI\
8127 T_SUCCESS=0;\nour $EXIT_FAILURE=1;\n\nour $PROGRAM\
8128 =\"tc_generic_method.pl\";\nour $CL=$PROGRAM;\n\no\
8129 ur $CLEAN_EXIT_STARTED;\nour $debug_lock=$ENV{\"DE\
8130 BUG_LOCK\"};\nour $LOCKDIR=$ENV{\"LOCKDIR_4_TCOFFE\
8131 E\"};\nif (!$LOCKDIR){$LOCKDIR=getcwd();}\nour $ER\
8132 RORDIR=$ENV{\"ERRORDIR_4_TCOFFEE\"};\nour $ERRORFI\
8133 LE=$ENV{\"ERRORFILE_4_TCOFFEE\"};\n&set_lock ($$);\
8134 \nif (isshellpid(getppid())){lock4tc(getppid(), \"\
8135 LLOCK\", \"LSET\", \"$$\\n\");}\n      \nour $prin\
8136 t;\nmy ($fmsq1, $fmsq2, $output, $outfile, $arch, \
8137 $psv, $hmmtop_home, $trim, $cov, $sample, $mode, $\
8138 gor_home, $gor_seq, $gor_obs);\n\nGetOptions(\"-in\
8139 =s\" => \\$fmsq1,\"-output=s\" =>\\$output ,\"-out\
8140 =s\" => \\$outfile, \"-arch=s\" => \\$arch,\"-psv=\
8141 s\" => \\$psv, \"-hmmtop_home=s\", \\$hmmtop_home,\
8142 \"-trim=s\" =>\\$trim ,\"-print=s\" =>\\$print,\"-\
8143 cov=s\" =>\\$cov , \"-sample=s\" =>\\$sample, \"-m\
8144 ode=s\" =>\\$mode, \"-gor_home=s\"=>\\$gor_home, \\
8145 "-gor_seq=s\"=>\\$gor_seq,\"-gor_obs=s\"=>\\$gor_o\
8146 bs);\n\n\nif (!$mode){$mode = \"hmmtop\"}\nelsif (\
8147 $mode eq \"hmmtop\"){;}\nelsif ($mode eq \"gor\"){\
8148 ;}\nelse {myexit(flush_error (\"-mode=$mode is unk\
8149 nown\"));}\n\n\nour $HOME=$ENV{\"HOME\"};\nour $MC\
8150 OFFEE=($ENV{\"MCOFFEE_4_TCOFFEE\"})?$ENV{\"MCOFFEE\
8151 _4_TCOFFEE\"}:\"$HOME/.t_coffee/mcoffee\";\n\nif (\
8152 $mode eq \"hmmtop\")\n  {\n    check_configuration\
8153  (\"hmmtop\");\n    if (-e $arch){$ENV{'HMMTOP_ARC\
8154 H'}=$arch;}\n    elsif (-e $ENV{HMMTOP_ARCH}){$arc\
8155 h=$ENV{HMMTOP_ARCH};}\n    elsif (-e \"$MCOFFEE/hm\
8156 mtop.arch\"){$arch=$ENV{'HMMTOP_ARCH'}=\"$MCOFFEE/\
8157 hmmtop.arch\";}\n    elsif (-e \"$hmmtop_home/hmmt\
8158 op.arc\"){$arch=$ENV{'HMMTOP_ARCH'}=\"$hmmtop_home\
8159 /hmmtop.arc\";}\n    else {myexit(flush_error ( \"\
8160 Could not find ARCH file for hmmtop\"));}\n    \n \
8161    \n    if (-e $psv){$ENV{'HMMTOP_PSV'}=$psv;}\n \
8162    elsif (-e $ENV{HMMTOP_PSV}){$psv=$ENV{HMMTOP_PS\
8163 V};}\n    elsif (-e \"$MCOFFEE/hmmtop.psv\"){$psv=\
8164 $ENV{'HMMTOP_PSV'}=\"$MCOFFEE/hmmtop.psv\";}\n    \
8165 elsif (-e \"$hmmtop_home/hmmtop.psv\"){$psv=$ENV{'\
8166 HMMTOP_PSV'}=\"$hmmtop_home/hmmtop.psv\";}\n    el\
8167 se {myexit(flush_error ( \"Could not find PSV file\
8168  for hmmtop\"));}\n  }\nelsif ($mode eq \"gor\")\n\
8169   {\n    our $GOR_SEQ;\n    our $GOR_OBS;\n    \n \
8170    check_configuration (\"gorIV\");\n    if (-e $g\
8171 or_seq){$GOR_SEQ=$gor_seq;}\n    elsif (-e $ENV{GO\
8172 R_SEQ}){$GOR_SEQ=$ENV{GOR_SEQ};}\n    elsif (-e \"\
8173 $MCOFFEE/New_KS.267.seq\"){$GOR_SEQ=\"$MCOFFEE/New\
8174 _KS.267.seq\";}\n    elsif (-e \"$gor_home/New_KS.\
8175 267.seq\"){$GOR_SEQ=\"$gor_home/New_KS.267.seq\";}\
8176 \n    else {myexit(flush_error ( \"Could not find \
8177 SEQ file for gor\"));}\n\n    if (-e $gor_obs){$GO\
8178 R_OBS=$gor_obs;}\n    elsif (-e $ENV{GOR_OBS}){$GO\
8179 R_OBS=$ENV{GOR_OBS};}\n    elsif (-e \"$MCOFFEE/Ne\
8180 w_KS.267.obs\"){$GOR_OBS=\"$MCOFFEE/New_KS.267.obs\
8181 \";}\n    elsif (-e \"$gor_home/New_KS.267.obs\"){\
8182 $GOR_OBS=\"$gor_home/New_KS.267.obs\";}\n    else \
8183 {myexit(flush_error ( \"Could not find OBS file fo\
8184 r gor\"));}\n  }\n\n\nif ( ! -e $fmsq1){myexit(flu\
8185 sh_error (\"Could Not Read Input file $fmsq1\"));}\
8186 \n\n\nmy $fmsq2=vtmpnam();\nmy $fmsq3=vtmpnam();\n\
8187 my $tmpfile=vtmpnam();\nmy $predfile=vtmpnam();\n\\
8188 nif ($trim){$trim_action=\" +trim _aln_%%$trim\\_K\
8189 1 \";}\nif ($cov) {$cov_action= \" +sim_filter _al\
8190 n_c$cov \";}\n&safe_system(\"t_coffee -other_pg se\
8191 q_reformat -in $fmsq1 -action +convert 'BOUJXZ-' $\
8192 cov_action $trim_action -output fasta_aln -out $fm\
8193 sq2\");\nmy (%pred, %seq, %predA);\n\n\n%seq=read_\
8194 fasta_seq($fmsq2);\n%seq=fasta2sample(\\%seq, $sam\
8195 ple);\n\nif (1==2 && $mode eq \"hmmtop\" && $outpu\
8196 t eq \"cons\")\n  {\n    fasta2hmmtop_cons($outfil\
8197 e,\\%seq);\n  }\nelse\n  {\n    %pred=fasta2pred(\\
8198 \%seq, $mode);\n    %predA=pred2aln (\\%pred, \\%s\
8199 eq);\n    \n    \n    if (!$output || $output eq \\
8200 "prediction\"){output_fasta_seq (\\%predA, $outfil\
8201 e);}\n    elsif ($output eq \"color_html\"){pred2c\
8202 olor (\\%pred,\\%seq, $outfile);}\n    elsif ($out\
8203 put eq \"cons\"){pred2cons($outfile,\\%predA);}\n \
8204    else {flush_error (\"$output is an unknown outp\
8205 ut mode\");}\n  }\n\nsub fasta2sample\n  {\n    my\
8206  $SR=shift;\n    my $it=shift;\n    my %S=%$SR;\n \
8207    \n    my $seq=index2seq_name (\\%S, 1);\n    my\
8208  $l=length($S{$seq}{seq});\n    my @sl=keys(%S);\n\
8209     my $nseq=$#sl+1;\n    my $index=$nseq;\n  \n  \
8210   if (!$sample) {return %S;}\n    for (my $a=0; $a\
8211 <$it; $a++)\n      {\n  my $newseq=\"\";\n      my $nnam\
8212 e=\"$seq\\_sampled_$index\";\n  for (my $p=0; $p<$l\
8213 ; $p++)\n         {\n       my $i=int(rand($nseq));\n       \
8214 \n          my $name = $sl[$i];\n           my $seq=$S{$name}\
8215 {seq};\n            my $r=substr ($seq, $p, 1);\n           $ne\
8216 wseq.=$r;\n       }\n   $S{$nname}{name}=$nname;\n      $S{$n\
8217 name}{seq}=$newseq;\n   $S{$nname}{com}=\"sampled\";\
8218 \n      $S{$nname}{index}=++$index;\n      }\n    retur\
8219 n %S;\n  }\n          \nsub fasta2pred\n  {\n    my $\
8220 s=shift;\n    my $mode=shift;\n\n    if ( $mode eq\
8221  \"hmmtop\"){return fasta2hmmtop_pred($s);}\n    e\
8222 lsif ($mode eq \"gor\"){return fasta2gor_pred ($s)\
8223 ;}\n  }\nsub fasta2hmmtop_cons\n  {\n    my $outfi\
8224 le=shift;\n    my $SR=shift;\n    \n    my $o = ne\
8225 w FileHandle;\n    my $i = new FileHandle;\n    my\
8226  $tmp_in =vtmpnam();\n    my $tmp_out=vtmpnam();\n\
8227     my %seq=%$SR;\n    my %pred;\n    my $N=keys(%\
8228 seq);\n    \n    output_fasta_seq (\\%seq,$tmp_in,\
8229  \"seq\");\n    `hmmtop -pi=mpred -if=$tmp_in -sf=\
8230 FAS -pl 2>/dev/null >$tmp_out`;\n    open ($o, \">\
8231 $outfile\");\n    open ($i, \"$tmp_out\");\n    wh\
8232 ile (<$i>)\n      {\n   my $l=$_;\n     if (($l=~/>HP\\:\
8233 \\s+(\\d+)\\s+(.*)/)){my $line=\">$2 NSEQ: $N\\n\"\
8234 ;print $o \"$line\";}\n elsif ( ($l=~/.*pred(.*)/)\
8235 )  {my $line=\"$1\\n\";print $o \"$line\";}\n     \
8236  }\n    close ($o);\n    close ($i);\n    return r\
8237 ead_fasta_seq($tmp);\n  }\nsub fasta2hmmtop_pred\n\
8238   {\n    my $SR=shift;\n    my $o = new FileHandle\
8239 ;\n    my $i = new FileHandle;\n    my $tmp    =vt\
8240 mpnam();\n    my $tmp_in =vtmpnam();\n    my $tmp_\
8241 out=vtmpnam();\n    my %seq=%$SR;\n    my %pred;\n\
8242     \n\n    output_fasta_seq (\\%seq,$tmp_in, \"se\
8243 q\");\n    `hmmtop -if=$tmp_in -sf=FAS -pl 2>/dev/\
8244 null >$tmp_out`;\n    open ($o, \">$tmp\");\n    o\
8245 pen ($i, \"$tmp_out\");\n    while (<$i>)\n      {\
8246 \n      my $l=$_;\n     if (($l=~/>HP\\:\\s+(\\d+)\\s+(.*)/\
8247 )){my $line=\">$2\\n\";print $o \"$line\";}\n   elsi\
8248 f ( ($l=~/.*pred(.*)/))  {my $line=\"$1\\n\";print\
8249  $o \"$line\";}\n      }\n    close ($o);\n    clo\
8250 se ($i);\n    return read_fasta_seq($tmp);\n  }\n \
8251    \n   \n      \n          \n  \n      \n\n    \nsub fasta2gor_pred\n \
8252  {\n    my $SR=shift;\n    my $o = new FileHandle;\
8253 \n    my $i = new FileHandle;\n    my $tmp    =vtm\
8254 pnam();\n    my $tmp_in =vtmpnam();\n    my $tmp_o\
8255 ut=vtmpnam();\n    my %seq=%$SR;\n    my %pred;\n \
8256    \n\n    output_fasta_seq (\\%seq,$tmp_in, \"seq\
8257 \");\n    `gorIV -prd $tmp_in -seq $GOR_SEQ -obs $\
8258 GOR_OBS >$tmp_out`;\n    open ($o, \">$tmp\");\n  \
8259   open ($i, \"$tmp_out\");\n    while (<$i>)\n    \
8260   {\n   my $l=$_;\n\n   \n      if ( $l=~/>/){print $o \"$l\
8261 \";}\n  elsif ( $l=~/Predicted Sec. Struct./){$l=~s\
8262 /Predicted Sec. Struct\\.//;print $o \"$l\";}\n   \
8263    }\n    close ($o);\n    close ($i);\n    return\
8264  read_fasta_seq($tmp);\n  }\n                   \n                           \nsub in\
8265 dex2seq_name\n  {\n    \n    my $SR=shift;\n    my\
8266  $index=shift;\n    \n    \n    my %S=%$SR;\n    \\
8267 n    foreach my $s (%S)\n      {\n      if ( $S{$s}{ind\
8268 ex}==$index){return $s;}\n      }\n    return \"\"\
8269 ;\n  }\n\nsub pred2cons\n  {\n    my $outfile=shif\
8270 t;\n    my $predR=shift;\n    my $seq=shift;\n    \
8271 my %P=%$predR;\n    my %C;\n    my ($s,@r,$nseq);\\
8272 n    my $f= new FileHandle;\n\n    open ($f, \">$o\
8273 utfile\");\n\n    if (!$seq){$seq=index2seq_name(\\
8274 \%P,1);}\n    foreach my $s (keys(%P))\n      {\n       \
8275 $nseq++;\n      $string= $P{$s}{seq};\n $string = uc $s\
8276 tring;\n        my @r=split (//,$string);\n     for (my $a=0;\
8277  $a<=$#r; $a++)\n         {\n       if (($r[$a]=~/[OHICE]/\
8278 )){$C{$a}{$r[$a]}++;}\n   }\n      }\n    @l=keys(\
8279 %C);\n    \n    \n    $s=$P{$seq}{seq};\n    print\
8280  $f \">$seq pred based on $nseq\\n\";\n    @r=spli\
8281 t (//,$s);\n    \n    for (my $x=0; $x<=$#r; $x++)\
8282 \n      {\n     if ($r[$x] ne \"-\")\n    {\n       my $h\
8283 =$C{$x}{H};\n       my $i=$C{$x}{I};\n      my $o=$C{\
8284 $x}{O};\n           my $c=$C{$x}{C};\n      my $e=$C{$x}{\
8285 E};\n       my $l=$i+$o;\n          \n      if ($h>=$i && \
8286 $h>=$o && $h>=$c && $h>=$e){$r[$x]='H';}\n          els\
8287 if ($i>=$o && $i>=$c && $i>=$e){$r[$x]='I';}\n     \
8288  elsif ($o>=$c && $o>=$e){$r[$x]='O';}\n            elsif\
8289  ($c>=$e){$r[$x]='C';}\n            else {$r[$x]='E';}\n        \
8290   }\n      }\n    $j=join ('', @r);\n    print $f \
8291 \"$j\\n\";\n    close ($f);\n    return $j;\n  }\n\
8292 \nsub pred2aln\n  {\n    my $PR=shift;\n    my $AR\
8293 =shift;\n    \n    my $f=new FileHandle;\n    my %\
8294 P=%$PR;\n    my %A=%$AR;\n    my %PA;\n    my $tmp\
8295 =vtmpnam();\n    my $f= new FileHandle;\n    \n   \
8296  open ($f, \">$tmp\");\n    foreach my $s (sort{$A\
8297 {$a}{index}<=>$A{$b}{index}}(keys (%A)))\n      {\\
8298 n       my (@list, $seq, @plist, @pseq, $L, $PL, $c, $w)\
8299 ;\n     my $seq;\n      my $seq=$A{$s}{seq};\n  my $pred=$P{\
8300 $s}{seq};\n     $seq=pred2alnS($P{$s}{seq},$A{$s}{seq}\
8301 );\n    print $f \">$s\\n$seq\\n\";\n      }\n    clo\
8302 se ($f);\n    return read_fasta_seq ($tmp);\n  }\n\
8303 sub pred2alnS\n  {\n    my $pred=shift;\n    my $a\
8304 ln= shift;\n    my ($j,$a,$b);\n    my @P=split (/\
8305 /, $pred);\n    my @A=split (//, $aln);\n    for (\
8306 $a=$b=0;$a<=$#A; $a++)\n      {\n       if ($A[$a] ne \"\
8307 -\"){$A[$a]=$P[$b++];}\n      }\n    if ($b!= ($#P\
8308 +1)){add_warning (\"Could not thread sequence: $b \
8309 $#P\");}\n    \n    $j= join ('', @A);\n    return\
8310  $j;\n  }\nsub pred2color\n  {\n    my $predP=shif\
8311 t;\n    my $alnP=shift;\n    my $out=shift;\n    m\
8312 y $F=new FileHandle;\n    my $struc=vtmpnam();\n  \
8313   my $aln=vtmpnam();\n    \n\n    output_fasta_seq\
8314  ($alnP, $aln);\n    my %p=%$predP;\n    \n    ope\
8315 n ($F, \">$struc\");\n    \n    \n    foreach my $\
8316 s (keys(%p))\n      {\n \n      print $F \">$s\\n\";\n  \
8317 my $s=uc($p{$s}{seq});\n        \n      $s=~s/[Oo]/0/g;\n       $s=~\
8318 s/[Ee]/0/g;\n   \n      $s=~s/[Ii]/5/g;\n       $s=~s/[Cc]/5/g;\
8319 \n      \n      $s=~s/[Hh]/9/g;\n       \n      print $F \"$s\\n\";\n  \
8320     }\n    close ($F);\n    \n    \n    \n    safe\
8321 _system ( \"t_coffee -other_pg seq_reformat -in $a\
8322 ln -struc_in $struc -struc_in_f number_fasta -outp\
8323 ut color_html -out $out\");\n    return;\n  }\n   \
8324 \n    \nsub display_fasta_seq\n  {\n    my $SR=shi\
8325 ft;\n    my %S=%$SR;\n    \n    foreach my $s (sor\
8326 t{$S{$a}{index}<=>$S{$b}{index}}(keys (%S)))\n    \
8327   {\n   print STDERR \">$s\\n$S{$s}{seq}\\n\";\n    \
8328   }\n    close ($f);\n  }\nsub output_fasta_seq\n \
8329  {\n    my $SR=shift;\n    my $outfile=shift;\n   \
8330  my $mode =shift;\n    my $f= new FileHandle;\n   \
8331  my %S=%$SR;\n    \n    \n    open ($f, \">$outfil\
8332 e\");\n    foreach my $s (sort{$S{$a}{index}<=>$S{\
8333 $b}{index}}(keys (%S)))\n      {\n      my $seq=$S{$s}{\
8334 seq};\n if ( $mode eq \"seq\"){$seq=~s/\\-//g;}\n       \
8335 print $f \">$s\\n$seq\\n\";\n      }\n    close ($\
8336 f);\n  }\n      \nsub read_fasta_seq \n  {\n    my\
8337  $f=$_[0];\n    my %hseq;\n    my (@seq, @com, @na\
8338 me);\n    my ($a, $s,$nseq);\n    my $index;\n    \
8339 open (F, $f);\n    while (<F>)\n      {\n       $s.=$_;\\
8340 n      }\n    close (F);\n\n    \n    @name=($s=~/\
8341 >(\\S*).*\\n[^>]*/g);\n    \n    @seq =($s=~/>.*.*\
8342 \\n([^>]*)/g);\n    @com =($s=~/>.*(.*)\\n([^>]*)/\
8343 g);\n\n\n    $nseq=$#name+1;\n    \n  \n    for ($\
8344 a=0; $a<$nseq; $a++)\n      {\n my $n=$name[$a];\n\
8345         my $s;\n        $hseq{$n}{name}=$n;\n   $s=$seq[$a];$s=~s/\
8346 \\s//g;\n       $hseq{$n}{index}=++$index;\n    $hseq{$n}{s\
8347 eq}=$s;\n       $hseq{$n}{com}=$com[$a];\n      }\n    r\
8348 eturn %hseq;\n  }\n\n\nsub file2head\n      {\n my\
8349  $file = shift;\n       my $size = shift;\n     my $f= new F\
8350 ileHandle;\n    my $line;\n     open ($f,$file);\n      read (\
8351 $f,$line, $size);\n     close ($f);\n   return $line;\n \
8352      }\nsub file2tail\n      {\n        my $file = shift;\
8353 \n      my $size = shift;\n     my $f= new FileHandle;\n        my\
8354  $line;\n       \n      open ($f,$file);\n      seek ($f,$size*-1,\
8355  2);\n  read ($f,$line, $size);\n       close ($f);\n   ret\
8356 urn $line;\n      }\n\n\nsub vtmpnam\n      {\n my\
8357  $r=rand(100000);\n     my $f=\"file.$r.$$\";\n while \
8358 (-e $f)\n         {\n       $f=vtmpnam();\n       }\n   push (@T\
8359 MPFILE_LIST, $f);\n     return $f;\n      }\n\nsub mye\
8360 xit\n  {\n    my $code=@_[0];\n    if ($CLEAN_EXIT\
8361 _STARTED==1){return;}\n    else {$CLEAN_EXIT_START\
8362 ED=1;}\n    ### ONLY BARE EXIT\n    exit ($code);\\
8363 n  }\nsub set_error_lock\n    {\n      my $name = \
8364 shift;\n      my $pid=$$;\n\n      \n      &lock4t\
8365 c ($$,\"LERROR\", \"LSET\", \"$$ -- ERROR: $name $\
8366 PROGRAM\\n\");\n      return;\n    }\nsub set_lock\
8367 \n  {\n    my $pid=shift;\n    my $msg= shift;\n  \
8368   my $p=getppid();\n    &lock4tc ($pid,\"LLOCK\",\\
8369 "LRESET\",\"$p$msg\\n\");\n  }\nsub unset_lock\n  \
8370  {\n     \n    my $pid=shift;\n    &lock4tc ($pid,\
8371 \"LLOCK\",\"LRELEASE\",\"\");\n  }\nsub shift_lock\
8372 \n  {\n    my $from=shift;\n    my $to=shift;\n   \
8373  my $from_type=shift;\n    my $to_type=shift;\n   \
8374  my $action=shift;\n    my $msg;\n    \n    if (!&\
8375 lock4tc($from, $from_type, \"LCHECK\", \"\")){retu\
8376 rn 0;}\n    $msg=&lock4tc ($from, $from_type, \"LR\
8377 EAD\", \"\");\n    &lock4tc ($from, $from_type,\"L\
8378 RELEASE\", $msg);\n    &lock4tc ($to, $to_type, $a\
8379 ction, $msg);\n    return;\n  }\nsub isshellpid\n \
8380  {\n    my $p=shift;\n    if (!lock4tc ($p, \"LLOC\
8381 K\", \"LCHECK\")){return 0;}\n    else\n      {\n       \
8382 my $c=lock4tc($p, \"LLOCK\", \"LREAD\");\n      if ( $c\
8383 =~/-SHELL-/){return 1;}\n      }\n    return 0;\n \
8384  }\nsub isrootpid\n  {\n    if(lock4tc (getppid(),\
8385  \"LLOCK\", \"LCHECK\")){return 0;}\n    else {ret\
8386 urn 1;}\n  }\nsub lock4tc\n     {\n       my ($pid,$type,$\
8387 action,$value)=@_;\n      my $fname;\n    my $host=hos\
8388 tname;\n          \n      if ($type eq \"LLOCK\"){$fname=\"$\
8389 LOCKDIR/.$pid.$host.lock4tcoffee\";}\n    elsif ( $\
8390 type eq \"LERROR\"){ $fname=\"$LOCKDIR/.$pid.$host\
8391 .error4tcoffee\";}\n      elsif ( $type eq \"LWARNING\
8392 \"){ $fname=\"$LOCKDIR/.$pid.$host.warning4tcoffee\
8393 \";}\n    \n      if ($debug_lock)\n        {\n       pri\
8394 nt STDERR \"\\n\\t---lock4tc(tcg): $action => $fna\
8395 me =>$value (RD: $LOCKDIR)\\n\";\n          }\n\n         if \
8396    ($action eq \"LCHECK\") {return -e $fname;}\n         \
8397  elsif ($action eq \"LREAD\"){return file2string($\
8398 fname);}\n        elsif ($action eq \"LSET\") {return s\
8399 tring2file ($value, $fname, \">>\");}\n   elsif ($\
8400 action eq \"LRESET\") {return string2file ($value,\
8401  $fname, \">\");}\n       elsif ($action eq \"LRELEASE\
8402 \") \n      {\n       if ( $debug_lock)\n               {\n               m\
8403 y $g=new FileHandle;\n            open ($g, \">>$fname\");\
8404 \n                print $g \"\\nDestroyed by $$\\n\";\n           clo\
8405 se ($g);\n                safe_system (\"mv $fname $fname.old\\
8406 ");\n           }\n           else\n            {\n               unlink ($fname);\n\
8407                 }\n         }\n   return \"\";\n        }\n     \nsub file2stri\
8408 ng\n    {\n       my $file=@_[0];\n       my $f=new FileHandl\
8409 e;\n      my $r;\n        open ($f, \"$file\");\n         while \
8410 (<$f>){$r.=$_;}\n         close ($f);\n   return $r;\n  }\
8411 \nsub string2file \n    {\n    my ($s,$file,$mode)\
8412 =@_;\n    my $f=new FileHandle;\n    \n    open ($\
8413 f, \"$mode$file\");\n    print $f  \"$s\";\n    cl\
8414 ose ($f);\n  }\n\nBEGIN\n    {\n      srand;\n    \
8415 \n      $SIG{'SIGUP'}='signal_cleanup';\n      $SI\
8416 G{'SIGINT'}='signal_cleanup';\n      $SIG{'SIGQUIT\
8417 '}='signal_cleanup';\n      $SIG{'SIGILL'}='signal\
8418 _cleanup';\n      $SIG{'SIGTRAP'}='signal_cleanup'\
8419 ;\n      $SIG{'SIGABRT'}='signal_cleanup';\n      \
8420 $SIG{'SIGEMT'}='signal_cleanup';\n      $SIG{'SIGF\
8421 PE'}='signal_cleanup';\n      \n      $SIG{'SIGKIL\
8422 L'}='signal_cleanup';\n      $SIG{'SIGPIPE'}='sign\
8423 al_cleanup';\n      $SIG{'SIGSTOP'}='signal_cleanu\
8424 p';\n      $SIG{'SIGTTIN'}='signal_cleanup';\n    \
8425   $SIG{'SIGXFSZ'}='signal_cleanup';\n      $SIG{'S\
8426 IGINFO'}='signal_cleanup';\n      \n      $SIG{'SI\
8427 GBUS'}='signal_cleanup';\n      $SIG{'SIGALRM'}='s\
8428 ignal_cleanup';\n      $SIG{'SIGTSTP'}='signal_cle\
8429 anup';\n      $SIG{'SIGTTOU'}='signal_cleanup';\n \
8430      $SIG{'SIGVTALRM'}='signal_cleanup';\n      $S\
8431 IG{'SIGUSR1'}='signal_cleanup';\n\n\n      $SIG{'S\
8432 IGSEGV'}='signal_cleanup';\n      $SIG{'SIGTERM'}=\
8433 'signal_cleanup';\n      $SIG{'SIGCONT'}='signal_c\
8434 leanup';\n      $SIG{'SIGIO'}='signal_cleanup';\n \
8435      $SIG{'SIGPROF'}='signal_cleanup';\n      $SIG\
8436 {'SIGUSR2'}='signal_cleanup';\n\n      $SIG{'SIGSY\
8437 S'}='signal_cleanup';\n      $SIG{'SIGURG'}='signa\
8438 l_cleanup';\n      $SIG{'SIGCHLD'}='signal_cleanup\
8439 ';\n      $SIG{'SIGXCPU'}='signal_cleanup';\n     \
8440  $SIG{'SIGWINCH'}='signal_cleanup';\n      \n     \
8441  $SIG{'INT'}='signal_cleanup';\n      $SIG{'TERM'}\
8442 ='signal_cleanup';\n      $SIG{'KILL'}='signal_cle\
8443 anup';\n      $SIG{'QUIT'}='signal_cleanup';\n    \
8444   \n      our $debug_lock=$ENV{\"DEBUG_LOCK\"};\n \
8445      \n      \n      \n      \n      foreach my $a\
8446  (@ARGV){$CL.=\" $a\";}\n      if ( $debug_lock ){\
8447 print STDERR \"\\n\\n\\n********** START PG: $PROG\
8448 RAM *************\\n\";}\n      if ( $debug_lock )\
8449 {print STDERR \"\\n\\n\\n**********(tcg) LOCKDIR: \
8450 $LOCKDIR $$ *************\\n\";}\n      if ( $debu\
8451 g_lock ){print STDERR \"\\n --- $$ -- $CL\\n\";}\n\
8452       \n             \n      \n      \n    }\nsub flush_e\
8453 rror\n  {\n    my $msg=shift;\n    return add_erro\
8454 r ($EXIT_FAILURE,$$, $$,getppid(), $msg, $CL);\n  \
8455 }\nsub add_error \n  {\n    my $code=shift;\n    m\
8456 y $rpid=shift;\n    my $pid=shift;\n    my $ppid=s\
8457 hift;\n    my $type=shift;\n    my $com=shift;\n  \
8458   \n    $ERROR_DONE=1;\n    lock4tc ($rpid, \"LERR\
8459 OR\",\"LSET\",\"$pid -- ERROR: $type\\n\");\n    l\
8460 ock4tc ($$, \"LERROR\",\"LSET\", \"$pid -- COM: $c\
8461 om\\n\");\n    lock4tc ($$, \"LERROR\",\"LSET\", \\
8462 "$pid -- STACK: $ppid -> $pid\\n\");\n   \n    ret\
8463 urn $code;\n  }\nsub add_warning \n  {\n    my $rp\
8464 id=shift;\n    my $pid =shift;\n    my $command=sh\
8465 ift;\n    my $msg=\"$$ -- WARNING: $command\\n\";\\
8466 n    print STDERR \"$msg\";\n    lock4tc ($$, \"LW\
8467 ARNING\", \"LSET\", $msg);\n  }\n\nsub signal_clea\
8468 nup\n  {\n    print dtderr \"\\n**** $$ (tcg) was \
8469 killed\\n\";\n    &cleanup;\n    exit ($EXIT_FAILU\
8470 RE);\n  }\nsub clean_dir\n  {\n    my $dir=@_[0];\\
8471 n    if ( !-d $dir){return ;}\n    elsif (!($dir=~\
8472 /tmp/)){return ;}#safety check 1\n    elsif (($dir\
8473 =~/\\*/)){return ;}#safety check 2\n    else\n    \
8474   {\n   `rm -rf $dir`;\n      }\n    return;\n  }\ns\
8475 ub cleanup\n  {\n    #print stderr \"\\n----tc: $$\
8476  Kills $PIDCHILD\\n\";\n    #kill (SIGTERM,$PIDCHI\
8477 LD);\n    my $p=getppid();\n    $CLEAN_EXIT_STARTE\
8478 D=1;\n    \n    \n    \n    if (&lock4tc($$,\"LERR\
8479 OR\", \"LCHECK\", \"\"))\n      {\n     my $ppid=getpp\
8480 id();\n if (!$ERROR_DONE) \n      {\n       &lock4tc($$\
8481 ,\"LERROR\", \"LSET\", \"$$ -- STACK: $p -> $$\\n\\
8482 ");\n       &lock4tc($$,\"LERROR\", \"LSET\", \"$$ -\
8483 - COM: $CL\\n\");\n       }\n      }\n    my $warning=\
8484 &lock4tc($$, \"LWARNING\", \"LREAD\", \"\");\n    \
8485 my $error=&lock4tc($$,  \"LERROR\", \"LREAD\", \"\\
8486 ");\n    #release error and warning lock if root\n\
8487     \n    if (isrootpid() && ($warning || $error) \
8488 )\n      {\n    \n      print STDERR \"**************** Su\
8489 mmary *************\\n$error\\n$warning\\n\";\n\n       \
8490 &lock4tc($$,\"LERROR\",\"RELEASE\",\"\");\n     &lock4\
8491 tc($$,\"LWARNING\",\"RELEASE\",\"\");\n      } \n \
8492    \n    \n    foreach my $f (@TMPFILE_LIST)\n    \
8493   {\n   if (-e $f){unlink ($f);} \n      }\n    fore\
8494 ach my $d (@TMPDIR_LIST)\n      {\n     clean_dir ($d)\
8495 ;\n      }\n    #No More Lock Release\n    #&lock4\
8496 tc($$,\"LLOCK\",\"LRELEASE\",\"\"); #release lock \
8497 \n\n    if ( $debug_lock ){print STDERR \"\\n\\n\\\
8498 n********** END PG: $PROGRAM ($$) *************\\n\
8499 \";}\n    if ( $debug_lock ){print STDERR \"\\n\\n\
8500 \\n**********(tcg) LOCKDIR: $LOCKDIR $$ **********\
8501 ***\\n\";}\n  }\nEND \n  {\n    \n    &cleanup();\\
8502 n  }\n   \n\nsub safe_system \n{\n  my $com=shift;\
8503 \n  my $ntry=shift;\n  my $ctry=shift;\n  my $pid;\
8504 \n  my $status;\n  my $ppid=getppid();\n  if ($com\
8505  eq \"\"){return 1;}\n  \n  \n\n  if (($pid = fork\
8506  ()) < 0){return (-1);}\n  if ($pid == 0)\n    {\n\
8507       set_lock($$, \" -SHELL- $com (tcg)\");\n    \
8508   exec ($com);\n    }\n  else\n    {\n      lock4t\
8509 c ($$, \"LLOCK\", \"LSET\", \"$pid\\n\");#update p\
8510 arent\n      $PIDCHILD=$pid;\n    }\n  if ($debug_\
8511 lock){printf STDERR \"\\n\\t .... safe_system (fas\
8512 ta_seq2hmm)  p: $$ c: $pid COM: $com\\n\";}\n\n  w\
8513 aitpid ($pid,WTERMSIG);\n\n  shift_lock ($pid,$$, \
8514 \"LWARNING\",\"LWARNING\", \"LSET\");\n\n  if ($? \
8515 == $EXIT_FAILURE || lock4tc($pid, \"LERROR\", \"LC\
8516 HECK\", \"\"))\n    {\n      if ($ntry && $ctry <$\
8517 ntry)\n {\n       add_warning ($$,$$,\"$com failed [re\
8518 try: $ctry]\");\n         lock4tc ($pid, \"LRELEASE\", \\
8519 "LERROR\", \"\");\n       return safe_system ($com, $n\
8520 try, ++$ctry);\n        }\n      elsif ($ntry == -1)\n  {\\
8521 n         if (!shift_lock ($pid, $$, \"LERROR\", \"LWARN\
8522 ING\", \"LSET\"))\n         {\n       add_warning ($$,\
8523 $$,\"$com failed\");\n      }\n   else\n            {\n   \
8524     lock4tc ($pid, \"LRELEASE\", \"LERROR\", \"\")\
8525 ;\n         }\n   return $?;}\n      else\n     {\n       if (\
8526 !shift_lock ($pid,$$, \"LERROR\",\"LERROR\", \"LSE\
8527 T\"))\n     {\n       myexit(add_error ($EXIT_FAIL\
8528 URE,$$,$pid,getppid(), \"UNSPECIFIED system\", $co\
8529 m));\n      }\n }\n    }\n  return $?;\n}\n\nsub ch\
8530 eck_configuration \n    {\n      my @l=@_;\n      \
8531 my $v;\n      foreach my $p (@l)\n      {\n       \n      if  \
8532  ( $p eq \"EMAIL\")\n       { \n              if ( !($EMAIL\
8533 =~/@/))\n               {\n             add_warning($$,$$,\"Could Not Use \
8534 EMAIL\");\n             myexit(add_error ($EXIT_FAILURE,$$,$$\
8535 ,getppid(),\"EMAIL\",\"$CL\"));\n             }\n           }\\
8536 n         elsif( $p eq \"INTERNET\")\n      {\n       if \
8537 ( !&check_internet_connection())\n              {\n               myexit(\
8538 add_error ($EXIT_FAILURE,$$,$$,getppid(),\"INTERNE\
8539 T\",\"$CL\"));\n                }\n         }\n   elsif( $p eq \"wge\
8540 t\")\n      {\n       if (!&pg_is_installed (\"wget\
8541 \") && !&pg_is_installed (\"curl\"))\n          {\n               mye\
8542 xit(add_error ($EXIT_FAILURE,$$,$$,getppid(),\"PG_\
8543 NOT_INSTALLED:wget\",\"$CL\"));\n               }\n         }\n   e\
8544 lsif( !(&pg_is_installed ($p)))\n           {\n       my\
8545 exit(add_error ($EXIT_FAILURE,$$,$$,getppid(),\"PG\
8546 _NOT_INSTALLED:$p\",\"$CL\"));\n            }\n }\n      \
8547 return 1;\n    }\nsub pg_is_installed\n  {\n    my\
8548  @ml=@_;\n    my $r, $p, $m;\n    my $supported=0;\
8549 \n    \n    my $p=shift (@ml);\n    if ($p=~/::/)\\
8550 n      {\n      if (safe_system (\"perl -M$p -e 1\")==$\
8551 EXIT_SUCCESS){return 1;}\n      else {return 0;}\n     \
8552  }\n    else\n      {\n $r=`which $p 2>/dev/null`;\
8553 \n      if ($r eq \"\"){return 0;}\n    else {return 1;}\n\
8554       }\n  }\n\n\n\nsub check_internet_connection\\
8555 n  {\n    my $internet;\n    my $tmp;\n    &check_\
8556 configuration ( \"wget\"); \n    \n    $tmp=&vtmpn\
8557 am ();\n    \n    if     (&pg_is_installed    (\"w\
8558 get\")){`wget www.google.com -O$tmp >/dev/null 2>/\
8559 dev/null`;}\n    elsif  (&pg_is_installed    (\"cu\
8560 rl\")){`curl www.google.com -o$tmp >/dev/null 2>/d\
8561 ev/null`;}\n    \n    if ( !-e $tmp || -s $tmp < 1\
8562 0){$internet=0;}\n    else {$internet=1;}\n    if \
8563 (-e $tmp){unlink $tmp;}\n\n    return $internet;\n\
8564   }\nsub check_pg_is_installed\n  {\n    my @ml=@_\
8565 ;\n    my $r=&pg_is_installed (@ml);\n    if (!$r \
8566 && $p=~/::/)\n      {\n print STDERR \"\\nYou Must\
8567  Install the perl package $p on your system.\\nRUN\
8568 :\\n\\tsudo perl -MCPAN -e 'install $pg'\\n\";\n  \
8569     }\n    elsif (!$r)\n      {\n       myexit(flush_err\
8570 or(\"\\nProgram $p Supported but Not Installed on \
8571 your system\"));\n      }\n    else\n      {\n  ret\
8572 urn 1;\n      }\n  }\n\n\n\n","\n\n\n\n\nmy $FMODE\
8573 L =\"\"; \nmy $TMPDIR = \"/tmp\";\n\n\n\n\nmy $NUC\
8574 ALPH = \"ACGTUNRYMKSWHBVD\";\nmy $PRIMNUCALPH = \"\
8575 ACGTUN\";\nuse vars qw($NUCALPH $PRIMNUCALPH $TMPD\
8576 IR);\n\n\nmy $errmsg;\nuse vars qw($errmsg);\n\n\n\
8577 \nuse Getopt::Long;\nuse Cwd;\nuse File::Basename;\
8578 \nuse File::Temp qw/ tempfile tempdir /;\nuse File\
8579 ::Copy;\nuse File::Path;\n\n\n\nsub usage(;$)\n{\n\
8580     my ($errmsg) = @_;\n    my $myname = basename(\
8581 $0);\n\n    if ($errmsg) {\n        print STDERR \\
8582 "ERROR: $errmsg\\n\";\n    }\n\n    print STDERR <\
8583 < \"EOF\";\n    \n$myname: align two sequences by \
8584 means of consan\\'s sfold\nUsage:\n $myname -i fil\
8585 e -o file -d path\nOptions:\n -i|--in : pairwise i\
8586 nput sequence file\n -o|--out: output alignment\n \
8587 -d|--directory containing data\n\nEOF\n}\n\nsub re\
8588 ad_stk_aln \n  {\n    my $f=$_[0];\n    my ($seq, \
8589 $id);\n    \n    my %hseq;\n\n    open (STK, \"$f\\
8590 ");\n    while (<STK>)\n      {\n       if ( /^#/ || /^\\
8591 \/\\// || /^\\s*$/){;}\n        else\n    {\n       ($id,$se\
8592 q)=/(\\S+)\\s+(\\S+)/;\n            $hseq{$id}{'seq'}.=$s\
8593 eq;\n     }\n      }\n    close (STK);\n    return %\
8594 hseq;\n  }\nsub read_fasta_seq \n  {\n    my $f=$_\
8595 [0];\n    my %hseq;\n    my (@seq, @com, @name);\n\
8596     my ($a, $s,$nseq);\n\n    open (F, $f);\n    w\
8597 hile (<F>)\n      {\n   $s.=$_;\n      }\n    close \
8598 (F);\n\n    \n    @name=($s=~/>(.*).*\\n[^>]*/g);\\
8599 n    \n    @seq =($s=~/>.*.*\\n([^>]*)/g);\n    @c\
8600 om =($s=~/>.*(.*)\\n([^>]*)/g);\n\n    \n    $nseq\
8601 =$#name+1;\n    \n    for ($a=0; $a<$nseq; $a++)\n\
8602       {\n       my $n=$name[$a];\n      $hseq{$n}{name}=$n;\n\
8603         $hseq{$n}{seq}=$seq[$a];\n      $hseq{$n}{com}=$com[$a\
8604 ];\n      }\n    return %hseq;\n  }\n\n\n\nsub sfo\
8605 ld_parseoutput($$)\n{\n    my ($frawout, $foutfa) \
8606 = @_;\n    my %haln;\n    my ($fstk, $cmd, $id);\n\
8607     open FOUTFA, \">$foutfa\";\n    \n    $fstk = \
8608 $frawout . \".stk\";\n    \n    # first line of ra\
8609 w out contains info\n    # remaining stuff is stoc\
8610 kholm formatted\n    $cmd = \"sed -e '1d' $frawout\
8611 \";\n    system(\"$cmd > $fstk\");\n    if ($? != \
8612 0) {\n        $errmsg = \"command failed with exit\
8613  status $?.\";\n        $errmsg .=  \"Command was \
8614 \\\"$cmd\\\"\";\n        return -1;\n    }\n\n    \
8615 # this gives an error message. just ignore it...\n\
8616     %haln=read_stk_aln ( $fstk);\n    foreach $i (\
8617 keys (%haln))\n      {\n        my $s;\n        $s=$haln{$i}{'se\
8618 q'};\n  $s =~ s/\\./-/g;\n      print FOUTFA \">$i\\n$s\\
8619 \n\";\n      }\n    close FOUTFA;\n    return 0;\n\
8620 }\n\n\n\n\nsub sfold_wrapper($$$$)\n{\n    \n    m\
8621 y ($fs1, $fs2, $fmodel, $foutfa) = @_;\n    \n\n  \
8622   my ($cmd, $frawout, $ferrlog, $freadme, $ftimelo\
8623 g, $fstk);\n\n    # add  basename($fmsqin) (unknow\
8624 n here!)\n    $frawout = \"sfold.log\";\n    $ferr\
8625 log = \"sfold.err\";\n    $ftimelog = \"sfold.time\
8626 \";\n    $freadme =  \"sfold.README\";\n    $fstk \
8627 = \"sfold.stk\";\n    \n    # prepare execution...\
8628 \n    #\n    # ./tmp is essential for dswpalign\n \
8629    # otherwise you'll get a segfault\n    mkdir \"\
8630 ./tmp\";\n    \n    $cmd = \"sfold -m $fmodel $fs1\
8631  $fs2\";\n    open(FREADME,\">$freadme\");\n    pr\
8632 int FREADME \"$cmd\\n\"; \n    close(FREADME);\n\n\
8633     # and go\n    #\n    system(\"/usr/bin/time -p\
8634  -o $ftimelog $cmd >$frawout 2>$ferrlog\");\n    i\
8635 f ($? != 0) {\n        $errmsg = \"command failed \
8636 with exit status $?\";\n        $errmsg .= \"comma\
8637 nd was \\\"$cmd\\\". See \" . getcwd . \"\\n\";\n \
8638        return -1;\n    }\n\n    return sfold_parse\
8639 output($frawout, $foutfa);\n}\n\n\n\n\n\n\n\nmy ($\
8640 help, $fmsqin, $fmsaout);\nGetOptions(\"help\"  =>\
8641  \\$help,\n           \"in=s\" => \\$fmsqin,\n    \
8642        \"out=s\" => \\$fmsaout,\n          \"data=s\" =>\
8643  \\$ref_dir);\n\n\n\nif ($help) {\n    usage();\n \
8644    exit(0);\n}\nif (! defined($fmsqin)) {\n    usa\
8645 ge('missing input filename');\n    exit(1);\n}\nif\
8646  (! defined($fmsaout)) {\n    usage('missing outpu\
8647 t filename');\n    exit(1);\n\n}\nif (scalar(@ARGV\
8648 )) {\n    usage('Unknown remaining args');\n    ex\
8649 it(1);\n}\n\n$FMODEL = \"$ref_dir/mix80.mod\";\nif\
8650  (! -e \"$FMODEL\") {\n    die(\"couldn't find sfo\
8651 ld grammar model file. Expected $FMODEL\\n\");\n}\\
8652 n\n\nmy %hseq=read_fasta_seq ($fmsqin);\nmy $id;\n\
8653 \nforeach $id (keys(%hseq))\n  {\n    push(@seq_ar\
8654 ray, $hseq{$id});\n  }\n\nif ( scalar(@seq_array) \
8655 != 2 ) {\n    die(\"Need *exactly* two sequences a\
8656 s input (pairwise alignment!).\")\n}\n\n\n\nmy ($s\
8657 ec, $min, $hour, $mday, $mon, $year, $wday, $yday,\
8658  $isdst) = localtime(time);\nmy $datei = sprintf(\\
8659 "%4d-%02d-%02d\", $year+1900, $mon+1, $mday);\nmy \
8660 $templ = basename($0) . \".\" . $datei . \".pid-\"\
8661  . $$ . \".XXXXXX\";\nmy $wd = tempdir ( $templ, D\
8662 IR => $TMPDIR);\n\ncopy($fmsqin, \"$wd/\" . basena\
8663 me($fmsqin) . \".org\"); # for reproduction\ncopy(\
8664 $FMODEL, \"$wd\");\nmy $fmodel = basename($FMODEL)\
8665 ;\nmy $orgwd = getcwd;\nchdir $wd;\n\n\n\nmy @seps\
8666 eqfiles;\nforeach $id (keys(%hseq)) {\n    my ($se\
8667 q, $orgseq, $fname, $sout);\n    $seq=$hseq{$id}{'\
8668 seq'};\n    \n    $fname = basename($fmsqin) . \"_\
8669 $id.fa\";\n    # replace funnies in file/id name (\
8670 e.g. \"/\" \" \" etc)\n    $fname =~ s,[/ ],_,g;\n\
8671     open (PF, \">$fname\");\n    print (PF \">$id\\
8672 \n$seq\\n\");\n    close (PF);\n\n    push(@sepseq\
8673 files, $fname);\n}\n\nmy ($f1, $f2, $fout);\n$f1 =\
8674  $sepseqfiles[0];\n$f2 = $sepseqfiles[1];\n$fout =\
8675  $wd . basename($fmsqin) . \".out.fa\";\nif (sfold\
8676 _wrapper($f1, $f2, $fmodel, \"$fout\") != 0) {\n  \
8677   printf STDERR \"ERROR: See logs in $wd\\n\";\n  \
8678   exit(1);\n} else {\n    chdir $orgwd;\n    copy(\
8679 $fout, $fmsaout);\n    rmtree($wd);\n   exit(0);\n\
8680 }\n","\nuse Env qw(HOST);\nuse Env qw(HOME);\nuse \
8681 Env qw(USER);\n\n\n$tmp=clean_cr ($ARGV[0]);\nopen\
8682  (F, $tmp);\n\nwhile ( <F>)\n  {\n    my $l=$_;\n \
8683    if ( $l=~/^# STOCKHOLM/){$stockholm=1;}\n    el\
8684 sif ( $stockholm && $l=~/^#/)\n      {\n        $l=~/^#(\\
8685 \S+)\\s+(\\S+)\\s+(\\S*)/g;\n   $l=\"_stockholmhasch\
8686 _$1\\_stockholmspace_$2 $3\\n\";\n      }\n    $fi\
8687 le.=$l;\n  }\nclose (F);\nunlink($tmp);\n$file1=$f\
8688 ile;\n\n$file=~s/\\#/_hash_symbol_/g;\n$file=~s/\\\
8689 @/_arobase_symbol_/g;\n\n\n$file=~s/\\n[\\.:*\\s]+\
8690 \\n/\\n\\n/g;\n\n$file=~s/\\n[ \\t\\r\\f]+(\\b)/\\\
8691 n\\1/g;\n\n\n$file=~s/(\\n\\S+)(\\s+)(\\S)/\\1_bla\
8692 nk_\\3/g;\n\n$file=~s/[ ]//g;\n$file=~s/_blank_/ /\
8693 g;\n\n\n\n$file =~s/\\n\\s*\\n/#/g;\n\n$file.=\"#\\
8694 ";\n$file =~s/\\n/@/g;\n\n\n\n\n@blocks=split /\\#\
8695 /, $file;\nshift (@blocks);\n@s=split /\\@/, $bloc\
8696 ks[0];\n$nseq=$#s+1;\n\n\n\n$file=join '@', @block\
8697 s;\n@lines=split /\\@/,$file;\n\n$c=0;\n\nforeach \
8698 $l (@lines)\n  {\n    if (!($l=~/\\S/)){next;}\n  \
8699   elsif ($stockholm && ($l=~/^\\/\\// || $l=~/STOC\
8700 KHOLM/)){next;}#get read of STOCHOLM Terminator\n \
8701   \n    $l=~/(\\S+)\\s+(\\S*)/g;\n    $n=$1; $s=$2\
8702 ;\n    \n    $seq[$c].=$s;\n    $name[$c]=$n;\n   \
8703  $c++;\n    \n    if ( $c==$nseq){$c=0;}\n    \n  \
8704 } \n\nif ( $c!=0)\n      {\n    print STDERR \"ERROR:\
8705  $ARGV[0] is NOT an MSA in Clustalw format: make s\
8706 ure there is no blank line within a block [ERROR]\\
8707 \n\";\n exit (EXIT_FAILURE);\n      }\n\nfor ($a=0\
8708 ; $a< $nseq; $a++)\n  {\n    $name[$a]=cleanstring\
8709  ($name[$a]);\n    $seq[$a]=cleanstring ($seq[$a])\
8710 ;\n    $seq[$a]=breakstring($seq[$a], 60);\n    \n\
8711     $line=\">$name[$a]\\n$seq[$a]\\n\";\n    \n   \
8712  print \"$line\";\n  }\nexit (EXIT_SUCCESS);\n\nsu\
8713 b cleanstring\n  {\n    my $s=@_[0];\n    $s=~s/_h\
8714 ash_symbol_/\\#/g;\n    $s=~s/_arobase_symbol_/\\@\
8715 /g;\n    $s=~s/[ \\t]//g;\n    return $s;\n  }\nsu\
8716 b breakstring\n  {\n    my $s=@_[0];\n    my $size\
8717 =@_[1];\n    my @list;\n    my $n,$ns, $symbol;\n \
8718    \n    @list=split //,$s;\n    $n=0;$ns=\"\";\n \
8719    foreach $symbol (@list)\n      {\n   if ( $n==$si\
8720 ze)\n     {\n       $ns.=\"\\n\";\n         $n=0;\n       }\n   \
8721 $ns.=$symbol;\n $n++;\n      }\n    return $ns;\n \
8722    }\n\nsub clean_cr\n  {\n    my $f=@_[0];\n    m\
8723 y $file;\n    \n    $tmp=\"f$.$$\";\n    \n    \n \
8724    open (IN, $f);\n    open (OUT, \">$tmp\");\n   \
8725  \n    while ( <IN>)\n      {\n $file=$_;\n     $file=\
8726 ~s/\\r\\n/\\n/g;\n      $file=~s/\\n\\r/\\n/g;\n        $file=\
8727 ~s/\\r\\r/\\n/g;\n      $file=~s/\\r/\\n/g;\n   print OUT\
8728  \"$file\";\n      }\n    \n    close (IN);\n    c\
8729 lose (OUT);\n    return $tmp;\n  }\n","use Env qw(\
8730 HOST);\nuse Env qw(HOME);\nuse Env qw(USER);\n\n\n\
8731 $query_start=-1;\n$query_end=-1;\n\nwhile (<>)\n  \
8732 {\n    if ( /\\/\\//){$in_aln=1;}\n    elsif ( $in\
8733 _aln && /(\\S+)\\s+(.*)/)\n      {\n\n\n        $name=$1;\
8734 \n      \n\n    $seq=$2;\n      $seq=~s/\\s//g;\n        $seq=~\
8735 s/\\~/\\-/g;\n  $seq=~s/\\./\\-/g;\n    if ( $list{$n}\
8736 {'name'} && $list{$n}{'name'} ne $name)\n         {\n     \
8737   print \"$list{$n}{'name'} Vs $name\";\n           \n   \
8738    exit (EXIT_FAILURE);\n         }\n   else\n    {\n       $\
8739 list{$n}{'name'}= $name;\n        }\n\n $list{$n}{'seq'\
8740 }=$list{$n}{'seq'}.$seq;\n      \n      $nseq=++$n;\n   \n    \
8741   }\n    else\n      {$n=0;}\n  }\n\n\nfor ($a=0; \
8742 $a<$nseq; $a++)\n  {\n    print \">$list{$a}{'name\
8743 '}\\n$list{$a}{'seq'}\\n\";\n  }\n      \n","\nuse\
8744  Env qw(HOST);\nuse Env qw(HOME);\nuse Env qw(USER\
8745 );\n\n                                            \
8746             \nuse strict;                         \
8747                     \nuse warnings;\nuse diagnosti\
8748 cs;\n\nmy $in_hit_list, my $in_aln=0, my(%name_lis\
8749 t)=(),my (%list)=(),my $n_seq=0; my $test=0;\nmy($\
8750 j)=0, my $n=0, my $nom, my $lg_query, my %vu=();\n\
8751 \nopen (F, \">tmp\");\n\n$/=\"\\n\";\nwhile (<>)\n\
8752 {\n    print F $_;\n    if($_ =~ /Query=\\s*(.+?)\\
8753 \s/i) { $nom=$1;}\n\n    if ( /Sequences producing\
8754  significant alignments/){$in_hit_list=1;}\n    \n\
8755     if ($_=~ /^pdb\\|/i) { $_=~ s/pdb\\|//g; }\n  \
8756   if ($_=~ /^(1_\\d+)\\s+\\d+/) { $_=~ s/$1/QUERY/\
8757 ;}\n      \n    if ( /^(\\S+).+?\\s+[\\d.]+\\s+([\\
8758 \de.-]+)\\s+$/ && $in_hit_list) \n    {\n       my($id)=\
8759 $1; # \n        $id=~ s/\\|/_/g; #\n    if ($id =~ /.+_$/) {\
8760  chop($id) }; #\n       $name_list{$n_seq++}=$id;\n     $nam\
8761 e_list{$n_seq-1}=~ s/.*\\|//g;     \n    }\n  \n  \
8762   if (/query/i) {$in_aln=1;}\n    if ( /^(\\S+)\\s\
8763 +(\\d+)\\s+([a-zA-Z-]+)\\s+(\\d+)/ || /^(\\S+)(\\s\
8764 +)(\\-+)(\\s+)/ && ($in_aln == 1))\n    {\n     my $na\
8765 me=$1;\n        my $start=$2;\n my $seq=$3;\n   my $end=$4;\
8766 \n              \n      if ($name =~ /QUERY/i) { $lg_query=length($\
8767 seq); }\n\n     unless ($test > $n) #m\n        {\n         my(@s\
8768 eqq)= split('',$seq);\n     my($gap_missing)= scal\
8769 ar(@seqq);\n        \n      while ($gap_missing != $lg\
8770 _query)  { unshift (@seqq,\"-\"); $gap_missing= sc\
8771 alar(@seqq); }\n            $seq=join('',@seqq);  #m\n  }\\
8772 n       \n      if ($name =~ /QUERY/i)\n        {\n         $n=0; %vu=()\
8773 ; $j=0;\n           $list{$n}{'real_name'}=\"$nom\";\n  }\
8774         \n      else\n  {\n         unless (exists $vu{$name}) { ++\
8775 $j;}    \n          $list{$n}{'real_name'}=$name_list{$j-1\
8776 };\n    }\n             \n      $list{$n}{'name'}=$name;\n\n    $seq=~tr\
8777 /a-z/A-Z/;\n    $list{$n}{'seq'}=$list{$n}{'seq'};\n    \
8778 $list{$n}{'seq'}.=$seq;\n\n     $n++;\n $vu{$name}++;\\
8779 n       $test++;\n   } \n    \n}\n\nmy @numero=();\n\nfo\
8780 r (my $a=0; $a<$n; $a++) #m\n{\n    my $long=lengt\
8781 h($list{0}{'seq'});  \n    my $long1= length($list\
8782 {$a}{'seq'});\n  \n    while ($long1 ne $long)\n  \
8783   {\n   $list{$a}{'seq'}.=\"-\";\n      $long1= length ($\
8784 list{$a}{'seq'});\n    } \n \n    push (@numero,\"\
8785 $list{$a}{'name'} $list{$a}{'real_name'}\\n\");\n}\
8786 \n\nmy %dejavu=();\n\n\nfor (my $i=0; $i<=$#numero\
8787 ; $i++)\n{\n    my $s=\">$list{$i}{'real_name'}\\n\
8788 $list{$i}{'seq'}\\n\";\n    my $k=0;\n    \n    if\
8789  (exists $dejavu{$numero[$i]}) {next;}\n    else\n\
8790     {   \n      for ($j=0; $j<$n ; $j++)\n      {\n         if (\"\
8791 $numero[$i]\" eq \"$numero[$j]\" && $j != $i )\n         \
8792    {\n          ++$k;\n         $s .=\">$list{$j}{'real_name'}\\n\
8793 $list{$j}{'seq'}\\n\";\n            }\n }       \n    }\n    \n\
8794     if ($k>0) \n    {\n my $cons;\n     open (SOR,\">t\
8795 empo_aln2cons\"); print SOR $s;  close SOR ;\n  ope\
8796 n (COM,\"t_coffee -other_pg seq_reformat -in tempo\
8797 _aln2cons -action +aln2cons +upper |\") ; \n            \
8798 while (<COM>)\n {       \n          if (/^>/) { $cons =\">$li\
8799 st{$i}{'real_name'}\\n\"; next;}\n          $_=~ s/\\n/\
8800 /g;\n       $cons .=$_;\n       }\n     close COM; unlink (\"t\
8801 empo_aln2cons\");\n     print $cons,\"\\n\"; print F $\
8802 cons,\"\\n\";\n    }    \n    else  { print $s;  prin\
8803 t F $s; }\n    \n    $dejavu{$numero[$i]}++;\n} #m\
8804 \n\nexit;\n\n\n\n\n\n\n\n\n\n\n\n","use Env;\n\n\n\
8805 $tmp_dir=\"\";\n$init_dir=\"\";\n$program=\"tc_gen\
8806 eric_method.pl\";\n\n$blast=@ARGV[0];\n\n$name=\"q\
8807 uery\";$seq=\"\";\n%p=blast_xml2profile($name,$seq\
8808 ,100, 0, 0, $blast);\n&output_profile (%p);\n\n\ns\
8809 ub output_profile\n  {\n    my (%profile)=(@_);\n \
8810    my ($a);\n    for ($a=0; $a<$profile{n}; $a++)\\
8811 n      {\n      \n      print \">$profile{$a}{name} $profile\
8812 {$a}{comment}\\n$profile{$a}{seq}\\n\";\n      }\n\
8813     return;\n  }\nsub file_contains \n  {\n    my \
8814 ($file, $tag, $max)=(@_);\n    my ($n);\n    $n=0;\
8815 \n    \n    if ( !-e $file && ($file =~/$tag/)) {r\
8816 eturn 1;}\n    elsif ( !-e $file){return 0;}\n    \
8817 else \n      {\n        open (FC, \"$file\");\n while ( <\
8818 FC>)\n    {\n       if ( ($_=~/$tag/))\n              {\n               c\
8819 lose (FC);\n            return 1;\n           }\n           elsif ($ma\
8820 x && $n>$max)\n       {\n               close (FC);\n           return 0\
8821 ;\n           }\n           $n++;\n       }\n      }\n    close \
8822 (FC);\n    return 0;\n  }\n         \n    \nsub file2st\
8823 ring\n  {\n    my $f=@_[0];\n    my $string, $l;\n\
8824     open (F,\"$f\");\n    while (<F>)\n      {\n\n\
8825         $l=$_;\n        #chomp ($l);\n  $string.=$l;\n      }\n  \
8826   close (F);\n    $string=~s/\\r\\n//g;\n    $stri\
8827 ng=~s/\\n//g;\n    return $string;\n  }\n\n\n\nsub\
8828  tag2value \n  {\n    \n    my $tag=(@_[0]);\n    \
8829 my $word=(@_[1]);\n    my $return;\n    \n    $tag\
8830 =~/$word=\"([^\"]+)\"/;\n    $return=$1;\n    retu\
8831 rn $return;\n  }\n      \nsub hit_tag2pdbid\n  {\n\
8832     my $tag=(@_[0]);\n    my $pdbid;\n       \n   \
8833  $tag=~/id=\"(\\S+)\"/;\n    $pdbid=$1;\n    $pdbi\
8834 d=~s/_//;\n    return $pdbid;\n  }\nsub id2pdbid \\
8835 n  {\n    my $id=@_[0];\n  \n    if ($id =~/pdb/)\\
8836 n      {\n      $id=~/pdb(.*)/;\n       $id=$1;\n      }\n   \
8837  $id=~s/[|¦_]//g;\n    return $id;\n  }\nsub set_b\
8838 last_type \n  {\n    my $file =@_[0];\n    if (&fi\
8839 le_contains ($file,\"EBIApplicationResult\",100)){\
8840 $BLAST_TYPE=\"EBI\";}\n    elsif (&file_contains (\
8841 $file,\"NCBI_BlastOutput\",100)) {$BLAST_TYPE=\"NC\
8842 BI\";}\n    else\n      {\n     $BLAST_TYPE=\"\";\n   \
8843    }\n    return $BLAST_TYPE;\n  }\nsub blast_xml2\
8844 profile \n  {\n    my ($name,$seq,$maxid, $minid, \
8845 $mincov, $file)=(@_);\n    my (%p, $a, $string, $n\
8846 );\n    \n\n\n    if ($BLAST_TYPE eq \"EBI\" || &f\
8847 ile_contains ($file,\"EBIApplicationResult\",100))\
8848 {%p=ebi_blast_xml2profile(@_);}\n    elsif ($BLAST\
8849 _TYPE eq \"NCBI\" || &file_contains ($file,\"NCBI_\
8850 BlastOutput\",100)){%p=ncbi_blast_xml2profile(@_);\
8851 }\n    else \n      {\n print \"************ ERROR\
8852 : Blast Returned an unknown XML Format ***********\
8853 ***********\";\n        die;\n      }\n    for ($a=0; $a<\
8854 $p{n}; $a++)\n      {\n my $name=$p{$a}{name};\n        $\
8855 p{$name}{seq}=$p{$a}{seq};\n      }\n    return %p\
8856 ;\n  }\nsub ncbi_blast_xml2profile \n  {\n    my (\
8857 $name,$seq,$maxid, $minid, $mincov, $string)=(@_);\
8858 \n    my ($L,$l, $a,$b,$c,$d,$nhits,@identifyerL);\
8859 \n    \n    \n    $seq=~s/[^a-zA-Z]//g;\n    $L=le\
8860 ngth ($seq);\n    \n    %hit=&xml2tag_list ($strin\
8861 g, \"Hit\");\n    \n    \n    for ($nhits=0,$a=0; \
8862 $a<$hit{n}; $a++)\n      {\n    my ($ldb,$id, $identi\
8863 ty, $expectation, $start, $end, $coverage, $r);\n       \
8864 my (%ID,%DE,%HSP);\n    \n      $ldb=\"\";\n\n  %ID=&xml2ta\
8865 g_list ($hit{$a}{body}, \"Hit_id\");\n  $identifyer\
8866 =$ID{0}{body};\n        \n      %DE=&xml2tag_list ($hit{$a}{bo\
8867 dy}, \"Hit_def\");\n    $definition=$DE{0}{body};\n     \\
8868 n       %HSP=&xml2tag_list ($hit{$a}{body}, \"Hsp\");\n \
8869 for ($b=0; $b<$HSP{n}; $b++)\n    {\n       my (%STAR\
8870 T,%END,%E,%I,%Q,%M);\n\n         \n         %START=&xml2tag_l\
8871 ist ($HSP{$b}{body}, \"Hsp_query-from\");\n         %H\
8872 START=&xml2tag_list ($HSP{$b}{body}, \"Hsp_hit-fro\
8873 m\");\n     \n      %LEN=  &xml2tag_list ($HSP{$b}{\
8874 body}, \"Hsp_align-len\");\n        %END=  &xml2tag_l\
8875 ist ($HSP{$b}{body}, \"Hsp_query-to\");\n           %HEN\
8876 D=  &xml2tag_list ($HSP{$b}{body}, \"Hsp_hit-to\")\
8877 ;\n         %E=&xml2tag_list     ($HSP{$b}{body}, \"Hs\
8878 p_evalue\");\n      %I=&xml2tag_list     ($HSP{$b}{\
8879 body}, \"Hsp_identity\");\n         %Q=&xml2tag_list  \
8880    ($HSP{$b}{body}, \"Hsp_qseq\");\n        %M=&xml2t\
8881 ag_list     ($HSP{$b}{body}, \"Hsp_hseq\");\n       \
8882 \n          for ($e=0; $e<$Q{n}; $e++)\n\n            {\n               $\
8883 qs=$Q{$e}{body};\n              $ms=$M{$e}{body};\n             if ($seq \
8884 eq\"\"){$seq=$qs;$L=length($seq);}\n            \n              $expecta\
8885 tion=$E{$e}{body};\n            $identity=($LEN{$e}{body}==0\
8886 )?0:$I{$e}{body}/$LEN{$e}{body}*100;\n          $start=$ST\
8887 ART{$e}{body};\n                $end=$END{$e}{body};\n          $Hstart=\
8888 $HSTART{$e}{body};\n            $Hend=$HEND{$e}{body};\n        \n      \
8889         $coverage=(($end-$start)*100)/$L;\n\n   \n              if ($id\
8890 entity>$maxid || $identity<$minid || $coverage<$mi\
8891 ncov){next;}\n          @lr1=(split (//,$qs));\n                @lr2=(sp\
8892 lit (//,$ms));\n                $l=$#lr1+1;\n           for ($c=0;$c<$L;$\
8893 c++){$p[$nhits][$c]=\"-\";}\n           for ($d=0,$c=0; $c<\
8894 $l; $c++)\n               {\n               $r=$lr1[$c];\n                  if ( $\
8895 r=~/[A-Za-z]/)\n                      {\n                       \n                      $p[$nhits][$d +\
8896  $start-1]=$lr2[$c];\n                  $d++;\n               }\n                 }\n\
8897                 $Qseq[$nhits]=$qs;\n            $Hseq[$nhits]=$ms;\n            $Qst\
8898 artL[$nhits]=$start;\n          $HstartL[$nhits]=$Hstart;\\
8899 n               $identityL[$nhits]=$identity;\n         $endL[$nhits]=\
8900 $end;\n         $definitionL[$nhits]=$definition;\n             $ide\
8901 ntifyerL[$nhits]=$identifyer;\n         $comment[$nhits]=\
8902 \"$ldb|$identifyer [Eval=$expectation][id=$identit\
8903 y%][start=$Hstart end=$Hend]\";\n               $nhits++;\n        \
8904    }\n    }\n      }\n    \n    $profile{n}=0;\n   \
8905  $profile{$profile{n}}{name}=$name;\n    $profile{\
8906 $profile{n}}{seq}=$seq;\n    $profile {n}++;\n    \
8907 \n    for ($a=0; $a<$nhits; $a++)\n      {\n    $n=$a\
8908 +1;\n   \n      $profile{$n}{name}=\"$name\\_$a\";\n    $pro\
8909 file{$n}{seq}=\"\";\n   $profile{$n}{Qseq}=$Qseq[$a]\
8910 ;\n     $profile{$n}{Hseq}=$Hseq[$a];\n $profile{$n}{Q\
8911 start}=$QstartL[$a];\n  $profile{$n}{Hstart}=$Hstar\
8912 tL[$a];\n       $profile{$n}{identity}=$identityL[$a];\n\
8913         $profile{$n}{definition}=$definitionL[$a];\n    $pro\
8914 file{$n}{identifyer}=$identifyerL[$a];\n        $profile{\
8915 $n}{comment}=$comment[$a];\n    for ($b=0; $b<$L; $b+\
8916 +)\n      {\n       if ($p[$a][$b])\n         {\n               $profi\
8917 le{$n}{seq}.=$p[$a][$b];\n            }\n           else\n        \
8918     {\n         $profile{$n}{seq}.=\"-\";\n           }\n         }\
8919 \n      }\n    \n    $profile{n}=$nhits+1;\n    re\
8920 turn %profile;\n  }\nsub ebi_blast_xml2profile \n \
8921  {\n    my ($name,$seq,$maxid, $minid, $mincov, $s\
8922 tring)=(@_);\n    my ($L,$l, $a,$b,$c,$d,$nhits,@i\
8923 dentifyerL,$identifyer);\n    \n\n    \n    $seq=~\
8924 s/[^a-zA-Z]//g;\n    $L=length ($seq);\n    %hit=&\
8925 xml2tag_list ($string, \"hit\");\n    \n    for ($\
8926 nhits=0,$a=0; $a<$hit{n}; $a++)\n      {\n      my ($ld\
8927 b,$id, $identity, $expectation, $start, $end, $cov\
8928 erage, $r);\n   my (%Q,%M,%E,%I);\n     \n      $ldb=&tag2val\
8929 ue ($hit{$a}{open}, \"database\");\n    $identifyer=&\
8930 tag2value ($hit{$a}{open}, \"id\");\n\n $descripti\
8931 on=&tag2value ($hit{$a}{open}, \"description\");\n\
8932         \n      %Q=&xml2tag_list ($hit{$a}{body}, \"querySeq\"\
8933 );\n    %M=&xml2tag_list ($hit{$a}{body}, \"matchSeq\\
8934 ");\n   %E=&xml2tag_list ($hit{$a}{body}, \"expectat\
8935 ion\");\n       %I=&xml2tag_list ($hit{$a}{body}, \"iden\
8936 tity\");\n      \n\n    for ($b=0; $b<$Q{n}; $b++)\n      {\n\
8937             \n      \n      $qs=$Q{$b}{body};\n     $ms=$M{\
8938 $b}{body};\n        if ($seq eq\"\"){$seq=$qs;$L=leng\
8939 th($seq);}\n\n      $expectation=$E{$b}{body};\n          \
8940   $identity=$I{$b}{body};\n         \n              \n     \
8941  $start=&tag2value ($Q{$b}{open}, \"start\");\n   \
8942   $end=&tag2value ($Q{$b}{open}, \"end\");\n        $\
8943 startM=&tag2value ($M{$b}{open}, \"start\");\n     \
8944  $endM=&tag2value ($M{$b}{open}, \"end\");\n        $\
8945 coverage=(($end-$start)*100)/$L;\n          \n     # pri\
8946 nt \"$id: ID: $identity COV: $coverage [$start $en\
8947 d]\\n\";\n          \n      \n      if ($identity>$maxid \
8948 || $identity<$minid || $coverage<$mincov){next;}\n\
8949             # print \"KEEP\\n\";\n\n        \n      @lr1=(spl\
8950 it (//,$qs));\n     @lr2=(split (//,$ms));\n        $\
8951 l=$#lr1+1;\n        for ($c=0;$c<$L;$c++){$p[$nhits][\
8952 $c]=\"-\";}\n       for ($d=0,$c=0; $c<$l; $c++)\n       \
8953      {\n                $r=$lr1[$c];\n          if ( $r=~/[A-Za-z]/)\n          \
8954   {\n               \n              $p[$nhits][$d + $start-1]=$lr2[\
8955 $c];\n              $d++;\n               }\n         }\n         \n        \n   \
8956    $identifyerL[$nhits]=$identifyer;\n      $commen\
8957 t[$nhits]=\"$ldb|$identifyer [Eval=$expectation][i\
8958 d=$identity%][start=$startM end=$endM]\";\n         $n\
8959 hits++;\n         }\n      }\n    \n    $profile{n}=0;\n\
8960     $profile{$profile{n}}{name}=$name;\n    $profi\
8961 le{$profile{n}}{seq}=$seq;\n    $profile {n}++;\n \
8962    \n    for ($a=0; $a<$nhits; $a++)\n      {\n $n\
8963 =$a+1;\n        $profile{$n}{name}=\"$name\\_$a\";\n    $pro\
8964 file{$n}{seq}=\"\";\n   $profile{$n}{identifyer}=$id\
8965 entifyerL[$a];\n        \n      $profile{$n}{comment}=$comment\
8966 [$a];\n for ($b=0; $b<$L; $b++)\n         {\n       if ($p\
8967 [$a][$b])\n           {\n               $profile{$n}{seq}.=$p[$a][$\
8968 b];\n         }\n           else\n            {\n               $profile{$n}\
8969 {seq}.=\"-\";\n       }\n         }\n      }\n    $profi\
8970 le{n}=$nhits+1;\n    \n    return %profile;\n  }\n\
8971 \nsub blast_xml2hit_list\n  {\n    my $string=(@_[\
8972 0]);\n    return &xml2tag_list ($string, \"hit\");\
8973 \n  }\nsub xml2tag_list  \n  {\n    my ($string_in\
8974 ,$tag)=@_;\n    my $tag_in, $tag_out;\n    my %tag\
8975 ;\n    \n    if (-e $string_in)\n      {\n      $string\
8976 =&file2string ($string_in);\n      }\n    else\n  \
8977     {\n $string=$string_in;\n      }\n    $tag_in1\
8978 =\"<$tag \";\n    $tag_in2=\"<$tag>\";\n    $tag_o\
8979 ut=\"/$tag>\";\n    $string=~s/>/>##1/g;\n    $str\
8980 ing=~s/</##2</g;\n    $string=~s/##1/<#/g;\n    $s\
8981 tring=~s/##2/#>/g;\n    @l=($string=~/(\\<[^>]+\\>\
8982 )/g);\n    $tag{n}=0;\n    $in=0;$n=-1;\n  \n \n\n\
8983     foreach $t (@l)\n      {\n\n        $t=~s/<#//;\n   $t=\
8984 ~s/#>//;\n      \n      if ( $t=~/$tag_in1/ || $t=~/$tag_in2\
8985 /)\n      {\n    \n         $in=1;\n        $tag{$tag{n}}{open\
8986 }=$t;\n     $n++;\n         \n    }\n   elsif ($t=~/$tag_\
8987 out/)\n   {\n       \n\n            $tag{$tag{n}}{close}=$t\
8988 ;\n         $tag{n}++;\n            $in=0;\n      }\n   elsif ($in\
8989 )\n       {\n      \n       $tag{$tag{n}}{body}.=$t;\n    }\
8990 \n      }\n  \n    return %tag;\n  }\n\n\n\n\n","u\
8991 se Env qw(HOST);\nuse Env qw(HOME);\nuse Env qw(US\
8992 ER);\nwhile (<>)\n  {\n    if ( /^>(\\S+)/)\n     \
8993  {\n    if ($list{$1})\n          {\n       print \">$1_$list{\
8994 $1}\\n\";\n         $list{$1}++;\n        }\n   else\n    {\n   \
8995     print $_;\n     $list{$1}=1;\n        }\n      }\n \
8996    else\n      {\n      print $_;\n      }\n  }\n      \
8997 \n","\n\n\nuse Env qw(HOST);\nuse Env qw(HOME);\nu\
8998 se Env qw(USER);\n\n\nopen (F,$ARGV[0]);\nwhile ( \
8999 <>)\n  {\n    @x=/([^:,;\\)\\(\\s]+):[^:,;\\)\\(]*\
9000 /g;\n    @list=(@list,@x);\n  }\n$n=$#list+1;\nfor\
9001 each $n(@list){print \">$n\\nsequence\\n\";}\n\n\n\
9002 close (F);\n","\nopen (F, $ARGV[0]);\n\nwhile ( <F\
9003 >)\n  {\n    @l=($_=~/(\\S+)/g);\n    \n    $name=\
9004 shift @l;\n    \n    print STDOUT \"\\n>$name\\n\"\
9005 ;\n    foreach $e (@l){$e=($e eq \"0\")?\"O\":\"I\\
9006 ";print \"$e\";}\n  }\nclose (F);\n\n                  \n  \
9007   \n","use Env qw(HOST);\nuse Env qw(HOME);\nuse E\
9008 nv qw(USER);\n\n$tmp=\"$ARGV[0].$$\";\nopen (IN, $\
9009 ARGV[0]);\nopen (OUT, \">$tmp\");\n\nwhile ( <IN>)\
9010 \n  {\n    $file=$_;\n    $file=~s/\\r\\n/\\n/g;\n\
9011     $file=~s/\\n\\r/\\n/g;\n    $file=~s/\\r\\r/\\\
9012 n/g;\n    $file=~s/\\r/\\n/g;\n    print OUT \"$fi\
9013 le\";\n  }\nclose (IN);\nclose (OUT);\n\nopen (OUT\
9014 , \">$ARGV[0]\");\nopen (IN, \"$tmp\");\n\nwhile (\
9015  <IN>)\n{\n  print OUT \"$_\";\n}\nclose (IN);\ncl\
9016 ose (OUT);\nunlink ($tmp);\n\n"};