New developments of the analysis framework - selectorised version of the manager...
[u/mrichter/AliRoot.git] / RICH / AliRICHSelector.C
1 #include <TF1.h>
2 #include <TH2F.h>
3 #include <TCanvas.h>  //Terminate()
4 #include <TChain.h>
5 #include <TBenchmark.h>
6 #include <fstream>    //caf()      
7 #include <TProof.h>   //caf()
8 #include <AliSelector.h>      //base class
9 #include <AliESD.h>           
10
11
12 class AliRICHSelector : public AliSelector {
13  public :
14            AliRICHSelector():AliSelector(),fChain(0),fEsd(0),fCkovP(0),fMipXY(0),fDifXY(0),fSigP(0) {for(Int_t i=0;i<5;i++) fProb[i]=0;}
15   virtual ~AliRICHSelector()                                                                      {delete fEsd;}
16
17
18   virtual Int_t   Version        () const {return 2;}
19   virtual void    Begin          (TTree *) {}
20   virtual void    SlaveBegin     (TTree *tree);
21   virtual void    Init           (TTree *tree);
22   virtual Bool_t  Notify         ()    {return kTRUE;}
23   virtual Bool_t  Process        (Long64_t entry);
24   virtual void    SetOption      (const char *option) { fOption = option; }
25   virtual void    SetObject      (TObject *obj) { fObject = obj; }
26   virtual void    SetInputList   (TList *input) {fInput = input;}
27   virtual TList  *GetOutputList  () const { return fOutput; }
28   virtual void    SlaveTerminate ();
29   virtual void    Terminate      ();
30
31  private: 
32   TTree          *fChain ;   //!pointer to the analyzed TTree or TChain
33   AliESD         *fEsd ;     //!
34
35   TH2F           *fCkovP,*fMipXY,*fDifXY,*fSigP; //!
36   TH1F           *fProb[5];                      //!
37
38   ClassDef(AliRICHSelector,0);  
39 };
40
41
42 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
43 void AliRICHSelector::SlaveBegin(TTree *tree)
44 {
45 // The SlaveBegin() function is called after the Begin() function.  When running with PROOF SlaveBegin() is called on each slave server.
46 // The tree argument is deprecated (on PROOF 0 is passed).
47
48    Init(tree);
49
50    TString option = GetOption();
51
52    // create histograms on each slave server
53    fCkovP    = new TH2F("CkovP" , "#theta_{c}, [rad];P, [GeV]", 150,   0,  7  ,100, -3, 1); 
54    fSigP     = new TH2F("SigP"  ,"#sigma_{#theta_c}"          , 150,   0,  7  ,100, 0, 1e20);
55    fMipXY    = new TH2F("MipXY" ,"mip position"               , 260,   0,130  ,252,0,126); 
56    fDifXY    = new TH2F("DifXY" ,"diff"                       , 260, -10, 10  ,252,-10,10); 
57
58    fProb[0] = new TH1F("PidE" ,"PID: e yellow #mu magenta"  ,100,0,1); fProb[0]->SetLineColor(kYellow);
59    fProb[1] = new TH1F("PidMu","pid of #mu"                 ,100,0,1); fProb[1]->SetLineColor(kMagenta);
60    fProb[2] = new TH1F("PidPi","PID: #pi red K green p blue",100,0,1); fProb[2]->SetLineColor(kRed);
61    fProb[3] = new TH1F("PidK" ,"pid of K"                   ,100,0,1); fProb[3]->SetLineColor(kGreen);
62    fProb[4] = new TH1F("PidP" ,"pid of p"                   ,100,0,1); fProb[4]->SetLineColor(kBlue);
63 }
64 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
65 void AliRICHSelector::Init(TTree *pTr)
66 {
67    // The Init() function is called when the selector needs to initialize
68    // a new tree or chain. Typically here the branch addresses of the tree
69    // will be set. It is normaly not necessary to make changes to the
70    // generated code, but the routine can be extended by the user if needed.
71    // Init() will be called many times when running with PROOF.
72
73    // Set branch addresses
74    if ( !pTr )  return ;
75    fChain = pTr ;
76    fChain->SetBranchAddress("ESD", &fEsd) ;
77    fChain->SetBranchStatus("*", 0);
78    fChain->SetBranchStatus("fTracks.*", 1);
79 }
80 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81 Bool_t AliRICHSelector::Process(Long64_t entry)
82 {
83
84   fChain->GetTree()->GetEntry(entry);
85
86   for(Int_t iTrk=0;iTrk<fEsd->GetNumberOfTracks();iTrk++){
87      AliESDtrack *pTrk=fEsd->GetTrack(iTrk);
88      
89 //     if(pTrk->GetRICHsignal()<0) continue;
90      
91      fCkovP->Fill(pTrk->GetP(),pTrk->GetRICHsignal()) ; 
92      fSigP ->Fill(pTrk->GetP(),TMath::Sqrt(pTrk->GetRICHchi2()));
93      
94 //     Float_t xm,ym; Int_t q,np;  pTrk->GetRICHmip(xm,ym,q,np);  fMipXY->Fill(xm,ym); //mip info
95 //     Float_t xd,yd,th,ph;        pTrk->GetRICHtrk(xd,yd,th,ph); fDifXY->Fill(xd,yd); //track info 
96      
97      Double_t pid[5];  pTrk->GetRICHpid(pid); for(Int_t i =0;i<5;i++) fProb[i]->Fill(pid[i]);
98   }//tracks loop 
99      
100   return kTRUE;
101 }//Process()
102 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
103 void AliRICHSelector::SlaveTerminate()
104 {
105   // The SlaveTerminate() function is called after all entries or objects
106   // have been processed. When running with PROOF SlaveTerminate() is called
107   // on each slave server.
108   
109   // Add the histograms to the output on each slave server
110   
111   fOutput->Add(fCkovP);
112   fOutput->Add(fSigP); 
113   fOutput->Add(fMipXY);
114   fOutput->Add(fDifXY);
115   
116   for(Int_t i=0;i<5;i++) fOutput->Add(fProb[i]);
117 }//SlaveTerminate()
118 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
119 void AliRICHSelector::Terminate()
120 {
121    // The Terminate() function is the last function to be called during
122    // a query. It always runs on the client, it can be used to present
123    // the results graphically or save the results to file.
124   
125   fCkovP   = dynamic_cast<TH2F*>(fOutput->FindObject("CkovP")) ;
126   fSigP    = dynamic_cast<TH2F*>(fOutput->FindObject("SigP")) ; 
127   fMipXY   = dynamic_cast<TH2F*>(fOutput->FindObject("MipXY")) ;
128   fDifXY   = dynamic_cast<TH2F*>(fOutput->FindObject("DifXY")) ;
129   
130   fProb[0] = dynamic_cast<TH1F*>(fOutput->FindObject("PidE")) ;
131   fProb[1] = dynamic_cast<TH1F*>(fOutput->FindObject("PidMu")) ;
132   fProb[2] = dynamic_cast<TH1F*>(fOutput->FindObject("PidPi")) ;
133   fProb[3] = dynamic_cast<TH1F*>(fOutput->FindObject("PidK")) ;
134   fProb[4] = dynamic_cast<TH1F*>(fOutput->FindObject("PidP")) ;
135
136   Float_t n=1.292; //mean freon ref idx 
137   TF1 *pPi=new TF1("RiPiTheo","acos(sqrt(x*x+[0]*[0])/(x*[1]))",1.2,7); pPi->SetLineWidth(1); pPi->SetParameter(1,n); 
138   AliPID ppp;                 pPi->SetLineColor(kRed);   pPi->SetParameter(0,AliPID::ParticleMass(AliPID::kPion));    //mass
139   TF1 *pK=(TF1*)pPi->Clone(); pK ->SetLineColor(kGreen); pK ->SetParameter(0,AliPID::ParticleMass(AliPID::kKaon)); 
140   TF1 *pP=(TF1*)pPi->Clone(); pP ->SetLineColor(kBlue);  pP ->SetParameter(0,AliPID::ParticleMass(AliPID::kProton)); 
141
142   TCanvas *pC=new TCanvas("c1","ESD QA");pC->SetFillColor(10); pC->SetHighLightColor(10); pC->Divide(3,2);
143   pC->cd(1); fCkovP->Draw(); pPi->Draw("same"); pK->Draw("same"); pP->Draw("same");   pC->cd(2); fMipXY->Draw();   pC->cd(3); fProb[0]->Draw(); fProb[1]->Draw("same"); 
144   pC->cd(4); fSigP ->Draw();                                                          pC->cd(5); fDifXY->Draw();   pC->cd(6); fProb[2]->Draw(); fProb[3]->Draw("same"); fProb[4]->Draw("same"); 
145   
146 }
147 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
148
149
150
151 void loc()
152 {
153   TChain* pChain =new TChain("esdTree");
154   pChain->Add("AliESDs.root");
155
156   pChain->Process("AliRICHSelector.C+");        
157 }
158 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
159 void caf()
160 {
161   gBenchmark->Start("PRooF exec");
162   TChain* pChain =new TChain("esdTree");
163   
164   ifstream list; list.open("list.txt");
165
166   TString file;
167   while(list.good()) {
168     list>>file;
169     if (!file.Contains("root")) continue; //it's wrong file name
170     pChain->Add(file.Data());
171   }
172   list.close();
173   
174   pChain->GetListOfFiles()->Print();
175   
176   TVirtualProof *pProof=TProof::Open("kir@lxb6046.cern.ch");    
177   pProof->UploadPackage("ESD.par");
178   pProof->EnablePackage("ESD");
179   
180   pChain->SetProof(pProof);
181   pChain->Process("AliRICHSelector.C+");
182   
183   gBenchmark->Show("PRooF exec");
184 }
185 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
186