ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/


///////////////////////////////////////////////////////////////////////////
// Class TStatToolkit
// 
// Subset of  matheamtical functions  not included in the TMath
//
//
/////////////////////////////////////////////////////////////////////////
#include "TMath.h"
#include "Riostream.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TH3.h"
#include "TF1.h"
#include "TTree.h"
#include "TChain.h"
#include "TObjString.h"
#include "TLinearFitter.h"
#include "TGraph2D.h"
#include "TGraph.h"
#include "TGraphErrors.h"
#include "TMultiGraph.h"
#include "TCanvas.h"
#include "TLatex.h"
#include "TCut.h"
//
// includes neccessary for test functions
//
#include "TSystem.h"
#include "TRandom.h"
#include "TStopwatch.h"
#include "TTreeStream.h"

#include "TStatToolkit.h"


using std::cout;
using std::cerr;
using std::endl;

 
ClassImp(TStatToolkit) // Class implementation to enable ROOT I/O
 
TStatToolkit::TStatToolkit() : TObject()
{
  //
  // Default constructor
  //
}
///////////////////////////////////////////////////////////////////////////
TStatToolkit::~TStatToolkit()
{
  //
  // Destructor
  //
}


//_____________________________________________________________________________
void TStatToolkit::EvaluateUni(Int_t nvectors, Double_t *data, Double_t &mean
                           , Double_t &sigma, Int_t hh)
{
  //
  // Robust estimator in 1D case MI version - (faster than ROOT version)
  //
  // For the univariate case
  // estimates of location and scatter are returned in mean and sigma parameters
  // the algorithm works on the same principle as in multivariate case -
  // it finds a subset of size hh with smallest sigma, and then returns mean and
  // sigma of this subset
  //

  if (hh==0)
    hh=(nvectors+2)/2;
  Double_t faclts[]={2.6477,2.5092,2.3826,2.2662,2.1587,2.0589,1.9660,1.879,1.7973,1.7203,1.6473};
  Int_t *index=new Int_t[nvectors];
  TMath::Sort(nvectors, data, index, kFALSE);
  
  Int_t    nquant = TMath::Min(Int_t(Double_t(((hh*1./nvectors)-0.5)*40))+1, 11);
  Double_t factor = faclts[TMath::Max(0,nquant-1)];
  
  Double_t sumx  =0;
  Double_t sumx2 =0;
  Int_t    bestindex = -1;
  Double_t bestmean  = 0; 
  Double_t bestsigma = (data[index[nvectors-1]]-data[index[0]]+1.);   // maximal possible sigma
  bestsigma *=bestsigma;

  for (Int_t i=0; i<hh; i++){
    sumx  += data[index[i]];
    sumx2 += data[index[i]]*data[index[i]];
  }
  
  Double_t norm = 1./Double_t(hh);
  Double_t norm2 = (hh-1)>0 ? 1./Double_t(hh-1):1;
  for (Int_t i=hh; i<nvectors; i++){
    Double_t cmean  = sumx*norm;
    Double_t csigma = (sumx2 - hh*cmean*cmean)*norm2;
    if (csigma<bestsigma){
      bestmean  = cmean;
      bestsigma = csigma;
      bestindex = i-hh;
    }
    
    sumx  += data[index[i]]-data[index[i-hh]];
    sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
  }
  
  Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
  mean  = bestmean;
  sigma = bstd;
  delete [] index;

}



void TStatToolkit::EvaluateUniExternal(Int_t nvectors, Double_t *data, Double_t &mean, Double_t &sigma, Int_t hh,  Float_t externalfactor)
{
  // Modified version of ROOT robust EvaluateUni
  // robust estimator in 1D case MI version
  // added external factor to include precision of external measurement
  // 

  if (hh==0)
    hh=(nvectors+2)/2;
  Double_t faclts[]={2.6477,2.5092,2.3826,2.2662,2.1587,2.0589,1.9660,1.879,1.7973,1.7203,1.6473};
  Int_t *index=new Int_t[nvectors];
  TMath::Sort(nvectors, data, index, kFALSE);
  //
  Int_t    nquant = TMath::Min(Int_t(Double_t(((hh*1./nvectors)-0.5)*40))+1, 11);
  Double_t factor = faclts[0];
  if (nquant>0){
    // fix proper normalization - Anja
    factor = faclts[nquant-1];
  }

  //
  //
  Double_t sumx  =0;
  Double_t sumx2 =0;
  Int_t    bestindex = -1;
  Double_t bestmean  = 0; 
  Double_t bestsigma = -1;
  for (Int_t i=0; i<hh; i++){
    sumx  += data[index[i]];
    sumx2 += data[index[i]]*data[index[i]];
  }
  //   
  Double_t kfactor = 2.*externalfactor - externalfactor*externalfactor;
  Double_t norm = 1./Double_t(hh);
  for (Int_t i=hh; i<nvectors; i++){
    Double_t cmean  = sumx*norm;
    Double_t csigma = (sumx2*norm - cmean*cmean*kfactor);
    if (csigma<bestsigma ||  bestsigma<0){
      bestmean  = cmean;
      bestsigma = csigma;
      bestindex = i-hh;
    }
    //
    //
    sumx  += data[index[i]]-data[index[i-hh]];
    sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
  }
  
  Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
  mean  = bestmean;
  sigma = bstd;
  delete [] index;
}


//_____________________________________________________________________________
Int_t TStatToolkit::Freq(Int_t n, const Int_t *inlist
                        , Int_t *outlist, Bool_t down)
{    
  //
  //  Sort eleements according occurancy 
  //  The size of output array has is 2*n 
  //

  Int_t * sindexS = new Int_t[n];     // temp array for sorting
  Int_t * sindexF = new Int_t[2*n];   
  for (Int_t i=0;i<n;i++) sindexS[i]=0;
  for (Int_t i=0;i<2*n;i++) sindexF[i]=0;
  //
  TMath::Sort(n,inlist, sindexS, down);  
  Int_t last      = inlist[sindexS[0]];
  Int_t val       = last;
  sindexF[0]      = 1;
  sindexF[0+n]    = last;
  Int_t countPos  = 0;
  //
  //  find frequency
  for(Int_t i=1;i<n; i++){
    val = inlist[sindexS[i]];
    if (last == val)   sindexF[countPos]++;
    else{      
      countPos++;
      sindexF[countPos+n] = val;
      sindexF[countPos]++;
      last =val;
    }
  }
  if (last==val) countPos++;
  // sort according frequency
  TMath::Sort(countPos, sindexF, sindexS, kTRUE);
  for (Int_t i=0;i<countPos;i++){
    outlist[2*i  ] = sindexF[sindexS[i]+n];
    outlist[2*i+1] = sindexF[sindexS[i]];
  }
  delete [] sindexS;
  delete [] sindexF;
  
  return countPos;

}

//___TStatToolkit__________________________________________________________________________
void TStatToolkit::TruncatedMean(const TH1 * his, TVectorD *param, Float_t down, Float_t up, Bool_t verbose){
  //
  //
  //
  Int_t nbins    = his->GetNbinsX();
  Float_t nentries = his->GetEntries();
  Float_t sum      =0;
  Float_t mean   = 0;
  Float_t sigma2 = 0;
  Float_t ncumul=0;  
  for (Int_t ibin=1;ibin<nbins; ibin++){
    ncumul+= his->GetBinContent(ibin);
    Float_t fraction = Float_t(ncumul)/Float_t(nentries);
    if (fraction>down && fraction<up){
      sum+=his->GetBinContent(ibin);
      mean+=his->GetBinCenter(ibin)*his->GetBinContent(ibin);
      sigma2+=his->GetBinCenter(ibin)*his->GetBinCenter(ibin)*his->GetBinContent(ibin);      
    }
  }
  mean/=sum;
  sigma2= TMath::Sqrt(TMath::Abs(sigma2/sum-mean*mean));
  if (param){
    (*param)[0] = his->GetMaximum();
    (*param)[1] = mean;
    (*param)[2] = sigma2;
    
  }
  if (verbose)  printf("Mean\t%f\t Sigma2\t%f\n", mean,sigma2);
}

void TStatToolkit::LTM(TH1 * his, TVectorD *param , Float_t fraction,  Bool_t verbose){
  //
  // LTM : Trimmed mean on histogram - Modified version for binned data
  //
  // Robust statistic to estimate properties of the distribution
  // See http://en.wikipedia.org/w/index.php?title=Trimmed_estimator&oldid=582847999
  //
  // New faster version is under preparation
  //
  if (!param) return;
  (*param)[0]=0;
  (*param)[1]=0;
  (*param)[2]=0;  
  Int_t nbins    = his->GetNbinsX();
  Int_t nentries = (Int_t)his->GetEntries();
  if (nentries<=0) return;
  Double_t *data  = new Double_t[nentries];
  Int_t npoints=0;
  for (Int_t ibin=1;ibin<nbins; ibin++){
    Double_t entriesI = his->GetBinContent(ibin);
    //Double_t xcenter= his->GetBinCenter(ibin);
    Double_t x0 =  his->GetXaxis()->GetBinLowEdge(ibin);
    Double_t w  =  his->GetXaxis()->GetBinWidth(ibin);
    for (Int_t ic=0; ic<entriesI; ic++){
      if (npoints<nentries){
	data[npoints]= x0+w*Double_t((ic+0.5)/entriesI);
	npoints++;
      }
    }
  }
  Double_t mean, sigma;  
  Int_t npoints2=TMath::Min(Int_t(fraction*Float_t(npoints)),npoints-1);
  npoints2=TMath::Max(Int_t(0.5*Float_t(npoints)),npoints2);
  TStatToolkit::EvaluateUni(npoints, data, mean,sigma,npoints2);
  delete [] data;
  if (verbose)  printf("Mean\t%f\t Sigma2\t%f\n", mean,sigma);if (param){
    (*param)[0] = his->GetMaximum();
    (*param)[1] = mean;
    (*param)[2] = sigma;    
  }
}


void TStatToolkit::MedianFilter(TH1 * his1D, Int_t nmedian){
  //
  // Algorithm to filter  histogram
  // author:  marian.ivanov@cern.ch
  // Details of algorithm:
  // http://en.wikipedia.org/w/index.php?title=Median_filter&oldid=582191524
  // Input parameters:
  //    his1D - input histogam - to be modiefied by Medianfilter
  //    nmendian - number of bins in median filter
  //
  Int_t nbins    = his1D->GetNbinsX();
  TVectorD vectorH(nbins);
  for (Int_t ibin=0; ibin<nbins; ibin++) vectorH[ibin]=his1D->GetBinContent(ibin+1);
  for (Int_t ibin=0; ibin<nbins; ibin++) {
    Int_t index0=ibin-nmedian;
    Int_t index1=ibin+nmedian;
    if (index0<0) {index1+=-index0; index0=0;}
    if (index1>=nbins) {index0-=index1-nbins+1; index1=nbins-1;}    
    Double_t value= TMath::Median(index1-index0,&(vectorH.GetMatrixArray()[index0]));
    his1D->SetBinContent(ibin+1, value);
  }  
}

Bool_t TStatToolkit::LTMHisto(TH1 *his1D, TVectorD &params , Float_t fraction){
  //
  // LTM : Trimmed mean on histogram - Modified version for binned data
  // 
  // Robust statistic to estimate properties of the distribution
  // To handle binning error special treatment
  // for definition of unbinned data see:
  //     http://en.wikipedia.org/w/index.php?title=Trimmed_estimator&oldid=582847999
  //
  // Function parameters:
  //     his1D   - input histogram
  //     params  - vector with parameters
  //             - 0 - area
  //             - 1 - mean
  //             - 2 - rms 
  //             - 3 - error estimate of mean
  //             - 4 - error estimate of RMS
  //             - 5 - first accepted bin position
  //             - 6 - last accepted  bin position
  //
  Int_t nbins    = his1D->GetNbinsX();
  Int_t nentries = (Int_t)his1D->GetEntries();
  const Double_t kEpsilon=0.0000000001;

  if (nentries<=0) return 0;
  if (fraction>1) fraction=0;
  if (fraction<0) return 0;
  TVectorD vectorX(nbins);
  TVectorD vectorMean(nbins);
  TVectorD vectorRMS(nbins);
  Double_t sumCont=0;
  for (Int_t ibin0=1; ibin0<=nbins; ibin0++) sumCont+=his1D->GetBinContent(ibin0);
  //
  Double_t minRMS=his1D->GetRMS()*10000;
  Int_t maxBin=0;
  //
  for (Int_t ibin0=1; ibin0<nbins; ibin0++){
    Double_t sum0=0, sum1=0, sum2=0;
    Int_t ibin1=ibin0;
    for ( ibin1=ibin0; ibin1<nbins; ibin1++){
      Double_t cont=his1D->GetBinContent(ibin1);
      Double_t x= his1D->GetBinCenter(ibin1);
      sum0+=cont;
      sum1+=cont*x;
      sum2+=cont*x*x;
      if ( (ibin0!=ibin1) && sum0>=fraction*sumCont) break;
    }
    vectorX[ibin0]=his1D->GetBinCenter(ibin0);
    if (sum0<fraction*sumCont) continue;
    //
    // substract fractions of bin0 and bin1 to keep sum0=fration*sumCont
    //
    Double_t diff = sum0-fraction*sumCont;
    Double_t mean = (sum0>0) ? sum1/sum0:0;
    //
    Double_t x0=his1D->GetBinCenter(ibin0);
    Double_t x1=his1D->GetBinCenter(ibin1);
    Double_t y0=his1D->GetBinContent(ibin0);
    Double_t y1=his1D->GetBinContent(ibin1);
    //
    Double_t d = y0+y1-diff;    //enties to keep 
    Double_t w0=0,w1=0;
    if (y0<=kEpsilon&&y1>kEpsilon){
      w1=d/y1;
    } 
    if (y1<=kEpsilon&&y0>kEpsilon){
      w0=d/y0;
    }
    if (y0>kEpsilon && y1>kEpsilon && x1>x0  ){
      w0 = (d*(x1-mean))/((x1-x0)*y0);
      w1 = (d-y0*w0)/y1;
      //
      if (w0>1) {w1+=(w0-1)*y0/y1; w0=1;}
      if (w1>1) {w0+=(w1-1)*y1/y0; w1=1;}
    }  
    if ( (x1>x0) &&TMath::Abs(y0*w0+y1*w1-d)>kEpsilon*sum0){
      printf(" TStatToolkit::LTMHisto error\n");
    }
    sum0-=y0+y1;
    sum1-=y0*x0;
    sum1-=y1*x1;
    sum2-=y0*x0*x0;
    sum2-=y1*x1*x1;
    //
    Double_t xx0=his1D->GetXaxis()->GetBinUpEdge(ibin0)-0.5*w0*his1D->GetBinWidth(ibin0);
    Double_t xx1=his1D->GetXaxis()->GetBinLowEdge(ibin1)+0.5*w1*his1D->GetBinWidth(ibin1);
    sum0+=y0*w0+y1*w1;
    sum1+=y0*w0*xx0;
    sum1+=y1*w1*xx1;
    sum2+=y0*w0*xx0*xx0;
    sum2+=y1*w1*xx1*xx1;

    //
    // choose the bin with smallest rms
    //
    if (sum0>0){
      vectorMean[ibin0]=sum1/sum0;
      vectorRMS[ibin0]=TMath::Sqrt(TMath::Abs(sum2/sum0-vectorMean[ibin0]*vectorMean[ibin0]));
      if (vectorRMS[ibin0]<minRMS){
	minRMS=vectorRMS[ibin0];
	params[0]=sum0;
	params[1]=vectorMean[ibin0];
	params[2]=vectorRMS[ibin0];
	params[3]=vectorRMS[ibin0]/TMath::Sqrt(sumCont*fraction);
	params[4]=0; // what is the formula for error of RMS???
	params[5]=ibin0;
	params[6]=ibin1;
	params[7]=his1D->GetBinCenter(ibin0);
	params[8]=his1D->GetBinCenter(ibin1);
	maxBin=ibin0;
      }
    }else{
      break;
    }
  }
  return kTRUE;
}


Double_t  TStatToolkit::FitGaus(TH1* his, TVectorD *param, TMatrixD */*matrix*/, Float_t xmin, Float_t xmax, Bool_t verbose){
  //
  //  Fit histogram with gaussian function
  //  
  //  Prameters:
  //       return value- chi2 - if negative ( not enough points)
  //       his        -  input histogram
  //       param      -  vector with parameters 
  //       xmin, xmax -  range to fit - if xmin=xmax=0 - the full histogram range used
  //  Fitting:
  //  1. Step - make logarithm
  //  2. Linear  fit (parabola) - more robust - always converge
  //  3. In case of small statistic bins are averaged
  //  
  static TLinearFitter fitter(3,"pol2");
  TVectorD  par(3);
  TVectorD  sigma(3);
  TMatrixD mat(3,3);
  if (his->GetMaximum()<4) return -1;  
  if (his->GetEntries()<12) return -1;  
  if (his->GetRMS()<mat.GetTol()) return -1;
  Float_t maxEstimate   = his->GetEntries()*his->GetBinWidth(1)/TMath::Sqrt((TMath::TwoPi()*his->GetRMS()));
  Int_t dsmooth = TMath::Nint(6./TMath::Sqrt(maxEstimate));

  if (maxEstimate<1) return -1;
  Int_t nbins    = his->GetNbinsX();
  Int_t npoints=0;
  //


  if (xmin>=xmax){
    xmin = his->GetXaxis()->GetXmin();
    xmax = his->GetXaxis()->GetXmax();
  }
  for (Int_t iter=0; iter<2; iter++){
    fitter.ClearPoints();
    npoints=0;
    for (Int_t ibin=1;ibin<nbins+1; ibin++){
      Int_t countB=1;
      Float_t entriesI =  his->GetBinContent(ibin);
      for (Int_t delta = -dsmooth; delta<=dsmooth; delta++){
	if (ibin+delta>1 &&ibin+delta<nbins-1){
	  entriesI +=  his->GetBinContent(ibin+delta);
	  countB++;
	}
      }
      entriesI/=countB;
      Double_t xcenter= his->GetBinCenter(ibin);
      if (xcenter<xmin || xcenter>xmax) continue;
      Double_t error=1./TMath::Sqrt(countB);
      Float_t   cont=2;
      if (iter>0){
	if (par[0]+par[1]*xcenter+par[2]*xcenter*xcenter>20) return 0;
	cont = TMath::Exp(par[0]+par[1]*xcenter+par[2]*xcenter*xcenter);
	if (cont>1.) error = 1./TMath::Sqrt(cont*Float_t(countB));
      }
      if (entriesI>1&&cont>1){
	fitter.AddPoint(&xcenter,TMath::Log(Float_t(entriesI)),error);
	npoints++;
      }
    }  
    if (npoints>3){
      fitter.Eval();
      fitter.GetParameters(par);
    }else{
      break;
    }
  }
  if (npoints<=3){
    return -1;
  }
  fitter.GetParameters(par);
  fitter.GetCovarianceMatrix(mat);
  if (TMath::Abs(par[1])<mat.GetTol()) return -1;
  if (TMath::Abs(par[2])<mat.GetTol()) return -1;
  Double_t chi2 = fitter.GetChisquare()/Float_t(npoints);
  //fitter.GetParameters();
  if (!param)  param  = new TVectorD(3);
  // if (!matrix) matrix = new TMatrixD(3,3); // Covariance matrix to be implemented
  (*param)[1] = par[1]/(-2.*par[2]);
  (*param)[2] = 1./TMath::Sqrt(TMath::Abs(-2.*par[2]));
  (*param)[0] = TMath::Exp(par[0]+ par[1]* (*param)[1] +  par[2]*(*param)[1]*(*param)[1]);
  if (verbose){
    par.Print();
    mat.Print();
    param->Print();
    printf("Chi2=%f\n",chi2);
    TF1 * f1= new TF1("f1","[0]*exp(-(x-[1])^2/(2*[2]*[2]))",his->GetXaxis()->GetXmin(),his->GetXaxis()->GetXmax());
    f1->SetParameter(0, (*param)[0]);
    f1->SetParameter(1, (*param)[1]);
    f1->SetParameter(2, (*param)[2]);    
    f1->Draw("same");
  }
  return chi2;
}

