ROOT logo
// ------------------------------------------------------------------
//
//                           AliLatexTable
//
// This class is used to produce tables using latex sintax. It can
// than print the table as Latex source code (to be pasted on a paper)
// or ASCII.
//
// The basic idea is that you have a stack of rows. You add columns
// one after the other with the SetNextCol method and than you insert
// this row. The SetNextCol method comes in different flavours to alow
// the insertion of different type of values (numbers with or without
// errors, strings...). Errors are rounded and written in scientific
// notation with the desired accuracy.
//
// TODO:
// 1. Make the class drawable
// 2. Implement vertical lines in ascii print
// 3. Improve output in HTML format
//
// Author: Michele Floris, CERN
// ------------------------------------------------------------------

#include "AliLatexTable.h"
#include "TString.h"
#include "TRegexp.h"
#include "TObjString.h"
#include "TObjArray.h"
#include <stdarg.h>
#include "snprintf.h"
#include "Varargs.h"
#include "TPRegexp.h"
#include "TMath.h"
#include <iostream>
#include <fstream>
#include "AliLog.h"

using namespace std;

ClassImp(AliLatexTable)

AliLatexTable::AliLatexTable() : fNcol(0), fFormat(""), fRows(0), fCols(0), fNcolReady(0){
  // default constructor
  fNcol = 1;
  fFormat = "c";
  fNcolReady = 0;
  fRows = new TObjArray;
  fCols = new TObjArray;

  fRows->SetOwner();
  fCols->SetOwner();

}

AliLatexTable::AliLatexTable(Int_t ncol, TString format) : fNcol(0), fFormat(""), fRows(0), fCols(0), fNcolReady(0){
  // constructor, specify number of cols 
  fNcol = ncol;
  fFormat = format;
  fNcolReady = 0;
  fRows = new TObjArray;
  fCols = new TObjArray;

  fRows->SetOwner();
  fCols->SetOwner();
}


AliLatexTable::~AliLatexTable() {

  // dtor
  if (fRows) delete fRows;
  if (fCols) delete fCols;

}

void AliLatexTable::SetNextCol(Int_t val){
  // Set next column in current row - integer
  char col[200];
  snprintf(col, 200, " %d ", val);
  SetNextCol(col);

} 

void AliLatexTable::SetNextCol(Int_t val, Int_t err){

  // Set next column in current row - int +- int
  char col[200];
  snprintf(col, 200, " $%d \\pm %d$ ", val, err);
  SetNextCol(col);

} 

void AliLatexTable::SetNextCol(Double_t val, Int_t scientificNotation, Bool_t rounding){

  // Set next column in current row - double, specify resolution

  char col[200];
  if(rounding) {
    if(scientificNotation >= 0) {
      char format[100];

      //    cout << format << endl;    
      Double_t mantissa, exp;
      GetMantissaAndExpBase10(val, mantissa, exp);
    
      if (exp == 0) {
	snprintf(format, 100," $%%%d.%df $", scientificNotation, scientificNotation);
	snprintf(col, 200, format, mantissa);      
      }
      else  {
	snprintf(format, 100," $%%%d.%df \\cdot 10^{%%0.0f} $", scientificNotation, scientificNotation);
	snprintf(col, 200,format, mantissa, exp);
      }


    

      SetNextCol(col);

    } else {
      char format[100];
      snprintf(format, 100," $%%%d.%df $", -scientificNotation,-scientificNotation);    
      snprintf(col, 200, format , TMath::Nint(val*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation));
      SetNextCol(col);
    } 
  }else {
    snprintf(col,200, " %f ", val);
    SetNextCol(col);
  }

} 
void AliLatexTable::SetNextCol(Double_t val, Double_t err, Int_t scientificNotation, Bool_t rounding){

  // Set next column in current row - double +- double, specify resolution

  // scientific notation is used to determine number of
  // digits in error 

  //if it is > 0 exp notation is used 


  char col[200];
  if(rounding) {
    if(scientificNotation >=0 ) {
      
      Double_t mantissa, exp;
      GetMantissaAndExpBase10(val, mantissa, exp);
      
      Double_t mantissa_err, exp_err;
      GetMantissaAndExpBase10(err, mantissa_err, exp_err);

      Int_t nSigDigits =TMath::Nint(exp - exp_err);
      if(scientificNotation != 0) nSigDigits =  nSigDigits + scientificNotation - 1;


      char format[100];
      if (exp == 0) {
	snprintf(format, 100," $%%%d.%df \\pm %%%d.%df $", nSigDigits, nSigDigits, nSigDigits, nSigDigits);
	snprintf(col, 200,format, mantissa, mantissa_err/TMath::Power(10,exp - exp_err));
      }
      else  {
	snprintf(format, 100, " $%%%d.%df \\pm %%%d.%df \\cdot 10^{%%0.0f}$", nSigDigits, nSigDigits, nSigDigits, nSigDigits);
	snprintf(col, 200, format, mantissa, mantissa_err/TMath::Power(10,exp - exp_err), exp);
      }


      //cout << format << endl;
    
      SetNextCol(col);

    } else  {
      char format[100];
      snprintf(format, 100, " $%%%d.%df \\pm %%%d.%df $", -scientificNotation,-scientificNotation,-scientificNotation,-scientificNotation);    
      snprintf(col, 200, format , TMath::Nint(val*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation), TMath::Nint(err*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation));
      SetNextCol(col);
    }
  }
  else {
    snprintf(col, 200, " $%f \\pm %f$ ", val, err);
    SetNextCol(col);
  }
} 

