ROOT logo
/**********************************************************************************************/
/* General class for alignment with large number of degrees of freedom                        */
/* Based on the original milliped2 by Volker Blobel                                           */
/* and AliMillepede class by Javier                                                           */ 
/* Allows operations with large sparse matrices                                               */ 
/* http://www.desy.de/~blobel/mptalks.html                                                    */
/*                                                                                            */ 
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/

#include "AliMillePede2.h"
#include "AliLog.h"
#include <TStopwatch.h>
#include <TFile.h>
#include <TChain.h>
#include <TMath.h>
#include <TVectorD.h>
#include <TArrayL.h>
#include <TArrayF.h>
#include <TSystem.h>
#include "AliMatrixSq.h"
#include "AliSymMatrix.h"
#include "AliRectMatrix.h"
#include "AliMatrixSparse.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fstream>

//#define _DUMP_EQ_BEFORE_
//#define _DUMP_EQ_AFTER_

//#define _DUMPEQ_BEFORE_
//#define _DUMPEQ_AFTER_ 

using std::ifstream;
ClassImp(AliMillePede2)

Bool_t   AliMillePede2::fgInvChol        = kTRUE;     // Invert global matrix with Cholesky solver
Bool_t   AliMillePede2::fgWeightSigma    = kTRUE;     // weight local constraint by module statistics
Bool_t   AliMillePede2::fgIsMatGloSparse = kFALSE;    // use faster dense matrix by default
Int_t    AliMillePede2::fgMinResCondType = 1;         // Jacoby preconditioner by default
Double_t AliMillePede2::fgMinResTol      = 1.e-11;    // default tolerance
Int_t    AliMillePede2::fgMinResMaxIter  = 10000;     // default max number of iterations 
Int_t    AliMillePede2::fgIterSol        = AliMinResSolve::kSolMinRes; // default iterative solver
Int_t    AliMillePede2::fgNKrylovV       = 240;        // default number of Krylov vectors to keep

//_____________________________________________________________________________________________
AliMillePede2::AliMillePede2() 
: fNLocPar(0),
  fNGloPar(0),
  fNGloParIni(0),
  fNGloSize(0),
//
  fNLocEquations(0),
  fIter(0),
  fMaxIter(10),
  fNStdDev(3),
  fNGloConstraints(0),
  fNLagrangeConstraints(0),
  fNLocFits(0),
  fNLocFitsRejected(0),
  fNGloFix(0),
  fGloSolveStatus(kFailed),
//
  fChi2CutFactor(1.),
  fChi2CutRef(1.),
  fResCutInit(100.),
  fResCut(100.),
  fMinPntValid(1),
//
  fNGroupsSet(0),
  fParamGrID(0),
  fProcPnt(0),
  fVecBLoc(0),
  fDiagCGlo(0),
  fVecBGlo(0),
  fInitPar(0),
  fDeltaPar(0),
  fSigmaPar(0),
  fIsLinear(0),
  fConstrUsed(0),
//
  fGlo2CGlo(0),
  fCGlo2Glo(0),
//
  fMatCLoc(0),
  fMatCGlo(0),
  fMatCGloLoc(0),
  //
  fFillIndex(0),
  fFillValue(0),
  //
  fRecDataTreeName("AliMillePedeRecords_Data"),
  fRecConsTreeName("AliMillePedeRecords_Consaints"),
  fRecDataBranchName("Record_Data"),
  fRecConsBranchName("Record_Consaints"),
  //
  fDataRecFName("/tmp/mp2_data_records.root"),
  fRecord(0),
  fDataRecFile(0),  
  fTreeData(0),
  fRecFileStatus(0),
  //
  fConstrRecFName("/tmp/mp2_constraints_records.root"),
  fTreeConstr(0),
  fConsRecFile(0),
  fCurrRecDataID(0),
  fCurrRecConstrID(0),
  fLocFitAdd(kTRUE),
  fUseRecordWeight(kTRUE),
  fMinRecordLength(1),
  fSelFirst(1),
  fSelLast(-1),
  fRejRunList(0),
  fAccRunList(0),
  fAccRunListWgh(0),
  fRunWgh(1),
  fkReGroup(0)
{
  fWghScl[0] = fWghScl[1] = -1;
}

//_____________________________________________________________________________________________
AliMillePede2::AliMillePede2(const AliMillePede2& src) : 
  TObject(src),fNLocPar(0),fNGloPar(0),fNGloParIni(0),fNGloSize(0),fNLocEquations(0),fIter(0),
  fMaxIter(10),fNStdDev(3),fNGloConstraints(0),fNLagrangeConstraints(0),
  fNLocFits(0),fNLocFitsRejected(0),
  fNGloFix(0),fGloSolveStatus(0),fChi2CutFactor(0),fChi2CutRef(0),fResCutInit(0),
  fResCut(0),fMinPntValid(1),fNGroupsSet(0),fParamGrID(0),fProcPnt(0),fVecBLoc(0),fDiagCGlo(0),fVecBGlo(0),
  fInitPar(0),fDeltaPar(0),fSigmaPar(0),fIsLinear(0),fConstrUsed(0),fGlo2CGlo(0),fCGlo2Glo(0),
  fMatCLoc(0),fMatCGlo(0),fMatCGloLoc(0),fFillIndex(0),fFillValue(0),
  fRecDataTreeName(0),fRecConsTreeName(0),fRecDataBranchName(0),fRecConsBranchName(0),
  fDataRecFName(0),fRecord(0),fDataRecFile(0),
  fTreeData(0),fRecFileStatus(0),fConstrRecFName(0),fTreeConstr(0),fConsRecFile(0),fCurrRecDataID(0),
  fCurrRecConstrID(0),fLocFitAdd(kTRUE),
  fUseRecordWeight(kTRUE),
  fMinRecordLength(1),
  fSelFirst(1),
  fSelLast(-1),
  fRejRunList(0),
  fAccRunList(0),
  fAccRunListWgh(0),
  fRunWgh(1),
  fkReGroup(0)
{
  fWghScl[0] = src.fWghScl[0];
  fWghScl[1] = src.fWghScl[1];
  printf("Dummy\n");
}

//_____________________________________________________________________________________________
AliMillePede2::~AliMillePede2() 
{
  // destructor
  CloseDataRecStorage();
  CloseConsRecStorage();
  //
  delete[] fParamGrID;
  delete[] fProcPnt;
  delete[] fVecBLoc;
  delete[] fDiagCGlo;
  delete[] fVecBGlo;
  delete[] fInitPar;
  delete[] fDeltaPar;
  delete[] fSigmaPar;
  delete[] fGlo2CGlo;
  delete[] fCGlo2Glo;
  delete[] fIsLinear;
  delete[] fConstrUsed;
  delete[] fFillIndex;
  delete[] fFillValue;
  //
  delete fRecord;
  delete fMatCLoc;
  delete fMatCGlo;
  delete fMatCGloLoc;
  delete fRejRunList;
  delete fAccRunList;
  delete fAccRunListWgh;
} 

