ROOT logo
/****************************************************************************
 *           Legacy comparison macro, adapted to the upgraded ITS.          *
 *                                                                          *
 *               Creates list of "trackable" tracks,                        *
 *             calculates efficiency, resolutions etc.                      *
 *     There is a possibility to run this macro over several events.        *
 *                                                                          *
 *           Origin: I.Belikov, IPHC, Iouri.Belikov@iphc.cnrs.fr            *
 * with several nice improvements by: M.Ivanov, GSI, m.ivanov@gsi.de        *
 ****************************************************************************/

#if !defined(__CINT__) || defined(__MAKECINT__)
  #include <TMath.h>
  #include <TError.h>
  #include <Riostream.h>
  #include <TH1F.h>
  #include <TH2F.h>
  #include <TTree.h>
  #include <TParticle.h>
  #include <TCanvas.h>
  #include <TLine.h>
  #include <TText.h>
  #include <TBenchmark.h>
  #include <TStyle.h>
  #include <TFile.h>
  #include <TROOT.h>
  #include <TGeoGlobalMagField.h>

  #include "AliStack.h"
  #include "AliHeader.h"
  #include "AliTrackReference.h"
  #include "AliRunLoader.h"
  #include "AliRun.h"
  #include "AliMagF.h"
  #include "AliESDEvent.h"
  #include "AliESDtrack.h"

  #include "Base/AliSimDigits.h"
  #include "Base/AliTPCParamSR.h"
  #include "Base/AliTPCLoader.h"
  #include "Base/AliTPCcalibDB.h"
  #include "Sim/AliTPC.h"
  #include "Rec/AliTPCClustersRow.h"

  #include "AliCDBManager.h"
#endif

Int_t GoodTracksTPC(const Char_t *dir=".");

extern TBenchmark *gBenchmark;
extern TROOT *gROOT;

static Int_t allgood=0;
static Int_t allselected=0;
static Int_t allfound=0;