void AliLatexTable::SetNextCol(Double_t val, Double_t err, Double_t errSyst, Int_t scientificNotation, Bool_t rounding){

  // Set next column in current row - double +- double +- double, specify resolution

  // if scientific notation is != -1 is used to determine number of
  // digits in error 

  //if it is > 0 exp notation is used 

  //if it is < -1 number is truncated to the number of digits after
  //point dictated by scientificNotation,

  char col[200];
  if (rounding) {
    if(scientificNotation >=0 ) {

      Double_t mantissa, exp;
      GetMantissaAndExpBase10(val, mantissa, exp);

      Double_t mantissa_err, exp_err;
      GetMantissaAndExpBase10(err, mantissa_err, exp_err);

      Double_t mantissa_errsyst, exp_errsyst;
      GetMantissaAndExpBase10(errSyst, mantissa_errsyst, exp_errsyst);

      Int_t nSigDigits =TMath::Nint(exp - exp_err);
      if(scientificNotation != 0) nSigDigits =  nSigDigits + scientificNotation - 1;


      char format[100];
      if (exp == 0) {
	snprintf(format, 100, " $%%%d.%df \\pm %%%d.%df \\pm %%%d.%df $", 
		nSigDigits, nSigDigits, nSigDigits, nSigDigits, nSigDigits, nSigDigits);
	snprintf(col, 200, format, mantissa, 
		mantissa_err/TMath::Power(10,exp - exp_err), 
		mantissa_errsyst/TMath::Power(10,exp - exp_errsyst));
      }
      else  {
	snprintf(format, 100, " $%%%d.%df \\pm %%%d.%df  \\pm %%%d.%df \\cdot 10^{%%0.0f}$", 
		nSigDigits, nSigDigits, nSigDigits, nSigDigits, nSigDigits, nSigDigits);
	snprintf(col, 200, format, mantissa, 
		mantissa_err/TMath::Power(10,exp - exp_err), 
		mantissa_errsyst/TMath::Power(10,exp - exp_errsyst),
		exp);
      }


      //cout << format << endl;
    
      SetNextCol(col);

    } else  {
      char format[100];
      snprintf(format, 100, " $%%%d.%df \\pm %%%d.%df \\pm %%%d.%df $", -scientificNotation,-scientificNotation,-scientificNotation,-scientificNotation, -scientificNotation,-scientificNotation);    
      snprintf(col, 200, format ,TMath::Nint(val*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation), TMath::Nint(err*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation), TMath::Nint(errSyst*TMath::Power(10,-scientificNotation))/TMath::Power(10,-scientificNotation));
      SetNextCol(col);
    } 
  }
  else {
    snprintf(col, 200, " $%f \\pm %f  \\pm %f$ ", val, err, errSyst);
    SetNextCol(col);
  }
} 

// void AliLatexTable::SetNextColPrintf(const char *va_(fmt), ...){


//   const Int_t buf_size = 1024;  // hope it's long enough
//   char colBuffer[buf_size];

//   va_list ap;
//   va_start(ap, va_(fmt));
//   Int_t n = vsnprintf(colBuffer, buf_size, fmt, ap);

//   if (n == -1 || n >= buf_size) {
//     Error("SetNextCol", "vsnprintf error!");
//   }

//   va_end(ap);
     
// //   for(int iobj=0; iobj<num; iobj++){   //Loop until all objects are added
// //     TH1 * obj = (TH1 *) va_arg(arguments, void *);
// //     returnValue = returnValue && AddObject(obj,(char*)fOptMany.Data(), EColor(iobj+1));
// //   }
//   SetNextCol(colBuffer);
// }


void AliLatexTable::SetNextCol(TString val){

  // Set next column in current row - tstring

  fCols->Add(new TObjString(val));
  fNcolReady++;

} 

void AliLatexTable::InsertCustomRow(TString row){
  // insert a full row from string. Make sure you have all the columns
  fRows->Add(new TObjString(row));
}