//_____________________________________________________________________________________________
Int_t AliMillePede2::InitMille(int nGlo, int nLoc, int lNStdDev,double lResCut, double lResCutInit, const Int_t* regroup)
{
  // init all
  //
  fNGloParIni = nGlo;
  if (regroup) { // regrouping is requested
    fkReGroup = regroup;
    int ng = 0; // recalculate N globals
    int maxPID = -1;
    for (int i=0;i<nGlo;i++) if (regroup[i]>=0) {ng++; if (regroup[i]>maxPID) maxPID = regroup[i];} 
    maxPID++;
    AliInfo(Form("Regrouping is requested: from %d raw to %d formal globals grouped to %d real globals",nGlo,ng,maxPID));
    nGlo = maxPID;
  }
  if (nLoc>0)        fNLocPar = nLoc;
  if (nGlo>0)        fNGloPar = nGlo;
  if (lResCutInit>0) fResCutInit = lResCutInit; 
  if (lResCut>0)     fResCut     = lResCut;
  if (lNStdDev>0)    fNStdDev    = lNStdDev;
  //
  AliInfo(Form("NLoc: %d NGlo: %d",fNLocPar,fNGloPar));

  fNGloSize = fNGloPar;
  //
  if (fgIsMatGloSparse) {fMatCGlo = new AliMatrixSparse(fNGloPar); fMatCGlo->SetSymmetric(kTRUE);}
  else                   fMatCGlo = new AliSymMatrix(fNGloPar);
  //
  fFillIndex    = new Int_t[fNGloPar];
  fFillValue    = new Double_t[fNGloPar];
  //
  fMatCLoc      = new AliSymMatrix(fNLocPar);
  fMatCGloLoc   = new AliRectMatrix(fNGloPar,fNLocPar);
  //
  fParamGrID    = new Int_t[fNGloPar];
  fProcPnt      = new Int_t[fNGloPar];
  fVecBLoc      = new Double_t[fNLocPar];
  fDiagCGlo     = new Double_t[fNGloPar];
  //
  fInitPar      = new Double_t[fNGloPar];
  fDeltaPar     = new Double_t[fNGloPar];
  fSigmaPar     = new Double_t[fNGloPar];
  fIsLinear     = new Bool_t[fNGloPar];
  //
  fGlo2CGlo     = new Int_t[fNGloPar];
  fCGlo2Glo     = new Int_t[fNGloPar];
  //
  memset(fVecBLoc   ,0,fNLocPar*sizeof(Double_t));
  memset(fDiagCGlo  ,0,fNGloPar*sizeof(Double_t));
  memset(fInitPar   ,0,fNGloPar*sizeof(Double_t));
  memset(fDeltaPar  ,0,fNGloPar*sizeof(Double_t));
  memset(fSigmaPar  ,0,fNGloPar*sizeof(Double_t));
  memset(fProcPnt   ,0,fNGloPar*sizeof(Int_t));
  //
  for (int i=fNGloPar;i--;) {
    fGlo2CGlo[i] = fCGlo2Glo[i] = -1;
    fIsLinear[i] = kTRUE;
    fParamGrID[i] = -1;
  }
  //
  fWghScl[0] = -1; 
  fWghScl[1] = -1;
  return 1;
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::ImposeDataRecFile(const char* fname)
{
  // set filename for records
  CloseDataRecStorage();
  SetDataRecFName(fname);
  return InitDataRecStorage(kTRUE); // open in read mode
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::ImposeConsRecFile(const char* fname)
{
  // set filename for constraints
  CloseConsRecStorage();
  SetConsRecFName(fname);
  return InitConsRecStorage(kTRUE); // open in read mode
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::InitDataRecStorage(Bool_t read)
{
  // initialize the buffer for processed measurements records
  //
  if (fTreeData) {AliInfo("Data Records File is already initialized"); return kFALSE;} 
  //
  if (!fRecord) fRecord = new AliMillePedeRecord();
  //
  if (!read) { // write mode: cannot use chain
    fDataRecFile = TFile::Open(GetDataRecFName(),"recreate");
    if (!fDataRecFile) {AliFatal(Form("Failed to initialize data records file %s",GetDataRecFName())); return kFALSE;}
    AliInfo(Form("File %s used for derivatives records",GetDataRecFName()));
    fTreeData = new TTree(GetRecDataTreeName(),"Data Records for AliMillePede2");
    fTreeData->Branch(GetRecDataBranchName(),"AliMillePedeRecord",&fRecord,32000,99);
  }
  else { // use chain
    TChain* ch = new TChain(GetRecDataTreeName());
    //
    if (fDataRecFName.EndsWith(".root")) ch->AddFile(fDataRecFName);
    else { // assume text file with list of filenames
      //
      ifstream inpf(fDataRecFName.Data());
      if (!inpf.good()) {AliInfo(Form("Failed on input records list %s\n",fDataRecFName.Data())); return kFALSE;}
      //
      TString recfName;
      while ( !(recfName.ReadLine(inpf)).eof() ) {
	recfName = recfName.Strip(TString::kBoth,' ');
	if (recfName.BeginsWith("//") || recfName.BeginsWith("#") || !recfName.EndsWith(".root")) {  // comment
	  AliInfo(Form("Skip %s\n",recfName.Data()));
	  continue;
	}
	//
	recfName = recfName.Strip(TString::kBoth,',');
	recfName = recfName.Strip(TString::kBoth,'"');
	gSystem->ExpandPathName(recfName);
	printf("Adding %s\n",recfName.Data());
	ch->AddFile(recfName.Data());
      }      
    }
    //
    Long64_t nent = ch->GetEntries();
    if (nent<1) { AliInfo("Obtained chain is empty"); return kFALSE;}
    fTreeData = ch;
    fTreeData->SetBranchAddress(GetRecDataBranchName(),&fRecord);
    AliInfo(Form("Found %lld derivatives records",nent));
  }
  fCurrRecDataID = -1;
  fRecFileStatus = read ? 1:2;
  //
  return kTRUE;
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::InitConsRecStorage(Bool_t read)
{
  // initialize the buffer for processed measurements records
  //
  if (fConsRecFile) {AliInfo("Constraints Records File is already initialized"); return kFALSE;} 
  //
  if (!fRecord) fRecord = new AliMillePedeRecord();
  //
  fConsRecFile = TFile::Open(GetConsRecFName(),read ? "":"recreate");
  if (!fConsRecFile) {AliInfo(Form("Failed to initialize constraints records file %s",GetConsRecFName())); return kFALSE;}
  //
  AliInfo(Form("File %s used for constraints records",GetConsRecFName()));
  if (read) {
    fTreeConstr = (TTree*)fConsRecFile->Get(GetRecConsTreeName());
    if (!fTreeConstr) {AliInfo(Form("Did not find constraints records tree in %s",GetConsRecFName())); return kFALSE;}
    fTreeConstr->SetBranchAddress(GetRecConsBranchName(),&fRecord);
    AliInfo(Form("Found %lld constraints records",fTreeConstr->GetEntries()));
    //
  }
  else {
    //
    fTreeConstr = new TTree(GetRecConsTreeName(),"Constraints Records for AliMillePede2");
    fTreeConstr->Branch(GetRecConsBranchName(),"AliMillePedeRecord",&fRecord,32000,99);
  }
  fCurrRecConstrID = -1;
  //
  return kTRUE;
}

//_____________________________________________________________________________________________
void AliMillePede2::CloseDataRecStorage()
{
  // close records file
  if (fTreeData) {
    if (fDataRecFile && fDataRecFile->IsWritable()) {
      fDataRecFile->cd();
      fTreeData->Write();
    }
    delete fTreeData;  
    fTreeData = 0;
    if (fDataRecFile) {
      fDataRecFile->Close();
      delete fDataRecFile;
      fDataRecFile = 0;
    }
  }
  fRecFileStatus = 0;
  //
}

//_____________________________________________________________________________________________
void AliMillePede2::CloseConsRecStorage()
{
  // close constraints file
  if (fTreeConstr) {
    if (fConsRecFile->IsWritable()) {
      fConsRecFile->cd();
      fTreeConstr->Write();
    }
    delete fTreeConstr;  
    fTreeConstr = 0;
    fConsRecFile->Close();
    delete fConsRecFile;
    fConsRecFile = 0;
  }
  //
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::ReadNextRecordData()
{
  // read next data record (if any)
  if (!fTreeData || ++fCurrRecDataID >= fTreeData->GetEntries()) { fCurrRecDataID--; return kFALSE;}
  fTreeData->GetEntry(fCurrRecDataID);
  return kTRUE;
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::ReadNextRecordConstraint()
{
  // read next constraint record (if any)
  if (!fTreeConstr || ++fCurrRecConstrID >= fTreeConstr->GetEntries()) { fCurrRecConstrID--; return kFALSE;}
  fTreeConstr->GetEntry(fCurrRecConstrID);
  return kTRUE;
}

//_____________________________________________________________________________________________
void AliMillePede2::SetRecordWeight(double wgh)
{
  // assign weight
  if (fRecFileStatus<2) InitDataRecStorage(); // create a buffer to store the data
  fRecord->SetWeight(wgh);
}

//_____________________________________________________________________________________________
void AliMillePede2::SetRecordRun(Int_t run)
{
  // assign run
  if (fRecFileStatus<2) InitDataRecStorage(); // create a buffer to store the data
  fRecord->SetRunID(run);
}

//_____________________________________________________________________________________________
void AliMillePede2::SetLocalEquation(double *dergb, double *derlc, double lMeas, double lSigma)
{
  // assing derivs of loc.eq.
  if (fRecFileStatus<2) InitDataRecStorage(); // create a buffer to store the data
  //
  // write data of single measurement
  if (lSigma<=0.0) { // If parameter is fixed, then no equation
    for (int i=fNLocPar; i--;) derlc[i] = 0.0;
    for (int i=fNGloParIni; i--;) dergb[i] = 0.0;
    return;
  }
  //
  fRecord->AddResidual(lMeas);
  //
  // Retrieve local param interesting indices
  for (int i=0;i<fNLocPar;i++) if (!IsZero(derlc[i])) {fRecord->AddIndexValue(i,derlc[i]); derlc[i] = 0.0;}
  //
  fRecord->AddWeight( 1.0/lSigma/lSigma );
  //
  // Idem for global parameters
  for (int i=0;i<fNGloParIni;i++) if (!IsZero(dergb[i])) {
    fRecord->AddIndexValue(i,dergb[i]); dergb[i] = 0.0;
    int idrg = GetRGId(i);
    fRecord->MarkGroup(idrg<0 ? -1 : fParamGrID[i]);
  }
  //  fRecord->Print();
  //
}

//_____________________________________________________________________________________________
void AliMillePede2::SetLocalEquation(int *indgb, double *dergb, int ngb, int *indlc,
				     double *derlc,int nlc,double lMeas,double lSigma)
{	
  // write data of single measurement. Note: the records ignore regrouping, store direct parameters
  if (lSigma<=0.0) { // If parameter is fixed, then no equation
    for (int i=nlc;i--;)  derlc[i] = 0.0;
    for (int i=ngb;i--;)  dergb[i] = 0.0;
    return;
  }
  //
  if (fRecFileStatus<2) InitDataRecStorage(); // create a buffer to store the data
  //
  fRecord->AddResidual(lMeas);
  //
  // Retrieve local param interesting indices
  for (int i=0;i<nlc;i++) if (!IsZero(derlc[i])) {fRecord->AddIndexValue(indlc[i],derlc[i]); derlc[i]=0.; indlc[i]=0;}
  //
  fRecord->AddWeight( 1./lSigma/lSigma );
  //
  // Idem for global parameters
  for (int i=0;i<ngb;i++) if (!IsZero(dergb[i])) {fRecord->AddIndexValue(indgb[i],dergb[i]); dergb[i]=0.; indgb[i]=0;} 
  //
}


//_____________________________________________________________________________________________
void AliMillePede2::SetGlobalConstraint(const double *dergb, double val, double sigma)
{	
  // Define a constraint equation.
  if (!fConsRecFile || !fConsRecFile->IsWritable()) InitConsRecStorage(); // create a buffer to store the data
  //
  fRecord->Reset();
  fRecord->AddResidual(val);
  fRecord->AddWeight(sigma);
  for (int i=0; i<fNGloParIni; i++) if (!IsZero(dergb[i])) fRecord->AddIndexValue(i,dergb[i]);
  fNGloConstraints++;
  if (IsZero(sigma)) fNLagrangeConstraints++;
  //  printf("NewConstraint:\n"); fRecord->Print(); //RRR
  SaveRecordConstraint();
  //
}

//_____________________________________________________________________________________________
void AliMillePede2::SetGlobalConstraint(const int *indgb, const double *dergb, int ngb, double val,double sigma)
{	
  // Define a constraint equation.
  if (!fConsRecFile || !fConsRecFile->IsWritable()) InitConsRecStorage(); // create a buffer to store the data
  fRecord->Reset();
  fRecord->AddResidual(val);
  fRecord->AddWeight(sigma);   // dummy
  for (int i=0; i<ngb; i++) if (!IsZero(dergb[i]))  fRecord->AddIndexValue(indgb[i],dergb[i]);
  fNGloConstraints++;
  if (IsZero(sigma)) fNLagrangeConstraints++;
  SaveRecordConstraint();
  //
}

//_____________________________________________________________________________________________
Int_t AliMillePede2::LocalFit(double *localParams)
{
  /*
    Perform local parameters fit once all the local equations have been set
    -----------------------------------------------------------
    localParams = (if !=0) will contain the fitted track parameters and
    related errors
  */
  static int     nrefSize = 0;
  //  static TArrayI refLoc,refGlo,nrefLoc,nrefGlo;
  static Int_t  *refLoc=0,*refGlo=0,*nrefLoc=0,*nrefGlo=0;
  int nPoints = 0;
  //
  AliSymMatrix    &matCLoc    = *fMatCLoc;
  AliMatrixSq     &matCGlo    = *fMatCGlo;
  AliRectMatrix   &matCGloLoc = *fMatCGloLoc;
  //
  memset(fVecBLoc,0,fNLocPar*sizeof(double));
  matCLoc.Reset();	
  //
  int cnt=0;
  int recSz = fRecord->GetSize();
  //
  while(cnt<recSz) {  // Transfer the measurement records to matrices
    //
    // extract addresses of residual, weight and pointers on local and global derivatives for each point
    if (nrefSize<=nPoints) {
      int *tmpA = 0;
      nrefSize = 2*(nPoints+1); 
      tmpA = refLoc;  refLoc  = new Int_t[nrefSize]; if (tmpA) memcpy(refLoc,tmpA,nPoints*sizeof(int));
      tmpA = refGlo;  refGlo  = new Int_t[nrefSize]; if (tmpA) memcpy(refGlo,tmpA,nPoints*sizeof(int));
      tmpA = nrefLoc; nrefLoc = new Int_t[nrefSize]; if (tmpA) memcpy(nrefLoc,tmpA,nPoints*sizeof(int));
      tmpA = nrefGlo; nrefGlo = new Int_t[nrefSize]; if (tmpA) memcpy(nrefGlo,tmpA,nPoints*sizeof(int));
    }
    //
    refLoc[nPoints]  = ++cnt;
    int nLoc = 0;
    while(!fRecord->IsWeight(cnt)) {nLoc++; cnt++;}
    nrefLoc[nPoints] = nLoc;
    //
    refGlo[nPoints]  = ++cnt;
    int nGlo = 0;
    while(!fRecord->IsResidual(cnt) && cnt<recSz) {nGlo++; cnt++;} 
    nrefGlo[nPoints] = nGlo;
    //
    nPoints++;
  }
  if (fMinRecordLength>0 && nPoints < fMinRecordLength) return 0; // ignore
  //
  double vl;
  //
  double gloWgh = fRunWgh;
  if (fUseRecordWeight) gloWgh *= fRecord->GetWeight(); // global weight for this set
  Int_t maxLocUsed = 0;
  //
  for (int ip=nPoints;ip--;) {  // Transfer the measurement records to matrices
    double  resid  = fRecord->GetValue( refLoc[ip]-1 );
    double  weight = fRecord->GetValue( refGlo[ip]-1 )*gloWgh;
    int odd = (ip&0x1);
    if (fWghScl[odd]>0) weight *= fWghScl[odd];
    double *derLoc = fRecord->GetValue()+refLoc[ip];
    double *derGlo = fRecord->GetValue()+refGlo[ip];
    int    *indLoc = fRecord->GetIndex()+refLoc[ip];
    int    *indGlo = fRecord->GetIndex()+refGlo[ip];
    //
    for (int i=nrefGlo[ip];i--;) {      // suppress the global part (only relevant with iterations)
      //
      // if regrouping was requested, do it here
      if (fkReGroup) {
	int idtmp = fkReGroup[ indGlo[i] ];
	if (idtmp == kFixParID) indGlo[i] = kFixParID; // fixed param in regrouping 
	else                    indGlo[i] = idtmp;
      }
      //
      int iID = indGlo[i];              // Global param indice
      if (iID<0 || fSigmaPar[iID]<=0.) continue;                              // fixed parameter RRRCheck
      if (fIsLinear[iID]) resid -= derGlo[i]*(fInitPar[iID]+fDeltaPar[iID]);  // linear parameter
      else                resid -= derGlo[i]*fDeltaPar[iID];                  // nonlinear parameter
    }
    //
    // Symmetric matrix, don't bother j>i coeffs
    for (int i=nrefLoc[ip];i--;) {         // Fill local matrix and vector
      fVecBLoc[ indLoc[i] ] += weight*resid*derLoc[i];
      if (indLoc[i]>maxLocUsed) maxLocUsed = indLoc[i];  
      for (int j=i+1;j--;) matCLoc(indLoc[i] ,indLoc[j]) += weight*derLoc[i]*derLoc[j];
    }
    //
  } // end of the transfer of the measurement record to matrices
  //
  matCLoc.SetSizeUsed(++maxLocUsed);   // data with B=0 may use less than declared nLocals 
  //
  /* //RRR
  fRecord->Print("l");
  printf("\nBefore\nLocalMatrix: "); matCLoc.Print("l");
  printf("RHSLoc: "); for (int i=0;i<fNLocPar;i++) printf("%+e |",fVecBLoc[i]); printf("\n");
  */
  // first try to solve by faster Cholesky decomposition, then by Gaussian elimination
  if (!matCLoc.SolveChol(fVecBLoc,kTRUE)) {
    AliInfo("Failed to solve locals by Cholesky, trying Gaussian Elimination");
    if (!matCLoc.SolveSpmInv(fVecBLoc,kTRUE)) { 
      AliInfo("Failed to solve locals by Gaussian Elimination, skip...");
      matCLoc.Print("d");
      return 0; // failed to solve
    }
  }
  //
  // If requested, store the track params and errors
  //RRR  printf("locfit: "); for (int i=0;i<fNLocPar;i++) printf("%+e |",fVecBLoc[i]); printf("\n");
  
  if (localParams) for (int i=maxLocUsed; i--;) {
      localParams[2*i]   = fVecBLoc[i];
      localParams[2*i+1] = TMath::Sqrt(TMath::Abs(matCLoc.QueryDiag(i)));
    }
  //
  float lChi2 = 0;
  int   nEq   = 0;
  //
  for (int ip=nPoints;ip--;) {  // Calculate residuals
    double  resid  = fRecord->GetValue( refLoc[ip]-1 );
    double  weight = fRecord->GetValue( refGlo[ip]-1 )*gloWgh;
    int odd = (ip&0x1);
    if (fWghScl[odd]>0) weight *= fWghScl[odd];
    double *derLoc = fRecord->GetValue()+refLoc[ip];
    double *derGlo = fRecord->GetValue()+refGlo[ip];
    int    *indLoc = fRecord->GetIndex()+refLoc[ip];
    int    *indGlo = fRecord->GetIndex()+refGlo[ip];
    //
    // Suppress local and global contribution in residuals;
    for (int i=nrefLoc[ip];i--;) resid -= derLoc[i]*fVecBLoc[ indLoc[i] ];     // local part 
    //
    for (int i=nrefGlo[ip];i--;) {                                             // global part
      int iID = indGlo[i];
      if ( iID<0 || fSigmaPar[iID] <= 0.) continue;                            // fixed parameter RRRCheck
      if (fIsLinear[iID]) resid -= derGlo[i]*(fInitPar[iID]+fDeltaPar[iID]);   // linear parameter
      else                resid -= derGlo[i]*fDeltaPar[iID];                   // nonlinear parameter
    }
    //
    // reject the track if the residual is too large (outlier)
    double absres = TMath::Abs(resid);
    if ( (absres >= fResCutInit && fIter ==1 ) ||
	 (absres >= fResCut     && fIter > 1)) {
      if (fLocFitAdd) fNLocFitsRejected++;      
      //      printf("reject res %5ld %+e\n",fCurrRecDataID,resid);
      return 0;
    }
    // 
    lChi2 += weight*resid*resid ; // total chi^2
    nEq++;                        // number of equations			
  } // end of Calculate residuals
  //
  lChi2 /= gloWgh;  
  int nDoF = nEq-maxLocUsed;
  lChi2 = (nDoF>0) ? lChi2/nDoF : 0;  // Chi^2/dof  
  //
  if (fNStdDev != 0 && nDoF>0 && lChi2 > Chi2DoFLim(fNStdDev,nDoF)*fChi2CutFactor) { // check final chi2
    if (fLocFitAdd) fNLocFitsRejected++;      
    //    printf("reject chi2 %5ld: %+e\n",fCurrRecDataID, lChi2);
    return 0;
  }
  //
  if (fLocFitAdd) {
    fNLocFits++;
    fNLocEquations += nEq;
  }
  else {
    fNLocFits--;
    fNLocEquations -= nEq;
  }
  //
  //  local operations are finished, track is accepted 
  //  We now update the global parameters (other matrices)
  //
  int nGloInFit = 0;
  //
  for (int ip=nPoints;ip--;) {  // Update matrices
    double  resid  = fRecord->GetValue( refLoc[ip]-1 );
    double  weight = fRecord->GetValue( refGlo[ip]-1 )*gloWgh;
    int odd = (ip&0x1);
    if (fWghScl[odd]>0) weight *= fWghScl[odd];
    double *derLoc = fRecord->GetValue()+refLoc[ip];
    double *derGlo = fRecord->GetValue()+refGlo[ip];
    int    *indLoc = fRecord->GetIndex()+refLoc[ip];
    int    *indGlo = fRecord->GetIndex()+refGlo[ip];
    //
    for (int i=nrefGlo[ip];i--;) {   // suppress the global part
      int iID = indGlo[i];           // Global param indice
      if ( iID<0 || fSigmaPar[iID] <= 0.) continue;                                // fixed parameter RRRCheck
      if (fIsLinear[iID])  resid -= derGlo[i]*(fInitPar[iID]+fDeltaPar[iID]);      // linear parameter
      else                 resid -= derGlo[i]*fDeltaPar[iID];                      // nonlinear parameter
    }
    //
    for (int ig=nrefGlo[ip];ig--;) {
      int iIDg = indGlo[ig];   // Global param indice (the matrix line)          
      if ( iIDg<0 || fSigmaPar[iIDg] <= 0.) continue;                              // fixed parameter RRRCheck
      if (fLocFitAdd) fVecBGlo[ iIDg ] += weight*resid*derGlo[ig]; //!!!
      else            fVecBGlo[ iIDg ] -= weight*resid*derGlo[ig]; //!!!
      //
      // First of all, the global/global terms (exactly like local matrix)
      int nfill = 0;
      for (int jg=ig+1;jg--;) {	// matCGlo is symmetric by construction  
	int jIDg = indGlo[jg];
	if ( jIDg<0 || fSigmaPar[jIDg] <= 0.) continue;                            // fixed parameter RRRCheck
	if ( !IsZero(vl = weight*derGlo[ig]*derGlo[jg]) ) {
	  fFillIndex[nfill]   = jIDg;
	  fFillValue[nfill++] = fLocFitAdd ? vl:-vl;
	}
      }
      if (nfill) matCGlo.AddToRow(iIDg,fFillValue,fFillIndex,nfill);
      //
      // Now we have also rectangular matrices containing global/local terms.
      int iCIDg = fGlo2CGlo[iIDg];  // compressed Index of index          
      if (iCIDg == -1) {
	Double_t *rowGL = matCGloLoc(nGloInFit);
	for (int k=maxLocUsed;k--;) rowGL[k] = 0.0;  // reset the row
	iCIDg = fGlo2CGlo[iIDg] = nGloInFit;
	fCGlo2Glo[nGloInFit++] = iIDg;
      }
      //
      Double_t *rowGLIDg = matCGloLoc(iCIDg);
      for (int il=nrefLoc[ip];il--;) rowGLIDg[ indLoc[il] ] += weight*derGlo[ig]*derLoc[il];
      fProcPnt[iIDg] += fLocFitAdd ? 1:-1;       // update counter
      //
    }
  } // end of Update matrices
  //
  /*//RRR
  printf("After GLO\n");
  printf("MatCLoc: "); fMatCLoc->Print("l");
  printf("MatCGlo: "); fMatCGlo->Print("l");
  printf("MatCGlLc:"); fMatCGloLoc->Print("l");
  printf("BGlo: "); for (int i=0; i<fNGloPar; i++) printf("%+e |",fVecBGlo[i]); printf("\n");
  */
  // calculate fMatCGlo -= fMatCGloLoc * fMatCLoc * fMatCGloLoc^T
  // and       fVecBGlo -= fMatCGloLoc * fVecBLoc
  //
  //-------------------------------------------------------------- >>>
  double vll;
  for (int iCIDg=0; iCIDg<nGloInFit; iCIDg++) {
    int iIDg = fCGlo2Glo[iCIDg];
    //
    vl = 0;
    Double_t *rowGLIDg =  matCGloLoc(iCIDg);
    for (int kl=0;kl<maxLocUsed;kl++) if (rowGLIDg[kl]) vl += rowGLIDg[kl]*fVecBLoc[kl];
    if  (!IsZero(vl)) fVecBGlo[iIDg] -= fLocFitAdd ? vl : -vl;
    //
    int nfill = 0;
    for (int jCIDg=0;jCIDg<=iCIDg; jCIDg++) {  
      int jIDg = fCGlo2Glo[jCIDg];
      //
      vl = 0;
      Double_t *rowGLJDg =  matCGloLoc(jCIDg);
      for (int kl=0;kl<maxLocUsed;kl++) {
	// diag terms
	if ( (!IsZero(vll=rowGLIDg[kl]*rowGLJDg[kl])) ) vl += matCLoc.QueryDiag(kl)*vll;
	//
	// off-diag terms
	for (int ll=0;ll<kl;ll++) {
	  if ( !IsZero(vll=rowGLIDg[kl]*rowGLJDg[ll]) ) vl += matCLoc(kl,ll)*vll;
	  if ( !IsZero(vll=rowGLIDg[ll]*rowGLJDg[kl]) ) vl += matCLoc(kl,ll)*vll;
	}
      }
      if (!IsZero(vl)) {
	fFillIndex[nfill]   = jIDg;
	fFillValue[nfill++] = fLocFitAdd ? -vl : vl;
      }
    }
    if (nfill) 	matCGlo.AddToRow(iIDg,fFillValue,fFillIndex,nfill);
  }
  //
  // reset compressed index array
  //
  /*//RRR
  printf("After GLOLoc\n");
  printf("MatCGlo: "); fMatCGlo->Print("");
  printf("BGlo: "); for (int i=0; i<fNGloPar; i++) printf("%+e |",fVecBGlo[i]); printf("\n");
  */
  for (int i=nGloInFit;i--;) { 
    fGlo2CGlo[ fCGlo2Glo[i] ] = -1;
    fCGlo2Glo[i] = -1;
  }
  //
  //---------------------------------------------------- <<<
  return 1;
}

//_____________________________________________________________________________________________
Int_t AliMillePede2::GlobalFit(Double_t *par, Double_t *error, Double_t *pull)
{
  // performs a requested number of global iterations
  fIter = 1;
  //
  TStopwatch sw; sw.Start();
  //
  int res = 0;
  AliInfo("Starting Global fit.");
  while (fIter<=fMaxIter) {
    //
    res = GlobalFitIteration();
    if (!res) break;
    //
    if (!IsZero(fChi2CutFactor-fChi2CutRef)) {    
      fChi2CutFactor = TMath::Sqrt(fChi2CutFactor);
      if (fChi2CutFactor < 1.2*fChi2CutRef) {
	fChi2CutFactor = fChi2CutRef;
	//RRR	fIter = fMaxIter - 1;     // Last iteration
      }
    }
    fIter++;
  }
  //
  sw.Stop();
  AliInfo(Form("Global fit %s, CPU time: %.1f",res ? "Converged":"Failed",sw.CpuTime()));  
  if (!res) return 0;
  //
  if (par) for (int i=fNGloParIni;i--;) par[i] = GetFinalParam(i);
  //
  if (fGloSolveStatus==kInvert) { // errors on params are available
    if (error) for (int i=fNGloParIni;i--;) error[i] = GetFinalError(i);
    if (pull)  for (int i=fNGloParIni;i--;) pull[i]  = GetPull(i);
  }
  //
  return 1;
}

//_____________________________________________________________________________________________
Int_t AliMillePede2::GlobalFitIteration()
{
  // perform global parameters fit once all the local equations have been fitted
  //
  AliInfo(Form("Global Fit Iteration#%2d (Local Fit Chi^2 cut factor: %.2f)",fIter,fChi2CutFactor));
  //
  if (!fNGloPar || !fTreeData) {
    AliInfo("No data was stored, stopping iteration");
    return 0;
  }
  TStopwatch sw,sws; 
  sw.Start();
  sws.Stop();
  //
  if (!fConstrUsed) {
    fConstrUsed = new Bool_t[fNGloConstraints];
    memset(fConstrUsed,0,fNGloConstraints*sizeof(Bool_t));
  }
  // Reset all info specific for this step
  AliMatrixSq& matCGlo = *fMatCGlo;
  matCGlo.Reset();
  memset(fProcPnt,0,fNGloPar*sizeof(Int_t));
  //
  fNGloConstraints = fTreeConstr ? fTreeConstr->GetEntries() : 0;
  //
  // count number of Lagrange constraints: they need new row/cols to be added
  fNLagrangeConstraints = 0;
  for (int i=0; i<fNGloConstraints; i++) {
    ReadRecordConstraint(i);
    if ( IsZero(fRecord->GetValue(1)) ) fNLagrangeConstraints++; // exact constraint (no error) -> Lagrange multiplier 
  }
  //
  // if needed, readjust the size of the global vector (for matrices this is done automatically)
  if (!fVecBGlo || fNGloSize!=fNGloPar+fNLagrangeConstraints) {
    delete[] fVecBGlo;   // in case some constraint was added between the two manual iterations
    fNGloSize = fNGloPar+fNLagrangeConstraints;
    fVecBGlo = new Double_t[fNGloSize];
  }
  memset(fVecBGlo,0,fNGloSize*sizeof(double));
  //
  fNLocFits         = 0;
  fNLocFitsRejected = 0;
  fNLocEquations    = 0;
  //
  //  Process data records and build the matrices
  Long_t ndr = fTreeData->GetEntries();
  Long_t first = fSelFirst>0  ? fSelFirst : 0;
  Long_t last  = fSelLast<1   ? ndr : (fSelLast>=ndr ? ndr : fSelLast+Long_t(1));
  ndr = last - first;
  //
  AliInfo(Form("Building the Global matrix from data records %ld : %ld",first,last));
  if (ndr<1) return 0;
  //
  TStopwatch swt; swt.Start();
  fLocFitAdd = kTRUE;  // add contributions of matching tracks
  for (Long_t i=0;i<ndr;i++) {
    Long_t iev = i+first;
    ReadRecordData(iev);
    if (!IsRecordAcceptable()) continue;
    LocalFit();
    if ( (i%int(0.2*ndr)) == 0) printf("%.1f%% of local fits done\n", double(100.*i)/ndr);
  }
  swt.Stop();
  printf("%ld local fits done: ", ndr);
  /*
  printf("MatCGlo: "); fMatCGlo->Print("l");
  printf("BGlo: "); for (int i=0; i<fNGloPar; i++) printf("%+e |",fVecBGlo[i]); printf("\n");
  swt.Print();
  */
  sw.Start(kFALSE);
  //
  //
  // ---------------------- Reject parameters with low statistics ------------>>
  fNGloFix = 0;
  if (fMinPntValid>1 && fNGroupsSet) {
    //
    printf("Checking parameters with statistics < %d\n",fMinPntValid);
    TStopwatch swsup;
    swsup.Start();
    // 1) build the list of parameters to fix
    Int_t fixArrSize = 10;
    Int_t nFixedGroups = 0;
    TArrayI fixGroups(fixArrSize);
    //
    int grIDold = -2;
    int oldStart = -1;
    double oldMin = 1.e20;
    double oldMax =-1.e20;
    //
    for (int i=fNGloPar;i--;) { // // Reset row and column of fixed params and add 1/sig^2 to free ones
      int grID = fParamGrID[i];
      if (grID<0) continue; // not in the group
      //
      if (grID!=grIDold) { // starting new group
	if (grIDold>=0) { // decide if the group has enough statistics
	  if (oldMin<fMinPntValid && oldMax<2*fMinPntValid) { // suppress group
	    for (int iold=oldStart;iold>i;iold--) fProcPnt[iold] = 0;
	    Bool_t fnd = kFALSE;    // check if the group is already accounted
	    for (int j=nFixedGroups;j--;) if (fixGroups[j]==grIDold) {fnd=kTRUE; break;}
	    if (!fnd) {
	      if (nFixedGroups>=fixArrSize) {fixArrSize*=2; fixGroups.Set(fixArrSize);}
	      fixGroups[nFixedGroups++] = grIDold; // add group to fix
	    }
	  }	  
	}
	grIDold = grID; // mark the start of the new group
	oldStart = i;
	oldMin =  1.e20;
	oldMax = -1.e20;
      }
      if (oldMin>fProcPnt[i]) oldMin = fProcPnt[i];
      if (oldMax<fProcPnt[i]) oldMax = fProcPnt[i];
      //
    }
    // extra check for the last group
    if (grIDold>=0 && oldMin<fMinPntValid && oldMax<2*fMinPntValid) { // suppress group
      for (int iold=oldStart;iold--;) fProcPnt[iold] = 0;
      Bool_t fnd = kFALSE;    // check if the group is already accounted
      for (int j=nFixedGroups;j--;) if (fixGroups[j]==grIDold) {fnd=kTRUE; break;}
      if (!fnd) {
	if (nFixedGroups>=fixArrSize) {fixArrSize*=2; fixGroups.Set(fixArrSize);}
	fixGroups[nFixedGroups++] = grIDold; // add group to fix
      }
    }
    //
    // 2) loop over records and add contributions of fixed groups with negative sign
    fLocFitAdd = kFALSE;
    //
    for (Long_t i=0;i<ndr;i++) {
      Long_t iev = i+first;
      ReadRecordData(iev);
      if (!IsRecordAcceptable()) continue;
      Bool_t suppr = kFALSE;
      for (int ifx=nFixedGroups;ifx--;)if (fRecord->IsGroupPresent(fixGroups[ifx])) suppr = kTRUE;
      if (suppr) LocalFit();
    }
    fLocFitAdd = kTRUE;
    //
    if (nFixedGroups) {
      printf("Suppressed contributions of groups with NPoints<%d :\n",fMinPntValid);
      for (int i=0;i<nFixedGroups;i++) printf("%d ",fixGroups[i]); printf("\n");
    }
    swsup.Stop();
    swsup.Print();
  }
  // ---------------------- Reject parameters with low statistics ------------<<
  //
  // add large number to diagonal of fixed params  
  //
  for (int i=fNGloPar;i--;) { // // Reset row and column of fixed params and add 1/sig^2 to free ones
    //    printf("#%3d : Nproc : %5d   grp: %d\n",i,fProcPnt[i],fParamGrID[i]);
    if (fProcPnt[i]<1) {
      fNGloFix++; 
      fVecBGlo[i] = 0.;
      matCGlo.DiagElem(i) = 1.;//float(fNLocEquations*fNLocEquations);
      //      matCGlo.DiagElem(i) = float(fNLocEquations*fNLocEquations);
    }
    else matCGlo.DiagElem(i) += (fgWeightSigma ? fProcPnt[i] : 1.)/(fSigmaPar[i]*fSigmaPar[i]);
  }
  //
  for (int i=fNGloPar;i--;) fDiagCGlo[i] = matCGlo.QueryDiag(i); // save the diagonal elements  
  //
  // add constraint equations
  int nVar = fNGloPar;                    // Current size of global matrix	
  for (int i=0; i<fNGloConstraints; i++) {
    ReadRecordConstraint(i);
    double val   = fRecord->GetValue(0);  
    double sig   = fRecord->GetValue(1);  
    int    *indV = fRecord->GetIndex()+2;
    double *der  = fRecord->GetValue()+2;
    int    csize = fRecord->GetSize()-2;
    //
    if (fkReGroup) {
      for (int jp=csize;jp--;) {
	int idp = indV[jp];
	if (fkReGroup[idp]<0) AliFatal(Form("Constain is requested for suppressed parameter #%d",indV[jp]));
	indV[jp] = idp;
      }
    }
    // check if after suppression of fixed variables there are non-0 derivatives
    // and determine the max statistics of involved params
    int nSuppressed = 0;
    int maxStat = 1;
    for (int j=csize;j--;) {
      if (fProcPnt[indV[j]]<1) nSuppressed++; 
      else {
	maxStat = TMath::Max(maxStat,fProcPnt[indV[j]]);
      }
    }
    //
    if (nSuppressed==csize) {
      //      AliInfo(Form("Neglecting constraint %d of %d derivatives since no free parameters left",i,csize));
      //
      // was this constraint ever created ? 
      if ( sig==0 && fConstrUsed[i] ) { // this is needed only for constraints with Lagrange multiplier
	// to avoid empty row impose dummy constraint on "Lagrange multiplier"
	matCGlo.DiagElem(nVar) = 1.;
	fVecBGlo[nVar++] = 0;
      }
      continue;
    }
    //
    // account for already accumulated corrections
    for (int j=csize; j--;) val -= der[j]*(fInitPar[ indV[j] ]+fDeltaPar[ indV[j] ]);
    //
    if (sig > 0) {  // this is a gaussian constriant: no Lagrange multipliers are added
      //
      double sig2i = (fgWeightSigma ? TMath::Sqrt(maxStat) : 1.)/sig/sig;
      for (int ir=0;ir<csize;ir++) {
	int iID = indV[ir];
	for (int ic=0;ic<=ir;ic++) { // matrix is symmetric
	  int jID = indV[ic];
	  double vl = der[ir]*der[ic]*sig2i;
	  if (!IsZero(vl)) matCGlo(iID,jID) += vl;
	}
	fVecBGlo[iID] += val*der[ir]*sig2i;
      }
    }
    else {   // this is exact constriant:  Lagrange multipliers must be added
      for (int j=csize; j--;) {
	int jID = indV[j];
	if (fProcPnt[jID]<1) continue;                      // this parameter was fixed, don't put it into constraint
	matCGlo(nVar,jID) = float(fNLocEquations)*der[j];   // fMatCGlo is symmetric, only lower triangle is filled  
      }
      //
      if (matCGlo.QueryDiag(nVar)) matCGlo.DiagElem(nVar) = 0.0;
      fVecBGlo[nVar++] = float(fNLocEquations)*val; //RS ? should we use here fNLocFits ? 
      fConstrUsed[i] = kTRUE;
    }
  }
  //
  AliInfo(Form("Obtained %-7ld equations from %-7ld records (%-7ld rejected). Fixed %-4d globals",
	       fNLocEquations,fNLocFits,fNLocFitsRejected,fNGloFix));

  //
  sws.Start();

#ifdef _DUMP_EQ_BEFORE_
  const char* faildumpB = Form("mp2eq_before%d.dat",fIter);
  int defoutB = dup(1);
  if (defoutB<0) {AliFatal("Failed on dup"); exit(1);}
  int slvDumpB = open(faildumpB, O_RDWR|O_CREAT, 0666);
  if (slvDumpB>=0) {
    dup2(slvDumpB,1);
    printf("Solving%d for %d params\n",fIter,fNGloSize);
    matCGlo.Print("10");
    for (int i=0;i<fNGloSize;i++) printf("b%2d : %+.10f\n",i,fVecBGlo[i]);
  }
  dup2(defoutB,1);
  close(slvDumpB);
  close(defoutB);

#endif
  /*
  printf("Solving:\n");
  matCGlo.Print("l");
  for (int i=0;i<fNGloSize;i++) printf("b%2d : %+e\n",i,fVecBGlo[i]);
  */
#ifdef _DUMPEQ_BEFORE_  
  const char* faildumpB = Form("mp2eq_before%d.dat",fIter);
  int defoutB = dup(1);
  int slvDumpB = open(faildumpB, O_RDWR|O_CREAT, 0666);
  dup2(slvDumpB,1);
  //
  printf("#Equation before step %d\n",fIter);
  fMatCGlo->Print("10");
  printf("#RHS/STAT : NGlo:%d NGloSize:%d\n",fNGloPar,fNGloSize);
  for (int i=0;i<fNGloSize;i++) printf("%d %+.10f %d\n",i,fVecBGlo[i],fProcPnt[i]);
  //
  dup2(defoutB,1);
  close(slvDumpB);
  close(defoutB);
#endif
  //
  fGloSolveStatus = SolveGlobalMatEq();                     // obtain solution for this step
#ifdef _DUMPEQ_AFTER_  
  const char* faildumpA = Form("mp2eq_after%d.dat",fIter);
  int defoutA = dup(1);
  int slvDumpA = open(faildumpA, O_RDWR|O_CREAT, 0666);
  dup2(slvDumpA,1);
  //
  printf("#Matrix after step %d\n",fIter);
  fMatCGlo->Print("10");
  printf("#RHS/STAT : NGlo:%d NGloSize:%d\n",fNGloPar,fNGloSize);
  for (int i=0;i<fNGloSize;i++) printf("%d %+.10f %d\n",i,fVecBGlo[i],fProcPnt[i]);
  //
  dup2(defoutA,1);
  close(slvDumpA);
  close(defoutA);
#endif
  //
  sws.Stop();
  printf("Solve %d |",fIter); sws.Print();
  //
  sw.Stop();
  AliInfo(Form("Iteration#%2d %s. CPU time: %.1f",fIter,fGloSolveStatus==kFailed ? "Failed":"Converged",sw.CpuTime()));
  if (fGloSolveStatus==kFailed) return 0;
  //
  for (int i=fNGloPar;i--;) fDeltaPar[i] += fVecBGlo[i];    // Update global parameters values (for iterations)

#ifdef _DUMP_EQ_AFTER_
  const char* faildumpA = Form("mp2eq_after%d.dat",fIter);
  int defoutA = dup(1);
  if (defoutA<0) {AliFatal("Failed on dup"); exit(1);}
  int slvDumpA = open(faildumpA, O_RDWR|O_CREAT, 0666);
  if (slvDumpA>=0) {
    dup2(slvDumpA,1);
    printf("Solving%d for %d params\n",fIter,fNGloSize);
    matCGlo.Print("10");
    for (int i=0;i<fNGloSize;i++) printf("b%2d : %+.10f\n",i,fVecBGlo[i]);
  }
  dup2(defoutA,1);
  close(slvDumpA);
  close(defoutA);
#endif
  //
  /*
  printf("Solved:\n");
  matCGlo.Print("l");
  for (int i=0;i<fNGloSize;i++) printf("b%2d : %+e (->%+e)\n",i,fVecBGlo[i], fDeltaPar[i]);
  */

  PrintGlobalParameters();
  return 1;
}

//_____________________________________________________________________________________________
Int_t AliMillePede2::SolveGlobalMatEq()
{
  //
  // solve global matrix equation MatCGlob*X=VecBGlo and store the result in the VecBGlo
  //
  /*
  printf("GlobalMatrix\n");
  fMatCGlo->Print("l");
  printf("RHS\n");
  for (int i=0;i<fNGloPar;i++) printf("%d %+e\n",i,fVecBGlo[i]);
  */
  //
  if (!fgIsMatGloSparse) {
    //
    if (fNLagrangeConstraints==0) { // pos-def systems are faster to solve by Cholesky
      if ( ((AliSymMatrix*)fMatCGlo)->SolveChol(fVecBGlo, fgInvChol) ) return fgInvChol ? kInvert:kNoInversion;
      else AliInfo("Solution of Global Dense System by Cholesky failed, trying Gaussian Elimiation");
    }
    //
    if (((AliSymMatrix*)fMatCGlo)->SolveSpmInv(fVecBGlo, kTRUE)) return kInvert;
    else AliInfo("Solution of Global Dense System by Gaussian Elimination failed, trying iterative methods");
  }
  // try to solve by minres
  TVectorD sol(fNGloSize);
  //
  AliMinResSolve *slv = new AliMinResSolve(fMatCGlo,fVecBGlo);
  if (!slv) return kFailed;
  //
  Bool_t res = kFALSE;
  if      (fgIterSol == AliMinResSolve::kSolMinRes) 
    res =  slv->SolveMinRes(sol,fgMinResCondType,fgMinResMaxIter,fgMinResTol);
  else if (fgIterSol == AliMinResSolve::kSolFGMRes) 
    res =  slv->SolveFGMRES(sol,fgMinResCondType,fgMinResMaxIter,fgMinResTol,fgNKrylovV);
  else 
    AliInfo(Form("Undefined Iteritive Solver ID=%d, only %d are defined",fgIterSol,AliMinResSolve::kNSolvers));
  //
  if (!res) {
    const char* faildump = "fgmr_failed.dat";
    int defout = dup(1);
    if (defout<0) {
      AliInfo("Failed on dup");
      return kFailed;
    }
    int slvDump = open(faildump, O_RDWR|O_CREAT, 0666);
    if (slvDump>=0) {
      dup2(slvDump,1);
      //
      printf("#Failed to solve using solver %d with PreCond: %d MaxIter: %d Tol: %e NKrylov: %d\n",
	     fgIterSol,fgMinResCondType,fgMinResMaxIter,fgMinResTol,fgNKrylovV);
      printf("#Dump of matrix:\n");
      fMatCGlo->Print("10");
      printf("#Dump of RHS:\n");
      for (int i=0;i<fNGloSize;i++) printf("%d %+.10f\n",i,fVecBGlo[i]);
      //
      dup2(defout,1);
      close(slvDump);
      close(defout);
      printf("#Dumped failed matrix and RHS to %s\n",faildump);
    }
    else AliInfo("Failed on file open for matrix dumping");
    close(defout);
    return kFailed;
  }
  for (int i=fNGloSize;i--;) fVecBGlo[i] = sol[i];
  //
  return kNoInversion;
  //
}

//_____________________________________________________________________________________________
Float_t AliMillePede2::Chi2DoFLim(int nSig, int nDoF) const
{
  /// return the limit in chi^2/nd for n sigmas stdev authorized
  // Only n=1, 2, and 3 are expected in input
  int lNSig;
  float sn[3]        =	{0.47523, 1.690140, 2.782170};
  float table[3][30] = {{1.0000, 1.1479, 1.1753, 1.1798, 1.1775, 1.1730, 1.1680, 1.1630,
			 1.1581, 1.1536, 1.1493, 1.1454, 1.1417, 1.1383, 1.1351, 1.1321,
			 1.1293, 1.1266, 1.1242, 1.1218, 1.1196, 1.1175, 1.1155, 1.1136,
			 1.1119, 1.1101, 1.1085, 1.1070, 1.1055, 1.1040},
			{4.0000, 3.0900, 2.6750, 2.4290, 2.2628, 2.1415, 2.0481, 1.9736,
			 1.9124, 1.8610, 1.8171, 1.7791, 1.7457, 1.7161, 1.6897, 1.6658,
			 1.6442, 1.6246, 1.6065, 1.5899, 1.5745, 1.5603, 1.5470, 1.5346,
			 1.5230, 1.5120, 1.5017, 1.4920, 1.4829, 1.4742},
			{9.0000, 5.9146, 4.7184, 4.0628, 3.6410, 3.3436, 3.1209, 2.9468,
			 2.8063, 2.6902, 2.5922, 2.5082, 2.4352, 2.3711, 2.3143, 2.2635,
			 2.2178, 2.1764, 2.1386, 2.1040, 2.0722, 2.0428, 2.0155, 1.9901,
			 1.9665, 1.9443, 1.9235, 1.9040, 1.8855, 1.8681}};
  
  if (nDoF < 1) {
    return 0.0;
  }
  else {  
    lNSig = TMath::Max(1,TMath::Min(nSig,3));
    
    if (nDoF <= 30) {    
      return table[lNSig-1][nDoF-1];
    }
    else { // approximation
      return ((sn[lNSig-1]+TMath::Sqrt(float(2*nDoF-3)))*
	      (sn[lNSig-1]+TMath::Sqrt(float(2*nDoF-3))))/float(2*nDoF-2);
    }
  }
}

//_____________________________________________________________________________________________
Int_t AliMillePede2::SetIterations(double lChi2CutFac)
{
  // Number of iterations is calculated from lChi2CutFac 
  fChi2CutFactor = TMath::Max(1.0, lChi2CutFac);
  //
  AliInfo(Form("Initial cut factor is %f",fChi2CutFactor));
  fIter = 1; // Initializes the iteration process
  return 1;
}

//_____________________________________________________________________________________________
Double_t AliMillePede2::GetParError(int iPar) const
{
  // return error for parameter iPar
  if (fGloSolveStatus==kInvert) {
    if (fkReGroup) iPar = fkReGroup[iPar];
    if (iPar<0) {
      //  AliDebug(2,Form("Parameter %d was suppressed in the regrouping",iPar)); 
      return 0;
    }
    double res = fMatCGlo->QueryDiag(iPar);
    if (res>=0) return TMath::Sqrt(res);
  } 
  return 0.;
}

//_____________________________________________________________________________________________
Double_t AliMillePede2::GetPull(int iPar) const
{
  // return pull for parameter iPar
  if (fGloSolveStatus==kInvert) {
    if (fkReGroup) iPar = fkReGroup[iPar];
    if (iPar<0) {
      //  AliDebug(2,Form("Parameter %d was suppressed in the regrouping",iPar)); 
      return 0;
    }
    //
    return fProcPnt[iPar]>0 && (fSigmaPar[iPar]*fSigmaPar[iPar]-fMatCGlo->QueryDiag(iPar))>0. && fSigmaPar[iPar]>0 
      ? fDeltaPar[iPar]/TMath::Sqrt(fSigmaPar[iPar]*fSigmaPar[iPar]-fMatCGlo->QueryDiag(iPar)) : 0;
  } 
  return 0.;
}


//_____________________________________________________________________________________________
Int_t AliMillePede2::PrintGlobalParameters() const
{
  ///  Print the final results into the logfile
  double lError = 0.;
  double lGlobalCor =0.;
	
  printf("\nMillePede2 output\n");
  printf("   Result of fit for global parameters\n");
  printf("   ===================================\n");
  printf("    I       initial       final       differ        lastcor        error       gcor       Npnt\n");
  printf("----------------------------------------------------------------------------------------------\n");
  //
  int lastPrintedId = -1;
  for (int i0=0; i0<fNGloParIni; i0++) {
    int i = GetRGId(i0); if (i<0) continue;
    if (i!=i0 && lastPrintedId>=0 && i<=lastPrintedId) continue; // grouped param
    lastPrintedId = i;
    lError = GetParError(i0);
    lGlobalCor = 0.0;
    //		
    double dg;
    if (fGloSolveStatus==kInvert && TMath::Abs( (dg=fMatCGlo->QueryDiag(i)) *fDiagCGlo[i]) > 0) {    
      lGlobalCor = TMath::Sqrt(TMath::Abs(1.0-1.0/(dg*fDiagCGlo[i])));
      printf("%4d(%4d)\t %+.6f\t %+.6f\t %+.6f\t %.6f\t %.6f\t %.6f\t %6d\n",
	     i,i0,fInitPar[i],fInitPar[i]+fDeltaPar[i],fDeltaPar[i],fVecBGlo[i],lError,lGlobalCor,fProcPnt[i]);
    }
    else {    
      printf("%4d (%4d)\t %+.6f\t %+.6f\t %+.6f\t %.6f\t OFF\t OFF\t %6d\n",i,i0,fInitPar[i],fInitPar[i]+fDeltaPar[i],
	     fDeltaPar[i],fVecBGlo[i],fProcPnt[i]);
    }
  }
  return 1;
}

//_____________________________________________________________________________________________
Bool_t AliMillePede2::IsRecordAcceptable()
{
  // validate record according run lists set by the user
  static Long_t prevRunID = kMaxInt;
  static Bool_t prevAns   = kTRUE;
  Long_t runID = fRecord->GetRunID();
  if (runID!=prevRunID) {
    int n = 0;
    fRunWgh = 1.;
    prevRunID = runID;
    // is run to be rejected?
    if (fRejRunList && (n=fRejRunList->GetSize())) {
      prevAns = kTRUE;
      for (int i=n;i--;) if (runID == (*fRejRunList)[i]) {
	  prevAns = kFALSE; 
	  AliInfo(Form("New Run to reject: %ld",runID));
	  break;
	}
    }
    else if (fAccRunList && (n=fAccRunList->GetSize())) {     // is run specifically selected
      prevAns = kFALSE;
      for (int i=n;i--;) if (runID == (*fAccRunList)[i]) {
        prevAns = kTRUE; 
	if (fAccRunListWgh) fRunWgh = (*fAccRunListWgh)[i]; 
        AliInfo(Form("New Run to accept explicitly: %ld, weight=%f",runID,fRunWgh));
	break;
      }
      if (!prevAns) AliInfo(Form("New Run is not in the list to accept: %ld",runID)); 
    }
  }
  //
  return prevAns;
  //
}

//_____________________________________________________________________________________________
void AliMillePede2::SetRejRunList(const UInt_t *runs, Int_t nruns)
{
  // set the list of runs to be rejected
  if (fRejRunList) delete fRejRunList; 
  fRejRunList = 0;
  if (nruns<1 || !runs) return;
  fRejRunList = new TArrayL(nruns);
  for (int i=0;i<nruns;i++) (*fRejRunList)[i] = runs[i];
}

//_____________________________________________________________________________________________
void AliMillePede2::SetAccRunList(const UInt_t *runs, Int_t nruns, const Float_t* wghList)
{
  // set the list of runs to be selected
  if (fAccRunList) delete fAccRunList;
  if (fAccRunListWgh) delete fAccRunListWgh;
  fAccRunList = 0;
  if (nruns<1 || !runs) return;
  fAccRunList = new TArrayL(nruns);
  fAccRunListWgh = new TArrayF(nruns);
  for (int i=0;i<nruns;i++) {
    (*fAccRunList)[i] = runs[i];
    (*fAccRunListWgh)[i] =wghList ? wghList[i] : 1.0;
  }
}

//_____________________________________________________________________________________________
void AliMillePede2::SetInitPars(const Double_t* par) 
{
  // initialize parameters, account for eventual grouping
  for (int i=0;i<fNGloParIni;i++) {
    int id = GetRGId(i); if (id<0) continue;
    fInitPar[id] = par[i];
  }
}

//_____________________________________________________________________________________________
void AliMillePede2::SetSigmaPars(const Double_t* par) 
{
  // initialize sigmas, account for eventual grouping
  for (int i=0;i<fNGloParIni;i++) {
    int id = GetRGId(i); if (id<0) continue;
    fSigmaPar[id] = par[i];
  }
}

//_____________________________________________________________________________________________
void AliMillePede2::SetInitPar(Int_t i,Double_t par)
{
  // initialize param, account for eventual grouping
  int id = GetRGId(i); if (id<0) return;
  fInitPar[id] = par;
}

//_____________________________________________________________________________________________
void AliMillePede2::SetSigmaPar(Int_t i,Double_t par)
{
  // initialize sigma, account for eventual grouping
  int id = GetRGId(i); if (id<0) return;
  fSigmaPar[id] = par;
}


 AliMillePede2.cxx:1
 AliMillePede2.cxx:2
 AliMillePede2.cxx:3
 AliMillePede2.cxx:4
 AliMillePede2.cxx:5
 AliMillePede2.cxx:6
 AliMillePede2.cxx:7
 AliMillePede2.cxx:8
 AliMillePede2.cxx:9
 AliMillePede2.cxx:10
 AliMillePede2.cxx:11
 AliMillePede2.cxx:12
 AliMillePede2.cxx:13
 AliMillePede2.cxx:14
 AliMillePede2.cxx:15
 AliMillePede2.cxx:16
 AliMillePede2.cxx:17
 AliMillePede2.cxx:18
 AliMillePede2.cxx:19
 AliMillePede2.cxx:20
 AliMillePede2.cxx:21
 AliMillePede2.cxx:22
 AliMillePede2.cxx:23
 AliMillePede2.cxx:24
 AliMillePede2.cxx:25
 AliMillePede2.cxx:26
 AliMillePede2.cxx:27
 AliMillePede2.cxx:28
 AliMillePede2.cxx:29
 AliMillePede2.cxx:30
 AliMillePede2.cxx:31
 AliMillePede2.cxx:32
 AliMillePede2.cxx:33
 AliMillePede2.cxx:34
 AliMillePede2.cxx:35
 AliMillePede2.cxx:36
 AliMillePede2.cxx:37
 AliMillePede2.cxx:38
 AliMillePede2.cxx:39
 AliMillePede2.cxx:40
 AliMillePede2.cxx:41
 AliMillePede2.cxx:42
 AliMillePede2.cxx:43
 AliMillePede2.cxx:44
 AliMillePede2.cxx:45
 AliMillePede2.cxx:46
 AliMillePede2.cxx:47
 AliMillePede2.cxx:48
 AliMillePede2.cxx:49
 AliMillePede2.cxx:50
 AliMillePede2.cxx:51
 AliMillePede2.cxx:52
 AliMillePede2.cxx:53
 AliMillePede2.cxx:54
 AliMillePede2.cxx:55
 AliMillePede2.cxx:56
 AliMillePede2.cxx:57
 AliMillePede2.cxx:58
 AliMillePede2.cxx:59
 AliMillePede2.cxx:60
 AliMillePede2.cxx:61
 AliMillePede2.cxx:62
 AliMillePede2.cxx:63
 AliMillePede2.cxx:64
 AliMillePede2.cxx:65
 AliMillePede2.cxx:66
 AliMillePede2.cxx:67
 AliMillePede2.cxx:68
 AliMillePede2.cxx:69
 AliMillePede2.cxx:70
 AliMillePede2.cxx:71
 AliMillePede2.cxx:72
 AliMillePede2.cxx:73
 AliMillePede2.cxx:74
 AliMillePede2.cxx:75
 AliMillePede2.cxx:76
 AliMillePede2.cxx:77
 AliMillePede2.cxx:78
 AliMillePede2.cxx:79
 AliMillePede2.cxx:80
 AliMillePede2.cxx:81
 AliMillePede2.cxx:82
 AliMillePede2.cxx:83
 AliMillePede2.cxx:84
 AliMillePede2.cxx:85
 AliMillePede2.cxx:86
 AliMillePede2.cxx:87
 AliMillePede2.cxx:88
 AliMillePede2.cxx:89
 AliMillePede2.cxx:90
 AliMillePede2.cxx:91
 AliMillePede2.cxx:92
 AliMillePede2.cxx:93
 AliMillePede2.cxx:94
 AliMillePede2.cxx:95
 AliMillePede2.cxx:96
 AliMillePede2.cxx:97
 AliMillePede2.cxx:98
 AliMillePede2.cxx:99
 AliMillePede2.cxx:100
 AliMillePede2.cxx:101
 AliMillePede2.cxx:102
 AliMillePede2.cxx:103
 AliMillePede2.cxx:104
 AliMillePede2.cxx:105
 AliMillePede2.cxx:106
 AliMillePede2.cxx:107
 AliMillePede2.cxx:108
 AliMillePede2.cxx:109
 AliMillePede2.cxx:110
 AliMillePede2.cxx:111
 AliMillePede2.cxx:112
 AliMillePede2.cxx:113
 AliMillePede2.cxx:114
 AliMillePede2.cxx:115
 AliMillePede2.cxx:116
 AliMillePede2.cxx:117
 AliMillePede2.cxx:118
 AliMillePede2.cxx:119
 AliMillePede2.cxx:120
 AliMillePede2.cxx:121
 AliMillePede2.cxx:122
 AliMillePede2.cxx:123
 AliMillePede2.cxx:124
 AliMillePede2.cxx:125
 AliMillePede2.cxx:126
 AliMillePede2.cxx:127
 AliMillePede2.cxx:128
 AliMillePede2.cxx:129
 AliMillePede2.cxx:130
 AliMillePede2.cxx:131
 AliMillePede2.cxx:132
 AliMillePede2.cxx:133
 AliMillePede2.cxx:134
 AliMillePede2.cxx:135
 AliMillePede2.cxx:136
 AliMillePede2.cxx:137
 AliMillePede2.cxx:138
 AliMillePede2.cxx:139
 AliMillePede2.cxx:140
 AliMillePede2.cxx:141
 AliMillePede2.cxx:142
 AliMillePede2.cxx:143
 AliMillePede2.cxx:144
 AliMillePede2.cxx:145
 AliMillePede2.cxx:146
 AliMillePede2.cxx:147
 AliMillePede2.cxx:148
 AliMillePede2.cxx:149
 AliMillePede2.cxx:150
 AliMillePede2.cxx:151
 AliMillePede2.cxx:152
 AliMillePede2.cxx:153
 AliMillePede2.cxx:154
 AliMillePede2.cxx:155
 AliMillePede2.cxx:156
 AliMillePede2.cxx:157
 AliMillePede2.cxx:158
 AliMillePede2.cxx:159
 AliMillePede2.cxx:160
 AliMillePede2.cxx:161
 AliMillePede2.cxx:162
 AliMillePede2.cxx:163
 AliMillePede2.cxx:164
 AliMillePede2.cxx:165
 AliMillePede2.cxx:166
 AliMillePede2.cxx:167
 AliMillePede2.cxx:168
 AliMillePede2.cxx:169
 AliMillePede2.cxx:170
 AliMillePede2.cxx:171
 AliMillePede2.cxx:172
 AliMillePede2.cxx:173
 AliMillePede2.cxx:174
 AliMillePede2.cxx:175
 AliMillePede2.cxx:176
 AliMillePede2.cxx:177
 AliMillePede2.cxx:178
 AliMillePede2.cxx:179
 AliMillePede2.cxx:180
 AliMillePede2.cxx:181
 AliMillePede2.cxx:182
 AliMillePede2.cxx:183
 AliMillePede2.cxx:184
 AliMillePede2.cxx:185
 AliMillePede2.cxx:186
 AliMillePede2.cxx:187
 AliMillePede2.cxx:188
 AliMillePede2.cxx:189
 AliMillePede2.cxx:190
 AliMillePede2.cxx:191
 AliMillePede2.cxx:192
 AliMillePede2.cxx:193
 AliMillePede2.cxx:194
 AliMillePede2.cxx:195
 AliMillePede2.cxx:196
 AliMillePede2.cxx:197
 AliMillePede2.cxx:198
 AliMillePede2.cxx:199
 AliMillePede2.cxx:200
 AliMillePede2.cxx:201
 AliMillePede2.cxx:202
 AliMillePede2.cxx:203
 AliMillePede2.cxx:204
 AliMillePede2.cxx:205
 AliMillePede2.cxx:206
 AliMillePede2.cxx:207
 AliMillePede2.cxx:208
 AliMillePede2.cxx:209
 AliMillePede2.cxx:210
 AliMillePede2.cxx:211
 AliMillePede2.cxx:212
 AliMillePede2.cxx:213
 AliMillePede2.cxx:214
 AliMillePede2.cxx:215
 AliMillePede2.cxx:216
 AliMillePede2.cxx:217
 AliMillePede2.cxx:218
 AliMillePede2.cxx:219
 AliMillePede2.cxx:220
 AliMillePede2.cxx:221
 AliMillePede2.cxx:222
 AliMillePede2.cxx:223
 AliMillePede2.cxx:224
 AliMillePede2.cxx:225
 AliMillePede2.cxx:226
 AliMillePede2.cxx:227
 AliMillePede2.cxx:228
 AliMillePede2.cxx:229
 AliMillePede2.cxx:230
 AliMillePede2.cxx:231
 AliMillePede2.cxx:232
 AliMillePede2.cxx:233
 AliMillePede2.cxx:234
 AliMillePede2.cxx:235
 AliMillePede2.cxx:236
 AliMillePede2.cxx:237
 AliMillePede2.cxx:238
 AliMillePede2.cxx:239
 AliMillePede2.cxx:240
 AliMillePede2.cxx:241
 AliMillePede2.cxx:242
 AliMillePede2.cxx:243
 AliMillePede2.cxx:244
 AliMillePede2.cxx:245
 AliMillePede2.cxx:246
 AliMillePede2.cxx:247
 AliMillePede2.cxx:248
 AliMillePede2.cxx:249
 AliMillePede2.cxx:250
 AliMillePede2.cxx:251
 AliMillePede2.cxx:252
 AliMillePede2.cxx:253
 AliMillePede2.cxx:254
 AliMillePede2.cxx:255
 AliMillePede2.cxx:256
 AliMillePede2.cxx:257
 AliMillePede2.cxx:258
 AliMillePede2.cxx:259
 AliMillePede2.cxx:260
 AliMillePede2.cxx:261
 AliMillePede2.cxx:262
 AliMillePede2.cxx:263
 AliMillePede2.cxx:264
 AliMillePede2.cxx:265
 AliMillePede2.cxx:266
 AliMillePede2.cxx:267
 AliMillePede2.cxx:268
 AliMillePede2.cxx:269
 AliMillePede2.cxx:270
 AliMillePede2.cxx:271
 AliMillePede2.cxx:272
 AliMillePede2.cxx:273
 AliMillePede2.cxx:274
 AliMillePede2.cxx:275
 AliMillePede2.cxx:276
 AliMillePede2.cxx:277
 AliMillePede2.cxx:278
 AliMillePede2.cxx:279
 AliMillePede2.cxx:280
 AliMillePede2.cxx:281
 AliMillePede2.cxx:282
 AliMillePede2.cxx:283
 AliMillePede2.cxx:284
 AliMillePede2.cxx:285
 AliMillePede2.cxx:286
 AliMillePede2.cxx:287
 AliMillePede2.cxx:288
 AliMillePede2.cxx:289
 AliMillePede2.cxx:290
 AliMillePede2.cxx:291
 AliMillePede2.cxx:292
 AliMillePede2.cxx:293
 AliMillePede2.cxx:294
 AliMillePede2.cxx:295
 AliMillePede2.cxx:296
 AliMillePede2.cxx:297
 AliMillePede2.cxx:298
 AliMillePede2.cxx:299
 AliMillePede2.cxx:300
 AliMillePede2.cxx:301
 AliMillePede2.cxx:302
 AliMillePede2.cxx:303
 AliMillePede2.cxx:304
 AliMillePede2.cxx:305
 AliMillePede2.cxx:306
 AliMillePede2.cxx:307
 AliMillePede2.cxx:308
 AliMillePede2.cxx:309
 AliMillePede2.cxx:310
 AliMillePede2.cxx:311
 AliMillePede2.cxx:312
 AliMillePede2.cxx:313
 AliMillePede2.cxx:314
 AliMillePede2.cxx:315
 AliMillePede2.cxx:316
 AliMillePede2.cxx:317
 AliMillePede2.cxx:318
 AliMillePede2.cxx:319
 AliMillePede2.cxx:320
 AliMillePede2.cxx:321
 AliMillePede2.cxx:322
 AliMillePede2.cxx:323
 AliMillePede2.cxx:324
 AliMillePede2.cxx:325
 AliMillePede2.cxx:326
 AliMillePede2.cxx:327
 AliMillePede2.cxx:328
 AliMillePede2.cxx:329
 AliMillePede2.cxx:330
 AliMillePede2.cxx:331
 AliMillePede2.cxx:332
 AliMillePede2.cxx:333
 AliMillePede2.cxx:334
 AliMillePede2.cxx:335
 AliMillePede2.cxx:336
 AliMillePede2.cxx:337
 AliMillePede2.cxx:338
 AliMillePede2.cxx:339
 AliMillePede2.cxx:340
 AliMillePede2.cxx:341
 AliMillePede2.cxx:342
 AliMillePede2.cxx:343
 AliMillePede2.cxx:344
 AliMillePede2.cxx:345
 AliMillePede2.cxx:346
 AliMillePede2.cxx:347
 AliMillePede2.cxx:348
 AliMillePede2.cxx:349
 AliMillePede2.cxx:350
 AliMillePede2.cxx:351
 AliMillePede2.cxx:352
 AliMillePede2.cxx:353
 AliMillePede2.cxx:354
 AliMillePede2.cxx:355
 AliMillePede2.cxx:356
 AliMillePede2.cxx:357
 AliMillePede2.cxx:358
 AliMillePede2.cxx:359
 AliMillePede2.cxx:360
 AliMillePede2.cxx:361
 AliMillePede2.cxx:362
 AliMillePede2.cxx:363
 AliMillePede2.cxx:364
 AliMillePede2.cxx:365
 AliMillePede2.cxx:366
 AliMillePede2.cxx:367
 AliMillePede2.cxx:368
 AliMillePede2.cxx:369
 AliMillePede2.cxx:370
 AliMillePede2.cxx:371
 AliMillePede2.cxx:372
 AliMillePede2.cxx:373
 AliMillePede2.cxx:374
 AliMillePede2.cxx:375
 AliMillePede2.cxx:376
 AliMillePede2.cxx:377
 AliMillePede2.cxx:378
 AliMillePede2.cxx:379
 AliMillePede2.cxx:380
 AliMillePede2.cxx:381
 AliMillePede2.cxx:382
 AliMillePede2.cxx:383
 AliMillePede2.cxx:384
 AliMillePede2.cxx:385
 AliMillePede2.cxx:386
 AliMillePede2.cxx:387
 AliMillePede2.cxx:388
 AliMillePede2.cxx:389
 AliMillePede2.cxx:390
 AliMillePede2.cxx:391
 AliMillePede2.cxx:392
 AliMillePede2.cxx:393
 AliMillePede2.cxx:394
 AliMillePede2.cxx:395
 AliMillePede2.cxx:396
 AliMillePede2.cxx:397
 AliMillePede2.cxx:398
 AliMillePede2.cxx:399
 AliMillePede2.cxx:400
 AliMillePede2.cxx:401
 AliMillePede2.cxx:402
 AliMillePede2.cxx:403
 AliMillePede2.cxx:404
 AliMillePede2.cxx:405
 AliMillePede2.cxx:406
 AliMillePede2.cxx:407
 AliMillePede2.cxx:408
 AliMillePede2.cxx:409
 AliMillePede2.cxx:410
 AliMillePede2.cxx:411
 AliMillePede2.cxx:412
 AliMillePede2.cxx:413
 AliMillePede2.cxx:414
 AliMillePede2.cxx:415
 AliMillePede2.cxx:416
 AliMillePede2.cxx:417
 AliMillePede2.cxx:418
 AliMillePede2.cxx:419
 AliMillePede2.cxx:420
 AliMillePede2.cxx:421
 AliMillePede2.cxx:422
 AliMillePede2.cxx:423
 AliMillePede2.cxx:424
 AliMillePede2.cxx:425
 AliMillePede2.cxx:426
 AliMillePede2.cxx:427
 AliMillePede2.cxx:428
 AliMillePede2.cxx:429
 AliMillePede2.cxx:430
 AliMillePede2.cxx:431
 AliMillePede2.cxx:432
 AliMillePede2.cxx:433
 AliMillePede2.cxx:434
 AliMillePede2.cxx:435
 AliMillePede2.cxx:436
 AliMillePede2.cxx:437
 AliMillePede2.cxx:438
 AliMillePede2.cxx:439
 AliMillePede2.cxx:440
 AliMillePede2.cxx:441
 AliMillePede2.cxx:442
 AliMillePede2.cxx:443
 AliMillePede2.cxx:444
 AliMillePede2.cxx:445
 AliMillePede2.cxx:446
 AliMillePede2.cxx:447
 AliMillePede2.cxx:448
 AliMillePede2.cxx:449
 AliMillePede2.cxx:450
 AliMillePede2.cxx:451
 AliMillePede2.cxx:452
 AliMillePede2.cxx:453
 AliMillePede2.cxx:454
 AliMillePede2.cxx:455
 AliMillePede2.cxx:456
 AliMillePede2.cxx:457
 AliMillePede2.cxx:458
 AliMillePede2.cxx:459
 AliMillePede2.cxx:460
 AliMillePede2.cxx:461
 AliMillePede2.cxx:462
 AliMillePede2.cxx:463
 AliMillePede2.cxx:464
 AliMillePede2.cxx:465
 AliMillePede2.cxx:466
 AliMillePede2.cxx:467
 AliMillePede2.cxx:468
 AliMillePede2.cxx:469
 AliMillePede2.cxx:470
 AliMillePede2.cxx:471
 AliMillePede2.cxx:472
 AliMillePede2.cxx:473
 AliMillePede2.cxx:474
 AliMillePede2.cxx:475
 AliMillePede2.cxx:476
 AliMillePede2.cxx:477
 AliMillePede2.cxx:478
 AliMillePede2.cxx:479
 AliMillePede2.cxx:480
 AliMillePede2.cxx:481
 AliMillePede2.cxx:482
 AliMillePede2.cxx:483
 AliMillePede2.cxx:484
 AliMillePede2.cxx:485
 AliMillePede2.cxx:486
 AliMillePede2.cxx:487
 AliMillePede2.cxx:488
 AliMillePede2.cxx:489
 AliMillePede2.cxx:490
 AliMillePede2.cxx:491
 AliMillePede2.cxx:492
 AliMillePede2.cxx:493
 AliMillePede2.cxx:494
 AliMillePede2.cxx:495
 AliMillePede2.cxx:496
 AliMillePede2.cxx:497
 AliMillePede2.cxx:498
 AliMillePede2.cxx:499
 AliMillePede2.cxx:500
 AliMillePede2.cxx:501
 AliMillePede2.cxx:502
 AliMillePede2.cxx:503
 AliMillePede2.cxx:504
 AliMillePede2.cxx:505
 AliMillePede2.cxx:506
 AliMillePede2.cxx:507
 AliMillePede2.cxx:508
 AliMillePede2.cxx:509
 AliMillePede2.cxx:510
 AliMillePede2.cxx:511
 AliMillePede2.cxx:512
 AliMillePede2.cxx:513
 AliMillePede2.cxx:514
 AliMillePede2.cxx:515
 AliMillePede2.cxx:516
 AliMillePede2.cxx:517
 AliMillePede2.cxx:518
 AliMillePede2.cxx:519
 AliMillePede2.cxx:520
 AliMillePede2.cxx:521
 AliMillePede2.cxx:522
 AliMillePede2.cxx:523
 AliMillePede2.cxx:524
 AliMillePede2.cxx:525
 AliMillePede2.cxx:526
 AliMillePede2.cxx:527
 AliMillePede2.cxx:528
 AliMillePede2.cxx:529
 AliMillePede2.cxx:530
 AliMillePede2.cxx:531
 AliMillePede2.cxx:532
 AliMillePede2.cxx:533
 AliMillePede2.cxx:534
 AliMillePede2.cxx:535
 AliMillePede2.cxx:536
 AliMillePede2.cxx:537
 AliMillePede2.cxx:538
 AliMillePede2.cxx:539
 AliMillePede2.cxx:540
 AliMillePede2.cxx:541
 AliMillePede2.cxx:542
 AliMillePede2.cxx:543
 AliMillePede2.cxx:544
 AliMillePede2.cxx:545
 AliMillePede2.cxx:546
 AliMillePede2.cxx:547
 AliMillePede2.cxx:548
 AliMillePede2.cxx:549
 AliMillePede2.cxx:550
 AliMillePede2.cxx:551
 AliMillePede2.cxx:552
 AliMillePede2.cxx:553
 AliMillePede2.cxx:554
 AliMillePede2.cxx:555
 AliMillePede2.cxx:556
 AliMillePede2.cxx:557
 AliMillePede2.cxx:558
 AliMillePede2.cxx:559
 AliMillePede2.cxx:560
 AliMillePede2.cxx:561
 AliMillePede2.cxx:562
 AliMillePede2.cxx:563
 AliMillePede2.cxx:564
 AliMillePede2.cxx:565
 AliMillePede2.cxx:566
 AliMillePede2.cxx:567
 AliMillePede2.cxx:568
 AliMillePede2.cxx:569
 AliMillePede2.cxx:570
 AliMillePede2.cxx:571
 AliMillePede2.cxx:572
 AliMillePede2.cxx:573
 AliMillePede2.cxx:574
 AliMillePede2.cxx:575
 AliMillePede2.cxx:576
 AliMillePede2.cxx:577
 AliMillePede2.cxx:578
 AliMillePede2.cxx:579
 AliMillePede2.cxx:580
 AliMillePede2.cxx:581
 AliMillePede2.cxx:582
 AliMillePede2.cxx:583
 AliMillePede2.cxx:584
 AliMillePede2.cxx:585
 AliMillePede2.cxx:586
 AliMillePede2.cxx:587
 AliMillePede2.cxx:588
 AliMillePede2.cxx:589
 AliMillePede2.cxx:590
 AliMillePede2.cxx:591
 AliMillePede2.cxx:592
 AliMillePede2.cxx:593
 AliMillePede2.cxx:594
 AliMillePede2.cxx:595
 AliMillePede2.cxx:596
 AliMillePede2.cxx:597
 AliMillePede2.cxx:598
 AliMillePede2.cxx:599
 AliMillePede2.cxx:600
 AliMillePede2.cxx:601
 AliMillePede2.cxx:602
 AliMillePede2.cxx:603
 AliMillePede2.cxx:604
 AliMillePede2.cxx:605
 AliMillePede2.cxx:606
 AliMillePede2.cxx:607
 AliMillePede2.cxx:608
 AliMillePede2.cxx:609
 AliMillePede2.cxx:610
 AliMillePede2.cxx:611
 AliMillePede2.cxx:612
 AliMillePede2.cxx:613
 AliMillePede2.cxx:614
 AliMillePede2.cxx:615
 AliMillePede2.cxx:616
 AliMillePede2.cxx:617
 AliMillePede2.cxx:618
 AliMillePede2.cxx:619
 AliMillePede2.cxx:620
 AliMillePede2.cxx:621
 AliMillePede2.cxx:622
 AliMillePede2.cxx:623
 AliMillePede2.cxx:624
 AliMillePede2.cxx:625
 AliMillePede2.cxx:626
 AliMillePede2.cxx:627
 AliMillePede2.cxx:628
 AliMillePede2.cxx:629
 AliMillePede2.cxx:630
 AliMillePede2.cxx:631
 AliMillePede2.cxx:632
 AliMillePede2.cxx:633
 AliMillePede2.cxx:634
 AliMillePede2.cxx:635
 AliMillePede2.cxx:636
 AliMillePede2.cxx:637
 AliMillePede2.cxx:638
 AliMillePede2.cxx:639
 AliMillePede2.cxx:640
 AliMillePede2.cxx:641
 AliMillePede2.cxx:642
 AliMillePede2.cxx:643
 AliMillePede2.cxx:644
 AliMillePede2.cxx:645
 AliMillePede2.cxx:646
 AliMillePede2.cxx:647
 AliMillePede2.cxx:648
 AliMillePede2.cxx:649
 AliMillePede2.cxx:650
 AliMillePede2.cxx:651
 AliMillePede2.cxx:652
 AliMillePede2.cxx:653
 AliMillePede2.cxx:654
 AliMillePede2.cxx:655
 AliMillePede2.cxx:656
 AliMillePede2.cxx:657
 AliMillePede2.cxx:658
 AliMillePede2.cxx:659
 AliMillePede2.cxx:660
 AliMillePede2.cxx:661
 AliMillePede2.cxx:662
 AliMillePede2.cxx:663
 AliMillePede2.cxx:664
 AliMillePede2.cxx:665
 AliMillePede2.cxx:666
 AliMillePede2.cxx:667
 AliMillePede2.cxx:668
 AliMillePede2.cxx:669
 AliMillePede2.cxx:670
 AliMillePede2.cxx:671
 AliMillePede2.cxx:672
 AliMillePede2.cxx:673
 AliMillePede2.cxx:674
 AliMillePede2.cxx:675
 AliMillePede2.cxx:676
 AliMillePede2.cxx:677
 AliMillePede2.cxx:678
 AliMillePede2.cxx:679
 AliMillePede2.cxx:680
 AliMillePede2.cxx:681
 AliMillePede2.cxx:682
 AliMillePede2.cxx:683
 AliMillePede2.cxx:684
 AliMillePede2.cxx:685
 AliMillePede2.cxx:686
 AliMillePede2.cxx:687
 AliMillePede2.cxx:688
 AliMillePede2.cxx:689
 AliMillePede2.cxx:690
 AliMillePede2.cxx:691
 AliMillePede2.cxx:692
 AliMillePede2.cxx:693
 AliMillePede2.cxx:694
 AliMillePede2.cxx:695
 AliMillePede2.cxx:696
 AliMillePede2.cxx:697
 AliMillePede2.cxx:698
 AliMillePede2.cxx:699
 AliMillePede2.cxx:700
 AliMillePede2.cxx:701
 AliMillePede2.cxx:702
 AliMillePede2.cxx:703
 AliMillePede2.cxx:704
 AliMillePede2.cxx:705
 AliMillePede2.cxx:706
 AliMillePede2.cxx:707
 AliMillePede2.cxx:708
 AliMillePede2.cxx:709
 AliMillePede2.cxx:710
 AliMillePede2.cxx:711
 AliMillePede2.cxx:712
 AliMillePede2.cxx:713
 AliMillePede2.cxx:714
 AliMillePede2.cxx:715
 AliMillePede2.cxx:716
 AliMillePede2.cxx:717
 AliMillePede2.cxx:718
 AliMillePede2.cxx:719
 AliMillePede2.cxx:720
 AliMillePede2.cxx:721
 AliMillePede2.cxx:722
 AliMillePede2.cxx:723
 AliMillePede2.cxx:724
 AliMillePede2.cxx:725
 AliMillePede2.cxx:726
 AliMillePede2.cxx:727
 AliMillePede2.cxx:728
 AliMillePede2.cxx:729
 AliMillePede2.cxx:730
 AliMillePede2.cxx:731
 AliMillePede2.cxx:732
 AliMillePede2.cxx:733
 AliMillePede2.cxx:734
 AliMillePede2.cxx:735
 AliMillePede2.cxx:736
 AliMillePede2.cxx:737
 AliMillePede2.cxx:738
 AliMillePede2.cxx:739
 AliMillePede2.cxx:740
 AliMillePede2.cxx:741
 AliMillePede2.cxx:742
 AliMillePede2.cxx:743
 AliMillePede2.cxx:744
 AliMillePede2.cxx:745
 AliMillePede2.cxx:746
 AliMillePede2.cxx:747
 AliMillePede2.cxx:748
 AliMillePede2.cxx:749
 AliMillePede2.cxx:750
 AliMillePede2.cxx:751
 AliMillePede2.cxx:752
 AliMillePede2.cxx:753
 AliMillePede2.cxx:754
 AliMillePede2.cxx:755
 AliMillePede2.cxx:756
 AliMillePede2.cxx:757
 AliMillePede2.cxx:758
 AliMillePede2.cxx:759
 AliMillePede2.cxx:760
 AliMillePede2.cxx:761
 AliMillePede2.cxx:762
 AliMillePede2.cxx:763
 AliMillePede2.cxx:764
 AliMillePede2.cxx:765
 AliMillePede2.cxx:766
 AliMillePede2.cxx:767
 AliMillePede2.cxx:768
 AliMillePede2.cxx:769
 AliMillePede2.cxx:770
 AliMillePede2.cxx:771
 AliMillePede2.cxx:772
 AliMillePede2.cxx:773
 AliMillePede2.cxx:774
 AliMillePede2.cxx:775
 AliMillePede2.cxx:776
 AliMillePede2.cxx:777
 AliMillePede2.cxx:778
 AliMillePede2.cxx:779
 AliMillePede2.cxx:780
 AliMillePede2.cxx:781
 AliMillePede2.cxx:782
 AliMillePede2.cxx:783
 AliMillePede2.cxx:784
 AliMillePede2.cxx:785
 AliMillePede2.cxx:786
 AliMillePede2.cxx:787
 AliMillePede2.cxx:788
 AliMillePede2.cxx:789
 AliMillePede2.cxx:790
 AliMillePede2.cxx:791
 AliMillePede2.cxx:792
 AliMillePede2.cxx:793
 AliMillePede2.cxx:794
 AliMillePede2.cxx:795
 AliMillePede2.cxx:796
 AliMillePede2.cxx:797
 AliMillePede2.cxx:798
 AliMillePede2.cxx:799
 AliMillePede2.cxx:800
 AliMillePede2.cxx:801
 AliMillePede2.cxx:802
 AliMillePede2.cxx:803
 AliMillePede2.cxx:804
 AliMillePede2.cxx:805
 AliMillePede2.cxx:806
 AliMillePede2.cxx:807
 AliMillePede2.cxx:808
 AliMillePede2.cxx:809
 AliMillePede2.cxx:810
 AliMillePede2.cxx:811
 AliMillePede2.cxx:812
 AliMillePede2.cxx:813
 AliMillePede2.cxx:814
 AliMillePede2.cxx:815
 AliMillePede2.cxx:816
 AliMillePede2.cxx:817
 AliMillePede2.cxx:818
 AliMillePede2.cxx:819
 AliMillePede2.cxx:820
 AliMillePede2.cxx:821
 AliMillePede2.cxx:822
 AliMillePede2.cxx:823
 AliMillePede2.cxx:824
 AliMillePede2.cxx:825
 AliMillePede2.cxx:826
 AliMillePede2.cxx:827
 AliMillePede2.cxx:828
 AliMillePede2.cxx:829
 AliMillePede2.cxx:830
 AliMillePede2.cxx:831
 AliMillePede2.cxx:832
 AliMillePede2.cxx:833
 AliMillePede2.cxx:834
 AliMillePede2.cxx:835
 AliMillePede2.cxx:836
 AliMillePede2.cxx:837
 AliMillePede2.cxx:838
 AliMillePede2.cxx:839
 AliMillePede2.cxx:840
 AliMillePede2.cxx:841
 AliMillePede2.cxx:842
 AliMillePede2.cxx:843
 AliMillePede2.cxx:844
 AliMillePede2.cxx:845
 AliMillePede2.cxx:846
 AliMillePede2.cxx:847
 AliMillePede2.cxx:848
 AliMillePede2.cxx:849
 AliMillePede2.cxx:850
 AliMillePede2.cxx:851
 AliMillePede2.cxx:852
 AliMillePede2.cxx:853
 AliMillePede2.cxx:854
 AliMillePede2.cxx:855
 AliMillePede2.cxx:856
 AliMillePede2.cxx:857
 AliMillePede2.cxx:858
 AliMillePede2.cxx:859
 AliMillePede2.cxx:860
 AliMillePede2.cxx:861
 AliMillePede2.cxx:862
 AliMillePede2.cxx:863
 AliMillePede2.cxx:864
 AliMillePede2.cxx:865
 AliMillePede2.cxx:866
 AliMillePede2.cxx:867
 AliMillePede2.cxx:868
 AliMillePede2.cxx:869
 AliMillePede2.cxx:870
 AliMillePede2.cxx:871
 AliMillePede2.cxx:872
 AliMillePede2.cxx:873
 AliMillePede2.cxx:874
 AliMillePede2.cxx:875
 AliMillePede2.cxx:876
 AliMillePede2.cxx:877
 AliMillePede2.cxx:878
 AliMillePede2.cxx:879
 AliMillePede2.cxx:880
 AliMillePede2.cxx:881
 AliMillePede2.cxx:882
 AliMillePede2.cxx:883
 AliMillePede2.cxx:884
 AliMillePede2.cxx:885
 AliMillePede2.cxx:886
 AliMillePede2.cxx:887
 AliMillePede2.cxx:888
 AliMillePede2.cxx:889
 AliMillePede2.cxx:890
 AliMillePede2.cxx:891
 AliMillePede2.cxx:892
 AliMillePede2.cxx:893
 AliMillePede2.cxx:894
 AliMillePede2.cxx:895
 AliMillePede2.cxx:896
 AliMillePede2.cxx:897
 AliMillePede2.cxx:898
 AliMillePede2.cxx:899
 AliMillePede2.cxx:900
 AliMillePede2.cxx:901
 AliMillePede2.cxx:902
 AliMillePede2.cxx:903
 AliMillePede2.cxx:904
 AliMillePede2.cxx:905
 AliMillePede2.cxx:906
 AliMillePede2.cxx:907
 AliMillePede2.cxx:908
 AliMillePede2.cxx:909
 AliMillePede2.cxx:910
 AliMillePede2.cxx:911
 AliMillePede2.cxx:912
 AliMillePede2.cxx:913
 AliMillePede2.cxx:914
 AliMillePede2.cxx:915
 AliMillePede2.cxx:916
 AliMillePede2.cxx:917
 AliMillePede2.cxx:918
 AliMillePede2.cxx:919
 AliMillePede2.cxx:920
 AliMillePede2.cxx:921
 AliMillePede2.cxx:922
 AliMillePede2.cxx:923
 AliMillePede2.cxx:924
 AliMillePede2.cxx:925
 AliMillePede2.cxx:926
 AliMillePede2.cxx:927
 AliMillePede2.cxx:928
 AliMillePede2.cxx:929
 AliMillePede2.cxx:930
 AliMillePede2.cxx:931
 AliMillePede2.cxx:932
 AliMillePede2.cxx:933
 AliMillePede2.cxx:934
 AliMillePede2.cxx:935
 AliMillePede2.cxx:936
 AliMillePede2.cxx:937
 AliMillePede2.cxx:938
 AliMillePede2.cxx:939
 AliMillePede2.cxx:940
 AliMillePede2.cxx:941
 AliMillePede2.cxx:942
 AliMillePede2.cxx:943
 AliMillePede2.cxx:944
 AliMillePede2.cxx:945
 AliMillePede2.cxx:946
 AliMillePede2.cxx:947
 AliMillePede2.cxx:948
 AliMillePede2.cxx:949
 AliMillePede2.cxx:950
 AliMillePede2.cxx:951
 AliMillePede2.cxx:952
 AliMillePede2.cxx:953
 AliMillePede2.cxx:954
 AliMillePede2.cxx:955
 AliMillePede2.cxx:956
 AliMillePede2.cxx:957
 AliMillePede2.cxx:958
 AliMillePede2.cxx:959
 AliMillePede2.cxx:960
 AliMillePede2.cxx:961
 AliMillePede2.cxx:962
 AliMillePede2.cxx:963
 AliMillePede2.cxx:964
 AliMillePede2.cxx:965
 AliMillePede2.cxx:966
 AliMillePede2.cxx:967
 AliMillePede2.cxx:968
 AliMillePede2.cxx:969
 AliMillePede2.cxx:970
 AliMillePede2.cxx:971
 AliMillePede2.cxx:972
 AliMillePede2.cxx:973
 AliMillePede2.cxx:974
 AliMillePede2.cxx:975
 AliMillePede2.cxx:976
 AliMillePede2.cxx:977
 AliMillePede2.cxx:978
 AliMillePede2.cxx:979
 AliMillePede2.cxx:980
 AliMillePede2.cxx:981
 AliMillePede2.cxx:982
 AliMillePede2.cxx:983
 AliMillePede2.cxx:984
 AliMillePede2.cxx:985
 AliMillePede2.cxx:986
 AliMillePede2.cxx:987
 AliMillePede2.cxx:988
 AliMillePede2.cxx:989
 AliMillePede2.cxx:990
 AliMillePede2.cxx:991
 AliMillePede2.cxx:992
 AliMillePede2.cxx:993
 AliMillePede2.cxx:994
 AliMillePede2.cxx:995
 AliMillePede2.cxx:996
 AliMillePede2.cxx:997
 AliMillePede2.cxx:998
 AliMillePede2.cxx:999
 AliMillePede2.cxx:1000
 AliMillePede2.cxx:1001
 AliMillePede2.cxx:1002
 AliMillePede2.cxx:1003
 AliMillePede2.cxx:1004
 AliMillePede2.cxx:1005
 AliMillePede2.cxx:1006
 AliMillePede2.cxx:1007
 AliMillePede2.cxx:1008
 AliMillePede2.cxx:1009
 AliMillePede2.cxx:1010
 AliMillePede2.cxx:1011
 AliMillePede2.cxx:1012
 AliMillePede2.cxx:1013
 AliMillePede2.cxx:1014
 AliMillePede2.cxx:1015
 AliMillePede2.cxx:1016
 AliMillePede2.cxx:1017
 AliMillePede2.cxx:1018
 AliMillePede2.cxx:1019
 AliMillePede2.cxx:1020
 AliMillePede2.cxx:1021
 AliMillePede2.cxx:1022
 AliMillePede2.cxx:1023
 AliMillePede2.cxx:1024
 AliMillePede2.cxx:1025
 AliMillePede2.cxx:1026
 AliMillePede2.cxx:1027
 AliMillePede2.cxx:1028
 AliMillePede2.cxx:1029
 AliMillePede2.cxx:1030
 AliMillePede2.cxx:1031
 AliMillePede2.cxx:1032
 AliMillePede2.cxx:1033
 AliMillePede2.cxx:1034
 AliMillePede2.cxx:1035
 AliMillePede2.cxx:1036
 AliMillePede2.cxx:1037
 AliMillePede2.cxx:1038
 AliMillePede2.cxx:1039
 AliMillePede2.cxx:1040
 AliMillePede2.cxx:1041
 AliMillePede2.cxx:1042
 AliMillePede2.cxx:1043
 AliMillePede2.cxx:1044
 AliMillePede2.cxx:1045
 AliMillePede2.cxx:1046
 AliMillePede2.cxx:1047
 AliMillePede2.cxx:1048
 AliMillePede2.cxx:1049
 AliMillePede2.cxx:1050
 AliMillePede2.cxx:1051
 AliMillePede2.cxx:1052
 AliMillePede2.cxx:1053
 AliMillePede2.cxx:1054
 AliMillePede2.cxx:1055
 AliMillePede2.cxx:1056
 AliMillePede2.cxx:1057
 AliMillePede2.cxx:1058
 AliMillePede2.cxx:1059
 AliMillePede2.cxx:1060
 AliMillePede2.cxx:1061
 AliMillePede2.cxx:1062
 AliMillePede2.cxx:1063
 AliMillePede2.cxx:1064
 AliMillePede2.cxx:1065
 AliMillePede2.cxx:1066
 AliMillePede2.cxx:1067
 AliMillePede2.cxx:1068
 AliMillePede2.cxx:1069
 AliMillePede2.cxx:1070
 AliMillePede2.cxx:1071
 AliMillePede2.cxx:1072
 AliMillePede2.cxx:1073
 AliMillePede2.cxx:1074
 AliMillePede2.cxx:1075
 AliMillePede2.cxx:1076
 AliMillePede2.cxx:1077
 AliMillePede2.cxx:1078
 AliMillePede2.cxx:1079
 AliMillePede2.cxx:1080
 AliMillePede2.cxx:1081
 AliMillePede2.cxx:1082
 AliMillePede2.cxx:1083
 AliMillePede2.cxx:1084
 AliMillePede2.cxx:1085
 AliMillePede2.cxx:1086
 AliMillePede2.cxx:1087
 AliMillePede2.cxx:1088
 AliMillePede2.cxx:1089
 AliMillePede2.cxx:1090
 AliMillePede2.cxx:1091
 AliMillePede2.cxx:1092
 AliMillePede2.cxx:1093
 AliMillePede2.cxx:1094
 AliMillePede2.cxx:1095
 AliMillePede2.cxx:1096
 AliMillePede2.cxx:1097
 AliMillePede2.cxx:1098
 AliMillePede2.cxx:1099
 AliMillePede2.cxx:1100
 AliMillePede2.cxx:1101
 AliMillePede2.cxx:1102
 AliMillePede2.cxx:1103
 AliMillePede2.cxx:1104
 AliMillePede2.cxx:1105
 AliMillePede2.cxx:1106
 AliMillePede2.cxx:1107
 AliMillePede2.cxx:1108
 AliMillePede2.cxx:1109
 AliMillePede2.cxx:1110
 AliMillePede2.cxx:1111
 AliMillePede2.cxx:1112
 AliMillePede2.cxx:1113
 AliMillePede2.cxx:1114
 AliMillePede2.cxx:1115
 AliMillePede2.cxx:1116
 AliMillePede2.cxx:1117
 AliMillePede2.cxx:1118
 AliMillePede2.cxx:1119
 AliMillePede2.cxx:1120
 AliMillePede2.cxx:1121
 AliMillePede2.cxx:1122
 AliMillePede2.cxx:1123
 AliMillePede2.cxx:1124
 AliMillePede2.cxx:1125
 AliMillePede2.cxx:1126
 AliMillePede2.cxx:1127
 AliMillePede2.cxx:1128
 AliMillePede2.cxx:1129
 AliMillePede2.cxx:1130
 AliMillePede2.cxx:1131
 AliMillePede2.cxx:1132
 AliMillePede2.cxx:1133
 AliMillePede2.cxx:1134
 AliMillePede2.cxx:1135
 AliMillePede2.cxx:1136
 AliMillePede2.cxx:1137
 AliMillePede2.cxx:1138
 AliMillePede2.cxx:1139
 AliMillePede2.cxx:1140
 AliMillePede2.cxx:1141
 AliMillePede2.cxx:1142
 AliMillePede2.cxx:1143
 AliMillePede2.cxx:1144
 AliMillePede2.cxx:1145
 AliMillePede2.cxx:1146
 AliMillePede2.cxx:1147
 AliMillePede2.cxx:1148
 AliMillePede2.cxx:1149
 AliMillePede2.cxx:1150
 AliMillePede2.cxx:1151
 AliMillePede2.cxx:1152
 AliMillePede2.cxx:1153
 AliMillePede2.cxx:1154
 AliMillePede2.cxx:1155
 AliMillePede2.cxx:1156
 AliMillePede2.cxx:1157
 AliMillePede2.cxx:1158
 AliMillePede2.cxx:1159
 AliMillePede2.cxx:1160
 AliMillePede2.cxx:1161
 AliMillePede2.cxx:1162
 AliMillePede2.cxx:1163
 AliMillePede2.cxx:1164
 AliMillePede2.cxx:1165
 AliMillePede2.cxx:1166
 AliMillePede2.cxx:1167
 AliMillePede2.cxx:1168
 AliMillePede2.cxx:1169
 AliMillePede2.cxx:1170
 AliMillePede2.cxx:1171
 AliMillePede2.cxx:1172
 AliMillePede2.cxx:1173
 AliMillePede2.cxx:1174
 AliMillePede2.cxx:1175
 AliMillePede2.cxx:1176
 AliMillePede2.cxx:1177
 AliMillePede2.cxx:1178
 AliMillePede2.cxx:1179
 AliMillePede2.cxx:1180
 AliMillePede2.cxx:1181
 AliMillePede2.cxx:1182
 AliMillePede2.cxx:1183
 AliMillePede2.cxx:1184
 AliMillePede2.cxx:1185
 AliMillePede2.cxx:1186
 AliMillePede2.cxx:1187
 AliMillePede2.cxx:1188
 AliMillePede2.cxx:1189
 AliMillePede2.cxx:1190
 AliMillePede2.cxx:1191
 AliMillePede2.cxx:1192
 AliMillePede2.cxx:1193
 AliMillePede2.cxx:1194
 AliMillePede2.cxx:1195
 AliMillePede2.cxx:1196
 AliMillePede2.cxx:1197
 AliMillePede2.cxx:1198
 AliMillePede2.cxx:1199
 AliMillePede2.cxx:1200
 AliMillePede2.cxx:1201
 AliMillePede2.cxx:1202
 AliMillePede2.cxx:1203
 AliMillePede2.cxx:1204
 AliMillePede2.cxx:1205
 AliMillePede2.cxx:1206
 AliMillePede2.cxx:1207
 AliMillePede2.cxx:1208
 AliMillePede2.cxx:1209
 AliMillePede2.cxx:1210
 AliMillePede2.cxx:1211
 AliMillePede2.cxx:1212
 AliMillePede2.cxx:1213
 AliMillePede2.cxx:1214
 AliMillePede2.cxx:1215
 AliMillePede2.cxx:1216
 AliMillePede2.cxx:1217
 AliMillePede2.cxx:1218
 AliMillePede2.cxx:1219
 AliMillePede2.cxx:1220
 AliMillePede2.cxx:1221
 AliMillePede2.cxx:1222
 AliMillePede2.cxx:1223
 AliMillePede2.cxx:1224
 AliMillePede2.cxx:1225
 AliMillePede2.cxx:1226
 AliMillePede2.cxx:1227
 AliMillePede2.cxx:1228
 AliMillePede2.cxx:1229
 AliMillePede2.cxx:1230
 AliMillePede2.cxx:1231
 AliMillePede2.cxx:1232
 AliMillePede2.cxx:1233
 AliMillePede2.cxx:1234
 AliMillePede2.cxx:1235
 AliMillePede2.cxx:1236
 AliMillePede2.cxx:1237
 AliMillePede2.cxx:1238
 AliMillePede2.cxx:1239
 AliMillePede2.cxx:1240
 AliMillePede2.cxx:1241
 AliMillePede2.cxx:1242
 AliMillePede2.cxx:1243
 AliMillePede2.cxx:1244
 AliMillePede2.cxx:1245
 AliMillePede2.cxx:1246
 AliMillePede2.cxx:1247
 AliMillePede2.cxx:1248
 AliMillePede2.cxx:1249
 AliMillePede2.cxx:1250
 AliMillePede2.cxx:1251
 AliMillePede2.cxx:1252
 AliMillePede2.cxx:1253
 AliMillePede2.cxx:1254
 AliMillePede2.cxx:1255
 AliMillePede2.cxx:1256
 AliMillePede2.cxx:1257
 AliMillePede2.cxx:1258
 AliMillePede2.cxx:1259
 AliMillePede2.cxx:1260
 AliMillePede2.cxx:1261
 AliMillePede2.cxx:1262
 AliMillePede2.cxx:1263
 AliMillePede2.cxx:1264
 AliMillePede2.cxx:1265
 AliMillePede2.cxx:1266
 AliMillePede2.cxx:1267
 AliMillePede2.cxx:1268
 AliMillePede2.cxx:1269
 AliMillePede2.cxx:1270
 AliMillePede2.cxx:1271
 AliMillePede2.cxx:1272
 AliMillePede2.cxx:1273
 AliMillePede2.cxx:1274
 AliMillePede2.cxx:1275
 AliMillePede2.cxx:1276
 AliMillePede2.cxx:1277
 AliMillePede2.cxx:1278
 AliMillePede2.cxx:1279
 AliMillePede2.cxx:1280
 AliMillePede2.cxx:1281
 AliMillePede2.cxx:1282
 AliMillePede2.cxx:1283
 AliMillePede2.cxx:1284
 AliMillePede2.cxx:1285
 AliMillePede2.cxx:1286
 AliMillePede2.cxx:1287
 AliMillePede2.cxx:1288
 AliMillePede2.cxx:1289
 AliMillePede2.cxx:1290
 AliMillePede2.cxx:1291
 AliMillePede2.cxx:1292
 AliMillePede2.cxx:1293
 AliMillePede2.cxx:1294
 AliMillePede2.cxx:1295
 AliMillePede2.cxx:1296
 AliMillePede2.cxx:1297
 AliMillePede2.cxx:1298
 AliMillePede2.cxx:1299
 AliMillePede2.cxx:1300
 AliMillePede2.cxx:1301
 AliMillePede2.cxx:1302
 AliMillePede2.cxx:1303
 AliMillePede2.cxx:1304
 AliMillePede2.cxx:1305
 AliMillePede2.cxx:1306
 AliMillePede2.cxx:1307
 AliMillePede2.cxx:1308
 AliMillePede2.cxx:1309
 AliMillePede2.cxx:1310
 AliMillePede2.cxx:1311
 AliMillePede2.cxx:1312
 AliMillePede2.cxx:1313
 AliMillePede2.cxx:1314
 AliMillePede2.cxx:1315
 AliMillePede2.cxx:1316
 AliMillePede2.cxx:1317
 AliMillePede2.cxx:1318
 AliMillePede2.cxx:1319
 AliMillePede2.cxx:1320
 AliMillePede2.cxx:1321
 AliMillePede2.cxx:1322
 AliMillePede2.cxx:1323
 AliMillePede2.cxx:1324
 AliMillePede2.cxx:1325
 AliMillePede2.cxx:1326
 AliMillePede2.cxx:1327
 AliMillePede2.cxx:1328
 AliMillePede2.cxx:1329
 AliMillePede2.cxx:1330
 AliMillePede2.cxx:1331
 AliMillePede2.cxx:1332
 AliMillePede2.cxx:1333
 AliMillePede2.cxx:1334
 AliMillePede2.cxx:1335
 AliMillePede2.cxx:1336
 AliMillePede2.cxx:1337
 AliMillePede2.cxx:1338
 AliMillePede2.cxx:1339
 AliMillePede2.cxx:1340
 AliMillePede2.cxx:1341
 AliMillePede2.cxx:1342
 AliMillePede2.cxx:1343
 AliMillePede2.cxx:1344
 AliMillePede2.cxx:1345
 AliMillePede2.cxx:1346
 AliMillePede2.cxx:1347
 AliMillePede2.cxx:1348
 AliMillePede2.cxx:1349
 AliMillePede2.cxx:1350
 AliMillePede2.cxx:1351
 AliMillePede2.cxx:1352
 AliMillePede2.cxx:1353
 AliMillePede2.cxx:1354
 AliMillePede2.cxx:1355
 AliMillePede2.cxx:1356
 AliMillePede2.cxx:1357
 AliMillePede2.cxx:1358
 AliMillePede2.cxx:1359
 AliMillePede2.cxx:1360
 AliMillePede2.cxx:1361
 AliMillePede2.cxx:1362
 AliMillePede2.cxx:1363
 AliMillePede2.cxx:1364
 AliMillePede2.cxx:1365
 AliMillePede2.cxx:1366
 AliMillePede2.cxx:1367
 AliMillePede2.cxx:1368
 AliMillePede2.cxx:1369
 AliMillePede2.cxx:1370
 AliMillePede2.cxx:1371
 AliMillePede2.cxx:1372
 AliMillePede2.cxx:1373
 AliMillePede2.cxx:1374
 AliMillePede2.cxx:1375
 AliMillePede2.cxx:1376
 AliMillePede2.cxx:1377
 AliMillePede2.cxx:1378
 AliMillePede2.cxx:1379
 AliMillePede2.cxx:1380
 AliMillePede2.cxx:1381
 AliMillePede2.cxx:1382
 AliMillePede2.cxx:1383
 AliMillePede2.cxx:1384
 AliMillePede2.cxx:1385
 AliMillePede2.cxx:1386
 AliMillePede2.cxx:1387
 AliMillePede2.cxx:1388
 AliMillePede2.cxx:1389
 AliMillePede2.cxx:1390
 AliMillePede2.cxx:1391
 AliMillePede2.cxx:1392
 AliMillePede2.cxx:1393
 AliMillePede2.cxx:1394
 AliMillePede2.cxx:1395
 AliMillePede2.cxx:1396
 AliMillePede2.cxx:1397
 AliMillePede2.cxx:1398
 AliMillePede2.cxx:1399
 AliMillePede2.cxx:1400
 AliMillePede2.cxx:1401
 AliMillePede2.cxx:1402
 AliMillePede2.cxx:1403
 AliMillePede2.cxx:1404
 AliMillePede2.cxx:1405
 AliMillePede2.cxx:1406
 AliMillePede2.cxx:1407
 AliMillePede2.cxx:1408
 AliMillePede2.cxx:1409
 AliMillePede2.cxx:1410
 AliMillePede2.cxx:1411
 AliMillePede2.cxx:1412
 AliMillePede2.cxx:1413
 AliMillePede2.cxx:1414
 AliMillePede2.cxx:1415
 AliMillePede2.cxx:1416
 AliMillePede2.cxx:1417
 AliMillePede2.cxx:1418
 AliMillePede2.cxx:1419
 AliMillePede2.cxx:1420
 AliMillePede2.cxx:1421
 AliMillePede2.cxx:1422
 AliMillePede2.cxx:1423
 AliMillePede2.cxx:1424
 AliMillePede2.cxx:1425
 AliMillePede2.cxx:1426
 AliMillePede2.cxx:1427
 AliMillePede2.cxx:1428
 AliMillePede2.cxx:1429
 AliMillePede2.cxx:1430
 AliMillePede2.cxx:1431
 AliMillePede2.cxx:1432
 AliMillePede2.cxx:1433
 AliMillePede2.cxx:1434
 AliMillePede2.cxx:1435
 AliMillePede2.cxx:1436
 AliMillePede2.cxx:1437
 AliMillePede2.cxx:1438
 AliMillePede2.cxx:1439
 AliMillePede2.cxx:1440
 AliMillePede2.cxx:1441
 AliMillePede2.cxx:1442
 AliMillePede2.cxx:1443
 AliMillePede2.cxx:1444
 AliMillePede2.cxx:1445
 AliMillePede2.cxx:1446
 AliMillePede2.cxx:1447
 AliMillePede2.cxx:1448
 AliMillePede2.cxx:1449
 AliMillePede2.cxx:1450
 AliMillePede2.cxx:1451