Double_t  TStatToolkit::FitGaus(Float_t *arr, Int_t nBins, Float_t xMin, Float_t xMax, TVectorD *param, TMatrixD */*matrix*/, Bool_t verbose){
  //
  //  Fit histogram with gaussian function
  //  
  //  Prameters:
  //     nbins: size of the array and number of histogram bins
  //     xMin, xMax: histogram range
  //     param: paramters of the fit (0-Constant, 1-Mean, 2-Sigma)
  //     matrix: covariance matrix -- not implemented yet, pass dummy matrix!!!
  //
  //  Return values:
  //    >0: the chi2 returned by TLinearFitter
  //    -3: only three points have been used for the calculation - no fitter was used
  //    -2: only two points have been used for the calculation - center of gravity was uesed for calculation
  //    -1: only one point has been used for the calculation - center of gravity was uesed for calculation
  //    -4: invalid result!!
  //
  //  Fitting:
  //  1. Step - make logarithm
  //  2. Linear  fit (parabola) - more robust - always converge
  //  
  static TLinearFitter fitter(3,"pol2");
  static TMatrixD mat(3,3);
  static Double_t kTol = mat.GetTol();
  fitter.StoreData(kFALSE);
  fitter.ClearPoints();
  TVectorD  par(3);
  TVectorD  sigma(3);
  TMatrixD matA(3,3);
  TMatrixD b(3,1);
  Float_t rms = TMath::RMS(nBins,arr);
  Float_t max = TMath::MaxElement(nBins,arr);
  Float_t binWidth = (xMax-xMin)/(Float_t)nBins;

  Float_t meanCOG = 0;
  Float_t rms2COG = 0;
  Float_t sumCOG  = 0;

  Float_t entries = 0;
  Int_t nfilled=0;

  for (Int_t i=0; i<nBins; i++){
      entries+=arr[i];
      if (arr[i]>0) nfilled++;
  }

  if (max<4) return -4;
  if (entries<12) return -4;
  if (rms<kTol) return -4;

  Int_t npoints=0;
  //

  //
  for (Int_t ibin=0;ibin<nBins; ibin++){
      Float_t entriesI = arr[ibin];
    if (entriesI>1){
      Double_t xcenter = xMin+(ibin+0.5)*binWidth;
      
      Float_t error    = 1./TMath::Sqrt(entriesI);
      Float_t val = TMath::Log(Float_t(entriesI));
      fitter.AddPoint(&xcenter,val,error);
      if (npoints<3){
	  matA(npoints,0)=1;
	  matA(npoints,1)=xcenter;
	  matA(npoints,2)=xcenter*xcenter;
	  b(npoints,0)=val;
	  meanCOG+=xcenter*entriesI;
	  rms2COG +=xcenter*entriesI*xcenter;
	  sumCOG +=entriesI;
      }
      npoints++;
    }
  }

  
  Double_t chi2 = 0;
  if (npoints>=3){
      if ( npoints == 3 ){
	  //analytic calculation of the parameters for three points
	  matA.Invert();
	  TMatrixD res(1,3);
	  res.Mult(matA,b);
	  par[0]=res(0,0);
	  par[1]=res(0,1);
	  par[2]=res(0,2);
          chi2 = -3.;
      } else {
          // use fitter for more than three points
	  fitter.Eval();
	  fitter.GetParameters(par);
	  fitter.GetCovarianceMatrix(mat);
	  chi2 = fitter.GetChisquare()/Float_t(npoints);
      }
      if (TMath::Abs(par[1])<kTol) return -4;
      if (TMath::Abs(par[2])<kTol) return -4;

      if (!param)  param  = new TVectorD(3);
      //if (!matrix) matrix = new TMatrixD(3,3);  // !!!!might be a memory leek. use dummy matrix pointer to call this function! // Covariance matrix to be implemented

      (*param)[1] = par[1]/(-2.*par[2]);
      (*param)[2] = 1./TMath::Sqrt(TMath::Abs(-2.*par[2]));
      Double_t lnparam0 = par[0]+ par[1]* (*param)[1] +  par[2]*(*param)[1]*(*param)[1];
      if ( lnparam0>307 ) return -4;
      (*param)[0] = TMath::Exp(lnparam0);
      if (verbose){
	  par.Print();
	  mat.Print();
	  param->Print();
	  printf("Chi2=%f\n",chi2);
	  TF1 * f1= new TF1("f1","[0]*exp(-(x-[1])^2/(2*[2]*[2]))",xMin,xMax);
	  f1->SetParameter(0, (*param)[0]);
	  f1->SetParameter(1, (*param)[1]);
	  f1->SetParameter(2, (*param)[2]);
	  f1->Draw("same");
      }
      return chi2;
  }

  if (npoints == 2){
      //use center of gravity for 2 points
      meanCOG/=sumCOG;
      rms2COG /=sumCOG;
      (*param)[0] = max;
      (*param)[1] = meanCOG;
      (*param)[2] = TMath::Sqrt(TMath::Abs(meanCOG*meanCOG-rms2COG));
      chi2=-2.;
  }
  if ( npoints == 1 ){
      meanCOG/=sumCOG;
      (*param)[0] = max;
      (*param)[1] = meanCOG;
      (*param)[2] = binWidth/TMath::Sqrt(12);
      chi2=-1.;
  }
  return chi2;

}


Float_t TStatToolkit::GetCOG(const Short_t *arr, Int_t nBins, Float_t xMin, Float_t xMax, Float_t *rms, Float_t *sum)
{
    //
    //  calculate center of gravity rms and sum for array 'arr' with nBins an a x range xMin to xMax
    //  return COG; in case of failure return xMin
    //
    Float_t meanCOG = 0;
    Float_t rms2COG = 0;
    Float_t sumCOG  = 0;
    Int_t npoints   = 0;

    Float_t binWidth = (xMax-xMin)/(Float_t)nBins;

    for (Int_t ibin=0; ibin<nBins; ibin++){
	Float_t entriesI = (Float_t)arr[ibin];
	Double_t xcenter = xMin+(ibin+0.5)*binWidth;
	if ( entriesI>0 ){
	    meanCOG += xcenter*entriesI;
	    rms2COG += xcenter*entriesI*xcenter;
	    sumCOG  += entriesI;
	    npoints++;
	}
    }
    if ( sumCOG == 0 ) return xMin;
    meanCOG/=sumCOG;

    if ( rms ){
	rms2COG /=sumCOG;
	(*rms) = TMath::Sqrt(TMath::Abs(meanCOG*meanCOG-rms2COG));
	if ( npoints == 1 ) (*rms) = binWidth/TMath::Sqrt(12);
    }

    if ( sum )
        (*sum) = sumCOG;

    return meanCOG;
}



///////////////////////////////////////////////////////////////
//////////////         TEST functions /////////////////////////
///////////////////////////////////////////////////////////////





void TStatToolkit::TestGausFit(Int_t nhistos){
  //
  // Test performance of the parabolic - gaussian fit - compare it with 
  // ROOT gauss fit
  //  nhistos - number of histograms to be used for test
  //
  TTreeSRedirector *pcstream = new TTreeSRedirector("fitdebug.root","recreate");
  
  Float_t  *xTrue = new Float_t[nhistos];
  Float_t  *sTrue = new Float_t[nhistos];
  TVectorD **par1  = new TVectorD*[nhistos];
  TVectorD **par2  = new TVectorD*[nhistos];
  TMatrixD dummy(3,3);
  
  
  TH1F **h1f = new TH1F*[nhistos];
  TF1  *myg = new TF1("myg","gaus");
  TF1  *fit = new TF1("fit","gaus");
  gRandom->SetSeed(0);
  
  //init
  for (Int_t i=0;i<nhistos; i++){
    par1[i] = new TVectorD(3);
    par2[i] = new TVectorD(3);
    h1f[i]  = new TH1F(Form("h1f%d",i),Form("h1f%d",i),20,-10,10);
    xTrue[i]= gRandom->Rndm();
    gSystem->Sleep(2);
    sTrue[i]= .75+gRandom->Rndm()*.5;
    myg->SetParameters(1,xTrue[i],sTrue[i]);
    h1f[i]->FillRandom("myg");
  }
  
  TStopwatch s; 
  s.Start();
  //standard gaus fit
  for (Int_t i=0; i<nhistos; i++){
    h1f[i]->Fit(fit,"0q");
    (*par1[i])(0) = fit->GetParameter(0);
    (*par1[i])(1) = fit->GetParameter(1);
    (*par1[i])(2) = fit->GetParameter(2);
  }
  s.Stop();
  printf("Gaussian fit\t");
  s.Print();
  
  s.Start();
  //TStatToolkit gaus fit
  for (Int_t i=0; i<nhistos; i++){
    TStatToolkit::FitGaus(h1f[i]->GetArray()+1,h1f[i]->GetNbinsX(),h1f[i]->GetXaxis()->GetXmin(),h1f[i]->GetXaxis()->GetXmax(),par2[i],&dummy);
  }
  
  s.Stop();
  printf("Parabolic fit\t");
  s.Print();
  //write stream
  for (Int_t i=0;i<nhistos; i++){
    Float_t xt  = xTrue[i];
    Float_t st  = sTrue[i];
    (*pcstream)<<"data"
	       <<"xTrue="<<xt
	       <<"sTrue="<<st
	       <<"pg.="<<(par1[i])
	       <<"pa.="<<(par2[i])
	       <<"\n";
  }    
  //delete pointers
  for (Int_t i=0;i<nhistos; i++){
    delete par1[i];
    delete par2[i];
    delete h1f[i];
  }
  delete pcstream;
  delete []h1f;
  delete []xTrue;
  delete []sTrue;
  //
  delete []par1;
  delete []par2;

}



TGraph2D * TStatToolkit::MakeStat2D(TH3 * his, Int_t delta0, Int_t delta1, Int_t type){
  //
  //
  //
  // delta - number of bins to integrate
  // type - 0 - mean value

  TAxis * xaxis  = his->GetXaxis();
  TAxis * yaxis  = his->GetYaxis();
  //  TAxis * zaxis  = his->GetZaxis();
  Int_t   nbinx  = xaxis->GetNbins();
  Int_t   nbiny  = yaxis->GetNbins();
  char name[1000];
  Int_t icount=0;
  TGraph2D  *graph = new TGraph2D(nbinx*nbiny);
  TF1 f1("f1","gaus");
  for (Int_t ix=0; ix<nbinx;ix++)
    for (Int_t iy=0; iy<nbiny;iy++){
      Float_t xcenter = xaxis->GetBinCenter(ix); 
      Float_t ycenter = yaxis->GetBinCenter(iy); 
      snprintf(name,1000,"%s_%d_%d",his->GetName(), ix,iy);
      TH1 *projection = his->ProjectionZ(name,ix-delta0,ix+delta0,iy-delta1,iy+delta1);
      Float_t stat= 0;
      if (type==0) stat = projection->GetMean();
      if (type==1) stat = projection->GetRMS();
      if (type==2 || type==3){
	TVectorD vec(10);
	TStatToolkit::LTM((TH1F*)projection,&vec,0.7);
	if (type==2) stat= vec[1];
	if (type==3) stat= vec[0];	
      }
      if (type==4|| type==5){
	projection->Fit(&f1);
	if (type==4) stat= f1.GetParameter(1);
	if (type==5) stat= f1.GetParameter(2);
      }
      //printf("%d\t%f\t%f\t%f\n", icount,xcenter, ycenter, stat);
      graph->SetPoint(icount,xcenter, ycenter, stat);
      icount++;
    }
  return graph;
}

TGraphErrors * TStatToolkit::MakeStat1D(TH2 * his, Int_t deltaBin, Double_t fraction, Int_t returnType, Int_t markerStyle, Int_t markerColor){
  //
  // function to retrieve the "mean and RMS estimate" of 2D histograms
  //     
  // Robust statistic to estimate properties of the distribution
  // See http://en.wikipedia.org/wiki/Trimmed_estimator
  //
  // deltaBin - number of bins to integrate (bin+-deltaBin)
  // fraction - fraction of values for the LTM and for the gauss fit
  // returnType - 
  //        0 - mean value
  //        1 - RMS
  //        2 - LTM mean
  //        3 - LTM sigma
  //        4 - Gaus fit mean  - on LTM range
  //        5 - Gaus fit sigma - on LTM  range
  // 
  TAxis * xaxis  = his->GetXaxis();
  Int_t   nbinx  = xaxis->GetNbins();
  char name[1000];
  Int_t icount=0;
  //
  TVectorD vecX(nbinx);
  TVectorD vecXErr(nbinx);
  TVectorD vecY(nbinx);
  TVectorD vecYErr(nbinx);
  //
  TF1 f1("f1","gaus");
  TVectorD vecLTM(10);

  for (Int_t jx=1; jx<=nbinx;jx++){
    Int_t ix=jx-1;
    Float_t xcenter = xaxis->GetBinCenter(jx); 
    snprintf(name,1000,"%s_%d",his->GetName(), ix);
    TH1 *projection = his->ProjectionY(name,TMath::Max(jx-deltaBin,1),TMath::Min(jx+deltaBin,nbinx));
    Double_t stat= 0;
    Double_t err =0;
    TStatToolkit::LTMHisto((TH1F*)projection,vecLTM,fraction);  
    //
    if (returnType==0) {
      stat = projection->GetMean();
      err  = projection->GetMeanError();
    }
    if (returnType==1) {
      stat = projection->GetRMS();
      err = projection->GetRMSError();
    }
    if (returnType==2 || returnType==3){
      if (returnType==2) {stat= vecLTM[1];  err =projection->GetRMSError();}
	if (returnType==3) {stat= vecLTM[2];	 err =projection->GetRMSError();}
    }
    if (returnType==4|| returnType==5){
      projection->Fit(&f1,"QN","QN", vecLTM[7], vecLTM[8]);
      if (returnType==4) {
	stat= f1.GetParameter(1);
	err=f1.GetParError(1);
      }
      if (returnType==5) {
	stat= f1.GetParameter(2);
	err=f1.GetParError(2);
      }
    }
    vecX[icount]=xcenter;
    vecY[icount]=stat;
    vecYErr[icount]=err;
    icount++;
    delete projection;
  }
  TGraphErrors  *graph = new TGraphErrors(icount,vecX.GetMatrixArray(), vecY.GetMatrixArray(),0, vecYErr.GetMatrixArray());
  graph->SetMarkerStyle(markerStyle);
  graph->SetMarkerColor(markerColor);
  return graph;
}





