1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
17 //_________________________________________________________________________
\r
18 // Count events with different selections
\r
20 // It produces a histogram with the number of events with 9 bins:
\r
21 // 0: all events (that passed the physics selection if it was on)
\r
22 // 1: same but cross check that event pointer did exist
\r
23 // 2: passes vertex cut
\r
24 // 3: passes track number cut, tracks for eta < 0.8
\r
30 // 9: not pileup from SPD
\r
35 // 14: 10 && 2 && 3 && 5
\r
39 // Author: Gustavo Conesa Balbastre (LPSC)
\r
41 //_________________________________________________________________________
\r
44 #include "AliAODHeader.h"
\r
45 #include "AliTriggerAnalysis.h"
\r
46 #include "AliESDEvent.h"
\r
47 #include "AliESDtrackCuts.h"
\r
48 #include "AliAnalysisManager.h"
\r
49 #include "AliInputEventHandler.h"
\r
51 #include "AliAnalysisTaskCounter.h"
\r
52 ClassImp(AliAnalysisTaskCounter)
\r
54 //________________________________________________________________________
\r
55 AliAnalysisTaskCounter::AliAnalysisTaskCounter(const char *name)
\r
56 : AliAnalysisTaskSE(name),
\r
58 fTrackMultEtaCut(0.8),
\r
59 fCaloFilterPatch(kFALSE),
\r
60 fOutputContainer(0x0),
\r
61 fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),
\r
62 fTriggerAnalysis (new AliTriggerAnalysis),
\r
64 fhXVertex(0),fhYVertex(0),fhZVertex(0),
\r
65 fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)
\r
68 DefineOutput(1, TList::Class());
\r
71 //________________________________________________________________________
\r
72 AliAnalysisTaskCounter::AliAnalysisTaskCounter()
\r
73 : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisTaskCounter"),
\r
75 fTrackMultEtaCut(0.8),
\r
76 fCaloFilterPatch(kFALSE),
\r
77 fOutputContainer(0x0),
\r
78 fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),
\r
79 fTriggerAnalysis (new AliTriggerAnalysis),
\r
81 fhXVertex(0),fhYVertex(0),fhZVertex(0),
\r
82 fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)
\r
85 DefineOutput(1, TList::Class());
\r
88 //__________________________________________________
\r
89 AliAnalysisTaskCounter::~AliAnalysisTaskCounter()
\r
92 if(fOutputContainer){
\r
93 fOutputContainer->Delete() ;
\r
94 delete fOutputContainer ;
\r
97 if(fESDtrackCuts) delete fESDtrackCuts;
\r
98 if(fTriggerAnalysis) delete fTriggerAnalysis;
\r
103 //-------------------------------------------------------------------
\r
104 void AliAnalysisTaskCounter::UserCreateOutputObjects()
\r
108 fOutputContainer = new TList();
\r
110 fhZVertex = new TH1F("hZVertex", " Z vertex distribution" , 200 , -50 , 50 ) ;
\r
111 fhZVertex->SetXTitle("v_{z} (cm)");
\r
112 fOutputContainer->Add(fhZVertex);
\r
114 fhZGoodVertex = new TH1F("hZGoodVertex", " Good Z vertex distribution" , 200 , -50 , 50 ) ;
\r
115 fhZGoodVertex->SetXTitle("v_{z} (cm)");
\r
116 fOutputContainer->Add(fhZGoodVertex);
\r
118 fhXVertex = new TH1F("hXVertex", " X vertex distribution" , 200 , -2 , 2 ) ;
\r
119 fhXVertex->SetXTitle("v_{x} (cm)");
\r
120 fOutputContainer->Add(fhXVertex);
\r
122 fhXGoodVertex = new TH1F("hXGoodVertex", " Good X vertex distribution" , 200 , -2 , 2 ) ;
\r
123 fhXGoodVertex->SetXTitle("v_{x} (cm)");
\r
124 fOutputContainer->Add(fhXGoodVertex);
\r
126 fhYVertex = new TH1F("hYVertex", " Y vertex distribution" , 200 , -2 , 2 ) ;
\r
127 fhYVertex->SetXTitle("v_{y} (cm)");
\r
128 fOutputContainer->Add(fhYVertex);
\r
130 fhYGoodVertex = new TH1F("hYGoodVertex", " Good Y vertex distribution" , 200 , -2 , 2 ) ;
\r
131 fhYGoodVertex->SetXTitle("v_{y} (cm)");
\r
132 fOutputContainer->Add(fhYGoodVertex);
\r
135 fhNEvents = new TH1I("hNEvents", "Number of analyzed events", 17, 0, 17) ;
\r
136 fhNEvents->SetXTitle("Selection");
\r
137 fhNEvents->SetYTitle("# events");
\r
138 fhNEvents->GetXaxis()->SetBinLabel(1 ,"1 = PS");
\r
139 fhNEvents->GetXaxis()->SetBinLabel(2 ,"2 = 1 & ESD");
\r
140 fhNEvents->GetXaxis()->SetBinLabel(3 ,"3 = 2 & |Z|<10");
\r
141 fhNEvents->GetXaxis()->SetBinLabel(4 ,"4 = 2 & |eta|<0.8");
\r
142 fhNEvents->GetXaxis()->SetBinLabel(5 ,"5 = 3 & 4");
\r
143 fhNEvents->GetXaxis()->SetBinLabel(6 ,"6 = 2 & V0AND");
\r
144 fhNEvents->GetXaxis()->SetBinLabel(7 ,"7 = 3 & 6");
\r
145 fhNEvents->GetXaxis()->SetBinLabel(8 ,"8 = 4 & 6");
\r
146 fhNEvents->GetXaxis()->SetBinLabel(9 ,"9 = 5 & 6");
\r
147 fhNEvents->GetXaxis()->SetBinLabel(10,"10 = 2 & not pileup");
\r
148 fhNEvents->GetXaxis()->SetBinLabel(11,"11 = 2 & good vertex");
\r
149 fhNEvents->GetXaxis()->SetBinLabel(12,"12 = 3 & 11");
\r
150 fhNEvents->GetXaxis()->SetBinLabel(13,"13 = 4 & 11");
\r
151 fhNEvents->GetXaxis()->SetBinLabel(14,"14 = 6 & 11");
\r
152 fhNEvents->GetXaxis()->SetBinLabel(15,"15 = 9 & 11");
\r
153 fhNEvents->GetXaxis()->SetBinLabel(16,"16 = 10 & 11");
\r
154 fhNEvents->GetXaxis()->SetBinLabel(17,"17 = 6 & 10");
\r
156 fOutputContainer->Add(fhNEvents);
\r
158 fOutputContainer->SetOwner(kTRUE);
\r
160 PostData(1,fOutputContainer);
\r
164 //________________________________________________________________________
\r
165 void AliAnalysisTaskCounter::UserExec(Option_t *)
\r
168 // Called for each event
\r
170 //printf("___ Event __ %d __\n",(Int_t)Entry());
\r
172 fhNEvents->Fill(0.5);
\r
174 AliVEvent * event = InputEvent();
\r
176 printf("AliAnalysisTaskCounter::UserExec() - ERROR: event not available \n");
\r
179 AliESDEvent * esdevent = dynamic_cast<AliESDEvent*> (event);
\r
181 fhNEvents->Fill(1.5);
\r
184 Bool_t bSelectVZ = kFALSE;
\r
185 Bool_t bV0AND = kFALSE;
\r
186 Bool_t bPileup = kFALSE;
\r
187 Bool_t bGoodV = kFALSE;
\r
188 Bool_t bSelectTrack = kFALSE;
\r
189 Int_t trackMult = 0;
\r
191 //---------------------------------
\r
192 //Get the primary vertex, cut on Z
\r
193 //---------------------------------
\r
195 event->GetPrimaryVertex()->GetXYZ(v) ;
\r
196 fhXVertex->Fill(v[0]);
\r
197 fhYVertex->Fill(v[1]);
\r
198 fhZVertex->Fill(v[2]);
\r
200 if(TMath::Abs(v[2]) < fZVertexCut) {
\r
202 fhNEvents->Fill(2.5);
\r
204 //else printf("Vertex out %f \n",v[2]);
\r
207 //--------------------------------------------------
\r
208 //Tweak for calorimeter only productions
\r
209 //--------------------------------------------------
\r
210 if(fCaloFilterPatch && !esdevent){
\r
211 if(event->GetNumberOfCaloClusters() > 0) {
\r
212 AliVCluster * calo = event->GetCaloCluster(0);
\r
213 if(calo->GetNLabels() == 4){
\r
214 Int_t * selection = calo->GetLabels();
\r
215 bPileup = selection[0];
\r
216 bGoodV = selection[1];
\r
217 bV0AND = selection[2];
\r
218 trackMult = selection[3];
\r
219 //if(selection[0] || selection[1] || selection[2])
\r
220 //printf(" pu %d, gv %d, v0 %d, track mult %d\n ", selection[0], selection[1], selection[2], selection[3]);
\r
221 if(trackMult > 0 )
\r
222 bSelectTrack = kFALSE;
\r
224 //First filtered AODs, track multiplicity stored there.
\r
225 trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();
\r
227 }else{//at least one cluster
\r
228 //printf("AliAnalysisTaskCounter::UserExec() - No clusters in event\n");
\r
229 //Remove events with vertex (0,0,0), bad vertex reconstruction
\r
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;
\r
232 //First filtered AODs, track multiplicity stored there.
\r
233 trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();
\r
237 //--------------------------------------------------
\r
238 //Count tracks, cut on number of tracks in eta < 0.8
\r
239 //--------------------------------------------------
\r
240 Int_t nTracks = event->GetNumberOfTracks() ;
\r
241 for (Int_t itrack = 0; itrack < nTracks; itrack++) {////////////// track loop
\r
242 AliVTrack * track = (AliVTrack*)event->GetTrack(itrack) ; // retrieve track from esd
\r
245 if(esdevent && !fESDtrackCuts->AcceptTrack((AliESDtrack*)track)) continue;
\r
247 //Do not count tracks out of acceptance cut
\r
248 if(TMath::Abs(track->Eta())< fTrackMultEtaCut) trackMult++;
\r
252 //printf("AliAnalysisTaskCounter::UserExec() - Track Mult %d \n",trackMult);
\r
254 //--------------------------------------------------
\r
255 // At least one track
\r
256 //--------------------------------------------------
\r
257 if (trackMult > 0) {
\r
258 bSelectTrack = kTRUE;
\r
259 fhNEvents->Fill(3.5);
\r
260 if(bSelectVZ) fhNEvents->Fill(4.5);
\r
263 //---------------------------------
\r
265 //---------------------------------
\r
266 if(esdevent && !fCaloFilterPatch) bV0AND = fTriggerAnalysis->IsOfflineTriggerFired(esdevent, AliTriggerAnalysis::kV0AND);
\r
267 //else if(aodevent && !fCaloFilterPatch) bV0AND = //FIXME FOR AODs
\r
271 fhNEvents->Fill(5.5);
\r
272 if (bSelectVZ) fhNEvents->Fill(6.5);
\r
273 if (bSelectTrack) fhNEvents->Fill(7.5);
\r
274 if (bSelectVZ && bSelectTrack) fhNEvents->Fill(8.5);
\r
277 //---------------------------------
\r
279 //---------------------------------
\r
280 if(!fCaloFilterPatch)
\r
281 bPileup = event->IsPileupFromSPD(3, 0.8, 3., 2., 5.); //Default values, if not it does not compile
\r
282 //bPileup = event->IsPileupFromSPD();
\r
284 fhNEvents->Fill(9.5);
\r
285 if(bV0AND) fhNEvents->Fill(16.5);
\r
288 //---------------------------------
\r
290 //---------------------------------
\r
291 if(esdevent && !fCaloFilterPatch) bGoodV = CheckForPrimaryVertex();
\r
294 fhXGoodVertex->Fill(v[0]);
\r
295 fhYGoodVertex->Fill(v[1]);
\r
296 fhZGoodVertex->Fill(v[2]);
\r
298 fhNEvents->Fill(10.5);
\r
299 if(bSelectVZ) fhNEvents->Fill(11.5);
\r
300 if(bSelectTrack) fhNEvents->Fill(12.5);
\r
301 if(bV0AND) fhNEvents->Fill(13.5);
\r
302 if(bSelectVZ && bSelectTrack && bV0AND)
\r
303 fhNEvents->Fill(14.5);
\r
304 if(!bPileup) fhNEvents->Fill(15.5);
\r
307 //printf("AliAnalysisTaskCounter::UserExec() : z vertex %d, good vertex %d, v0and %d, pile up %d, track mult %d\n ", bSelectVZ, bGoodV, bV0AND, bPileup, trackMult);
\r
309 PostData(1,fOutputContainer);
\r
313 //____________________________________________________________________________
\r
314 Bool_t AliAnalysisTaskCounter::CheckForPrimaryVertex(){
\r
315 //Check if the vertex was well reconstructed, copy from V0Reader of conversion group
\r
316 //It only works for ESDs
\r
318 AliESDEvent * event = dynamic_cast<AliESDEvent*> (InputEvent());
\r
319 if(!event) return 0;
\r
321 if(event->GetPrimaryVertexTracks()->GetNContributors() > 0) {
\r
325 if(event->GetPrimaryVertexTracks()->GetNContributors() < 1) {
\r
327 if(event->GetPrimaryVertexSPD()->GetNContributors() > 0) {
\r
328 //cout<<"spd vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;
\r
332 if(event->GetPrimaryVertexSPD()->GetNContributors() < 1) {
\r
333 // cout<<"bad vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;
\r
338 //return fInputEvent->GetPrimaryVertex()->GetNContributors()>0;
\r
343 //_____________________________________________________
\r
344 void AliAnalysisTaskCounter::FinishTaskOutput()
\r
346 // Put in the output some event summary histograms
\r
348 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
\r
349 AliInputEventHandler *inputH = dynamic_cast<AliInputEventHandler*>(am->GetInputEventHandler());
\r
350 if (!inputH) return;
\r
351 TH2F *histStat = dynamic_cast<TH2F*>(inputH->GetStatistics());
\r
352 TH2F *histBin0 = dynamic_cast<TH2F*>(inputH->GetStatistics("BIN0"));
\r
355 fOutputContainer->Add(histStat);
\r
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");
\r
360 fOutputContainer->Add(histBin0);
\r