JWS-112 Bumping version of T-Coffee to version 11.00.8cbe486.
[jabaws.git] / binaries / src / tcoffee / t_coffee_source / util_lib / aln_compare.c
diff --git a/binaries/src/tcoffee/t_coffee_source/util_lib/aln_compare.c b/binaries/src/tcoffee/t_coffee_source/util_lib/aln_compare.c
new file mode 100644 (file)
index 0000000..10383d5
--- /dev/null
@@ -0,0 +1,1469 @@
+/******************************COPYRIGHT NOTICE*******************************/
+/*  (c) Centro de Regulacio Genomica                                                        */
+/*  and                                                                                     */
+/*  Cedric Notredame                                                                        */
+/*  12 Aug 2014 - 22:07.                                                                    */
+/*All rights reserved.                                                                      */
+/*This file is part of T-COFFEE.                                                            */
+/*                                                                                          */
+/*    T-COFFEE is free software; you can redistribute it and/or modify                      */
+/*    it under the terms of the GNU General Public License as published by                  */
+/*    the Free Software Foundation; either version 2 of the License, or                     */
+/*    (at your option) any later version.                                                   */
+/*                                                                                          */
+/*    T-COFFEE is distributed in the hope that it will be useful,                           */
+/*    but WITHOUT ANY WARRANTY; without even the implied warranty of                        */
+/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                         */
+/*    GNU General Public License for more details.                                          */
+/*                                                                                          */
+/*    You should have received a copy of the GNU General Public License                     */
+/*    along with Foobar; if not, write to the Free Software                                 */
+/*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA             */
+/*...............................................                                           */
+/*  If you need some more information                                                       */
+/*  cedric.notredame@europe.com                                                             */
+/*...............................................                                           */
+/******************************COPYRIGHT NOTICE*******************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "io_lib_header.h"
+#include "util_lib_header.h"
+#include "dp_lib_header.h"
+#include "define_header.h"
+
+//-----------MARIA ADDED CHANGES------------//
+
+FILE * compare_al_to_lib ( Constraint_list *CL, int start, char *fname, Sequence *S)
+{
+    
+       int a, b, s1, s2, r1, r2;
+       int len;
+       static int* translation;
+       FILE *fp;
+
+
+       if ( translation!=NULL)vfree(translation);
+         translation=(int*)vcalloc ( (CL->S)->nseq+1, sizeof (int));
+           for ( b=0,a=0; a< (CL->S)->nseq; a++)
+               {
+                       if ( name_is_in_list((CL->S)->name[a],S->name,S->nseq, 100)==-1)
+                       {
+                               (CL->S)->len[a]=-1;
+                               translation [a]=-1;
+                       }
+                       else
+                       {
+                               translation[a]=b++;
+                       }
+               }
+
+       
+       fp=vfopen ( fname, "w");
+       fp=save_list_header (fp,CL);
+               
+       len=CL->ne;
+       
+       if (len==start && CL->cpu!=-1)
+       {
+               fprintf (fp, "! CPU %d\n",get_time());
+               return fp;
+       }
+       else
+       {
+               Sequence *S=CL->S;
+               int ***cacheI=(int***)vcalloc (S->nseq, sizeof (int**));
+               int **cacheR=(int**)vcalloc (S->nseq, sizeof (int*));
+               int *tot=(int*)vcalloc ( S->nseq, sizeof (int));
+               int *max=(int*)vcalloc ( S->nseq, sizeof (int));
+               for (a=0;a<S->nseq; a++)
+                 {
+                   cacheI[a]=(int**)vcalloc (S->len[a], sizeof (int*));
+                   cacheR[a]=(int*)vcalloc (S->len[a], sizeof (int));
+                 }
+               for (a=0; a<S->nseq; a++)max[a]=S->len[a];
+
+               for (s1=0; s1<S->nseq; s1++)
+                 {
+                 for (r1=1; r1<=S->len[s1]; r1++)
+                   {
+                     for (b=1; b<CL->residue_index[s1][r1][0]; b+=ICHUNK)
+                       {
+
+                         s2=CL->residue_index[s1][r1][b+SEQ2];
+                         if (tot[s2]>=max[s2])
+                           {
+                             max[s2]+=100;
+                             cacheI[s2]=(int**)vrealloc (cacheI[s2], max[s2]*sizeof (int*));
+                             cacheR[s2]=(int*)vrealloc (cacheR[s2], max[s2]*sizeof (int*));
+                           }
+
+                         cacheI[s2][tot[s2]]=CL->residue_index[s1][r1]+b;
+                         cacheR[s2][tot[s2]]=r1;
+                         tot[s2]++;
+                       }
+                   }
+
+                       for (s2=0;s2<S->nseq; s2++)
+                       {
+                               int x1=translation[s1];
+                               int x2=translation[s2];
+                               if (tot[s2] && x1!=-1 && x2!=-1 && x1<x2)
+                               {
+                                       fprintf ( fp, "#%d %d\n", x1+1, x2+1);
+                                       for ( r2=0; r2<tot[s2];r2++)
+                                       {
+                                               int *v=cacheI[s2][r2];
+                                               fprintf (fp, "%5d %5d %5d %5d %5d\n",cacheR[s2][r2], v[R2], v[WE], v[CONS], v[MISC]);
+                                       }
+                               }
+                               tot[s2]=0;
+                       }
+               }
+               for (a=0; a<S->nseq; a++)
+               {
+                       vfree (cacheI[a]);
+                       vfree (cacheR[a]);
+               }
+               vfree (cacheI); vfree (cacheR);
+               vfree (tot);
+               vfree (max);
+       }
+
+       return save_list_footer (fp, CL);
+
+}
+//-----------END OF CHANGES------------//
+int aln_compare ( int argc, char *argv[])
+    {
+    int a, b, c, f;
+       
+    Alignment *A, *B;
+    Sequence *SA, *SB, *TOT_SEQ=NULL;
+    Sequence *defined_residueA;
+    Sequence *defined_residueB;
+    char **seq_list;
+    int n_seq_file;
+    
+    
+    Sequence  *S=NULL;
+    Structure *ST=NULL;
+    Result *R=NULL;
+    char *buf1;
+    char *buf2;
+
+/*PARAMETERS*/
+    char ***grep_list;
+    int n_greps;
+    char compare_mode[STRING];
+    char sim_aln[STRING];
+    char *alignment1_file;
+    char *alignment2_file;
+    //---Maria added this---
+    char *lib_file; //---
+    
+    char *pep1_file;
+    char *pep2_file;
+    
+    char io_format[STRING];
+
+    int n_structure;
+    char **struct_file;
+    char **struct_format;
+    int *n_symbol;
+    char ***symbol_list;
+    int pep_compare;
+    int aln_compare;
+    int count;
+    int print_pair;
+    int output_aln;
+    int output_aln_threshold;
+    char output_aln_file[LONG_STRING];
+    char output_aln_format[LONG_STRING];
+    char output_aln_modif[LONG_STRING];
+/*LIST VARIABLES*/
+    Constraint_list *CL_A;
+    Constraint_list *CL_B;
+    //---Maria added this---//
+    Constraint_list *CL;
+
+    int pos_in_clist;
+    Sequence *CLS;
+
+
+/*Column Comparison Variables*/
+ int **posA;
+ int **posB;
+ int **seq_cache;
+ int is_same;
+ int *correct_column;
+/*RESULTS_VARIABLES*/
+    int **tot_count;
+    int **pos_count;
+    int ***pw_tot_count;
+    int ***pw_pos_count;
+    int *glob;
+    int **pw_glob;
+    int s1, r1, s2, r2;
+/*IO VARIABLES*/
+    int n_categories;
+    char ***category;
+    char *category_list;
+    int *n_sub_categories;
+    char sep_l;
+    char sep_r;
+    char io_file[STRING];
+    FILE *fp;
+    int **aln_output_count;
+    int **aln_output_tot;
+    
+/*Sims VARIABLES*/
+    float **sim;
+    float **sim_param;
+    char sim_matrix[STRING];
+    
+    int sim_n_categories;
+    char ***sim_category;
+    char *sim_category_list;
+    int *sim_n_sub_categories;
+    
+    
+    if ( argc==1|| strm6 ( argv[1], "h", "-h", "help", "-help", "-man", "?"))
+      {
+       output_informations();
+      }
+    
+    argv=standard_initialisation (argv, &argc);
+    /*Declarations and Initializations*/
+    alignment1_file=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    alignment2_file=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    //---Maria added this---//
+    lib_file=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    
+    pep1_file=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    pep2_file=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    
+
+    sprintf (compare_mode, "sp");
+    count=0;
+    pep_compare=0;
+    aln_compare=1;
+
+    
+    grep_list=(char***)vcalloc ( STRING, sizeof (char**));
+    for ( a=0; a< STRING; a++)grep_list[a]=declare_char (3, STRING);
+    n_greps=0;
+
+    n_structure=0;
+    struct_file=declare_char ( MAX_N_STRUC, LONG_STRING);
+    struct_format=declare_char (MAX_N_STRUC, STRING);
+    
+    n_symbol=(int*)vcalloc ( MAX_N_STRUC, sizeof (int));
+    symbol_list=(char***)vcalloc (MAX_N_STRUC, sizeof (char**));
+    for ( a=0; a< MAX_N_STRUC; a++)symbol_list[a]=declare_char ( 100, 100);
+    
+
+   
+    
+    n_categories=1;
+    category=(char***)vcalloc ( MAX_N_CATEGORIES, sizeof (char**));
+    for ( a=0; a< MAX_N_CATEGORIES; a++)category[a]=declare_char(100, STRING);
+    n_sub_categories=(int*)vcalloc ( 100, sizeof (int));
+    category_list=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    sprintf ( category_list, "[*][*]=[ALL]");
+    
+
+    sim_n_categories=1;
+    sim_category=(char***)vcalloc ( MAX_N_CATEGORIES, sizeof (char**));
+    for ( a=0; a< MAX_N_CATEGORIES; a++)sim_category[a]=declare_char(100, STRING);
+    sim_n_sub_categories=(int*)vcalloc ( 100, sizeof (int));
+    sim_category_list=(char*)vcalloc ( LONG_STRING, sizeof (char));
+    sprintf ( sim_category_list, "[*][*]=[ALL]");
+    sprintf ( sim_aln, "al1");
+    sim_matrix[0]='\0';
+    sprintf ( sim_category_list, "[*][*]=[ALL]");
+    
+    sprintf ( io_format, "ht");
+    sprintf ( io_file, "stdout");
+    sep_l='[';
+    sep_r=']';
+
+    output_aln=0;
+    print_pair=0;
+    output_aln_threshold=100;
+    sprintf ( output_aln_file, "stdout");
+    sprintf ( output_aln_format, "clustalw");
+    sprintf ( output_aln_modif, "lower");
+/*END OF INITIALIZATION*/
+    
+   
+
+    
+/*PARAMETERS INPUT*/
+
+    for ( a=1; a< argc; a++)
+       {
+       if      (strcmp ( argv[a], "-f")==0)
+               {
+               sprintf  (io_file,"%s", argv[++a]);
+               }
+        else if ( strcmp ( argv[a], "-sim_aln")==0)
+               {
+               sprintf  (sim_aln,"%s", argv[++a]);
+               }
+       else if ( strcmp ( argv[a], "-sim_matrix")==0)
+               {
+               sprintf  (sim_matrix,"%s", argv[++a]);
+               }
+       else if ( strm ( argv[a], "-compare_mode"))
+               {
+               sprintf ( compare_mode, "%s", argv[++a]);
+               }
+       else if ( strcmp ( argv[a], "-sim_cat")==0)
+               {       
+               if ( argv[++a][0]!='[')
+                  {
+                  if ( strcmp ( argv[a], "3d_ali")==0)sprintf ( sim_category_list, "[b][b]+[h][h]=[struc]");
+                  else
+                      {
+                      fprintf ( stderr, "\n%s: Unknown category for distance measure", argv[a]);
+                      } 
+                  }
+               else
+                  {
+                  sprintf ( sim_category_list, "%s", argv[a]);
+                  }
+               }
+       else if ( strcmp ( argv[a], "-grep_value")==0)
+               {
+               sprintf ( grep_list[n_greps][0], "%s", argv[++a]);
+               sprintf ( grep_list[n_greps][1], "%s", argv[++a]);
+               n_greps++;
+            
+               }
+       //----- Maria added this----
+       else if ( strcmp ( argv[a], "-lib")==0)
+               {
+               sprintf ( lib_file, "%s", argv[++a]);
+               
+               }       
+       else if ( strcmp ( argv[a], "-al")==0)
+               {
+               
+               sprintf ( alignment2_file, "%s", argv[++a]);
+               
+               }       
+       //-----END of changes-----
+       else if ( strcmp ( argv[a], "-al1")==0)
+               {
+               
+               sprintf ( alignment1_file, "%s", argv[++a]);
+               
+               }       
+       else if ( strcmp ( argv[a], "-al2")==0)
+               {
+               
+               sprintf ( alignment2_file, "%s", argv[++a]);
+               
+               }
+       else if (  strcmp ( argv[a], "-pep1")==0)
+               {
+               pep_compare=1;
+               sprintf ( pep1_file, "%s", argv[++a]);
+               }
+       else if (  strcmp ( argv[a], "-pep2")==0)
+               {
+               pep_compare=1;
+               sprintf ( pep2_file, "%s", argv[++a]);
+               }
+       else if (  strcmp ( argv[a], "-pep")==0)
+               {
+               pep_compare=1;
+               }
+       else if (  strcmp ( argv[a], "-count")==0)
+               {
+               count=1;
+               }
+       else if (  strcmp ( argv[a], "-print_pair")==0)
+               {
+               print_pair=1;
+               }               
+       else if (  strcmp ( argv[a], "-output_aln")==0)
+               {
+               output_aln=1;
+               }               
+       else if (  strcmp ( argv[a], "-output_aln_threshold")==0)
+               {
+               output_aln_threshold=atoi(argv[++a]);
+               }
+       else if (  strcmp ( argv[a], "-output_aln_file")==0)
+               {
+               sprintf (output_aln_file,"%s",argv[++a]);
+               }
+       else if (  strcmp ( argv[a], "-output_aln_format")==0)
+               {
+               sprintf (output_aln_format,"%s",argv[++a]);
+               }
+       else if (  strcmp ( argv[a], "-output_aln_modif")==0)
+               {
+               sprintf (output_aln_modif,"%s",argv[++a]);
+               }
+       else if ( strcmp ( argv[a], "-st")==0)
+               {
+               sprintf ( struct_file  [n_structure], "%s", argv[++a]);
+               if (!NEXT_ARG_IS_FLAG && is_a_struc_format (argv[a+1]))
+                   sprintf ( struct_format[n_structure], "%s", argv[++a]);
+               else
+                   sprintf ( struct_format[n_structure], "%s", "pep");
+               
+               if ( !NEXT_ARG_IS_FLAG && strcmp ( argv[a+1], "conv")==0)
+                  {
+                  a++;
+                  while(!NEXT_ARG_IS_FLAG)
+                        { 
+                        sprintf ( symbol_list[n_structure][n_symbol[n_structure]], "%s", argv[++a]);
+                        n_symbol[n_structure]++; 
+                        }
+                  }
+               else if (!NEXT_ARG_IS_FLAG)
+                        {
+                        symbol_list[n_structure]=make_symbols ( argv[++a], &n_symbol[n_structure]);
+                        }
+
+               else 
+                        {
+                         symbol_list[n_structure]=make_symbols ( "any", &n_symbol[n_structure]);
+                        }
+               
+               n_structure++;
+               
+               }
+       else if ( strcmp  (argv[a], "-sep")==0)
+               {
+               if ( !NEXT_ARG_IS_FLAG)
+                   get_separating_char ( argv[++a][0], &sep_l, &sep_r);
+               else
+                   sep_l=sep_r=' ';
+               }
+       else if ( strncmp ( argv[a], "-io_format",5)==0)
+               {
+               sprintf ( io_format, "%s", argv[++a]);
+               }
+       else if ( strcmp ( argv[a], "-io_cat")==0)
+               {
+               if ( argv[++a][0]!='[')
+                  {
+                  if ( strcmp ( argv[a], "3d_ali")==0)sprintf ( category_list, "[b][b]+[h][h]=[struc];[*][*]=[tot]");
+                  }
+               else
+                  {
+                  sprintf ( category_list, "%s", argv[a]);
+                  }
+               }
+       else
+               {
+               fprintf ( stdout, "\nOPTION %s UNKNOWN[FATAL]\n", argv[a]);
+               myexit (EXIT_FAILURE);
+               }
+       }
+/*PARAMETER PROCESSING*/
+ //---Maria added this---//
+       CL=NULL;
+
+if ( pep_compare==1 || count==1)aln_compare=0;
+if ( aln_compare==1)pep_compare=0; 
+
+/*READ THE TOTAL SEQUENCES*/
+       seq_list=declare_char ( 100,STRING);
+       n_seq_file=0;
+
+        if (  alignment1_file[0] && !check_file_exists ( alignment1_file))
+        {
+          fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n",  alignment1_file, PROGRAM);
+          myexit(EXIT_FAILURE);
+        } 
+       if (  alignment2_file[0] && !check_file_exists ( alignment2_file))
+        {
+          fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n",  alignment2_file, PROGRAM);
+          myexit(EXIT_FAILURE);
+        }
+       if (  pep1_file[0] && !check_file_exists ( pep1_file))
+        {
+          fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n",  pep1_file, PROGRAM);
+          myexit(EXIT_FAILURE);
+        }
+       if (  pep2_file[0] && !check_file_exists ( pep2_file))
+        {
+          fprintf (stderr, "\nERROR: %s DOES NOT EXIST[FATAL:%s]\n",  pep2_file, PROGRAM);
+          myexit(EXIT_FAILURE);
+        }
+       
+       if ( alignment1_file[0])sprintf ( seq_list[n_seq_file++], "A%s", alignment1_file);
+       if ( alignment2_file[0])sprintf ( seq_list[n_seq_file++], "A%s", alignment2_file);
+       if ( pep1_file[0])sprintf ( seq_list[n_seq_file++], "S%s", pep1_file);
+       if ( pep2_file[0])sprintf ( seq_list[n_seq_file++], "S%s", pep2_file);
+       if ( lib_file[0]){               //----------------Maria added this-----------------// 
+          
+         int *entry, *aln_pos;
+         char **tmp_pos;
+         int tot_we=0, al_we=0, len, i, j;
+         double comp_Score=0;
+       
+         CL=read_constraint_list_file( CL, lib_file);
+         printf("%s  %s\n",lib_file, alignment2_file);
+         
+         TOT_SEQ=read_seq_in_n_list ( seq_list, n_seq_file, NULL, NULL);
+         B=declare_aln (TOT_SEQ);
+         main_read_aln ( alignment2_file, B);
+         
+         tmp_pos= (char **) malloc ( CL->S->nseq * sizeof(char *) );
+         for (i=0; i< B->nseq; i++){
+           for (j=0; j< CL->S->nseq; j++){
+               if( strcmp(CL->S->name[j], B->name[i])==0 ){
+                     tmp_pos[j]=B->seq_al[i];                                          //printf(" %s   \n", tmp_pos[j]);
+                     break;
+               }
+           }
+         }
+         B->seq_al = tmp_pos;                                                          //printf("\n");   for (i=0; i< B->nseq; i++){ printf(" %s   \n", B->seq_al[i]);  }
+           
+         SB=aln2seq ( B);
+         CL_B=declare_constraint_list ( SB, NULL, NULL, 0, NULL, NULL);          
+         CL_B=aln2constraint_list_full (B,CL_B, "1");
+         
+         while ( ( entry=extract_entry (CL) ) ){ tot_we+=entry[WE]; }
+        
+         while ( ( entry=extract_entry (CL_B) ) ){
+          
+             if ((main_search_in_list_constraint (entry,&pos_in_clist,4,CL))!=NULL){   //printf ("-%d- S1:%d  S2:%d    R1:%d R2:%d", ++c, entry[SEQ1], entry[SEQ2], entry[R1], entry[R2]); 
+               
+               len=CL->residue_index[ entry[SEQ1] ][ entry[R1] ][0];
+               i=0;
+               while ((i<len) && (CL->residue_index[ entry[SEQ1] ][ entry[R1] ][1+(i*5)])!=entry[SEQ2])
+                 ++i;
+               
+               if (i<len)
+               {                                                                        //printf("     %d\n", CL->residue_index[ entry[SEQ1] ][ entry[R1] ][(i*5)+3]);
+                   al_we+= (CL->residue_index[ entry[SEQ1] ][ entry[R1] ][(i*5)+3]);
+               } 
+             } 
+         }
+         
+         comp_Score=(double)al_we/tot_we; 
+         printf("SCORE:  %d   %d    %.3lf\n", al_we, tot_we, comp_Score );
+       }
+       //--------------------------------------------------------------------------------//
+       
+       else{
+       
+       TOT_SEQ=read_seq_in_n_list ( seq_list, n_seq_file, NULL, NULL);
+             
+       A=declare_aln (TOT_SEQ);
+       B=declare_aln (TOT_SEQ);
+
+/*1 COMPARISON OF THE SEQUENCES*/
+    if ( pep_compare==1 || count==1)
+       {
+       f=0; 
+
+       if ( pep1_file[0]!='\0')SA=main_read_seq (pep1_file);
+       else if (alignment1_file[0]!='\0')  
+           {          
+          main_read_aln ( alignment1_file, A);
+          SA=aln2seq ( A);
+          }
+       else 
+          {
+          main_read_aln ("stdin", A);
+          sprintf ( alignment1_file, "stdin");
+          SA=aln2seq ( A);
+          }
+       if ( pep2_file[0]!='\0')SB=main_read_seq (pep2_file);
+       else if (alignment2_file[0]!='\0') 
+           {
+          main_read_aln ( alignment2_file, B);
+          
+          SB=aln2seq (B);
+          }
+       else 
+           {
+          SB=SA;
+          sprintf ( alignment2_file, "%s", alignment1_file );
+          }
+       buf1=(pep1_file[0]!='\0')?pep1_file: alignment1_file;
+       buf2=(pep2_file[0]!='\0')?pep2_file: alignment2_file;
+       /*Output of the Results*/    
+
+       fp=vfopen ( io_file, "w");      
+       
+
+       if ( count==1)
+          {
+         fprintf (fp, "Number of seq: %d %d\n", SA->nseq,SA->nseq);
+         for ( a=0; a< SA->nseq; a++) fprintf (fp, "%-15s %d %d\n", SA->name[a], (int)strlen (SA->seq[a]), (int)strlen (SA->seq[a]));
+         }
+             
+       if (SA->nseq!=SB->nseq)
+          {
+          
+          fprintf ( fp, "DIFFERENCE TYPE 1: Different number of sequences %3d/%3d",SA->nseq,SB->nseq);
+          f=1;
+          }
+
+       trim_seq ( SA, SB);
+       for ( a=0; a< SA->nseq; a++)
+           {
+          lower_string (SA->seq[a]);
+          lower_string (SB->seq[a]);
+          ungap ( SA->seq[a]);
+          ungap ( SB->seq[a]);
+
+          if ( strcmp ( SA->seq[a], SB->seq[a])!=0) 
+              {
+              fprintf ( fp, "DIFFERENCE TYPE 2: %s is different in the 2 files\n", SA->name[a]);
+              f=1;
+              }
+          }
+       for ( a=0; a< SA->nseq; a++)
+           {
+          lower_string (SA->seq[a]);
+          lower_string (SB->seq[a]);
+          ungap ( SA->seq[a]);
+          ungap ( SB->seq[a]);
+
+          if ( strlen ( SA->seq[a])!= strlen (SB->seq[a]))
+              {
+                fprintf ( fp, "DIFFERENCE TYPE 3: %s has != length in the 2 files (%d-%d)\n", SA->name[a],(int)strlen ( SA->seq[a]), (int)strlen (SB->seq[a]));
+              f=1;
+              }
+          }
+       if ( f==1)
+           {
+          fprintf ( fp, "\nDIFFERENCES found between:\n\t%s\n\t%s\n**********\n\n",buf1, buf2);
+          }
+       fclose (fp);
+       }
+
+/*2 COMPARISON OF THE ALIGNMENTS*/                      
+    else if ( aln_compare==1)
+       {
+
+       n_categories=parse_category_list ( category_list, category, n_sub_categories);
+       sim_n_categories=parse_category_list ( sim_category_list, sim_category, sim_n_sub_categories);
+       
+       main_read_aln ( alignment1_file, A);
+       main_read_aln ( alignment2_file, B);
+       CLS=trim_aln_seq ( A, B);
+       
+       
+       defined_residueA=get_defined_residues (A);
+       defined_residueB=get_defined_residues (B);
+       
+
+       A=thread_defined_residues_on_aln(A, defined_residueA);
+       A=thread_defined_residues_on_aln(A, defined_residueB);
+       B=thread_defined_residues_on_aln(B, defined_residueA);
+       B=thread_defined_residues_on_aln(B, defined_residueB);
+      
+     
+       CL_A=declare_constraint_list ( CLS, NULL, NULL, 0, NULL, NULL);
+       CL_B=declare_constraint_list ( CLS, NULL, NULL, 0, NULL, NULL);
+             
+      
+       CL_A=aln2constraint_list_full (A,CL_A, "sim");
+       CL_B=aln2constraint_list_full (B,CL_B, "sim");
+       
+       
+       
+       glob=(int*)vcalloc ( A->nseq+1, sizeof (int));
+       pw_glob=declare_int ( A->nseq+1, A->nseq+1);
+
+
+       if ( strm( compare_mode, "sp"))
+           {
+             int *entry;
+             while ( (entry=extract_entry (CL_A)) )
+               {
+//               HERE ("-%d-S1:%d S2:%d R1:%d R2:%d", ++c, entry[SEQ1], entry[SEQ2], entry[R1], entry[R2]);
+                 s1=entry[SEQ1];
+                 s2=entry[SEQ2];
+                 glob[0]++;
+                 glob[s1+1]++;
+                 glob[s2+1]++;
+                 pw_glob[s1][s2]++;
+                 pw_glob[s2][s1]++;
+                 entry[MISC]=1;
+                 
+                 if ((main_search_in_list_constraint (entry,&pos_in_clist,4,CL_B))!=NULL)
+                   add_entry2list (entry,CL_A);
+                 
+               }
+           }
+       else if ( strm( compare_mode, "column") )
+           {
+             int *entry;
+             posA=aln2pos_simple_2(A);
+             posB=aln2pos_simple_2(B);
+             seq_cache=declare_int ( A->nseq, A->len_aln+1);
+             for ( a=0; a< A->len_aln; a++)
+               for ( b=0; b<B->len_aln; b++)
+                 {
+                   is_same=compare_pos_column(posA, a, posB, b, A->nseq);    
+                   if(is_same)
+                   {
+                     for (c=0; c< A->nseq;c++)
+                         {
+                           if(posA[c][a]>0)
+                           {
+                               seq_cache[c][posA[c][a]]=1;
+                           }
+                         }
+                   }
+                 }
+             
+             while ( (entry=extract_entry (CL_A)) )
+               {
+                 s1=entry[SEQ1];
+                 s2=entry[SEQ2];
+                 r1=entry[R1];
+                 entry[MISC]=0;
+                 glob[0]++;
+                 glob[s1+1]++;
+                 glob[s2+1]++;
+                 pw_glob[s1][s2]++;
+                 pw_glob[s2][s1]++;
+                 
+                 if (seq_cache[s1][r1])
+                 {
+                    entry[MISC]=1;
+                    add_entry2list (entry, CL_A);
+                 }
+               }
+             free_int (posA, -1);
+             free_int (posB, -1);
+             free_int (seq_cache, -1);      
+           }   
+       else if ( strm( compare_mode, "tc") )
+       {
+             correct_column = (int*)vcalloc(A->len_aln+1, sizeof (int));
+             posA=aln2pos_simple_2(A);
+             posB=aln2pos_simple_2(B);
+             for ( a=0; a< A->len_aln; a++)
+               for ( b=0; b<B->len_aln; b++)
+                 {
+                   is_same = compare_pos_column(posA, a, posB, b, A->nseq);
+                   if(is_same)
+                     correct_column[a] = is_same;
+                 }
+             free_int (posB, -1);
+       }
+       
+       for ( a=0; a< n_structure; a++)
+           {
+              ST=read_structure (struct_file[a],struct_format[a], A,B,ST,n_symbol[a], symbol_list[a]); 
+          }
+       
+      /*RESULT ARRAY DECLARATION*/    
+    
+       tot_count=declare_int (n_categories+1, A->nseq+1);
+       pos_count=declare_int (n_categories+1, A->nseq+1);
+       pw_tot_count=(int***)vcalloc ( A->nseq, sizeof (int**));
+       for ( a=0; a< A->nseq; a++)pw_tot_count[a]=declare_int ( A->nseq, n_categories);
+
+    
+       pw_pos_count=(int***)vcalloc ( A->nseq, sizeof (int**));
+       for ( a=0; a< A->nseq; a++)pw_pos_count[a]=declare_int ( A->nseq, n_categories);
+     /*COMPARISON MODULE*/
+       if (strm( compare_mode, "tc") )
+        {
+          int column_is_structure;
+          int pair_is_structure;
+          
+          for ( a=0; a< n_categories; a++)
+            {     
+              for(b = 0; b < A->len_aln; b++)
+                {
+                  column_is_structure = 1;
+                  pair_is_structure = 0;
+                  for (s1=0; s1< A->nseq-1; s1++)
+                    {
+                      for(s2=s1+1; s2 < A->nseq; s2++)
+                        {
+                          if ((posA[s1][b]>0) && (posA[s2][b]>0))
+                            {  
+                              pair_is_structure=is_in_struct_category(s1,s2,posA[s1][b],posA[s2][b],ST,category[a], n_sub_categories[a]);     
+                              column_is_structure = (column_is_structure && pair_is_structure);
+                              if(pair_is_structure)
+                                {
+                                  tot_count[a][s1+1]++;
+                                  tot_count[a][s2+1]++;
+                                  pw_tot_count[s1][s2][a]++;
+                                  pw_tot_count[s2][s1][a]++;
+                                  if (correct_column[b])
+                                    {
+                                      pw_pos_count[s1][s2][a]++;
+                                      pw_pos_count[s2][s1][a]++;
+                                      pos_count[a][s1+1]++;
+                                      pos_count[a][s2+1]++;
+                                    }
+                                }
+                            }
+                        }
+                    }         
+                  if(column_is_structure && pair_is_structure)
+                    {
+                      tot_count[a][0]++;
+                      if(correct_column[b]) 
+                        {
+                          pos_count[a][0]++;
+                        }
+                    }
+                }
+            }
+          free_int (posA, -1);
+        }
+       else
+        {
+          /*COMPARISON MODULE*/
+          int *entry;
+          for ( a=0; a< n_categories; a++)
+            {
+              while ( (entry=extract_entry (CL_A)) )
+                {
+                  s1=entry[SEQ1];
+                  s2=entry[SEQ2];
+                  r1=entry[R1];
+                  r2=entry[R2];
+                  c= entry[MISC];
+                  if ( is_in_struct_category ( s1, s2, r1, r2, ST, category[a], n_sub_categories[a]))
+                    {
+                      tot_count[a][0]++;
+                      tot_count[a][s1+1]++;
+                      tot_count[a][s2+1]++;
+                      pw_tot_count[s1][s2][a]++;
+                      pw_tot_count[s2][s1][a]++;
+                      
+                      if(print_pair)
+                      {
+                         HERE("%s,%s,%s",get_structure_residue(s1,r1,ST), get_structure_residue(s2,r2,ST),(c==1)?"Y":"N");
+                      }
+                      
+                      if ( c==1)
+                        {
+                          pw_pos_count[s1][s2][a]++;
+                          pw_pos_count[s2][s1][a]++;
+                          pos_count[a][0]++;
+                          pos_count[a][s1+1]++;
+                          pos_count[a][s2+1]++;
+                        }
+                    }
+                }
+            }
+        }
+       //      printf("pos=%d,tot=%d\n", pos_count[0][0], tot_count[0][0]);
+       /*Measure of Aligned Sequences Similarity*/
+       
+       sim=get_aln_compare_sim ((strcmp (sim_aln, "al1")==0)?A:B, ST,sim_category[0], sim_n_sub_categories[0], sim_matrix);
+       sim_param=analyse_sim ((strcmp (sim_aln, "al1")==0)?A:B, sim);
+       
+   /*Fill the Result_structure*/
+       R=(Result*)vcalloc ( 1, sizeof (Result));
+    
+       R->grep_list=grep_list;
+       R->n_greps=n_greps;
+       R->A=A;
+       R->B=B;
+
+       R->S=S;
+       R->ST=ST;
+       R->sim_aln=sim_aln;
+       R->alignment1_file=alignment1_file;
+       R->alignment2_file=alignment2_file;
+       R->io_format=io_format;
+       R->n_structure=n_structure;
+       R->struct_file=struct_file;
+       R->struct_format=struct_format;
+       R->n_symbol=n_symbol;
+       R->symbol_list=symbol_list;
+
+       
+       R->tot_count=tot_count;
+       R->pos_count=pos_count;
+       R->pw_tot_count=pw_tot_count;
+       R->pw_pos_count=pw_pos_count;
+       R->glob=glob;
+       R->pw_glob=pw_glob;
+       R->n_categories=n_categories;
+       R->category=category;
+       R->category_list=category_list;
+       R->n_sub_categories=n_sub_categories;
+       R->sim=sim;
+       R->sim_param=sim_param;
+       R->sim_matrix=sim_matrix;
+       R->sim_n_categories=sim_n_categories;
+       R->sim_category=sim_category;
+       R->sim_category_list=sim_category_list;
+       R->sim_n_sub_categories=sim_n_sub_categories; 
+       R->sep_r=sep_r;
+       R->sep_l=sep_l;
+
+      /*Output of the Results*/    
+
+       fp=vfopen ( io_file, "w");      
+       fp=output_format (io_format, fp, R);
+       vfclose ( fp); 
+
+
+     /*Rewriting of Alignment A*/
+       if ( output_aln)
+        {
+          int *entry;
+          A->residue_case=2;
+          aln_output_tot  =declare_int ( A->nseq, A->len_aln+1);
+          aln_output_count=declare_int ( A->nseq, A->len_aln+1);
+          
+          while ( (entry=extract_entry (CL_A)) )
+            {
+              aln_output_tot[entry[SEQ1]][entry[R1]]++;
+              aln_output_tot[entry[SEQ2]][entry[R2]]++;
+              
+              aln_output_count[entry[SEQ1]][entry[R1]]+=entry[MISC];
+              aln_output_count[entry[SEQ2]][entry[R2]]+=entry[MISC];
+            }
+         
+          for ( a=0; a< A->nseq; a++)
+            {
+              
+              for (c=0, b=0; b< A->len_aln; b++)
+                {
+                  if ( !is_gap(A->seq_al[a][b]))
+                    {
+                      c++;
+                      if ( aln_output_tot[a][c] && ((aln_output_count[a][c]*100)/aln_output_tot[a][c])<output_aln_threshold)
+                        { 
+                          if ( strm (output_aln_modif, "lower"))
+                               A->seq_al[a][b]=tolower(A->seq_al[a][b]);
+                          else
+                            A->seq_al[a][b]=output_aln_modif[0];
+                        }
+                      else A->seq_al[a][b]=toupper(A->seq_al[a][b]);
+                    }
+                    
+                }
+            }
+          A->score_aln=(int)(R->tot_count[0][0]==0)?0:((R->pos_count[0][0]*100)/(float)R->tot_count[0][0]);
+
+          output_format_aln (output_aln_format,A,NULL,output_aln_file);
+          
+          free_int ( aln_output_tot, -1);
+          free_int ( aln_output_count, -1  );
+        }
+       }
+       }
+    return EXIT_SUCCESS;
+    }   
+/************************************************************************************/
+/*                                                                                  */
+/*                            OUTPUT                                                */
+/*                                                                                  */
+/*                                                                                  */
+/************************************************************************************/
+FILE *output_format (char *iof,FILE *fp, Result *R)
+      {
+      int a;
+      int l;
+      
+      /*
+      H: files Header
+      h: basic header;
+      s: sequence results
+      t: total results (global);
+      p: pairwise_results;
+      */
+      l=strlen ( iof);
+
+      for ( a=0; a< l; a++)
+          {
+         if ( iof[a]=='H')fp=output_large_header (fp,R);
+         else if ( iof[a]=='h')fp=output_header (fp,R);
+         else if ( iof[a]=='t')fp=output_total_results (fp, R);
+         else if ( iof[a]=='s')fp=output_sequence_results (fp,R);
+         else if ( iof[a]=='p')fp=output_pair_wise_sequence_results(fp,R);
+         }
+      return fp;
+      }
+
+FILE *output_pair_wise_sequence_results (FILE *fp,  Result *R)
+     {
+     int a,c,d;
+     
+     
+     for ( c=0; c<(R->A)->nseq-1; c++)
+         {
+        for ( d=c+1; d< (R->A)->nseq; d++)    
+            {
+            fprintf (fp, "%-10s %-10s%s",(R->A)->name[c],(R->A)->name[d],SSPACE);
+            fprintf (fp, "%5.1f%s", R->sim[c][d], SSPACE);
+            
+            for (a=0; a< R->n_categories; a++)
+                {
+                fprintf ( fp, "%5.1f ",(R->pw_tot_count[c][d][a]==0)?0:((float)(R->pw_pos_count[c][d][a]*100)/(float)R->pw_tot_count[c][d][a]));
+                fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->pw_glob[c][d]==0)?0:((float)(R->pw_tot_count[c][d][a]*100)/(float)R->pw_glob[c][d]),(R->sep_r),SSPACE);
+                }
+            fprintf ( fp, "%c%5d%c\n",(R->sep_l), R->pw_glob[c][d],(R->sep_r));
+            }
+        }
+        
+    return fp;
+    }
+FILE *output_sequence_results (FILE *fp,  Result *R)
+     {
+     int a,c;
+    
+     for ( c=1; c<=R->A->nseq; c++)
+         {
+        fprintf (fp, "%-10s %-10s%s",(R->A)->name[c-1], "..",SSPACE);
+        fprintf (fp, "%5.1f%s", R->sim_param[c-1][0],SSPACE);
+        for (a=0; a< R->n_categories; a++)
+                {
+                fprintf ( fp, "%5.1f ",(R->tot_count[a][c]==0)?0:((float)(R->pos_count[a][c]*100)/(float)R->tot_count[a][c]));
+                fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->glob[c]==0)?0:((float)(R->tot_count[a][c]*100)/(float)R->glob[c]),(R->sep_r), SSPACE);
+                }
+        fprintf ( fp, "%c%5d%c\n",(R->sep_l), R->glob[c],(R->sep_r));
+        }
+    return fp;
+    }
+        
+
+FILE *output_total_results (FILE *fp,  Result *R)
+     {
+     int a;
+     
+     
+     fprintf ( fp, "%-13s %-7d%s",extract_suffixe (R->alignment1_file),(R->A)->nseq, SSPACE);
+     fprintf (fp, "%5.1f%s", R->sim_param[(R->A)->nseq][0], SSPACE);
+     for (a=0; a< R->n_categories; a++)
+         {
+        fprintf ( fp, "%5.1f ",(R->tot_count[a][0]==0)?0:((float)(R->pos_count[a][0]*100)/(float)R->tot_count[a][0]));
+        fprintf ( fp, "%c%5.1f%c%s",(R->sep_l),(R->glob[0]==0)?0:((float)(R->tot_count[a][0]*100)/(float)R->glob[0]),(R->sep_r), SSPACE);
+        }
+     fprintf ( fp, "%c%5d%c\n",(R->sep_l),  R->glob[0],(R->sep_r));
+     return fp;
+     }
+FILE *output_header (FILE *fp, Result *R)
+     {
+     int a;
+
+     
+     fprintf ( fp, "%s\n",generate_string ( R->n_categories*(13+strlen(SSPACE))+31+2*strlen(SSPACE),'*'));
+     fprintf ( fp, "%-10s %-10s %s%-3s%s", "seq1", "seq2",SSPACE,"Sim",SSPACE);
+     
+     for ( a=0; a< R->n_categories; a++)
+        fprintf ( fp, "%-12s%s ",R->category[a][0], SSPACE);
+     fprintf (fp, "%-5s", "Tot");
+     fprintf (fp, "\n");
+     return fp;
+     }
+FILE *output_large_header ( FILE *fp, Result *R)
+     {
+     int a, b;
+
+     fprintf ( fp, "AL1: %s\n", R->alignment1_file);
+     fprintf ( fp, "AL2: %s\n", R->alignment2_file);
+     for ( a=0; a< R->n_structure; a++)
+          {
+          fprintf (fp, "ST %d: %s [%s]/[", a, R->struct_file[a], R->struct_format[a]);
+          for ( b=0; b< R->n_symbol[a]; b++)fprintf (fp, "%s ", R->symbol_list[a][b]);
+          fprintf ( fp, "]\n");
+         }
+     return (fp);
+     }
+
+void get_separating_char ( char s, char *l, char *r)
+    {
+    if ( s=='{' || s=='}')
+       {
+       l[0]='{';
+       r[0]='}';
+       return;
+       }
+    else if ( s==']' || s=='[')
+       {
+       l[0]='[';
+       r[0]=']';
+       return;
+       }
+    else if ( s==')' || s=='(')
+       {
+       l[0]='(';
+       r[0]=')';
+       return;
+       }
+    else
+       {
+       l[0]=s;
+       r[0]=s;
+       return;
+       }
+    }
+
+/************************************************************************************/
+/*                                                                                  */
+/*                            SIM MEASURE                                           */
+/*                                                                                  */
+/*                                                                                  */
+/************************************************************************************/
+float **get_aln_compare_sim ( Alignment *A, Structure *ST, char **cat, int n_cat, char *matrix)
+      {
+      int a, b, c;
+
+      float **sim;
+      char cr1, cr2;
+      int r1, r2;
+      int p1, p2;
+      float pos,tot;
+
+      sim=declare_float ( A->nseq, A->nseq);
+
+      for ( a=0; a<A->nseq-1; a++)
+          {
+         for (b=a+1; b< A->nseq; b++)
+             {
+             for ( r1=0, r2=0,tot=0, pos=0,c=0; c< A->len_aln; c++)
+                 {
+                 p1=is_gap(A->seq_al[a][c]);
+                 p2=is_gap(A->seq_al[b][c]);
+                 
+                 r1+=1-p1;
+                 r2+=1-p2;
+                 cr1=A->seq_al[a][c];
+                 cr2=A->seq_al[b][c];
+                 if (!p1 && !p2)
+                     {
+                     if (is_in_struct_category (a, b, r1, r2, ST, cat, n_cat))
+                         {
+                         tot++;
+                         pos+=is_in_same_group_aa ( cr1, cr2, 0, NULL, matrix);
+                         }
+                     }
+                 }
+             sim[a][b]=sim[b][a]=(tot==0)?0:((pos*100)/tot);
+             }
+         }
+      return sim;
+      }
+float **analyse_sim ( Alignment *A, float **sim)
+       {
+       int a,b,c;
+
+       float **an, d;
+       
+       
+       an=declare_float ( A->nseq+1,2);
+       
+       for (d=0, a=0; a< A->nseq;a++)
+               {
+               for ( b=0; b< A->nseq; b++)
+                       {
+                       if ( b!=a)
+                               {
+                               an[a][0]+=sim[a][b];
+                               an[A->nseq][0]+=sim[a][b];
+                               d++;
+                               }
+                       }
+               an[a][0]=((float)an[a][0]/(float)(A->nseq-1));
+               }
+       
+       
+       an[A->nseq][0]=an[A->nseq][0]/d;
+               
+       for ( d=0,a=0; a< A->nseq; a++)
+               {
+               for ( b=0; b< A->nseq; b++)
+                       {
+                       if ( b!=a)
+                               {
+                               c=an[a][0]-sim[a][b];
+                               an[a][1]+=(c>0)?c:-c;
+                               an[A->nseq][1]+=(c>0)?c:-c;
+                               d++;
+                               }
+                       }
+               an[a][1]=((float)an[a][1]/(float)(A->nseq-1));
+               }
+       
+       an[A->nseq][1]=an[A->nseq][1]/d;
+       
+       return an;
+       }
+               
+
+
+
+
+
+
+
+/************************************************************************************/
+/*                                                                                  */
+/*                            STRUC ANALYSE                                         */
+/*                                                                                  */
+/*                                                                                  */
+/************************************************************************************/
+int is_in_struct_category ( int s1, int s2, int r1, int r2, Structure *ST, char **cat, int n_cat)
+    {
+    int a;
+    static char *struc_r1;
+    static char *struc_r2;
+    char first[STRING];
+    char second[STRING];
+    static int **r;
+    
+    
+
+    
+    if ( ST==NULL)return 1;
+    if ( struc_r1!=NULL)
+       {
+       vfree ( struc_r1);
+       vfree ( struc_r2);
+       }
+
+    if ( r==NULL)r=declare_int (2, 2);
+    else r[0][0]=r[1][1]=r[1][0]=r[0][1]=0;
+    
+    
+    struc_r1=get_structure_residue ( s1, r1, ST);
+    struc_r2=get_structure_residue ( s2, r2, ST);
+
+    
+    for ( a=1; a< n_cat; a+=2)
+       {
+        sprintf ( first, "%s", cat[a]);
+       sprintf ( second,"%s", cat[a+1]);
+       r[0][0]=struc_matches_pattern ( struc_r1, first);
+       r[0][1]=struc_matches_pattern ( struc_r2, first);
+       r[1][0]=struc_matches_pattern ( struc_r1, second);
+       r[1][1]=struc_matches_pattern ( struc_r2, second);
+       
+       if ( (r[0][0]&&r[1][1])||(r[1][0]&&r[0][1]))return 1;
+       }       
+   return 0;
+   }
+
+char * get_structure_residue (int seq, int res, Structure *ST)
+    {
+    int a;
+    char *s;
+    
+    s=(char*)vcalloc ( ST->n_fields+1, sizeof (char));
+    for (a=0; a< ST->n_fields; a++)
+       s[a]=ST->struc[seq][res][a];
+    s[a]='\0';
+    return s;
+    }
+
+int struc_matches_pattern ( char *struc, char *pattern)
+    {
+    char p[STRING];
+    char *y;
+    
+    int b,l;
+    
+
+    sprintf ( p, "%s", pattern);
+    
+    if ( strcmp (p, "*")==0)return 1;
+    else
+        {
+       l=strlen ( struc);
+       y=strtok ( p, ".");
+
+       for ( b=0; b<l; b++)
+               {
+
+               if ( strcmp ( y, "*")==0);                 
+               else if ( strchr(y, struc[b])==NULL)return 0;
+               y=strtok ( NULL, ".");
+               
+               if ( y==NULL && b<(l-1))
+                  {
+                  crash ( "\nA Structure is Missing[FATAL]");
+                  }
+               }
+       }
+
+    return 1;
+    }
+    
+
+Structure * read_structure (char *fname, char *format, Alignment *A,Alignment *B, Structure *ST, int n_symbols, char **symbol_table)        
+        {
+               
+        Alignment *StrucAln;
+        Sequence *SEQ=NULL, *SA=NULL;
+       
+        
+
+
+        if (ST==NULL)ST=declare_structure (A->nseq, A->seq_al);
+        else
+            ST=extend_structure ( ST);
+        
+       StrucAln=declare_Alignment(NULL); 
+        if (strm ( format, "pep"))
+                        {
+                        SEQ=main_read_seq ( fname);
+                       StrucAln=seq2aln(SEQ,StrucAln,0);
+                       }
+        
+        else if ( strcmp ( format, "aln")==0)
+                        {
+                       StrucAln=main_read_aln (fname, StrucAln);
+                       }
+
+       reorder_aln(StrucAln, A->name, A->nseq);
+
+       SA=aln2seq(StrucAln);
+       string_array_convert (SA->seq, SA->nseq, n_symbols, symbol_table);
+        seq2struc (SA, ST);
+       
+       free_aln(StrucAln);
+       if (SEQ)free_sequence (SEQ, SEQ->nseq);
+       
+       return ST;
+        }
+
+int parse_category_list ( char *category_list_in, char ***category, int*n_sub_categories)
+    {
+    int n,a;
+    char *category_list;
+    char *y,*z;
+    category_list=(char*)vcalloc ( strlen(category_list_in)+1, sizeof (char));
+    sprintf (category_list, "%s", category_list_in);
+
+    n=0;
+    z=category_list;
+    while ((y=strtok(z, ";"))!=NULL)
+        {
+       sprintf ( category[n++][2], "%s", y);
+       z=NULL;
+       }
+
+    
+    for ( a=0; a< n; a++)
+       {
+        sprintf (category_list,"%s",strtok(category[a][2], "="));
+        sprintf (category[a][0],"%s",strtok (NULL, "="));
+        sprintf ( category[a][++n_sub_categories[a]],"%s", strtok(category_list, "[]+"));
+        while ( ((y=strtok(NULL, "[]+"))!=NULL))
+               {
+               if ( strcmp (y, "#")==0)y=category[a][n_sub_categories[a]];
+               sprintf ( category[a][++n_sub_categories[a]],"%s",y);
+               }
+       }
+    return n;
+    }
+
+
+int is_a_struc_format (char *format)
+    {
+    if ( strcmp ( format, "pep")==0)return 1;
+    if ( strcmp ( format, "aln")==0)return 1;
+    return 0;
+    }
+/************************************************************************************/
+/*                                                                                  */
+/*                            Informations                                          */
+/*                                                                                  */
+/*                                                                                  */
+/************************************************************************************/
+void output_informations ()
+{
+fprintf ( stderr, "\nPROGRAM: %s (%s)\n",PROGRAM,VERSION);
+fprintf ( stderr, "******INPUT***************************");
+fprintf ( stderr, "\n-al1 al1_file");
+fprintf ( stderr, "\n-al2 al2_file");
+fprintf ( stderr, "\n-compare_mode [sp] or column or tc");
+fprintf ( stderr, "\n-pep (compare only the sequences");
+fprintf ( stderr, "\n-count");
+fprintf ( stderr, "\n-pep1 pep1_file");
+fprintf ( stderr, "\n-pep1 pep2_file");
+fprintf ( stderr, "\n-st  str_file st_format conversion");
+fprintf ( stderr, "\n   **st_format:  aln, pep");
+fprintf ( stderr, "\n   **conversion: 3d_ali,  conv abcZ #X");
+fprintf ( stderr, "\nNOTE: Several structures in a row are possible"); 
+
+fprintf ( stderr, "\n\n****DISTANCE MEASURE*****************");
+fprintf ( stderr, "\n-sim_cat category_format  or category_name");
+fprintf ( stderr, "\n       **category_format: [*][*]=[tot]");
+fprintf ( stderr, "\n       **category_name  : 3d_ali (<=>[h][h]+[e][e]=[Struc]");
+fprintf ( stderr, "\n-sim_matrix matrix_name");
+fprintf ( stderr, "\n          **matrix_name: idmat,pam250mt..");
+fprintf ( stderr, "\n-sim_aln al1 or al2");
+fprintf ( stderr, "\n\n****COMPARISON***********************");
+fprintf ( stderr, "\n-io_cat category_format or category_name");
+fprintf ( stderr, "\n      **category_format: [*][*]=[tot]");
+fprintf ( stderr, "\n      **category_name  : 3d_ali(<=>[h][h]+[e][e]=[Struc];[*][*]=[Tot]");
+fprintf ( stderr, "\n\nNOTE: if two structures:");
+fprintf ( stderr, "\n[he.123][#]=[he123VShe123];[beh.*][he.2345]=[other]");
+fprintf ( stderr, "\n\n****OUTPUT****************************");
+fprintf ( stderr, "\n-f stdout");
+fprintf ( stderr, "\n   stderr");
+fprintf ( stderr, "\n   file_name");
+fprintf ( stderr, "\n-io_format hts");
+fprintf ( stderr, "\n           H ->large Header");
+fprintf ( stderr, "\n           h ->small Header");
+fprintf ( stderr, "\n           t ->global (average)results");
+fprintf ( stderr, "\n           s ->average results for each sequence");
+fprintf ( stderr, "\n           p ->results for each pair of sequences");
+fprintf ( stderr, "\n-print_pair           Print structures of pair residues and correctness by ref");
+fprintf ( stderr, "\n-output_aln           Outputs al1 with conserved bits in Upper");
+fprintf ( stderr, "\n-output_aln_threshold [100]");
+fprintf ( stderr, "\n-output_aln_file      [stdout]");
+fprintf ( stderr, "\n-output_aln_format    [clustalw]");
+fprintf ( stderr, "\n-output_aln_motif     [lower]");
+fprintf ( stderr, "\n");
+myexit (EXIT_SUCCESS);
+}
+
+/*********************************COPYRIGHT NOTICE**********************************/
+/*� Centro de Regulacio Genomica */
+/*and */
+/*Cedric Notredame */
+/*Tue Jul  1 10:00:54 WEST 2008. */
+/*All rights reserved.*/
+/*This file is part of T-COFFEE.*/
+/**/
+/*    T-COFFEE is free software; you can redistribute it and/or modify*/
+/*    it under the terms of the GNU General Public License as published by*/
+/*    the Free Software Foundation; either version 2 of the License, or*/
+/*    (at your option) any later version.*/
+/**/
+/*    T-COFFEE is distributed in the hope that it will be useful,*/
+/*    but WITHOUT ANY WARRANTY; without even the implied warranty of*/
+/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the*/
+/*    GNU General Public License for more details.*/
+/**/
+/*    You should have received a copy of the GNU General Public License*/
+/*    along with Foobar; if not, write to the Free Software*/
+/*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/
+/*...............................................                                                                                      |*/
+/*  If you need some more information*/
+/*  cedric.notredame@europe.com*/
+/*...............................................                                                                                                                                     |*/
+/**/
+/**/
+/*     */
+/*********************************COPYRIGHT NOTICE**********************************/