void AliLatexTable::InsertRow(){

  // Insert the row, based on all the individual columns

  if ( fNcolReady != fNcol) {
    Warning("InsertRow", "Wrong number of cols: %d (!= %d)", fNcolReady, fNcol); 
  }

  TString row = "";
  for(Int_t icol = 0; icol < fNcol; icol++){
    row = row + ((TObjString*) fCols->At(icol))->String();
    if(icol != (fNcol-1)) row = row + " & ";
  }
  row+="\\\\";

  fRows->Add(new TObjString(row));

  fNcolReady = 0;
  fCols->Clear();

}

void AliLatexTable::InsertHline(){

  // insert an horizontal line
  fRows->Add(new TObjString("\\hline"));
  

}

Int_t * AliLatexTable::GetColWidths() {

  // Compute the width of columns, for nice ascii printing

  Int_t * col_widths= new Int_t[fNcol];
  Int_t nrow = fRows->GetEntriesFast();

  for(Int_t icol = 0; icol < fNcol; icol++){
    col_widths[icol] = 0;
  }
  

  for(Int_t irow = 0; irow < nrow; irow++){
    TString row(((TObjString*) fRows->At(irow))->String());
    if(row.Contains("\\hline"))continue;
    
    StripLatex(row, "ASCII");

    TObjArray * cols = row.Tokenize("&");
    if(cols->GetEntries() != fNcol) {
      Error("GetColWidths", "Wrong number of cols in row %s: %d - %d", row.Data(), cols->GetEntries(), fNcol);      
    }
    for(Int_t icol = 0; icol < fNcol; icol++){
      Int_t w = ((TObjString *) cols->At(icol))->String().Length();
      if (w>col_widths[icol]) col_widths[icol] = w;
    }
    delete cols;
  }

  return col_widths;
}

void AliLatexTable::PrintTable(Option_t * opt){

  // Print the table on screen. You can specify the format with opt.
  // Currently supported:
  // "" -> LaTeX
  // "ASCII" -> plain ASCII
  // "HTML"  -> HTML, to be improved
  // "CSV"   -> skips hline, usefult for importing in excell 
  // "TWIKI" -> skips hline, usefult for importing in TWIKI

  if(TString(opt) == "ASCII" || TString(opt)=="HTML" ||  TString(opt)=="CSV" ||  TString(opt)=="TWIKI") {
    
    Int_t nrow = fRows->GetEntriesFast();

    Int_t * colWidths = GetColWidths();

    Int_t total_lenght = 0;
    for(Int_t icol = 0; icol < fNcol; icol++) total_lenght = total_lenght + colWidths[icol] + 2 ;
    

    for(Int_t irow = 0; irow < nrow; irow++){
      TString row = ((TObjString*) fRows->At(irow))->String();
      if (row.Contains("\\hline")){	
	if (TString(opt)!="CSV" && TString(opt)!="TWIKI") {
	  for(Int_t il = 0; il < total_lenght; il++) printf("-");
	  printf("\n");	  
	}
	continue;
      }
      StripLatex(row, opt);
      TObjArray * cols = row.Tokenize("&");
      if (TString(opt)=="TWIKI") printf(" | ");
      for(Int_t icol = 0; icol < fNcol; icol++){
	TString strTmp = ((TObjString *) cols->At(icol))->String();
	if(TString(opt)=="TWIKI" || TString(opt)=="HTML"){
	  strTmp.ReplaceAll("AMPER","&");
	}
	const char * colstr = strTmp.Data();
	char format [200];
	if (TString(opt)!="CSV") {
	  snprintf(format, 200, "%%%ds", colWidths[icol] + 2);	
	} else {
	  snprintf(format, 200, "%%s");	
	}
	printf(format, colstr);
	if (TString(opt)=="CSV") printf(", ");
	if (TString(opt)=="TWIKI") printf(" | ");

      }
      printf ("\n");
      delete cols;
    }
    
    delete [] colWidths;
    return;
  }
  

  cout << "\\begin{tabular}{"<<fFormat<<"}"<<endl;

  Int_t nrow = fRows->GetEntriesFast();

  for(Int_t irow = 0; irow < nrow; irow++){
    cout << ((TObjString*) fRows->At(irow))->String() << endl;
  }
  
  cout << "\\end{tabular}" << endl;


}

// void AliLatexTable::ParseExponent(TString &expo){
// //    TString parseExponent = col;
//   TRegexp re = "e[+-][0-9][0-9]";
//   //  cout << col << endl;
  
//   if(expo.Contains(re)){
//     Int_t index = expo.Index(re);
//     TString replacement = "\\cdot 10^{";
//     replacement = replacement + expo(index+1, 3) +"}";
//     //    cout << replacement <<" --- "<< endl;
//     replacement.ReplaceAll("+","");
// //     cout << "B: " << expo << endl;      
// //     cout << "RE " << expo(re) << endl;
    
//     expo.ReplaceAll(expo(re), replacement);
//     //    cout << "A: " << expo << endl;      
//     // recursion to parse all exponents
//     if (expo.Contains(re)) ParseExponent(expo);
//   }
//   else Warning("", "Error parsing exponent");
// }

