]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/STRANGENESS/Cascades/AliAnalysisTaskExtractCascade.cxx
Add 3D position info for casc, V0 decays - debugging
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / Cascades / AliAnalysisTaskExtractCascade.cxx
CommitLineData
76029adc 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17//
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.
22//
76029adc 23//
24// --- Algorithm Description
25// 1. Loop over primaries in stack to acquire generated charged Xi
9a8f3aee 26// 2. Loop over stack to find Cascades, fill TH3Fs "PrimRawPt"s for Efficiency
76029adc 27// 3. Perform Physics Selection
28// 4. Perform Primary Vertex |z|<10cm selection
9a8f3aee 29// 5. Perform Primary Vertex NoTPCOnly vertexing selection
76029adc 30// 6. Perform Pileup Rejection
31// 7. Analysis Loops:
32// 7a. Fill TH3Fs "PrimAnalysisPt" for control purposes only
76029adc 33//
34// Please Report Any Bugs!
35//
36// --- David Dobrigkeit Chinellato
37// (david.chinellato@gmail.com)
38//
39// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40
41class TTree;
42class TParticle;
43class TVector3;
44
45//class AliMCEventHandler;
46//class AliMCEvent;
47//class AliStack;
48
49class AliESDVertex;
50class AliAODVertex;
51class AliESDv0;
52class AliAODv0;
53
54#include <Riostream.h>
55#include "TList.h"
56#include "TH1.h"
57#include "TH2.h"
58#include "TH3.h"
59#include "TFile.h"
60#include "THnSparse.h"
61#include "TVector3.h"
62#include "TCanvas.h"
63#include "TMath.h"
64#include "TLegend.h"
65#include "AliLog.h"
66
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"
78#include "AliStack.h"
79
d8841e95 80#include "AliV0vertexer.h"
81#include "AliCascadeVertexer.h"
82
76029adc 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"
2add50c1 90#include "AliAnalysisUtils.h"
76029adc 91
92#include "AliAnalysisTaskExtractCascade.h"
93
94using std::cout;
95using std::endl;
96
97ClassImp(AliAnalysisTaskExtractCascade)
98
99AliAnalysisTaskExtractCascade::AliAnalysisTaskExtractCascade()
2add50c1 100 : AliAnalysisTaskSE(), fListHist(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
76029adc 101 fkIsNuclear ( kFALSE ),
2213f6fc 102 fkSwitchINT7 ( kFALSE ),
da3539d8 103 fCentralityEstimator("V0M"),
2add50c1 104 fkpAVertexSelection( kFALSE ),
cda235e2 105 fEtaRefMult ( 0.5 ),
38927449 106 fkRunVertexers ( kFALSE ),
3eb670b7 107 fkDebugMode (kTRUE),
2213f6fc 108//------------------------------------------------
109// Tree Variables
110//------------------------------------------------
111
112 fTreeCascVarCharge(0),
113 fTreeCascVarMassAsXi(0),
114 fTreeCascVarMassAsOmega(0),
115 fTreeCascVarPt(0),
116 fTreeCascVarPtMC(0),
117 fTreeCascVarRapMC(0),
118 fTreeCascVarRapXi(0),
119 fTreeCascVarRapOmega(0),
120 fTreeCascVarNegEta(0),
121 fTreeCascVarPosEta(0),
122 fTreeCascVarBachEta(0),
123 fTreeCascVarDCACascDaughters(0),
124 fTreeCascVarDCABachToPrimVtx(0),
125 fTreeCascVarDCAV0Daughters(0),
126 fTreeCascVarDCAV0ToPrimVtx(0),
127 fTreeCascVarDCAPosToPrimVtx(0),
128 fTreeCascVarDCANegToPrimVtx(0),
129 fTreeCascVarCascCosPointingAngle(0),
130 fTreeCascVarCascRadius(0),
131 fTreeCascVarV0Mass(0),
132 fTreeCascVarV0CosPointingAngle(0),
571c9e48 133 fTreeCascVarV0CosPointingAngleSpecial(0),
2213f6fc 134 fTreeCascVarV0Radius(0),
135 fTreeCascVarLeastNbrClusters(0),
136 fTreeCascVarMultiplicity(0),
5d43de53 137 fTreeCascVarMultiplicityV0A(0),
138 fTreeCascVarMultiplicityZNA(0),
139 fTreeCascVarMultiplicityTRK(0),
140 fTreeCascVarMultiplicitySPD(0),
2213f6fc 141 fTreeCascVarDistOverTotMom(0),
142 fTreeCascVarPID(0),
143 fTreeCascVarPIDBachelor(0),
144 fTreeCascVarPIDNegative(0),
145 fTreeCascVarPIDPositive(0),
19e2af54 146 fTreeCascVarBachTransMom(0),
2213f6fc 147 fTreeCascVarPosTransMom(0),
148 fTreeCascVarNegTransMom(0),
149 fTreeCascVarPosTransMomMC(0),
150 fTreeCascVarNegTransMomMC(0),
151 fTreeCascVarNegNSigmaPion(0),
152 fTreeCascVarNegNSigmaProton(0),
153 fTreeCascVarPosNSigmaPion(0),
154 fTreeCascVarPosNSigmaProton(0),
155 fTreeCascVarBachNSigmaPion(0),
156 fTreeCascVarBachNSigmaKaon(0),
76029adc 157
9cf85007 158 fTreeCascVarkITSRefitBachelor(0),
159 fTreeCascVarkITSRefitNegative(0),
160 fTreeCascVarkITSRefitPositive(0),
161
d55fa19c 162//Debug information
163//Part A: EbyE info, Run number
164fTreeCascVarRunNumber(0),
165fTreeCascVarEventNumber(0),
166
167//Part B: Shared Clusters
168fTreeCascVarNegSharedClusters(0),
169fTreeCascVarPosSharedClusters(0),
170fTreeCascVarBachSharedClusters(0),
171
172//Part C: All momenta
173fTreeCascVarNegPx(0),
174fTreeCascVarNegPy(0),
175fTreeCascVarNegPz(0),
176fTreeCascVarPosPx(0),
177fTreeCascVarPosPy(0),
178fTreeCascVarPosPz(0),
179fTreeCascVarBachPx(0),
180fTreeCascVarBachPy(0),
181fTreeCascVarBachPz(0),
182
3eb670b7 183fTreeCascVarV0DecayX(0),
184fTreeCascVarV0DecayY(0),
185fTreeCascVarV0DecayZ(0),
186
187fTreeCascVarCascadeDecayX(0),
188fTreeCascVarCascadeDecayY(0),
189fTreeCascVarCascadeDecayZ(0),
190
76029adc 191//------------------------------------------------
192// HISTOGRAMS
193// --- Filled on an Event-by-event basis
194//------------------------------------------------
195 fHistV0MultiplicityBeforeTrigSel(0),
196 fHistV0MultiplicityForTrigEvt(0),
197 fHistV0MultiplicityForSelEvt(0),
198 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
199 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
200 fHistMultiplicityBeforeTrigSel(0),
201 fHistMultiplicityForTrigEvt(0),
202 fHistMultiplicity(0),
203 fHistMultiplicityNoTPCOnly(0),
204 fHistMultiplicityNoTPCOnlyNoPileup(0),
5d43de53 205
206//V0A Centrality
207fHistMultiplicityV0ABeforeTrigSel(0),
208fHistMultiplicityV0AForTrigEvt(0),
209fHistMultiplicityV0A(0),
210fHistMultiplicityV0ANoTPCOnly(0),
211fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
212
213//ZNA Centrality
214fHistMultiplicityZNABeforeTrigSel(0),
215fHistMultiplicityZNAForTrigEvt(0),
216fHistMultiplicityZNA(0),
217fHistMultiplicityZNANoTPCOnly(0),
218fHistMultiplicityZNANoTPCOnlyNoPileup(0),
219
220//TRK Centrality
221fHistMultiplicityTRKBeforeTrigSel(0),
222fHistMultiplicityTRKForTrigEvt(0),
223fHistMultiplicityTRK(0),
224fHistMultiplicityTRKNoTPCOnly(0),
225fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
226
227//SPD Centrality
228fHistMultiplicitySPDBeforeTrigSel(0),
229fHistMultiplicitySPDForTrigEvt(0),
230fHistMultiplicitySPD(0),
231fHistMultiplicitySPDNoTPCOnly(0),
232fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
233
76029adc 234 fHistPVx(0),
235 fHistPVy(0),
236 fHistPVz(0),
237 fHistPVxAnalysis(0),
238 fHistPVyAnalysis(0),
239 fHistPVzAnalysis(0)
240{
241 // Dummy Constructor
242}
243
244AliAnalysisTaskExtractCascade::AliAnalysisTaskExtractCascade(const char *name)
2add50c1 245 : AliAnalysisTaskSE(name), fListHist(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
76029adc 246 fkIsNuclear ( kFALSE ),
2213f6fc 247 fkSwitchINT7 ( kFALSE ),
2add50c1 248 fCentralityEstimator("V0M"),
249 fkpAVertexSelection( kFALSE ),
cda235e2 250 fEtaRefMult ( 0.5 ),
38927449 251 fkRunVertexers ( kFALSE ),
3eb670b7 252 fkDebugMode (kTRUE),
2213f6fc 253//------------------------------------------------
254// Tree Variables
255//------------------------------------------------
256
257 fTreeCascVarCharge(0),
258 fTreeCascVarMassAsXi(0),
259 fTreeCascVarMassAsOmega(0),
260 fTreeCascVarPt(0),
261 fTreeCascVarPtMC(0),
262 fTreeCascVarRapMC(0),
263 fTreeCascVarRapXi(0),
264 fTreeCascVarRapOmega(0),
265 fTreeCascVarNegEta(0),
266 fTreeCascVarPosEta(0),
267 fTreeCascVarBachEta(0),
268 fTreeCascVarDCACascDaughters(0),
269 fTreeCascVarDCABachToPrimVtx(0),
270 fTreeCascVarDCAV0Daughters(0),
271 fTreeCascVarDCAV0ToPrimVtx(0),
272 fTreeCascVarDCAPosToPrimVtx(0),
273 fTreeCascVarDCANegToPrimVtx(0),
274 fTreeCascVarCascCosPointingAngle(0),
275 fTreeCascVarCascRadius(0),
276 fTreeCascVarV0Mass(0),
277 fTreeCascVarV0CosPointingAngle(0),
571c9e48 278 fTreeCascVarV0CosPointingAngleSpecial(0),
2213f6fc 279 fTreeCascVarV0Radius(0),
280 fTreeCascVarLeastNbrClusters(0),
281 fTreeCascVarMultiplicity(0),
5d43de53 282 fTreeCascVarMultiplicityV0A(0),
283 fTreeCascVarMultiplicityZNA(0),
284 fTreeCascVarMultiplicityTRK(0),
285 fTreeCascVarMultiplicitySPD(0),
2213f6fc 286 fTreeCascVarDistOverTotMom(0),
287 fTreeCascVarPID(0),
288 fTreeCascVarPIDBachelor(0),
289 fTreeCascVarPIDNegative(0),
290 fTreeCascVarPIDPositive(0),
19e2af54 291 fTreeCascVarBachTransMom(0),
2213f6fc 292 fTreeCascVarPosTransMom(0),
293 fTreeCascVarNegTransMom(0),
294 fTreeCascVarPosTransMomMC(0),
295 fTreeCascVarNegTransMomMC(0),
296 fTreeCascVarNegNSigmaPion(0),
297 fTreeCascVarNegNSigmaProton(0),
298 fTreeCascVarPosNSigmaPion(0),
299 fTreeCascVarPosNSigmaProton(0),
300 fTreeCascVarBachNSigmaPion(0),
301 fTreeCascVarBachNSigmaKaon(0),
302
9cf85007 303 fTreeCascVarkITSRefitBachelor(0),
304 fTreeCascVarkITSRefitNegative(0),
305 fTreeCascVarkITSRefitPositive(0),
306
d55fa19c 307 //Debug information
308 //Part A: EbyE info, Run number
309 fTreeCascVarRunNumber(0),
310 fTreeCascVarEventNumber(0),
311
312 //Part B: Shared Clusters
313 fTreeCascVarNegSharedClusters(0),
314 fTreeCascVarPosSharedClusters(0),
315 fTreeCascVarBachSharedClusters(0),
316
317 //Part C: All momenta
318 fTreeCascVarNegPx(0),
319 fTreeCascVarNegPy(0),
320 fTreeCascVarNegPz(0),
321 fTreeCascVarPosPx(0),
322 fTreeCascVarPosPy(0),
323 fTreeCascVarPosPz(0),
324 fTreeCascVarBachPx(0),
325 fTreeCascVarBachPy(0),
326 fTreeCascVarBachPz(0),
327
3eb670b7 328 fTreeCascVarV0DecayX(0),
329 fTreeCascVarV0DecayY(0),
330 fTreeCascVarV0DecayZ(0),
331
332 fTreeCascVarCascadeDecayX(0),
333 fTreeCascVarCascadeDecayY(0),
334 fTreeCascVarCascadeDecayZ(0),
335
336
76029adc 337//------------------------------------------------
338// HISTOGRAMS
339// --- Filled on an Event-by-event basis
340//------------------------------------------------
341 fHistV0MultiplicityBeforeTrigSel(0),
342 fHistV0MultiplicityForTrigEvt(0),
343 fHistV0MultiplicityForSelEvt(0),
344 fHistV0MultiplicityForSelEvtNoTPCOnly(0),
345 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
346 fHistMultiplicityBeforeTrigSel(0),
347 fHistMultiplicityForTrigEvt(0),
348 fHistMultiplicity(0),
349 fHistMultiplicityNoTPCOnly(0),
350 fHistMultiplicityNoTPCOnlyNoPileup(0),
5d43de53 351
352//V0A Centrality
353fHistMultiplicityV0ABeforeTrigSel(0),
354fHistMultiplicityV0AForTrigEvt(0),
355fHistMultiplicityV0A(0),
356fHistMultiplicityV0ANoTPCOnly(0),
357fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
358
359//ZNA Centrality
360fHistMultiplicityZNABeforeTrigSel(0),
361fHistMultiplicityZNAForTrigEvt(0),
362fHistMultiplicityZNA(0),
363fHistMultiplicityZNANoTPCOnly(0),
364fHistMultiplicityZNANoTPCOnlyNoPileup(0),
365
366//TRK Centrality
367fHistMultiplicityTRKBeforeTrigSel(0),
368fHistMultiplicityTRKForTrigEvt(0),
369fHistMultiplicityTRK(0),
370fHistMultiplicityTRKNoTPCOnly(0),
371fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
372
373//SPD Centrality
374fHistMultiplicitySPDBeforeTrigSel(0),
375fHistMultiplicitySPDForTrigEvt(0),
376fHistMultiplicitySPD(0),
377fHistMultiplicitySPDNoTPCOnly(0),
378fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
379
76029adc 380 fHistPVx(0),
381 fHistPVy(0),
382 fHistPVz(0),
383 fHistPVxAnalysis(0),
384 fHistPVyAnalysis(0),
385 fHistPVzAnalysis(0)
386{
387 // Constructor
d8841e95 388
389 //Set Variables for re-running the cascade vertexers (as done for MS paper)
390
391 // New Loose : 1st step for the 7 TeV pp analysis
d8841e95 392
38927449 393 fV0VertexerSels[0] = 33. ; // max allowed chi2
394 fV0VertexerSels[1] = 0.02; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
395 fV0VertexerSels[2] = 0.02; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
396 fV0VertexerSels[3] = 2.0 ; // max allowed DCA between the daughter tracks (LHC09a4 : 0.5)
397 fV0VertexerSels[4] = 0.95; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
398 fV0VertexerSels[5] = 1.0 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
399 fV0VertexerSels[6] = 200. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
400
401 fCascadeVertexerSels[0] = 33. ; // max allowed chi2 (same as PDC07)
402 fCascadeVertexerSels[1] = 0.05 ; // min allowed V0 impact parameter (PDC07 : 0.05 / LHC09a4 : 0.025 )
403 fCascadeVertexerSels[2] = 0.010; // "window" around the Lambda mass (PDC07 : 0.008 / LHC09a4 : 0.010 )
404 fCascadeVertexerSels[3] = 0.03 ; // min allowed bachelor's impact parameter (PDC07 : 0.035 / LHC09a4 : 0.025 )
405 fCascadeVertexerSels[4] = 2.0 ; // max allowed DCA between the V0 and the bachelor (PDC07 : 0.1 / LHC09a4 : 0.2 )
406 fCascadeVertexerSels[5] = 0.95 ; // min allowed cosine of the cascade pointing angle (PDC07 : 0.9985 / LHC09a4 : 0.998 )
407 fCascadeVertexerSels[6] = 0.4 ; // min radius of the fiducial volume (PDC07 : 0.9 / LHC09a4 : 0.2 )
408 fCascadeVertexerSels[7] = 100. ; // max radius of the fiducial volume (PDC07 : 100 / LHC09a4 : 100 )
409
76029adc 410 // Output slot #0 writes into a TList container (Cascade)
411 DefineOutput(1, TList::Class());
412 DefineOutput(2, TTree::Class());
413}
414
415
416AliAnalysisTaskExtractCascade::~AliAnalysisTaskExtractCascade()
417{
418//------------------------------------------------
419// DESTRUCTOR
420//------------------------------------------------
421
422 if (fListHist){
423 delete fListHist;
424 fListHist = 0x0;
425 }
426 if (fTreeCascade){
427 delete fTreeCascade;
428 fTreeCascade = 0x0;
429 }
430 //cleanup esd track cuts object too...
431 if (fESDtrackCuts){
432 delete fESDtrackCuts;
433 fESDtrackCuts = 0x0;
434 }
2add50c1 435 if (fUtils){
436 delete fUtils;
437 fUtils = 0x0;
438 }
76029adc 439
440}
441
442//________________________________________________________________________
443void AliAnalysisTaskExtractCascade::UserCreateOutputObjects()
444{
445 OpenFile(2);
446 // Called once
447
448//------------------------------------------------
449
450 fTreeCascade = new TTree("fTreeCascade","CascadeCandidates");
451
452//------------------------------------------------
453// fTreeCascade Branch definitions - Cascade Tree
454//------------------------------------------------
455
456//------------------------------------------------
457// fTreeCascade Branch definitions
458//------------------------------------------------
459
460//-----------BASIC-INFO---------------------------
461/* 1*/ fTreeCascade->Branch("fTreeCascVarCharge",&fTreeCascVarCharge,"fTreeCascVarCharge/I");
462/* 2*/ fTreeCascade->Branch("fTreeCascVarMassAsXi",&fTreeCascVarMassAsXi,"fTreeCascVarMassAsXi/F");
463/* 3*/ fTreeCascade->Branch("fTreeCascVarMassAsOmega",&fTreeCascVarMassAsOmega,"fTreeCascVarMassAsOmega/F");
464/* 4*/ fTreeCascade->Branch("fTreeCascVarPt",&fTreeCascVarPt,"fTreeCascVarPt/F");
465/* 5*/ fTreeCascade->Branch("fTreeCascVarRapXi",&fTreeCascVarRapXi,"fTreeCascVarRapXi/F");
466/* 6*/ fTreeCascade->Branch("fTreeCascVarRapOmega",&fTreeCascVarRapOmega,"fTreeCascVarRapOmega/F");
467/* 7*/ fTreeCascade->Branch("fTreeCascVarNegEta",&fTreeCascVarNegEta,"fTreeCascVarNegEta/F");
468/* 8*/ fTreeCascade->Branch("fTreeCascVarPosEta",&fTreeCascVarPosEta,"fTreeCascVarPosEta/F");
469/* 9*/ fTreeCascade->Branch("fTreeCascVarBachEta",&fTreeCascVarBachEta,"fTreeCascVarBachEta/F");
470//-----------INFO-FOR-CUTS------------------------
471/*10*/ fTreeCascade->Branch("fTreeCascVarDCACascDaughters",&fTreeCascVarDCACascDaughters,"fTreeCascVarDCACascDaughters/F");
472/*11*/ fTreeCascade->Branch("fTreeCascVarDCABachToPrimVtx",&fTreeCascVarDCABachToPrimVtx,"fTreeCascVarDCABachToPrimVtx/F");
473/*12*/ fTreeCascade->Branch("fTreeCascVarDCAV0Daughters",&fTreeCascVarDCAV0Daughters,"fTreeCascVarDCAV0Daughters/F");
474/*13*/ fTreeCascade->Branch("fTreeCascVarDCAV0ToPrimVtx",&fTreeCascVarDCAV0ToPrimVtx,"fTreeCascVarDCAV0ToPrimVtx/F");
475/*14*/ fTreeCascade->Branch("fTreeCascVarDCAPosToPrimVtx",&fTreeCascVarDCAPosToPrimVtx,"fTreeCascVarDCAPosToPrimVtx/F");
476/*15*/ fTreeCascade->Branch("fTreeCascVarDCANegToPrimVtx",&fTreeCascVarDCANegToPrimVtx,"fTreeCascVarDCANegToPrimVtx/F");
477/*16*/ fTreeCascade->Branch("fTreeCascVarCascCosPointingAngle",&fTreeCascVarCascCosPointingAngle,"fTreeCascVarCascCosPointingAngle/F");
478/*17*/ fTreeCascade->Branch("fTreeCascVarCascRadius",&fTreeCascVarCascRadius,"fTreeCascVarCascRadius/F");
479/*18*/ fTreeCascade->Branch("fTreeCascVarV0Mass",&fTreeCascVarV0Mass,"fTreeCascVarV0Mass/F");
480/*19*/ fTreeCascade->Branch("fTreeCascVarV0CosPointingAngle",&fTreeCascVarV0CosPointingAngle,"fTreeCascVarV0CosPointingAngle/F");
571c9e48 481/*19*/ fTreeCascade->Branch("fTreeCascVarV0CosPointingAngleSpecial",&fTreeCascVarV0CosPointingAngleSpecial,"fTreeCascVarV0CosPointingAngleSpecial/F");
76029adc 482/*20*/ fTreeCascade->Branch("fTreeCascVarV0Radius",&fTreeCascVarV0Radius,"fTreeCascVarV0Radius/F");
483/*21*/ fTreeCascade->Branch("fTreeCascVarLeastNbrClusters",&fTreeCascVarLeastNbrClusters,"fTreeCascVarLeastNbrClusters/I");
484//-----------MULTIPLICITY-INFO--------------------
485/*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicity",&fTreeCascVarMultiplicity,"fTreeCascVarMultiplicity/I");
5d43de53 486/*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityV0A",&fTreeCascVarMultiplicityV0A,"fTreeCascVarMultiplicityV0A/I");
487/*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityZNA",&fTreeCascVarMultiplicityZNA,"fTreeCascVarMultiplicityZNA/I");
488/*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicityTRK",&fTreeCascVarMultiplicityTRK,"fTreeCascVarMultiplicityTRK/I");
489/*22*/ fTreeCascade->Branch("fTreeCascVarMultiplicitySPD",&fTreeCascVarMultiplicitySPD,"fTreeCascVarMultiplicitySPD/I");
76029adc 490//-----------DECAY-LENGTH-INFO--------------------
491/*23*/ fTreeCascade->Branch("fTreeCascVarDistOverTotMom",&fTreeCascVarDistOverTotMom,"fTreeCascVarDistOverTotMom/F");
492//------------------------------------------------
493/*24*/ fTreeCascade->Branch("fTreeCascVarNegNSigmaPion",&fTreeCascVarNegNSigmaPion,"fTreeCascVarNegNSigmaPion/F");
494/*25*/ fTreeCascade->Branch("fTreeCascVarNegNSigmaProton",&fTreeCascVarNegNSigmaProton,"fTreeCascVarNegNSigmaProton/F");
495/*26*/ fTreeCascade->Branch("fTreeCascVarPosNSigmaPion",&fTreeCascVarPosNSigmaPion,"fTreeCascVarPosNSigmaPion/F");
496/*27*/ fTreeCascade->Branch("fTreeCascVarPosNSigmaProton",&fTreeCascVarPosNSigmaProton,"fTreeCascVarPosNSigmaProton/F");
497/*28*/ fTreeCascade->Branch("fTreeCascVarBachNSigmaPion",&fTreeCascVarBachNSigmaPion,"fTreeCascVarBachNSigmaPion/F");
498/*29*/ fTreeCascade->Branch("fTreeCascVarBachNSigmaKaon",&fTreeCascVarBachNSigmaKaon,"fTreeCascVarBachNSigmaKaon/F");
19e2af54 499
d55fa19c 500 //Commented out: not needed since all momenta provided! (less info)
501/*30*/ //fTreeCascade->Branch("fTreeCascVarBachTransMom",&fTreeCascVarBachTransMom,"fTreeCascVarBachTransMom/F");
502/*30*/ //fTreeCascade->Branch("fTreeCascVarPosTransMom",&fTreeCascVarPosTransMom,"fTreeCascVarPosTransMom/F");
503/*31*/ //fTreeCascade->Branch("fTreeCascVarNegTransMom",&fTreeCascVarNegTransMom,"fTreeCascVarNegTransMom/F");
76029adc 504
ed04e93d 505/*29*/ fTreeCascade->Branch("fTreeCascVarkITSRefitBachelor",&fTreeCascVarkITSRefitBachelor,"fTreeCascVarkITSRefitBachelor/O");
506/*29*/ fTreeCascade->Branch("fTreeCascVarkITSRefitNegative",&fTreeCascVarkITSRefitNegative,"fTreeCascVarkITSRefitNegative/O");
507/*29*/ fTreeCascade->Branch("fTreeCascVarkITSRefitPositive",&fTreeCascVarkITSRefitPositive,"fTreeCascVarkITSRefitPositive/O");
9cf85007 508
d55fa19c 509 //-----------Debugging information----------------
3eb670b7 510
511 if(fkDebugMode){
512 //Only save this if requested - can be turned off
513
514 //Part A: Event-by-event, run-by-run debugging
515 fTreeCascade->Branch("fTreeCascVarRunNumber",&fTreeCascVarRunNumber,"fTreeCascVarRunNumber/I");
516 fTreeCascade->Branch("fTreeCascVarEventNumber",&fTreeCascVarEventNumber,"fTreeCascVarEventNumber/l");
517
518 //Part B: Shared Clusters for all daughter tracks
519 fTreeCascade->Branch("fTreeCascVarNegSharedClusters",&fTreeCascVarNegSharedClusters,"fTreeCascVarNegSharedClusters/I");
520 fTreeCascade->Branch("fTreeCascVarPosSharedClusters",&fTreeCascVarPosSharedClusters,"fTreeCascVarPosSharedClusters/I");
521 fTreeCascade->Branch("fTreeCascVarBachSharedClusters",&fTreeCascVarBachSharedClusters,"fTreeCascVarBachSharedClusters/I");
522
523 //Part C: All Momenta of all daughters
524 fTreeCascade->Branch("fTreeCascVarNegPx",&fTreeCascVarNegPx,"fTreeCascVarNegPx/F");
525 fTreeCascade->Branch("fTreeCascVarNegPy",&fTreeCascVarNegPy,"fTreeCascVarNegPy/F");
526 fTreeCascade->Branch("fTreeCascVarNegPz",&fTreeCascVarNegPz,"fTreeCascVarNegPz/F");
527 fTreeCascade->Branch("fTreeCascVarPosPx",&fTreeCascVarPosPx,"fTreeCascVarPosPx/F");
528 fTreeCascade->Branch("fTreeCascVarPosPy",&fTreeCascVarPosPy,"fTreeCascVarPosPy/F");
529 fTreeCascade->Branch("fTreeCascVarPosPz",&fTreeCascVarPosPz,"fTreeCascVarPosPz/F");
530 fTreeCascade->Branch("fTreeCascVarBachPx",&fTreeCascVarBachPx,"fTreeCascVarBachPx/F");
531 fTreeCascade->Branch("fTreeCascVarBachPy",&fTreeCascVarBachPy,"fTreeCascVarBachPy/F");
532 fTreeCascade->Branch("fTreeCascVarBachPz",&fTreeCascVarBachPz,"fTreeCascVarBachPz/F");
533
534 //Part D: Decay positions
535 fTreeCascade->Branch("fTreeCascVarV0DecayX",&fTreeCascVarV0DecayX,"fTreeCascVarV0DecayX/F");
536 fTreeCascade->Branch("fTreeCascVarV0DecayY",&fTreeCascVarV0DecayY,"fTreeCascVarV0DecayY/F");
537 fTreeCascade->Branch("fTreeCascVarV0DecayZ",&fTreeCascVarV0DecayZ,"fTreeCascVarV0DecayZ/F");
538 fTreeCascade->Branch("fTreeCascVarCascadeDecayX",&fTreeCascVarCascadeDecayX,"fTreeCascVarCascadeDecayX/F");
539 fTreeCascade->Branch("fTreeCascVarCascadeDecayY",&fTreeCascVarCascadeDecayY,"fTreeCascVarCascadeDecayY/F");
540 fTreeCascade->Branch("fTreeCascVarCascadeDecayZ",&fTreeCascVarCascadeDecayZ,"fTreeCascVarCascadeDecayZ/F");
541 //------------------------------------------------
542 }
d55fa19c 543
76029adc 544//------------------------------------------------
545// Particle Identification Setup
546//------------------------------------------------
547
548 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
549 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
550 fPIDResponse = inputHandler->GetPIDResponse();
551
552// Multiplicity
553
2add50c1 554 if(! fESDtrackCuts ){
555 fESDtrackCuts = new AliESDtrackCuts();
556 }
557 if(! fUtils ){
558 fUtils = new AliAnalysisUtils();
559 }
76029adc 560
561//------------------------------------------------
562// V0 Multiplicity Histograms
563//------------------------------------------------
564
565 // Create histograms
566 OpenFile(1);
567 fListHist = new TList();
568 fListHist->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
569
570
571 if(! fHistV0MultiplicityBeforeTrigSel) {
572 fHistV0MultiplicityBeforeTrigSel = new TH1F("fHistV0MultiplicityBeforeTrigSel",
573 "V0s per event (before Trig. Sel.);Nbr of V0s/Evt;Events",
574 25, 0, 25);
575 fListHist->Add(fHistV0MultiplicityBeforeTrigSel);
576 }
577
578 if(! fHistV0MultiplicityForTrigEvt) {
579 fHistV0MultiplicityForTrigEvt = new TH1F("fHistV0MultiplicityForTrigEvt",
580 "V0s per event (for triggered evt);Nbr of V0s/Evt;Events",
581 25, 0, 25);
582 fListHist->Add(fHistV0MultiplicityForTrigEvt);
583 }
584
585 if(! fHistV0MultiplicityForSelEvt) {
586 fHistV0MultiplicityForSelEvt = new TH1F("fHistV0MultiplicityForSelEvt",
587 "V0s per event;Nbr of V0s/Evt;Events",
588 25, 0, 25);
589 fListHist->Add(fHistV0MultiplicityForSelEvt);
590 }
591
592 if(! fHistV0MultiplicityForSelEvtNoTPCOnly) {
593 fHistV0MultiplicityForSelEvtNoTPCOnly = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnly",
594 "V0s per event;Nbr of V0s/Evt;Events",
595 25, 0, 25);
596 fListHist->Add(fHistV0MultiplicityForSelEvtNoTPCOnly);
597 }
598 if(! fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup) {
599 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup",
600 "V0s per event;Nbr of V0s/Evt;Events",
601 25, 0, 25);
602 fListHist->Add(fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup);
603 }
604
605//------------------------------------------------
606// Track Multiplicity Histograms
607//------------------------------------------------
608
609 if(! fHistMultiplicityBeforeTrigSel) {
610 fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel",
611 "Tracks per event;Nbr of Tracks;Events",
612 200, 0, 200);
613 fListHist->Add(fHistMultiplicityBeforeTrigSel);
614 }
615 if(! fHistMultiplicityForTrigEvt) {
616 fHistMultiplicityForTrigEvt = new TH1F("fHistMultiplicityForTrigEvt",
617 "Tracks per event;Nbr of Tracks;Events",
618 200, 0, 200);
619 fListHist->Add(fHistMultiplicityForTrigEvt);
620 }
621 if(! fHistMultiplicity) {
622 fHistMultiplicity = new TH1F("fHistMultiplicity",
623 "Tracks per event;Nbr of Tracks;Events",
624 200, 0, 200);
625 fListHist->Add(fHistMultiplicity);
626 }
627 if(! fHistMultiplicityNoTPCOnly) {
628 fHistMultiplicityNoTPCOnly = new TH1F("fHistMultiplicityNoTPCOnly",
629 "Tracks per event;Nbr of Tracks;Events",
630 200, 0, 200);
631 fListHist->Add(fHistMultiplicityNoTPCOnly);
632 }
633 if(! fHistMultiplicityNoTPCOnlyNoPileup) {
634 fHistMultiplicityNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityNoTPCOnlyNoPileup",
635 "Tracks per event;Nbr of Tracks;Events",
636 200, 0, 200);
637 fListHist->Add(fHistMultiplicityNoTPCOnlyNoPileup);
638 }
5d43de53 639
640
641 //V0A Centrality (if PbPb / pPb)
642 if(! fHistMultiplicityV0ABeforeTrigSel) {
643 fHistMultiplicityV0ABeforeTrigSel = new TH1F("fHistMultiplicityV0ABeforeTrigSel",
644 "Centrality Distribution: V0A;V0A Centrality;Events",
645 200, 0, 200);
646 fListHist->Add(fHistMultiplicityV0ABeforeTrigSel);
647 }
648 if(! fHistMultiplicityV0AForTrigEvt) {
649 fHistMultiplicityV0AForTrigEvt = new TH1F("fHistMultiplicityV0AForTrigEvt",
650 "Centrality Distribution: V0A;V0A Centrality;Events",
651 200, 0, 200);
652 fListHist->Add(fHistMultiplicityV0AForTrigEvt);
653 }
654 if(! fHistMultiplicityV0A) {
655 fHistMultiplicityV0A = new TH1F("fHistMultiplicityV0A",
656 "Centrality Distribution: V0A;V0A Centrality;Events",
657 200, 0, 200);
658 fListHist->Add(fHistMultiplicityV0A);
659 }
660 if(! fHistMultiplicityV0ANoTPCOnly) {
661 fHistMultiplicityV0ANoTPCOnly = new TH1F("fHistMultiplicityV0ANoTPCOnly",
662 "Centrality Distribution: V0A;V0A Centrality;Events",
663 200, 0, 200);
664 fListHist->Add(fHistMultiplicityV0ANoTPCOnly);
665 }
666 if(! fHistMultiplicityV0ANoTPCOnlyNoPileup) {
667 fHistMultiplicityV0ANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityV0ANoTPCOnlyNoPileup",
668 "Centrality Distribution: V0A;V0A Centrality;Events",
669 200, 0, 200);
670 fListHist->Add(fHistMultiplicityV0ANoTPCOnlyNoPileup);
671 }
672
673 //ZNA Centrality (if PbPb / pPb)
674 if(! fHistMultiplicityZNABeforeTrigSel) {
675 fHistMultiplicityZNABeforeTrigSel = new TH1F("fHistMultiplicityZNABeforeTrigSel",
676 "Centrality Distribution: ZNA;ZNA Centrality;Events",
677 200, 0, 200);
678 fListHist->Add(fHistMultiplicityZNABeforeTrigSel);
679 }
680 if(! fHistMultiplicityZNAForTrigEvt) {
681 fHistMultiplicityZNAForTrigEvt = new TH1F("fHistMultiplicityZNAForTrigEvt",
682 "Centrality Distribution: ZNA;ZNA Centrality;Events",
683 200, 0, 200);
684 fListHist->Add(fHistMultiplicityZNAForTrigEvt);
685 }
686 if(! fHistMultiplicityZNA) {
687 fHistMultiplicityZNA = new TH1F("fHistMultiplicityZNA",
688 "Centrality Distribution: ZNA;ZNA Centrality;Events",
689 200, 0, 200);
690 fListHist->Add(fHistMultiplicityZNA);
691 }
692 if(! fHistMultiplicityZNANoTPCOnly) {
693 fHistMultiplicityZNANoTPCOnly = new TH1F("fHistMultiplicityZNANoTPCOnly",
694 "Centrality Distribution: ZNA;ZNA Centrality;Events",
695 200, 0, 200);
696 fListHist->Add(fHistMultiplicityZNANoTPCOnly);
697 }
698 if(! fHistMultiplicityZNANoTPCOnlyNoPileup) {
699 fHistMultiplicityZNANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityZNANoTPCOnlyNoPileup",
700 "Centrality Distribution: ZNA;ZNA Centrality;Events",
701 200, 0, 200);
702 fListHist->Add(fHistMultiplicityZNANoTPCOnlyNoPileup);
703 }
704
705 //TRK Centrality (if PbPb / pPb)
706 if(! fHistMultiplicityTRKBeforeTrigSel) {
707 fHistMultiplicityTRKBeforeTrigSel = new TH1F("fHistMultiplicityTRKBeforeTrigSel",
708 "Centrality Distribution: TRK;TRK Centrality;Events",
709 200, 0, 200);
710 fListHist->Add(fHistMultiplicityTRKBeforeTrigSel);
711 }
712 if(! fHistMultiplicityTRKForTrigEvt) {
713 fHistMultiplicityTRKForTrigEvt = new TH1F("fHistMultiplicityTRKForTrigEvt",
714 "Centrality Distribution: TRK;TRK Centrality;Events",
715 200, 0, 200);
716 fListHist->Add(fHistMultiplicityTRKForTrigEvt);
717 }
718 if(! fHistMultiplicityTRK) {
719 fHistMultiplicityTRK = new TH1F("fHistMultiplicityTRK",
720 "Centrality Distribution: TRK;TRK Centrality;Events",
721 200, 0, 200);
722 fListHist->Add(fHistMultiplicityTRK);
723 }
724 if(! fHistMultiplicityTRKNoTPCOnly) {
725 fHistMultiplicityTRKNoTPCOnly = new TH1F("fHistMultiplicityTRKNoTPCOnly",
726 "Centrality Distribution: TRK;TRK Centrality;Events",
727 200, 0, 200);
728 fListHist->Add(fHistMultiplicityTRKNoTPCOnly);
729 }
730 if(! fHistMultiplicityTRKNoTPCOnlyNoPileup) {
731 fHistMultiplicityTRKNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityTRKNoTPCOnlyNoPileup",
732 "Centrality Distribution: TRK;TRK Centrality;Events",
733 200, 0, 200);
734 fListHist->Add(fHistMultiplicityTRKNoTPCOnlyNoPileup);
735 }
736
737 //SPD Centrality (if PbPb / pPb)
738 if(! fHistMultiplicitySPDBeforeTrigSel) {
739 fHistMultiplicitySPDBeforeTrigSel = new TH1F("fHistMultiplicitySPDBeforeTrigSel",
740 "Centrality Distribution: SPD;SPD Centrality;Events",
741 200, 0, 200);
742 fListHist->Add(fHistMultiplicitySPDBeforeTrigSel);
743 }
744 if(! fHistMultiplicitySPDForTrigEvt) {
745 fHistMultiplicitySPDForTrigEvt = new TH1F("fHistMultiplicitySPDForTrigEvt",
746 "Centrality Distribution: SPD;SPD Centrality;Events",
747 200, 0, 200);
748 fListHist->Add(fHistMultiplicitySPDForTrigEvt);
749 }
750 if(! fHistMultiplicitySPD) {
751 fHistMultiplicitySPD = new TH1F("fHistMultiplicitySPD",
752 "Centrality Distribution: SPD;SPD Centrality;Events",
753 200, 0, 200);
754 fListHist->Add(fHistMultiplicitySPD);
755 }
756 if(! fHistMultiplicitySPDNoTPCOnly) {
757 fHistMultiplicitySPDNoTPCOnly = new TH1F("fHistMultiplicitySPDNoTPCOnly",
758 "Centrality Distribution: SPD;SPD Centrality;Events",
759 200, 0, 200);
760 fListHist->Add(fHistMultiplicitySPDNoTPCOnly);
761 }
762 if(! fHistMultiplicitySPDNoTPCOnlyNoPileup) {
763 fHistMultiplicitySPDNoTPCOnlyNoPileup = new TH1F("fHistMultiplicitySPDNoTPCOnlyNoPileup",
764 "Centrality Distribution: SPD;SPD Centrality;Events",
765 200, 0, 200);
766 fListHist->Add(fHistMultiplicitySPDNoTPCOnlyNoPileup);
767 }
768
76029adc 769
770//----------------------------------
771// Primary Vertex Position Histos
772//----------------------------------
773
774 if(! fHistPVx) {
775 fHistPVx = new TH1F("fHistPVx",
776 "PV x position;Nbr of Evts;x",
777 2000, -0.5, 0.5);
778 fListHist->Add(fHistPVx);
779 }
780 if(! fHistPVy) {
781 fHistPVy = new TH1F("fHistPVy",
782 "PV y position;Nbr of Evts;y",
783 2000, -0.5, 0.5);
784 fListHist->Add(fHistPVy);
785 }
786 if(! fHistPVz) {
787 fHistPVz = new TH1F("fHistPVz",
788 "PV z position;Nbr of Evts;z",
789 400, -20, 20);
790 fListHist->Add(fHistPVz);
791 }
792
793 if(! fHistPVxAnalysis) {
794 fHistPVxAnalysis = new TH1F("fHistPVxAnalysis",
795 "PV x position;Nbr of Evts;x",
796 2000, -0.5, 0.5);
797 fListHist->Add(fHistPVxAnalysis);
798 }
799 if(! fHistPVyAnalysis) {
800 fHistPVyAnalysis = new TH1F("fHistPVyAnalysis",
801 "PV y position;Nbr of Evts;y",
802 2000, -0.5, 0.5);
803 fListHist->Add(fHistPVyAnalysis);
804 }
805 if(! fHistPVzAnalysis) {
806 fHistPVzAnalysis = new TH1F("fHistPVzAnalysis",
807 "PV z position;Nbr of Evts;z",
808 400, -20, 20);
809 fListHist->Add(fHistPVzAnalysis);
810 }
811
812 //List of Histograms: Normal
813 PostData(1, fListHist);
814
815 //TTree Object: Saved to base directory. Should cache to disk while saving.
816 //(Important to avoid excessive memory usage, particularly when merging)
817 PostData(2, fTreeCascade);
818
819}// end UserCreateOutputObjects
820
821
822//________________________________________________________________________
823void AliAnalysisTaskExtractCascade::UserExec(Option_t *)
824{
825 // Main loop
826 // Called for each event
827
828 AliESDEvent *lESDevent = 0x0;
829
830 Int_t lNumberOfV0s = -1;
831 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
832 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
833 Double_t lMagneticField = -10.;
834
835 // Connect to the InputEvent
836 // After these lines, we should have an ESD/AOD event + the number of V0s in it.
837
838 // Appropriate for ESD analysis!
839
840 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
841 if (!lESDevent) {
842 AliWarning("ERROR: lESDevent not available \n");
843 return;
844 }
845
d55fa19c 846 //--- Acquisition of exact event ID
847 fTreeCascVarRunNumber = lESDevent->GetRunNumber();
848 fTreeCascVarEventNumber =
76029adc 849 ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
850 ( ((ULong64_t)lESDevent->GetOrbitNumber () ) << 12 ) |
851 ((ULong64_t)lESDevent->GetBunchCrossNumber() ) );
d55fa19c 852
76029adc 853
854//------------------------------------------------
855// Multiplicity Information Acquistion
856//------------------------------------------------
857
858 //REVISED multiplicity estimator after 'multiplicity day' (2011)
5d43de53 859 Int_t lMultiplicity = -100;
860 Int_t lMultiplicityV0A = -100;
861 Int_t lMultiplicityZNA = -100;
862 Int_t lMultiplicityTRK = -100;
863 Int_t lMultiplicitySPD = -100;
76029adc 864
865 //testing purposes
cda235e2 866 if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC, fEtaRefMult );
76029adc 867
868 //---> If this is a nuclear collision, then go nuclear on "multiplicity" variable...
869 //---> Warning: Experimental
870 if(fkIsNuclear == kTRUE){
871 AliCentrality* centrality;
872 centrality = lESDevent->GetCentrality();
da3539d8 873 lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile( fCentralityEstimator.Data() ) ) );
5d43de53 874 lMultiplicityV0A = ( ( Int_t ) ( centrality->GetCentralityPercentile( "V0A" ) ) );
875 lMultiplicityZNA = ( ( Int_t ) ( centrality->GetCentralityPercentile( "ZNA" ) ) );
876 lMultiplicityTRK = ( ( Int_t ) ( centrality->GetCentralityPercentile( "TRK" ) ) );
f8bc074c 877 lMultiplicitySPD = ( ( Int_t ) ( centrality->GetCentralityPercentile( "CL1" ) ) );
76029adc 878 if (centrality->GetQuality()>1) {
879 PostData(1, fListHist);
880 PostData(2, fTreeCascade);
881 return;
882 }
883 }
884
885 //Set variable for filling tree afterwards!
886 //---> pp case......: GetReferenceMultiplicity
887 //---> Pb-Pb case...: Centrality by V0M
888
5d43de53 889 fTreeCascVarMultiplicity = lMultiplicity;
890 fTreeCascVarMultiplicityV0A = lMultiplicityV0A;
891 fTreeCascVarMultiplicityZNA = lMultiplicityZNA;
892 fTreeCascVarMultiplicityTRK = lMultiplicityTRK;
893 fTreeCascVarMultiplicitySPD = lMultiplicitySPD;
894
895 fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
896 fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
897 fHistMultiplicityV0ABeforeTrigSel->Fill ( lMultiplicityV0A );
898 fHistMultiplicityZNABeforeTrigSel->Fill ( lMultiplicityZNA );
899 fHistMultiplicityTRKBeforeTrigSel->Fill ( lMultiplicityTRK );
900 fHistMultiplicitySPDBeforeTrigSel->Fill ( lMultiplicitySPD );
901
76029adc 902//------------------------------------------------
903// Physics Selection
904//------------------------------------------------
905
906 UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
907 Bool_t isSelected = 0;
908 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
909
2213f6fc 910 //pA triggering: CINT7
911 if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
912
76029adc 913 //Standard Min-Bias Selection
914 if ( ! isSelected ) {
915 PostData(1, fListHist);
916 PostData(2, fTreeCascade);
917 return;
918 }
919
d8841e95 920//------------------------------------------------
921// Rerun cascade vertexer!
922//------------------------------------------------
d8841e95 923
38927449 924 if( fkRunVertexers ){
925 lESDevent->ResetCascades();
926 lESDevent->ResetV0s();
d8841e95 927
38927449 928 AliV0vertexer lV0vtxer;
929 AliCascadeVertexer lCascVtxer;
930
931 lV0vtxer.SetDefaultCuts(fV0VertexerSels);
932 lCascVtxer.SetDefaultCuts(fCascadeVertexerSels);
933
934 lV0vtxer.Tracks2V0vertices(lESDevent);
935 lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
936 }
76029adc 937//------------------------------------------------
938// After Trigger Selection
939//------------------------------------------------
940
941 lNumberOfV0s = lESDevent->GetNumberOfV0s();
942
943 //Set variable for filling tree afterwards!
944 fHistV0MultiplicityForTrigEvt->Fill(lNumberOfV0s);
945 fHistMultiplicityForTrigEvt->Fill ( lMultiplicity );
5d43de53 946 fHistMultiplicityV0AForTrigEvt ->Fill( lMultiplicityV0A );
947 fHistMultiplicityZNAForTrigEvt ->Fill( lMultiplicityZNA );
948 fHistMultiplicityTRKForTrigEvt ->Fill( lMultiplicityTRK );
949 fHistMultiplicitySPDForTrigEvt ->Fill( lMultiplicitySPD );
76029adc 950
951//------------------------------------------------
952// Getting: Primary Vertex + MagField Info
953//------------------------------------------------
954
955 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
956 // get the vtx stored in ESD found with tracks
957 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
958
959 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
960 // get the best primary vertex available for the event
961 // As done in AliCascadeVertexer, we keep the one which is the best one available.
962 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
963 // This one will be used for next calculations (DCA essentially)
964 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
965
966 Double_t lPrimaryVtxPosition[3];
967 const AliVVertex *primaryVtx = lESDevent->GetPrimaryVertex();
968 lPrimaryVtxPosition[0] = primaryVtx->GetX();
969 lPrimaryVtxPosition[1] = primaryVtx->GetY();
970 lPrimaryVtxPosition[2] = primaryVtx->GetZ();
971 fHistPVx->Fill( lPrimaryVtxPosition[0] );
972 fHistPVy->Fill( lPrimaryVtxPosition[1] );
973 fHistPVz->Fill( lPrimaryVtxPosition[2] );
974
ab47349e 975 //------------------------------------------------
976 // Primary Vertex Requirements Section:
977 // ---> pp and PbPb: Only requires |z|<10cm
978 // ---> pPb: all requirements checked at this stage
979 //------------------------------------------------
980
981 //Roberto's PV selection criteria, implemented 17th April 2013
982
983 /* vertex selection */
984 Bool_t fHasVertex = kFALSE;
985
986 const AliESDVertex *vertex = lESDevent->GetPrimaryVertexTracks();
987 if (vertex->GetNContributors() < 1) {
988 vertex = lESDevent->GetPrimaryVertexSPD();
989 if (vertex->GetNContributors() < 1) fHasVertex = kFALSE;
990 else fHasVertex = kTRUE;
991 TString vtxTyp = vertex->GetTitle();
992 Double_t cov[6]={0};
993 vertex->GetCovarianceMatrix(cov);
994 Double_t zRes = TMath::Sqrt(cov[5]);
995 if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) fHasVertex = kFALSE;
996 }
997 else fHasVertex = kTRUE;
998
999 //Is First event in chunk rejection: Still present!
1000 if(fkpAVertexSelection==kTRUE && fHasVertex == kFALSE) {
1001 AliWarning("Pb / | PV does not satisfy selection criteria!");
2add50c1 1002 PostData(1, fListHist);
1003 PostData(2, fTreeCascade);
1004 return;
1005 }
ab47349e 1006
1007 //Is First event in chunk rejection: Still present!
2add50c1 1008 if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
1009 AliWarning("Pb / | This is the first event in the chunk!");
1010 PostData(1, fListHist);
1011 PostData(2, fTreeCascade);
1012 return;
1013 }
ab47349e 1014
1015 //17 April Fix: Always do primary vertex Z selection, after pA vertex selection from Roberto
1016 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0) {
1017 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
2add50c1 1018 PostData(1, fListHist);
1019 PostData(2, fTreeCascade);
1020 return;
1021 }
ab47349e 1022
1023
2add50c1 1024 lMagneticField = lESDevent->GetMagneticField( );
1025 fHistV0MultiplicityForSelEvt ->Fill( lNumberOfV0s );
1026 fHistMultiplicity->Fill(lMultiplicity);
1027 fHistMultiplicityV0A->Fill(lMultiplicityV0A);
1028 fHistMultiplicityZNA->Fill(lMultiplicityZNA);
1029 fHistMultiplicityTRK->Fill(lMultiplicityTRK);
1030 fHistMultiplicitySPD->Fill(lMultiplicitySPD);
76029adc 1031
1032//------------------------------------------------
1033// SKIP: Events with well-established PVtx
1034//------------------------------------------------
1035
1036 const AliESDVertex *lPrimaryTrackingESDVtxCheck = lESDevent->GetPrimaryVertexTracks();
1037 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
2add50c1 1038 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() && fkpAVertexSelection==kFALSE ){
76029adc 1039 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
1040 PostData(1, fListHist);
1041 PostData(2, fTreeCascade);
1042 return;
1043 }
1044 fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( lNumberOfV0s );
1045 fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
5d43de53 1046 fHistMultiplicityV0ANoTPCOnly->Fill(lMultiplicityV0A);
1047 fHistMultiplicityZNANoTPCOnly->Fill(lMultiplicityZNA);
1048 fHistMultiplicityTRKNoTPCOnly->Fill(lMultiplicityTRK);
1049 fHistMultiplicitySPDNoTPCOnly->Fill(lMultiplicitySPD);
76029adc 1050
1051//------------------------------------------------
1052// Pileup Rejection Studies
1053//------------------------------------------------
1054
1055 // FIXME : quality selection regarding pile-up rejection
1056 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
1057 AliWarning("Pb / This is tagged as Pileup from SPD... return !");
1058 PostData(1, fListHist);
1059 PostData(2, fTreeCascade);
1060 return;
1061 }
1062 fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( lNumberOfV0s );
1063 fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
5d43de53 1064 fHistMultiplicityV0ANoTPCOnlyNoPileup->Fill(lMultiplicityV0A);
1065 fHistMultiplicityZNANoTPCOnlyNoPileup->Fill(lMultiplicityZNA);
1066 fHistMultiplicityTRKNoTPCOnlyNoPileup->Fill(lMultiplicityTRK);
1067 fHistMultiplicitySPDNoTPCOnlyNoPileup->Fill(lMultiplicitySPD);
76029adc 1068
1069 //Do control histograms without the IsFromVertexerZ events, but consider them in analysis...
1070 if( ! (lESDevent->GetPrimaryVertex()->IsFromVertexerZ() ) ){
1071 fHistPVxAnalysis->Fill( lPrimaryVtxPosition[0] );
1072 fHistPVyAnalysis->Fill( lPrimaryVtxPosition[1] );
1073 fHistPVzAnalysis->Fill( lPrimaryVtxPosition[2] );
1074 }
1075
1076//------------------------------------------------
1077// MAIN CASCADE LOOP STARTS HERE
1078//------------------------------------------------
1079// Code Credit: Antonin Maire (thanks^100)
1080// ---> This is an adaptation
1081
1082 Long_t ncascades = 0;
1083 ncascades = lESDevent->GetNumberOfCascades();
1084
1085 for (Int_t iXi = 0; iXi < ncascades; iXi++){
1086 //------------------------------------------------
1087 // Initializations
1088 //------------------------------------------------
1089 //Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1090 //Double_t lBestPrimaryVtxRadius3D = -500.0;
1091
1092 // - 1st part of initialisation : variables needed to store AliESDCascade data members
1093 Double_t lEffMassXi = 0. ;
1094 //Double_t lChi2Xi = -1. ;
1095 Double_t lDcaXiDaughters = -1. ;
1096 Double_t lXiCosineOfPointingAngle = -1. ;
1097 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1098 Double_t lXiRadius = -1000. ;
1099
1100 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1101 Int_t lPosTPCClusters = -1; // For ESD only ...//FIXME : wait for availability in AOD
1102 Int_t lNegTPCClusters = -1; // For ESD only ...
1103 Int_t lBachTPCClusters = -1; // For ESD only ...
1104
1105 // - 3rd part of initialisation : about V0 part in cascades
1106 Double_t lInvMassLambdaAsCascDghter = 0.;
1107 //Double_t lV0Chi2Xi = -1. ;
1108 Double_t lDcaV0DaughtersXi = -1.;
1109
1110 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1111 Double_t lDcaPosToPrimVertexXi = -1.;
1112 Double_t lDcaNegToPrimVertexXi = -1.;
1113 Double_t lV0CosineOfPointingAngleXi = -1. ;
571c9e48 1114 Double_t lV0CosineOfPointingAngleXiSpecial = -1. ;
76029adc 1115 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1116 Double_t lV0RadiusXi = -1000.0;
1117 Double_t lV0quality = 0.;
1118
1119 // - 4th part of initialisation : Effective masses
1120 Double_t lInvMassXiMinus = 0.;
1121 Double_t lInvMassXiPlus = 0.;
1122 Double_t lInvMassOmegaMinus = 0.;
1123 Double_t lInvMassOmegaPlus = 0.;
1124
1125 // - 6th part of initialisation : extra info for QA
1126 Double_t lXiMomX = 0. , lXiMomY = 0., lXiMomZ = 0.;
1127 Double_t lXiTransvMom = 0. ;
1128 Double_t lXiTransvMomMC= 0. ;
1129 Double_t lXiTotMom = 0. ;
1130
1131 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1132 //Double_t lBachTransvMom = 0.;
1133 //Double_t lBachTotMom = 0.;
1134
1135 fTreeCascVarNegNSigmaPion = -100;
1136 fTreeCascVarNegNSigmaProton = -100;
1137 fTreeCascVarPosNSigmaPion = -100;
1138 fTreeCascVarPosNSigmaProton = -100;
1139 fTreeCascVarBachNSigmaPion = -100;
1140 fTreeCascVarBachNSigmaKaon = -100;
1141
1142 Short_t lChargeXi = -2;
1143 //Double_t lV0toXiCosineOfPointingAngle = 0. ;
1144
1145 Double_t lRapXi = -20.0, lRapOmega = -20.0, lRapMC = -20.0; // lEta = -20.0, lTheta = 360., lPhi = 720. ;
1146 //Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1147
1148 // -------------------------------------
1149 // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1150
1151 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1152 if (!xi) continue;
1153
1154
1155 // - II.Step 1 : around primary vertex
1156 //-------------
1157 //lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1158 // lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1159 // lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1160
1161 //lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1162 // lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1163 // lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1164
1165 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1166 //-------------
1167 lV0quality = 0.;
1168 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1169
1170 lEffMassXi = xi->GetEffMassXi();
1171 //lChi2Xi = xi->GetChi2Xi();
1172 lDcaXiDaughters = xi->GetDcaXiDaughters();
1173 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1174 lBestPrimaryVtxPos[1],
1175 lBestPrimaryVtxPos[2] );
1176 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1177
1178 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1179 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1180
3eb670b7 1181 fTreeCascVarCascadeDecayX = lPosXi[0];
1182 fTreeCascVarCascadeDecayY = lPosXi[1];
1183 fTreeCascVarCascadeDecayZ = lPosXi[2];
1184
76029adc 1185 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1186 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1187 //-------------
1188
1189 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1190 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1191 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1192 // Care track label can be negative in MC production (linked with the track quality)
1193 // However = normally, not the case for track index ...
1194
1195 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1196 if(lBachIdx == lIdxNegXi) {
1197 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1198 }
1199 if(lBachIdx == lIdxPosXi) {
1200 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1201 }
1202
1203 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1204 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1205 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1206
1207 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1208 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1209 continue;
1210 }
1211
19e2af54 1212 fTreeCascVarPosEta = pTrackXi->Eta();
1213 fTreeCascVarNegEta = nTrackXi->Eta();
1214 fTreeCascVarBachEta = bachTrackXi->Eta();
1215
d55fa19c 1216 //Save shared clusters information
1217 fTreeCascVarNegSharedClusters = nTrackXi->GetTPCnclsS(0,159);
1218 fTreeCascVarPosSharedClusters = pTrackXi->GetTPCnclsS(0,159);
1219 fTreeCascVarBachSharedClusters = bachTrackXi->GetTPCnclsS(0,159);
1220
19e2af54 1221 Double_t lBMom[3], lNMom[3], lPMom[3];
1222 xi->GetBPxPyPz( lBMom[0], lBMom[1], lBMom[2] );
1223 xi->GetPPxPyPz( lPMom[0], lPMom[1], lPMom[2] );
1224 xi->GetNPxPyPz( lNMom[0], lNMom[1], lNMom[2] );
1225
d55fa19c 1226 //Save all momentum information
1227 fTreeCascVarNegPx = lNMom[0];
98ad9aee 1228 fTreeCascVarNegPy = lNMom[1];
1229 fTreeCascVarNegPz = lNMom[2];
d55fa19c 1230 fTreeCascVarPosPx = lPMom[0];
98ad9aee 1231 fTreeCascVarPosPy = lPMom[1];
1232 fTreeCascVarPosPz = lPMom[2];
d55fa19c 1233 fTreeCascVarBachPx = lBMom[0];
98ad9aee 1234 fTreeCascVarBachPy = lBMom[1];
1235 fTreeCascVarBachPz = lBMom[2];
d55fa19c 1236
19e2af54 1237 fTreeCascVarBachTransMom = TMath::Sqrt( lBMom[0]*lBMom[0] + lBMom[1]*lBMom[1] );
1238 fTreeCascVarPosTransMom = TMath::Sqrt( lPMom[0]*lPMom[0] + lPMom[1]*lPMom[1] );
1239 fTreeCascVarNegTransMom = TMath::Sqrt( lNMom[0]*lNMom[0] + lNMom[1]*lNMom[1] );
76029adc 1240
1241 //------------------------------------------------
1242 // TPC dEdx information
1243 //------------------------------------------------
1244 fTreeCascVarNegNSigmaPion = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kPion );
1245 fTreeCascVarNegNSigmaProton = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kProton );
1246 fTreeCascVarPosNSigmaPion = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kPion );
1247 fTreeCascVarPosNSigmaProton = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kProton );
1248 fTreeCascVarBachNSigmaPion = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kPion );
1249 fTreeCascVarBachNSigmaKaon = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kKaon );
1250
1251 //------------------------------------------------
1252 // TPC Number of clusters info
1253 // --- modified to save the smallest number
1254 // --- of TPC clusters for the 3 tracks
1255 //------------------------------------------------
1256
1257 lPosTPCClusters = pTrackXi->GetTPCNcls();
1258 lNegTPCClusters = nTrackXi->GetTPCNcls();
1259 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1260
1261 // 1 - Poor quality related to TPCrefit
1262 ULong_t pStatus = pTrackXi->GetStatus();
1263 ULong_t nStatus = nTrackXi->GetStatus();
1264 ULong_t bachStatus = bachTrackXi->GetStatus();
9cf85007 1265
1266 fTreeCascVarkITSRefitBachelor = kTRUE;
1267 fTreeCascVarkITSRefitNegative = kTRUE;
1268 fTreeCascVarkITSRefitPositive = kTRUE;
1269
76029adc 1270 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1271 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1272 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
9cf85007 1273
1274 //Extra Debug Information: booleans for ITS refit
1275 if ((pStatus&AliESDtrack::kITSrefit) == 0) { fTreeCascVarkITSRefitPositive = kFALSE; }
1276 if ((nStatus&AliESDtrack::kITSrefit) == 0) { fTreeCascVarkITSRefitNegative = kFALSE; }
1277 if ((bachStatus&AliESDtrack::kITSrefit) == 0) { fTreeCascVarkITSRefitBachelor = kFALSE; }
1278
76029adc 1279 // 2 - Poor quality related to TPC clusters: lowest cut of 70 clusters
1280 if(lPosTPCClusters < 70) { AliWarning("Pb / V0 Pos. track has less than 70 TPC clusters ... continue!"); continue; }
1281 if(lNegTPCClusters < 70) { AliWarning("Pb / V0 Neg. track has less than 70 TPC clusters ... continue!"); continue; }
1282 if(lBachTPCClusters < 70) { AliWarning("Pb / Bach. track has less than 70 TPC clusters ... continue!"); continue; }
1283 Int_t leastnumberofclusters = 1000;
1284 if( lPosTPCClusters < leastnumberofclusters ) leastnumberofclusters = lPosTPCClusters;
1285 if( lNegTPCClusters < leastnumberofclusters ) leastnumberofclusters = lNegTPCClusters;
1286 if( lBachTPCClusters < leastnumberofclusters ) leastnumberofclusters = lBachTPCClusters;
1287
1288 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1289 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1290 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1291 //lV0Chi2Xi = xi->GetChi2V0();
1292
1293 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1294 lBestPrimaryVtxPos[1],
1295 lBestPrimaryVtxPos[2] );
571c9e48 1296 //Modification: V0 CosPA wrt to Cascade decay vertex
1297 lV0CosineOfPointingAngleXiSpecial = xi->GetV0CosineOfPointingAngle( lPosXi[0],
1298 lPosXi[1],
1299 lPosXi[2] );
76029adc 1300
1301 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1302 lBestPrimaryVtxPos[1],
1303 lBestPrimaryVtxPos[2] );
1304
1305 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1306 lBestPrimaryVtxPos[1],
1307 lMagneticField ) );
1308 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1309
1310 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1311 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1312
3eb670b7 1313 fTreeCascVarV0DecayX = lPosV0Xi[0];
1314 fTreeCascVarV0DecayY = lPosV0Xi[1];
1315 fTreeCascVarV0DecayZ = lPosV0Xi[2];
1316
76029adc 1317 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1318 lBestPrimaryVtxPos[1],
1319 lMagneticField ) );
1320
1321 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1322 lBestPrimaryVtxPos[1],
1323 lMagneticField ) );
1324
1325 // - II.Step 4 : around effective masses (ESD)
1326 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1327
1328 if( bachTrackXi->Charge() < 0 ) {
1329 lV0quality = 0.;
1330 xi->ChangeMassHypothesis(lV0quality , 3312);
1331 // Calculate the effective mass of the Xi- candidate.
1332 // pdg code 3312 = Xi-
1333 lInvMassXiMinus = xi->GetEffMassXi();
1334
1335 lV0quality = 0.;
1336 xi->ChangeMassHypothesis(lV0quality , 3334);
1337 // Calculate the effective mass of the Xi- candidate.
1338 // pdg code 3334 = Omega-
1339 lInvMassOmegaMinus = xi->GetEffMassXi();
1340
1341 lV0quality = 0.;
1342 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1343 }// end if negative bachelor
1344
1345
1346 if( bachTrackXi->Charge() > 0 ){
1347 lV0quality = 0.;
1348 xi->ChangeMassHypothesis(lV0quality , -3312);
1349 // Calculate the effective mass of the Xi+ candidate.
1350 // pdg code -3312 = Xi+
1351 lInvMassXiPlus = xi->GetEffMassXi();
1352
1353 lV0quality = 0.;
1354 xi->ChangeMassHypothesis(lV0quality , -3334);
1355 // Calculate the effective mass of the Xi+ candidate.
1356 // pdg code -3334 = Omega+
1357 lInvMassOmegaPlus = xi->GetEffMassXi();
1358
1359 lV0quality = 0.;
1360 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1361 }// end if positive bachelor
1362 // - II.Step 6 : extra info for QA (ESD)
1363 // miscellaneous pieces of info that may help regarding data quality assessment.
1364 //-------------
1365
1366 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1367 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1368 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1369
1370 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1371 //lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1372 //lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1373
1374 lChargeXi = xi->Charge();
1375
1376 //lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1377
1378 lRapXi = xi->RapXi();
1379 lRapOmega = xi->RapOmega();
1380 //lEta = xi->Eta();
1381 //lTheta = xi->Theta() *180.0/TMath::Pi();
1382 //lPhi = xi->Phi() *180.0/TMath::Pi();
1383 //lAlphaXi = xi->AlphaXi();
1384 //lPtArmXi = xi->PtArmXi();
1385
1386 //------------------------------------------------
1387 // Set Variables for adding to tree
1388 //------------------------------------------------
1389
1390/* 1*/ fTreeCascVarCharge = lChargeXi;
1391/* 2*/ if(lInvMassXiMinus!=0) fTreeCascVarMassAsXi = lInvMassXiMinus;
1392/* 2*/ if(lInvMassXiPlus!=0) fTreeCascVarMassAsXi = lInvMassXiPlus;
1393/* 3*/ if(lInvMassOmegaMinus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaMinus;
1394/* 3*/ if(lInvMassOmegaPlus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaPlus;
1395/* 4*/ fTreeCascVarPt = lXiTransvMom;
1396/* 4*/ fTreeCascVarPtMC = lXiTransvMomMC;
1397/* 5*/ fTreeCascVarRapXi = lRapXi ;
1398/* 5*/ fTreeCascVarRapMC = lRapMC ;
1399/* 6*/ fTreeCascVarRapOmega = lRapOmega ;
1400/* 7*/ fTreeCascVarDCACascDaughters = lDcaXiDaughters;
1401/* 8*/ fTreeCascVarDCABachToPrimVtx = lDcaBachToPrimVertexXi;
1402/* 9*/ fTreeCascVarDCAV0Daughters = lDcaV0DaughtersXi;
1403/*10*/ fTreeCascVarDCAV0ToPrimVtx = lDcaV0ToPrimVertexXi;
1404/*11*/ fTreeCascVarDCAPosToPrimVtx = lDcaPosToPrimVertexXi;
1405/*12*/ fTreeCascVarDCANegToPrimVtx = lDcaNegToPrimVertexXi;
1406/*13*/ fTreeCascVarCascCosPointingAngle = lXiCosineOfPointingAngle;
1407/*14*/ fTreeCascVarCascRadius = lXiRadius;
1408/*15*/ fTreeCascVarV0Mass = lInvMassLambdaAsCascDghter;
1409/*16*/ fTreeCascVarV0CosPointingAngle = lV0CosineOfPointingAngleXi;
571c9e48 1410/*16*/ fTreeCascVarV0CosPointingAngleSpecial = lV0CosineOfPointingAngleXiSpecial;
76029adc 1411/*17*/ fTreeCascVarV0Radius = lV0RadiusXi;
1412/*20*/ fTreeCascVarLeastNbrClusters = leastnumberofclusters;
1413/*21*/ fTreeCascVarMultiplicity = lMultiplicity; //multiplicity, whatever that may be
1414
1415/*23*/ fTreeCascVarDistOverTotMom = TMath::Sqrt(
1416 TMath::Power( lPosXi[0] - lBestPrimaryVtxPos[0] , 2) +
1417 TMath::Power( lPosXi[1] - lBestPrimaryVtxPos[1] , 2) +
1418 TMath::Power( lPosXi[2] - lBestPrimaryVtxPos[2] , 2)
1419 );
1420/*23*/ fTreeCascVarDistOverTotMom /= (lXiTotMom+1e-13);
1421
1422//All vars not specified here: specified elsewhere!
1423
1424//------------------------------------------------
1425// Fill Tree!
1426//------------------------------------------------
1427
1428// The conditional is meant to decrease excessive
1429// memory usage! Be careful when loosening the
1430// cut!
1431
1432 //Xi Mass window: 150MeV wide
1433 //Omega mass window: 150MeV wide
1434
1435 if( (fTreeCascVarMassAsXi<1.32+0.075&&fTreeCascVarMassAsXi>1.32-0.075) ||
1436 (fTreeCascVarMassAsOmega<1.68+0.075&&fTreeCascVarMassAsOmega>1.68-0.075) ){
1437 fTreeCascade->Fill();
1438 }
1439
1440//------------------------------------------------
1441// Fill tree over.
1442//------------------------------------------------
1443
1444 }// end of the Cascade loop (ESD or AOD)
1445
1446 // Post output data.
1447 PostData(1, fListHist);
1448 PostData(2, fTreeCascade);
1449}
1450
1451//________________________________________________________________________
1452void AliAnalysisTaskExtractCascade::Terminate(Option_t *)
1453{
1454 // Draw result to the screen
1455 // Called once at the end of the query
1456
1457 TList *cRetrievedList = 0x0;
1458 cRetrievedList = (TList*)GetOutputData(1);
1459 if(!cRetrievedList){
1460 Printf("ERROR - AliAnalysisTaskExtractCascade : ouput data container list not available\n");
1461 return;
1462 }
1463
1464 fHistV0MultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistV0MultiplicityForTrigEvt") );
1465 if (!fHistV0MultiplicityForTrigEvt) {
1466 Printf("ERROR - AliAnalysisTaskExtractCascade : fHistV0MultiplicityForTrigEvt not available");
1467 return;
1468 }
1469
1470 TCanvas *canCheck = new TCanvas("AliAnalysisTaskExtractCascade","V0 Multiplicity",10,10,510,510);
1471 canCheck->cd(1)->SetLogy();
1472
1473 fHistV0MultiplicityForTrigEvt->SetMarkerStyle(22);
1474 fHistV0MultiplicityForTrigEvt->DrawCopy("E");
1475}
1476
1477//----------------------------------------------------------------------------
1478
1479Double_t AliAnalysisTaskExtractCascade::MyRapidity(Double_t rE, Double_t rPz) const
1480{
1481 // Local calculation for rapidity
1482 Double_t ReturnValue = -100;
1483 if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){
1484 ReturnValue = 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
1485 }
1486 return ReturnValue;
1487}