1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18 // Modified version of AliAnalysisTaskCheckCascade.cxx.
19 // This is a 'hybrid' output version, in that it uses a classic TTree
20 // ROOT object to store the candidates, plus a couple of histograms filled on
21 // a per-event basis for storing variables too numerous to put in a tree.
23 // --- Added bits of code for checking V0s
24 // (from AliAnalysisTaskCheckStrange.cxx)
26 // --- Algorithm Description
27 // 1. Perform Physics Selection
28 // 2. Perform Primary Vertex |z|<10cm selection
29 // 3. Perform Primary Vertex NoTPCOnly vertexing selection (>0 contrib.)
30 // 4. Perform Pileup Rejection
32 // 5a. Fill TTree object with V0 information, candidates
34 // Please Report Any Bugs!
36 // --- David Dobrigkeit Chinellato
37 // (david.chinellato@gmail.com)
39 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 //class AliMCEventHandler;
54 #include <Riostream.h>
59 #include "THnSparse.h"
65 #include "AliCentrality.h"
66 #include "AliESDEvent.h"
67 #include "AliAODEvent.h"
68 #include "AliV0vertexer.h"
69 #include "AliCascadeVertexer.h"
70 #include "AliESDpid.h"
71 #include "AliESDtrack.h"
72 #include "AliESDtrackCuts.h"
73 #include "AliInputEventHandler.h"
74 #include "AliAnalysisManager.h"
75 #include "AliMCEventHandler.h"
77 #include "AliCFContainer.h"
78 #include "AliMultiplicity.h"
80 #include "AliESDcascade.h"
81 #include "AliAODcascade.h"
82 #include "AliESDUtils.h"
83 #include "AliESDHeader.h"
85 #include "AliAnalysisUtils.h"
86 #include "AliAnalysisTaskExtractV0.h"
89 #include "TObjectTable.h"
91 ClassImp(AliAnalysisTaskExtractV0)
93 AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
94 : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0), fUtils(0),
95 fkIsNuclear ( kFALSE ),
96 fkSwitchINT7 ( kFALSE ),
97 fkUseOnTheFly ( kFALSE ),
98 fkTakeAllTracks ( kFALSE ),
99 fCentralityEstimator("V0M"),
100 fkLightWeight ( kFALSE ),
102 fkpAVertexSelection( kFALSE ),
103 fkRunV0Vertexer ( kFALSE ),
104 fkRejectPileup ( kTRUE ),
105 fkSpecialExecution( kFALSE ),
106 fkSkipTrigger ( kFALSE ),
107 fExtraDCAHeavyToPrimVertex(0),
108 fExtraDCALightToPrimVertex(0),
109 //------------------------------------------------
111 fTreeVariableChi2V0(0),
112 fTreeVariableDcaV0Daughters(0),
113 fTreeVariableDcaV0ToPrimVertex(0),
114 fTreeVariableDcaPosToPrimVertex(0),
115 fTreeVariableDcaNegToPrimVertex(0),
116 fTreeVariableV0CosineOfPointingAngle(0),
117 fTreeVariableV0Radius(0),
119 fTreeVariableRapK0Short(0),
120 fTreeVariableRapLambda(0),
121 fTreeVariableInvMassK0s(0),
122 fTreeVariableInvMassLambda(0),
123 fTreeVariableInvMassAntiLambda(0),
124 fTreeVariableAlphaV0(0),
125 fTreeVariablePtArmV0(0),
126 fTreeVariableNegTotMomentum(0),
127 fTreeVariablePosTotMomentum(0),
128 fTreeVariableNegdEdxSig(0),
129 fTreeVariablePosdEdxSig(0),
130 fTreeVariableNegEta(0),
131 fTreeVariablePosEta(0),
133 fTreeVariableNSigmasPosProton(0),
134 fTreeVariableNSigmasPosPion(0),
135 fTreeVariableNSigmasNegProton(0),
136 fTreeVariableNSigmasNegPion(0),
138 fTreeVariableDistOverTotMom(0),
139 fTreeVariableLeastNbrCrossedRows(0),
140 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
141 fTreeVariableMultiplicity(0),
142 fTreeVariableMultiplicityV0A(0),
143 fTreeVariableMultiplicityZNA(0),
144 fTreeVariableMultiplicityTRK(0),
145 fTreeVariableMultiplicitySPD(0),
147 fTreeVariableRunNumber(0),
148 fTreeVariableEventNumber(0),
154 fTreeVariableV0Px(0),
155 fTreeVariableV0Py(0),
156 fTreeVariableV0Pz(0),
162 fTreeVariableNegTrackStatus(0),
163 fTreeVariablePosTrackStatus(0),
165 fTreeVariableNegTPCSignal(0),
166 fTreeVariablePosTPCSignal(0),
167 fTreeVariableNegInnerP(0),
168 fTreeVariablePosInnerP(0),
170 fTreeVariableNegPx(0),
171 fTreeVariableNegPy(0),
172 fTreeVariableNegPz(0),
173 fTreeVariablePosPx(0),
174 fTreeVariablePosPy(0),
175 fTreeVariablePosPz(0),
178 //------------------------------------------------
180 // --- Filled on an Event-by-event basis
181 //------------------------------------------------
182 fHistV0MultiplicityBeforeTrigSel(0),
183 fHistV0MultiplicityForTrigEvt(0),
184 fHistV0MultiplicityForSelEvt(0),
185 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
186 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
187 fHistMultiplicityBeforeTrigSel(0),
188 fHistMultiplicityForTrigEvt(0),
189 fHistMultiplicity(0),
190 fHistMultiplicityNoTPCOnly(0),
191 fHistMultiplicityNoTPCOnlyNoPileup(0),
194 fHistMultiplicityV0ABeforeTrigSel(0),
195 fHistMultiplicityV0AForTrigEvt(0),
196 fHistMultiplicityV0A(0),
197 fHistMultiplicityV0ANoTPCOnly(0),
198 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
201 fHistMultiplicityZNABeforeTrigSel(0),
202 fHistMultiplicityZNAForTrigEvt(0),
203 fHistMultiplicityZNA(0),
204 fHistMultiplicityZNANoTPCOnly(0),
205 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
208 fHistMultiplicityTRKBeforeTrigSel(0),
209 fHistMultiplicityTRKForTrigEvt(0),
210 fHistMultiplicityTRK(0),
211 fHistMultiplicityTRKNoTPCOnly(0),
212 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
215 fHistMultiplicitySPDBeforeTrigSel(0),
216 fHistMultiplicitySPDForTrigEvt(0),
217 fHistMultiplicitySPD(0),
218 fHistMultiplicitySPDNoTPCOnly(0),
219 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
221 //Raw Data for Vertex Z position estimator change
222 f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
223 f2dHistMultiplicityVsVertexZForTrigEvt(0),
224 f2dHistMultiplicityVsVertexZ(0),
225 f2dHistMultiplicityVsVertexZNoTPCOnly(0),
226 f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
234 fHistSwappedV0Counter(0),
239 for(Int_t iV0selIdx = 0; iV0selIdx < 7; iV0selIdx++ ) { fV0Sels [iV0selIdx ] = -1.; }
242 AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name)
243 : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0), fUtils(0),
244 fkIsNuclear ( kFALSE ),
245 fkSwitchINT7 ( kFALSE ),
246 fkUseOnTheFly ( kFALSE ),
247 fkTakeAllTracks ( kFALSE ),
248 fCentralityEstimator("V0M"),
249 fkLightWeight ( kFALSE ),
251 fkpAVertexSelection( kFALSE ),
252 fkRunV0Vertexer ( kFALSE ),
253 fkRejectPileup ( kTRUE ),
254 fkSpecialExecution( kFALSE ),
255 fkSkipTrigger ( kFALSE ),
256 fExtraDCAHeavyToPrimVertex(0),
257 fExtraDCALightToPrimVertex(0),
258 //------------------------------------------------
260 fTreeVariableChi2V0(0),
261 fTreeVariableDcaV0Daughters(0),
262 fTreeVariableDcaV0ToPrimVertex(0),
263 fTreeVariableDcaPosToPrimVertex(0),
264 fTreeVariableDcaNegToPrimVertex(0),
265 fTreeVariableV0CosineOfPointingAngle(0),
266 fTreeVariableV0Radius(0),
268 fTreeVariableRapK0Short(0),
269 fTreeVariableRapLambda(0),
270 fTreeVariableInvMassK0s(0),
271 fTreeVariableInvMassLambda(0),
272 fTreeVariableInvMassAntiLambda(0),
273 fTreeVariableAlphaV0(0),
274 fTreeVariablePtArmV0(0),
275 fTreeVariableNegTotMomentum(0),
276 fTreeVariablePosTotMomentum(0),
277 fTreeVariableNegdEdxSig(0),
278 fTreeVariablePosdEdxSig(0),
279 fTreeVariableNegEta(0),
280 fTreeVariablePosEta(0),
282 fTreeVariableNSigmasPosProton(0),
283 fTreeVariableNSigmasPosPion(0),
284 fTreeVariableNSigmasNegProton(0),
285 fTreeVariableNSigmasNegPion(0),
287 fTreeVariableDistOverTotMom(0),
288 fTreeVariableLeastNbrCrossedRows(0),
289 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
290 fTreeVariableMultiplicity(0),
291 fTreeVariableMultiplicityV0A(0),
292 fTreeVariableMultiplicityZNA(0),
293 fTreeVariableMultiplicityTRK(0),
294 fTreeVariableMultiplicitySPD(0),
296 fTreeVariableRunNumber(0),
297 fTreeVariableEventNumber(0),
303 fTreeVariableV0Px(0),
304 fTreeVariableV0Py(0),
305 fTreeVariableV0Pz(0),
311 fTreeVariableNegTrackStatus(0),
312 fTreeVariablePosTrackStatus(0),
314 fTreeVariableNegTPCSignal(0),
315 fTreeVariablePosTPCSignal(0),
316 fTreeVariableNegInnerP(0),
317 fTreeVariablePosInnerP(0),
319 fTreeVariableNegPx(0),
320 fTreeVariableNegPy(0),
321 fTreeVariableNegPz(0),
322 fTreeVariablePosPx(0),
323 fTreeVariablePosPy(0),
324 fTreeVariablePosPz(0),
326 //------------------------------------------------
328 // --- Filled on an Event-by-event basis
329 //------------------------------------------------
330 fHistV0MultiplicityBeforeTrigSel(0),
331 fHistV0MultiplicityForTrigEvt(0),
332 fHistV0MultiplicityForSelEvt(0),
333 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
334 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
335 fHistMultiplicityBeforeTrigSel(0),
336 fHistMultiplicityForTrigEvt(0),
337 fHistMultiplicity(0),
338 fHistMultiplicityNoTPCOnly(0),
339 fHistMultiplicityNoTPCOnlyNoPileup(0),
343 fHistMultiplicityV0ABeforeTrigSel(0),
344 fHistMultiplicityV0AForTrigEvt(0),
345 fHistMultiplicityV0A(0),
346 fHistMultiplicityV0ANoTPCOnly(0),
347 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
350 fHistMultiplicityZNABeforeTrigSel(0),
351 fHistMultiplicityZNAForTrigEvt(0),
352 fHistMultiplicityZNA(0),
353 fHistMultiplicityZNANoTPCOnly(0),
354 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
357 fHistMultiplicityTRKBeforeTrigSel(0),
358 fHistMultiplicityTRKForTrigEvt(0),
359 fHistMultiplicityTRK(0),
360 fHistMultiplicityTRKNoTPCOnly(0),
361 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
364 fHistMultiplicitySPDBeforeTrigSel(0),
365 fHistMultiplicitySPDForTrigEvt(0),
366 fHistMultiplicitySPD(0),
367 fHistMultiplicitySPDNoTPCOnly(0),
368 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
370 //Raw Data for Vertex Z position estimator change
371 f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
372 f2dHistMultiplicityVsVertexZForTrigEvt(0),
373 f2dHistMultiplicityVsVertexZ(0),
374 f2dHistMultiplicityVsVertexZNoTPCOnly(0),
375 f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
383 fHistSwappedV0Counter(0),
388 // Set Loose cuts or not here...
389 // REALLY LOOSE? Be careful when attempting to run over PbPb if fkRunV0Vertexer is set!
390 fV0Sels[0] = 33. ; // max allowed chi2
391 fV0Sels[1] = 0.02; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
392 fV0Sels[2] = 0.02; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
393 fV0Sels[3] = 2.0 ; // max allowed DCA between the daughter tracks (LHC09a4 : 0.5)
394 fV0Sels[4] = 0.95; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
395 fV0Sels[5] = 0.5 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
396 fV0Sels[6] = 200. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
398 // Output slot #0 writes into a TList container (Lambda Histos and fTree)
399 DefineOutput(1, TList::Class());
400 DefineOutput(2, TTree::Class());
404 AliAnalysisTaskExtractV0::~AliAnalysisTaskExtractV0()
406 //------------------------------------------------
408 //------------------------------------------------
418 //cleanup esd track cuts object too...
420 delete fESDtrackCuts;
432 //________________________________________________________________________
433 void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
436 //Create File-resident Tree, please.
439 fTree = new TTree("fTree","V0Candidates");
441 //------------------------------------------------
442 // fTree Branch definitions
443 //------------------------------------------------
445 //-----------BASIC-INFO---------------------------
446 /* 1*/ fTree->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"fTreeVariableChi2V0/F");
447 /* 2*/ fTree->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
448 /* 3*/ fTree->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
449 /* 4*/ fTree->Branch("fTreeVariableDcaNegToPrimVertex",&fTreeVariableDcaNegToPrimVertex,"fTreeVariableDcaNegToPrimVertex/F");
450 /* 5*/ fTree->Branch("fTreeVariableV0Radius",&fTreeVariableV0Radius,"fTreeVariableV0Radius/F");
451 /* 6*/ fTree->Branch("fTreeVariablePt",&fTreeVariablePt,"fTreeVariablePt/F");
452 /* 7*/ fTree->Branch("fTreeVariableRapK0Short",&fTreeVariableRapK0Short,"fTreeVariableRapK0Short/F");
453 /* 8*/ fTree->Branch("fTreeVariableRapLambda",&fTreeVariableRapLambda,"fTreeVariableRapLambda/F");
454 /* 9*/ fTree->Branch("fTreeVariableInvMassK0s",&fTreeVariableInvMassK0s,"fTreeVariableInvMassK0s/F");
455 /*10*/ fTree->Branch("fTreeVariableInvMassLambda",&fTreeVariableInvMassLambda,"fTreeVariableInvMassLambda/F");
456 /*11*/ fTree->Branch("fTreeVariableInvMassAntiLambda",&fTreeVariableInvMassAntiLambda,"fTreeVariableInvMassAntiLambda/F");
457 /*12*/ fTree->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
458 /*13*/ fTree->Branch("fTreeVariableAlphaV0",&fTreeVariableAlphaV0,"fTreeVariableAlphaV0/F");
459 /*14*/ fTree->Branch("fTreeVariablePtArmV0",&fTreeVariablePtArmV0,"fTreeVariablePtArmV0/F");
460 /*15*/ fTree->Branch("fTreeVariableLeastNbrCrossedRows",&fTreeVariableLeastNbrCrossedRows,"fTreeVariableLeastNbrCrossedRows/I");
461 /*16*/ fTree->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
462 //-----------MULTIPLICITY-INFO--------------------
463 /*17*/ fTree->Branch("fTreeVariableMultiplicity",&fTreeVariableMultiplicity,"fTreeVariableMultiplicity/I");
464 /*17*/ fTree->Branch("fTreeVariableMultiplicityV0A",&fTreeVariableMultiplicityV0A,"fTreeVariableMultiplicityV0A/I");
465 /*17*/ fTree->Branch("fTreeVariableMultiplicityZNA",&fTreeVariableMultiplicityZNA,"fTreeVariableMultiplicityZNA/I");
466 /*17*/ fTree->Branch("fTreeVariableMultiplicityTRK",&fTreeVariableMultiplicityTRK,"fTreeVariableMultiplicityTRK/I");
467 /*17*/ fTree->Branch("fTreeVariableMultiplicitySPD",&fTreeVariableMultiplicitySPD,"fTreeVariableMultiplicitySPD/I");
468 //------------------------------------------------
469 /*18*/ fTree->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
470 /*19*/ fTree->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
471 /*20*/ fTree->Branch("fTreeVariableNSigmasPosPion",&fTreeVariableNSigmasPosPion,"fTreeVariableNSigmasPosPion/F");
472 /*21*/ fTree->Branch("fTreeVariableNSigmasNegProton",&fTreeVariableNSigmasNegProton,"fTreeVariableNSigmasNegProton/F");
473 /*22*/ fTree->Branch("fTreeVariableNSigmasNegPion",&fTreeVariableNSigmasNegPion,"fTreeVariableNSigmasNegPion/F");
474 /*23*/ fTree->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
475 /*24*/ fTree->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
476 /*25*/ fTree->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
477 /*26*/ fTree->Branch("fTreeVariableEventNumber",&fTreeVariableEventNumber,"fTreeVariableEventNumber/l");
479 if( fkLightWeight == kFALSE ){
480 //-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info
481 fTree->Branch("fTreeVariablePVx",&fTreeVariablePVx,"fTreeVariablePVx/F");
482 fTree->Branch("fTreeVariablePVy",&fTreeVariablePVy,"fTreeVariablePVy/F");
483 fTree->Branch("fTreeVariablePVz",&fTreeVariablePVz,"fTreeVariablePVz/F");
485 fTree->Branch("fTreeVariableV0x",&fTreeVariableV0x,"fTreeVariableV0x/F");
486 fTree->Branch("fTreeVariableV0y",&fTreeVariableV0y,"fTreeVariableV0y/F");
487 fTree->Branch("fTreeVariableV0z",&fTreeVariableV0z,"fTreeVariableV0z/F");
489 fTree->Branch("fTreeVariableV0Px",&fTreeVariableV0Px,"fTreeVariableV0Px/F");
490 fTree->Branch("fTreeVariableV0Py",&fTreeVariableV0Py,"fTreeVariableV0Py/F");
491 fTree->Branch("fTreeVariableV0Pz",&fTreeVariableV0Pz,"fTreeVariableV0Pz/F");
493 fTree->Branch("fTreeVariableNegTrackStatus",&fTreeVariableNegTrackStatus,"fTreeVariableNegTrackStatus/l");
494 fTree->Branch("fTreeVariablePosTrackStatus",&fTreeVariablePosTrackStatus,"fTreeVariablePosTrackStatus/l");
496 if( fkSpecialExecution == kTRUE ){
497 fTree->Branch("fTreeVariablePosTPCSignal",&fTreeVariablePosTPCSignal,"fTreeVariablePosTPCSignal/F");
498 fTree->Branch("fTreeVariableNegTPCSignal",&fTreeVariableNegTPCSignal,"fTreeVariableNegTPCSignal/F");
499 fTree->Branch("fTreeVariablePosInnerP",&fTreeVariablePosInnerP,"fTreeVariablePosInnerP/F");
500 fTree->Branch("fTreeVariableNegInnerP",&fTreeVariableNegInnerP,"fTreeVariableNegInnerP/F");
502 fTree->Branch("fTreeVariablePosPx",&fTreeVariablePosPx,"fTreeVariablePosPx/F");
503 fTree->Branch("fTreeVariablePosPy",&fTreeVariablePosPy,"fTreeVariablePosPy/F");
504 fTree->Branch("fTreeVariablePosPz",&fTreeVariablePosPz,"fTreeVariablePosPz/F");
505 fTree->Branch("fTreeVariableNegPx",&fTreeVariableNegPx,"fTreeVariableNegPx/F");
506 fTree->Branch("fTreeVariableNegPy",&fTreeVariableNegPy,"fTreeVariableNegPy/F");
507 fTree->Branch("fTreeVariableNegPz",&fTreeVariableNegPz,"fTreeVariableNegPz/F");
510 //------------------------------------------------
511 // Particle Identification Setup
512 //------------------------------------------------
514 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
515 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
516 fPIDResponse = inputHandler->GetPIDResponse();
520 if(! fESDtrackCuts ){
521 fESDtrackCuts = new AliESDtrackCuts();
524 fUtils = new AliAnalysisUtils();
527 //------------------------------------------------
528 // V0 Multiplicity Histograms
529 //------------------------------------------------
532 //Create File-resident Tree, please.
535 fListHistV0 = new TList();
536 fListHistV0->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
538 if(! fHistV0MultiplicityBeforeTrigSel) {
539 fHistV0MultiplicityBeforeTrigSel = new TH1F("fHistV0MultiplicityBeforeTrigSel",
540 "V0s per event (before Trig. Sel.);Nbr of V0s/Evt;Events",
542 fListHistV0->Add(fHistV0MultiplicityBeforeTrigSel);
545 if(! fHistV0MultiplicityForTrigEvt) {
546 fHistV0MultiplicityForTrigEvt = new TH1F("fHistV0MultiplicityForTrigEvt",
547 "V0s per event (for triggered evt);Nbr of V0s/Evt;Events",
549 fListHistV0->Add(fHistV0MultiplicityForTrigEvt);
552 if(! fHistV0MultiplicityForSelEvt) {
553 fHistV0MultiplicityForSelEvt = new TH1F("fHistV0MultiplicityForSelEvt",
554 "V0s per event;Nbr of V0s/Evt;Events",
556 fListHistV0->Add(fHistV0MultiplicityForSelEvt);
559 if(! fHistV0MultiplicityForSelEvtNoTPCOnly) {
560 fHistV0MultiplicityForSelEvtNoTPCOnly = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnly",
561 "V0s per event;Nbr of V0s/Evt;Events",
563 fListHistV0->Add(fHistV0MultiplicityForSelEvtNoTPCOnly);
566 if(! fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup) {
567 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup",
568 "V0s per event;Nbr of V0s/Evt;Events",
570 fListHistV0->Add(fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup);
573 //------------------------------------------------
574 // Track Multiplicity Histograms
575 //------------------------------------------------
577 //Default V0M Centrality (if PbPb)
578 if(! fHistMultiplicityBeforeTrigSel) {
579 fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel",
580 "Tracks per event;Nbr of Tracks;Events",
582 fListHistV0->Add(fHistMultiplicityBeforeTrigSel);
584 if(! fHistMultiplicityForTrigEvt) {
585 fHistMultiplicityForTrigEvt = new TH1F("fHistMultiplicityForTrigEvt",
586 "Tracks per event;Nbr of Tracks;Events",
588 fListHistV0->Add(fHistMultiplicityForTrigEvt);
590 if(! fHistMultiplicity) {
591 fHistMultiplicity = new TH1F("fHistMultiplicity",
592 "Tracks per event;Nbr of Tracks;Events",
594 fListHistV0->Add(fHistMultiplicity);
596 if(! fHistMultiplicityNoTPCOnly) {
597 fHistMultiplicityNoTPCOnly = new TH1F("fHistMultiplicityNoTPCOnly",
598 "Tracks per event;Nbr of Tracks;Events",
600 fListHistV0->Add(fHistMultiplicityNoTPCOnly);
602 if(! fHistMultiplicityNoTPCOnlyNoPileup) {
603 fHistMultiplicityNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityNoTPCOnlyNoPileup",
604 "Tracks per event;Nbr of Tracks;Events",
606 fListHistV0->Add(fHistMultiplicityNoTPCOnlyNoPileup);
609 //V0A Centrality (if PbPb / pPb)
610 if(! fHistMultiplicityV0ABeforeTrigSel) {
611 fHistMultiplicityV0ABeforeTrigSel = new TH1F("fHistMultiplicityV0ABeforeTrigSel",
612 "Centrality Distribution: V0A;V0A Centrality;Events",
614 fListHistV0->Add(fHistMultiplicityV0ABeforeTrigSel);
616 if(! fHistMultiplicityV0AForTrigEvt) {
617 fHistMultiplicityV0AForTrigEvt = new TH1F("fHistMultiplicityV0AForTrigEvt",
618 "Centrality Distribution: V0A;V0A Centrality;Events",
620 fListHistV0->Add(fHistMultiplicityV0AForTrigEvt);
622 if(! fHistMultiplicityV0A) {
623 fHistMultiplicityV0A = new TH1F("fHistMultiplicityV0A",
624 "Centrality Distribution: V0A;V0A Centrality;Events",
626 fListHistV0->Add(fHistMultiplicityV0A);
628 if(! fHistMultiplicityV0ANoTPCOnly) {
629 fHistMultiplicityV0ANoTPCOnly = new TH1F("fHistMultiplicityV0ANoTPCOnly",
630 "Centrality Distribution: V0A;V0A Centrality;Events",
632 fListHistV0->Add(fHistMultiplicityV0ANoTPCOnly);
634 if(! fHistMultiplicityV0ANoTPCOnlyNoPileup) {
635 fHistMultiplicityV0ANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityV0ANoTPCOnlyNoPileup",
636 "Centrality Distribution: V0A;V0A Centrality;Events",
638 fListHistV0->Add(fHistMultiplicityV0ANoTPCOnlyNoPileup);
641 //ZNA Centrality (if PbPb / pPb)
642 if(! fHistMultiplicityZNABeforeTrigSel) {
643 fHistMultiplicityZNABeforeTrigSel = new TH1F("fHistMultiplicityZNABeforeTrigSel",
644 "Centrality Distribution: ZNA;ZNA Centrality;Events",
646 fListHistV0->Add(fHistMultiplicityZNABeforeTrigSel);
648 if(! fHistMultiplicityZNAForTrigEvt) {
649 fHistMultiplicityZNAForTrigEvt = new TH1F("fHistMultiplicityZNAForTrigEvt",
650 "Centrality Distribution: ZNA;ZNA Centrality;Events",
652 fListHistV0->Add(fHistMultiplicityZNAForTrigEvt);
654 if(! fHistMultiplicityZNA) {
655 fHistMultiplicityZNA = new TH1F("fHistMultiplicityZNA",
656 "Centrality Distribution: ZNA;ZNA Centrality;Events",
658 fListHistV0->Add(fHistMultiplicityZNA);
660 if(! fHistMultiplicityZNANoTPCOnly) {
661 fHistMultiplicityZNANoTPCOnly = new TH1F("fHistMultiplicityZNANoTPCOnly",
662 "Centrality Distribution: ZNA;ZNA Centrality;Events",
664 fListHistV0->Add(fHistMultiplicityZNANoTPCOnly);
666 if(! fHistMultiplicityZNANoTPCOnlyNoPileup) {
667 fHistMultiplicityZNANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityZNANoTPCOnlyNoPileup",
668 "Centrality Distribution: ZNA;ZNA Centrality;Events",
670 fListHistV0->Add(fHistMultiplicityZNANoTPCOnlyNoPileup);
673 //TRK Centrality (if PbPb / pPb)
674 if(! fHistMultiplicityTRKBeforeTrigSel) {
675 fHistMultiplicityTRKBeforeTrigSel = new TH1F("fHistMultiplicityTRKBeforeTrigSel",
676 "Centrality Distribution: TRK;TRK Centrality;Events",
678 fListHistV0->Add(fHistMultiplicityTRKBeforeTrigSel);
680 if(! fHistMultiplicityTRKForTrigEvt) {
681 fHistMultiplicityTRKForTrigEvt = new TH1F("fHistMultiplicityTRKForTrigEvt",
682 "Centrality Distribution: TRK;TRK Centrality;Events",
684 fListHistV0->Add(fHistMultiplicityTRKForTrigEvt);
686 if(! fHistMultiplicityTRK) {
687 fHistMultiplicityTRK = new TH1F("fHistMultiplicityTRK",
688 "Centrality Distribution: TRK;TRK Centrality;Events",
690 fListHistV0->Add(fHistMultiplicityTRK);
692 if(! fHistMultiplicityTRKNoTPCOnly) {
693 fHistMultiplicityTRKNoTPCOnly = new TH1F("fHistMultiplicityTRKNoTPCOnly",
694 "Centrality Distribution: TRK;TRK Centrality;Events",
696 fListHistV0->Add(fHistMultiplicityTRKNoTPCOnly);
698 if(! fHistMultiplicityTRKNoTPCOnlyNoPileup) {
699 fHistMultiplicityTRKNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityTRKNoTPCOnlyNoPileup",
700 "Centrality Distribution: TRK;TRK Centrality;Events",
702 fListHistV0->Add(fHistMultiplicityTRKNoTPCOnlyNoPileup);
705 //SPD Centrality (if PbPb / pPb)
706 if(! fHistMultiplicitySPDBeforeTrigSel) {
707 fHistMultiplicitySPDBeforeTrigSel = new TH1F("fHistMultiplicitySPDBeforeTrigSel",
708 "Centrality Distribution: SPD;SPD Centrality;Events",
710 fListHistV0->Add(fHistMultiplicitySPDBeforeTrigSel);
712 if(! fHistMultiplicitySPDForTrigEvt) {
713 fHistMultiplicitySPDForTrigEvt = new TH1F("fHistMultiplicitySPDForTrigEvt",
714 "Centrality Distribution: SPD;SPD Centrality;Events",
716 fListHistV0->Add(fHistMultiplicitySPDForTrigEvt);
718 if(! fHistMultiplicitySPD) {
719 fHistMultiplicitySPD = new TH1F("fHistMultiplicitySPD",
720 "Centrality Distribution: SPD;SPD Centrality;Events",
722 fListHistV0->Add(fHistMultiplicitySPD);
724 if(! fHistMultiplicitySPDNoTPCOnly) {
725 fHistMultiplicitySPDNoTPCOnly = new TH1F("fHistMultiplicitySPDNoTPCOnly",
726 "Centrality Distribution: SPD;SPD Centrality;Events",
728 fListHistV0->Add(fHistMultiplicitySPDNoTPCOnly);
730 if(! fHistMultiplicitySPDNoTPCOnlyNoPileup) {
731 fHistMultiplicitySPDNoTPCOnlyNoPileup = new TH1F("fHistMultiplicitySPDNoTPCOnlyNoPileup",
732 "Centrality Distribution: SPD;SPD Centrality;Events",
734 fListHistV0->Add(fHistMultiplicitySPDNoTPCOnlyNoPileup);
737 //Raw Data for Vertex Z position estimator change
738 //TH2F *f2dHistMultiplicityVsVertexZBeforeTrigSel; //! multiplicity distribution
739 //TH2F *f2dHistMultiplicityVsVertexZForTrigEvt; //! multiplicity distribution
740 //TH2F *f2dHistMultiplicityVsVertexZ; //! multiplicity distribution
741 //TH2F *f2dHistMultiplicityVsVertexZNoTPCOnly; //! multiplicity distribution
742 //TH2F *f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup; //! multiplicity distribution
744 if(! f2dHistMultiplicityVsVertexZBeforeTrigSel) {
745 f2dHistMultiplicityVsVertexZBeforeTrigSel = new TH2F("f2dHistMultiplicityVsVertexZBeforeTrigSel",
746 "Tracks per event", 200, 0, 200,400, -20, 20);
747 fListHistV0->Add(f2dHistMultiplicityVsVertexZBeforeTrigSel);
749 if(! f2dHistMultiplicityVsVertexZForTrigEvt) {
750 f2dHistMultiplicityVsVertexZForTrigEvt = new TH2F("f2dHistMultiplicityVsVertexZForTrigEvt",
751 "Tracks per event", 200, 0, 200, 400, -20, 20);
752 fListHistV0->Add(f2dHistMultiplicityVsVertexZForTrigEvt);
754 if(! f2dHistMultiplicityVsVertexZ) {
755 f2dHistMultiplicityVsVertexZ = new TH2F("f2dHistMultiplicityVsVertexZ",
756 "Tracks per event", 200, 0, 200, 400, -20, 20);
757 fListHistV0->Add(f2dHistMultiplicityVsVertexZ);
759 if(! f2dHistMultiplicityVsVertexZNoTPCOnly) {
760 f2dHistMultiplicityVsVertexZNoTPCOnly = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnly",
761 "Tracks per event", 200, 0, 200, 400, -20, 20);
762 fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnly);
764 if(! f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup) {
765 f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup",
766 "Tracks per event", 200, 0, 200, 400, -20, 20);
767 fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup);
770 //-----------------------------------------------------
773 fHistPVx = new TH1F("fHistPVx",
774 "PV x position;Nbr of Evts;x",
776 fListHistV0->Add(fHistPVx);
779 fHistPVy = new TH1F("fHistPVy",
780 "PV y position;Nbr of Evts;y",
782 fListHistV0->Add(fHistPVy);
785 fHistPVz = new TH1F("fHistPVz",
786 "PV z position;Nbr of Evts;z",
788 fListHistV0->Add(fHistPVz);
790 if(! fHistPVxAnalysis) {
791 fHistPVxAnalysis = new TH1F("fHistPVxAnalysis",
792 "PV x position;Nbr of Evts;x",
794 fListHistV0->Add(fHistPVxAnalysis);
796 if(! fHistPVyAnalysis) {
797 fHistPVyAnalysis = new TH1F("fHistPVyAnalysis",
798 "PV y position;Nbr of Evts;y",
800 fListHistV0->Add(fHistPVyAnalysis);
802 if(! fHistPVzAnalysis) {
803 fHistPVzAnalysis = new TH1F("fHistPVzAnalysis",
804 "PV z position;Nbr of Evts;z",
806 fListHistV0->Add(fHistPVzAnalysis);
808 if(! fHistSwappedV0Counter) {
809 fHistSwappedV0Counter = new TH1F("fHistSwappedV0Counter",
810 "Swap or not histo;Swapped (1) or not (0); count",
812 fListHistV0->Add(fHistSwappedV0Counter);
815 //Create dE/dx histograms
816 if(! f2dHistdEdxPos ){
817 f2dHistdEdxPos = new TH2F("f2dHistdEdxPos","Pos. Daughter dE/dx;p (GeV/c);TPC Signal",
818 200,0,10,500,0,1000);
819 if (fkSpecialExecution) fListHistV0->Add(f2dHistdEdxPos);
821 if(! f2dHistdEdxNeg ){
822 f2dHistdEdxNeg = new TH2F("f2dHistdEdxNeg","Neg. Daughter dE/dx;p (GeV/c);TPC Signal",
823 200,0,10,500,0,1000);
824 if (fkSpecialExecution) fListHistV0->Add(f2dHistdEdxNeg);
827 //Regular output: Histograms
828 PostData(1, fListHistV0);
829 //TTree Object: Saved to base directory. Should cache to disk while saving.
830 //(Important to avoid excessive memory usage, particularly when merging)
833 }// end UserCreateOutputObjects
836 //________________________________________________________________________
837 void AliAnalysisTaskExtractV0::UserExec(Option_t *)
840 // Called for each event
841 //gObjectTable->Print();
842 AliESDEvent *lESDevent = 0x0;
844 //AliAODEvent *lAODevent = 0x0;
847 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
848 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
849 Double_t lMagneticField = -10.;
851 // Connect to the InputEvent
852 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
854 // Appropriate for ESD analysis!
856 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
858 AliWarning("ERROR: lESDevent not available \n");
862 //------------------------------------------------
863 // Rerun V0 vertexer, if asked for
864 // --- WARNING: Be careful when using in PbPb
865 //------------------------------------------------
866 if( fkRunV0Vertexer ){
867 lESDevent->ResetV0s();
868 AliV0vertexer lV0vtxer;
869 lV0vtxer.SetDefaultCuts(fV0Sels);
870 lV0vtxer.Tracks2V0vertices(lESDevent);
873 fTreeVariableRunNumber = lESDevent->GetRunNumber();
874 fTreeVariableEventNumber =
875 ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
876 ( ((ULong64_t)lESDevent->GetOrbitNumber () ) << 12 ) |
877 ((ULong64_t)lESDevent->GetBunchCrossNumber() ) );
879 //REVISED multiplicity estimator after 'multiplicity day' (2011)
880 Int_t lMultiplicity = -100;
881 Int_t lMultiplicityV0A = -100;
882 Int_t lMultiplicityZNA = -100;
883 Int_t lMultiplicityTRK = -100;
884 Int_t lMultiplicitySPD = -100;
886 if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
888 //---> If this is a nuclear collision, then go nuclear on "multiplicity" variable...
889 //---> Warning: Experimental
890 if(fkIsNuclear == kTRUE){
891 AliCentrality* centrality;
892 centrality = lESDevent->GetCentrality();
893 lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile( fCentralityEstimator.Data() ) ) );
894 lMultiplicityV0A = ( ( Int_t ) ( centrality->GetCentralityPercentile( "V0A" ) ) );
895 lMultiplicityZNA = ( ( Int_t ) ( centrality->GetCentralityPercentile( "ZNA" ) ) );
896 lMultiplicityTRK = ( ( Int_t ) ( centrality->GetCentralityPercentile( "TRK" ) ) );
897 lMultiplicitySPD = ( ( Int_t ) ( centrality->GetCentralityPercentile( "CL1" ) ) );
898 if (centrality->GetQuality()>1) {
899 PostData(1, fListHistV0);
905 //Set variable for filling tree afterwards!
906 //---> pp case......: GetReferenceMultiplicity
907 //---> Pb-Pb case...: Centrality by V0M
908 fTreeVariableMultiplicity = lMultiplicity;
909 fTreeVariableMultiplicityV0A = lMultiplicityV0A;
910 fTreeVariableMultiplicityZNA = lMultiplicityZNA;
911 fTreeVariableMultiplicityTRK = lMultiplicityTRK;
912 fTreeVariableMultiplicitySPD = lMultiplicitySPD;
914 fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
915 fHistMultiplicityV0ABeforeTrigSel->Fill ( lMultiplicityV0A );
916 fHistMultiplicityZNABeforeTrigSel->Fill ( lMultiplicityZNA );
917 fHistMultiplicityTRKBeforeTrigSel->Fill ( lMultiplicityTRK );
918 fHistMultiplicitySPDBeforeTrigSel->Fill ( lMultiplicitySPD );
920 fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
922 //------------------------------------------------
924 //------------------------------------------------
927 UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
928 Bool_t isSelected = 0;
929 Bool_t isSelectedExtra = kTRUE; //extra sel, default YES
930 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
932 if( fkSkipTrigger == kFALSE ){
933 //pA triggering: CINT7
934 if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
936 //Extra selection applies if with/without SDD is to be dealth with
937 if( fkFastOnly == "kFastOnly"){
938 //If not kFastOnly, isSelectedExtra will be kFALSE; procedure will reject it
939 isSelectedExtra = (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly;
941 if( fkFastOnly == "NotkFastOnly"){
942 //If not kFastOnly, isSelectedExtra will be kTRUE; procedure will accept it
943 isSelectedExtra = !( (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly );
946 //Standard Min-Bias Selection
948 PostData(1, fListHistV0);
952 //Check if goes through extra selections
953 //isSelectedExtra will be true in case -> fkFastOnly==""
954 //isSelectedExtra will be true in case -> fkFastOnly=="kFastOnly" && bit kFastOnly ON
955 //isSelectedExtra will be true in case -> fkFastOnly=="NotkFastOnly" && bit kFastOnly OFF
956 if ( !isSelectedExtra ) {
957 PostData(1, fListHistV0);
963 //------------------------------------------------
964 // After Trigger Selection
965 //------------------------------------------------
967 nV0s = lESDevent->GetNumberOfV0s();
969 fHistV0MultiplicityForTrigEvt ->Fill( nV0s );
970 fHistMultiplicityForTrigEvt ->Fill( lMultiplicity );
971 fHistMultiplicityV0AForTrigEvt ->Fill( lMultiplicityV0A );
972 fHistMultiplicityZNAForTrigEvt ->Fill( lMultiplicityZNA );
973 fHistMultiplicityTRKForTrigEvt ->Fill( lMultiplicityTRK );
974 fHistMultiplicitySPDForTrigEvt ->Fill( lMultiplicitySPD );
976 //------------------------------------------------
977 // Getting: Primary Vertex + MagField Info
978 //------------------------------------------------
980 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
981 // get the vtx stored in ESD found with tracks
982 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
984 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
985 // get the best primary vertex available for the event
986 // As done in AliCascadeVertexer, we keep the one which is the best one available.
987 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
988 // This one will be used for next calculations (DCA essentially)
989 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
991 Double_t tPrimaryVtxPosition[3];
992 const AliVVertex *primaryVtx = lESDevent->GetPrimaryVertex();
993 tPrimaryVtxPosition[0] = primaryVtx->GetX();
994 tPrimaryVtxPosition[1] = primaryVtx->GetY();
995 tPrimaryVtxPosition[2] = primaryVtx->GetZ();
996 fHistPVx->Fill( tPrimaryVtxPosition[0] );
997 fHistPVy->Fill( tPrimaryVtxPosition[1] );
998 fHistPVz->Fill( tPrimaryVtxPosition[2] );
1000 f2dHistMultiplicityVsVertexZForTrigEvt->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
1002 //------------------------------------------------
1003 // Primary Vertex Z position: SKIP
1004 //------------------------------------------------
1006 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && fkpAVertexSelection==kFALSE) {
1007 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
1008 PostData(1, fListHistV0);
1012 if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
1013 AliWarning("Pb / | This is the first event in the chunk!");
1014 PostData(1, fListHistV0);
1018 if(fkpAVertexSelection==kTRUE && !fUtils->IsVertexSelected2013pA(lESDevent)) {
1019 AliWarning("Pb / | Vertex not selected by 2013 pA criteria!");
1020 PostData(1, fListHistV0);
1025 f2dHistMultiplicityVsVertexZ->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
1027 lMagneticField = lESDevent->GetMagneticField( );
1028 fHistV0MultiplicityForSelEvt ->Fill( nV0s );
1029 fHistMultiplicity->Fill(lMultiplicity);
1030 fHistMultiplicityV0A->Fill(lMultiplicityV0A);
1031 fHistMultiplicityZNA->Fill(lMultiplicityZNA);
1032 fHistMultiplicityTRK->Fill(lMultiplicityTRK);
1033 fHistMultiplicitySPD->Fill(lMultiplicitySPD);
1035 //------------------------------------------------
1036 // Only look at events with well-established PV
1037 //------------------------------------------------
1039 const AliESDVertex *lPrimaryTrackingESDVtxCheck = lESDevent->GetPrimaryVertexTracks();
1040 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
1041 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() && fkpAVertexSelection==kFALSE ){
1042 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
1043 PostData(1, fListHistV0);
1049 f2dHistMultiplicityVsVertexZNoTPCOnly->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
1050 fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( nV0s );
1051 fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
1052 fHistMultiplicityV0ANoTPCOnly->Fill(lMultiplicityV0A);
1053 fHistMultiplicityZNANoTPCOnly->Fill(lMultiplicityZNA);
1054 fHistMultiplicityTRKNoTPCOnly->Fill(lMultiplicityTRK);
1055 fHistMultiplicitySPDNoTPCOnly->Fill(lMultiplicitySPD);
1057 //------------------------------------------------
1059 //------------------------------------------------
1061 // FIXME : quality selection regarding pile-up rejection
1062 if(lESDevent->IsPileupFromSPD() && !fkIsNuclear && fkRejectPileup){// minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5. -> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
1063 PostData(1, fListHistV0);
1068 f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
1069 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( nV0s );
1070 fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
1071 fHistMultiplicityV0ANoTPCOnlyNoPileup->Fill(lMultiplicityV0A);
1072 fHistMultiplicityZNANoTPCOnlyNoPileup->Fill(lMultiplicityZNA);
1073 fHistMultiplicityTRKNoTPCOnlyNoPileup->Fill(lMultiplicityTRK);
1074 fHistMultiplicitySPDNoTPCOnlyNoPileup->Fill(lMultiplicitySPD);
1076 //------------------------------------------------
1077 // MAIN LAMBDA LOOP STARTS HERE
1078 //------------------------------------------------
1080 if( ! (lESDevent->GetPrimaryVertex()->IsFromVertexerZ() ) ){
1081 fHistPVxAnalysis->Fill( tPrimaryVtxPosition[0] );
1082 fHistPVyAnalysis->Fill( tPrimaryVtxPosition[1] );
1083 fHistPVzAnalysis->Fill( tPrimaryVtxPosition[2] );
1086 fTreeVariablePVx = tPrimaryVtxPosition[0];
1087 fTreeVariablePVy = tPrimaryVtxPosition[1];
1088 fTreeVariablePVz = tPrimaryVtxPosition[2];
1090 //Variable definition
1091 Int_t lOnFlyStatus = 0;// nv0sOn = 0, nv0sOff = 0;
1092 Double_t lChi2V0 = 0;
1093 Double_t lDcaV0Daughters = 0, lDcaV0ToPrimVertex = 0;
1094 Double_t lDcaPosToPrimVertex = 0, lDcaNegToPrimVertex = 0;
1095 Double_t lV0CosineOfPointingAngle = 0;
1096 Double_t lV0Radius = 0, lPt = 0;
1097 Double_t lRapK0Short = 0, lRapLambda = 0;
1098 Double_t lInvMassK0s = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
1099 Double_t lAlphaV0 = 0, lPtArmV0 = 0;
1101 Double_t fMinV0Pt = 0;
1102 Double_t fMaxV0Pt = 100;
1105 nv0s = lESDevent->GetNumberOfV0s();
1107 //for (Int_t iV0 = 0; iV0 < nv0s; iV0++)
1108 for (Int_t iV0 = 0; iV0 < nv0s; iV0++) //extra-crazy test
1109 {// This is the begining of the V0 loop
1110 AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
1113 //---> Fix On-the-Fly candidates, count how many swapped
1114 if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
1115 fHistSwappedV0Counter -> Fill( 1 );
1117 fHistSwappedV0Counter -> Fill( 0 );
1119 if ( fkUseOnTheFly ) CheckChargeV0(v0);
1121 Double_t tDecayVertexV0[3]; v0->GetXYZ(tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]);
1124 v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] );
1125 Double_t lV0TotalMomentum = TMath::Sqrt(
1126 tV0mom[0]*tV0mom[0]+tV0mom[1]*tV0mom[1]+tV0mom[2]*tV0mom[2] );
1128 lV0Radius = TMath::Sqrt(tDecayVertexV0[0]*tDecayVertexV0[0]+tDecayVertexV0[1]*tDecayVertexV0[1]);
1130 //Set Variables for later filling
1131 fTreeVariableV0x = tDecayVertexV0[0];
1132 fTreeVariableV0y = tDecayVertexV0[1];
1133 fTreeVariableV0z = tDecayVertexV0[2];
1135 //Set Variables for later filling
1136 fTreeVariableV0Px = tV0mom[0];
1137 fTreeVariableV0Py = tV0mom[1];
1138 fTreeVariableV0Pz = tV0mom[2];
1141 lRapK0Short = v0->RapK0Short();
1142 lRapLambda = v0->RapLambda();
1143 if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
1145 UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
1146 UInt_t lKeyNeg = (UInt_t)TMath::Abs(v0->GetNindex());
1148 Double_t lMomPos[3]; v0->GetPPxPyPz(lMomPos[0],lMomPos[1],lMomPos[2]);
1149 Double_t lMomNeg[3]; v0->GetNPxPyPz(lMomNeg[0],lMomNeg[1],lMomNeg[2]);
1151 AliESDtrack *pTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyPos);
1152 AliESDtrack *nTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyNeg);
1153 if (!pTrack || !nTrack) {
1154 Printf("ERROR: Could not retreive one of the daughter track");
1158 //Daughter Eta for Eta selection, afterwards
1159 fTreeVariableNegEta = nTrack->Eta();
1160 fTreeVariablePosEta = pTrack->Eta();
1162 if( fkSpecialExecution ){
1163 fTreeVariableNegPx = lMomNeg[0]; fTreeVariableNegPy = lMomNeg[1]; fTreeVariableNegPz = lMomNeg[2];
1164 fTreeVariablePosPx = lMomPos[0]; fTreeVariablePosPy = lMomPos[1]; fTreeVariablePosPz = lMomPos[2];
1165 //Need to acquire info to do dEdx cut afterwards...
1166 fTreeVariablePosTPCSignal = pTrack->GetTPCsignal();
1167 fTreeVariableNegTPCSignal = nTrack->GetTPCsignal();
1168 //Get Inner momentum if possible
1169 fTreeVariableNegInnerP = nTrack->GetP();
1170 fTreeVariablePosInnerP = pTrack->GetP();
1171 const AliExternalTrackParam *innerpos=pTrack->GetInnerParam();
1172 const AliExternalTrackParam *innerneg=nTrack->GetInnerParam();
1173 if(innerpos) { fTreeVariablePosInnerP = innerpos->GetP(); }
1174 if(innerneg) { fTreeVariableNegInnerP = innerneg->GetP(); }
1176 f2dHistdEdxPos->Fill( fTreeVariablePosInnerP , fTreeVariablePosdEdxSig );
1177 f2dHistdEdxNeg->Fill( fTreeVariableNegInnerP , fTreeVariableNegdEdxSig );
1180 // Filter like-sign V0 (next: add counter and distribution)
1181 if ( pTrack->GetSign() == nTrack->GetSign()){
1185 //________________________________________________________________________
1186 // Track quality cuts
1187 Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
1188 Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
1189 fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
1190 if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
1191 fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
1193 // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
1194 if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
1195 if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
1198 fTreeVariablePosTrackStatus = pTrack->GetStatus();
1199 fTreeVariableNegTrackStatus = nTrack->GetStatus();
1201 if ( ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) )&&(fkTakeAllTracks==kFALSE) ) continue;
1203 //GetKinkIndex condition
1204 if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
1206 //Findable clusters > 0 condition
1207 if( pTrack->GetTPCNclsF()<=0 || nTrack->GetTPCNclsF()<=0 ) continue;
1209 //Compute ratio Crossed Rows / Findable clusters
1210 //Note: above test avoids division by zero!
1211 Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF()));
1212 Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF()));
1214 fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
1215 if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
1216 fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
1218 //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
1219 if ( (fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8)&&(fkTakeAllTracks==kFALSE) ) continue;
1221 //End track Quality Cuts
1222 //________________________________________________________________________
1224 lDcaPosToPrimVertex = TMath::Abs(pTrack->GetD(tPrimaryVtxPosition[0],
1225 tPrimaryVtxPosition[1],
1228 lDcaNegToPrimVertex = TMath::Abs(nTrack->GetD(tPrimaryVtxPosition[0],
1229 tPrimaryVtxPosition[1],
1232 lOnFlyStatus = v0->GetOnFlyStatus();
1233 lChi2V0 = v0->GetChi2V0();
1234 lDcaV0Daughters = v0->GetDcaV0Daughters();
1235 lDcaV0ToPrimVertex = v0->GetD(tPrimaryVtxPosition[0],tPrimaryVtxPosition[1],tPrimaryVtxPosition[2]);
1236 lV0CosineOfPointingAngle = v0->GetV0CosineOfPointingAngle(tPrimaryVtxPosition[0],tPrimaryVtxPosition[1],tPrimaryVtxPosition[2]);
1237 fTreeVariableV0CosineOfPointingAngle=lV0CosineOfPointingAngle;
1239 // Getting invariant mass infos directly from ESD
1240 v0->ChangeMassHypothesis(310);
1241 lInvMassK0s = v0->GetEffMass();
1242 v0->ChangeMassHypothesis(3122);
1243 lInvMassLambda = v0->GetEffMass();
1244 v0->ChangeMassHypothesis(-3122);
1245 lInvMassAntiLambda = v0->GetEffMass();
1246 lAlphaV0 = v0->AlphaV0();
1247 lPtArmV0 = v0->PtArmV0();
1249 fTreeVariablePt = v0->Pt();
1250 fTreeVariableChi2V0 = lChi2V0;
1251 fTreeVariableDcaV0ToPrimVertex = lDcaV0ToPrimVertex;
1252 fTreeVariableDcaV0Daughters = lDcaV0Daughters;
1253 fTreeVariableV0CosineOfPointingAngle = lV0CosineOfPointingAngle;
1254 fTreeVariableV0Radius = lV0Radius;
1255 fTreeVariableDcaPosToPrimVertex = lDcaPosToPrimVertex;
1256 fTreeVariableDcaNegToPrimVertex = lDcaNegToPrimVertex;
1257 fTreeVariableInvMassK0s = lInvMassK0s;
1258 fTreeVariableInvMassLambda = lInvMassLambda;
1259 fTreeVariableInvMassAntiLambda = lInvMassAntiLambda;
1260 fTreeVariableRapK0Short = lRapK0Short;
1261 fTreeVariableRapLambda = lRapLambda;
1262 fTreeVariableAlphaV0 = lAlphaV0;
1263 fTreeVariablePtArmV0 = lPtArmV0;
1265 //Official means of acquiring N-sigmas
1266 fTreeVariableNSigmasPosProton = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kProton );
1267 fTreeVariableNSigmasPosPion = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kPion );
1268 fTreeVariableNSigmasNegProton = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kProton );
1269 fTreeVariableNSigmasNegPion = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
1271 //This requires an Invariant Mass Hypothesis afterwards
1272 fTreeVariableDistOverTotMom = TMath::Sqrt(
1273 TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
1274 TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
1275 TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
1277 fTreeVariableDistOverTotMom /= (lV0TotalMomentum+1e-10); //avoid division by zero, to be sure
1279 //------------------------------------------------
1281 //------------------------------------------------
1283 // The conditionals are meant to decrease excessive
1286 //First Selection: Reject OnFly
1287 if( (lOnFlyStatus == 0 && fkUseOnTheFly == kFALSE) || (lOnFlyStatus != 0 && fkUseOnTheFly == kTRUE ) ){
1288 //Second Selection: rough 20-sigma band, parametric.
1289 //K0Short: Enough to parametrize peak broadening with linear function.
1290 Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt;
1291 Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
1292 //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
1293 //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
1294 Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt);
1295 Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
1297 if( (fTreeVariableInvMassLambda < lUpperLimitLambda && fTreeVariableInvMassLambda > lLowerLimitLambda ) ||
1298 (fTreeVariableInvMassAntiLambda < lUpperLimitLambda && fTreeVariableInvMassAntiLambda > lLowerLimitLambda ) ||
1299 (fTreeVariableInvMassK0s < lUpperLimitK0Short && fTreeVariableInvMassK0s > lLowerLimitK0Short ) ){
1300 //Pre-selection in case this is AA...
1301 if( fkIsNuclear == kFALSE ) fTree->Fill();
1302 if( fkIsNuclear == kTRUE){
1303 //If this is a nuclear collision___________________
1304 // ... pre-filter with TPC, daughter eta selection
1305 if( (fTreeVariableInvMassLambda < lUpperLimitLambda && fTreeVariableInvMassLambda > lLowerLimitLambda
1306 && TMath::Abs(fTreeVariableNSigmasPosProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasNegPion) < 6.0 ) ||
1307 (fTreeVariableInvMassAntiLambda < lUpperLimitLambda && fTreeVariableInvMassAntiLambda > lLowerLimitLambda
1308 && TMath::Abs(fTreeVariableNSigmasNegProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ||
1309 (fTreeVariableInvMassK0s < lUpperLimitK0Short && fTreeVariableInvMassK0s > lLowerLimitK0Short
1310 && TMath::Abs(fTreeVariableNSigmasNegPion) < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ){
1312 if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && !fkSpecialExecution) fTree->Fill();
1314 }//end nuclear_____________________________________
1318 if(lOnFlyStatus == 0 && fkSpecialExecution){
1320 (fTreeVariableNSigmasPosProton > 6 && TMath::Abs(fTreeVariableNSigmasNegPion)< 6
1321 && fTreeVariableDcaPosToPrimVertex > fExtraDCAHeavyToPrimVertex && fTreeVariableDcaNegToPrimVertex > fExtraDCALightToPrimVertex ) ||
1322 (fTreeVariableNSigmasNegProton > 6 && TMath::Abs(fTreeVariableNSigmasPosPion)< 6
1323 && fTreeVariableDcaPosToPrimVertex > fExtraDCALightToPrimVertex && fTreeVariableDcaNegToPrimVertex > fExtraDCAHeavyToPrimVertex ) ){
1328 //------------------------------------------------
1330 //------------------------------------------------
1332 }// This is the end of the V0 loop
1334 // Post output data.
1335 PostData(1, fListHistV0);
1341 //________________________________________________________________________
1342 void AliAnalysisTaskExtractV0::Terminate(Option_t *)
1344 // Draw result to the screen
1345 // Called once at the end of the query
1346 // This will draw the V0 candidate multiplicity, whose
1347 // number of entries corresponds to the number of triggered events.
1348 TList *cRetrievedList = 0x0;
1349 cRetrievedList = (TList*)GetOutputData(1);
1350 if(!cRetrievedList){
1351 Printf("ERROR - AliAnalysisTaskExtractV0 : ouput data container list not available\n");
1354 fHistV0MultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistV0MultiplicityForTrigEvt") );
1355 if (!fHistV0MultiplicityForTrigEvt) {
1356 Printf("ERROR - AliAnalysisTaskExtractV0 : fHistV0MultiplicityForTrigEvt not available");
1359 TCanvas *canCheck = new TCanvas("AliAnalysisTaskExtractV0","V0 Multiplicity",10,10,510,510);
1360 canCheck->cd(1)->SetLogy();
1361 fHistV0MultiplicityForTrigEvt->SetMarkerStyle(22);
1362 fHistV0MultiplicityForTrigEvt->DrawCopy("E");
1365 //________________________________________________________________________
1366 void AliAnalysisTaskExtractV0::CheckChargeV0(AliESDv0 *v0)
1368 // This function checks charge of negative and positive daughter tracks.
1369 // If incorrectly defined (onfly vertexer), swaps out.
1370 if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
1371 //V0 daughter track swapping is required! Note: everything is swapped here... P->N, N->P
1372 Long_t lCorrectNidx = v0->GetPindex();
1373 Long_t lCorrectPidx = v0->GetNindex();
1374 Double32_t lCorrectNmom[3];
1375 Double32_t lCorrectPmom[3];
1376 v0->GetPPxPyPz( lCorrectNmom[0], lCorrectNmom[1], lCorrectNmom[2] );
1377 v0->GetNPxPyPz( lCorrectPmom[0], lCorrectPmom[1], lCorrectPmom[2] );
1379 AliExternalTrackParam lCorrectParamN(
1380 v0->GetParamP()->GetX() ,
1381 v0->GetParamP()->GetAlpha() ,
1382 v0->GetParamP()->GetParameter() ,
1383 v0->GetParamP()->GetCovariance()
1385 AliExternalTrackParam lCorrectParamP(
1386 v0->GetParamN()->GetX() ,
1387 v0->GetParamN()->GetAlpha() ,
1388 v0->GetParamN()->GetParameter() ,
1389 v0->GetParamN()->GetCovariance()
1391 lCorrectParamN.SetMostProbablePt( v0->GetParamP()->GetMostProbablePt() );
1392 lCorrectParamP.SetMostProbablePt( v0->GetParamN()->GetMostProbablePt() );
1394 //Get Variables___________________________________________________
1395 Double_t lDcaV0Daughters = v0 -> GetDcaV0Daughters();
1396 Double_t lCosPALocal = v0 -> GetV0CosineOfPointingAngle();
1397 Bool_t lOnFlyStatusLocal = v0 -> GetOnFlyStatus();
1399 //Create Replacement Object_______________________________________
1400 AliESDv0 *v0correct = new AliESDv0(lCorrectParamN,lCorrectNidx,lCorrectParamP,lCorrectPidx);
1401 v0correct->SetDcaV0Daughters ( lDcaV0Daughters );
1402 v0correct->SetV0CosineOfPointingAngle ( lCosPALocal );
1403 v0correct->ChangeMassHypothesis ( kK0Short );
1404 v0correct->SetOnFlyStatus ( lOnFlyStatusLocal );
1406 //Reverse Cluster info..._________________________________________
1407 v0correct->SetClusters( v0->GetClusters( 1 ), v0->GetClusters ( 0 ) );
1410 //Proper cleanup..._______________________________________________
1411 v0correct->Delete();
1414 //Just another cross-check and output_____________________________
1415 if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ) {
1416 AliWarning("Found Swapped Charges, tried to correct but something FAILED!");
1418 //AliWarning("Found Swapped Charges and fixed.");
1420 //________________________________________________________________
1422 //Don't touch it! ---
1423 //Printf("Ah, nice. Charges are already ordered...");