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.
24 // --- Algorithm Description
25 // 1. Loop over primaries in stack to acquire generated charged Xi
26 // 2. Loop over stack to find Cascades, fill TH3Fs "PrimRawPt"s for Efficiency
27 // 3. Perform Physics Selection
28 // 4. Perform Primary Vertex |z|<10cm selection
29 // 5. Perform Primary Vertex NoTPCOnly vertexing selection
30 // 6. Perform Pileup Rejection
32 // 7a. Fill TH3Fs "PrimAnalysisPt" for control purposes only
34 // Please Report Any Bugs!
36 // --- David Dobrigkeit Chinellato
37 // (david.chinellato@gmail.com)
39 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 //class AliMCEventHandler;
54 #include <Riostream.h>
60 #include "THnSparse.h"
67 #include "AliESDEvent.h"
68 #include "AliAODEvent.h"
69 #include "AliV0vertexer.h"
70 #include "AliCascadeVertexer.h"
71 #include "AliESDpid.h"
72 #include "AliESDtrack.h"
73 #include "AliESDtrackCuts.h"
74 #include "AliInputEventHandler.h"
75 #include "AliAnalysisManager.h"
76 #include "AliMCEventHandler.h"
77 #include "AliMCEvent.h"
80 #include "AliV0vertexer.h"
81 #include "AliCascadeVertexer.h"
83 #include "AliCFContainer.h"
84 #include "AliMultiplicity.h"
85 #include "AliAODMCParticle.h"
86 #include "AliESDcascade.h"
87 #include "AliAODcascade.h"
88 #include "AliESDUtils.h"
89 #include "AliGenEventHeader.h"
90 #include "AliAnalysisUtils.h"
92 #include "AliAnalysisTaskExtractCascade.h"
97 ClassImp(AliAnalysisTaskExtractCascade)
99 AliAnalysisTaskExtractCascade::AliAnalysisTaskExtractCascade()
100 : AliAnalysisTaskSE(), fListHist(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
101 fkIsNuclear ( kFALSE ),
102 fkSwitchINT7 ( kFALSE ),
103 fCentralityEstimator("V0M"),
104 fkpAVertexSelection( kFALSE ),
106 //------------------------------------------------
108 //------------------------------------------------
110 fTreeCascVarCharge(0),
111 fTreeCascVarMassAsXi(0),
112 fTreeCascVarMassAsOmega(0),
115 fTreeCascVarRapMC(0),
116 fTreeCascVarRapXi(0),
117 fTreeCascVarRapOmega(0),
118 fTreeCascVarNegEta(0),
119 fTreeCascVarPosEta(0),
120 fTreeCascVarBachEta(0),
121 fTreeCascVarDCACascDaughters(0),
122 fTreeCascVarDCABachToPrimVtx(0),
123 fTreeCascVarDCAV0Daughters(0),
124 fTreeCascVarDCAV0ToPrimVtx(0),
125 fTreeCascVarDCAPosToPrimVtx(0),
126 fTreeCascVarDCANegToPrimVtx(0),
127 fTreeCascVarCascCosPointingAngle(0),
128 fTreeCascVarCascRadius(0),
129 fTreeCascVarV0Mass(0),
130 fTreeCascVarV0CosPointingAngle(0),
131 fTreeCascVarV0Radius(0),
132 fTreeCascVarLeastNbrClusters(0),
133 fTreeCascVarMultiplicity(0),
134 fTreeCascVarMultiplicityV0A(0),
135 fTreeCascVarMultiplicityZNA(0),
136 fTreeCascVarMultiplicityTRK(0),
137 fTreeCascVarMultiplicitySPD(0),
138 fTreeCascVarDistOverTotMom(0),
140 fTreeCascVarPIDBachelor(0),
141 fTreeCascVarPIDNegative(0),
142 fTreeCascVarPIDPositive(0),
143 fTreeCascVarPosTransMom(0),
144 fTreeCascVarNegTransMom(0),
145 fTreeCascVarPosTransMomMC(0),
146 fTreeCascVarNegTransMomMC(0),
147 fTreeCascVarNegNSigmaPion(0),
148 fTreeCascVarNegNSigmaProton(0),
149 fTreeCascVarPosNSigmaPion(0),
150 fTreeCascVarPosNSigmaProton(0),
151 fTreeCascVarBachNSigmaPion(0),
152 fTreeCascVarBachNSigmaKaon(0),
154 //------------------------------------------------
156 // --- Filled on an Event-by-event basis
157 //------------------------------------------------
158 fHistV0MultiplicityBeforeTrigSel(0),
159 fHistV0MultiplicityForTrigEvt(0),
160 fHistV0MultiplicityForSelEvt(0),
161 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
162 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
163 fHistMultiplicityBeforeTrigSel(0),
164 fHistMultiplicityForTrigEvt(0),
165 fHistMultiplicity(0),
166 fHistMultiplicityNoTPCOnly(0),
167 fHistMultiplicityNoTPCOnlyNoPileup(0),
170 fHistMultiplicityV0ABeforeTrigSel(0),
171 fHistMultiplicityV0AForTrigEvt(0),
172 fHistMultiplicityV0A(0),
173 fHistMultiplicityV0ANoTPCOnly(0),
174 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
177 fHistMultiplicityZNABeforeTrigSel(0),
178 fHistMultiplicityZNAForTrigEvt(0),
179 fHistMultiplicityZNA(0),
180 fHistMultiplicityZNANoTPCOnly(0),
181 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
184 fHistMultiplicityTRKBeforeTrigSel(0),
185 fHistMultiplicityTRKForTrigEvt(0),
186 fHistMultiplicityTRK(0),
187 fHistMultiplicityTRKNoTPCOnly(0),
188 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
191 fHistMultiplicitySPDBeforeTrigSel(0),
192 fHistMultiplicitySPDForTrigEvt(0),
193 fHistMultiplicitySPD(0),
194 fHistMultiplicitySPDNoTPCOnly(0),
195 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
207 AliAnalysisTaskExtractCascade::AliAnalysisTaskExtractCascade(const char *name)
208 : AliAnalysisTaskSE(name), fListHist(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
209 fkIsNuclear ( kFALSE ),
210 fkSwitchINT7 ( kFALSE ),
211 fCentralityEstimator("V0M"),
212 fkpAVertexSelection( kFALSE ),
214 //------------------------------------------------
216 //------------------------------------------------
218 fTreeCascVarCharge(0),
219 fTreeCascVarMassAsXi(0),
220 fTreeCascVarMassAsOmega(0),
223 fTreeCascVarRapMC(0),
224 fTreeCascVarRapXi(0),
225 fTreeCascVarRapOmega(0),
226 fTreeCascVarNegEta(0),
227 fTreeCascVarPosEta(0),
228 fTreeCascVarBachEta(0),
229 fTreeCascVarDCACascDaughters(0),
230 fTreeCascVarDCABachToPrimVtx(0),
231 fTreeCascVarDCAV0Daughters(0),
232 fTreeCascVarDCAV0ToPrimVtx(0),
233 fTreeCascVarDCAPosToPrimVtx(0),
234 fTreeCascVarDCANegToPrimVtx(0),
235 fTreeCascVarCascCosPointingAngle(0),
236 fTreeCascVarCascRadius(0),
237 fTreeCascVarV0Mass(0),
238 fTreeCascVarV0CosPointingAngle(0),
239 fTreeCascVarV0Radius(0),
240 fTreeCascVarLeastNbrClusters(0),
241 fTreeCascVarMultiplicity(0),
242 fTreeCascVarMultiplicityV0A(0),
243 fTreeCascVarMultiplicityZNA(0),
244 fTreeCascVarMultiplicityTRK(0),
245 fTreeCascVarMultiplicitySPD(0),
246 fTreeCascVarDistOverTotMom(0),
248 fTreeCascVarPIDBachelor(0),
249 fTreeCascVarPIDNegative(0),
250 fTreeCascVarPIDPositive(0),
251 fTreeCascVarPosTransMom(0),
252 fTreeCascVarNegTransMom(0),
253 fTreeCascVarPosTransMomMC(0),
254 fTreeCascVarNegTransMomMC(0),
255 fTreeCascVarNegNSigmaPion(0),
256 fTreeCascVarNegNSigmaProton(0),
257 fTreeCascVarPosNSigmaPion(0),
258 fTreeCascVarPosNSigmaProton(0),
259 fTreeCascVarBachNSigmaPion(0),
260 fTreeCascVarBachNSigmaKaon(0),
262 //------------------------------------------------
264 // --- Filled on an Event-by-event basis
265 //------------------------------------------------
266 fHistV0MultiplicityBeforeTrigSel(0),
267 fHistV0MultiplicityForTrigEvt(0),
268 fHistV0MultiplicityForSelEvt(0),
269 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
270 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
271 fHistMultiplicityBeforeTrigSel(0),
272 fHistMultiplicityForTrigEvt(0),
273 fHistMultiplicity(0),
274 fHistMultiplicityNoTPCOnly(0),
275 fHistMultiplicityNoTPCOnlyNoPileup(0),
278 fHistMultiplicityV0ABeforeTrigSel(0),
279 fHistMultiplicityV0AForTrigEvt(0),
280 fHistMultiplicityV0A(0),
281 fHistMultiplicityV0ANoTPCOnly(0),
282 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
285 fHistMultiplicityZNABeforeTrigSel(0),
286 fHistMultiplicityZNAForTrigEvt(0),
287 fHistMultiplicityZNA(0),
288 fHistMultiplicityZNANoTPCOnly(0),
289 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
292 fHistMultiplicityTRKBeforeTrigSel(0),
293 fHistMultiplicityTRKForTrigEvt(0),
294 fHistMultiplicityTRK(0),
295 fHistMultiplicityTRKNoTPCOnly(0),
296 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
299 fHistMultiplicitySPDBeforeTrigSel(0),
300 fHistMultiplicitySPDForTrigEvt(0),
301 fHistMultiplicitySPD(0),
302 fHistMultiplicitySPDNoTPCOnly(0),
303 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
314 //Set Variables for re-running the cascade vertexers (as done for MS paper)
316 // New Loose : 1st step for the 7 TeV pp analysis
318 fV0Sels[0] = 33. ; // max allowed chi2
319 fV0Sels[1] = 0.02; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
320 fV0Sels[2] = 0.02; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
321 fV0Sels[3] = 2.0 ; // max allowed DCA between the daughter tracks (LHC09a4 : 0.5)
322 fV0Sels[4] = 0.95; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
323 fV0Sels[5] = 1.0 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
324 fV0Sels[6] = 100. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
326 fCascSels[0] = 33. ; // max allowed chi2 (same as PDC07)
327 fCascSels[1] = 0.05 ; // min allowed V0 impact parameter (PDC07 : 0.05 / LHC09a4 : 0.025 )
328 fCascSels[2] = 0.010; // "window" around the Lambda mass (PDC07 : 0.008 / LHC09a4 : 0.010 )
329 fCascSels[3] = 0.03 ; // min allowed bachelor's impact parameter (PDC07 : 0.035 / LHC09a4 : 0.025 )
330 fCascSels[4] = 2.0 ; // max allowed DCA between the V0 and the bachelor (PDC07 : 0.1 / LHC09a4 : 0.2 )
331 fCascSels[5] = 0.95 ; // min allowed cosine of the cascade pointing angle (PDC07 : 0.9985 / LHC09a4 : 0.998 )
332 fCascSels[6] = 0.4 ; // min radius of the fiducial volume (PDC07 : 0.9 / LHC09a4 : 0.2 )
333 fCascSels[7] = 100. ; // max radius of the fiducial volume (PDC07 : 100 / LHC09a4 : 100 )
335 // Output slot #0 writes into a TList container (Cascade)
336 DefineOutput(1, TList::Class());
337 DefineOutput(2, TTree::Class());
341 AliAnalysisTaskExtractCascade::~AliAnalysisTaskExtractCascade()
343 //------------------------------------------------
345 //------------------------------------------------
355 //cleanup esd track cuts object too...
357 delete fESDtrackCuts;
367 //________________________________________________________________________
368 void AliAnalysisTaskExtractCascade::UserCreateOutputObjects()
373 //------------------------------------------------
375 fTreeCascade = new TTree("fTreeCascade","CascadeCandidates");
377 //------------------------------------------------
378 // fTreeCascade Branch definitions - Cascade Tree
379 //------------------------------------------------
381 //------------------------------------------------
382 // fTreeCascade Branch definitions
383 //------------------------------------------------
385 //-----------BASIC-INFO---------------------------
386 /* 1*/ fTreeCascade->Branch("fTreeCascVarCharge",&fTreeCascVarCharge,"fTreeCascVarCharge/I");
387 /* 2*/ fTreeCascade->Branch("fTreeCascVarMassAsXi",&fTreeCascVarMassAsXi,"fTreeCascVarMassAsXi/F");
388 /* 3*/ fTreeCascade->Branch("fTreeCascVarMassAsOmega",&fTreeCascVarMassAsOmega,"fTreeCascVarMassAsOmega/F");
389 /* 4*/ fTreeCascade->Branch("fTreeCascVarPt",&fTreeCascVarPt,"fTreeCascVarPt/F");
390 /* 5*/ fTreeCascade->Branch("fTreeCascVarRapXi",&fTreeCascVarRapXi,"fTreeCascVarRapXi/F");
391 /* 6*/ fTreeCascade->Branch("fTreeCascVarRapOmega",&fTreeCascVarRapOmega,"fTreeCascVarRapOmega/F");
392 /* 7*/ fTreeCascade->Branch("fTreeCascVarNegEta",&fTreeCascVarNegEta,"fTreeCascVarNegEta/F");
393 /* 8*/ fTreeCascade->Branch("fTreeCascVarPosEta",&fTreeCascVarPosEta,"fTreeCascVarPosEta/F");
394 /* 9*/ fTreeCascade->Branch("fTreeCascVarBachEta",&fTreeCascVarBachEta,"fTreeCascVarBachEta/F");
395 //-----------INFO-FOR-CUTS------------------------
396 /*10*/ fTreeCascade->Branch("fTreeCascVarDCACascDaughters",&fTreeCascVarDCACascDaughters,"fTreeCascVarDCACascDaughters/F");
397 /*11*/ fTreeCascade->Branch("fTreeCascVarDCABachToPrimVtx",&fTreeCascVarDCABachToPrimVtx,"fTreeCascVarDCABachToPrimVtx/F");
398 /*12*/ fTreeCascade->Branch("fTreeCascVarDCAV0Daughters",&fTreeCascVarDCAV0Daughters,"fTreeCascVarDCAV0Daughters/F");
399 /*13*/ fTreeCascade->Branch("fTreeCascVarDCAV0ToPrimVtx",&fTreeCascVarDCAV0ToPrimVtx,"fTreeCascVarDCAV0ToPrimVtx/F");
400 /*14*/ fTreeCascade->Branch("fTreeCascVarDCAPosToPrimVtx",&fTreeCascVarDCAPosToPrimVtx,"fTreeCascVarDCAPosToPrimVtx/F");
401 /*15*/ fTreeCascade->Branch("fTreeCascVarDCANegToPrimVtx",&fTreeCascVarDCANegToPrimVtx,"fTreeCascVarDCANegToPrimVtx/F");
402 /*16*/ fTreeCascade->Branch("fTreeCascVarCascCosPointingAngle",&fTreeCascVarCascCosPointingAngle,"fTreeCascVarCascCosPointingAngle/F");
403 /*17*/ fTreeCascade->Branch("fTreeCascVarCascRadius",&fTreeCascVarCascRadius,"fTreeCascVarCascRadius/F");
404 /*18*/ fTreeCascade->Branch("fTreeCascVarV0Mass",&fTreeCascVarV0Mass,"fTreeCascVarV0Mass/F");
405 /*19*/ fTreeCascade->Branch("fTreeCascVarV0CosPointingAngle",&fTreeCascVarV0CosPointingAngle,"fTreeCascVarV0CosPointingAngle/F");
406 /*20*/ fTreeCascade->Branch("fTreeCascVarV0Radius",&fTreeCascVarV0Radius,"fTreeCascVarV0Radius/F");
407 /*21*/ fTreeCascade->Branch("fTreeCascVarLeastNbrClusters",&fTreeCascVarLeastNbrClusters,"fTreeCascVarLeastNbrClusters/I");
408 //-----------MULTIPLICITY-INFO--------------------
409 /*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicity",&fTreeCascVarMultiplicity,"fTreeCascVarMultiplicity/I");
410 /*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityV0A",&fTreeCascVarMultiplicityV0A,"fTreeCascVarMultiplicityV0A/I");
411 /*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityZNA",&fTreeCascVarMultiplicityZNA,"fTreeCascVarMultiplicityZNA/I");
412 /*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityTRK",&fTreeCascVarMultiplicityTRK,"fTreeCascVarMultiplicityTRK/I");
413 /*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicitySPD",&fTreeCascVarMultiplicitySPD,"fTreeCascVarMultiplicitySPD/I");
414 //-----------DECAY-LENGTH-INFO--------------------
415 /*23*/ fTreeCascade->Branch("fTreeCascVarDistOverTotMom",&fTreeCascVarDistOverTotMom,"fTreeCascVarDistOverTotMom/F");
416 //------------------------------------------------
417 /*24*/ fTreeCascade->Branch("fTreeCascVarNegNSigmaPion",&fTreeCascVarNegNSigmaPion,"fTreeCascVarNegNSigmaPion/F");
418 /*25*/ fTreeCascade->Branch("fTreeCascVarNegNSigmaProton",&fTreeCascVarNegNSigmaProton,"fTreeCascVarNegNSigmaProton/F");
419 /*26*/ fTreeCascade->Branch("fTreeCascVarPosNSigmaPion",&fTreeCascVarPosNSigmaPion,"fTreeCascVarPosNSigmaPion/F");
420 /*27*/ fTreeCascade->Branch("fTreeCascVarPosNSigmaProton",&fTreeCascVarPosNSigmaProton,"fTreeCascVarPosNSigmaProton/F");
421 /*28*/ fTreeCascade->Branch("fTreeCascVarBachNSigmaPion",&fTreeCascVarBachNSigmaPion,"fTreeCascVarBachNSigmaPion/F");
422 /*29*/ fTreeCascade->Branch("fTreeCascVarBachNSigmaKaon",&fTreeCascVarBachNSigmaKaon,"fTreeCascVarBachNSigmaKaon/F");
424 //------------------------------------------------
425 // Particle Identification Setup
426 //------------------------------------------------
428 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
429 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
430 fPIDResponse = inputHandler->GetPIDResponse();
434 if(! fESDtrackCuts ){
435 fESDtrackCuts = new AliESDtrackCuts();
438 fUtils = new AliAnalysisUtils();
441 //------------------------------------------------
442 // V0 Multiplicity Histograms
443 //------------------------------------------------
447 fListHist = new TList();
448 fListHist->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
451 if(! fHistV0MultiplicityBeforeTrigSel) {
452 fHistV0MultiplicityBeforeTrigSel = new TH1F("fHistV0MultiplicityBeforeTrigSel",
453 "V0s per event (before Trig. Sel.);Nbr of V0s/Evt;Events",
455 fListHist->Add(fHistV0MultiplicityBeforeTrigSel);
458 if(! fHistV0MultiplicityForTrigEvt) {
459 fHistV0MultiplicityForTrigEvt = new TH1F("fHistV0MultiplicityForTrigEvt",
460 "V0s per event (for triggered evt);Nbr of V0s/Evt;Events",
462 fListHist->Add(fHistV0MultiplicityForTrigEvt);
465 if(! fHistV0MultiplicityForSelEvt) {
466 fHistV0MultiplicityForSelEvt = new TH1F("fHistV0MultiplicityForSelEvt",
467 "V0s per event;Nbr of V0s/Evt;Events",
469 fListHist->Add(fHistV0MultiplicityForSelEvt);
472 if(! fHistV0MultiplicityForSelEvtNoTPCOnly) {
473 fHistV0MultiplicityForSelEvtNoTPCOnly = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnly",
474 "V0s per event;Nbr of V0s/Evt;Events",
476 fListHist->Add(fHistV0MultiplicityForSelEvtNoTPCOnly);
478 if(! fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup) {
479 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup",
480 "V0s per event;Nbr of V0s/Evt;Events",
482 fListHist->Add(fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup);
485 //------------------------------------------------
486 // Track Multiplicity Histograms
487 //------------------------------------------------
489 if(! fHistMultiplicityBeforeTrigSel) {
490 fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel",
491 "Tracks per event;Nbr of Tracks;Events",
493 fListHist->Add(fHistMultiplicityBeforeTrigSel);
495 if(! fHistMultiplicityForTrigEvt) {
496 fHistMultiplicityForTrigEvt = new TH1F("fHistMultiplicityForTrigEvt",
497 "Tracks per event;Nbr of Tracks;Events",
499 fListHist->Add(fHistMultiplicityForTrigEvt);
501 if(! fHistMultiplicity) {
502 fHistMultiplicity = new TH1F("fHistMultiplicity",
503 "Tracks per event;Nbr of Tracks;Events",
505 fListHist->Add(fHistMultiplicity);
507 if(! fHistMultiplicityNoTPCOnly) {
508 fHistMultiplicityNoTPCOnly = new TH1F("fHistMultiplicityNoTPCOnly",
509 "Tracks per event;Nbr of Tracks;Events",
511 fListHist->Add(fHistMultiplicityNoTPCOnly);
513 if(! fHistMultiplicityNoTPCOnlyNoPileup) {
514 fHistMultiplicityNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityNoTPCOnlyNoPileup",
515 "Tracks per event;Nbr of Tracks;Events",
517 fListHist->Add(fHistMultiplicityNoTPCOnlyNoPileup);
521 //V0A Centrality (if PbPb / pPb)
522 if(! fHistMultiplicityV0ABeforeTrigSel) {
523 fHistMultiplicityV0ABeforeTrigSel = new TH1F("fHistMultiplicityV0ABeforeTrigSel",
524 "Centrality Distribution: V0A;V0A Centrality;Events",
526 fListHist->Add(fHistMultiplicityV0ABeforeTrigSel);
528 if(! fHistMultiplicityV0AForTrigEvt) {
529 fHistMultiplicityV0AForTrigEvt = new TH1F("fHistMultiplicityV0AForTrigEvt",
530 "Centrality Distribution: V0A;V0A Centrality;Events",
532 fListHist->Add(fHistMultiplicityV0AForTrigEvt);
534 if(! fHistMultiplicityV0A) {
535 fHistMultiplicityV0A = new TH1F("fHistMultiplicityV0A",
536 "Centrality Distribution: V0A;V0A Centrality;Events",
538 fListHist->Add(fHistMultiplicityV0A);
540 if(! fHistMultiplicityV0ANoTPCOnly) {
541 fHistMultiplicityV0ANoTPCOnly = new TH1F("fHistMultiplicityV0ANoTPCOnly",
542 "Centrality Distribution: V0A;V0A Centrality;Events",
544 fListHist->Add(fHistMultiplicityV0ANoTPCOnly);
546 if(! fHistMultiplicityV0ANoTPCOnlyNoPileup) {
547 fHistMultiplicityV0ANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityV0ANoTPCOnlyNoPileup",
548 "Centrality Distribution: V0A;V0A Centrality;Events",
550 fListHist->Add(fHistMultiplicityV0ANoTPCOnlyNoPileup);
553 //ZNA Centrality (if PbPb / pPb)
554 if(! fHistMultiplicityZNABeforeTrigSel) {
555 fHistMultiplicityZNABeforeTrigSel = new TH1F("fHistMultiplicityZNABeforeTrigSel",
556 "Centrality Distribution: ZNA;ZNA Centrality;Events",
558 fListHist->Add(fHistMultiplicityZNABeforeTrigSel);
560 if(! fHistMultiplicityZNAForTrigEvt) {
561 fHistMultiplicityZNAForTrigEvt = new TH1F("fHistMultiplicityZNAForTrigEvt",
562 "Centrality Distribution: ZNA;ZNA Centrality;Events",
564 fListHist->Add(fHistMultiplicityZNAForTrigEvt);
566 if(! fHistMultiplicityZNA) {
567 fHistMultiplicityZNA = new TH1F("fHistMultiplicityZNA",
568 "Centrality Distribution: ZNA;ZNA Centrality;Events",
570 fListHist->Add(fHistMultiplicityZNA);
572 if(! fHistMultiplicityZNANoTPCOnly) {
573 fHistMultiplicityZNANoTPCOnly = new TH1F("fHistMultiplicityZNANoTPCOnly",
574 "Centrality Distribution: ZNA;ZNA Centrality;Events",
576 fListHist->Add(fHistMultiplicityZNANoTPCOnly);
578 if(! fHistMultiplicityZNANoTPCOnlyNoPileup) {
579 fHistMultiplicityZNANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityZNANoTPCOnlyNoPileup",
580 "Centrality Distribution: ZNA;ZNA Centrality;Events",
582 fListHist->Add(fHistMultiplicityZNANoTPCOnlyNoPileup);
585 //TRK Centrality (if PbPb / pPb)
586 if(! fHistMultiplicityTRKBeforeTrigSel) {
587 fHistMultiplicityTRKBeforeTrigSel = new TH1F("fHistMultiplicityTRKBeforeTrigSel",
588 "Centrality Distribution: TRK;TRK Centrality;Events",
590 fListHist->Add(fHistMultiplicityTRKBeforeTrigSel);
592 if(! fHistMultiplicityTRKForTrigEvt) {
593 fHistMultiplicityTRKForTrigEvt = new TH1F("fHistMultiplicityTRKForTrigEvt",
594 "Centrality Distribution: TRK;TRK Centrality;Events",
596 fListHist->Add(fHistMultiplicityTRKForTrigEvt);
598 if(! fHistMultiplicityTRK) {
599 fHistMultiplicityTRK = new TH1F("fHistMultiplicityTRK",
600 "Centrality Distribution: TRK;TRK Centrality;Events",
602 fListHist->Add(fHistMultiplicityTRK);
604 if(! fHistMultiplicityTRKNoTPCOnly) {
605 fHistMultiplicityTRKNoTPCOnly = new TH1F("fHistMultiplicityTRKNoTPCOnly",
606 "Centrality Distribution: TRK;TRK Centrality;Events",
608 fListHist->Add(fHistMultiplicityTRKNoTPCOnly);
610 if(! fHistMultiplicityTRKNoTPCOnlyNoPileup) {
611 fHistMultiplicityTRKNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityTRKNoTPCOnlyNoPileup",
612 "Centrality Distribution: TRK;TRK Centrality;Events",
614 fListHist->Add(fHistMultiplicityTRKNoTPCOnlyNoPileup);
617 //SPD Centrality (if PbPb / pPb)
618 if(! fHistMultiplicitySPDBeforeTrigSel) {
619 fHistMultiplicitySPDBeforeTrigSel = new TH1F("fHistMultiplicitySPDBeforeTrigSel",
620 "Centrality Distribution: SPD;SPD Centrality;Events",
622 fListHist->Add(fHistMultiplicitySPDBeforeTrigSel);
624 if(! fHistMultiplicitySPDForTrigEvt) {
625 fHistMultiplicitySPDForTrigEvt = new TH1F("fHistMultiplicitySPDForTrigEvt",
626 "Centrality Distribution: SPD;SPD Centrality;Events",
628 fListHist->Add(fHistMultiplicitySPDForTrigEvt);
630 if(! fHistMultiplicitySPD) {
631 fHistMultiplicitySPD = new TH1F("fHistMultiplicitySPD",
632 "Centrality Distribution: SPD;SPD Centrality;Events",
634 fListHist->Add(fHistMultiplicitySPD);
636 if(! fHistMultiplicitySPDNoTPCOnly) {
637 fHistMultiplicitySPDNoTPCOnly = new TH1F("fHistMultiplicitySPDNoTPCOnly",
638 "Centrality Distribution: SPD;SPD Centrality;Events",
640 fListHist->Add(fHistMultiplicitySPDNoTPCOnly);
642 if(! fHistMultiplicitySPDNoTPCOnlyNoPileup) {
643 fHistMultiplicitySPDNoTPCOnlyNoPileup = new TH1F("fHistMultiplicitySPDNoTPCOnlyNoPileup",
644 "Centrality Distribution: SPD;SPD Centrality;Events",
646 fListHist->Add(fHistMultiplicitySPDNoTPCOnlyNoPileup);
650 //----------------------------------
651 // Primary Vertex Position Histos
652 //----------------------------------
655 fHistPVx = new TH1F("fHistPVx",
656 "PV x position;Nbr of Evts;x",
658 fListHist->Add(fHistPVx);
661 fHistPVy = new TH1F("fHistPVy",
662 "PV y position;Nbr of Evts;y",
664 fListHist->Add(fHistPVy);
667 fHistPVz = new TH1F("fHistPVz",
668 "PV z position;Nbr of Evts;z",
670 fListHist->Add(fHistPVz);
673 if(! fHistPVxAnalysis) {
674 fHistPVxAnalysis = new TH1F("fHistPVxAnalysis",
675 "PV x position;Nbr of Evts;x",
677 fListHist->Add(fHistPVxAnalysis);
679 if(! fHistPVyAnalysis) {
680 fHistPVyAnalysis = new TH1F("fHistPVyAnalysis",
681 "PV y position;Nbr of Evts;y",
683 fListHist->Add(fHistPVyAnalysis);
685 if(! fHistPVzAnalysis) {
686 fHistPVzAnalysis = new TH1F("fHistPVzAnalysis",
687 "PV z position;Nbr of Evts;z",
689 fListHist->Add(fHistPVzAnalysis);
692 //List of Histograms: Normal
693 PostData(1, fListHist);
695 //TTree Object: Saved to base directory. Should cache to disk while saving.
696 //(Important to avoid excessive memory usage, particularly when merging)
697 PostData(2, fTreeCascade);
699 }// end UserCreateOutputObjects
702 //________________________________________________________________________
703 void AliAnalysisTaskExtractCascade::UserExec(Option_t *)
706 // Called for each event
708 AliESDEvent *lESDevent = 0x0;
710 Int_t lNumberOfV0s = -1;
711 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
712 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
713 Double_t lMagneticField = -10.;
715 // Connect to the InputEvent
716 // After these lines, we should have an ESD/AOD event + the number of V0s in it.
718 // Appropriate for ESD analysis!
720 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
722 AliWarning("ERROR: lESDevent not available \n");
726 /* --- Acquisition of exact event ID
727 fTreeVariableRunNumber = lESDevent->GetRunNumber();
728 fTreeVariableEventNumber =
729 ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
730 ( ((ULong64_t)lESDevent->GetOrbitNumber () ) << 12 ) |
731 ((ULong64_t)lESDevent->GetBunchCrossNumber() ) );
734 //------------------------------------------------
735 // Multiplicity Information Acquistion
736 //------------------------------------------------
738 //REVISED multiplicity estimator after 'multiplicity day' (2011)
739 Int_t lMultiplicity = -100;
740 Int_t lMultiplicityV0A = -100;
741 Int_t lMultiplicityZNA = -100;
742 Int_t lMultiplicityTRK = -100;
743 Int_t lMultiplicitySPD = -100;
746 if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC, fEtaRefMult );
748 //---> If this is a nuclear collision, then go nuclear on "multiplicity" variable...
749 //---> Warning: Experimental
750 if(fkIsNuclear == kTRUE){
751 AliCentrality* centrality;
752 centrality = lESDevent->GetCentrality();
753 lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile( fCentralityEstimator.Data() ) ) );
754 lMultiplicityV0A = ( ( Int_t ) ( centrality->GetCentralityPercentile( "V0A" ) ) );
755 lMultiplicityZNA = ( ( Int_t ) ( centrality->GetCentralityPercentile( "ZNA" ) ) );
756 lMultiplicityTRK = ( ( Int_t ) ( centrality->GetCentralityPercentile( "TRK" ) ) );
757 lMultiplicitySPD = ( ( Int_t ) ( centrality->GetCentralityPercentile( "CL1" ) ) );
758 if (centrality->GetQuality()>1) {
759 PostData(1, fListHist);
760 PostData(2, fTreeCascade);
765 //Set variable for filling tree afterwards!
766 //---> pp case......: GetReferenceMultiplicity
767 //---> Pb-Pb case...: Centrality by V0M
769 fTreeCascVarMultiplicity = lMultiplicity;
770 fTreeCascVarMultiplicityV0A = lMultiplicityV0A;
771 fTreeCascVarMultiplicityZNA = lMultiplicityZNA;
772 fTreeCascVarMultiplicityTRK = lMultiplicityTRK;
773 fTreeCascVarMultiplicitySPD = lMultiplicitySPD;
775 fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
776 fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
777 fHistMultiplicityV0ABeforeTrigSel->Fill ( lMultiplicityV0A );
778 fHistMultiplicityZNABeforeTrigSel->Fill ( lMultiplicityZNA );
779 fHistMultiplicityTRKBeforeTrigSel->Fill ( lMultiplicityTRK );
780 fHistMultiplicitySPDBeforeTrigSel->Fill ( lMultiplicitySPD );
782 //------------------------------------------------
784 //------------------------------------------------
786 UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
787 Bool_t isSelected = 0;
788 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
790 //pA triggering: CINT7
791 if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
793 //Standard Min-Bias Selection
794 if ( ! isSelected ) {
795 PostData(1, fListHist);
796 PostData(2, fTreeCascade);
800 //------------------------------------------------
801 // Rerun cascade vertexer!
802 //------------------------------------------------
804 lESDevent->ResetCascades();
805 lESDevent->ResetV0s();
807 AliV0vertexer lV0vtxer;
808 AliCascadeVertexer lCascVtxer;
810 lV0vtxer.SetDefaultCuts(fV0Sels);
811 lCascVtxer.SetDefaultCuts(fCascSels);
813 lV0vtxer.Tracks2V0vertices(lESDevent);
814 lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
816 //------------------------------------------------
817 // After Trigger Selection
818 //------------------------------------------------
820 lNumberOfV0s = lESDevent->GetNumberOfV0s();
822 //Set variable for filling tree afterwards!
823 fHistV0MultiplicityForTrigEvt->Fill(lNumberOfV0s);
824 fHistMultiplicityForTrigEvt->Fill ( lMultiplicity );
825 fHistMultiplicityV0AForTrigEvt ->Fill( lMultiplicityV0A );
826 fHistMultiplicityZNAForTrigEvt ->Fill( lMultiplicityZNA );
827 fHistMultiplicityTRKForTrigEvt ->Fill( lMultiplicityTRK );
828 fHistMultiplicitySPDForTrigEvt ->Fill( lMultiplicitySPD );
830 //------------------------------------------------
831 // Getting: Primary Vertex + MagField Info
832 //------------------------------------------------
834 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
835 // get the vtx stored in ESD found with tracks
836 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
838 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
839 // get the best primary vertex available for the event
840 // As done in AliCascadeVertexer, we keep the one which is the best one available.
841 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
842 // This one will be used for next calculations (DCA essentially)
843 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
845 Double_t lPrimaryVtxPosition[3];
846 const AliVVertex *primaryVtx = lESDevent->GetPrimaryVertex();
847 lPrimaryVtxPosition[0] = primaryVtx->GetX();
848 lPrimaryVtxPosition[1] = primaryVtx->GetY();
849 lPrimaryVtxPosition[2] = primaryVtx->GetZ();
850 fHistPVx->Fill( lPrimaryVtxPosition[0] );
851 fHistPVy->Fill( lPrimaryVtxPosition[1] );
852 fHistPVz->Fill( lPrimaryVtxPosition[2] );
854 //------------------------------------------------
855 // Primary Vertex Requirements Section:
856 // ---> pp and PbPb: Only requires |z|<10cm
857 // ---> pPb: all requirements checked at this stage
858 //------------------------------------------------
860 //Roberto's PV selection criteria, implemented 17th April 2013
862 /* vertex selection */
863 Bool_t fHasVertex = kFALSE;
865 const AliESDVertex *vertex = lESDevent->GetPrimaryVertexTracks();
866 if (vertex->GetNContributors() < 1) {
867 vertex = lESDevent->GetPrimaryVertexSPD();
868 if (vertex->GetNContributors() < 1) fHasVertex = kFALSE;
869 else fHasVertex = kTRUE;
870 TString vtxTyp = vertex->GetTitle();
872 vertex->GetCovarianceMatrix(cov);
873 Double_t zRes = TMath::Sqrt(cov[5]);
874 if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) fHasVertex = kFALSE;
876 else fHasVertex = kTRUE;
878 //Is First event in chunk rejection: Still present!
879 if(fkpAVertexSelection==kTRUE && fHasVertex == kFALSE) {
880 AliWarning("Pb / | PV does not satisfy selection criteria!");
881 PostData(1, fListHist);
882 PostData(2, fTreeCascade);
886 //Is First event in chunk rejection: Still present!
887 if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
888 AliWarning("Pb / | This is the first event in the chunk!");
889 PostData(1, fListHist);
890 PostData(2, fTreeCascade);
894 //17 April Fix: Always do primary vertex Z selection, after pA vertex selection from Roberto
895 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0) {
896 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
897 PostData(1, fListHist);
898 PostData(2, fTreeCascade);
903 lMagneticField = lESDevent->GetMagneticField( );
904 fHistV0MultiplicityForSelEvt ->Fill( lNumberOfV0s );
905 fHistMultiplicity->Fill(lMultiplicity);
906 fHistMultiplicityV0A->Fill(lMultiplicityV0A);
907 fHistMultiplicityZNA->Fill(lMultiplicityZNA);
908 fHistMultiplicityTRK->Fill(lMultiplicityTRK);
909 fHistMultiplicitySPD->Fill(lMultiplicitySPD);
911 //------------------------------------------------
912 // SKIP: Events with well-established PVtx
913 //------------------------------------------------
915 const AliESDVertex *lPrimaryTrackingESDVtxCheck = lESDevent->GetPrimaryVertexTracks();
916 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
917 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() && fkpAVertexSelection==kFALSE ){
918 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
919 PostData(1, fListHist);
920 PostData(2, fTreeCascade);
923 fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( lNumberOfV0s );
924 fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
925 fHistMultiplicityV0ANoTPCOnly->Fill(lMultiplicityV0A);
926 fHistMultiplicityZNANoTPCOnly->Fill(lMultiplicityZNA);
927 fHistMultiplicityTRKNoTPCOnly->Fill(lMultiplicityTRK);
928 fHistMultiplicitySPDNoTPCOnly->Fill(lMultiplicitySPD);
930 //------------------------------------------------
931 // Pileup Rejection Studies
932 //------------------------------------------------
934 // FIXME : quality selection regarding pile-up rejection
935 if(lESDevent->IsPileupFromSPD() && !fkIsNuclear ){// 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
936 AliWarning("Pb / This is tagged as Pileup from SPD... return !");
937 PostData(1, fListHist);
938 PostData(2, fTreeCascade);
941 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( lNumberOfV0s );
942 fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
943 fHistMultiplicityV0ANoTPCOnlyNoPileup->Fill(lMultiplicityV0A);
944 fHistMultiplicityZNANoTPCOnlyNoPileup->Fill(lMultiplicityZNA);
945 fHistMultiplicityTRKNoTPCOnlyNoPileup->Fill(lMultiplicityTRK);
946 fHistMultiplicitySPDNoTPCOnlyNoPileup->Fill(lMultiplicitySPD);
948 //Do control histograms without the IsFromVertexerZ events, but consider them in analysis...
949 if( ! (lESDevent->GetPrimaryVertex()->IsFromVertexerZ() ) ){
950 fHistPVxAnalysis->Fill( lPrimaryVtxPosition[0] );
951 fHistPVyAnalysis->Fill( lPrimaryVtxPosition[1] );
952 fHistPVzAnalysis->Fill( lPrimaryVtxPosition[2] );
955 //------------------------------------------------
956 // MAIN CASCADE LOOP STARTS HERE
957 //------------------------------------------------
958 // Code Credit: Antonin Maire (thanks^100)
959 // ---> This is an adaptation
961 Long_t ncascades = 0;
962 ncascades = lESDevent->GetNumberOfCascades();
964 for (Int_t iXi = 0; iXi < ncascades; iXi++){
965 //------------------------------------------------
967 //------------------------------------------------
968 //Double_t lTrkgPrimaryVtxRadius3D = -500.0;
969 //Double_t lBestPrimaryVtxRadius3D = -500.0;
971 // - 1st part of initialisation : variables needed to store AliESDCascade data members
972 Double_t lEffMassXi = 0. ;
973 //Double_t lChi2Xi = -1. ;
974 Double_t lDcaXiDaughters = -1. ;
975 Double_t lXiCosineOfPointingAngle = -1. ;
976 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
977 Double_t lXiRadius = -1000. ;
979 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
980 Int_t lPosTPCClusters = -1; // For ESD only ...//FIXME : wait for availability in AOD
981 Int_t lNegTPCClusters = -1; // For ESD only ...
982 Int_t lBachTPCClusters = -1; // For ESD only ...
984 // - 3rd part of initialisation : about V0 part in cascades
985 Double_t lInvMassLambdaAsCascDghter = 0.;
986 //Double_t lV0Chi2Xi = -1. ;
987 Double_t lDcaV0DaughtersXi = -1.;
989 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
990 Double_t lDcaPosToPrimVertexXi = -1.;
991 Double_t lDcaNegToPrimVertexXi = -1.;
992 Double_t lV0CosineOfPointingAngleXi = -1. ;
993 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
994 Double_t lV0RadiusXi = -1000.0;
995 Double_t lV0quality = 0.;
997 // - 4th part of initialisation : Effective masses
998 Double_t lInvMassXiMinus = 0.;
999 Double_t lInvMassXiPlus = 0.;
1000 Double_t lInvMassOmegaMinus = 0.;
1001 Double_t lInvMassOmegaPlus = 0.;
1003 // - 6th part of initialisation : extra info for QA
1004 Double_t lXiMomX = 0. , lXiMomY = 0., lXiMomZ = 0.;
1005 Double_t lXiTransvMom = 0. ;
1006 Double_t lXiTransvMomMC= 0. ;
1007 Double_t lXiTotMom = 0. ;
1009 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1010 //Double_t lBachTransvMom = 0.;
1011 //Double_t lBachTotMom = 0.;
1013 fTreeCascVarNegNSigmaPion = -100;
1014 fTreeCascVarNegNSigmaProton = -100;
1015 fTreeCascVarPosNSigmaPion = -100;
1016 fTreeCascVarPosNSigmaProton = -100;
1017 fTreeCascVarBachNSigmaPion = -100;
1018 fTreeCascVarBachNSigmaKaon = -100;
1020 Short_t lChargeXi = -2;
1021 //Double_t lV0toXiCosineOfPointingAngle = 0. ;
1023 Double_t lRapXi = -20.0, lRapOmega = -20.0, lRapMC = -20.0; // lEta = -20.0, lTheta = 360., lPhi = 720. ;
1024 //Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1026 // -------------------------------------
1027 // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1029 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1033 // - II.Step 1 : around primary vertex
1035 //lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1036 // lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1037 // lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1039 //lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1040 // lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1041 // lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1043 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1046 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1048 lEffMassXi = xi->GetEffMassXi();
1049 //lChi2Xi = xi->GetChi2Xi();
1050 lDcaXiDaughters = xi->GetDcaXiDaughters();
1051 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1052 lBestPrimaryVtxPos[1],
1053 lBestPrimaryVtxPos[2] );
1054 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1056 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1057 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1059 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1060 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1063 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1064 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1065 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1066 // Care track label can be negative in MC production (linked with the track quality)
1067 // However = normally, not the case for track index ...
1069 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1070 if(lBachIdx == lIdxNegXi) {
1071 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1073 if(lBachIdx == lIdxPosXi) {
1074 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1077 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1078 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1079 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1081 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1082 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1086 fTreeCascVarPosEta = pTrackXi->Eta();
1087 fTreeCascVarNegEta = nTrackXi->Eta();
1088 fTreeCascVarBachEta = bachTrackXi->Eta();
1090 //------------------------------------------------
1091 // TPC dEdx information
1092 //------------------------------------------------
1093 fTreeCascVarNegNSigmaPion = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kPion );
1094 fTreeCascVarNegNSigmaProton = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kProton );
1095 fTreeCascVarPosNSigmaPion = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kPion );
1096 fTreeCascVarPosNSigmaProton = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kProton );
1097 fTreeCascVarBachNSigmaPion = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kPion );
1098 fTreeCascVarBachNSigmaKaon = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kKaon );
1100 //------------------------------------------------
1101 // TPC Number of clusters info
1102 // --- modified to save the smallest number
1103 // --- of TPC clusters for the 3 tracks
1104 //------------------------------------------------
1106 lPosTPCClusters = pTrackXi->GetTPCNcls();
1107 lNegTPCClusters = nTrackXi->GetTPCNcls();
1108 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1110 // 1 - Poor quality related to TPCrefit
1111 ULong_t pStatus = pTrackXi->GetStatus();
1112 ULong_t nStatus = nTrackXi->GetStatus();
1113 ULong_t bachStatus = bachTrackXi->GetStatus();
1114 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1115 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1116 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1117 // 2 - Poor quality related to TPC clusters: lowest cut of 70 clusters
1118 if(lPosTPCClusters < 70) { AliWarning("Pb / V0 Pos. track has less than 70 TPC clusters ... continue!"); continue; }
1119 if(lNegTPCClusters < 70) { AliWarning("Pb / V0 Neg. track has less than 70 TPC clusters ... continue!"); continue; }
1120 if(lBachTPCClusters < 70) { AliWarning("Pb / Bach. track has less than 70 TPC clusters ... continue!"); continue; }
1121 Int_t leastnumberofclusters = 1000;
1122 if( lPosTPCClusters < leastnumberofclusters ) leastnumberofclusters = lPosTPCClusters;
1123 if( lNegTPCClusters < leastnumberofclusters ) leastnumberofclusters = lNegTPCClusters;
1124 if( lBachTPCClusters < leastnumberofclusters ) leastnumberofclusters = lBachTPCClusters;
1126 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1127 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1128 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1129 //lV0Chi2Xi = xi->GetChi2V0();
1131 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1132 lBestPrimaryVtxPos[1],
1133 lBestPrimaryVtxPos[2] );
1135 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1136 lBestPrimaryVtxPos[1],
1137 lBestPrimaryVtxPos[2] );
1139 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1140 lBestPrimaryVtxPos[1],
1142 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1144 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1145 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1147 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1148 lBestPrimaryVtxPos[1],
1151 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1152 lBestPrimaryVtxPos[1],
1155 // - II.Step 4 : around effective masses (ESD)
1156 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1158 if( bachTrackXi->Charge() < 0 ) {
1160 xi->ChangeMassHypothesis(lV0quality , 3312);
1161 // Calculate the effective mass of the Xi- candidate.
1162 // pdg code 3312 = Xi-
1163 lInvMassXiMinus = xi->GetEffMassXi();
1166 xi->ChangeMassHypothesis(lV0quality , 3334);
1167 // Calculate the effective mass of the Xi- candidate.
1168 // pdg code 3334 = Omega-
1169 lInvMassOmegaMinus = xi->GetEffMassXi();
1172 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1173 }// end if negative bachelor
1176 if( bachTrackXi->Charge() > 0 ){
1178 xi->ChangeMassHypothesis(lV0quality , -3312);
1179 // Calculate the effective mass of the Xi+ candidate.
1180 // pdg code -3312 = Xi+
1181 lInvMassXiPlus = xi->GetEffMassXi();
1184 xi->ChangeMassHypothesis(lV0quality , -3334);
1185 // Calculate the effective mass of the Xi+ candidate.
1186 // pdg code -3334 = Omega+
1187 lInvMassOmegaPlus = xi->GetEffMassXi();
1190 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1191 }// end if positive bachelor
1192 // - II.Step 6 : extra info for QA (ESD)
1193 // miscellaneous pieces of info that may help regarding data quality assessment.
1196 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1197 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1198 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1200 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1201 //lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1202 //lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1204 lChargeXi = xi->Charge();
1206 //lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1208 lRapXi = xi->RapXi();
1209 lRapOmega = xi->RapOmega();
1211 //lTheta = xi->Theta() *180.0/TMath::Pi();
1212 //lPhi = xi->Phi() *180.0/TMath::Pi();
1213 //lAlphaXi = xi->AlphaXi();
1214 //lPtArmXi = xi->PtArmXi();
1216 //------------------------------------------------
1217 // Set Variables for adding to tree
1218 //------------------------------------------------
1220 /* 1*/ fTreeCascVarCharge = lChargeXi;
1221 /* 2*/ if(lInvMassXiMinus!=0) fTreeCascVarMassAsXi = lInvMassXiMinus;
1222 /* 2*/ if(lInvMassXiPlus!=0) fTreeCascVarMassAsXi = lInvMassXiPlus;
1223 /* 3*/ if(lInvMassOmegaMinus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaMinus;
1224 /* 3*/ if(lInvMassOmegaPlus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaPlus;
1225 /* 4*/ fTreeCascVarPt = lXiTransvMom;
1226 /* 4*/ fTreeCascVarPtMC = lXiTransvMomMC;
1227 /* 5*/ fTreeCascVarRapXi = lRapXi ;
1228 /* 5*/ fTreeCascVarRapMC = lRapMC ;
1229 /* 6*/ fTreeCascVarRapOmega = lRapOmega ;
1230 /* 7*/ fTreeCascVarDCACascDaughters = lDcaXiDaughters;
1231 /* 8*/ fTreeCascVarDCABachToPrimVtx = lDcaBachToPrimVertexXi;
1232 /* 9*/ fTreeCascVarDCAV0Daughters = lDcaV0DaughtersXi;
1233 /*10*/ fTreeCascVarDCAV0ToPrimVtx = lDcaV0ToPrimVertexXi;
1234 /*11*/ fTreeCascVarDCAPosToPrimVtx = lDcaPosToPrimVertexXi;
1235 /*12*/ fTreeCascVarDCANegToPrimVtx = lDcaNegToPrimVertexXi;
1236 /*13*/ fTreeCascVarCascCosPointingAngle = lXiCosineOfPointingAngle;
1237 /*14*/ fTreeCascVarCascRadius = lXiRadius;
1238 /*15*/ fTreeCascVarV0Mass = lInvMassLambdaAsCascDghter;
1239 /*16*/ fTreeCascVarV0CosPointingAngle = lV0CosineOfPointingAngleXi;
1240 /*17*/ fTreeCascVarV0Radius = lV0RadiusXi;
1241 /*20*/ fTreeCascVarLeastNbrClusters = leastnumberofclusters;
1242 /*21*/ fTreeCascVarMultiplicity = lMultiplicity; //multiplicity, whatever that may be
1244 /*23*/ fTreeCascVarDistOverTotMom = TMath::Sqrt(
1245 TMath::Power( lPosXi[0] - lBestPrimaryVtxPos[0] , 2) +
1246 TMath::Power( lPosXi[1] - lBestPrimaryVtxPos[1] , 2) +
1247 TMath::Power( lPosXi[2] - lBestPrimaryVtxPos[2] , 2)
1249 /*23*/ fTreeCascVarDistOverTotMom /= (lXiTotMom+1e-13);
1251 //All vars not specified here: specified elsewhere!
1253 //------------------------------------------------
1255 //------------------------------------------------
1257 // The conditional is meant to decrease excessive
1258 // memory usage! Be careful when loosening the
1261 //Xi Mass window: 150MeV wide
1262 //Omega mass window: 150MeV wide
1264 if( (fTreeCascVarMassAsXi<1.32+0.075&&fTreeCascVarMassAsXi>1.32-0.075) ||
1265 (fTreeCascVarMassAsOmega<1.68+0.075&&fTreeCascVarMassAsOmega>1.68-0.075) ){
1266 fTreeCascade->Fill();
1269 //------------------------------------------------
1271 //------------------------------------------------
1273 }// end of the Cascade loop (ESD or AOD)
1275 // Post output data.
1276 PostData(1, fListHist);
1277 PostData(2, fTreeCascade);
1280 //________________________________________________________________________
1281 void AliAnalysisTaskExtractCascade::Terminate(Option_t *)
1283 // Draw result to the screen
1284 // Called once at the end of the query
1286 TList *cRetrievedList = 0x0;
1287 cRetrievedList = (TList*)GetOutputData(1);
1288 if(!cRetrievedList){
1289 Printf("ERROR - AliAnalysisTaskExtractCascade : ouput data container list not available\n");
1293 fHistV0MultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistV0MultiplicityForTrigEvt") );
1294 if (!fHistV0MultiplicityForTrigEvt) {
1295 Printf("ERROR - AliAnalysisTaskExtractCascade : fHistV0MultiplicityForTrigEvt not available");
1299 TCanvas *canCheck = new TCanvas("AliAnalysisTaskExtractCascade","V0 Multiplicity",10,10,510,510);
1300 canCheck->cd(1)->SetLogy();
1302 fHistV0MultiplicityForTrigEvt->SetMarkerStyle(22);
1303 fHistV0MultiplicityForTrigEvt->DrawCopy("E");
1306 //----------------------------------------------------------------------------
1308 Double_t AliAnalysisTaskExtractCascade::MyRapidity(Double_t rE, Double_t rPz) const
1310 // Local calculation for rapidity
1311 Double_t ReturnValue = -100;
1312 if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){
1313 ReturnValue = 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));