]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG4/PartCorrBase/AliAnalysisTaskCounter.cxx
801b459ac33fcca81f7dde0892ce23a86de819e3
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliAnalysisTaskCounter.cxx
1 /**************************************************************************\r
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3  *                                                                        *\r
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15 /* $Id: $ */
16
17 //_________________________________________________________________________
18 // Count events with different selections
19 //
20 // It produces a histogram with the number of events with 9 bins:
21 // 0: all events (that passed the physics selection if it was on)
22 // 1: same but cross check that event pointer did exist
23 // 2: passes vertex cut
24 // 3: passes track number cut, tracks for eta < 0.8
25 // 4: 3 && 2
26 // 5: pass VAND
27 // 6: 5 && 2
28 // 7: 5 && 3
29 // 8: 5 && 3 && 2
30 // 9: not pileup from SPD
31 // 10: Good vertex
32 // 11: 10 && 5
33 // 12: 10 && 3
34 // 13: 10 && 2
35 // 14: 10 && 2 && 3 && 5
36 // 15: 10 && 9
37 // 16: 9  && 5
38 //
39 // Author: Gustavo Conesa Balbastre (LPSC)
40 //         
41 //_________________________________________________________________________
42
43 #include "TH2F.h"
44 #include "AliAODHeader.h"
45 #include "AliTriggerAnalysis.h"
46 #include "AliESDEvent.h"
47 #include "AliESDtrackCuts.h"
48 #include "AliAnalysisManager.h"
49 #include "AliInputEventHandler.h"
50
51 #include "AliAnalysisTaskCounter.h"
52 ClassImp(AliAnalysisTaskCounter)
53
54 //________________________________________________________________________
55 AliAnalysisTaskCounter::AliAnalysisTaskCounter(const char *name) 
56 : AliAnalysisTaskSE(name), 
57   fZVertexCut(10.),
58   fTrackMultEtaCut(0.8),
59   fCaloFilterPatch(kFALSE),
60   fOutputContainer(0x0), 
61   fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),
62   fTriggerAnalysis (new AliTriggerAnalysis),
63   fhNEvents(0),
64   fhXVertex(0),fhYVertex(0),fhZVertex(0),
65   fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)
66 {
67   //ctor
68   DefineOutput(1, TList::Class());
69 }
70
71 //________________________________________________________________________
72 AliAnalysisTaskCounter::AliAnalysisTaskCounter() 
73   : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisTaskCounter"),
74     fZVertexCut(10.),
75     fTrackMultEtaCut(0.8),
76     fCaloFilterPatch(kFALSE),
77     fOutputContainer(0x0), 
78     fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),
79     fTriggerAnalysis (new AliTriggerAnalysis),
80     fhNEvents(0),
81     fhXVertex(0),fhYVertex(0),fhZVertex(0),
82     fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)
83 {
84   // ctor
85   DefineOutput(1, TList::Class());
86 }
87
88 //__________________________________________________
89 AliAnalysisTaskCounter::~AliAnalysisTaskCounter()
90 {
91   //Destructor
92   if(fOutputContainer){
93     fOutputContainer->Delete() ; 
94     delete fOutputContainer ;
95   }
96   
97   if(fESDtrackCuts)    delete fESDtrackCuts;
98   if(fTriggerAnalysis) delete fTriggerAnalysis;
99   
100 }
101
102
103 //-------------------------------------------------------------------
104 void AliAnalysisTaskCounter::UserCreateOutputObjects()
105 {
106   // Init histograms
107   
108   fOutputContainer = new TList();
109   
110   fhZVertex     = new TH1F("hZVertex", " Z vertex distribution"   , 200 , -50 , 50  ) ;
111   fhZVertex->SetXTitle("v_{z} (cm)");
112   fOutputContainer->Add(fhZVertex);
113
114   fhZGoodVertex     = new TH1F("hZGoodVertex", " Good Z vertex distribution"   , 200 , -50 , 50  ) ;
115   fhZGoodVertex->SetXTitle("v_{z} (cm)");
116   fOutputContainer->Add(fhZGoodVertex);
117   
118   fhXVertex     = new TH1F("hXVertex", " X vertex distribution"   , 200 , -2 , 2  ) ;
119   fhXVertex->SetXTitle("v_{x} (cm)");
120   fOutputContainer->Add(fhXVertex);
121   
122   fhXGoodVertex     = new TH1F("hXGoodVertex", " Good X vertex distribution"   , 200 , -2 , 2  ) ;
123   fhXGoodVertex->SetXTitle("v_{x} (cm)");
124   fOutputContainer->Add(fhXGoodVertex);
125   
126   fhYVertex     = new TH1F("hYVertex", " Y vertex distribution"   , 200 , -2 , 2  ) ;
127   fhYVertex->SetXTitle("v_{y} (cm)");
128   fOutputContainer->Add(fhYVertex);
129   
130   fhYGoodVertex     = new TH1F("hYGoodVertex", " Good Y vertex distribution"   , 200 , -2 , 2  ) ;
131   fhYGoodVertex->SetXTitle("v_{y} (cm)");
132   fOutputContainer->Add(fhYGoodVertex);
133   
134   
135   fhNEvents = new TH1I("hNEvents", "Number of analyzed events", 17, 0, 17) ;
136   fhNEvents->SetXTitle("Selection");
137   fhNEvents->SetYTitle("# events");
138   fhNEvents->GetXaxis()->SetBinLabel(1 ,"1  = PS");
139   fhNEvents->GetXaxis()->SetBinLabel(2 ,"2  = 1  & ESD");
140   fhNEvents->GetXaxis()->SetBinLabel(3 ,"3  = 2  & |Z|<10");
141   fhNEvents->GetXaxis()->SetBinLabel(4 ,"4  = 2  & |eta|<0.8");
142   fhNEvents->GetXaxis()->SetBinLabel(5 ,"5  = 3  & 4");
143   fhNEvents->GetXaxis()->SetBinLabel(6 ,"6  = 2  & V0AND");
144   fhNEvents->GetXaxis()->SetBinLabel(7 ,"7  = 3  & 6");
145   fhNEvents->GetXaxis()->SetBinLabel(8 ,"8  = 4  & 6");
146   fhNEvents->GetXaxis()->SetBinLabel(9 ,"9  = 5  & 6");
147   fhNEvents->GetXaxis()->SetBinLabel(10,"10 = 2  & not pileup");
148   fhNEvents->GetXaxis()->SetBinLabel(11,"11 = 2  & good vertex");
149   fhNEvents->GetXaxis()->SetBinLabel(12,"12 = 3  & 11");
150   fhNEvents->GetXaxis()->SetBinLabel(13,"13 = 4  & 11");
151   fhNEvents->GetXaxis()->SetBinLabel(14,"14 = 6  & 11");
152   fhNEvents->GetXaxis()->SetBinLabel(15,"15 = 9  & 11");
153   fhNEvents->GetXaxis()->SetBinLabel(16,"16 = 10 & 11");
154   fhNEvents->GetXaxis()->SetBinLabel(17,"17 = 6  & 10");
155
156   fOutputContainer->Add(fhNEvents);
157
158   fOutputContainer->SetOwner(kTRUE);
159   
160   PostData(1,fOutputContainer);
161   
162 }
163
164 //________________________________________________________________________
165 void AliAnalysisTaskCounter::UserExec(Option_t *) 
166 {
167   // Main loop
168   // Called for each event
169   
170   //printf("___ Event __ %d __\n",(Int_t)Entry());
171   
172   fhNEvents->Fill(0.5);  
173   
174   AliVEvent * event = InputEvent();
175   if (!event) {
176     printf("AliAnalysisTaskCounter::UserExec() - ERROR: event not available \n");
177     return;
178   }
179   AliESDEvent * esdevent = dynamic_cast<AliESDEvent*> (event);
180
181   fhNEvents->Fill(1.5);  
182     
183   //Initialize bools
184   Bool_t bSelectVZ    = kFALSE;
185   Bool_t bV0AND       = kFALSE; 
186   Bool_t bPileup      = kFALSE;
187   Bool_t bGoodV       = kFALSE;
188   Bool_t bSelectTrack = kFALSE;   
189   Int_t  trackMult    = 0;
190   
191   //---------------------------------
192   //Get the primary vertex, cut on Z
193   //---------------------------------
194   Double_t v[3];
195   event->GetPrimaryVertex()->GetXYZ(v) ;
196   fhXVertex->Fill(v[0]);
197   fhYVertex->Fill(v[1]);
198   fhZVertex->Fill(v[2]);
199   
200   if(TMath::Abs(v[2]) < fZVertexCut) {
201     bSelectVZ=kTRUE;
202     fhNEvents->Fill(2.5);  
203   }
204   //else printf("Vertex out %f \n",v[2]);
205   
206
207   //--------------------------------------------------
208   //Tweak for calorimeter only productions
209   //--------------------------------------------------
210   if(fCaloFilterPatch && !esdevent){ 
211     if(event->GetNumberOfCaloClusters() > 0) {
212       AliVCluster * calo = event->GetCaloCluster(0);
213       if(calo->GetNLabels() == 4){
214         Int_t * selection = calo->GetLabels();
215         bPileup   = selection[0];
216         bGoodV    = selection[1]; 
217         bV0AND    = selection[2]; 
218         trackMult = selection[3];
219         //if(selection[0] || selection[1] || selection[2])
220         //printf(" pu %d, gv %d, v0 %d, track mult %d\n ", selection[0], selection[1], selection[2], selection[3]);
221         if(trackMult > 0 )  
222           bSelectTrack = kFALSE;
223       } else {
224         //First filtered AODs, track multiplicity stored there.  
225         trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();
226       }
227     }else{//at least one cluster
228         //printf("AliAnalysisTaskCounter::UserExec() - No clusters in event\n");
229         //Remove events with  vertex (0,0,0), bad vertex reconstruction
230         if(TMath::Abs(v[0]) < 1.e-6 && TMath::Abs(v[1]) < 1.e-6 && TMath::Abs(v[2]) < 1.e-6) bGoodV = kFALSE;
231       
232         //First filtered AODs, track multiplicity stored there.  
233         trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();
234     }
235   }
236   else {
237     //--------------------------------------------------
238     //Count tracks, cut on number of tracks in eta < 0.8
239     //--------------------------------------------------
240     Int_t nTracks   = event->GetNumberOfTracks() ;
241     for (Int_t itrack =  0; itrack <  nTracks; itrack++) {////////////// track loop
242       AliVTrack * track = (AliVTrack*)event->GetTrack(itrack) ; // retrieve track from esd
243       
244       //Only for ESDs
245       if(esdevent && !fESDtrackCuts->AcceptTrack((AliESDtrack*)track)) continue;
246       
247       //Do not count tracks out of acceptance cut
248       if(TMath::Abs(track->Eta())< fTrackMultEtaCut) trackMult++;
249     }
250   }
251   
252   //printf("AliAnalysisTaskCounter::UserExec() - Track Mult %d \n",trackMult);
253   
254   //--------------------------------------------------
255   // At least one track
256   //--------------------------------------------------
257   if (trackMult > 0) {
258     bSelectTrack = kTRUE; 
259                   fhNEvents->Fill(3.5);
260     if(bSelectVZ) fhNEvents->Fill(4.5);
261   }
262   
263   //---------------------------------
264   // V0AND
265   //---------------------------------
266   if(esdevent && !fCaloFilterPatch) bV0AND = fTriggerAnalysis->IsOfflineTriggerFired(esdevent, AliTriggerAnalysis::kV0AND);
267   //else if(aodevent  && !fCaloFilterPatch) bV0AND = //FIXME FOR AODs
268   
269   if(bV0AND)
270   {
271                                     fhNEvents->Fill(5.5);
272     if (bSelectVZ)                  fhNEvents->Fill(6.5);
273     if (bSelectTrack)               fhNEvents->Fill(7.5);
274     if (bSelectVZ &&  bSelectTrack) fhNEvents->Fill(8.5);
275   }
276   
277   //---------------------------------
278   // Pileup
279   //---------------------------------
280   if(!fCaloFilterPatch)
281     bPileup = event->IsPileupFromSPD(3, 0.8, 3., 2., 5.); //Default values, if not it does not compile
282   //bPileup = event->IsPileupFromSPD(); 
283   if (!bPileup){
284                 fhNEvents->Fill(9.5);
285     if(bV0AND)  fhNEvents->Fill(16.5);
286   }
287   
288   //---------------------------------
289   // Good vertex
290   //---------------------------------
291   if(esdevent && !fCaloFilterPatch) bGoodV = CheckForPrimaryVertex();
292   if(bGoodV) 
293   {
294     fhXGoodVertex->Fill(v[0]);
295     fhYGoodVertex->Fill(v[1]);
296     fhZGoodVertex->Fill(v[2]);
297     
298                      fhNEvents->Fill(10.5);
299     if(bSelectVZ)    fhNEvents->Fill(11.5);
300     if(bSelectTrack) fhNEvents->Fill(12.5);
301     if(bV0AND)       fhNEvents->Fill(13.5);
302     if(bSelectVZ && bSelectTrack && bV0AND)    
303                      fhNEvents->Fill(14.5); 
304     if(!bPileup)     fhNEvents->Fill(15.5); 
305   }
306
307   //printf("AliAnalysisTaskCounter::UserExec() : z vertex %d, good vertex %d, v0and %d, pile up %d, track mult %d\n ", bSelectVZ, bGoodV, bV0AND, bPileup, trackMult);
308   
309   PostData(1,fOutputContainer);
310
311 }
312
313 //____________________________________________________________________________
314 Bool_t AliAnalysisTaskCounter::CheckForPrimaryVertex(){
315   //Check if the vertex was well reconstructed, copy from V0Reader of conversion group
316   //It only works for ESDs
317   
318   AliESDEvent * event = dynamic_cast<AliESDEvent*> (InputEvent());
319   if(!event) return 0;
320   
321   if(event->GetPrimaryVertexTracks()->GetNContributors() > 0) {
322     return 1;
323   }
324   
325   if(event->GetPrimaryVertexTracks()->GetNContributors() < 1) {
326     // SPD vertex
327     if(event->GetPrimaryVertexSPD()->GetNContributors() > 0) {
328       //cout<<"spd vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;
329       return 1;
330       
331     }
332     if(event->GetPrimaryVertexSPD()->GetNContributors() < 1) {
333       //      cout<<"bad vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;
334       return 0;
335     }
336   }
337   return 0;
338   //return fInputEvent->GetPrimaryVertex()->GetNContributors()>0;
339 }
340
341
342
343 //_____________________________________________________
344 void AliAnalysisTaskCounter::FinishTaskOutput()
345 {
346   // Put in the output some event summary histograms
347   
348   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
349   AliInputEventHandler *inputH = dynamic_cast<AliInputEventHandler*>(am->GetInputEventHandler());
350   if (!inputH) return; 
351   TH2F *histStat = dynamic_cast<TH2F*>(inputH->GetStatistics()); 
352   TH2F *histBin0 = dynamic_cast<TH2F*>(inputH->GetStatistics("BIN0"));
353   
354   if(histStat)
355     fOutputContainer->Add(histStat);
356   else
357     printf("AliAnalysisTaskCounter::FinishTaskOutput() - Stat histogram not available check, \n if ESDs, that AliPhysicsSelection was on, \n if AODs, if EventStat_temp.root exists \n");
358
359   if(histBin0)
360     fOutputContainer->Add(histBin0); 
361   
362 }