TString* TStatToolkit::FitPlane(TTree *tree, const char* drawCommand, const char* formula, const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac, Int_t start, Int_t stop,Bool_t fix0){
   //
   // fit an arbitrary function, specified by formula into the data, specified by drawCommand and cuts
   // returns chi2, fitParam and covMatrix
   // returns TString with fitted formula
   //

   TString formulaStr(formula); 
   TString drawStr(drawCommand);
   TString cutStr(cuts);
   TString ferr("1");

   TString strVal(drawCommand);
   if (strVal.Contains(":")){
     TObjArray* valTokens = strVal.Tokenize(":");
     drawStr = valTokens->At(0)->GetName();
     ferr       = valTokens->At(1)->GetName();     
     delete valTokens;
   }

      
   formulaStr.ReplaceAll("++", "~");
   TObjArray* formulaTokens = formulaStr.Tokenize("~"); 
   Int_t dim = formulaTokens->GetEntriesFast();
   
   fitParam.ResizeTo(dim);
   covMatrix.ResizeTo(dim,dim);
   
   TLinearFitter* fitter = new TLinearFitter(dim+1, Form("hyp%d",dim));
   fitter->StoreData(kTRUE);   
   fitter->ClearPoints();
   
   Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete formulaTokens;
     return new TString(TString::Format("ERROR expr: %s\t%s\tEntries==0",drawStr.Data(),cutStr.Data()));
   }
   Double_t **values = new Double_t*[dim+1] ;
   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
   //
   entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete formulaTokens;
     delete []values;
     return new TString(TString::Format("ERROR error part: %s\t%s\tEntries==0",ferr.Data(),cutStr.Data()));
   }
   Double_t *errors = new Double_t[entries];
   memcpy(errors,  tree->GetV1(), entries*sizeof(Double_t));
   
   for (Int_t i = 0; i < dim + 1; i++){
      Int_t centries = 0;
      if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(), "goff", stop-start,start);
      else  centries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff", stop-start,start);
      
      if (entries != centries) {
	delete []errors;
	delete []values;
	return new TString(TString::Format("ERROR: %s\t%s\tEntries==%d\tEntries2=%d\n",drawStr.Data(),cutStr.Data(),entries,centries));
      }
      values[i] = new Double_t[entries];
      memcpy(values[i],  tree->GetV1(), entries*sizeof(Double_t)); 
   }
   
   // add points to the fitter
   for (Int_t i = 0; i < entries; i++){
      Double_t x[1000];
      for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
      fitter->AddPoint(x, values[dim][i], errors[i]);
   }

   fitter->Eval();
   if (frac>0.5 && frac<1){
     fitter->EvalRobust(frac);
   }else{
     if (fix0) {
       fitter->FixParameter(0,0);
       fitter->Eval();     
     }
   }
   fitter->GetParameters(fitParam);
   fitter->GetCovarianceMatrix(covMatrix);
   chi2 = fitter->GetChisquare();
   npoints = entries;   
   TString *preturnFormula = new TString(Form("( %f+",fitParam[0])), &returnFormula = *preturnFormula; 
   
   for (Int_t iparam = 0; iparam < dim; iparam++) {
     returnFormula.Append(Form("%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
     if (iparam < dim-1) returnFormula.Append("+");
   }
   returnFormula.Append(" )");
   
   
   for (Int_t j=0; j<dim+1;j++) delete [] values[j];


   delete formulaTokens;
   delete fitter;
   delete[] values;
   delete[] errors;
   return preturnFormula;
}

TString* TStatToolkit::FitPlaneConstrain(TTree *tree, const char* drawCommand, const char* formula, const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac, Int_t start, Int_t stop,Double_t constrain){
   //
   // fit an arbitrary function, specified by formula into the data, specified by drawCommand and cuts
   // returns chi2, fitParam and covMatrix
   // returns TString with fitted formula
   //

   TString formulaStr(formula); 
   TString drawStr(drawCommand);
   TString cutStr(cuts);
   TString ferr("1");

   TString strVal(drawCommand);
   if (strVal.Contains(":")){
     TObjArray* valTokens = strVal.Tokenize(":");
     drawStr = valTokens->At(0)->GetName();
     ferr       = valTokens->At(1)->GetName();     
     delete valTokens;
   }

      
   formulaStr.ReplaceAll("++", "~");
   TObjArray* formulaTokens = formulaStr.Tokenize("~"); 
   Int_t dim = formulaTokens->GetEntriesFast();
   
   fitParam.ResizeTo(dim);
   covMatrix.ResizeTo(dim,dim);
   
   TLinearFitter* fitter = new TLinearFitter(dim+1, Form("hyp%d",dim));
   fitter->StoreData(kTRUE);   
   fitter->ClearPoints();
   
   Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete formulaTokens;
     return new TString("An ERROR has occured during fitting!");
   }
   Double_t **values = new Double_t*[dim+1] ; 
   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
   //
   entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete formulaTokens;
     delete [] values;
     return new TString("An ERROR has occured during fitting!");
   }
   Double_t *errors = new Double_t[entries];
   memcpy(errors,  tree->GetV1(), entries*sizeof(Double_t));
   
   for (Int_t i = 0; i < dim + 1; i++){
      Int_t centries = 0;
      if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(), "goff", stop-start,start);
      else  centries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff", stop-start,start);
      
      if (entries != centries) {
	delete []errors;
	delete []values;
	delete formulaTokens;
	return new TString("An ERROR has occured during fitting!");
      }
      values[i] = new Double_t[entries];
      memcpy(values[i],  tree->GetV1(), entries*sizeof(Double_t)); 
   }
   
   // add points to the fitter
   for (Int_t i = 0; i < entries; i++){
      Double_t x[1000];
      for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
      fitter->AddPoint(x, values[dim][i], errors[i]);
   }
   if (constrain>0){
     for (Int_t i = 0; i < dim; i++){
       Double_t x[1000];
       for (Int_t j=0; j<dim;j++) if (i!=j) x[j]=0;
       x[i]=1.;
       fitter->AddPoint(x, 0, constrain);
     }
   }


   fitter->Eval();
   if (frac>0.5 && frac<1){
     fitter->EvalRobust(frac);   
   }
   fitter->GetParameters(fitParam);
   fitter->GetCovarianceMatrix(covMatrix);
   chi2 = fitter->GetChisquare();
   npoints = entries;
   
   TString *preturnFormula = new TString(Form("( %f+",fitParam[0])), &returnFormula = *preturnFormula; 
   
   for (Int_t iparam = 0; iparam < dim; iparam++) {
     returnFormula.Append(Form("%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
     if (iparam < dim-1) returnFormula.Append("+");
   }
   returnFormula.Append(" )");
   
   for (Int_t j=0; j<dim+1;j++) delete [] values[j];
   


   delete formulaTokens;
   delete fitter;
   delete[] values;
   delete[] errors;
   return preturnFormula;
}



TString* TStatToolkit::FitPlaneFixed(TTree *tree, const char* drawCommand, const char* formula, const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac, Int_t start, Int_t stop){
   //
   // fit an arbitrary function, specified by formula into the data, specified by drawCommand and cuts
   // returns chi2, fitParam and covMatrix
   // returns TString with fitted formula
   //

   TString formulaStr(formula); 
   TString drawStr(drawCommand);
   TString cutStr(cuts);
   TString ferr("1");

   TString strVal(drawCommand);
   if (strVal.Contains(":")){
     TObjArray* valTokens = strVal.Tokenize(":");
     drawStr = valTokens->At(0)->GetName();
     ferr       = valTokens->At(1)->GetName();
     delete valTokens;
   }

      
   formulaStr.ReplaceAll("++", "~");
   TObjArray* formulaTokens = formulaStr.Tokenize("~"); 
   Int_t dim = formulaTokens->GetEntriesFast();
   
   fitParam.ResizeTo(dim);
   covMatrix.ResizeTo(dim,dim);
   TString fitString="x0";
   for (Int_t i=1; i<dim; i++) fitString+=Form("++x%d",i);     
   TLinearFitter* fitter = new TLinearFitter(dim, fitString.Data());
   fitter->StoreData(kTRUE);   
   fitter->ClearPoints();
   
   Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete formulaTokens;
     return new TString("An ERROR has occured during fitting!");
   }
   Double_t **values = new Double_t*[dim+1] ; 
   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
   //
   entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
   if (entries == -1) {
     delete []values;
     delete formulaTokens;
     return new TString("An ERROR has occured during fitting!");
   }
   Double_t *errors = new Double_t[entries];
   memcpy(errors,  tree->GetV1(), entries*sizeof(Double_t));
   
   for (Int_t i = 0; i < dim + 1; i++){
      Int_t centries = 0;
      if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(), "goff", stop-start,start);
      else  centries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff", stop-start,start);
      
      if (entries != centries) {
	delete []errors;
	delete []values;
	delete formulaTokens;
	return new TString("An ERROR has occured during fitting!");
      }
      values[i] = new Double_t[entries];
      memcpy(values[i],  tree->GetV1(), entries*sizeof(Double_t)); 
   }
   
   // add points to the fitter
   for (Int_t i = 0; i < entries; i++){
      Double_t x[1000];
      for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
      fitter->AddPoint(x, values[dim][i], errors[i]);
   }

   fitter->Eval();
   if (frac>0.5 && frac<1){
     fitter->EvalRobust(frac);
   }
   fitter->GetParameters(fitParam);
   fitter->GetCovarianceMatrix(covMatrix);
   chi2 = fitter->GetChisquare();
   npoints = entries;
   
   TString *preturnFormula = new TString("("), &returnFormula = *preturnFormula; 
   
   for (Int_t iparam = 0; iparam < dim; iparam++) {
     returnFormula.Append(Form("%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam]));
     if (iparam < dim-1) returnFormula.Append("+");
   }
   returnFormula.Append(" )");
   
   
   for (Int_t j=0; j<dim+1;j++) delete [] values[j];
   
   delete formulaTokens;
   delete fitter;
   delete[] values;
   delete[] errors;
   return preturnFormula;
}





Int_t TStatToolkit::GetFitIndex(const TString fString, const TString subString){
  //
  // fitString - ++ separated list of fits
  // substring - ++ separated list of the requiered substrings
  //
  // return the last occurance of substring in fit string
  // 
  TObjArray *arrFit = fString.Tokenize("++");
  TObjArray *arrSub = subString.Tokenize("++");
  Int_t index=-1;
  for (Int_t i=0; i<arrFit->GetEntries(); i++){
    Bool_t isOK=kTRUE;
    TString str =arrFit->At(i)->GetName();
    for (Int_t isub=0; isub<arrSub->GetEntries(); isub++){
      if (str.Contains(arrSub->At(isub)->GetName())==0) isOK=kFALSE;
    }
    if (isOK) index=i;
  }
  delete arrFit;
  delete arrSub;
  return index;
}


TString  TStatToolkit::FilterFit(const TString &input, const TString filter, TVectorD &param, TMatrixD & covar){
  //
  // Filter fit expression make sub-fit
  //
  TObjArray *array0= input.Tokenize("++");
  TObjArray *array1= filter.Tokenize("++");
  //TString *presult=new TString("(0");
  TString result="(0.0";
  for (Int_t i=0; i<array0->GetEntries(); i++){
    Bool_t isOK=kTRUE;
    TString str(array0->At(i)->GetName());
    for (Int_t j=0; j<array1->GetEntries(); j++){
      if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;      
    }
    if (isOK) {
      result+="+"+str;
      result+=Form("*(%f)",param[i+1]);
      printf("%f\t%f\t%s\n",param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());    
    }
  }
  result+="-0.)";
  delete array0;
  delete array1;
  return result;
}

void TStatToolkit::Update1D(Double_t delta, Double_t sigma, Int_t s1, TMatrixD &vecXk, TMatrixD &covXk){
  //
  // Update parameters and covariance - with one measurement
  // Input:
  // vecXk - input vector - Updated in function 
  // covXk - covariance matrix - Updated in function
  // delta, sigma, s1 - new measurement, rms of new measurement and the index of measurement
  const Int_t knMeas=1;
  Int_t knElem=vecXk.GetNrows();
 
  TMatrixD mat1(knElem,knElem);            // update covariance matrix
  TMatrixD matHk(1,knElem);        // vector to mesurement
  TMatrixD vecYk(knMeas,1);        // Innovation or measurement residual
  TMatrixD matHkT(knElem,knMeas);  // helper matrix Hk transpose
  TMatrixD matSk(knMeas,knMeas);   // Innovation (or residual) covariance
  TMatrixD matKk(knElem,knMeas);   // Optimal Kalman gain
  TMatrixD covXk2(knElem,knElem);  // helper matrix
  TMatrixD covXk3(knElem,knElem);  // helper matrix
  TMatrixD vecZk(1,1);
  TMatrixD measR(1,1);
  vecZk(0,0)=delta;
  measR(0,0)=sigma*sigma;
  //
  // reset matHk
  for (Int_t iel=0;iel<knElem;iel++) 
    for (Int_t ip=0;ip<knMeas;ip++) matHk(ip,iel)=0; 
  //mat1
  for (Int_t iel=0;iel<knElem;iel++) {
    for (Int_t jel=0;jel<knElem;jel++) mat1(iel,jel)=0;
    mat1(iel,iel)=1;
  }
  //
  matHk(0, s1)=1;
  vecYk = vecZk-matHk*vecXk;               // Innovation or measurement residual
  matHkT=matHk.T(); matHk.T();
  matSk = (matHk*(covXk*matHkT))+measR;    // Innovation (or residual) covariance
  matSk.Invert();
  matKk = (covXk*matHkT)*matSk;            //  Optimal Kalman gain
  vecXk += matKk*vecYk;                    //  updated vector 
  covXk2= (mat1-(matKk*matHk));
  covXk3 =  covXk2*covXk;          
  covXk = covXk3;  
  Int_t nrows=covXk3.GetNrows();
  
  for (Int_t irow=0; irow<nrows; irow++)
    for (Int_t icol=0; icol<nrows; icol++){
      // rounding problems - make matrix again symteric
      covXk(irow,icol)=(covXk3(irow,icol)+covXk3(icol,irow))*0.5; 
    }
}



void   TStatToolkit::Constrain1D(const TString &input, const TString filter, TVectorD &param, TMatrixD & covar, Double_t mean, Double_t sigma){
  //
  // constrain linear fit
  // input  - string description of fit function
  // filter - string filter to select sub fits
  // param,covar - parameters and covariance matrix of the fit
  // mean,sigma  - new measurement uning which the fit is updated
  //
  
  TObjArray *array0= input.Tokenize("++");
  TObjArray *array1= filter.Tokenize("++");
  TMatrixD paramM(param.GetNrows(),1);
  for (Int_t i=0; i<=array0->GetEntries(); i++){paramM(i,0)=param(i);}
  
  if (filter.Length()==0){
    TStatToolkit::Update1D(mean, sigma, 0, paramM, covar);//
  }else{  
    for (Int_t i=0; i<array0->GetEntries(); i++){
      Bool_t isOK=kTRUE;
      TString str(array0->At(i)->GetName());
      for (Int_t j=0; j<array1->GetEntries(); j++){
	if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;      
      }
      if (isOK) {
	TStatToolkit::Update1D(mean, sigma, i+1, paramM, covar);//
      }
    }
  }
  for (Int_t i=0; i<=array0->GetEntries(); i++){
    param(i)=paramM(i,0);
  }
  delete array0;
  delete array1;
}

TString  TStatToolkit::MakeFitString(const TString &input, const TVectorD &param, const TMatrixD & covar, Bool_t verbose){
  //
  //
  //
  TObjArray *array0= input.Tokenize("++");
  TString result=Form("(%f",param[0]);
  printf("%f\t%f\t\n", param[0], TMath::Sqrt(covar(0,0))); 
  for (Int_t i=0; i<array0->GetEntries(); i++){
    TString str(array0->At(i)->GetName());
    result+="+"+str;
    result+=Form("*(%f)",param[i+1]);
    if (verbose) printf("%f\t%f\t%s\n", param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());    
  }
  result+="-0.)";
  delete array0;
  return result;
}

TGraphErrors * TStatToolkit::MakeGraphErrors(TTree * tree, const char * expr, const char * cut,  Int_t mstyle, Int_t mcolor, Float_t msize, Float_t offset){
  //
  // Query a graph errors
  // return TGraphErrors specified by expr and cut 
  // Example  usage TStatToolkit::MakeGraphError(tree,"Y:X:ErrY","X>0", 25,2,0.4)
  // tree   - tree with variable
  // expr   - examp 
  const Int_t entries =  tree->Draw(expr,cut,"goff");
  if (entries<=0) {
    TStatToolkit t;
    t.Error("TStatToolkit::MakeGraphError",Form("Empty or Not valid expression (%s) or cut *%s)", expr,cut));
    return 0;
  }
  if (  tree->GetV2()==0){
    TStatToolkit t;
    t.Error("TStatToolkit::MakeGraphError",Form("Not valid expression (%s) ", expr));
    return 0;
  }
  TGraphErrors * graph=0;
  if ( tree->GetV3()!=0){
    graph = new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,tree->GetV3());
  }else{
    graph = new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,0);
  }
  graph->SetMarkerStyle(mstyle); 
  graph->SetMarkerColor(mcolor);
  graph->SetLineColor(mcolor);
  graph->SetTitle(expr);
  TString chstring(expr);
  TObjArray *charray = chstring.Tokenize(":");
  graph->GetXaxis()->SetTitle(charray->At(1)->GetName());
  graph->GetYaxis()->SetTitle(charray->At(0)->GetName());
  delete charray;
  if (msize>0) graph->SetMarkerSize(msize);
  for(Int_t i=0;i<graph->GetN();i++) graph->GetX()[i]+=offset;
  return graph;
  
}


TGraph * TStatToolkit::MakeGraphSparse(TTree * tree, const char * expr, const char * cut, Int_t mstyle, Int_t mcolor, Float_t msize, Float_t offset){
  //
  // Make a sparse draw of the variables
  // Format of expr : Var:Run or Var:Run:ErrorY or Var:Run:ErrorY:ErrorX
  // offset : points can slightly be shifted in x for better visibility with more graphs
  //
  // Written by Weilin.Yu
  // updated & merged with QA-code by Patrick Reichelt
  //
  const Int_t entries = tree->Draw(expr,cut,"goff");
  if (entries<=0) {
    TStatToolkit t;
    t.Error("TStatToolkit::MakeGraphSparse",Form("Empty or Not valid expression (%s) or cut (%s)", expr, cut));
    return 0;
  }
  //  TGraph * graph = (TGraph*)gPad->GetPrimitive("Graph"); // 2D

  Double_t *graphY, *graphX;
  graphY = tree->GetV1();
  graphX = tree->GetV2();

  // sort according to run number
  Int_t *index = new Int_t[entries*4];
  TMath::Sort(entries,graphX,index,kFALSE);

  // define arrays for the new graph
  Double_t *unsortedX = new Double_t[entries];
  Int_t *runNumber = new Int_t[entries];
  Double_t count = 0.5;

  // evaluate arrays for the new graph according to the run-number
  Int_t icount=0;
  //first entry
  unsortedX[index[0]] = count;
  runNumber[0] = graphX[index[0]];
  // loop the rest of entries
  for(Int_t i=1;i<entries;i++)
  {
    if(graphX[index[i]]==graphX[index[i-1]])
      unsortedX[index[i]] = count;
    else if(graphX[index[i]]!=graphX[index[i-1]]){
      count++;
      icount++;
      unsortedX[index[i]] = count;
      runNumber[icount]=graphX[index[i]];
    }
  }

  // count the number of xbins (run-wise) for the new graph
  const Int_t newNbins = int(count+0.5);
  Double_t *newBins = new Double_t[newNbins+1];
  for(Int_t i=0; i<=count+1;i++){
    newBins[i] = i;
  }

  // define and fill the new graph
  TGraph *graphNew = 0;
  if (tree->GetV3()) {
    if (tree->GetV4()) {
      graphNew = new TGraphErrors(entries,unsortedX,graphY,tree->GetV4(),tree->GetV3());
    }
    else { graphNew = new TGraphErrors(entries,unsortedX,graphY,0,tree->GetV3()); }
  }
  else { graphNew = new TGraphErrors(entries,unsortedX,graphY,0,0); }
  // with "Set(...)", the x-axis is being sorted
  graphNew->GetXaxis()->Set(newNbins,newBins);

  // set the bins for the x-axis, apply shifting of points
  Char_t xName[50];
  for(Int_t i=0;i<count;i++){
    snprintf(xName,50,"%d",runNumber[i]);
    graphNew->GetXaxis()->SetBinLabel(i+1,xName);
    graphNew->GetX()[i]+=offset;
  }

  graphNew->GetHistogram()->SetTitle("");
  graphNew->SetMarkerStyle(mstyle);
  graphNew->SetMarkerColor(mcolor);  graphNew->SetLineColor(mcolor);
  if (msize>0) { graphNew->SetMarkerSize(msize); graphNew->SetLineWidth(msize); }
  delete [] unsortedX;
  delete [] runNumber;
  delete [] index;
  delete [] newBins;
  // 
  graphNew->SetTitle(expr);
  TString chstring(expr);
  TObjArray *charray = chstring.Tokenize(":");
  graphNew->GetXaxis()->SetTitle(charray->At(1)->GetName());
  graphNew->GetYaxis()->SetTitle(charray->At(0)->GetName());
  delete charray;
  return graphNew;
}



//
// functions used for the trending
//