Int_t AliTPCUComparison
(Float_t ptcutl=0., Float_t ptcuth=2., const Char_t *dir=".") {
   gBenchmark->Start("AliTPCUComparison");

   ::Info("AliTPCUComparison.C","Doing comparison...");



   TH1F *hp=(TH1F*)gROOT->FindObject("hp");
   if (!hp) hp=new TH1F("hp","PHI resolution",50,-20.,20.); 
   hp->SetFillColor(4);

   TH1F *hl=(TH1F*)gROOT->FindObject("hl");
   if (!hl) hl=new TH1F("hl","LAMBDA resolution",50,-20,20);
   hl->SetFillColor(4);

   TH1F *hpt=(TH1F*)gROOT->FindObject("hpt");
   if (!hpt) hpt=new TH1F("hpt","Relative Pt resolution",30,-10.,10.); 
   hpt->SetFillColor(2);
 
   TH1F *hmpt=(TH1F*)gROOT->FindObject("hmpt");
   if (!hmpt) 
      hmpt=new TH1F("hmpt","Relative Pt resolution (pt>4GeV/c)",30,-60,60); 
   hmpt->SetFillColor(6);


   Int_t nb=100;
   TH1F *hgood=(TH1F*)gROOT->FindObject("hgood");
   if (!hgood) hgood=new TH1F("hgood","Good tracks",nb,ptcutl,ptcuth);
    
   TH1F *hfound=(TH1F*)gROOT->FindObject("hfound");
   if (!hfound) hfound=new TH1F("hfound","Found tracks",nb,ptcutl,ptcuth);

   TH1F *hfake=(TH1F*)gROOT->FindObject("hfake");
   if (!hfake) hfake=new TH1F("hfake","Fake tracks",nb,ptcutl,ptcuth);

   TH1F *hg=(TH1F*)gROOT->FindObject("hg");
   if (!hg) hg=new TH1F("hg","Efficiency for good tracks",nb,ptcutl,ptcuth);
   hg->SetLineColor(4); hg->SetLineWidth(2);

   TH1F *hf=(TH1F*)gROOT->FindObject("hf");
   if (!hf) hf=new TH1F("hf","Efficiency for fake tracks",nb,ptcutl,ptcuth);
   hf->SetFillColor(1); hf->SetFillStyle(3013); hf->SetLineWidth(2);


   TH1F *he=(TH1F*)gROOT->FindObject("he");
   if (!he) 
      he =new TH1F("he","dE/dX for pions with 0.4<p<0.5 GeV/c",50,0.,100.);

   TH2F *hep=(TH2F*)gROOT->FindObject("hep");
   if (!hep) hep=new TH2F("hep","dE/dX vs momentum",50,0.,2.,50,0.,400.);
   hep->SetMarkerStyle(8);
   hep->SetMarkerSize(0.4);


   Char_t fname[100];
   sprintf(fname,"%s/GoodTracksTPC.root",dir);

   TFile *refFile=TFile::Open(fname,"old");
   if (!refFile || !refFile->IsOpen()) {
     ::Info("AliTPCUComparison.C","Marking good tracks (will take a while)...");
     if (GoodTracksTPC(dir)) {
        ::Error("AliTPCUComparison.C","Can't generate the reference file !");
        return 1;
     }
   }
   refFile=TFile::Open(fname,"old");
   if (!refFile || !refFile->IsOpen()) {
     ::Error("AliTPCUComparison.C","Can't open the reference file !");
     return 2;
   }   
  
   TTree *tpcTree=(TTree*)refFile->Get("tpcTree");
   if (!tpcTree) {
     ::Error("AliTPCUComparison.C","Can't get the reference tree !");
     return 3;
   }
   TBranch *branch=tpcTree->GetBranch("TPC");
   if (!branch) {
     ::Error("AliTPCUComparison.C","Can't get the TPC branch !");
     return 4;
   }
   TClonesArray dummy("AliTrackReference",1000), *refs=&dummy;
   branch->SetAddress(&refs);


   sprintf(fname,"%s/AliESDs.root",dir);
   TFile *ef=TFile::Open(fname);
   if ((!ef)||(!ef->IsOpen())) {
      sprintf(fname,"%s/AliESDtpc.root",dir);
      ef=TFile::Open(fname);
      if ((!ef)||(!ef->IsOpen())) {
         ::Error("AliTPCUComparison.C","Can't open AliESDtpc.root !");
         return 5;
      }
   }
   AliESDEvent* event = new AliESDEvent();
   TTree* esdTree = (TTree*) ef->Get("esdTree");
   if (!esdTree) {
      ::Error("AliTPCUComparison.C", "no ESD tree found");
      return 6;
   }
   event->ReadFromTree(esdTree);


   //******* Loop over events *********
   Int_t e=0;
   while (esdTree->GetEvent(e)) {
      cout<<endl<<endl<<"********* Processing event number: "<<e<<"*******\n";

      Int_t nentr=event->GetNumberOfTracks();
      allfound+=nentr;

      if (tpcTree->GetEvent(e++)==0) {
	 cerr<<"No reconstructable tracks !\n";
         continue;
      }

      Int_t ngood=refs->GetEntriesFast(); 
      allgood+=ngood;

      const Int_t MAX=15000;
    //MI change
      Int_t track_notfound[MAX], itrack_notfound=0;
      Int_t track_fake[MAX], itrack_fake=0;
      Int_t track_multifound[MAX],track_multifound_n[MAX],itrack_multifound=0;

      Int_t i;
      for (Int_t k=0; k<ngood; k++) {
	AliTrackReference *ref=(AliTrackReference*)refs->UncheckedAt(k); 
        Int_t lab=ref->Label(), tlab=-1;
        Float_t ptg=TMath::Sqrt(ref->Px()*ref->Px() + ref->Py()*ref->Py());

        if (ptg<1e-33) continue; // for those not crossing 0 pad row
  
        if (ptg<ptcutl) continue;
        if (ptg>ptcuth) continue;

        allselected++;

        hgood->Fill(ptg);

        AliESDtrack *track=0;
        for (i=0; i<nentr; i++) {
          track=event->GetTrack(i);
          tlab=track->GetTPCLabel();
          if (lab==TMath::Abs(tlab)) break;
        }
        if (i==nentr) {
	   track_notfound[itrack_notfound++]=lab;
           continue;
        }
      
        //MI change  - addition
        Int_t micount=0;
        Int_t mi;
        AliESDtrack * mitrack;
        for (mi=0; mi<nentr; mi++) {
	  mitrack=event->GetTrack(mi);          
	  if (lab==TMath::Abs(mitrack->GetTPCLabel())) micount++;
        }
        if (micount>1) {
	  track_multifound[itrack_multifound]=lab;
	  track_multifound_n[itrack_multifound]=micount;
	  itrack_multifound++;
        }
        if ((track->GetStatus()&AliESDtrack::kTPCrefit)==0) continue;
        if (lab==tlab) hfound->Fill(ptg);
        else { 
	  track_fake[itrack_fake++]=lab;
	  hfake->Fill(ptg); 
        }
      
        Double_t pxpypz[3]; track->GetInnerPxPyPz(pxpypz);
        Float_t phi=TMath::ATan2(pxpypz[1],pxpypz[0]);
        if (phi<-TMath::Pi()) phi+=2*TMath::Pi();
        if (phi>=TMath::Pi()) phi-=2*TMath::Pi();
        Double_t pt=TMath::Sqrt(pxpypz[0]*pxpypz[0]+pxpypz[1]*pxpypz[1]);
        Float_t lam=TMath::ATan2(pxpypz[2],pt); 
        Float_t pt_1=1/pt;

        Int_t pdg=(Int_t)ref->GetLength();  //this is particle's PDG !

        if (TMath::Abs(pdg)==11 && ptg>4.) {//high momentum electrons
           hmpt->Fill((pt_1 - 1/ptg)/(1/ptg)*100.);
        } else {
           Float_t phig=TMath::ATan2(ref->Py(),ref->Px());
           hp->Fill((phi - phig)*1000.);

           Float_t lamg=TMath::ATan2(ref->Pz(),ptg);
           hl->Fill((lam - lamg)*1000.);

           hpt->Fill((pt_1 - 1/ptg)/(1/ptg)*100.);
        }

        Float_t mom=pt/TMath::Cos(lam);
        Float_t dedx=track->GetTPCsignal();
        hep->Fill(mom,dedx,1.);
        if (TMath::Abs(pdg)==211) //pions
	   if (mom>0.4 && mom<0.5) {
              he->Fill(dedx,1.);
           }
      }

      cout<<"\nList of Not found tracks :\n";
      for ( i = 0; i< itrack_notfound; i++){
        cout<<track_notfound[i]<<"\t";
        if ((i%5)==4) cout<<"\n";
      }
      cout<<"\nList of fake  tracks :\n";
      for ( i = 0; i< itrack_fake; i++){
        cout<<track_fake[i]<<"\t";
        if ((i%5)==4) cout<<"\n";
      }
      cout<<"\nList of multiple found tracks :\n";
      for ( i=0; i<itrack_multifound; i++) {
          cout<<"id.   "<<track_multifound[i]
              <<"     found - "<<track_multifound_n[i]<<"times\n";
      }

      cout<<"Number of found tracks ="<<nentr<<endl;
      cout<<"Number of \"good\" tracks ="<<ngood<<endl;

      refs->Clear();
  }// ***** End of the loop over events

   delete event;
   delete esdTree;
   ef->Close();

   delete tpcTree;
   refFile->Close();

   Stat_t ng=hgood->GetEntries(), nf=hfound->GetEntries();
   if (ng!=0) cout<<"\n\nIntegral efficiency is about "<<nf/ng*100.<<" %\n";
   cout<<"Total number selected of \"good\" tracks ="<<allselected<<endl<<endl;
   cout<<"Total number of found tracks ="<<allfound<<endl;
   cout<<"Total number of \"good\" tracks ="<<allgood<<endl;
   cout<<endl;

   gStyle->SetOptStat(111110);
   gStyle->SetOptFit(1);

   TCanvas *c1=new TCanvas("c1","",0,0,700,850);

   Int_t minc=33; 

   TPad *p1=new TPad("p1","",0,0.3,.5,.6); p1->Draw();
   p1->cd(); p1->SetFillColor(42); p1->SetFrameFillColor(10); 
   hp->SetFillColor(4);  hp->SetXTitle("(mrad)"); 
   if (hp->GetEntries()<minc) hp->Draw(); else hp->Fit("gaus"); c1->cd();

   TPad *p2=new TPad("p2","",0.5,.3,1,.6); p2->Draw(); 
   p2->cd(); p2->SetFillColor(42); p2->SetFrameFillColor(10);
   hl->SetXTitle("(mrad)");
   if (hl->GetEntries()<minc) hl->Draw(); else hl->Fit("gaus"); c1->cd();

   TPad *p3=new TPad("p3","",0,0,0.5,0.3); p3->Draw();
   p3->cd(); p3->SetFillColor(42); p3->SetFrameFillColor(10); 
   hpt->SetXTitle("(%)");
   if (hpt->GetEntries()<minc) hpt->Draw(); else hpt->Fit("gaus"); c1->cd();

   TPad *p4=new TPad("p4","",0.5,0,1,0.3); p4->Draw();
   p4->cd(); p4->SetFillColor(42); p4->SetFrameFillColor(10);
   hmpt->SetXTitle("(%)");
   if (hmpt->GetEntries()<minc) hmpt->Draw(); else hmpt->Fit("gaus"); c1->cd();

   TPad *p5=new TPad("p5","",0,0.6,1,1); p5->Draw(); p5->cd(); 
   p5->SetFillColor(41); p5->SetFrameFillColor(10);
   hfound->Sumw2(); hgood->Sumw2(); hfake->Sumw2();
   hg->Divide(hfound,hgood,1,1.,"b");
   hf->Divide(hfake,hgood,1,1.,"b");
   hg->SetMaximum(1.4);
   hg->SetYTitle("Tracking efficiency");
   hg->SetXTitle("Pt (GeV/c)");
   hg->Draw();

   TLine *line1 = new TLine(ptcutl,1.0,ptcuth,1.0); line1->SetLineStyle(4);
   line1->Draw("same");
   TLine *line2 = new TLine(ptcutl,0.9,ptcuth,0.9); line2->SetLineStyle(4);
   line2->Draw("same");

   hf->SetFillColor(1);
   hf->SetFillStyle(3013);
   hf->SetLineColor(2);
   hf->SetLineWidth(2);
   hf->Draw("histsame");
   TText *text = new TText(0.461176,0.248448,"Fake tracks");
   text->SetTextSize(0.05);
   text->Draw();
   text = new TText(0.453919,1.11408,"Good tracks");
   text->SetTextSize(0.05);
   text->Draw();



   TCanvas *c2=new TCanvas("c2","",320,32,530,590);

   TPad *p6=new TPad("p6","",0.,0.,1.,.5); p6->Draw();
   p6->cd(); p6->SetFillColor(42); p6->SetFrameFillColor(10); 
   he->SetFillColor(2); he->SetFillStyle(3005);  
   he->SetXTitle("Arbitrary Units"); 
   if (he->GetEntries()<minc) he->Draw(); else he->Fit("gaus"); c2->cd();

   TPad *p7=new TPad("p7","",0.,0.5,1.,1.); p7->Draw(); 
   p7->cd(); p7->SetFillColor(42); p7->SetFrameFillColor(10);
   hep->SetXTitle("p (Gev/c)"); hep->SetYTitle("dE/dX (Arb. Units)"); 
   hep->Draw(); c1->cd();

   TFile fc("AliTPCUComparison.root","RECREATE");
   c1->Write();
   c2->Write();
   fc.Close();

   gBenchmark->Stop("AliTPCUComparison");
   gBenchmark->Show("AliTPCUComparison");

   return 0;
}


