]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/PiKaPr/TestAOD/AliSpectraAODTrackCuts.cxx
Merge branch 'master' into TPCdev
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TestAOD / AliSpectraAODTrackCuts.cxx
1
2 /**************************************************************************
3  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4  *                                                                        *
5  * Author: The ALICE Off-line Project.                                    *
6  * Contributors are mentioned in the code where appropriate.              *
7  *                                                                        *
8  * Permission to use, copy, modify and distribute this software and its   *
9  * documentation strictly for non-commercial purposes is hereby granted   *
10  * without fee, provided that the above copyright notice appears in all   *
11  * copies and that both the copyright notice and this permission notice   *
12  * appear in the supporting documentation. The authors make no claims     *
13  * about the suitability of this software for any purpose. It is          *
14  * provided "as is" without express or implied warranty.                  *
15  **************************************************************************/
16
17 //-----------------------------------------------------------------
18 //         AliSpectraAODTrackCuts class
19 //-----------------------------------------------------------------
20
21 #include "TChain.h"
22 #include "TTree.h"
23 #include "TLegend.h"
24 #include "TH1F.h"
25 #include "TH1I.h"
26 #include "TH2F.h"
27 #include "TCanvas.h"
28 #include "AliAnalysisTask.h"
29 #include "AliAnalysisManager.h"
30 #include "AliAODTrack.h"
31 #include "AliPIDResponse.h"   
32 #include "AliExternalTrackParam.h"
33 #include "AliAODMCParticle.h"
34 #include "AliAODEvent.h"
35 #include "AliAODInputHandler.h"
36 #include "AliAnalysisTaskESDfilter.h"
37 #include "AliAnalysisDataContainer.h"
38 #include "AliSpectraAODTrackCuts.h"
39 #include <iostream>
40
41 using namespace std;
42
43 const char * AliSpectraAODTrackCuts::kBinLabel[] ={"TrkBit",
44                                                    "TrkCuts",
45                                                    "TrkEta",
46                                                    "TrkDCA",
47                                                    "TrkP",
48                                                    "TrkPt",
49                                                    "TrkPtTOF",
50                                                    "TOFMatching",
51                                                    "kTOFout",
52                                                    "kTIME",
53                                                    "kTOFpid",
54                                                    "Accepted"};
55
56
57 ClassImp(AliSpectraAODTrackCuts)
58
59
60 AliSpectraAODTrackCuts::AliSpectraAODTrackCuts(const char *name) : TNamed(name, "AOD Track Cuts"), fIsSelected(0), fTrackBits(0), fMinTPCcls(0), fEtaCutMin(0), fEtaCutMax(0), fDCACut(0), fPCut(0), fPtCut(0), fYCut(0),
61   fPtCutTOFMatching(0), fHistoCuts(0), fHistoNSelectedPos(0), fHistoNSelectedNeg(0), fHistoNMatchedPos(0), fHistoNMatchedNeg(0), fHistoEtaPhiHighPt(0), fTrack(0), fPIDResponse(0)
62 {
63   // Constructor
64   fHistoCuts = new TH1I("fTrkCuts", "Track Cuts", kNTrkCuts, -0.5, kNTrkCuts - 0.5);
65   for(Int_t ibin=1;ibin<=kNTrkCuts;ibin++)fHistoCuts->GetXaxis()->SetBinLabel(ibin,kBinLabel[ibin-1]);
66   //standard histo
67   const Double_t templBins[] = {0.20,0.30,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.4,2.8,3.2,3.6,4.0,5.0,6.0,7.0,8.0,9.0,10.,12.,15.};
68   const Int_t nbinsTempl=26;
69
70   fHistoNSelectedPos=new TH1F("fHistoNSelectedPos","fHistoNSelectedPos",nbinsTempl,templBins);
71   fHistoNSelectedPos->GetXaxis()->SetTitle("P_{T} (GeV / c)");
72   fHistoNSelectedNeg=new TH1F("fHistoNSelectedNeg","fHistoNSelectedNeg",nbinsTempl,templBins);
73   fHistoNSelectedNeg->GetXaxis()->SetTitle("P_{T} (GeV / c)");
74   fHistoNMatchedPos=new TH1F("fHistoNMatchedPos","fHistoNMatchedPos",nbinsTempl,templBins);
75   fHistoNMatchedPos->GetXaxis()->SetTitle("P_{T} (GeV / c)");
76   fHistoNMatchedNeg=new TH1F("fHistoNMatchedNeg","fHistoNMatchedNeg",nbinsTempl,templBins);
77   fHistoNMatchedNeg->GetXaxis()->SetTitle("P_{T} (GeV / c)");
78   fHistoEtaPhiHighPt=new TH2F("fHistoEtaPhiHighPt","fHistoEtaPhiHighPt",200,-1,1,400,0,7);
79   fHistoEtaPhiHighPt->SetXTitle("eta");
80   fHistoEtaPhiHighPt->SetYTitle("phi");
81   
82   fEtaCutMin = -100000.0; // default value of eta cut ~ no cut
83   fEtaCutMax = 100000.0; // default value of eta cut ~ no cut
84   fDCACut = 100000.0; // default value of dca cut ~ no cut
85   fPCut = 100000.0; // default value of p cut ~ no cut
86   fPtCut = 100000.0; // default value of pt cut ~ no cut 
87   fPtCutTOFMatching=0.6; //default value fot matching with TOF
88   fYCut       = 100000.0; // default value of y cut ~ no cut 
89   fMinTPCcls=70; // ncls in TPC
90 }
91
92 //_______________________________________________________
93 Bool_t AliSpectraAODTrackCuts::IsSelected(AliAODTrack * track,Bool_t FillHistStat)
94 {
95   // Returns true if Track Cuts are selected and applied
96   if (!track)
97     {
98       printf("ERROR: Could not receive track");
99       return kFALSE;
100     }
101   fTrack = track;
102   
103   if(!CheckTrackType()){
104     return kFALSE;
105   }
106   if(FillHistStat)fHistoCuts->Fill(kTrkBit);
107   
108   if(!CheckTrackCuts()){
109     return kFALSE;
110   }
111   if(FillHistStat)fHistoCuts->Fill(kTrkCuts);
112   if(!CheckEtaCut()){
113     return kFALSE;
114   }
115   if(FillHistStat)fHistoCuts->Fill(kTrkEta);
116   if(!CheckDCACut()){
117     return kFALSE;
118   }
119   if(FillHistStat)fHistoCuts->Fill(kTrkDCA);
120   if(!CheckPCut()){
121     return kFALSE;
122   }
123   if(FillHistStat)fHistoCuts->Fill(kTrkP);
124   if(!CheckPtCut()){
125     return kFALSE;
126   }
127   if(FillHistStat)fHistoCuts->Fill(kTrkPt);
128   if(!CheckTOFMatching(FillHistStat)){
129     return kFALSE;
130   }
131   if(FillHistStat)fHistoCuts->Fill(kAccepted);
132   return kTRUE;
133 }
134 //_________________________________________________________
135
136 Bool_t AliSpectraAODTrackCuts::CheckTrackType()
137 {
138   // Check track Type
139   if (fTrack->TestFilterBit(fTrackBits)) return kTRUE;
140   return kFALSE;
141 }
142 //_________________________________________________________
143
144 Bool_t AliSpectraAODTrackCuts::CheckTrackCuts()
145 {
146   // Check additional track Cuts
147   Bool_t PassTrackCuts=kTRUE;
148   if (!fTrack->HasPointOnITSLayer(0) && !fTrack->HasPointOnITSLayer(1))PassTrackCuts=kFALSE; //FIXME 1 SPD for the moment
149   if (fTrack->GetTPCNcls()<fMinTPCcls)PassTrackCuts=kFALSE;
150   return PassTrackCuts;
151 }
152 //________________________________________________________
153 Bool_t AliSpectraAODTrackCuts::CheckEtaCut()
154 {
155   // Check eta cut
156   if (fTrack->Eta() < fEtaCutMax && fTrack->Eta() > fEtaCutMin) return kTRUE;
157   return kFALSE;
158 }
159
160 Bool_t AliSpectraAODTrackCuts::CheckYCut(Double_t mass) 
161 {
162   // check if the rapidity is within the set range
163   Double_t y=-1000;
164   if (mass > 0.) { y = fTrack->Y(mass); }//negative mass for unidentified particles
165   if (TMath::Abs(y) > fYCut || y < -998.) return kFALSE;
166   return kTRUE;
167 }
168 //_______________________________________________________
169 Bool_t AliSpectraAODTrackCuts::CheckDCACut()
170 {
171   // Check DCA cut
172   if (TMath::Abs(fTrack->DCA()) < fDCACut) return kTRUE; //FIXME for newest AOD fTrack->DCA() always gives -999
173   return kFALSE;
174 }
175 //________________________________________________________
176 Bool_t AliSpectraAODTrackCuts::CheckPCut()
177 {
178   // Check P cut
179   if (fTrack->P() < fPCut) return kTRUE;
180   return kFALSE;
181 }
182 //_______________________________________________________
183 Bool_t AliSpectraAODTrackCuts::CheckPtCut()
184 {
185   // check Pt cut
186   if (fTrack->Pt() < fPtCut) return kTRUE;
187   return kFALSE;
188 }
189
190 //_______________________________________________________
191 Bool_t AliSpectraAODTrackCuts::CheckTOFMatching(Bool_t FillHistStat)
192 {
193   if (fTrack->Pt() < fPtCutTOFMatching) return kTRUE;
194   else{
195     if(FillHistStat)fHistoCuts->Fill(kTrkPtTOF);
196     if(fTrack->Charge()>0)fHistoNSelectedPos->Fill(fTrack->Pt());
197     else fHistoNSelectedNeg->Fill(fTrack->Pt());
198     
199     // Get PID response object, if needed
200     if(!fPIDResponse) {
201       AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
202       AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
203       fPIDResponse = inputHandler->GetPIDResponse();
204     }
205     if(!fPIDResponse) {
206       AliFatal("Cannot get pid response");
207       return 0;
208     }
209     
210     if(fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fTrack)==0)return kFALSE; 
211     
212     //check the bits of the selected particles
213     UInt_t status; 
214     status=fTrack->GetStatus();
215     if((status&AliAODTrack::kTOFout)&&FillHistStat)fHistoCuts->Fill(kTrTOFout);
216     if((status&AliAODTrack::kTIME)&&FillHistStat)fHistoCuts->Fill(kTrTIME);
217     if((status&AliAODTrack::kTOFpid)&&FillHistStat)fHistoCuts->Fill(kTrTOFpid);
218     
219     
220     if(FillHistStat)fHistoCuts->Fill(kTOFMatching);
221     if(fTrack->Charge()>0)fHistoNMatchedPos->Fill(fTrack->Pt());
222     else fHistoNMatchedNeg->Fill(fTrack->Pt());
223     if(fTrack->Pt()>1.5){
224       //fHistoEtaPhiHighPt->Fill(fTrack->GetOuterParam()->Eta(),fTrack->GetOuterParam()->Phi());
225       //Printf("AliExternalTrackParam * extpar=(AliExternalTrackParam*)fTrack->GetOuterParam();");
226       //AliExternalTrackParam * extpar=(AliExternalTrackParam*)fTrack->GetOuterParam();
227       fHistoEtaPhiHighPt->Fill(fTrack->Eta(),fTrack->Phi());
228       //Printf("fHistoEtaPhiHighPt->Fill(extpar->Eta(),extpar->Phi());");
229       //fHistoEtaPhiHighPt->Fill(extpar->Eta(),extpar->Phi());
230       //delete extpar;
231     }
232     return kTRUE;
233   }
234 }
235 //_______________________________________________________
236 void AliSpectraAODTrackCuts::PrintCuts() const
237 {
238   // Print cuts
239   cout << "Track Cuts" << endl;
240   cout << " > TrackBit\t" << fTrackBits << endl;
241   cout << " > Eta cut\t" << fEtaCutMin <<","<< fEtaCutMax << endl;
242   cout << " > DCA cut\t" << fDCACut << endl;
243   cout << " > P cut\t" << fPCut << endl;
244   cout << " > Pt cut \t" << fPtCut << endl;
245   cout << " > TPC cls \t" << fMinTPCcls << endl;
246 }
247 //_______________________________________________________
248 void AliSpectraAODTrackCuts::SetTrackType(UInt_t bit)
249 {
250   // Set the type of track to be used. The argument should be the bit number. The mask is produced automatically.
251   fTrackBits = (0x1 << (bit - 1));
252 }
253 //_______________________________________________________
254
255 Long64_t AliSpectraAODTrackCuts::Merge(TCollection* list)
256 {
257   // Merge a list of AliSpectraAODTrackCuts objects with this.
258   // Returns the number of merged objects (including this).
259
260   //  AliInfo("Merging");
261
262   if (!list)
263     return 0;
264
265   if (list->IsEmpty())
266     return 1;
267
268   TIterator* iter = list->MakeIterator();
269   TObject* obj;
270
271   // collections of all histograms
272   TList collections;//FIXME we should only 1 collection
273   TList collections_histoNSelectedPos;
274   TList collections_histoNSelectedNeg;
275   TList collections_histoNMatchedPos;
276   TList collections_histoNMatchedNeg;
277   TList collections_histoEtaPhiHighPt;
278
279   Int_t count = 0;
280
281   while ((obj = iter->Next())) {
282     AliSpectraAODTrackCuts* entry = dynamic_cast<AliSpectraAODTrackCuts*> (obj);
283     if (entry == 0) 
284       continue;
285     
286     TH1I * histo = entry->GetHistoCuts();      
287     collections.Add(histo);
288     TH1F * histoNSelectedPos = entry->GetHistoNSelectedPos();      
289     collections_histoNSelectedPos.Add(histoNSelectedPos);
290     TH1F * histoNSelectedNeg = entry->GetHistoNSelectedNeg();      
291     collections_histoNSelectedNeg.Add(histoNSelectedNeg);
292     TH1F * histoNMatchedPos = entry->GetHistoNMatchedPos();      
293     collections_histoNMatchedPos.Add(histoNMatchedPos);
294     TH1F * histoNMatchedNeg = entry->GetHistoNMatchedNeg();      
295     collections_histoNMatchedNeg.Add(histoNMatchedNeg);
296     TH2F * histoEtaPhiHighPt = entry->GetHistoEtaPhiHighPt();      
297     collections_histoEtaPhiHighPt.Add(histoEtaPhiHighPt);
298     count++;
299   }
300   
301   fHistoCuts->Merge(&collections);
302   fHistoNSelectedPos->Merge(&collections_histoNSelectedPos);
303   fHistoNSelectedNeg->Merge(&collections_histoNSelectedNeg);
304   fHistoNMatchedPos->Merge(&collections_histoNMatchedPos);
305   fHistoNMatchedNeg->Merge(&collections_histoNMatchedNeg);
306   fHistoEtaPhiHighPt->Merge(&collections_histoEtaPhiHighPt);
307   
308   delete iter;
309
310   return count+1;
311 }
312