void AliLatexTable::GetMantissaAndExpBase10(Double_t num, Double_t &man, Double_t &exp) {

  // Helper used to get mantissa and exponent

  exp = TMath::Floor(TMath::Log10(TMath::Abs(num)));  
  man = num / TMath::Power(10, exp);

//   cout << "" << endl;
//   cout << num << " = " << man << " x10^{"<<exp<<"} "   << endl;
  

}

void AliLatexTable::StripLatex(TString &text, TString format) {

  // Strip latex away for ascii and html printing. Replaces latex
  // command with corresponding text/tags

  text.ReplaceAll("\\cdot", "x");
  text.ReplaceAll("$", "");
  if (format == "ASCII") {
    text.ReplaceAll("\\right>", ">");
    text.ReplaceAll("\\left<", "<");
    text.ReplaceAll("\\rangle", ">");
    text.ReplaceAll("\\langle", "<");
    text.ReplaceAll("\\pm", "+-");
  } else if (format == "HTML" || format == "TWIKI") {
    // the & is used to tokenize... Have to cheat here
    text.ReplaceAll("\\right>", "AMPERrang;");
    text.ReplaceAll("\\left<",  "AMPERlang;");
    text.ReplaceAll("\\rangle", "AMPERrang;");
    text.ReplaceAll("\\langle", "AMPERlang;");
    text.ReplaceAll("\\pm",     "AMPERplusmn;");
  } 
  if(text.Contains("multicolumn")) {
    //    cout << "col " << text.Data() << endl;
    // in case of multicol span, replace first column with content and
    // add n empty cols
    TObjArray * array = TPRegexp("multicolumn\\{([^}]*)\\}\\{[^}]*\\}\\{([^]]*)\\}").MatchS(text); // Added double \\ because gcc 4 triggers hard error on unknown escape sequence. Hope it still works...
    const TString content = ((TObjString *)array->At(2))->GetString();
    Int_t nspan   = ((TObjString *)array->At(1))->GetString().Atoi();
    text = content;
    // cout << "ns " << nspan <<  ((TObjString *)array->At(1))->GetString() << endl;
    // cout << "t " << text << endl;
    
    for(Int_t ispan = 1; ispan < nspan; ispan++){
      text+=" & ";
    }
    //    cout << "t " << text << endl;
    
  
  }

  text.ReplaceAll("\\mathrm", "");

  text.ReplaceAll("\\", "");
  text.Strip(TString::EStripType(1), ' ');

}