Int_t GoodTracksTPC(const Char_t *dir) {
   Char_t fname[100];
   sprintf(fname,"%s/galice.root",dir);

   AliRunLoader *rl = AliRunLoader::Open(fname,"COMPARISON");
   if (!rl) {
      ::Error("GoodTracksTPC","Can't start session !");
      return 1;
   }

   rl->LoadgAlice();
   rl->LoadHeader();
   rl->LoadKinematics();
   rl->LoadTrackRefs();

   AliTPCLoader *tpcl = (AliTPCLoader *)rl->GetLoader("TPCLoader");
   if (tpcl == 0x0) {
      ::Error("GoodTracksTPC","Can not find TPCLoader !");
      delete rl;
      return 2;
   }
      
   AliTPC *TPC=(AliTPC*)rl->GetAliRun()->GetDetector("TPC");
   Int_t ver = TPC->IsVersion(); 
   cout<<"TPC version "<<ver<<" has been found !\n";
   if (ver==1) tpcl->LoadRecPoints();
   else if (ver==2) tpcl->LoadDigits();
   else {
      ::Error("GoodTracksTPC","Wrong TPC version !");
      delete rl;
      return 3;
   } 

  TGeoGlobalMagField::Instance()->SetField(
  new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG));

   AliCDBManager *man=AliCDBManager::Instance();
   man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
   man->SetRun(0);
   AliTPCParamSR *digp=
   (AliTPCParamSR*)(AliTPCcalibDB::Instance()->GetParameters());
   if (!digp) { 
     ::Error("AliTPCUComparison.C","TPC parameters have not been found !");
     delete rl;
     return 4; 
   }

   Int_t nrow_up=digp->GetNRowUp();
   Int_t nrows=digp->GetNRowLow()+nrow_up;
   Int_t zero=digp->GetZeroSup();
   Int_t gap=Int_t(0.125*nrows), shift=Int_t(0.5*gap);
   Int_t good_number=Int_t(0.4*nrows);

   Int_t nev=rl->GetNumberOfEvents();
   ::Info("GoodTracksTPC","Number of events : %d\n",nev);  


   sprintf(fname,"%s/GoodTracksTPC.root",dir);
   TFile *file=TFile::Open(fname,"recreate");

   TClonesArray dummy("AliTrackReference",1000), *refs=&dummy;
   TTree tpcTree("tpcTree","Tree with info about the reconstructable TPC tracks");
   tpcTree.Branch("TPC",&refs);

   //********  Loop over generated events 
   for (Int_t e=0; e<nev; e++) {
     Int_t nt=0;
     refs->Clear();

     Int_t i;

     rl->GetEvent(e);  file->cd();

     Int_t np = rl->GetHeader()->GetNtrack();
     cout<<"Event "<<e<<" Number of particles: "<<np<<endl;

     //******** Fill the "good" masks
     Int_t *good=new Int_t[np]; for (i=0; i<np; i++) good[i]=0;
     switch (ver) {
     case 1:
       /*
        {
        AliTPCClustersArray *pca=new AliTPCClustersArray, &ca=*pca;
        ca.Setup(digp);
        ca.SetClusterType("AliTPCcluster");
        ca.ConnectTree(tpcl->TreeR());
        Int_t nrows=Int_t(ca.GetTree()->GetEntries());
        for (Int_t n=0; n<nrows; n++) {
          AliSegmentID *s=ca.LoadEntry(n);
          Int_t sec,row;
          digp->AdjustSectorRow(s->GetID(),sec,row);
          AliTPCClustersRow &clrow = *ca.GetRow(sec,row);
          Int_t ncl=clrow.GetArray()->GetEntriesFast();
          while (ncl--) {
              AliTPCcluster *c=(AliTPCcluster*)clrow[ncl];
              Int_t lab=c->GetLabel(0);
              if (lab<0) continue; //noise cluster
              lab=TMath::Abs(lab);

              if (sec>=digp->GetNInnerSector())
                 if (row==nrow_up-1) good[lab]|=0x4000;
              if (sec>=digp->GetNInnerSector())
                 if (row==nrow_up-1-gap) good[lab]|=0x1000;

              if (sec>=digp->GetNInnerSector())
                 if (row==nrow_up-1-shift) good[lab]|=0x2000;
              if (sec>=digp->GetNInnerSector())
                 if (row==nrow_up-1-gap-shift) good[lab]|=0x800;

              good[lab]++;
          }
          ca.ClearRow(sec,row);
        }
        delete pca;
        }
        break;
       */
     case 2:
        {
        TTree *TD=tpcl->TreeD();
      
        AliSimDigits da, *digits=&da;
        TD->GetBranch("Segment")->SetAddress(&digits);

        Int_t *count = new Int_t[np];
        Int_t i;
        for (i=0; i<np; i++) count[i]=0;

        Int_t sectors_by_rows=(Int_t)TD->GetEntries();
        for (i=0; i<sectors_by_rows; i++) {
          if (!TD->GetEvent(i)) continue;
          Int_t sec,row;
          digp->AdjustSectorRow(digits->GetID(),sec,row);
	  //cerr<<sec<<' '<<row<<'\r';
          digits->First();
          do { //Many thanks to J.Chudoba who noticed this
              Int_t it=digits->CurrentRow(), ip=digits->CurrentColumn();
              Short_t dig = digits->GetDigit(it,ip);
              Int_t idx0=digits->GetTrackID(it,ip,0); 
              Int_t idx1=digits->GetTrackID(it,ip,1);
              Int_t idx2=digits->GetTrackID(it,ip,2);
              if (idx0>=0 && dig>=zero && idx0<np) count[idx0]+=1;
              if (idx1>=0 && dig>=zero && idx1<np) count[idx1]+=1;
              if (idx2>=0 && dig>=zero && idx2<np) count[idx2]+=1;
          } while (digits->Next());
          for (Int_t j=0; j<np; j++) {
              if (count[j]>1) {
                 if (sec>=digp->GetNInnerSector())
		   if (row==nrow_up-1    ) good[j]|=0x4000;
                 if (sec>=digp->GetNInnerSector())
		   if (row==nrow_up-1-gap) good[j]|=0x1000;

                 if (sec>=digp->GetNInnerSector())
		   if (row==nrow_up-1-shift) good[j]|=0x2000;
                 if (sec>=digp->GetNInnerSector())
		   if (row==nrow_up-1-gap-shift) good[j]|=0x800;
                 good[j]++;
              }
              count[j]=0;
          }
        }
        delete[] count;
        }
        break;
     }


     //****** select tracks which are "good" enough
     AliStack* stack = rl->Stack();
     for (i=0; i<np; i++) {
        if ((good[i]&0x5000) != 0x5000)
        if ((good[i]&0x2800) != 0x2800) continue;
        if ((good[i]&0x7FF ) < good_number) continue;
        TParticle *p = (TParticle*)stack->Particle(i);
        if (p == 0x0) {
         cerr<<"Can not get particle "<<i<<endl;
         continue;
        }
        if (p->Pt() <= 0.) continue;
        if (TMath::Abs(p->Pz()/p->Pt())>0.999) continue;

        Double_t vx=p->Vx(),vy=p->Vy(),vz=p->Vz();
        if (TMath::Sqrt(vx*vx+vy*vy)>3.5) continue;
        if (TMath::Abs(vz) > 50.) continue;

        AliTrackReference *ref=new((*refs)[nt]) AliTrackReference();

        ref->SetLabel(i);
        Int_t pdg=p->GetPdgCode();
        ref->SetLength(pdg);  //This will the particle's PDG !
        ref->SetMomentum(0.,0.,0.);  
        ref->SetPosition(0.,0.,0.);

        nt++;
     }

     //**** check if there is also information at the entrance of the TPC
     TTree *TR=rl->TreeTR();
     TBranch *branch=TR->GetBranch("TrackReferences");
     if (branch==0) {
        ::Error("GoodTracksTPC","No track references !");
        delete rl;
        return 5;
     }
     TClonesArray tpcdummy("AliTrackReference",1000), *tpcRefs=&tpcdummy;
     branch->SetAddress(&tpcRefs);
     Int_t nr=(Int_t)TR->GetEntries();
     for (Int_t r=0; r<nr; r++) {
         //cerr<<r<<' '<<nr<<'\r';
         TR->GetEvent(r);

	 Int_t nref = tpcRefs->GetEntriesFast();
         if (!nref) continue;
         AliTrackReference *tpcRef= 0x0;	 
	 for (Int_t iref=0; iref<nref; ++iref) {
	   tpcRef = (AliTrackReference*)tpcRefs->UncheckedAt(iref);
	   if (tpcRef->DetectorId() == AliTrackReference::kTPC) break;
	   tpcRef = 0x0;
	 }

	 if (!tpcRef) continue;

         Int_t j;
	 AliTrackReference *ref=0;
         for (j=0; j<nt; j++) {
	   ref=(AliTrackReference *)refs->UncheckedAt(j);
           if (ref->Label()==tpcRef->Label()) break;
           ref=0;
	 }  
         if (ref==0) continue;

         ref->SetMomentum(tpcRef->Px(),tpcRef->Py(),tpcRef->Pz());
         ref->SetPosition(tpcRef->LocalX(),tpcRef->LocalY(),tpcRef->Z());

	 tpcRefs->Clear();
     }

     tpcTree.Fill();

     delete[] good;
   } //****** end of the loop over generated events

   
   tpcTree.Write();
   file->Close();

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