Int_t  TStatToolkit::MakeStatAlias(TTree * tree, const char * expr, const char * cut, const char * alias) 
{
  //
  // Add alias using statistical values of a given variable.
  // (by MI, Patrick Reichelt)
  //
  // tree - input tree
  // expr - variable expression
  // cut  - selection criteria
  // Output - return number of entries used to define variable
  // In addition mean, rms, median, and robust mean and rms (choosing fraction of data with smallest RMS)
  // 
  /* Example usage:
     1.) create the robust estimators for variable expr="QA.TPC.CPass1.meanTPCncl" and create a corresponding
     aliases with the prefix alias[0]="ncl", calculated using fraction alias[1]="0.90"

     TStatToolkit::MakeStatAlias(tree,"QA.TPC.CPass1.meanTPCncl","QA.TPC.CPass1.status>0","ncl:0.9");
     root [4] tree->GetListOfAliases().Print()
     OBJ: TNamed    ncl_Median      (130.964333+0)
     OBJ: TNamed    ncl_Mean        (122.120387+0)
     OBJ: TNamed    ncl_RMS         (33.509623+0)
     OBJ: TNamed    ncl_Mean90      (131.503862+0)
     OBJ: TNamed    ncl_RMS90       (3.738260+0)    
  */
  // 
  Int_t entries = tree->Draw(expr,cut,"goff");
  if (entries<=1){
    printf("Expression or cut not valid:\t%s\t%s\n", expr, cut);
    return 0;
  }
  //
  TObjArray* oaAlias = TString(alias).Tokenize(":");
  if (oaAlias->GetEntries()<2) {
    printf("Alias must have 2 arguments:\t%s\n", alias);
    return 0;
  }
  Float_t entryFraction = atof( oaAlias->At(1)->GetName() );
  //
  Double_t median = TMath::Median(entries,tree->GetV1());
  Double_t mean   = TMath::Mean(entries,tree->GetV1());
  Double_t rms    = TMath::RMS(entries,tree->GetV1());
  Double_t meanEF=0, rmsEF=0;
  TStatToolkit::EvaluateUni(entries, tree->GetV1(), meanEF, rmsEF, entries*entryFraction);
  //
  tree->SetAlias(Form("%s_Median",oaAlias->At(0)->GetName()), Form("(%f+0)",median));
  tree->SetAlias(Form("%s_Mean",oaAlias->At(0)->GetName()), Form("(%f+0)",mean));
  tree->SetAlias(Form("%s_RMS",oaAlias->At(0)->GetName()), Form("(%f+0)",rms));
  tree->SetAlias(Form("%s_Mean%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form("(%f+0)",meanEF));
  tree->SetAlias(Form("%s_RMS%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form("(%f+0)",rmsEF));
  delete oaAlias; 
  return entries;
}

Int_t  TStatToolkit::SetStatusAlias(TTree * tree, const char * expr, const char * cut, const char * alias) 
{
  //
  // Add alias to trending tree using statistical values of a given variable.
  // (by MI, Patrick Reichelt)
  //
  // format of expr :  varname (e.g. meanTPCncl)
  // format of cut  :  char like in TCut
  // format of alias:  alias:query:entryFraction(EF) (fraction of entries used for uniformity evaluation)
  //            e.g.:  varname_Out:(abs(varname-meanEF)>6.*rmsEF):0.8
  // available internal variables are: 'varname, Median, Mean, MeanEF, RMS, RMSEF'
  // in the alias, 'varname' will be replaced by its content, and 'EF' by the percentage (e.g. MeanEF -> Mean80)
  //
  /* Example usage:
     1.) Define robust mean (possible, but easier done with TStatToolkit::MakeStatAlias(...)) 
     TStatToolkit::SetStatusAlias(tree, "meanTPCnclF", "meanTPCnclF>0", "meanTPCnclF_MeanEF:MeanEF:0.80") ;
     root [10] tree->GetListOfAliases()->Print()
               Collection name='TList', class='TList', size=1
               OBJ: TNamed    meanTPCnclF_Mean80      0.899308
     2.) create alias outlyers  - 6 sigma cut
     TStatToolkit::SetStatusAlias(tree, "meanTPCnclF", "meanTPCnclF>0", "meanTPCnclF_Out:(abs(meanTPCnclF-MeanEF)>6.*RMSEF):0.8")
     meanTPCnclF_Out ==> (abs(meanTPCnclF-0.899308)>6.*0.016590)
     3.) the same functionality as in 2.)
     TStatToolkit::SetStatusAlias(tree, "meanTPCnclF", "meanTPCnclF>0", "varname_Out2:(abs(varname-MeanEF)>6.*RMSEF):0.8") 
     meanTPCnclF_Out2 ==> (abs(meanTPCnclF-0.899308)>6.*0.016590)
  */
  //
  Int_t entries = tree->Draw(expr,cut,"goff");
  if (entries<1){
    printf("Expression or cut not valid:\t%s\t%s\n", expr, cut);
    return 0;
  }
  //
  TObjArray* oaVar = TString(expr).Tokenize(":");
  char varname[50];
  snprintf(varname,50,"%s", oaVar->At(0)->GetName());
  Float_t entryFraction = 0.8;
  //
  TObjArray* oaAlias = TString(alias).Tokenize(":");
  if (oaAlias->GetEntries()<2) {
    printf("Alias must have at least 2 arguments:\t%s\n", alias);
    return 0;
  }
  else if (oaAlias->GetEntries()<3) {
    //printf("Using default entryFraction if needed:\t%f\n", entryFraction);
  }
  else entryFraction = atof( oaAlias->At(2)->GetName() );
  //
  Double_t median = TMath::Median(entries,tree->GetV1());
  Double_t mean   = TMath::Mean(entries,tree->GetV1());
  Double_t rms    = TMath::RMS(entries,tree->GetV1());
  Double_t meanEF=0, rmsEF=0;
  TStatToolkit::EvaluateUni(entries, tree->GetV1(), meanEF, rmsEF, entries*entryFraction);
  //
  TString sAlias( oaAlias->At(0)->GetName() );
  sAlias.ReplaceAll("varname",varname);
  sAlias.ReplaceAll("MeanEF", Form("Mean%1.0f",entryFraction*100) );
  sAlias.ReplaceAll("RMSEF",  Form("RMS%1.0f",entryFraction*100) );
  TString sQuery( oaAlias->At(1)->GetName() );
  sQuery.ReplaceAll("varname",varname);
  sQuery.ReplaceAll("MeanEF", Form("%f",meanEF) );
  sQuery.ReplaceAll("RMSEF",  Form("%f",rmsEF) ); //make sure to replace 'RMSEF' before 'RMS'...
  sQuery.ReplaceAll("Median", Form("%f",median) );
  sQuery.ReplaceAll("Mean",   Form("%f",mean) );
  sQuery.ReplaceAll("RMS",    Form("%f",rms) );
  printf("define alias:\t%s = %s\n", sAlias.Data(), sQuery.Data());
  //
  char query[200];
  char aname[200];
  snprintf(query,200,"%s", sQuery.Data());
  snprintf(aname,200,"%s", sAlias.Data());
  tree->SetAlias(aname, query);
  delete oaVar;
  delete oaAlias;
  return entries;
}

TMultiGraph*  TStatToolkit::MakeStatusMultGr(TTree * tree, const char * expr, const char * cut, const char * alias, Int_t igr) 
{
  //
  // Compute a trending multigraph that shows for which runs a variable has outliers.
  // (by MI, Patrick Reichelt)
  //
  // format of expr :  varname:xaxis (e.g. meanTPCncl:run, but 'varname' can be any string that you need for seach-and-replace)
  // format of cut  :  char like in TCut
  // format of alias:  (1):(statisticOK):(varname_Warning):(varname_Out)[:(varname_PhysAcc):(varname_Extra)]
  //
  // function MakeGraphSparse() is called for each alias argument, which will be used as tree expression.
  // each alias argument is supposed to be a Boolean statement which can be evaluated as tree expression.
  // the order of these criteria should be kept, as the marker styles and colors are chosen to be meaningful this way!
  // 'statisticOK' could e.g. be an alias for '(meanTPCncl>0)'.
  // if you dont need e.g. a 'warning' condition, then just replace it by (0).
  // in the alias, 'varname' will be replaced by its content (e.g. varname_Out -> meanTPCncl_Out)
  // note: the aliases 'varname_Out' etc have to be defined by function TStatToolkit::SetStatusAlias(...)
  // counter igr is used to shift the multigraph in y when filling a TObjArray.
  //
  //
  // To create the Status Bar, the following is done in principle.
  //    ( example current usage in $ALICE_ROOT/PWGPP/TPC/macros/drawPerformanceTPCQAMatchTrends.C and ./qaConfig.C. )
  //
  //  TStatToolkit::SetStatusAlias(tree, "meanTPCncl",    "", "varname_Out:(abs(varname-MeanEF)>6.*RMSEF):0.8");
  //  TStatToolkit::SetStatusAlias(tree, "tpcItsMatchA",  "", "varname_Out:(abs(varname-MeanEF)>6.*RMSEF):0.8");
  //  TStatToolkit::SetStatusAlias(tree, "meanTPCncl",    "", "varname_Warning:(abs(varname-MeanEF)>3.*RMSEF):0.8");
  //  TStatToolkit::SetStatusAlias(tree, "tpcItsMatchA",  "", "varname_Warning:(abs(varname-MeanEF)>3.*RMSEF):0.8");
  //  TObjArray* oaMultGr = new TObjArray(); int igr=0;
  //  oaMultGr->Add( TStatToolkit::MakeStatusMultGr(tree, "tpcItsMatchA:run",  "", "(1):(meanTPCncl>0):(varname_Warning):(varname_Outlier):", igr) ); igr++;
  //  oaMultGr->Add( TStatToolkit::MakeStatusMultGr(tree, "meanTPCncl:run",    "", "(1):(meanTPCncl>0):(varname_Warning):(varname_Outlier):", igr) ); igr++;
  //  TCanvas *c1 = new TCanvas("c1","c1");
  //  TStatToolkit::AddStatusPad(c1, 0.30, 0.40);
  //  TStatToolkit::DrawStatusGraphs(oaMultGr);
  
  
  TObjArray* oaVar = TString(expr).Tokenize(":");
  if (oaVar->GetEntries()<2) {
    printf("Expression has to be of type 'varname:xaxis':\t%s\n", expr);
    return 0;
  }
  char varname[50];
  char var_x[50];
  snprintf(varname,50,"%s", oaVar->At(0)->GetName());
  snprintf(var_x  ,50,"%s", oaVar->At(1)->GetName());
  //
  TString sAlias(alias);
  sAlias.ReplaceAll("varname",varname);
  TObjArray* oaAlias = TString(sAlias.Data()).Tokenize(":");
  if (oaAlias->GetEntries()<2) {
    printf("Alias must have 2-6 arguments:\t%s\n", alias);
    return 0;
  }
  char query[200];
  TMultiGraph* multGr = new TMultiGraph();
  Int_t marArr[6]      = {24+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2};
  Int_t colArr[6]      = {kBlack, kBlack, kOrange, kRed, kGreen+1, kBlue};
  Double_t sizeArr[6]  = {1.4, 1.1, 1.5, 1.1, 1.4, 0.8};
  Double_t shiftArr[6] = {0., 0., 0.25, 0.25, -0.25, -0.25};
  const Int_t ngr = oaAlias->GetEntriesFast();
  for (Int_t i=0; i<ngr; i++){
    snprintf(query,200, "%f*(%s-0.5):%s", 1.+igr, oaAlias->At(i)->GetName(), var_x);
    multGr->Add( (TGraphErrors*) TStatToolkit::MakeGraphSparse(tree,query,cut,marArr[i],colArr[i],sizeArr[i],shiftArr[i]) );
  }
  //
  multGr->SetName(varname);
  multGr->SetTitle(varname); // used for y-axis labels of status bar, can be modified by calling function.
  delete oaVar;
  delete oaAlias;
  return multGr;
}


void  TStatToolkit::AddStatusPad(TCanvas* c1, Float_t padratio, Float_t bottommargin)
{
  //
  // add pad to bottom of canvas for Status graphs (by Patrick Reichelt)
  // call function "DrawStatusGraphs(...)" afterwards
  //
  TCanvas* c1_clone = (TCanvas*) c1->Clone("c1_clone");
  c1->Clear();
  // produce new pads
  c1->cd();
  TPad* pad1 = new TPad("pad1", "pad1", 0., padratio, 1., 1.); 
  pad1->Draw();
  pad1->SetNumber(1); // so it can be called via "c1->cd(1);"
  c1->cd();
  TPad* pad2 = new TPad("pad2", "pad2", 0., 0., 1., padratio);
  pad2->Draw();
  pad2->SetNumber(2);
  // draw original canvas into first pad
  c1->cd(1);
  c1_clone->DrawClonePad();
  pad1->SetBottomMargin(0.001);
  pad1->SetRightMargin(0.01);
  // set up second pad
  c1->cd(2);
  pad2->SetGrid(3);
  pad2->SetTopMargin(0);
  pad2->SetBottomMargin(bottommargin); // for the long x-axis labels (runnumbers)
  pad2->SetRightMargin(0.01);
}


void  TStatToolkit::DrawStatusGraphs(TObjArray* oaMultGr)
{
  //
  // draw Status graphs into active pad of canvas (by MI, Patrick Reichelt)
  // ...into bottom pad, if called after "AddStatusPad(...)"
  //
  const Int_t nvars = oaMultGr->GetEntriesFast();
  TGraph* grAxis = (TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0);
  grAxis->SetMaximum(0.5*nvars+0.5);
  grAxis->SetMinimum(0);
  grAxis->GetYaxis()->SetLabelSize(0);
  grAxis->GetYaxis()->SetTitle("");
  grAxis->SetTitle("");
  Int_t entries = grAxis->GetN();
  grAxis->GetXaxis()->SetLabelSize(5.7*TMath::Min(TMath::Max(5./entries,0.01),0.03));
  grAxis->GetXaxis()->LabelsOption("v");
  grAxis->Draw("ap");
  //
  // draw multigraphs & names of status variables on the y axis
  for (Int_t i=0; i<nvars; i++){
    ((TMultiGraph*) oaMultGr->At(i))->Draw("p");
    TLatex* ylabel = new TLatex(-0.1, 0.5*i+0.5, ((TMultiGraph*) oaMultGr->At(i))->GetTitle());
    ylabel->SetTextAlign(32); //hor:right & vert:centered
    ylabel->SetTextSize(0.025/gPad->GetHNDC());
    ylabel->Draw();
  }
}


TTree*  TStatToolkit::WriteStatusToTree(TObject* oStatusGr) 
{
  //
  // Create Tree with Integers for each status variable flag (warning, outlier, physacc).
  // (by Patrick Reichelt)
  //
  // input: either a TMultiGraph with status of single variable, which 
  //        was computed by TStatToolkit::MakeStatusMultGr(),
  //        or a TObjArray which contains up to 10 of such variables.
  //        example: TTree* statusTree = WriteStatusToTree( TStatToolkit::MakeStatusMultGr(tree, "tpcItsMatch:run",  "", sCriteria.Data(), 0) );
  //        or     : TTree* statusTree = TStatToolkit::WriteStatusToTree(oaMultGr);
  // 
  // output tree: 1=flag is true, 0=flag is false, -1=flag was not computed.
  // To be rewritten to the pcstream
  
  TObjArray* oaMultGr = NULL;
  Bool_t needDeletion=kFALSE;
  if (oStatusGr->IsA() == TObjArray::Class()) {
    oaMultGr = (TObjArray*) oStatusGr;
  }
  else if (oStatusGr->IsA() == TMultiGraph::Class()) {
    oaMultGr = new TObjArray(); needDeletion=kTRUE;
    oaMultGr->Add((TMultiGraph*) oStatusGr);
  }
  else {
    Printf("WriteStatusToTree(): Error! 'oStatusGr' must be a TMultiGraph or a TObjArray of them!");
    return 0;
  }
  // variables for output tree
  const int nvarsMax=10;
  const int ncritMax=5;
  Int_t    currentRun;
  Int_t    treevars[nvarsMax*ncritMax];
  TString  varnames[nvarsMax*ncritMax];
  for (int i=0; i<nvarsMax*ncritMax; i++) treevars[i]=-1;
  
  Printf("WriteStatusToTree(): writing following variables to TTree (maybe only subset of listed criteria filled)");
  for (Int_t vari=0; vari<nvarsMax; vari++) 
  {
    if (vari < oaMultGr->GetEntriesFast()) {
      varnames[vari*ncritMax+0] = Form("%s_statisticOK", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
      varnames[vari*ncritMax+1] = Form("%s_Warning",     ((TMultiGraph*) oaMultGr->At(vari))->GetName());
      varnames[vari*ncritMax+2] = Form("%s_Outlier",     ((TMultiGraph*) oaMultGr->At(vari))->GetName());
      varnames[vari*ncritMax+3] = Form("%s_PhysAcc",     ((TMultiGraph*) oaMultGr->At(vari))->GetName());
      varnames[vari*ncritMax+4] = Form("%s_Extra",       ((TMultiGraph*) oaMultGr->At(vari))->GetName());
    }
    else {
      varnames[vari*ncritMax+0] = Form("dummy");
      varnames[vari*ncritMax+1] = Form("dummy");
      varnames[vari*ncritMax+2] = Form("dummy");
      varnames[vari*ncritMax+3] = Form("dummy");
      varnames[vari*ncritMax+4] = Form("dummy");
    }
    cout << "  " << varnames[vari*ncritMax+0].Data() << " " << varnames[vari*ncritMax+1].Data() << " " << varnames[vari*ncritMax+2].Data() << " " << varnames[vari*ncritMax+3].Data() << " " << varnames[vari*ncritMax+4].Data() << endl;
  }
  
  TTree* statusTree = new TTree("statusTree","statusTree");
  statusTree->Branch("run",                &currentRun  );
  statusTree->Branch(varnames[ 0].Data(),  &treevars[ 0]);
  statusTree->Branch(varnames[ 1].Data(),  &treevars[ 1]);
  statusTree->Branch(varnames[ 2].Data(),  &treevars[ 2]);
  statusTree->Branch(varnames[ 3].Data(),  &treevars[ 3]);
  statusTree->Branch(varnames[ 4].Data(),  &treevars[ 4]);
  statusTree->Branch(varnames[ 5].Data(),  &treevars[ 5]);
  statusTree->Branch(varnames[ 6].Data(),  &treevars[ 6]);
  statusTree->Branch(varnames[ 7].Data(),  &treevars[ 7]);
  statusTree->Branch(varnames[ 8].Data(),  &treevars[ 8]);
  statusTree->Branch(varnames[ 9].Data(),  &treevars[ 9]);
  statusTree->Branch(varnames[10].Data(),  &treevars[10]);
  statusTree->Branch(varnames[11].Data(),  &treevars[11]);
  statusTree->Branch(varnames[12].Data(),  &treevars[12]);
  statusTree->Branch(varnames[13].Data(),  &treevars[13]);
  statusTree->Branch(varnames[14].Data(),  &treevars[14]);
  statusTree->Branch(varnames[15].Data(),  &treevars[15]);
  statusTree->Branch(varnames[16].Data(),  &treevars[16]);
  statusTree->Branch(varnames[17].Data(),  &treevars[17]);
  statusTree->Branch(varnames[18].Data(),  &treevars[18]);
  statusTree->Branch(varnames[19].Data(),  &treevars[19]);
  statusTree->Branch(varnames[20].Data(),  &treevars[20]);
  statusTree->Branch(varnames[21].Data(),  &treevars[21]);
  statusTree->Branch(varnames[22].Data(),  &treevars[22]);
  statusTree->Branch(varnames[23].Data(),  &treevars[23]);
  statusTree->Branch(varnames[24].Data(),  &treevars[24]);
  statusTree->Branch(varnames[25].Data(),  &treevars[25]);
  statusTree->Branch(varnames[26].Data(),  &treevars[26]);
  statusTree->Branch(varnames[27].Data(),  &treevars[27]);
  statusTree->Branch(varnames[28].Data(),  &treevars[28]);
  statusTree->Branch(varnames[29].Data(),  &treevars[29]);
  statusTree->Branch(varnames[30].Data(),  &treevars[30]);
  statusTree->Branch(varnames[31].Data(),  &treevars[31]);
  statusTree->Branch(varnames[32].Data(),  &treevars[32]);
  statusTree->Branch(varnames[33].Data(),  &treevars[33]);
  statusTree->Branch(varnames[34].Data(),  &treevars[34]);
  statusTree->Branch(varnames[35].Data(),  &treevars[35]);
  statusTree->Branch(varnames[36].Data(),  &treevars[36]);
  statusTree->Branch(varnames[37].Data(),  &treevars[37]);
  statusTree->Branch(varnames[38].Data(),  &treevars[38]);
  statusTree->Branch(varnames[39].Data(),  &treevars[39]);
  statusTree->Branch(varnames[40].Data(),  &treevars[40]);
  statusTree->Branch(varnames[41].Data(),  &treevars[41]);
  statusTree->Branch(varnames[42].Data(),  &treevars[42]);
  statusTree->Branch(varnames[43].Data(),  &treevars[43]);
  statusTree->Branch(varnames[44].Data(),  &treevars[44]);
  statusTree->Branch(varnames[45].Data(),  &treevars[45]);
  statusTree->Branch(varnames[46].Data(),  &treevars[46]);
  statusTree->Branch(varnames[47].Data(),  &treevars[47]);
  statusTree->Branch(varnames[48].Data(),  &treevars[48]);
  statusTree->Branch(varnames[49].Data(),  &treevars[49]);
  
  // run loop
  Double_t graphX; // x-position of marker (0.5, 1.5, ...)
  Double_t graphY; // if >0 -> warning/outlier/physacc! if =-0.5 -> no warning/outlier/physacc
  TList* arrRuns = (TList*) ((TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0))->GetXaxis()->GetLabels();
  //'TAxis->GetLabels()' returns THashList of TObjString, but using THashList gives compilation error "... incomplete type 'struct THashList' "
  for (Int_t runi=0; runi<arrRuns->GetSize(); runi++) 
  {
    currentRun = atoi( arrRuns->At(runi)->GetName() );
    //Printf(" runi=%2i, name: %s \t run number: %i", runi, arrRuns->At(runi)->GetName(), currentRun);
    
    // status variable loop
    for (Int_t vari=0; vari<oaMultGr->GetEntriesFast(); vari++) 
    {
      TMultiGraph* multGr = (TMultiGraph*) oaMultGr->At(vari);
      
      // criteria loop
      // the order is given by TStatToolkit::MakeStatusMultGr().
      // criterion #1 is 'statisticOK' and mandatory, the rest is optional. (#0 is always True, thus skipped)
      for (Int_t criti=1; criti<multGr->GetListOfGraphs()->GetEntries(); criti++) 
      {
        TGraph* grCriterion = (TGraph*) multGr->GetListOfGraphs()->At(criti);
        graphX = -1, graphY = -1;
        grCriterion->GetPoint(runi, graphX, graphY);
        treevars[(vari)*ncritMax+(criti-1)] = (graphY>0)?1:0;
      }
    }
    statusTree->Fill();
  }
  
  if (needDeletion) delete oaMultGr;
  
  return statusTree;
}


void   TStatToolkit::MakeSummaryTree(TTree* treeIn, TTreeSRedirector *pcstream, TObjString & sumID, TCut &selection){
  //
  // Make a  summary tree for the input tree 
  // For the moment statistic works only for the primitive branches (Float/Double/Int)
  // Extension recursive version planned for graphs a and histograms
  //
  // Following statistics are exctracted:
  //   - Standard: mean, meadian, rms
  //   - LTM robust statistic: mean60, rms60, mean90, rms90
  // Parameters:
  //    treeIn    - input tree 
  //    pctream   - Output redirector
  //    sumID     - ID as will be used in output tree
  //    selection - selection criteria define the set of entries used to evaluat statistic 
  //
  TObjArray * brArray = treeIn->GetListOfBranches();
  Int_t tEntries= treeIn->GetEntries();
  Int_t nBranches=brArray->GetEntries();
  TString treeName = treeIn->GetName();
  treeName+="Summary";

  (*pcstream)<<treeName.Data()<<"entries="<<tEntries;
  (*pcstream)<<treeName.Data()<<"ID.="<<&sumID;
  
  TMatrixD valBranch(nBranches,7);
  for (Int_t iBr=0; iBr<nBranches; iBr++){    
    TString brName= brArray->At(iBr)->GetName();
    Int_t entries=treeIn->Draw(brArray->At(iBr)->GetName(),selection);
    if (entries==0) continue;
    Double_t median, mean, rms, mean60,rms60, mean90, rms90;
    mean  = TMath::Mean(entries,treeIn->GetV1());
    median= TMath::Median(entries,treeIn->GetV1());
    rms   = TMath::RMS(entries,treeIn->GetV1());
    TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean60,rms60,TMath::Min(TMath::Max(2., 0.60*entries),Double_t(entries)));
    TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean90,rms90,TMath::Min(TMath::Max(2., 0.90*entries),Double_t(entries)));
    valBranch(iBr,0)=mean; 
    valBranch(iBr,1)=median; 
    valBranch(iBr,2)=rms; 
    valBranch(iBr,3)=mean60; 
    valBranch(iBr,4)=rms60; 
    valBranch(iBr,5)=mean90; 
    valBranch(iBr,6)=rms90; 
    (*pcstream)<<treeName.Data()<<
      brName+"_Mean="<<valBranch(iBr,0)<<
      brName+"_Median="<<valBranch(iBr,1)<<
      brName+"_RMS="<<valBranch(iBr,2)<<
      brName+"_Mean60="<<valBranch(iBr,3)<<
      brName+"_RMS60="<<valBranch(iBr,4)<<
      brName+"_Mean90="<<valBranch(iBr,5)<<
      brName+"_RMS90="<<valBranch(iBr,6);  
  }
  (*pcstream)<<treeName.Data()<<"\n";
}



TMultiGraph*  TStatToolkit::MakeStatusLines(TTree * tree, const char * expr, const char * cut, const char * alias) 
{
  //
  // Create status lines for trending using MakeGraphSparse(), very similar to MakeStatusMultGr().
  // (by Patrick Reichelt)
  //
  // format of expr :  varname:xaxis (e.g. meanTPCncl:run, but 'varname' can be any string that you need for seach-and-replace)
  // format of cut  :  char like in TCut
  // format of alias:  varname_OutlierMin:varname_OutlierMax:varname_WarningMin:varname_WarningMax:varname_PhysAccMin:varname_PhysAccMax:varname_RobustMean
  //
  TObjArray* oaVar = TString(expr).Tokenize(":");
  if (oaVar->GetEntries()<2) {
    printf("Expression has to be of type 'varname:xaxis':\t%s\n", expr);
    return 0;
  }
  char varname[50];
  char var_x[50];
  snprintf(varname,50,"%s", oaVar->At(0)->GetName());
  snprintf(var_x  ,50,"%s", oaVar->At(1)->GetName());
  //
  TString sAlias(alias);
  if (sAlias.IsNull()) { // alias for default usage set here:
    sAlias = "varname_OutlierMin:varname_OutlierMax:varname_WarningMin:varname_WarningMax:varname_PhysAccMin:varname_PhysAccMax:varname_RobustMean";
  }
  sAlias.ReplaceAll("varname",varname);
  TObjArray* oaAlias = TString(sAlias.Data()).Tokenize(":");
  if (oaAlias->GetEntries()<2) {
    printf("Alias must have 2-7 arguments:\t%s\n", alias);
    return 0;
  }
  char query[200];
  TMultiGraph* multGr = new TMultiGraph();
  Int_t colArr[7] = {kRed, kRed, kOrange, kOrange, kGreen+1, kGreen+1, kGray+2};
  const Int_t ngr = oaAlias->GetEntriesFast();
  for (Int_t i=0; i<ngr; i++){
    snprintf(query,200, "%s:%s", oaAlias->At(i)->GetName(), var_x);
    multGr->Add( (TGraphErrors*) TStatToolkit::MakeGraphSparse(tree,query,cut,29,colArr[i],1.5) );
  }
  //
  multGr->SetName(varname);
  multGr->SetTitle(varname);
  delete oaVar;
  delete oaAlias;
  return multGr;
}


TH1* TStatToolkit::DrawHistogram(TTree * tree, const char* drawCommand, const char* cuts, const char* histoname, const char* histotitle, Int_t nsigma, Float_t fraction )
{
  //
  // Draw histogram from TTree with robust range
  // Only for 1D so far!
  // 
  // Parameters:
  // - histoname:  name of histogram
  // - histotitle: title of histgram
  // - fraction:   fraction of data to define the robust mean
  // - nsigma:     nsigma value for range
  //

   TString drawStr(drawCommand);
   TString cutStr(cuts);
   Int_t dim = 1;

   if(!tree) {
     cerr<<" Tree pointer is NULL!"<<endl;
     return 0;
   }

   // get entries
   Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff");
   if (entries == -1) {
     cerr<<"TTree draw returns -1"<<endl;
     return 0;
   }

   // get dimension
   if(tree->GetV1()) dim = 1;
   if(tree->GetV2()) dim = 2;
   if(tree->GetV3()) dim = 3;
   if(dim > 2){
     cerr<<"TTree has more than 2 dimensions (not yet supported)"<<endl;
     return 0;
   }

   // draw robust
   Double_t meanX, rmsX=0;
   Double_t meanY, rmsY=0;
   TStatToolkit::EvaluateUni(entries, tree->GetV1(),meanX,rmsX, fraction*entries);
   if(dim==2){
     TStatToolkit::EvaluateUni(entries, tree->GetV1(),meanY,rmsY, fraction*entries);
     TStatToolkit::EvaluateUni(entries, tree->GetV2(),meanX,rmsX, fraction*entries);
   }
   TH1* hOut=NULL;
   if(dim==1){
     hOut = new TH1F(histoname, histotitle, 200, meanX-nsigma*rmsX, meanX+nsigma*rmsX);
     for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV1()[i]);
     hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
     hOut->Draw();
   }
   else if(dim==2){
     hOut = new TH2F(histoname, histotitle, 200, meanX-nsigma*rmsX, meanX+nsigma*rmsX,200, meanY-nsigma*rmsY, meanY+nsigma*rmsY);
     for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV2()[i],tree->GetV1()[i]);
     hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
     hOut->GetYaxis()->SetTitle(tree->GetHistogram()->GetYaxis()->GetTitle());
     hOut->Draw("colz");
   }
   return hOut;
}

void TStatToolkit::CheckTreeAliases(TTree * tree, Int_t ncheck){
  //
  // Check consistency of tree aliases
  //
  Int_t nCheck=100;
  TList * aliases = (TList*)tree->GetListOfAliases();
  Int_t entries = aliases->GetEntries();
  for (Int_t i=0; i<entries; i++){
    TObject * object= aliases->At(i);
    if (!object) continue;
    Int_t ndraw=tree->Draw(aliases->At(i)->GetName(),"1","goff",nCheck);
    if (ndraw==0){
      ::Error("Alias:\tProblem",aliases->At(i)->GetName());
    }else{
      ::Info("Alias:\tOK",aliases->At(i)->GetName());
    }
  }
}
 TStatToolkit.cxx:1
 TStatToolkit.cxx:2
 TStatToolkit.cxx:3
 TStatToolkit.cxx:4
 TStatToolkit.cxx:5
 TStatToolkit.cxx:6
 TStatToolkit.cxx:7
 TStatToolkit.cxx:8
 TStatToolkit.cxx:9
 TStatToolkit.cxx:10
 TStatToolkit.cxx:11
 TStatToolkit.cxx:12
 TStatToolkit.cxx:13
 TStatToolkit.cxx:14
 TStatToolkit.cxx:15
 TStatToolkit.cxx:16
 TStatToolkit.cxx:17
 TStatToolkit.cxx:18
 TStatToolkit.cxx:19
 TStatToolkit.cxx:20
 TStatToolkit.cxx:21
 TStatToolkit.cxx:22
 TStatToolkit.cxx:23
 TStatToolkit.cxx:24
 TStatToolkit.cxx:25
 TStatToolkit.cxx:26
 TStatToolkit.cxx:27
 TStatToolkit.cxx:28
 TStatToolkit.cxx:29
 TStatToolkit.cxx:30
 TStatToolkit.cxx:31
 TStatToolkit.cxx:32
 TStatToolkit.cxx:33
 TStatToolkit.cxx:34
 TStatToolkit.cxx:35
 TStatToolkit.cxx:36
 TStatToolkit.cxx:37
 TStatToolkit.cxx:38
 TStatToolkit.cxx:39
 TStatToolkit.cxx:40
 TStatToolkit.cxx:41
 TStatToolkit.cxx:42
 TStatToolkit.cxx:43
 TStatToolkit.cxx:44
 TStatToolkit.cxx:45
 TStatToolkit.cxx:46
 TStatToolkit.cxx:47
 TStatToolkit.cxx:48
 TStatToolkit.cxx:49
 TStatToolkit.cxx:50
 TStatToolkit.cxx:51
 TStatToolkit.cxx:52
 TStatToolkit.cxx:53
 TStatToolkit.cxx:54
 TStatToolkit.cxx:55
 TStatToolkit.cxx:56
 TStatToolkit.cxx:57
 TStatToolkit.cxx:58
 TStatToolkit.cxx:59
 TStatToolkit.cxx:60
 TStatToolkit.cxx:61
 TStatToolkit.cxx:62
 TStatToolkit.cxx:63
 TStatToolkit.cxx:64
 TStatToolkit.cxx:65
 TStatToolkit.cxx:66
 TStatToolkit.cxx:67
 TStatToolkit.cxx:68
 TStatToolkit.cxx:69
 TStatToolkit.cxx:70
 TStatToolkit.cxx:71
 TStatToolkit.cxx:72
 TStatToolkit.cxx:73
 TStatToolkit.cxx:74
 TStatToolkit.cxx:75
 TStatToolkit.cxx:76
 TStatToolkit.cxx:77
 TStatToolkit.cxx:78
 TStatToolkit.cxx:79
 TStatToolkit.cxx:80
 TStatToolkit.cxx:81
 TStatToolkit.cxx:82
 TStatToolkit.cxx:83
 TStatToolkit.cxx:84
 TStatToolkit.cxx:85
 TStatToolkit.cxx:86
 TStatToolkit.cxx:87
 TStatToolkit.cxx:88
 TStatToolkit.cxx:89
 TStatToolkit.cxx:90
 TStatToolkit.cxx:91
 TStatToolkit.cxx:92
 TStatToolkit.cxx:93
 TStatToolkit.cxx:94
 TStatToolkit.cxx:95
 TStatToolkit.cxx:96
 TStatToolkit.cxx:97
 TStatToolkit.cxx:98
 TStatToolkit.cxx:99
 TStatToolkit.cxx:100
 TStatToolkit.cxx:101
 TStatToolkit.cxx:102
 TStatToolkit.cxx:103
 TStatToolkit.cxx:104
 TStatToolkit.cxx:105
 TStatToolkit.cxx:106
 TStatToolkit.cxx:107
 TStatToolkit.cxx:108
 TStatToolkit.cxx:109
 TStatToolkit.cxx:110
 TStatToolkit.cxx:111
 TStatToolkit.cxx:112
 TStatToolkit.cxx:113
 TStatToolkit.cxx:114
 TStatToolkit.cxx:115
 TStatToolkit.cxx:116
 TStatToolkit.cxx:117
 TStatToolkit.cxx:118
 TStatToolkit.cxx:119
 TStatToolkit.cxx:120
 TStatToolkit.cxx:121
 TStatToolkit.cxx:122
 TStatToolkit.cxx:123
 TStatToolkit.cxx:124
 TStatToolkit.cxx:125
 TStatToolkit.cxx:126
 TStatToolkit.cxx:127
 TStatToolkit.cxx:128
 TStatToolkit.cxx:129
 TStatToolkit.cxx:130
 TStatToolkit.cxx:131
 TStatToolkit.cxx:132
 TStatToolkit.cxx:133
 TStatToolkit.cxx:134
 TStatToolkit.cxx:135
 TStatToolkit.cxx:136
 TStatToolkit.cxx:137
 TStatToolkit.cxx:138
 TStatToolkit.cxx:139
 TStatToolkit.cxx:140
 TStatToolkit.cxx:141
 TStatToolkit.cxx:142
 TStatToolkit.cxx:143
 TStatToolkit.cxx:144
 TStatToolkit.cxx:145
 TStatToolkit.cxx:146
 TStatToolkit.cxx:147
 TStatToolkit.cxx:148
 TStatToolkit.cxx:149
 TStatToolkit.cxx:150
 TStatToolkit.cxx:151
 TStatToolkit.cxx:152
 TStatToolkit.cxx:153
 TStatToolkit.cxx:154
 TStatToolkit.cxx:155
 TStatToolkit.cxx:156
 TStatToolkit.cxx:157
 TStatToolkit.cxx:158
 TStatToolkit.cxx:159
 TStatToolkit.cxx:160
 TStatToolkit.cxx:161
 TStatToolkit.cxx:162
 TStatToolkit.cxx:163
 TStatToolkit.cxx:164
 TStatToolkit.cxx:165
 TStatToolkit.cxx:166
 TStatToolkit.cxx:167
 TStatToolkit.cxx:168
 TStatToolkit.cxx:169
 TStatToolkit.cxx:170
 TStatToolkit.cxx:171
 TStatToolkit.cxx:172
 TStatToolkit.cxx:173
 TStatToolkit.cxx:174
 TStatToolkit.cxx:175
 TStatToolkit.cxx:176
 TStatToolkit.cxx:177
 TStatToolkit.cxx:178
 TStatToolkit.cxx:179
 TStatToolkit.cxx:180
 TStatToolkit.cxx:181
 TStatToolkit.cxx:182
 TStatToolkit.cxx:183
 TStatToolkit.cxx:184
 TStatToolkit.cxx:185
 TStatToolkit.cxx:186
 TStatToolkit.cxx:187
 TStatToolkit.cxx:188
 TStatToolkit.cxx:189
 TStatToolkit.cxx:190
 TStatToolkit.cxx:191
 TStatToolkit.cxx:192
 TStatToolkit.cxx:193
 TStatToolkit.cxx:194
 TStatToolkit.cxx:195
 TStatToolkit.cxx:196
 TStatToolkit.cxx:197
 TStatToolkit.cxx:198
 TStatToolkit.cxx:199
 TStatToolkit.cxx:200
 TStatToolkit.cxx:201
 TStatToolkit.cxx:202
 TStatToolkit.cxx:203
 TStatToolkit.cxx:204
 TStatToolkit.cxx:205
 TStatToolkit.cxx:206
 TStatToolkit.cxx:207
 TStatToolkit.cxx:208
 TStatToolkit.cxx:209
 TStatToolkit.cxx:210
 TStatToolkit.cxx:211
 TStatToolkit.cxx:212
 TStatToolkit.cxx:213
 TStatToolkit.cxx:214
 TStatToolkit.cxx:215
 TStatToolkit.cxx:216
 TStatToolkit.cxx:217
 TStatToolkit.cxx:218
 TStatToolkit.cxx:219
 TStatToolkit.cxx:220
 TStatToolkit.cxx:221
 TStatToolkit.cxx:222
 TStatToolkit.cxx:223
 TStatToolkit.cxx:224
 TStatToolkit.cxx:225
 TStatToolkit.cxx:226
 TStatToolkit.cxx:227
 TStatToolkit.cxx:228
 TStatToolkit.cxx:229
 TStatToolkit.cxx:230
 TStatToolkit.cxx:231
 TStatToolkit.cxx:232
 TStatToolkit.cxx:233
 TStatToolkit.cxx:234
 TStatToolkit.cxx:235
 TStatToolkit.cxx:236
 TStatToolkit.cxx:237
 TStatToolkit.cxx:238
 TStatToolkit.cxx:239
 TStatToolkit.cxx:240
 TStatToolkit.cxx:241
 TStatToolkit.cxx:242
 TStatToolkit.cxx:243
 TStatToolkit.cxx:244
 TStatToolkit.cxx:245
 TStatToolkit.cxx:246
 TStatToolkit.cxx:247
 TStatToolkit.cxx:248
 TStatToolkit.cxx:249
 TStatToolkit.cxx:250
 TStatToolkit.cxx:251
 TStatToolkit.cxx:252
 TStatToolkit.cxx:253
 TStatToolkit.cxx:254
 TStatToolkit.cxx:255
 TStatToolkit.cxx:256
 TStatToolkit.cxx:257
 TStatToolkit.cxx:258
 TStatToolkit.cxx:259
 TStatToolkit.cxx:260
 TStatToolkit.cxx:261
 TStatToolkit.cxx:262
 TStatToolkit.cxx:263
 TStatToolkit.cxx:264
 TStatToolkit.cxx:265
 TStatToolkit.cxx:266
 TStatToolkit.cxx:267
 TStatToolkit.cxx:268
 TStatToolkit.cxx:269
 TStatToolkit.cxx:270
 TStatToolkit.cxx:271
 TStatToolkit.cxx:272
 TStatToolkit.cxx:273
 TStatToolkit.cxx:274
 TStatToolkit.cxx:275
 TStatToolkit.cxx:276
 TStatToolkit.cxx:277
 TStatToolkit.cxx:278
 TStatToolkit.cxx:279
 TStatToolkit.cxx:280
 TStatToolkit.cxx:281
 TStatToolkit.cxx:282
 TStatToolkit.cxx:283
 TStatToolkit.cxx:284
 TStatToolkit.cxx:285
 TStatToolkit.cxx:286
 TStatToolkit.cxx:287
 TStatToolkit.cxx:288
 TStatToolkit.cxx:289
 TStatToolkit.cxx:290
 TStatToolkit.cxx:291
 TStatToolkit.cxx:292
 TStatToolkit.cxx:293
 TStatToolkit.cxx:294
 TStatToolkit.cxx:295
 TStatToolkit.cxx:296
 TStatToolkit.cxx:297
 TStatToolkit.cxx:298
 TStatToolkit.cxx:299
 TStatToolkit.cxx:300
 TStatToolkit.cxx:301
 TStatToolkit.cxx:302
 TStatToolkit.cxx:303
 TStatToolkit.cxx:304
 TStatToolkit.cxx:305
 TStatToolkit.cxx:306
 TStatToolkit.cxx:307
 TStatToolkit.cxx:308
 TStatToolkit.cxx:309
 TStatToolkit.cxx:310
 TStatToolkit.cxx:311
 TStatToolkit.cxx:312
 TStatToolkit.cxx:313
 TStatToolkit.cxx:314
 TStatToolkit.cxx:315
 TStatToolkit.cxx:316
 TStatToolkit.cxx:317
 TStatToolkit.cxx:318
 TStatToolkit.cxx:319
 TStatToolkit.cxx:320
 TStatToolkit.cxx:321
 TStatToolkit.cxx:322
 TStatToolkit.cxx:323
 TStatToolkit.cxx:324
 TStatToolkit.cxx:325
 TStatToolkit.cxx:326
 TStatToolkit.cxx:327
 TStatToolkit.cxx:328
 TStatToolkit.cxx:329
 TStatToolkit.cxx:330
 TStatToolkit.cxx:331
 TStatToolkit.cxx:332
 TStatToolkit.cxx:333
 TStatToolkit.cxx:334
 TStatToolkit.cxx:335
 TStatToolkit.cxx:336
 TStatToolkit.cxx:337
 TStatToolkit.cxx:338
 TStatToolkit.cxx:339
 TStatToolkit.cxx:340
 TStatToolkit.cxx:341
 TStatToolkit.cxx:342
 TStatToolkit.cxx:343
 TStatToolkit.cxx:344
 TStatToolkit.cxx:345
 TStatToolkit.cxx:346
 TStatToolkit.cxx:347
 TStatToolkit.cxx:348
 TStatToolkit.cxx:349
 TStatToolkit.cxx:350
 TStatToolkit.cxx:351
 TStatToolkit.cxx:352
 TStatToolkit.cxx:353
 TStatToolkit.cxx:354
 TStatToolkit.cxx:355
 TStatToolkit.cxx:356
 TStatToolkit.cxx:357
 TStatToolkit.cxx:358
 TStatToolkit.cxx:359
 TStatToolkit.cxx:360
 TStatToolkit.cxx:361
 TStatToolkit.cxx:362
 TStatToolkit.cxx:363
 TStatToolkit.cxx:364
 TStatToolkit.cxx:365
 TStatToolkit.cxx:366
 TStatToolkit.cxx:367
 TStatToolkit.cxx:368
 TStatToolkit.cxx:369
 TStatToolkit.cxx:370
 TStatToolkit.cxx:371
 TStatToolkit.cxx:372
 TStatToolkit.cxx:373
 TStatToolkit.cxx:374
 TStatToolkit.cxx:375
 TStatToolkit.cxx:376
 TStatToolkit.cxx:377
 TStatToolkit.cxx:378
 TStatToolkit.cxx:379
 TStatToolkit.cxx:380
 TStatToolkit.cxx:381
 TStatToolkit.cxx:382
 TStatToolkit.cxx:383
 TStatToolkit.cxx:384
 TStatToolkit.cxx:385
 TStatToolkit.cxx:386
 TStatToolkit.cxx:387
 TStatToolkit.cxx:388
 TStatToolkit.cxx:389
 TStatToolkit.cxx:390
 TStatToolkit.cxx:391
 TStatToolkit.cxx:392
 TStatToolkit.cxx:393
 TStatToolkit.cxx:394
 TStatToolkit.cxx:395
 TStatToolkit.cxx:396
 TStatToolkit.cxx:397
 TStatToolkit.cxx:398
 TStatToolkit.cxx:399
 TStatToolkit.cxx:400
 TStatToolkit.cxx:401
 TStatToolkit.cxx:402
 TStatToolkit.cxx:403
 TStatToolkit.cxx:404
 TStatToolkit.cxx:405
 TStatToolkit.cxx:406
 TStatToolkit.cxx:407
 TStatToolkit.cxx:408
 TStatToolkit.cxx:409
 TStatToolkit.cxx:410
 TStatToolkit.cxx:411
 TStatToolkit.cxx:412
 TStatToolkit.cxx:413
 TStatToolkit.cxx:414
 TStatToolkit.cxx:415
 TStatToolkit.cxx:416
 TStatToolkit.cxx:417
 TStatToolkit.cxx:418
 TStatToolkit.cxx:419
 TStatToolkit.cxx:420
 TStatToolkit.cxx:421
 TStatToolkit.cxx:422
 TStatToolkit.cxx:423
 TStatToolkit.cxx:424
 TStatToolkit.cxx:425
 TStatToolkit.cxx:426
 TStatToolkit.cxx:427
 TStatToolkit.cxx:428
 TStatToolkit.cxx:429
 TStatToolkit.cxx:430
 TStatToolkit.cxx:431
 TStatToolkit.cxx:432
 TStatToolkit.cxx:433
 TStatToolkit.cxx:434
 TStatToolkit.cxx:435
 TStatToolkit.cxx:436
 TStatToolkit.cxx:437
 TStatToolkit.cxx:438
 TStatToolkit.cxx:439
 TStatToolkit.cxx:440
 TStatToolkit.cxx:441
 TStatToolkit.cxx:442
 TStatToolkit.cxx:443
 TStatToolkit.cxx:444
 TStatToolkit.cxx:445
 TStatToolkit.cxx:446
 TStatToolkit.cxx:447
 TStatToolkit.cxx:448
 TStatToolkit.cxx:449
 TStatToolkit.cxx:450
 TStatToolkit.cxx:451
 TStatToolkit.cxx:452
 TStatToolkit.cxx:453
 TStatToolkit.cxx:454
 TStatToolkit.cxx:455
 TStatToolkit.cxx:456
 TStatToolkit.cxx:457
 TStatToolkit.cxx:458
 TStatToolkit.cxx:459
 TStatToolkit.cxx:460
 TStatToolkit.cxx:461
 TStatToolkit.cxx:462
 TStatToolkit.cxx:463
 TStatToolkit.cxx:464
 TStatToolkit.cxx:465
 TStatToolkit.cxx:466
 TStatToolkit.cxx:467
 TStatToolkit.cxx:468
 TStatToolkit.cxx:469
 TStatToolkit.cxx:470
 TStatToolkit.cxx:471
 TStatToolkit.cxx:472
 TStatToolkit.cxx:473
 TStatToolkit.cxx:474
 TStatToolkit.cxx:475
 TStatToolkit.cxx:476
 TStatToolkit.cxx:477
 TStatToolkit.cxx:478
 TStatToolkit.cxx:479
 TStatToolkit.cxx:480
 TStatToolkit.cxx:481
 TStatToolkit.cxx:482
 TStatToolkit.cxx:483
 TStatToolkit.cxx:484
 TStatToolkit.cxx:485
 TStatToolkit.cxx:486
 TStatToolkit.cxx:487
 TStatToolkit.cxx:488
 TStatToolkit.cxx:489
 TStatToolkit.cxx:490
 TStatToolkit.cxx:491
 TStatToolkit.cxx:492
 TStatToolkit.cxx:493
 TStatToolkit.cxx:494
 TStatToolkit.cxx:495
 TStatToolkit.cxx:496
 TStatToolkit.cxx:497
 TStatToolkit.cxx:498
 TStatToolkit.cxx:499
 TStatToolkit.cxx:500
 TStatToolkit.cxx:501
 TStatToolkit.cxx:502
 TStatToolkit.cxx:503
 TStatToolkit.cxx:504
 TStatToolkit.cxx:505
 TStatToolkit.cxx:506
 TStatToolkit.cxx:507
 TStatToolkit.cxx:508
 TStatToolkit.cxx:509
 TStatToolkit.cxx:510
 TStatToolkit.cxx:511
 TStatToolkit.cxx:512
 TStatToolkit.cxx:513
 TStatToolkit.cxx:514
 TStatToolkit.cxx:515
 TStatToolkit.cxx:516
 TStatToolkit.cxx:517
 TStatToolkit.cxx:518
 TStatToolkit.cxx:519
 TStatToolkit.cxx:520
 TStatToolkit.cxx:521
 TStatToolkit.cxx:522
 TStatToolkit.cxx:523
 TStatToolkit.cxx:524
 TStatToolkit.cxx:525
 TStatToolkit.cxx:526
 TStatToolkit.cxx:527
 TStatToolkit.cxx:528
 TStatToolkit.cxx:529
 TStatToolkit.cxx:530
 TStatToolkit.cxx:531
 TStatToolkit.cxx:532
 TStatToolkit.cxx:533
 TStatToolkit.cxx:534
 TStatToolkit.cxx:535
 TStatToolkit.cxx:536
 TStatToolkit.cxx:537
 TStatToolkit.cxx:538
 TStatToolkit.cxx:539
 TStatToolkit.cxx:540
 TStatToolkit.cxx:541
 TStatToolkit.cxx:542
 TStatToolkit.cxx:543
 TStatToolkit.cxx:544
 TStatToolkit.cxx:545
 TStatToolkit.cxx:546
 TStatToolkit.cxx:547
 TStatToolkit.cxx:548
 TStatToolkit.cxx:549
 TStatToolkit.cxx:550
 TStatToolkit.cxx:551
 TStatToolkit.cxx:552
 TStatToolkit.cxx:553
 TStatToolkit.cxx:554
 TStatToolkit.cxx:555
 TStatToolkit.cxx:556
 TStatToolkit.cxx:557
 TStatToolkit.cxx:558
 TStatToolkit.cxx:559
 TStatToolkit.cxx:560
 TStatToolkit.cxx:561
 TStatToolkit.cxx:562
 TStatToolkit.cxx:563
 TStatToolkit.cxx:564
 TStatToolkit.cxx:565
 TStatToolkit.cxx:566
 TStatToolkit.cxx:567
 TStatToolkit.cxx:568
 TStatToolkit.cxx:569
 TStatToolkit.cxx:570
 TStatToolkit.cxx:571
 TStatToolkit.cxx:572
 TStatToolkit.cxx:573
 TStatToolkit.cxx:574
 TStatToolkit.cxx:575
 TStatToolkit.cxx:576
 TStatToolkit.cxx:577
 TStatToolkit.cxx:578
 TStatToolkit.cxx:579
 TStatToolkit.cxx:580
 TStatToolkit.cxx:581
 TStatToolkit.cxx:582
 TStatToolkit.cxx:583
 TStatToolkit.cxx:584
 TStatToolkit.cxx:585
 TStatToolkit.cxx:586
 TStatToolkit.cxx:587
 TStatToolkit.cxx:588
 TStatToolkit.cxx:589
 TStatToolkit.cxx:590
 TStatToolkit.cxx:591
 TStatToolkit.cxx:592
 TStatToolkit.cxx:593
 TStatToolkit.cxx:594
 TStatToolkit.cxx:595
 TStatToolkit.cxx:596
 TStatToolkit.cxx:597
 TStatToolkit.cxx:598
 TStatToolkit.cxx:599
 TStatToolkit.cxx:600
 TStatToolkit.cxx:601
 TStatToolkit.cxx:602
 TStatToolkit.cxx:603
 TStatToolkit.cxx:604
 TStatToolkit.cxx:605
 TStatToolkit.cxx:606
 TStatToolkit.cxx:607
 TStatToolkit.cxx:608
 TStatToolkit.cxx:609
 TStatToolkit.cxx:610
 TStatToolkit.cxx:611
 TStatToolkit.cxx:612
 TStatToolkit.cxx:613
 TStatToolkit.cxx:614
 TStatToolkit.cxx:615
 TStatToolkit.cxx:616
 TStatToolkit.cxx:617
 TStatToolkit.cxx:618
 TStatToolkit.cxx:619
 TStatToolkit.cxx:620
 TStatToolkit.cxx:621
 TStatToolkit.cxx:622
 TStatToolkit.cxx:623
 TStatToolkit.cxx:624
 TStatToolkit.cxx:625
 TStatToolkit.cxx:626
 TStatToolkit.cxx:627
 TStatToolkit.cxx:628
 TStatToolkit.cxx:629
 TStatToolkit.cxx:630
 TStatToolkit.cxx:631
 TStatToolkit.cxx:632
 TStatToolkit.cxx:633
 TStatToolkit.cxx:634
 TStatToolkit.cxx:635
 TStatToolkit.cxx:636
 TStatToolkit.cxx:637
 TStatToolkit.cxx:638
 TStatToolkit.cxx:639
 TStatToolkit.cxx:640
 TStatToolkit.cxx:641
 TStatToolkit.cxx:642
 TStatToolkit.cxx:643
 TStatToolkit.cxx:644
 TStatToolkit.cxx:645
 TStatToolkit.cxx:646
 TStatToolkit.cxx:647
 TStatToolkit.cxx:648
 TStatToolkit.cxx:649
 TStatToolkit.cxx:650
 TStatToolkit.cxx:651
 TStatToolkit.cxx:652
 TStatToolkit.cxx:653
 TStatToolkit.cxx:654
 TStatToolkit.cxx:655
 TStatToolkit.cxx:656
 TStatToolkit.cxx:657
 TStatToolkit.cxx:658
 TStatToolkit.cxx:659
 TStatToolkit.cxx:660
 TStatToolkit.cxx:661
 TStatToolkit.cxx:662
 TStatToolkit.cxx:663
 TStatToolkit.cxx:664
 TStatToolkit.cxx:665
 TStatToolkit.cxx:666
 TStatToolkit.cxx:667
 TStatToolkit.cxx:668
 TStatToolkit.cxx:669
 TStatToolkit.cxx:670
 TStatToolkit.cxx:671
 TStatToolkit.cxx:672
 TStatToolkit.cxx:673
 TStatToolkit.cxx:674
 TStatToolkit.cxx:675
 TStatToolkit.cxx:676
 TStatToolkit.cxx:677
 TStatToolkit.cxx:678
 TStatToolkit.cxx:679
 TStatToolkit.cxx:680
 TStatToolkit.cxx:681
 TStatToolkit.cxx:682
 TStatToolkit.cxx:683
 TStatToolkit.cxx:684
 TStatToolkit.cxx:685
 TStatToolkit.cxx:686
 TStatToolkit.cxx:687
 TStatToolkit.cxx:688
 TStatToolkit.cxx:689
 TStatToolkit.cxx:690
 TStatToolkit.cxx:691
 TStatToolkit.cxx:692
 TStatToolkit.cxx:693
 TStatToolkit.cxx:694
 TStatToolkit.cxx:695
 TStatToolkit.cxx:696
 TStatToolkit.cxx:697
 TStatToolkit.cxx:698
 TStatToolkit.cxx:699
 TStatToolkit.cxx:700
 TStatToolkit.cxx:701
 TStatToolkit.cxx:702
 TStatToolkit.cxx:703
 TStatToolkit.cxx:704
 TStatToolkit.cxx:705
 TStatToolkit.cxx:706
 TStatToolkit.cxx:707
 TStatToolkit.cxx:708
 TStatToolkit.cxx:709
 TStatToolkit.cxx:710
 TStatToolkit.cxx:711
 TStatToolkit.cxx:712
 TStatToolkit.cxx:713
 TStatToolkit.cxx:714
 TStatToolkit.cxx:715
 TStatToolkit.cxx:716
 TStatToolkit.cxx:717
 TStatToolkit.cxx:718
 TStatToolkit.cxx:719
 TStatToolkit.cxx:720
 TStatToolkit.cxx:721
 TStatToolkit.cxx:722
 TStatToolkit.cxx:723
 TStatToolkit.cxx:724
 TStatToolkit.cxx:725
 TStatToolkit.cxx:726
 TStatToolkit.cxx:727
 TStatToolkit.cxx:728
 TStatToolkit.cxx:729
 TStatToolkit.cxx:730
 TStatToolkit.cxx:731
 TStatToolkit.cxx:732
 TStatToolkit.cxx:733
 TStatToolkit.cxx:734
 TStatToolkit.cxx:735
 TStatToolkit.cxx:736
 TStatToolkit.cxx:737
 TStatToolkit.cxx:738
 TStatToolkit.cxx:739
 TStatToolkit.cxx:740
 TStatToolkit.cxx:741
 TStatToolkit.cxx:742
 TStatToolkit.cxx:743
 TStatToolkit.cxx:744
 TStatToolkit.cxx:745
 TStatToolkit.cxx:746
 TStatToolkit.cxx:747
 TStatToolkit.cxx:748
 TStatToolkit.cxx:749
 TStatToolkit.cxx:750
 TStatToolkit.cxx:751
 TStatToolkit.cxx:752
 TStatToolkit.cxx:753
 TStatToolkit.cxx:754
 TStatToolkit.cxx:755
 TStatToolkit.cxx:756
 TStatToolkit.cxx:757
 TStatToolkit.cxx:758
 TStatToolkit.cxx:759
 TStatToolkit.cxx:760
 TStatToolkit.cxx:761
 TStatToolkit.cxx:762
 TStatToolkit.cxx:763
 TStatToolkit.cxx:764
 TStatToolkit.cxx:765
 TStatToolkit.cxx:766
 TStatToolkit.cxx:767
 TStatToolkit.cxx:768
 TStatToolkit.cxx:769
 TStatToolkit.cxx:770
 TStatToolkit.cxx:771
 TStatToolkit.cxx:772
 TStatToolkit.cxx:773
 TStatToolkit.cxx:774
 TStatToolkit.cxx:775
 TStatToolkit.cxx:776
 TStatToolkit.cxx:777
 TStatToolkit.cxx:778
 TStatToolkit.cxx:779
 TStatToolkit.cxx:780
 TStatToolkit.cxx:781
 TStatToolkit.cxx:782
 TStatToolkit.cxx:783
 TStatToolkit.cxx:784
 TStatToolkit.cxx:785
 TStatToolkit.cxx:786
 TStatToolkit.cxx:787
 TStatToolkit.cxx:788
 TStatToolkit.cxx:789
 TStatToolkit.cxx:790
 TStatToolkit.cxx:791
 TStatToolkit.cxx:792
 TStatToolkit.cxx:793
 TStatToolkit.cxx:794
 TStatToolkit.cxx:795
 TStatToolkit.cxx:796
 TStatToolkit.cxx:797
 TStatToolkit.cxx:798
 TStatToolkit.cxx:799
 TStatToolkit.cxx:800
 TStatToolkit.cxx:801
 TStatToolkit.cxx:802
 TStatToolkit.cxx:803
 TStatToolkit.cxx:804
 TStatToolkit.cxx:805
 TStatToolkit.cxx:806
 TStatToolkit.cxx:807
 TStatToolkit.cxx:808
 TStatToolkit.cxx:809
 TStatToolkit.cxx:810
 TStatToolkit.cxx:811
 TStatToolkit.cxx:812
 TStatToolkit.cxx:813
 TStatToolkit.cxx:814
 TStatToolkit.cxx:815
 TStatToolkit.cxx:816
 TStatToolkit.cxx:817
 TStatToolkit.cxx:818
 TStatToolkit.cxx:819
 TStatToolkit.cxx:820
 TStatToolkit.cxx:821
 TStatToolkit.cxx:822
 TStatToolkit.cxx:823
 TStatToolkit.cxx:824
 TStatToolkit.cxx:825
 TStatToolkit.cxx:826
 TStatToolkit.cxx:827
 TStatToolkit.cxx:828
 TStatToolkit.cxx:829
 TStatToolkit.cxx:830
 TStatToolkit.cxx:831
 TStatToolkit.cxx:832
 TStatToolkit.cxx:833
 TStatToolkit.cxx:834
 TStatToolkit.cxx:835
 TStatToolkit.cxx:836
 TStatToolkit.cxx:837
 TStatToolkit.cxx:838
 TStatToolkit.cxx:839
 TStatToolkit.cxx:840
 TStatToolkit.cxx:841
 TStatToolkit.cxx:842
 TStatToolkit.cxx:843
 TStatToolkit.cxx:844
 TStatToolkit.cxx:845
 TStatToolkit.cxx:846
 TStatToolkit.cxx:847
 TStatToolkit.cxx:848
 TStatToolkit.cxx:849
 TStatToolkit.cxx:850
 TStatToolkit.cxx:851
 TStatToolkit.cxx:852
 TStatToolkit.cxx:853
 TStatToolkit.cxx:854
 TStatToolkit.cxx:855
 TStatToolkit.cxx:856
 TStatToolkit.cxx:857
 TStatToolkit.cxx:858
 TStatToolkit.cxx:859
 TStatToolkit.cxx:860
 TStatToolkit.cxx:861
 TStatToolkit.cxx:862
 TStatToolkit.cxx:863
 TStatToolkit.cxx:864
 TStatToolkit.cxx:865
 TStatToolkit.cxx:866
 TStatToolkit.cxx:867
 TStatToolkit.cxx:868
 TStatToolkit.cxx:869
 TStatToolkit.cxx:870
 TStatToolkit.cxx:871
 TStatToolkit.cxx:872
 TStatToolkit.cxx:873
 TStatToolkit.cxx:874
 TStatToolkit.cxx:875
 TStatToolkit.cxx:876
 TStatToolkit.cxx:877
 TStatToolkit.cxx:878
 TStatToolkit.cxx:879
 TStatToolkit.cxx:880
 TStatToolkit.cxx:881
 TStatToolkit.cxx:882
 TStatToolkit.cxx:883
 TStatToolkit.cxx:884
 TStatToolkit.cxx:885
 TStatToolkit.cxx:886
 TStatToolkit.cxx:887
 TStatToolkit.cxx:888
 TStatToolkit.cxx:889
 TStatToolkit.cxx:890
 TStatToolkit.cxx:891
 TStatToolkit.cxx:892
 TStatToolkit.cxx:893
 TStatToolkit.cxx:894
 TStatToolkit.cxx:895
 TStatToolkit.cxx:896
 TStatToolkit.cxx:897
 TStatToolkit.cxx:898
 TStatToolkit.cxx:899
 TStatToolkit.cxx:900
 TStatToolkit.cxx:901
 TStatToolkit.cxx:902
 TStatToolkit.cxx:903
 TStatToolkit.cxx:904
 TStatToolkit.cxx:905
 TStatToolkit.cxx:906
 TStatToolkit.cxx:907
 TStatToolkit.cxx:908
 TStatToolkit.cxx:909
 TStatToolkit.cxx:910
 TStatToolkit.cxx:911
 TStatToolkit.cxx:912
 TStatToolkit.cxx:913
 TStatToolkit.cxx:914
 TStatToolkit.cxx:915
 TStatToolkit.cxx:916
 TStatToolkit.cxx:917
 TStatToolkit.cxx:918
 TStatToolkit.cxx:919
 TStatToolkit.cxx:920
 TStatToolkit.cxx:921
 TStatToolkit.cxx:922
 TStatToolkit.cxx:923
 TStatToolkit.cxx:924
 TStatToolkit.cxx:925
 TStatToolkit.cxx:926
 TStatToolkit.cxx:927
 TStatToolkit.cxx:928
 TStatToolkit.cxx:929
 TStatToolkit.cxx:930
 TStatToolkit.cxx:931
 TStatToolkit.cxx:932
 TStatToolkit.cxx:933
 TStatToolkit.cxx:934
 TStatToolkit.cxx:935
 TStatToolkit.cxx:936
 TStatToolkit.cxx:937
 TStatToolkit.cxx:938
 TStatToolkit.cxx:939
 TStatToolkit.cxx:940
 TStatToolkit.cxx:941
 TStatToolkit.cxx:942
 TStatToolkit.cxx:943
 TStatToolkit.cxx:944
 TStatToolkit.cxx:945
 TStatToolkit.cxx:946
 TStatToolkit.cxx:947
 TStatToolkit.cxx:948
 TStatToolkit.cxx:949
 TStatToolkit.cxx:950
 TStatToolkit.cxx:951
 TStatToolkit.cxx:952
 TStatToolkit.cxx:953
 TStatToolkit.cxx:954
 TStatToolkit.cxx:955
 TStatToolkit.cxx:956
 TStatToolkit.cxx:957
 TStatToolkit.cxx:958
 TStatToolkit.cxx:959
 TStatToolkit.cxx:960
 TStatToolkit.cxx:961
 TStatToolkit.cxx:962
 TStatToolkit.cxx:963
 TStatToolkit.cxx:964
 TStatToolkit.cxx:965
 TStatToolkit.cxx:966
 TStatToolkit.cxx:967
 TStatToolkit.cxx:968
 TStatToolkit.cxx:969
 TStatToolkit.cxx:970
 TStatToolkit.cxx:971
 TStatToolkit.cxx:972
 TStatToolkit.cxx:973
 TStatToolkit.cxx:974
 TStatToolkit.cxx:975
 TStatToolkit.cxx:976
 TStatToolkit.cxx:977
 TStatToolkit.cxx:978
 TStatToolkit.cxx:979
 TStatToolkit.cxx:980
 TStatToolkit.cxx:981
 TStatToolkit.cxx:982
 TStatToolkit.cxx:983
 TStatToolkit.cxx:984
 TStatToolkit.cxx:985
 TStatToolkit.cxx:986
 TStatToolkit.cxx:987
 TStatToolkit.cxx:988
 TStatToolkit.cxx:989
 TStatToolkit.cxx:990
 TStatToolkit.cxx:991
 TStatToolkit.cxx:992
 TStatToolkit.cxx:993
 TStatToolkit.cxx:994
 TStatToolkit.cxx:995
 TStatToolkit.cxx:996
 TStatToolkit.cxx:997
 TStatToolkit.cxx:998
 TStatToolkit.cxx:999
 TStatToolkit.cxx:1000
 TStatToolkit.cxx:1001
 TStatToolkit.cxx:1002
 TStatToolkit.cxx:1003
 TStatToolkit.cxx:1004
 TStatToolkit.cxx:1005
 TStatToolkit.cxx:1006
 TStatToolkit.cxx:1007
 TStatToolkit.cxx:1008
 TStatToolkit.cxx:1009
 TStatToolkit.cxx:1010
 TStatToolkit.cxx:1011
 TStatToolkit.cxx:1012
 TStatToolkit.cxx:1013
 TStatToolkit.cxx:1014
 TStatToolkit.cxx:1015
 TStatToolkit.cxx:1016
 TStatToolkit.cxx:1017
 TStatToolkit.cxx:1018
 TStatToolkit.cxx:1019
 TStatToolkit.cxx:1020
 TStatToolkit.cxx:1021
 TStatToolkit.cxx:1022
 TStatToolkit.cxx:1023
 TStatToolkit.cxx:1024
 TStatToolkit.cxx:1025
 TStatToolkit.cxx:1026
 TStatToolkit.cxx:1027
 TStatToolkit.cxx:1028
 TStatToolkit.cxx:1029
 TStatToolkit.cxx:1030
 TStatToolkit.cxx:1031
 TStatToolkit.cxx:1032
 TStatToolkit.cxx:1033
 TStatToolkit.cxx:1034
 TStatToolkit.cxx:1035
 TStatToolkit.cxx:1036
 TStatToolkit.cxx:1037
 TStatToolkit.cxx:1038
 TStatToolkit.cxx:1039
 TStatToolkit.cxx:1040
 TStatToolkit.cxx:1041
 TStatToolkit.cxx:1042
 TStatToolkit.cxx:1043
 TStatToolkit.cxx:1044
 TStatToolkit.cxx:1045
 TStatToolkit.cxx:1046
 TStatToolkit.cxx:1047
 TStatToolkit.cxx:1048
 TStatToolkit.cxx:1049
 TStatToolkit.cxx:1050
 TStatToolkit.cxx:1051
 TStatToolkit.cxx:1052
 TStatToolkit.cxx:1053
 TStatToolkit.cxx:1054
 TStatToolkit.cxx:1055
 TStatToolkit.cxx:1056
 TStatToolkit.cxx:1057
 TStatToolkit.cxx:1058
 TStatToolkit.cxx:1059
 TStatToolkit.cxx:1060
 TStatToolkit.cxx:1061
 TStatToolkit.cxx:1062
 TStatToolkit.cxx:1063
 TStatToolkit.cxx:1064
 TStatToolkit.cxx:1065
 TStatToolkit.cxx:1066
 TStatToolkit.cxx:1067
 TStatToolkit.cxx:1068
 TStatToolkit.cxx:1069
 TStatToolkit.cxx:1070
 TStatToolkit.cxx:1071
 TStatToolkit.cxx:1072
 TStatToolkit.cxx:1073
 TStatToolkit.cxx:1074
 TStatToolkit.cxx:1075
 TStatToolkit.cxx:1076
 TStatToolkit.cxx:1077
 TStatToolkit.cxx:1078
 TStatToolkit.cxx:1079
 TStatToolkit.cxx:1080
 TStatToolkit.cxx:1081
 TStatToolkit.cxx:1082
 TStatToolkit.cxx:1083
 TStatToolkit.cxx:1084
 TStatToolkit.cxx:1085
 TStatToolkit.cxx:1086
 TStatToolkit.cxx:1087
 TStatToolkit.cxx:1088
 TStatToolkit.cxx:1089
 TStatToolkit.cxx:1090
 TStatToolkit.cxx:1091
 TStatToolkit.cxx:1092
 TStatToolkit.cxx:1093
 TStatToolkit.cxx:1094
 TStatToolkit.cxx:1095
 TStatToolkit.cxx:1096
 TStatToolkit.cxx:1097
 TStatToolkit.cxx:1098
 TStatToolkit.cxx:1099
 TStatToolkit.cxx:1100
 TStatToolkit.cxx:1101
 TStatToolkit.cxx:1102
 TStatToolkit.cxx:1103
 TStatToolkit.cxx:1104
 TStatToolkit.cxx:1105
 TStatToolkit.cxx:1106
 TStatToolkit.cxx:1107
 TStatToolkit.cxx:1108
 TStatToolkit.cxx:1109
 TStatToolkit.cxx:1110
 TStatToolkit.cxx:1111
 TStatToolkit.cxx:1112
 TStatToolkit.cxx:1113
 TStatToolkit.cxx:1114
 TStatToolkit.cxx:1115
 TStatToolkit.cxx:1116
 TStatToolkit.cxx:1117
 TStatToolkit.cxx:1118
 TStatToolkit.cxx:1119
 TStatToolkit.cxx:1120
 TStatToolkit.cxx:1121
 TStatToolkit.cxx:1122
 TStatToolkit.cxx:1123
 TStatToolkit.cxx:1124
 TStatToolkit.cxx:1125
 TStatToolkit.cxx:1126
 TStatToolkit.cxx:1127
 TStatToolkit.cxx:1128
 TStatToolkit.cxx:1129
 TStatToolkit.cxx:1130
 TStatToolkit.cxx:1131
 TStatToolkit.cxx:1132
 TStatToolkit.cxx:1133
 TStatToolkit.cxx:1134
 TStatToolkit.cxx:1135
 TStatToolkit.cxx:1136
 TStatToolkit.cxx:1137
 TStatToolkit.cxx:1138
 TStatToolkit.cxx:1139
 TStatToolkit.cxx:1140
 TStatToolkit.cxx:1141
 TStatToolkit.cxx:1142
 TStatToolkit.cxx:1143
 TStatToolkit.cxx:1144
 TStatToolkit.cxx:1145
 TStatToolkit.cxx:1146
 TStatToolkit.cxx:1147
 TStatToolkit.cxx:1148
 TStatToolkit.cxx:1149
 TStatToolkit.cxx:1150
 TStatToolkit.cxx:1151
 TStatToolkit.cxx:1152
 TStatToolkit.cxx:1153
 TStatToolkit.cxx:1154
 TStatToolkit.cxx:1155
 TStatToolkit.cxx:1156
 TStatToolkit.cxx:1157
 TStatToolkit.cxx:1158
 TStatToolkit.cxx:1159
 TStatToolkit.cxx:1160
 TStatToolkit.cxx:1161
 TStatToolkit.cxx:1162
 TStatToolkit.cxx:1163
 TStatToolkit.cxx:1164
 TStatToolkit.cxx:1165
 TStatToolkit.cxx:1166
 TStatToolkit.cxx:1167
 TStatToolkit.cxx:1168
 TStatToolkit.cxx:1169
 TStatToolkit.cxx:1170
 TStatToolkit.cxx:1171
 TStatToolkit.cxx:1172
 TStatToolkit.cxx:1173
 TStatToolkit.cxx:1174
 TStatToolkit.cxx:1175
 TStatToolkit.cxx:1176
 TStatToolkit.cxx:1177
 TStatToolkit.cxx:1178
 TStatToolkit.cxx:1179
 TStatToolkit.cxx:1180
 TStatToolkit.cxx:1181
 TStatToolkit.cxx:1182
 TStatToolkit.cxx:1183
 TStatToolkit.cxx:1184
 TStatToolkit.cxx:1185
 TStatToolkit.cxx:1186
 TStatToolkit.cxx:1187
 TStatToolkit.cxx:1188
 TStatToolkit.cxx:1189
 TStatToolkit.cxx:1190
 TStatToolkit.cxx:1191
 TStatToolkit.cxx:1192
 TStatToolkit.cxx:1193
 TStatToolkit.cxx:1194
 TStatToolkit.cxx:1195
 TStatToolkit.cxx:1196
 TStatToolkit.cxx:1197
 TStatToolkit.cxx:1198
 TStatToolkit.cxx:1199
 TStatToolkit.cxx:1200
 TStatToolkit.cxx:1201
 TStatToolkit.cxx:1202
 TStatToolkit.cxx:1203
 TStatToolkit.cxx:1204
 TStatToolkit.cxx:1205
 TStatToolkit.cxx:1206
 TStatToolkit.cxx:1207
 TStatToolkit.cxx:1208
 TStatToolkit.cxx:1209
 TStatToolkit.cxx:1210
 TStatToolkit.cxx:1211
 TStatToolkit.cxx:1212
 TStatToolkit.cxx:1213
 TStatToolkit.cxx:1214
 TStatToolkit.cxx:1215
 TStatToolkit.cxx:1216
 TStatToolkit.cxx:1217
 TStatToolkit.cxx:1218
 TStatToolkit.cxx:1219
 TStatToolkit.cxx:1220
 TStatToolkit.cxx:1221
 TStatToolkit.cxx:1222
 TStatToolkit.cxx:1223
 TStatToolkit.cxx:1224
 TStatToolkit.cxx:1225
 TStatToolkit.cxx:1226
 TStatToolkit.cxx:1227
 TStatToolkit.cxx:1228
 TStatToolkit.cxx:1229
 TStatToolkit.cxx:1230
 TStatToolkit.cxx:1231
 TStatToolkit.cxx:1232
 TStatToolkit.cxx:1233
 TStatToolkit.cxx:1234
 TStatToolkit.cxx:1235
 TStatToolkit.cxx:1236
 TStatToolkit.cxx:1237
 TStatToolkit.cxx:1238
 TStatToolkit.cxx:1239
 TStatToolkit.cxx:1240
 TStatToolkit.cxx:1241
 TStatToolkit.cxx:1242
 TStatToolkit.cxx:1243
 TStatToolkit.cxx:1244
 TStatToolkit.cxx:1245
 TStatToolkit.cxx:1246
 TStatToolkit.cxx:1247
 TStatToolkit.cxx:1248
 TStatToolkit.cxx:1249
 TStatToolkit.cxx:1250
 TStatToolkit.cxx:1251
 TStatToolkit.cxx:1252
 TStatToolkit.cxx:1253
 TStatToolkit.cxx:1254
 TStatToolkit.cxx:1255
 TStatToolkit.cxx:1256
 TStatToolkit.cxx:1257
 TStatToolkit.cxx:1258
 TStatToolkit.cxx:1259
 TStatToolkit.cxx:1260
 TStatToolkit.cxx:1261
 TStatToolkit.cxx:1262
 TStatToolkit.cxx:1263
 TStatToolkit.cxx:1264
 TStatToolkit.cxx:1265
 TStatToolkit.cxx:1266
 TStatToolkit.cxx:1267
 TStatToolkit.cxx:1268
 TStatToolkit.cxx:1269
 TStatToolkit.cxx:1270
 TStatToolkit.cxx:1271
 TStatToolkit.cxx:1272
 TStatToolkit.cxx:1273
 TStatToolkit.cxx:1274
 TStatToolkit.cxx:1275
 TStatToolkit.cxx:1276
 TStatToolkit.cxx:1277
 TStatToolkit.cxx:1278
 TStatToolkit.cxx:1279
 TStatToolkit.cxx:1280
 TStatToolkit.cxx:1281
 TStatToolkit.cxx:1282
 TStatToolkit.cxx:1283
 TStatToolkit.cxx:1284
 TStatToolkit.cxx:1285
 TStatToolkit.cxx:1286
 TStatToolkit.cxx:1287
 TStatToolkit.cxx:1288
 TStatToolkit.cxx:1289
 TStatToolkit.cxx:1290
 TStatToolkit.cxx:1291
 TStatToolkit.cxx:1292
 TStatToolkit.cxx:1293
 TStatToolkit.cxx:1294
 TStatToolkit.cxx:1295
 TStatToolkit.cxx:1296
 TStatToolkit.cxx:1297
 TStatToolkit.cxx:1298
 TStatToolkit.cxx:1299
 TStatToolkit.cxx:1300
 TStatToolkit.cxx:1301
 TStatToolkit.cxx:1302
 TStatToolkit.cxx:1303
 TStatToolkit.cxx:1304
 TStatToolkit.cxx:1305
 TStatToolkit.cxx:1306
 TStatToolkit.cxx:1307
 TStatToolkit.cxx:1308
 TStatToolkit.cxx:1309
 TStatToolkit.cxx:1310
 TStatToolkit.cxx:1311
 TStatToolkit.cxx:1312
 TStatToolkit.cxx:1313
 TStatToolkit.cxx:1314
 TStatToolkit.cxx:1315
 TStatToolkit.cxx:1316
 TStatToolkit.cxx:1317
 TStatToolkit.cxx:1318
 TStatToolkit.cxx:1319
 TStatToolkit.cxx:1320
 TStatToolkit.cxx:1321
 TStatToolkit.cxx:1322
 TStatToolkit.cxx:1323
 TStatToolkit.cxx:1324
 TStatToolkit.cxx:1325
 TStatToolkit.cxx:1326
 TStatToolkit.cxx:1327
 TStatToolkit.cxx:1328
 TStatToolkit.cxx:1329
 TStatToolkit.cxx:1330
 TStatToolkit.cxx:1331
 TStatToolkit.cxx:1332
 TStatToolkit.cxx:1333
 TStatToolkit.cxx:1334
 TStatToolkit.cxx:1335
 TStatToolkit.cxx:1336
 TStatToolkit.cxx:1337
 TStatToolkit.cxx:1338
 TStatToolkit.cxx:1339
 TStatToolkit.cxx:1340
 TStatToolkit.cxx:1341
 TStatToolkit.cxx:1342
 TStatToolkit.cxx:1343
 TStatToolkit.cxx:1344
 TStatToolkit.cxx:1345
 TStatToolkit.cxx:1346
 TStatToolkit.cxx:1347
 TStatToolkit.cxx:1348
 TStatToolkit.cxx:1349
 TStatToolkit.cxx:1350
 TStatToolkit.cxx:1351
 TStatToolkit.cxx:1352
 TStatToolkit.cxx:1353
 TStatToolkit.cxx:1354
 TStatToolkit.cxx:1355
 TStatToolkit.cxx:1356
 TStatToolkit.cxx:1357
 TStatToolkit.cxx:1358
 TStatToolkit.cxx:1359
 TStatToolkit.cxx:1360
 TStatToolkit.cxx:1361
 TStatToolkit.cxx:1362
 TStatToolkit.cxx:1363
 TStatToolkit.cxx:1364
 TStatToolkit.cxx:1365
 TStatToolkit.cxx:1366
 TStatToolkit.cxx:1367
 TStatToolkit.cxx:1368
 TStatToolkit.cxx:1369
 TStatToolkit.cxx:1370
 TStatToolkit.cxx:1371
 TStatToolkit.cxx:1372
 TStatToolkit.cxx:1373
 TStatToolkit.cxx:1374
 TStatToolkit.cxx:1375
 TStatToolkit.cxx:1376
 TStatToolkit.cxx:1377
 TStatToolkit.cxx:1378
 TStatToolkit.cxx:1379
 TStatToolkit.cxx:1380
 TStatToolkit.cxx:1381
 TStatToolkit.cxx:1382
 TStatToolkit.cxx:1383
 TStatToolkit.cxx:1384
 TStatToolkit.cxx:1385
 TStatToolkit.cxx:1386
 TStatToolkit.cxx:1387
 TStatToolkit.cxx:1388
 TStatToolkit.cxx:1389
 TStatToolkit.cxx:1390
 TStatToolkit.cxx:1391
 TStatToolkit.cxx:1392
 TStatToolkit.cxx:1393
 TStatToolkit.cxx:1394
 TStatToolkit.cxx:1395
 TStatToolkit.cxx:1396
 TStatToolkit.cxx:1397
 TStatToolkit.cxx:1398
 TStatToolkit.cxx:1399
 TStatToolkit.cxx:1400
 TStatToolkit.cxx:1401
 TStatToolkit.cxx:1402
 TStatToolkit.cxx:1403
 TStatToolkit.cxx:1404
 TStatToolkit.cxx:1405
 TStatToolkit.cxx:1406
 TStatToolkit.cxx:1407
 TStatToolkit.cxx:1408
 TStatToolkit.cxx:1409
 TStatToolkit.cxx:1410
 TStatToolkit.cxx:1411
 TStatToolkit.cxx:1412
 TStatToolkit.cxx:1413
 TStatToolkit.cxx:1414
 TStatToolkit.cxx:1415
 TStatToolkit.cxx:1416
 TStatToolkit.cxx:1417
 TStatToolkit.cxx:1418
 TStatToolkit.cxx:1419
 TStatToolkit.cxx:1420
 TStatToolkit.cxx:1421
 TStatToolkit.cxx:1422
 TStatToolkit.cxx:1423
 TStatToolkit.cxx:1424
 TStatToolkit.cxx:1425
 TStatToolkit.cxx:1426
 TStatToolkit.cxx:1427
 TStatToolkit.cxx:1428
 TStatToolkit.cxx:1429
 TStatToolkit.cxx:1430
 TStatToolkit.cxx:1431
 TStatToolkit.cxx:1432
 TStatToolkit.cxx:1433
 TStatToolkit.cxx:1434
 TStatToolkit.cxx:1435
 TStatToolkit.cxx:1436
 TStatToolkit.cxx:1437
 TStatToolkit.cxx:1438
 TStatToolkit.cxx:1439
 TStatToolkit.cxx:1440
 TStatToolkit.cxx:1441
 TStatToolkit.cxx:1442
 TStatToolkit.cxx:1443
 TStatToolkit.cxx:1444
 TStatToolkit.cxx:1445
 TStatToolkit.cxx:1446
 TStatToolkit.cxx:1447
 TStatToolkit.cxx:1448
 TStatToolkit.cxx:1449
 TStatToolkit.cxx:1450
 TStatToolkit.cxx:1451
 TStatToolkit.cxx:1452
 TStatToolkit.cxx:1453
 TStatToolkit.cxx:1454
 TStatToolkit.cxx:1455
 TStatToolkit.cxx:1456
 TStatToolkit.cxx:1457
 TStatToolkit.cxx:1458
 TStatToolkit.cxx:1459
 TStatToolkit.cxx:1460
 TStatToolkit.cxx:1461
 TStatToolkit.cxx:1462
 TStatToolkit.cxx:1463
 TStatToolkit.cxx:1464
 TStatToolkit.cxx:1465
 TStatToolkit.cxx:1466
 TStatToolkit.cxx:1467
 TStatToolkit.cxx:1468
 TStatToolkit.cxx:1469
 TStatToolkit.cxx:1470
 TStatToolkit.cxx:1471
 TStatToolkit.cxx:1472
 TStatToolkit.cxx:1473
 TStatToolkit.cxx:1474
 TStatToolkit.cxx:1475
 TStatToolkit.cxx:1476
 TStatToolkit.cxx:1477
 TStatToolkit.cxx:1478
 TStatToolkit.cxx:1479
 TStatToolkit.cxx:1480
 TStatToolkit.cxx:1481
 TStatToolkit.cxx:1482
 TStatToolkit.cxx:1483
 TStatToolkit.cxx:1484
 TStatToolkit.cxx:1485
 TStatToolkit.cxx:1486
 TStatToolkit.cxx:1487
 TStatToolkit.cxx:1488
 TStatToolkit.cxx:1489
 TStatToolkit.cxx:1490
 TStatToolkit.cxx:1491
 TStatToolkit.cxx:1492
 TStatToolkit.cxx:1493
 TStatToolkit.cxx:1494
 TStatToolkit.cxx:1495
 TStatToolkit.cxx:1496
 TStatToolkit.cxx:1497
 TStatToolkit.cxx:1498
 TStatToolkit.cxx:1499
 TStatToolkit.cxx:1500
 TStatToolkit.cxx:1501
 TStatToolkit.cxx:1502
 TStatToolkit.cxx:1503
 TStatToolkit.cxx:1504
 TStatToolkit.cxx:1505
 TStatToolkit.cxx:1506
 TStatToolkit.cxx:1507
 TStatToolkit.cxx:1508
 TStatToolkit.cxx:1509
 TStatToolkit.cxx:1510
 TStatToolkit.cxx:1511
 TStatToolkit.cxx:1512
 TStatToolkit.cxx:1513
 TStatToolkit.cxx:1514
 TStatToolkit.cxx:1515
 TStatToolkit.cxx:1516
 TStatToolkit.cxx:1517
 TStatToolkit.cxx:1518
 TStatToolkit.cxx:1519
 TStatToolkit.cxx:1520
 TStatToolkit.cxx:1521
 TStatToolkit.cxx:1522
 TStatToolkit.cxx:1523
 TStatToolkit.cxx:1524
 TStatToolkit.cxx:1525
 TStatToolkit.cxx:1526
 TStatToolkit.cxx:1527
 TStatToolkit.cxx:1528
 TStatToolkit.cxx:1529
 TStatToolkit.cxx:1530
 TStatToolkit.cxx:1531
 TStatToolkit.cxx:1532
 TStatToolkit.cxx:1533
 TStatToolkit.cxx:1534
 TStatToolkit.cxx:1535
 TStatToolkit.cxx:1536
 TStatToolkit.cxx:1537
 TStatToolkit.cxx:1538
 TStatToolkit.cxx:1539
 TStatToolkit.cxx:1540
 TStatToolkit.cxx:1541
 TStatToolkit.cxx:1542
 TStatToolkit.cxx:1543
 TStatToolkit.cxx:1544
 TStatToolkit.cxx:1545
 TStatToolkit.cxx:1546
 TStatToolkit.cxx:1547
 TStatToolkit.cxx:1548
 TStatToolkit.cxx:1549
 TStatToolkit.cxx:1550
 TStatToolkit.cxx:1551
 TStatToolkit.cxx:1552
 TStatToolkit.cxx:1553
 TStatToolkit.cxx:1554
 TStatToolkit.cxx:1555
 TStatToolkit.cxx:1556
 TStatToolkit.cxx:1557
 TStatToolkit.cxx:1558
 TStatToolkit.cxx:1559
 TStatToolkit.cxx:1560
 TStatToolkit.cxx:1561
 TStatToolkit.cxx:1562
 TStatToolkit.cxx:1563
 TStatToolkit.cxx:1564
 TStatToolkit.cxx:1565
 TStatToolkit.cxx:1566
 TStatToolkit.cxx:1567
 TStatToolkit.cxx:1568
 TStatToolkit.cxx:1569
 TStatToolkit.cxx:1570
 TStatToolkit.cxx:1571
 TStatToolkit.cxx:1572
 TStatToolkit.cxx:1573
 TStatToolkit.cxx:1574
 TStatToolkit.cxx:1575
 TStatToolkit.cxx:1576
 TStatToolkit.cxx:1577
 TStatToolkit.cxx:1578
 TStatToolkit.cxx:1579
 TStatToolkit.cxx:1580
 TStatToolkit.cxx:1581
 TStatToolkit.cxx:1582
 TStatToolkit.cxx:1583
 TStatToolkit.cxx:1584
 TStatToolkit.cxx:1585
 TStatToolkit.cxx:1586
 TStatToolkit.cxx:1587
 TStatToolkit.cxx:1588
 TStatToolkit.cxx:1589
 TStatToolkit.cxx:1590
 TStatToolkit.cxx:1591
 TStatToolkit.cxx:1592
 TStatToolkit.cxx:1593
 TStatToolkit.cxx:1594
 TStatToolkit.cxx:1595
 TStatToolkit.cxx:1596
 TStatToolkit.cxx:1597
 TStatToolkit.cxx:1598
 TStatToolkit.cxx:1599
 TStatToolkit.cxx:1600
 TStatToolkit.cxx:1601
 TStatToolkit.cxx:1602
 TStatToolkit.cxx:1603
 TStatToolkit.cxx:1604
 TStatToolkit.cxx:1605
 TStatToolkit.cxx:1606
 TStatToolkit.cxx:1607
 TStatToolkit.cxx:1608
 TStatToolkit.cxx:1609
 TStatToolkit.cxx:1610
 TStatToolkit.cxx:1611
 TStatToolkit.cxx:1612
 TStatToolkit.cxx:1613
 TStatToolkit.cxx:1614
 TStatToolkit.cxx:1615
 TStatToolkit.cxx:1616
 TStatToolkit.cxx:1617
 TStatToolkit.cxx:1618
 TStatToolkit.cxx:1619
 TStatToolkit.cxx:1620
 TStatToolkit.cxx:1621
 TStatToolkit.cxx:1622
 TStatToolkit.cxx:1623
 TStatToolkit.cxx:1624
 TStatToolkit.cxx:1625
 TStatToolkit.cxx:1626
 TStatToolkit.cxx:1627
 TStatToolkit.cxx:1628
 TStatToolkit.cxx:1629
 TStatToolkit.cxx:1630
 TStatToolkit.cxx:1631
 TStatToolkit.cxx:1632
 TStatToolkit.cxx:1633
 TStatToolkit.cxx:1634
 TStatToolkit.cxx:1635
 TStatToolkit.cxx:1636
 TStatToolkit.cxx:1637
 TStatToolkit.cxx:1638
 TStatToolkit.cxx:1639
 TStatToolkit.cxx:1640
 TStatToolkit.cxx:1641
 TStatToolkit.cxx:1642
 TStatToolkit.cxx:1643
 TStatToolkit.cxx:1644
 TStatToolkit.cxx:1645
 TStatToolkit.cxx:1646
 TStatToolkit.cxx:1647
 TStatToolkit.cxx:1648
 TStatToolkit.cxx:1649
 TStatToolkit.cxx:1650
 TStatToolkit.cxx:1651
 TStatToolkit.cxx:1652
 TStatToolkit.cxx:1653
 TStatToolkit.cxx:1654
 TStatToolkit.cxx:1655
 TStatToolkit.cxx:1656
 TStatToolkit.cxx:1657
 TStatToolkit.cxx:1658
 TStatToolkit.cxx:1659
 TStatToolkit.cxx:1660
 TStatToolkit.cxx:1661
 TStatToolkit.cxx:1662
 TStatToolkit.cxx:1663
 TStatToolkit.cxx:1664
 TStatToolkit.cxx:1665
 TStatToolkit.cxx:1666
 TStatToolkit.cxx:1667
 TStatToolkit.cxx:1668
 TStatToolkit.cxx:1669
 TStatToolkit.cxx:1670
 TStatToolkit.cxx:1671
 TStatToolkit.cxx:1672
 TStatToolkit.cxx:1673
 TStatToolkit.cxx:1674
 TStatToolkit.cxx:1675
 TStatToolkit.cxx:1676
 TStatToolkit.cxx:1677
 TStatToolkit.cxx:1678
 TStatToolkit.cxx:1679
 TStatToolkit.cxx:1680
 TStatToolkit.cxx:1681
 TStatToolkit.cxx:1682
 TStatToolkit.cxx:1683
 TStatToolkit.cxx:1684
 TStatToolkit.cxx:1685
 TStatToolkit.cxx:1686
 TStatToolkit.cxx:1687
 TStatToolkit.cxx:1688
 TStatToolkit.cxx:1689
 TStatToolkit.cxx:1690
 TStatToolkit.cxx:1691
 TStatToolkit.cxx:1692
 TStatToolkit.cxx:1693
 TStatToolkit.cxx:1694
 TStatToolkit.cxx:1695
 TStatToolkit.cxx:1696
 TStatToolkit.cxx:1697
 TStatToolkit.cxx:1698
 TStatToolkit.cxx:1699
 TStatToolkit.cxx:1700
 TStatToolkit.cxx:1701
 TStatToolkit.cxx:1702
 TStatToolkit.cxx:1703
 TStatToolkit.cxx:1704
 TStatToolkit.cxx:1705
 TStatToolkit.cxx:1706
 TStatToolkit.cxx:1707
 TStatToolkit.cxx:1708
 TStatToolkit.cxx:1709
 TStatToolkit.cxx:1710
 TStatToolkit.cxx:1711
 TStatToolkit.cxx:1712
 TStatToolkit.cxx:1713
 TStatToolkit.cxx:1714
 TStatToolkit.cxx:1715
 TStatToolkit.cxx:1716
 TStatToolkit.cxx:1717
 TStatToolkit.cxx:1718
 TStatToolkit.cxx:1719
 TStatToolkit.cxx:1720
 TStatToolkit.cxx:1721
 TStatToolkit.cxx:1722
 TStatToolkit.cxx:1723
 TStatToolkit.cxx:1724
 TStatToolkit.cxx:1725
 TStatToolkit.cxx:1726
 TStatToolkit.cxx:1727
 TStatToolkit.cxx:1728
 TStatToolkit.cxx:1729
 TStatToolkit.cxx:1730
 TStatToolkit.cxx:1731
 TStatToolkit.cxx:1732
 TStatToolkit.cxx:1733
 TStatToolkit.cxx:1734
 TStatToolkit.cxx:1735
 TStatToolkit.cxx:1736
 TStatToolkit.cxx:1737
 TStatToolkit.cxx:1738
 TStatToolkit.cxx:1739
 TStatToolkit.cxx:1740
 TStatToolkit.cxx:1741
 TStatToolkit.cxx:1742
 TStatToolkit.cxx:1743
 TStatToolkit.cxx:1744
 TStatToolkit.cxx:1745
 TStatToolkit.cxx:1746
 TStatToolkit.cxx:1747
 TStatToolkit.cxx:1748
 TStatToolkit.cxx:1749
 TStatToolkit.cxx:1750
 TStatToolkit.cxx:1751
 TStatToolkit.cxx:1752
 TStatToolkit.cxx:1753
 TStatToolkit.cxx:1754
 TStatToolkit.cxx:1755
 TStatToolkit.cxx:1756
 TStatToolkit.cxx:1757
 TStatToolkit.cxx:1758
 TStatToolkit.cxx:1759
 TStatToolkit.cxx:1760
 TStatToolkit.cxx:1761
 TStatToolkit.cxx:1762
 TStatToolkit.cxx:1763
 TStatToolkit.cxx:1764
 TStatToolkit.cxx:1765
 TStatToolkit.cxx:1766
 TStatToolkit.cxx:1767
 TStatToolkit.cxx:1768
 TStatToolkit.cxx:1769
 TStatToolkit.cxx:1770
 TStatToolkit.cxx:1771
 TStatToolkit.cxx:1772
 TStatToolkit.cxx:1773
 TStatToolkit.cxx:1774
 TStatToolkit.cxx:1775
 TStatToolkit.cxx:1776
 TStatToolkit.cxx:1777
 TStatToolkit.cxx:1778
 TStatToolkit.cxx:1779
 TStatToolkit.cxx:1780
 TStatToolkit.cxx:1781
 TStatToolkit.cxx:1782
 TStatToolkit.cxx:1783
 TStatToolkit.cxx:1784
 TStatToolkit.cxx:1785
 TStatToolkit.cxx:1786
 TStatToolkit.cxx:1787
 TStatToolkit.cxx:1788
 TStatToolkit.cxx:1789
 TStatToolkit.cxx:1790
 TStatToolkit.cxx:1791
 TStatToolkit.cxx:1792
 TStatToolkit.cxx:1793
 TStatToolkit.cxx:1794
 TStatToolkit.cxx:1795
 TStatToolkit.cxx:1796
 TStatToolkit.cxx:1797
 TStatToolkit.cxx:1798
 TStatToolkit.cxx:1799
 TStatToolkit.cxx:1800
 TStatToolkit.cxx:1801
 TStatToolkit.cxx:1802
 TStatToolkit.cxx:1803
 TStatToolkit.cxx:1804
 TStatToolkit.cxx:1805
 TStatToolkit.cxx:1806
 TStatToolkit.cxx:1807
 TStatToolkit.cxx:1808
 TStatToolkit.cxx:1809
 TStatToolkit.cxx:1810
 TStatToolkit.cxx:1811
 TStatToolkit.cxx:1812
 TStatToolkit.cxx:1813
 TStatToolkit.cxx:1814
 TStatToolkit.cxx:1815
 TStatToolkit.cxx:1816
 TStatToolkit.cxx:1817
 TStatToolkit.cxx:1818
 TStatToolkit.cxx:1819
 TStatToolkit.cxx:1820
 TStatToolkit.cxx:1821
 TStatToolkit.cxx:1822
 TStatToolkit.cxx:1823
 TStatToolkit.cxx:1824
 TStatToolkit.cxx:1825
 TStatToolkit.cxx:1826
 TStatToolkit.cxx:1827
 TStatToolkit.cxx:1828
 TStatToolkit.cxx:1829
 TStatToolkit.cxx:1830
 TStatToolkit.cxx:1831
 TStatToolkit.cxx:1832
 TStatToolkit.cxx:1833
 TStatToolkit.cxx:1834
 TStatToolkit.cxx:1835
 TStatToolkit.cxx:1836
 TStatToolkit.cxx:1837
 TStatToolkit.cxx:1838
 TStatToolkit.cxx:1839
 TStatToolkit.cxx:1840
 TStatToolkit.cxx:1841
 TStatToolkit.cxx:1842
 TStatToolkit.cxx:1843
 TStatToolkit.cxx:1844
 TStatToolkit.cxx:1845
 TStatToolkit.cxx:1846
 TStatToolkit.cxx:1847
 TStatToolkit.cxx:1848
 TStatToolkit.cxx:1849
 TStatToolkit.cxx:1850
 TStatToolkit.cxx:1851
 TStatToolkit.cxx:1852
 TStatToolkit.cxx:1853
 TStatToolkit.cxx:1854
 TStatToolkit.cxx:1855
 TStatToolkit.cxx:1856
 TStatToolkit.cxx:1857
 TStatToolkit.cxx:1858
 TStatToolkit.cxx:1859
 TStatToolkit.cxx:1860
 TStatToolkit.cxx:1861
 TStatToolkit.cxx:1862
 TStatToolkit.cxx:1863
 TStatToolkit.cxx:1864
 TStatToolkit.cxx:1865
 TStatToolkit.cxx:1866
 TStatToolkit.cxx:1867
 TStatToolkit.cxx:1868
 TStatToolkit.cxx:1869
 TStatToolkit.cxx:1870
 TStatToolkit.cxx:1871
 TStatToolkit.cxx:1872
 TStatToolkit.cxx:1873
 TStatToolkit.cxx:1874
 TStatToolkit.cxx:1875
 TStatToolkit.cxx:1876
 TStatToolkit.cxx:1877
 TStatToolkit.cxx:1878
 TStatToolkit.cxx:1879
 TStatToolkit.cxx:1880
 TStatToolkit.cxx:1881
 TStatToolkit.cxx:1882
 TStatToolkit.cxx:1883
 TStatToolkit.cxx:1884
 TStatToolkit.cxx:1885
 TStatToolkit.cxx:1886
 TStatToolkit.cxx:1887
 TStatToolkit.cxx:1888
 TStatToolkit.cxx:1889
 TStatToolkit.cxx:1890
 TStatToolkit.cxx:1891
 TStatToolkit.cxx:1892
 TStatToolkit.cxx:1893
 TStatToolkit.cxx:1894
 TStatToolkit.cxx:1895
 TStatToolkit.cxx:1896
 TStatToolkit.cxx:1897
 TStatToolkit.cxx:1898
 TStatToolkit.cxx:1899
 TStatToolkit.cxx:1900
 TStatToolkit.cxx:1901
 TStatToolkit.cxx:1902
 TStatToolkit.cxx:1903
 TStatToolkit.cxx:1904
 TStatToolkit.cxx:1905
 TStatToolkit.cxx:1906
 TStatToolkit.cxx:1907
 TStatToolkit.cxx:1908
 TStatToolkit.cxx:1909
 TStatToolkit.cxx:1910
 TStatToolkit.cxx:1911
 TStatToolkit.cxx:1912
 TStatToolkit.cxx:1913
 TStatToolkit.cxx:1914
 TStatToolkit.cxx:1915
 TStatToolkit.cxx:1916
 TStatToolkit.cxx:1917
 TStatToolkit.cxx:1918
 TStatToolkit.cxx:1919
 TStatToolkit.cxx:1920
 TStatToolkit.cxx:1921
 TStatToolkit.cxx:1922
 TStatToolkit.cxx:1923
 TStatToolkit.cxx:1924
 TStatToolkit.cxx:1925
 TStatToolkit.cxx:1926
 TStatToolkit.cxx:1927
 TStatToolkit.cxx:1928
 TStatToolkit.cxx:1929
 TStatToolkit.cxx:1930
 TStatToolkit.cxx:1931
 TStatToolkit.cxx:1932
 TStatToolkit.cxx:1933
 TStatToolkit.cxx:1934
 TStatToolkit.cxx:1935
 TStatToolkit.cxx:1936
 TStatToolkit.cxx:1937
 TStatToolkit.cxx:1938
 TStatToolkit.cxx:1939
 TStatToolkit.cxx:1940
 TStatToolkit.cxx:1941
 TStatToolkit.cxx:1942
 TStatToolkit.cxx:1943
 TStatToolkit.cxx:1944
 TStatToolkit.cxx:1945
 TStatToolkit.cxx:1946
 TStatToolkit.cxx:1947
 TStatToolkit.cxx:1948
 TStatToolkit.cxx:1949
 TStatToolkit.cxx:1950
 TStatToolkit.cxx:1951
 TStatToolkit.cxx:1952
 TStatToolkit.cxx:1953
 TStatToolkit.cxx:1954
 TStatToolkit.cxx:1955
 TStatToolkit.cxx:1956
 TStatToolkit.cxx:1957
 TStatToolkit.cxx:1958
 TStatToolkit.cxx:1959
 TStatToolkit.cxx:1960
 TStatToolkit.cxx:1961
 TStatToolkit.cxx:1962
 TStatToolkit.cxx:1963
 TStatToolkit.cxx:1964
 TStatToolkit.cxx:1965
 TStatToolkit.cxx:1966
 TStatToolkit.cxx:1967
 TStatToolkit.cxx:1968
 TStatToolkit.cxx:1969
 TStatToolkit.cxx:1970
 TStatToolkit.cxx:1971
 TStatToolkit.cxx:1972
 TStatToolkit.cxx:1973
 TStatToolkit.cxx:1974
 TStatToolkit.cxx:1975
 TStatToolkit.cxx:1976
 TStatToolkit.cxx:1977
 TStatToolkit.cxx:1978
 TStatToolkit.cxx:1979
 TStatToolkit.cxx:1980
 TStatToolkit.cxx:1981
 TStatToolkit.cxx:1982
 TStatToolkit.cxx:1983
 TStatToolkit.cxx:1984
 TStatToolkit.cxx:1985
 TStatToolkit.cxx:1986
 TStatToolkit.cxx:1987
 TStatToolkit.cxx:1988
 TStatToolkit.cxx:1989
 TStatToolkit.cxx:1990
 TStatToolkit.cxx:1991
 TStatToolkit.cxx:1992
 TStatToolkit.cxx:1993
 TStatToolkit.cxx:1994
 TStatToolkit.cxx:1995
 TStatToolkit.cxx:1996
 TStatToolkit.cxx:1997
 TStatToolkit.cxx:1998
 TStatToolkit.cxx:1999
 TStatToolkit.cxx:2000
 TStatToolkit.cxx:2001
 TStatToolkit.cxx:2002
 TStatToolkit.cxx:2003
 TStatToolkit.cxx:2004
 TStatToolkit.cxx:2005
 TStatToolkit.cxx:2006
 TStatToolkit.cxx:2007
 TStatToolkit.cxx:2008
 TStatToolkit.cxx:2009
 TStatToolkit.cxx:2010
 TStatToolkit.cxx:2011
 TStatToolkit.cxx:2012
 TStatToolkit.cxx:2013
 TStatToolkit.cxx:2014
 TStatToolkit.cxx:2015
 TStatToolkit.cxx:2016
 TStatToolkit.cxx:2017
 TStatToolkit.cxx:2018
 TStatToolkit.cxx:2019
 TStatToolkit.cxx:2020
 TStatToolkit.cxx:2021
 TStatToolkit.cxx:2022
 TStatToolkit.cxx:2023
 TStatToolkit.cxx:2024
 TStatToolkit.cxx:2025
 TStatToolkit.cxx:2026
 TStatToolkit.cxx:2027
 TStatToolkit.cxx:2028
 TStatToolkit.cxx:2029
 TStatToolkit.cxx:2030
 TStatToolkit.cxx:2031
 TStatToolkit.cxx:2032
 TStatToolkit.cxx:2033
 TStatToolkit.cxx:2034
 TStatToolkit.cxx:2035
 TStatToolkit.cxx:2036
 TStatToolkit.cxx:2037
 TStatToolkit.cxx:2038
 TStatToolkit.cxx:2039
 TStatToolkit.cxx:2040
 TStatToolkit.cxx:2041
 TStatToolkit.cxx:2042
 TStatToolkit.cxx:2043
 TStatToolkit.cxx:2044
 TStatToolkit.cxx:2045
 TStatToolkit.cxx:2046
 TStatToolkit.cxx:2047
 TStatToolkit.cxx:2048
 TStatToolkit.cxx:2049
 TStatToolkit.cxx:2050
 TStatToolkit.cxx:2051
 TStatToolkit.cxx:2052
 TStatToolkit.cxx:2053
 TStatToolkit.cxx:2054
 TStatToolkit.cxx:2055
 TStatToolkit.cxx:2056
 TStatToolkit.cxx:2057
 TStatToolkit.cxx:2058
 TStatToolkit.cxx:2059
 TStatToolkit.cxx:2060
 TStatToolkit.cxx:2061
 TStatToolkit.cxx:2062
 TStatToolkit.cxx:2063
 TStatToolkit.cxx:2064
 TStatToolkit.cxx:2065
 TStatToolkit.cxx:2066
 TStatToolkit.cxx:2067
 TStatToolkit.cxx:2068
 TStatToolkit.cxx:2069
 TStatToolkit.cxx:2070
 TStatToolkit.cxx:2071
 TStatToolkit.cxx:2072
 TStatToolkit.cxx:2073
 TStatToolkit.cxx:2074
 TStatToolkit.cxx:2075
 TStatToolkit.cxx:2076
 TStatToolkit.cxx:2077
 TStatToolkit.cxx:2078
 TStatToolkit.cxx:2079
 TStatToolkit.cxx:2080
 TStatToolkit.cxx:2081
 TStatToolkit.cxx:2082
 TStatToolkit.cxx:2083
 TStatToolkit.cxx:2084
 TStatToolkit.cxx:2085
 TStatToolkit.cxx:2086
 TStatToolkit.cxx:2087
 TStatToolkit.cxx:2088
 TStatToolkit.cxx:2089
 TStatToolkit.cxx:2090
 TStatToolkit.cxx:2091
 TStatToolkit.cxx:2092
 TStatToolkit.cxx:2093
 TStatToolkit.cxx:2094
 TStatToolkit.cxx:2095
 TStatToolkit.cxx:2096
 TStatToolkit.cxx:2097
 TStatToolkit.cxx:2098
 TStatToolkit.cxx:2099
 TStatToolkit.cxx:2100
 TStatToolkit.cxx:2101
 TStatToolkit.cxx:2102
 TStatToolkit.cxx:2103
 TStatToolkit.cxx:2104
 TStatToolkit.cxx:2105
 TStatToolkit.cxx:2106
 TStatToolkit.cxx:2107
 TStatToolkit.cxx:2108
 TStatToolkit.cxx:2109
 TStatToolkit.cxx:2110
 TStatToolkit.cxx:2111
 TStatToolkit.cxx:2112
 TStatToolkit.cxx:2113
 TStatToolkit.cxx:2114
 TStatToolkit.cxx:2115
 TStatToolkit.cxx:2116
 TStatToolkit.cxx:2117
 TStatToolkit.cxx:2118
 TStatToolkit.cxx:2119
 TStatToolkit.cxx:2120
 TStatToolkit.cxx:2121
 TStatToolkit.cxx:2122
 TStatToolkit.cxx:2123
 TStatToolkit.cxx:2124
 TStatToolkit.cxx:2125
 TStatToolkit.cxx:2126
 TStatToolkit.cxx:2127
 TStatToolkit.cxx:2128
 TStatToolkit.cxx:2129
 TStatToolkit.cxx:2130
 TStatToolkit.cxx:2131
 TStatToolkit.cxx:2132
 TStatToolkit.cxx:2133
 TStatToolkit.cxx:2134
 TStatToolkit.cxx:2135
 TStatToolkit.cxx:2136
 TStatToolkit.cxx:2137