void AliLatexTable::LoadTeXFromFileAndPrintASCII(const char * filename) {

  // opens a file containing only a latex table and prints it on screen as ASCII

  ifstream file (filename);
  if (!file.is_open()) {
    AliError(Form("Cannot open file %s", filename));
  }
  TString line;
  while (line.ReadLine(file)) {
    if (line.Contains("begin") && line.Contains("tabular")) {
      // We need to get and parse the format
      //      TPRegexp re("\\begin\\{tabular\\}\\{([^\\}]*)\\}");
      TPRegexp re(".*begin{tabular}{(.*)}");
      TObjArray * arr = re.MatchS(line);
      if (arr->GetLast() > 0){ 
	//	cout << "Size: " << arr->GetSize() << " " << arr->GetLast() << endl;
	
	TString subStr = ((TObjString *)arr->At(1))->GetString();
	subStr.ReplaceAll("|","");
	subStr.ReplaceAll(" ","");
	subStr.ReplaceAll("\t","");
	//	subStr.ReplaceAll(" ","");	
	//	cout << subStr.Data() << " " << subStr.Length()<< endl;
	fNcol = subStr.Length();
	delete arr;
      }
    }

    // Skip stuff we don't parse
    if (line.Contains("begin")) continue;
    if (line.Contains("end")) continue;
    if (line.Contains("tabular")) continue;
    // add line
    InsertCustomRow(line.Data());
    
  }
  PrintTable("ASCII");
}
 AliLatexTable.cxx:1
 AliLatexTable.cxx:2
 AliLatexTable.cxx:3
 AliLatexTable.cxx:4
 AliLatexTable.cxx:5
 AliLatexTable.cxx:6
 AliLatexTable.cxx:7
 AliLatexTable.cxx:8
 AliLatexTable.cxx:9
 AliLatexTable.cxx:10
 AliLatexTable.cxx:11
 AliLatexTable.cxx:12
 AliLatexTable.cxx:13
 AliLatexTable.cxx:14
 AliLatexTable.cxx:15
 AliLatexTable.cxx:16
 AliLatexTable.cxx:17
 AliLatexTable.cxx:18
 AliLatexTable.cxx:19
 AliLatexTable.cxx:20
 AliLatexTable.cxx:21
 AliLatexTable.cxx:22
 AliLatexTable.cxx:23
 AliLatexTable.cxx:24
 AliLatexTable.cxx:25
 AliLatexTable.cxx:26
 AliLatexTable.cxx:27
 AliLatexTable.cxx:28
 AliLatexTable.cxx:29
 AliLatexTable.cxx:30
 AliLatexTable.cxx:31
 AliLatexTable.cxx:32
 AliLatexTable.cxx:33
 AliLatexTable.cxx:34
 AliLatexTable.cxx:35
 AliLatexTable.cxx:36
 AliLatexTable.cxx:37
 AliLatexTable.cxx:38
 AliLatexTable.cxx:39
 AliLatexTable.cxx:40
 AliLatexTable.cxx:41
 AliLatexTable.cxx:42
 AliLatexTable.cxx:43
 AliLatexTable.cxx:44
 AliLatexTable.cxx:45
 AliLatexTable.cxx:46
 AliLatexTable.cxx:47
 AliLatexTable.cxx:48
 AliLatexTable.cxx:49
 AliLatexTable.cxx:50
 AliLatexTable.cxx:51
 AliLatexTable.cxx:52
 AliLatexTable.cxx:53
 AliLatexTable.cxx:54
 AliLatexTable.cxx:55
 AliLatexTable.cxx:56
 AliLatexTable.cxx:57
 AliLatexTable.cxx:58
 AliLatexTable.cxx:59
 AliLatexTable.cxx:60
 AliLatexTable.cxx:61
 AliLatexTable.cxx:62
 AliLatexTable.cxx:63
 AliLatexTable.cxx:64
 AliLatexTable.cxx:65
 AliLatexTable.cxx:66
 AliLatexTable.cxx:67
 AliLatexTable.cxx:68
 AliLatexTable.cxx:69
 AliLatexTable.cxx:70
 AliLatexTable.cxx:71
 AliLatexTable.cxx:72
 AliLatexTable.cxx:73
 AliLatexTable.cxx:74
 AliLatexTable.cxx:75
 AliLatexTable.cxx:76
 AliLatexTable.cxx:77
 AliLatexTable.cxx:78
 AliLatexTable.cxx:79
 AliLatexTable.cxx:80
 AliLatexTable.cxx:81
 AliLatexTable.cxx:82
 AliLatexTable.cxx:83
 AliLatexTable.cxx:84
 AliLatexTable.cxx:85
 AliLatexTable.cxx:86
 AliLatexTable.cxx:87
 AliLatexTable.cxx:88
 AliLatexTable.cxx:89
 AliLatexTable.cxx:90
 AliLatexTable.cxx:91
 AliLatexTable.cxx:92
 AliLatexTable.cxx:93
 AliLatexTable.cxx:94
 AliLatexTable.cxx:95
 AliLatexTable.cxx:96
 AliLatexTable.cxx:97
 AliLatexTable.cxx:98
 AliLatexTable.cxx:99
 AliLatexTable.cxx:100
 AliLatexTable.cxx:101
 AliLatexTable.cxx:102
 AliLatexTable.cxx:103
 AliLatexTable.cxx:104
 AliLatexTable.cxx:105
 AliLatexTable.cxx:106
 AliLatexTable.cxx:107
 AliLatexTable.cxx:108
 AliLatexTable.cxx:109
 AliLatexTable.cxx:110
 AliLatexTable.cxx:111
 AliLatexTable.cxx:112
 AliLatexTable.cxx:113
 AliLatexTable.cxx:114
 AliLatexTable.cxx:115
 AliLatexTable.cxx:116
 AliLatexTable.cxx:117
 AliLatexTable.cxx:118
 AliLatexTable.cxx:119
 AliLatexTable.cxx:120
 AliLatexTable.cxx:121
 AliLatexTable.cxx:122
 AliLatexTable.cxx:123
 AliLatexTable.cxx:124
 AliLatexTable.cxx:125
 AliLatexTable.cxx:126
 AliLatexTable.cxx:127
 AliLatexTable.cxx:128
 AliLatexTable.cxx:129
 AliLatexTable.cxx:130
 AliLatexTable.cxx:131
 AliLatexTable.cxx:132
 AliLatexTable.cxx:133
 AliLatexTable.cxx:134
 AliLatexTable.cxx:135
 AliLatexTable.cxx:136
 AliLatexTable.cxx:137
 AliLatexTable.cxx:138
 AliLatexTable.cxx:139
 AliLatexTable.cxx:140
 AliLatexTable.cxx:141
 AliLatexTable.cxx:142
 AliLatexTable.cxx:143
 AliLatexTable.cxx:144
 AliLatexTable.cxx:145
 AliLatexTable.cxx:146
 AliLatexTable.cxx:147
 AliLatexTable.cxx:148
 AliLatexTable.cxx:149
 AliLatexTable.cxx:150
 AliLatexTable.cxx:151
 AliLatexTable.cxx:152
 AliLatexTable.cxx:153
 AliLatexTable.cxx:154
 AliLatexTable.cxx:155
 AliLatexTable.cxx:156
 AliLatexTable.cxx:157
 AliLatexTable.cxx:158
 AliLatexTable.cxx:159
 AliLatexTable.cxx:160
 AliLatexTable.cxx:161
 AliLatexTable.cxx:162
 AliLatexTable.cxx:163
 AliLatexTable.cxx:164
 AliLatexTable.cxx:165
 AliLatexTable.cxx:166
 AliLatexTable.cxx:167
 AliLatexTable.cxx:168
 AliLatexTable.cxx:169
 AliLatexTable.cxx:170
 AliLatexTable.cxx:171
 AliLatexTable.cxx:172
 AliLatexTable.cxx:173
 AliLatexTable.cxx:174
 AliLatexTable.cxx:175
 AliLatexTable.cxx:176
 AliLatexTable.cxx:177
 AliLatexTable.cxx:178
 AliLatexTable.cxx:179
 AliLatexTable.cxx:180
 AliLatexTable.cxx:181
 AliLatexTable.cxx:182
 AliLatexTable.cxx:183
 AliLatexTable.cxx:184
 AliLatexTable.cxx:185
 AliLatexTable.cxx:186
 AliLatexTable.cxx:187
 AliLatexTable.cxx:188
 AliLatexTable.cxx:189
 AliLatexTable.cxx:190
 AliLatexTable.cxx:191
 AliLatexTable.cxx:192
 AliLatexTable.cxx:193
 AliLatexTable.cxx:194
 AliLatexTable.cxx:195
 AliLatexTable.cxx:196
 AliLatexTable.cxx:197
 AliLatexTable.cxx:198
 AliLatexTable.cxx:199
 AliLatexTable.cxx:200
 AliLatexTable.cxx:201
 AliLatexTable.cxx:202
 AliLatexTable.cxx:203
 AliLatexTable.cxx:204
 AliLatexTable.cxx:205
 AliLatexTable.cxx:206
 AliLatexTable.cxx:207
 AliLatexTable.cxx:208
 AliLatexTable.cxx:209
 AliLatexTable.cxx:210
 AliLatexTable.cxx:211
 AliLatexTable.cxx:212
 AliLatexTable.cxx:213
 AliLatexTable.cxx:214
 AliLatexTable.cxx:215
 AliLatexTable.cxx:216
 AliLatexTable.cxx:217
 AliLatexTable.cxx:218
 AliLatexTable.cxx:219
 AliLatexTable.cxx:220
 AliLatexTable.cxx:221
 AliLatexTable.cxx:222
 AliLatexTable.cxx:223
 AliLatexTable.cxx:224
 AliLatexTable.cxx:225
 AliLatexTable.cxx:226
 AliLatexTable.cxx:227
 AliLatexTable.cxx:228
 AliLatexTable.cxx:229
 AliLatexTable.cxx:230
 AliLatexTable.cxx:231
 AliLatexTable.cxx:232
 AliLatexTable.cxx:233
 AliLatexTable.cxx:234
 AliLatexTable.cxx:235
 AliLatexTable.cxx:236
 AliLatexTable.cxx:237
 AliLatexTable.cxx:238
 AliLatexTable.cxx:239
 AliLatexTable.cxx:240
 AliLatexTable.cxx:241
 AliLatexTable.cxx:242
 AliLatexTable.cxx:243
 AliLatexTable.cxx:244
 AliLatexTable.cxx:245
 AliLatexTable.cxx:246
 AliLatexTable.cxx:247
 AliLatexTable.cxx:248
 AliLatexTable.cxx:249
 AliLatexTable.cxx:250
 AliLatexTable.cxx:251
 AliLatexTable.cxx:252
 AliLatexTable.cxx:253
 AliLatexTable.cxx:254
 AliLatexTable.cxx:255
 AliLatexTable.cxx:256
 AliLatexTable.cxx:257
 AliLatexTable.cxx:258
 AliLatexTable.cxx:259
 AliLatexTable.cxx:260
 AliLatexTable.cxx:261
 AliLatexTable.cxx:262
 AliLatexTable.cxx:263
 AliLatexTable.cxx:264
 AliLatexTable.cxx:265
 AliLatexTable.cxx:266
 AliLatexTable.cxx:267
 AliLatexTable.cxx:268
 AliLatexTable.cxx:269
 AliLatexTable.cxx:270
 AliLatexTable.cxx:271
 AliLatexTable.cxx:272
 AliLatexTable.cxx:273
 AliLatexTable.cxx:274
 AliLatexTable.cxx:275
 AliLatexTable.cxx:276
 AliLatexTable.cxx:277
 AliLatexTable.cxx:278
 AliLatexTable.cxx:279
 AliLatexTable.cxx:280
 AliLatexTable.cxx:281
 AliLatexTable.cxx:282
 AliLatexTable.cxx:283
 AliLatexTable.cxx:284
 AliLatexTable.cxx:285
 AliLatexTable.cxx:286
 AliLatexTable.cxx:287
 AliLatexTable.cxx:288
 AliLatexTable.cxx:289
 AliLatexTable.cxx:290
 AliLatexTable.cxx:291
 AliLatexTable.cxx:292
 AliLatexTable.cxx:293
 AliLatexTable.cxx:294
 AliLatexTable.cxx:295
 AliLatexTable.cxx:296
 AliLatexTable.cxx:297
 AliLatexTable.cxx:298
 AliLatexTable.cxx:299
 AliLatexTable.cxx:300
 AliLatexTable.cxx:301
 AliLatexTable.cxx:302
 AliLatexTable.cxx:303
 AliLatexTable.cxx:304
 AliLatexTable.cxx:305
 AliLatexTable.cxx:306
 AliLatexTable.cxx:307
 AliLatexTable.cxx:308
 AliLatexTable.cxx:309
 AliLatexTable.cxx:310
 AliLatexTable.cxx:311
 AliLatexTable.cxx:312
 AliLatexTable.cxx:313
 AliLatexTable.cxx:314
 AliLatexTable.cxx:315
 AliLatexTable.cxx:316
 AliLatexTable.cxx:317
 AliLatexTable.cxx:318
 AliLatexTable.cxx:319
 AliLatexTable.cxx:320
 AliLatexTable.cxx:321
 AliLatexTable.cxx:322
 AliLatexTable.cxx:323
 AliLatexTable.cxx:324
 AliLatexTable.cxx:325
 AliLatexTable.cxx:326
 AliLatexTable.cxx:327
 AliLatexTable.cxx:328
 AliLatexTable.cxx:329
 AliLatexTable.cxx:330
 AliLatexTable.cxx:331
 AliLatexTable.cxx:332
 AliLatexTable.cxx:333
 AliLatexTable.cxx:334
 AliLatexTable.cxx:335
 AliLatexTable.cxx:336
 AliLatexTable.cxx:337
 AliLatexTable.cxx:338
 AliLatexTable.cxx:339
 AliLatexTable.cxx:340
 AliLatexTable.cxx:341
 AliLatexTable.cxx:342
 AliLatexTable.cxx:343
 AliLatexTable.cxx:344
 AliLatexTable.cxx:345
 AliLatexTable.cxx:346
 AliLatexTable.cxx:347
 AliLatexTable.cxx:348
 AliLatexTable.cxx:349
 AliLatexTable.cxx:350
 AliLatexTable.cxx:351
 AliLatexTable.cxx:352
 AliLatexTable.cxx:353
 AliLatexTable.cxx:354
 AliLatexTable.cxx:355
 AliLatexTable.cxx:356
 AliLatexTable.cxx:357
 AliLatexTable.cxx:358
 AliLatexTable.cxx:359
 AliLatexTable.cxx:360
 AliLatexTable.cxx:361
 AliLatexTable.cxx:362
 AliLatexTable.cxx:363
 AliLatexTable.cxx:364
 AliLatexTable.cxx:365
 AliLatexTable.cxx:366
 AliLatexTable.cxx:367
 AliLatexTable.cxx:368
 AliLatexTable.cxx:369
 AliLatexTable.cxx:370
 AliLatexTable.cxx:371
 AliLatexTable.cxx:372
 AliLatexTable.cxx:373
 AliLatexTable.cxx:374
 AliLatexTable.cxx:375
 AliLatexTable.cxx:376
 AliLatexTable.cxx:377
 AliLatexTable.cxx:378
 AliLatexTable.cxx:379
 AliLatexTable.cxx:380
 AliLatexTable.cxx:381
 AliLatexTable.cxx:382
 AliLatexTable.cxx:383
 AliLatexTable.cxx:384
 AliLatexTable.cxx:385
 AliLatexTable.cxx:386
 AliLatexTable.cxx:387
 AliLatexTable.cxx:388
 AliLatexTable.cxx:389
 AliLatexTable.cxx:390
 AliLatexTable.cxx:391
 AliLatexTable.cxx:392
 AliLatexTable.cxx:393
 AliLatexTable.cxx:394
 AliLatexTable.cxx:395
 AliLatexTable.cxx:396
 AliLatexTable.cxx:397
 AliLatexTable.cxx:398
 AliLatexTable.cxx:399
 AliLatexTable.cxx:400
 AliLatexTable.cxx:401
 AliLatexTable.cxx:402
 AliLatexTable.cxx:403
 AliLatexTable.cxx:404
 AliLatexTable.cxx:405
 AliLatexTable.cxx:406
 AliLatexTable.cxx:407
 AliLatexTable.cxx:408
 AliLatexTable.cxx:409
 AliLatexTable.cxx:410
 AliLatexTable.cxx:411
 AliLatexTable.cxx:412
 AliLatexTable.cxx:413
 AliLatexTable.cxx:414
 AliLatexTable.cxx:415
 AliLatexTable.cxx:416
 AliLatexTable.cxx:417
 AliLatexTable.cxx:418
 AliLatexTable.cxx:419
 AliLatexTable.cxx:420
 AliLatexTable.cxx:421
 AliLatexTable.cxx:422
 AliLatexTable.cxx:423
 AliLatexTable.cxx:424
 AliLatexTable.cxx:425
 AliLatexTable.cxx:426
 AliLatexTable.cxx:427
 AliLatexTable.cxx:428
 AliLatexTable.cxx:429
 AliLatexTable.cxx:430
 AliLatexTable.cxx:431
 AliLatexTable.cxx:432
 AliLatexTable.cxx:433
 AliLatexTable.cxx:434
 AliLatexTable.cxx:435
 AliLatexTable.cxx:436
 AliLatexTable.cxx:437
 AliLatexTable.cxx:438
 AliLatexTable.cxx:439
 AliLatexTable.cxx:440
 AliLatexTable.cxx:441
 AliLatexTable.cxx:442
 AliLatexTable.cxx:443
 AliLatexTable.cxx:444
 AliLatexTable.cxx:445
 AliLatexTable.cxx:446
 AliLatexTable.cxx:447
 AliLatexTable.cxx:448
 AliLatexTable.cxx:449
 AliLatexTable.cxx:450
 AliLatexTable.cxx:451
 AliLatexTable.cxx:452
 AliLatexTable.cxx:453
 AliLatexTable.cxx:454
 AliLatexTable.cxx:455
 AliLatexTable.cxx:456
 AliLatexTable.cxx:457
 AliLatexTable.cxx:458
 AliLatexTable.cxx:459
 AliLatexTable.cxx:460
 AliLatexTable.cxx:461
 AliLatexTable.cxx:462
 AliLatexTable.cxx:463
 AliLatexTable.cxx:464
 AliLatexTable.cxx:465
 AliLatexTable.cxx:466
 AliLatexTable.cxx:467
 AliLatexTable.cxx:468
 AliLatexTable.cxx:469
 AliLatexTable.cxx:470
 AliLatexTable.cxx:471
 AliLatexTable.cxx:472
 AliLatexTable.cxx:473
 AliLatexTable.cxx:474
 AliLatexTable.cxx:475
 AliLatexTable.cxx:476
 AliLatexTable.cxx:477
 AliLatexTable.cxx:478
 AliLatexTable.cxx:479
 AliLatexTable.cxx:480
 AliLatexTable.cxx:481
 AliLatexTable.cxx:482
 AliLatexTable.cxx:483
 AliLatexTable.cxx:484
 AliLatexTable.cxx:485
 AliLatexTable.cxx:486
 AliLatexTable.cxx:487
 AliLatexTable.cxx:488
 AliLatexTable.cxx:489
 AliLatexTable.cxx:490
 AliLatexTable.cxx:491
 AliLatexTable.cxx:492
 AliLatexTable.cxx:493
 AliLatexTable.cxx:494
 AliLatexTable.cxx:495
 AliLatexTable.cxx:496
 AliLatexTable.cxx:497
 AliLatexTable.cxx:498
 AliLatexTable.cxx:499
 AliLatexTable.cxx:500
 AliLatexTable.cxx:501
 AliLatexTable.cxx:502
 AliLatexTable.cxx:503
 AliLatexTable.cxx:504
 AliLatexTable.cxx:505
 AliLatexTable.cxx:506
 AliLatexTable.cxx:507
 AliLatexTable.cxx:508
 AliLatexTable.cxx:509
 AliLatexTable.cxx:510
 AliLatexTable.cxx:511
 AliLatexTable.cxx:512
 AliLatexTable.cxx:513
 AliLatexTable.cxx:514
 AliLatexTable.cxx:515
 AliLatexTable.cxx:516
 AliLatexTable.cxx:517
 AliLatexTable.cxx:518
 AliLatexTable.cxx:519
 AliLatexTable.cxx:520
 AliLatexTable.cxx:521
 AliLatexTable.cxx:522
 AliLatexTable.cxx:523
 AliLatexTable.cxx:524
 AliLatexTable.cxx:525
 AliLatexTable.cxx:526
 AliLatexTable.cxx:527
 AliLatexTable.cxx:528
 AliLatexTable.cxx:529
 AliLatexTable.cxx:530
 AliLatexTable.cxx:531
 AliLatexTable.cxx:532
 AliLatexTable.cxx:533
 AliLatexTable.cxx:534
 AliLatexTable.cxx:535
 AliLatexTable.cxx:536
 AliLatexTable.cxx:537
 AliLatexTable.cxx:538
 AliLatexTable.cxx:539
 AliLatexTable.cxx:540
 AliLatexTable.cxx:541