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 // This task is meant to explore the possibility of using a VZERO amplitude
19 // based multiplicity estimator for proton-proton collisions. For this, two
20 // main operation methods for this task are foreseen:
22 // 1) (under development) it should act as an auxiliary task and provide a
23 // calibrated estimator
25 // 2) "Debug mode" which will also create a ROOT TTree object with event
26 // by event info potentially used for exploration / calibration. This
27 // includes the following info:
29 // --- All VZERO Amplitudes (saved as Float_t)
30 // --- (optional) time for each channel
31 // --- (optional) time width for each channel
32 // --- GetReferenceMultiplicity Estimator, |eta|<0.5
33 // --- GetReferenceMultiplicity Estimator, |eta|<0.8
34 // --- (if MC) True Multiplicity, |eta|<0.5
35 // --- (if MC) True Multiplicity, 2.8 < eta < 5.8 (VZEROA region)
36 // --- (if MC) True Multiplicity, -3.7 < eta <-1.7 (VZEROC region)
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"
79 #include "AliCentrality.h"
80 #include "AliPPVsMultUtils.h"
82 #include "AliCFContainer.h"
83 #include "AliMultiplicity.h"
84 #include "AliAODMCParticle.h"
85 #include "AliESDcascade.h"
86 #include "AliAODcascade.h"
87 #include "AliESDUtils.h"
88 #include "AliGenEventHeader.h"
89 #include "AliAnalysisTaskSE.h"
90 #include "AliAnalysisUtils.h"
91 #include "AliAnalysisTaskStrangenessVsMultiplicity.h"
96 ClassImp(AliAnalysisTaskStrangenessVsMultiplicity)
98 AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity()
99 : AliAnalysisTaskSE(), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
100 fkSaveV0Tree ( kFALSE ),
101 fkSaveCascadeTree ( kTRUE ),
102 fkRunVertexers ( kTRUE ),
103 fkSkipEventSelection( kFALSE ),
104 //---> Variables for fTreeEvent
107 fAmplitude_V0AEq (0),
108 fAmplitude_V0CEq (0),
112 fCentrality_V0AEq(0),
113 fCentrality_V0CEq(0),
114 fCentrality_V0MEq(0),
115 fCustomCentrality_V0M(0),
116 fCustomCentrality_V0MEq(0),
120 fEvSel_HasAtLeastSPDVertex(0),
122 fEvSel_IsNotPileup(0),
123 fEvSel_IsNotPileupMV(0),
124 fEvSel_IsNotPileupInMultBins(0),
125 fEvSel_HasVtxContributor(0),
126 fEvSel_nTracklets(0),
127 fEvSel_nSPDClusters(0),
129 //---> Variables for fTreeV0
130 fTreeVariableChi2V0(0),
131 fTreeVariableDcaV0Daughters(0),
132 fTreeVariableDcaV0ToPrimVertex(0),
133 fTreeVariableDcaPosToPrimVertex(0),
134 fTreeVariableDcaNegToPrimVertex(0),
135 fTreeVariableV0CosineOfPointingAngle(0),
136 fTreeVariableV0Radius(0),
138 fTreeVariableRapK0Short(0),
139 fTreeVariableRapLambda(0),
140 fTreeVariableInvMassK0s(0),
141 fTreeVariableInvMassLambda(0),
142 fTreeVariableInvMassAntiLambda(0),
143 fTreeVariableAlphaV0(0),
144 fTreeVariablePtArmV0(0),
145 fTreeVariableNegEta(0),
146 fTreeVariablePosEta(0),
148 fTreeVariableNSigmasPosProton(0),
149 fTreeVariableNSigmasPosPion(0),
150 fTreeVariableNSigmasNegProton(0),
151 fTreeVariableNSigmasNegPion(0),
153 fTreeVariableDistOverTotMom(0),
154 fTreeVariableLeastNbrCrossedRows(0),
155 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
157 fTreeVariableCentV0A(0),
158 fTreeVariableCentV0C(0),
159 fTreeVariableCentV0M(0),
160 fTreeVariableCentV0AEq(0),
161 fTreeVariableCentV0CEq(0),
162 fTreeVariableCentV0MEq(0),
163 fTreeVariableAmpV0A(0),
164 fTreeVariableAmpV0C(0),
165 fTreeVariableAmpV0AEq(0),
166 fTreeVariableAmpV0CEq(0),
167 fTreeVariableRefMultEta8(0),
168 fTreeVariableRefMultEta5(0),
169 fTreeVariableRunNumber(0),
170 //---> Variables for fTreeCascade
171 fTreeCascVarCharge(0),
172 fTreeCascVarMassAsXi(0),
173 fTreeCascVarMassAsOmega(0),
175 fTreeCascVarRapXi(0),
176 fTreeCascVarRapOmega(0),
177 fTreeCascVarNegEta(0),
178 fTreeCascVarPosEta(0),
179 fTreeCascVarBachEta(0),
180 fTreeCascVarDCACascDaughters(0),
181 fTreeCascVarDCABachToPrimVtx(0),
182 fTreeCascVarDCAV0Daughters(0),
183 fTreeCascVarDCAV0ToPrimVtx(0),
184 fTreeCascVarDCAPosToPrimVtx(0),
185 fTreeCascVarDCANegToPrimVtx(0),
186 fTreeCascVarCascCosPointingAngle(0),
187 fTreeCascVarCascRadius(0),
188 fTreeCascVarV0Mass(0),
189 fTreeCascVarV0CosPointingAngle(0),
190 fTreeCascVarV0CosPointingAngleSpecial(0),
191 fTreeCascVarV0Radius(0),
192 fTreeCascVarLeastNbrClusters(0),
193 fTreeCascVarDistOverTotMom(0),
194 fTreeCascVarNegNSigmaPion(0),
195 fTreeCascVarNegNSigmaProton(0),
196 fTreeCascVarPosNSigmaPion(0),
197 fTreeCascVarPosNSigmaProton(0),
198 fTreeCascVarBachNSigmaPion(0),
199 fTreeCascVarBachNSigmaKaon(0),
200 fTreeCascVarCentV0A(0),
201 fTreeCascVarCentV0C(0),
202 fTreeCascVarCentV0M(0),
203 fTreeCascVarCentV0AEq(0),
204 fTreeCascVarCentV0CEq(0),
205 fTreeCascVarCentV0MEq(0),
206 fTreeCascVarAmpV0A(0),
207 fTreeCascVarAmpV0C(0),
208 fTreeCascVarAmpV0AEq(0),
209 fTreeCascVarAmpV0CEq(0),
210 fTreeCascVarRefMultEta8(0),
211 fTreeCascVarRefMultEta5(0),
212 fTreeCascVarRunNumber(0),
215 //------------------------------------------------
221 AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity(const char *name)
222 : AliAnalysisTaskSE(name), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
223 fkSaveV0Tree ( kFALSE ),
224 fkSaveCascadeTree ( kTRUE ),
225 fkRunVertexers ( kTRUE ),
226 fkSkipEventSelection( kFALSE ),
227 //---> Variables for fTreeEvent
230 fAmplitude_V0AEq (0),
231 fAmplitude_V0CEq (0),
235 fCentrality_V0AEq(0),
236 fCentrality_V0CEq(0),
237 fCentrality_V0MEq(0),
238 fCustomCentrality_V0M(0),
239 fCustomCentrality_V0MEq(0),
243 fEvSel_HasAtLeastSPDVertex(0),
245 fEvSel_IsNotPileup(0),
246 fEvSel_IsNotPileupMV(0),
247 fEvSel_IsNotPileupInMultBins(0),
248 fEvSel_HasVtxContributor(0),
249 fEvSel_nTracklets(0),
250 fEvSel_nSPDClusters(0),
252 //---> Variables for fTreeV0
253 fTreeVariableChi2V0(0),
254 fTreeVariableDcaV0Daughters(0),
255 fTreeVariableDcaV0ToPrimVertex(0),
256 fTreeVariableDcaPosToPrimVertex(0),
257 fTreeVariableDcaNegToPrimVertex(0),
258 fTreeVariableV0CosineOfPointingAngle(0),
259 fTreeVariableV0Radius(0),
261 fTreeVariableRapK0Short(0),
262 fTreeVariableRapLambda(0),
263 fTreeVariableInvMassK0s(0),
264 fTreeVariableInvMassLambda(0),
265 fTreeVariableInvMassAntiLambda(0),
266 fTreeVariableAlphaV0(0),
267 fTreeVariablePtArmV0(0),
268 fTreeVariableNegEta(0),
269 fTreeVariablePosEta(0),
271 fTreeVariableNSigmasPosProton(0),
272 fTreeVariableNSigmasPosPion(0),
273 fTreeVariableNSigmasNegProton(0),
274 fTreeVariableNSigmasNegPion(0),
276 fTreeVariableDistOverTotMom(0),
277 fTreeVariableLeastNbrCrossedRows(0),
278 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
280 fTreeVariableCentV0A(0),
281 fTreeVariableCentV0C(0),
282 fTreeVariableCentV0M(0),
283 fTreeVariableCentV0AEq(0),
284 fTreeVariableCentV0CEq(0),
285 fTreeVariableCentV0MEq(0),
286 fTreeVariableAmpV0A(0),
287 fTreeVariableAmpV0C(0),
288 fTreeVariableAmpV0AEq(0),
289 fTreeVariableAmpV0CEq(0),
290 fTreeVariableRefMultEta8(0),
291 fTreeVariableRefMultEta5(0),
292 fTreeVariableRunNumber(0),
293 //---> Variables for fTreeCascade
294 fTreeCascVarCharge(0),
295 fTreeCascVarMassAsXi(0),
296 fTreeCascVarMassAsOmega(0),
298 fTreeCascVarRapXi(0),
299 fTreeCascVarRapOmega(0),
300 fTreeCascVarNegEta(0),
301 fTreeCascVarPosEta(0),
302 fTreeCascVarBachEta(0),
303 fTreeCascVarDCACascDaughters(0),
304 fTreeCascVarDCABachToPrimVtx(0),
305 fTreeCascVarDCAV0Daughters(0),
306 fTreeCascVarDCAV0ToPrimVtx(0),
307 fTreeCascVarDCAPosToPrimVtx(0),
308 fTreeCascVarDCANegToPrimVtx(0),
309 fTreeCascVarCascCosPointingAngle(0),
310 fTreeCascVarCascRadius(0),
311 fTreeCascVarV0Mass(0),
312 fTreeCascVarV0CosPointingAngle(0),
313 fTreeCascVarV0CosPointingAngleSpecial(0),
314 fTreeCascVarV0Radius(0),
315 fTreeCascVarLeastNbrClusters(0),
316 fTreeCascVarDistOverTotMom(0),
317 fTreeCascVarNegNSigmaPion(0),
318 fTreeCascVarNegNSigmaProton(0),
319 fTreeCascVarPosNSigmaPion(0),
320 fTreeCascVarPosNSigmaProton(0),
321 fTreeCascVarBachNSigmaPion(0),
322 fTreeCascVarBachNSigmaKaon(0),
323 fTreeCascVarCentV0A(0),
324 fTreeCascVarCentV0C(0),
325 fTreeCascVarCentV0M(0),
326 fTreeCascVarCentV0AEq(0),
327 fTreeCascVarCentV0CEq(0),
328 fTreeCascVarCentV0MEq(0),
329 fTreeCascVarAmpV0A(0),
330 fTreeCascVarAmpV0C(0),
331 fTreeCascVarAmpV0AEq(0),
332 fTreeCascVarAmpV0CEq(0),
333 fTreeCascVarRefMultEta8(0),
334 fTreeCascVarRefMultEta5(0),
335 fTreeCascVarRunNumber(0),
340 //Re-vertex: Will only apply for cascade candidates
342 fV0VertexerSels[0] = 33. ; // max allowed chi2
343 fV0VertexerSels[1] = 0.02; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
344 fV0VertexerSels[2] = 0.02; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
345 fV0VertexerSels[4] = 0.95; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
346 fV0VertexerSels[5] = 1.0 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
347 fV0VertexerSels[6] = 200. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
349 fCascadeVertexerSels[0] = 33. ; // max allowed chi2 (same as PDC07)
350 fCascadeVertexerSels[1] = 0.05 ; // min allowed V0 impact parameter (PDC07 : 0.05 / LHC09a4 : 0.025 )
351 fCascadeVertexerSels[2] = 0.010; // "window" around the Lambda mass (PDC07 : 0.008 / LHC09a4 : 0.010 )
352 fCascadeVertexerSels[3] = 0.03 ; // min allowed bachelor's impact parameter (PDC07 : 0.035 / LHC09a4 : 0.025 )
353 fCascadeVertexerSels[4] = 2.0 ; // max allowed DCA between the V0 and the bachelor (PDC07 : 0.1 / LHC09a4 : 0.2 )
354 fCascadeVertexerSels[5] = 0.95 ; // min allowed cosine of the cascade pointing angle (PDC07 : 0.9985 / LHC09a4 : 0.998 )
355 fCascadeVertexerSels[6] = 0.4 ; // min radius of the fiducial volume (PDC07 : 0.9 / LHC09a4 : 0.2 )
356 fCascadeVertexerSels[7] = 100. ; // max radius of the fiducial volume (PDC07 : 100 / LHC09a4 : 100 )
359 DefineOutput(1, TList::Class()); // Event Counter Histo
360 DefineOutput(2, TTree::Class()); // Event Tree
361 DefineOutput(3, TTree::Class()); // V0 Tree
362 DefineOutput(4, TTree::Class()); // Cascade Tree
366 AliAnalysisTaskStrangenessVsMultiplicity::~AliAnalysisTaskStrangenessVsMultiplicity()
368 //------------------------------------------------
370 //------------------------------------------------
389 delete fPPVsMultUtils;
390 fPPVsMultUtils = 0x0;
398 //________________________________________________________________________
399 void AliAnalysisTaskStrangenessVsMultiplicity::UserCreateOutputObjects()
405 //------------------------------------------------
407 fTreeEvent = new TTree("fTreeEvent","Event");
409 //------------------------------------------------
410 // fTree Branch definitions - Event by Event info
411 //------------------------------------------------
413 //-----------BASIC-INFO---------------------------
415 //--- VZERO Data (Integrated)
416 fTreeEvent->Branch("fAmplitude_V0A",&fAmplitude_V0A,"fAmplitude_V0A/F");
417 fTreeEvent->Branch("fAmplitude_V0C",&fAmplitude_V0C,"fAmplitude_V0C/F");
418 fTreeEvent->Branch("fAmplitude_V0AEq",&fAmplitude_V0AEq,"fAmplitude_V0AEq/F");
419 fTreeEvent->Branch("fAmplitude_V0CEq",&fAmplitude_V0CEq,"fAmplitude_V0CEq/F");
421 //Info from AliCentrality (not necessarily 'centrality' per se)
422 fTreeEvent->Branch("fCentrality_V0A",&fCentrality_V0A,"fCentrality_V0A/F");
423 fTreeEvent->Branch("fCentrality_V0C",&fCentrality_V0C,"fCentrality_V0C/F");
424 fTreeEvent->Branch("fCentrality_V0M",&fCentrality_V0M,"fCentrality_V0M/F");
425 fTreeEvent->Branch("fCentrality_V0AEq",&fCentrality_V0AEq,"fCentrality_V0AEq/F");
426 fTreeEvent->Branch("fCentrality_V0CEq",&fCentrality_V0CEq,"fCentrality_V0CEq/F");
427 fTreeEvent->Branch("fCentrality_V0MEq",&fCentrality_V0MEq,"fCentrality_V0MEq/F");
428 fTreeEvent->Branch("fCustomCentrality_V0M",&fCustomCentrality_V0M,"fCustomCentrality_V0M/F");
429 fTreeEvent->Branch("fCustomCentrality_V0MEq",&fCustomCentrality_V0MEq,"fCustomCentrality_V0MEq/F");
431 //Official GetReferenceMultiplicity
432 fTreeEvent->Branch("fRefMultEta5",&fRefMultEta5,"fRefMultEta5/I");
433 fTreeEvent->Branch("fRefMultEta8",&fRefMultEta8,"fRefMultEta8/I");
436 fTreeEvent->Branch("fRunNumber", &fRunNumber, "fRunNumber/I");
438 //Booleans for Event Selection
439 fTreeEvent->Branch("fEvSel_HasAtLeastSPDVertex", &fEvSel_HasAtLeastSPDVertex, "fEvSel_HasAtLeastSPDVertex/O");
440 fTreeEvent->Branch("fEvSel_VtxZCut", &fEvSel_VtxZCut, "fEvSel_VtxZCut/O");
441 fTreeEvent->Branch("fEvSel_IsNotPileup", &fEvSel_IsNotPileup, "fEvSel_IsNotPileup/O");
442 fTreeEvent->Branch("fEvSel_IsNotPileupMV", &fEvSel_IsNotPileupMV, "fEvSel_IsNotPileupMV/O");
443 fTreeEvent->Branch("fEvSel_IsNotPileupInMultBins", &fEvSel_IsNotPileupInMultBins, "fEvSel_IsNotPileupInMultBins/O");
444 fTreeEvent->Branch("fEvSel_HasVtxContributor", &fEvSel_HasVtxContributor, "fEvSel_HasVtxContributor/O");
446 //Tracklets vs clusters test
447 fTreeEvent->Branch("fEvSel_nTracklets", &fEvSel_nTracklets, "fEvSel_nTracklets/I");
448 fTreeEvent->Branch("fEvSel_nSPDClusters", &fEvSel_nSPDClusters, "fEvSel_nSPDClusters/I");
450 //Create Basic V0 Output Tree
451 fTreeV0 = new TTree( "fTreeV0", "V0 Candidates");
453 //------------------------------------------------
454 // fTreeV0 Branch definitions
455 //------------------------------------------------
457 //-----------BASIC-INFO---------------------------
458 fTreeV0->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"fTreeVariableChi2V0/F");
459 fTreeV0->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
460 fTreeV0->Branch("fTreeVariableDcaV0ToPrimVertex",&fTreeVariableDcaV0ToPrimVertex,"fTreeVariableDcaV0ToPrimVertex/F");
461 fTreeV0->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
462 fTreeV0->Branch("fTreeVariableDcaNegToPrimVertex",&fTreeVariableDcaNegToPrimVertex,"fTreeVariableDcaNegToPrimVertex/F");
463 fTreeV0->Branch("fTreeVariableV0Radius",&fTreeVariableV0Radius,"fTreeVariableV0Radius/F");
464 fTreeV0->Branch("fTreeVariablePt",&fTreeVariablePt,"fTreeVariablePt/F");
465 fTreeV0->Branch("fTreeVariableRapK0Short",&fTreeVariableRapK0Short,"fTreeVariableRapK0Short/F");
466 fTreeV0->Branch("fTreeVariableRapLambda",&fTreeVariableRapLambda,"fTreeVariableRapLambda/F");
467 fTreeV0->Branch("fTreeVariableInvMassK0s",&fTreeVariableInvMassK0s,"fTreeVariableInvMassK0s/F");
468 fTreeV0->Branch("fTreeVariableInvMassLambda",&fTreeVariableInvMassLambda,"fTreeVariableInvMassLambda/F");
469 fTreeV0->Branch("fTreeVariableInvMassAntiLambda",&fTreeVariableInvMassAntiLambda,"fTreeVariableInvMassAntiLambda/F");
470 fTreeV0->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
471 fTreeV0->Branch("fTreeVariableAlphaV0",&fTreeVariableAlphaV0,"fTreeVariableAlphaV0/F");
472 fTreeV0->Branch("fTreeVariablePtArmV0",&fTreeVariablePtArmV0,"fTreeVariablePtArmV0/F");
473 fTreeV0->Branch("fTreeVariableLeastNbrCrossedRows",&fTreeVariableLeastNbrCrossedRows,"fTreeVariableLeastNbrCrossedRows/I");
474 fTreeV0->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
475 fTreeV0->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
476 fTreeV0->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
477 fTreeV0->Branch("fTreeVariableNSigmasPosPion",&fTreeVariableNSigmasPosPion,"fTreeVariableNSigmasPosPion/F");
478 fTreeV0->Branch("fTreeVariableNSigmasNegProton",&fTreeVariableNSigmasNegProton,"fTreeVariableNSigmasNegProton/F");
479 fTreeV0->Branch("fTreeVariableNSigmasNegPion",&fTreeVariableNSigmasNegPion,"fTreeVariableNSigmasNegPion/F");
480 fTreeV0->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
481 fTreeV0->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
482 //-----------MULTIPLICITY-INFO--------------------
483 fTreeV0->Branch("fTreeVariableCentV0A",&fTreeVariableCentV0A,"fTreeVariableCentV0A/F");
484 fTreeV0->Branch("fTreeVariableCentV0C",&fTreeVariableCentV0C,"fTreeVariableCentV0C/F");
485 fTreeV0->Branch("fTreeVariableCentV0M",&fTreeVariableCentV0M,"fTreeVariableCentV0M/F");
486 fTreeV0->Branch("fTreeVariableCentV0AEq",&fTreeVariableCentV0AEq,"fTreeVariableCentV0AEq/F");
487 fTreeV0->Branch("fTreeVariableCentV0CEq",&fTreeVariableCentV0CEq,"fTreeVariableCentV0CEq/F");
488 fTreeV0->Branch("fTreeVariableCentV0MEq",&fTreeVariableCentV0MEq,"fTreeVariableCentV0MEq/F");
489 fTreeV0->Branch("fTreeVariableAmpV0A",&fTreeVariableAmpV0A,"fTreeVariableAmpV0A/F");
490 fTreeV0->Branch("fTreeVariableAmpV0C",&fTreeVariableAmpV0C,"fTreeVariableAmpV0C/F");
491 fTreeV0->Branch("fTreeVariableAmpV0AEq",&fTreeVariableAmpV0AEq,"fTreeVariableAmpV0AEq/F");
492 fTreeV0->Branch("fTreeVariableAmpV0CEq",&fTreeVariableAmpV0CEq,"fTreeVariableAmpV0CEq/F");
493 fTreeV0->Branch("fTreeVariableRefMultEta8",&fTreeVariableRefMultEta8,"fTreeVariableRefMultEta8/I");
494 fTreeV0->Branch("fTreeVariableRefMultEta5",&fTreeVariableRefMultEta5,"fTreeVariableRefMultEta5/I");
495 fTreeV0->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
496 //------------------------------------------------
498 //Create Cascade output tree
499 fTreeCascade = new TTree("fTreeCascade","CascadeCandidates");
501 //------------------------------------------------
502 // fTreeCascade Branch definitions - Cascade Tree
503 //------------------------------------------------
505 //-----------BASIC-INFO---------------------------
506 fTreeCascade->Branch("fTreeCascVarCharge",&fTreeCascVarCharge,"fTreeCascVarCharge/I");
507 fTreeCascade->Branch("fTreeCascVarMassAsXi",&fTreeCascVarMassAsXi,"fTreeCascVarMassAsXi/F");
508 fTreeCascade->Branch("fTreeCascVarMassAsOmega",&fTreeCascVarMassAsOmega,"fTreeCascVarMassAsOmega/F");
509 fTreeCascade->Branch("fTreeCascVarPt",&fTreeCascVarPt,"fTreeCascVarPt/F");
510 fTreeCascade->Branch("fTreeCascVarRapXi",&fTreeCascVarRapXi,"fTreeCascVarRapXi/F");
511 fTreeCascade->Branch("fTreeCascVarRapOmega",&fTreeCascVarRapOmega,"fTreeCascVarRapOmega/F");
512 fTreeCascade->Branch("fTreeCascVarNegEta",&fTreeCascVarNegEta,"fTreeCascVarNegEta/F");
513 fTreeCascade->Branch("fTreeCascVarPosEta",&fTreeCascVarPosEta,"fTreeCascVarPosEta/F");
514 fTreeCascade->Branch("fTreeCascVarBachEta",&fTreeCascVarBachEta,"fTreeCascVarBachEta/F");
515 //-----------INFO-FOR-CUTS------------------------
516 fTreeCascade->Branch("fTreeCascVarDCACascDaughters",&fTreeCascVarDCACascDaughters,"fTreeCascVarDCACascDaughters/F");
517 fTreeCascade->Branch("fTreeCascVarDCABachToPrimVtx",&fTreeCascVarDCABachToPrimVtx,"fTreeCascVarDCABachToPrimVtx/F");
518 fTreeCascade->Branch("fTreeCascVarDCAV0Daughters",&fTreeCascVarDCAV0Daughters,"fTreeCascVarDCAV0Daughters/F");
519 fTreeCascade->Branch("fTreeCascVarDCAV0ToPrimVtx",&fTreeCascVarDCAV0ToPrimVtx,"fTreeCascVarDCAV0ToPrimVtx/F");
520 fTreeCascade->Branch("fTreeCascVarDCAPosToPrimVtx",&fTreeCascVarDCAPosToPrimVtx,"fTreeCascVarDCAPosToPrimVtx/F");
521 fTreeCascade->Branch("fTreeCascVarDCANegToPrimVtx",&fTreeCascVarDCANegToPrimVtx,"fTreeCascVarDCANegToPrimVtx/F");
522 fTreeCascade->Branch("fTreeCascVarCascCosPointingAngle",&fTreeCascVarCascCosPointingAngle,"fTreeCascVarCascCosPointingAngle/F");
523 fTreeCascade->Branch("fTreeCascVarCascRadius",&fTreeCascVarCascRadius,"fTreeCascVarCascRadius/F");
524 fTreeCascade->Branch("fTreeCascVarV0Mass",&fTreeCascVarV0Mass,"fTreeCascVarV0Mass/F");
525 fTreeCascade->Branch("fTreeCascVarV0CosPointingAngle",&fTreeCascVarV0CosPointingAngle,"fTreeCascVarV0CosPointingAngle/F");
526 fTreeCascade->Branch("fTreeCascVarV0CosPointingAngleSpecial",&fTreeCascVarV0CosPointingAngleSpecial,"fTreeCascVarV0CosPointingAngleSpecial/F");
527 fTreeCascade->Branch("fTreeCascVarV0Radius",&fTreeCascVarV0Radius,"fTreeCascVarV0Radius/F");
528 fTreeCascade->Branch("fTreeCascVarLeastNbrClusters",&fTreeCascVarLeastNbrClusters,"fTreeCascVarLeastNbrClusters/I");
529 //-----------MULTIPLICITY-INFO--------------------
530 fTreeCascade->Branch("fTreeCascVarCentV0A",&fTreeCascVarCentV0A,"fTreeCascVarCentV0A/F");
531 fTreeCascade->Branch("fTreeCascVarCentV0C",&fTreeCascVarCentV0C,"fTreeCascVarCentV0C/F");
532 fTreeCascade->Branch("fTreeCascVarCentV0M",&fTreeCascVarCentV0M,"fTreeCascVarCentV0M/F");
533 fTreeCascade->Branch("fTreeCascVarCentV0AEq",&fTreeCascVarCentV0AEq,"fTreeCascVarCentV0AEq/F");
534 fTreeCascade->Branch("fTreeCascVarCentV0CEq",&fTreeCascVarCentV0CEq,"fTreeCascVarCentV0CEq/F");
535 fTreeCascade->Branch("fTreeCascVarCentV0MEq",&fTreeCascVarCentV0MEq,"fTreeCascVarCentV0MEq/F");
536 fTreeCascade->Branch("fTreeCascVarAmpV0A",&fTreeCascVarAmpV0A,"fTreeCascVarAmpV0A/F");
537 fTreeCascade->Branch("fTreeCascVarAmpV0C",&fTreeCascVarAmpV0C,"fTreeCascVarAmpV0C/F");
538 fTreeCascade->Branch("fTreeCascVarAmpV0AEq",&fTreeCascVarAmpV0AEq,"fTreeCascVarAmpV0AEq/F");
539 fTreeCascade->Branch("fTreeCascVarAmpV0CEq",&fTreeCascVarAmpV0CEq,"fTreeCascVarAmpV0CEq/F");
540 fTreeCascade->Branch("fTreeCascVarRefMultEta8",&fTreeCascVarRefMultEta8,"fTreeCascVarRefMultEta8/I");
541 fTreeCascade->Branch("fTreeCascVarRefMultEta5",&fTreeCascVarRefMultEta5,"fTreeCascVarRefMultEta5/I");
542 fTreeCascade->Branch("fTreeCascVarRunNumber",&fTreeCascVarRunNumber,"fTreeCascVarRunNumber/I");
543 //-----------DECAY-LENGTH-INFO--------------------
544 fTreeCascade->Branch("fTreeCascVarDistOverTotMom",&fTreeCascVarDistOverTotMom,"fTreeCascVarDistOverTotMom/F");
545 //------------------------------------------------
546 fTreeCascade->Branch("fTreeCascVarNegNSigmaPion",&fTreeCascVarNegNSigmaPion,"fTreeCascVarNegNSigmaPion/F");
547 fTreeCascade->Branch("fTreeCascVarNegNSigmaProton",&fTreeCascVarNegNSigmaProton,"fTreeCascVarNegNSigmaProton/F");
548 fTreeCascade->Branch("fTreeCascVarPosNSigmaPion",&fTreeCascVarPosNSigmaPion,"fTreeCascVarPosNSigmaPion/F");
549 fTreeCascade->Branch("fTreeCascVarPosNSigmaProton",&fTreeCascVarPosNSigmaProton,"fTreeCascVarPosNSigmaProton/F");
550 fTreeCascade->Branch("fTreeCascVarBachNSigmaPion",&fTreeCascVarBachNSigmaPion,"fTreeCascVarBachNSigmaPion/F");
551 fTreeCascade->Branch("fTreeCascVarBachNSigmaKaon",&fTreeCascVarBachNSigmaKaon,"fTreeCascVarBachNSigmaKaon/F");
553 //------------------------------------------------
554 // Particle Identification Setup
555 //------------------------------------------------
557 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
558 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
559 fPIDResponse = inputHandler->GetPIDResponse();
562 if(! fESDtrackCuts ){
563 fESDtrackCuts = new AliESDtrackCuts();
566 if(! fPPVsMultUtils ){
567 fPPVsMultUtils = new AliPPVsMultUtils();
571 fUtils = new AliAnalysisUtils();
574 //------------------------------------------------
575 // V0 Multiplicity Histograms
576 //------------------------------------------------
580 fListHist = new TList();
581 fListHist->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
583 if(! fHistEventCounter ) {
584 //Histogram Output: Event-by-Event
585 fHistEventCounter = new TH1D( "fHistEventCounter", ";Evt. Sel. Step;Count",5,0,5);
586 fHistEventCounter->GetXaxis()->SetBinLabel(1, "Processed");
587 fHistEventCounter->GetXaxis()->SetBinLabel(2, "Phys-Sel");
588 fHistEventCounter->GetXaxis()->SetBinLabel(3, "Has Vtx");
589 fHistEventCounter->GetXaxis()->SetBinLabel(4, "Vtx |z|<10cm");
590 fHistEventCounter->GetXaxis()->SetBinLabel(5, "Isn't Pileup");
591 fListHist->Add(fHistEventCounter);
594 //List of Histograms: Normal
595 PostData(1, fListHist);
597 //TTree Object: Saved to base directory. Should cache to disk while saving.
598 //(Important to avoid excessive memory usage, particularly when merging)
599 PostData(2, fTreeEvent);
600 PostData(3, fTreeV0);
601 PostData(4, fTreeCascade);
603 }// end UserCreateOutputObjects
606 //________________________________________________________________________
607 void AliAnalysisTaskStrangenessVsMultiplicity::UserExec(Option_t *)
610 // Called for each event
612 AliESDEvent *lESDevent = 0x0;
614 //Zero all booleans, etc
615 fEvSel_HasAtLeastSPDVertex = kFALSE;
616 fEvSel_VtxZCut = kFALSE;
617 fEvSel_IsNotPileup = kFALSE;
618 fEvSel_IsNotPileupInMultBins = kFALSE;
619 fEvSel_HasVtxContributor = kFALSE;
621 fEvSel_nTracklets = -1;
622 fEvSel_nSPDClusters = -1;
624 // Connect to the InputEvent
625 // After these lines, we should have an ESD/AOD event + the number of V0s in it.
627 // Appropriate for ESD analysis!
629 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
631 AliWarning("ERROR: lESDevent not available \n");
635 //Get VZERO Information for multiplicity later
636 AliVVZERO* esdV0 = lESDevent->GetVZEROData();
638 AliError("AliVVZERO not available");
642 fRunNumber = lESDevent->GetRunNumber();
644 Double_t lMagneticField = -10;
645 lMagneticField = lESDevent->GetMagneticField( );
647 //------------------------------------------------
648 // Variable Definition
649 //------------------------------------------------
651 //------------------------------------------------
653 //------------------------------------------------
655 fHistEventCounter->Fill(0.5);
657 UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
658 Bool_t isSelected = 0;
659 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
661 //Standard Min-Bias Selection - always do this!
662 if ( ! isSelected ) {
663 PostData(1, fListHist);
664 PostData(2, fTreeEvent);
665 PostData(3, fTreeV0);
666 PostData(4, fTreeCascade);
670 fHistEventCounter->Fill(1.5);
672 //------------------------------------------------
673 // Primary Vertex Requirements Section:
674 // ---> pp: has vertex, |z|<10cm
675 //------------------------------------------------
677 //classical Proton-proton like selection
678 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
679 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
680 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
682 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
683 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
685 //Only accept if Tracking or SPD vertex is fine
686 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() && !fkSkipEventSelection ){
687 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
688 PostData(1, fListHist);
689 PostData(2, fTreeEvent);
690 PostData(3, fTreeV0);
691 PostData(4, fTreeCascade);
695 if(! (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus()) ){
697 fEvSel_HasAtLeastSPDVertex = kTRUE;
700 //Has SPD or Tracking Vertex
701 fHistEventCounter -> Fill(2.5);
703 //Always do Primary Vertex Selection
704 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && !fkSkipEventSelection ) {
705 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
706 PostData(1, fListHist);
707 PostData(2, fTreeEvent);
708 PostData(3, fTreeV0);
709 PostData(4, fTreeCascade);
713 if(TMath::Abs(lBestPrimaryVtxPos[2]) <= 10.0 ){
715 fEvSel_VtxZCut = kTRUE;
718 //Fill Event selected counter
719 fHistEventCounter -> Fill(3.5);
721 //------------------------------------------------
722 // Check if this isn't pileup
723 //------------------------------------------------
725 if(lESDevent->IsPileupFromSPDInMultBins() && !fkSkipEventSelection ){
726 // minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.
727 //-> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
728 AliWarning("Pb / Event tagged as pile-up by SPD... return !");
729 PostData(1, fListHist);
730 PostData(2, fTreeEvent);
731 PostData(3, fTreeV0);
732 PostData(4, fTreeCascade);
736 if( !lESDevent->IsPileupFromSPD() ) fEvSel_IsNotPileup = kTRUE;
737 if( !lESDevent->IsPileupFromSPDInMultBins() ) fEvSel_IsNotPileupInMultBins = kTRUE;
739 //First implementation of pileup from multi-vertexer (simple use of analysis utils)
740 if ( !fUtils->IsPileUpMV( lESDevent ) ) fEvSel_IsNotPileupMV = kTRUE;
742 //Fill Event isn't pileup counter
743 fHistEventCounter -> Fill(4.5);
745 //------------------------------------------------
746 // Multiplicity Information Acquistion
747 //------------------------------------------------
749 //Standard GetReferenceMultiplicity Estimator (0.5 and 0.8)
750 fRefMultEta5 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
751 fRefMultEta8 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.8);
754 Float_t multV0A = 0; // multiplicity from V0 reco side A
755 Float_t multV0C = 0; // multiplicity from V0 reco side C
756 Float_t multV0AEq = 0; // multiplicity from V0 reco side A
757 Float_t multV0CEq = 0; // multiplicity from V0 reco side C
758 Float_t multV0ACorr = 0; // multiplicity from V0 reco side A
759 Float_t multV0CCorr = 0; // multiplicity from V0 reco side C
761 //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
762 //Getters for uncorrected multiplicity
763 multV0A=esdV0->GetMTotV0A();
764 multV0C=esdV0->GetMTotV0C();
766 //Get Z vertex position of SPD vertex (why not Tracking if available?)
767 Float_t zvtx = lPrimarySPDVtx->GetZ();
769 //Acquire Corrected multV0A
770 multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
771 multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
773 //Copy to Event Tree for extra information
774 fAmplitude_V0A = multV0ACorr;
775 fAmplitude_V0C = multV0CCorr;
777 // Equalized signals // From AliCentralitySelectionTask // Updated
778 for(Int_t iCh = 32; iCh < 64; ++iCh) {
779 Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
782 for(Int_t iCh = 0; iCh < 32; ++iCh) {
783 Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
786 fAmplitude_V0AEq = multV0AEq;
787 fAmplitude_V0CEq = multV0CEq;
789 fCentrality_V0A = -100;
790 fCentrality_V0C = -100;
791 fCentrality_V0M = -100;
792 fCentrality_V0AEq = -100;
793 fCentrality_V0CEq = -100;
794 fCentrality_V0MEq = -100;
796 //AliCentrality... Check if working?
797 AliCentrality* centrality;
798 centrality = lESDevent->GetCentrality();
799 if ( !(centrality->GetQuality()>1) ){
800 fCentrality_V0A = centrality->GetCentralityPercentile( "V0A" );
801 fCentrality_V0C = centrality->GetCentralityPercentile( "V0C" );
802 fCentrality_V0M = centrality->GetCentralityPercentile( "V0M" );
803 fCentrality_V0AEq = centrality->GetCentralityPercentile( "V0AEq" );
804 fCentrality_V0CEq = centrality->GetCentralityPercentile( "V0CEq" );
805 fCentrality_V0MEq = centrality->GetCentralityPercentile( "V0MEq" );
809 fCustomCentrality_V0M = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0M");
810 fCustomCentrality_V0MEq = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0MEq");
812 //Tracklets vs Clusters Exploratory data
813 fEvSel_nTracklets = lESDevent->GetMultiplicity()->GetNumberOfTracklets();
814 fEvSel_nSPDClusters = lESDevent->GetNumberOfITSClusters(0) + lESDevent->GetNumberOfITSClusters(1);
819 //STOP HERE if skipping event selections (no point in doing the rest...)
820 if( fkSkipEventSelection ){
821 PostData(1, fListHist);
822 PostData(2, fTreeEvent);
823 PostData(3, fTreeV0);
824 PostData(4, fTreeCascade);
828 //------------------------------------------------
830 //------------------------------------------------
831 // Fill V0 Tree as needed
832 //------------------------------------------------
834 //Variable definition
835 Int_t lOnFlyStatus = 0;// nv0sOn = 0, nv0sOff = 0;
836 Double_t lChi2V0 = 0;
837 Double_t lDcaV0Daughters = 0, lDcaV0ToPrimVertex = 0;
838 Double_t lDcaPosToPrimVertex = 0, lDcaNegToPrimVertex = 0;
839 Double_t lV0CosineOfPointingAngle = 0;
840 Double_t lV0Radius = 0, lPt = 0;
841 Double_t lRapK0Short = 0, lRapLambda = 0;
842 Double_t lInvMassK0s = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
843 Double_t lAlphaV0 = 0, lPtArmV0 = 0;
845 Double_t fMinV0Pt = 0;
846 Double_t fMaxV0Pt = 100;
849 nv0s = lESDevent->GetNumberOfV0s();
851 for (Int_t iV0 = 0; iV0 < nv0s; iV0++) //extra-crazy test
852 {// This is the begining of the V0 loop
853 AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
856 Double_t tDecayVertexV0[3]; v0->GetXYZ(tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]);
859 v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] );
860 Double_t lV0TotalMomentum = TMath::Sqrt(
861 tV0mom[0]*tV0mom[0]+tV0mom[1]*tV0mom[1]+tV0mom[2]*tV0mom[2] );
863 lV0Radius = TMath::Sqrt(tDecayVertexV0[0]*tDecayVertexV0[0]+tDecayVertexV0[1]*tDecayVertexV0[1]);
866 lRapK0Short = v0->RapK0Short();
867 lRapLambda = v0->RapLambda();
868 if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
870 UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
871 UInt_t lKeyNeg = (UInt_t)TMath::Abs(v0->GetNindex());
873 Double_t lMomPos[3]; v0->GetPPxPyPz(lMomPos[0],lMomPos[1],lMomPos[2]);
874 Double_t lMomNeg[3]; v0->GetNPxPyPz(lMomNeg[0],lMomNeg[1],lMomNeg[2]);
876 AliESDtrack *pTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyPos);
877 AliESDtrack *nTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyNeg);
878 if (!pTrack || !nTrack) {
879 Printf("ERROR: Could not retreive one of the daughter track");
883 //Daughter Eta for Eta selection, afterwards
884 fTreeVariableNegEta = nTrack->Eta();
885 fTreeVariablePosEta = pTrack->Eta();
887 // Filter like-sign V0 (next: add counter and distribution)
888 if ( pTrack->GetSign() == nTrack->GetSign()){
892 //________________________________________________________________________
893 // Track quality cuts
894 Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
895 Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
896 fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
897 if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
898 fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
900 // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
901 if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
902 if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
905 if ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) ) continue;
907 //GetKinkIndex condition
908 if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
910 //Findable clusters > 0 condition
911 if( pTrack->GetTPCNclsF()<=0 || nTrack->GetTPCNclsF()<=0 ) continue;
913 //Compute ratio Crossed Rows / Findable clusters
914 //Note: above test avoids division by zero!
915 Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF()));
916 Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF()));
918 fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
919 if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
920 fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
922 //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
923 if ( fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8 ) continue;
925 //End track Quality Cuts
926 //________________________________________________________________________
928 lDcaPosToPrimVertex = TMath::Abs(pTrack->GetD(lBestPrimaryVtxPos[0],
929 lBestPrimaryVtxPos[1],
932 lDcaNegToPrimVertex = TMath::Abs(nTrack->GetD(lBestPrimaryVtxPos[0],
933 lBestPrimaryVtxPos[1],
936 lOnFlyStatus = v0->GetOnFlyStatus();
937 lChi2V0 = v0->GetChi2V0();
938 lDcaV0Daughters = v0->GetDcaV0Daughters();
939 lDcaV0ToPrimVertex = v0->GetD(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
940 lV0CosineOfPointingAngle = v0->GetV0CosineOfPointingAngle(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
941 fTreeVariableV0CosineOfPointingAngle=lV0CosineOfPointingAngle;
943 // Getting invariant mass infos directly from ESD
944 v0->ChangeMassHypothesis(310);
945 lInvMassK0s = v0->GetEffMass();
946 v0->ChangeMassHypothesis(3122);
947 lInvMassLambda = v0->GetEffMass();
948 v0->ChangeMassHypothesis(-3122);
949 lInvMassAntiLambda = v0->GetEffMass();
950 lAlphaV0 = v0->AlphaV0();
951 lPtArmV0 = v0->PtArmV0();
953 fTreeVariablePt = v0->Pt();
954 fTreeVariableChi2V0 = lChi2V0;
955 fTreeVariableDcaV0ToPrimVertex = lDcaV0ToPrimVertex;
956 fTreeVariableDcaV0Daughters = lDcaV0Daughters;
957 fTreeVariableV0CosineOfPointingAngle = lV0CosineOfPointingAngle;
958 fTreeVariableV0Radius = lV0Radius;
959 fTreeVariableDcaPosToPrimVertex = lDcaPosToPrimVertex;
960 fTreeVariableDcaNegToPrimVertex = lDcaNegToPrimVertex;
961 fTreeVariableInvMassK0s = lInvMassK0s;
962 fTreeVariableInvMassLambda = lInvMassLambda;
963 fTreeVariableInvMassAntiLambda = lInvMassAntiLambda;
964 fTreeVariableRapK0Short = lRapK0Short;
965 fTreeVariableRapLambda = lRapLambda;
966 fTreeVariableAlphaV0 = lAlphaV0;
967 fTreeVariablePtArmV0 = lPtArmV0;
969 //Official means of acquiring N-sigmas
970 fTreeVariableNSigmasPosProton = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kProton );
971 fTreeVariableNSigmasPosPion = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kPion );
972 fTreeVariableNSigmasNegProton = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kProton );
973 fTreeVariableNSigmasNegPion = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
975 //This requires an Invariant Mass Hypothesis afterwards
976 fTreeVariableDistOverTotMom = TMath::Sqrt(
977 TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
978 TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
979 TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
981 fTreeVariableDistOverTotMom /= (lV0TotalMomentum+1e-10); //avoid division by zero, to be sure
983 //Copy Multiplicity information
984 fTreeVariableCentV0A = fCentrality_V0A;
985 fTreeVariableCentV0C = fCentrality_V0C;
986 fTreeVariableCentV0M = fCentrality_V0M;
987 fTreeVariableCentV0AEq = fCentrality_V0AEq;
988 fTreeVariableCentV0CEq = fCentrality_V0CEq;
989 fTreeVariableCentV0MEq = fCentrality_V0MEq;
990 fTreeVariableAmpV0A = fAmplitude_V0A;
991 fTreeVariableAmpV0C = fAmplitude_V0C;
992 fTreeVariableAmpV0AEq = fAmplitude_V0AEq;
993 fTreeVariableAmpV0CEq = fAmplitude_V0CEq;
994 fTreeVariableRefMultEta8 = fRefMultEta8;
995 fTreeVariableRefMultEta5 = fRefMultEta5;
996 fTreeVariableRunNumber = fRunNumber;
998 //------------------------------------------------
1000 //------------------------------------------------
1002 // The conditionals are meant to decrease excessive
1005 //First Selection: Reject OnFly
1006 if( lOnFlyStatus == 0 ){
1007 //Second Selection: rough 20-sigma band, parametric.
1008 //K0Short: Enough to parametrize peak broadening with linear function.
1009 Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt;
1010 Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
1011 //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
1012 //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
1013 Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt);
1014 Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
1016 if( (fTreeVariableInvMassLambda < lUpperLimitLambda && fTreeVariableInvMassLambda > lLowerLimitLambda ) ||
1017 (fTreeVariableInvMassAntiLambda < lUpperLimitLambda && fTreeVariableInvMassAntiLambda > lLowerLimitLambda ) ||
1018 (fTreeVariableInvMassK0s < lUpperLimitK0Short && fTreeVariableInvMassK0s > lLowerLimitK0Short ) ){
1019 //Pre-selection in case this is AA...
1020 if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && fkSaveV0Tree ) fTreeV0->Fill();
1023 }// This is the end of the V0 loop
1025 //------------------------------------------------
1026 // Fill V0 tree over.
1027 //------------------------------------------------
1031 //------------------------------------------------
1032 // Rerun cascade vertexer!
1033 //------------------------------------------------
1035 if( fkRunVertexers ){
1036 lESDevent->ResetCascades();
1037 lESDevent->ResetV0s();
1039 AliV0vertexer lV0vtxer;
1040 AliCascadeVertexer lCascVtxer;
1042 lV0vtxer.SetDefaultCuts(fV0VertexerSels);
1043 lCascVtxer.SetDefaultCuts(fCascadeVertexerSels);
1045 lV0vtxer.Tracks2V0vertices(lESDevent);
1046 lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1049 //------------------------------------------------
1050 // MAIN CASCADE LOOP STARTS HERE
1051 //------------------------------------------------
1052 // Code Credit: Antonin Maire (thanks^100)
1053 // ---> This is an adaptation
1055 Long_t ncascades = 0;
1056 ncascades = lESDevent->GetNumberOfCascades();
1058 for (Int_t iXi = 0; iXi < ncascades; iXi++){
1059 //------------------------------------------------
1061 //------------------------------------------------
1062 //Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1063 //Double_t lBestPrimaryVtxRadius3D = -500.0;
1065 // - 1st part of initialisation : variables needed to store AliESDCascade data members
1066 Double_t lEffMassXi = 0. ;
1067 //Double_t lChi2Xi = -1. ;
1068 Double_t lDcaXiDaughters = -1. ;
1069 Double_t lXiCosineOfPointingAngle = -1. ;
1070 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1071 Double_t lXiRadius = -1000. ;
1073 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1074 Int_t lPosTPCClusters = -1; // For ESD only ...//FIXME : wait for availability in AOD
1075 Int_t lNegTPCClusters = -1; // For ESD only ...
1076 Int_t lBachTPCClusters = -1; // For ESD only ...
1078 // - 3rd part of initialisation : about V0 part in cascades
1079 Double_t lInvMassLambdaAsCascDghter = 0.;
1080 //Double_t lV0Chi2Xi = -1. ;
1081 Double_t lDcaV0DaughtersXi = -1.;
1083 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1084 Double_t lDcaPosToPrimVertexXi = -1.;
1085 Double_t lDcaNegToPrimVertexXi = -1.;
1086 Double_t lV0CosineOfPointingAngleXi = -1. ;
1087 Double_t lV0CosineOfPointingAngleXiSpecial = -1. ;
1088 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1089 Double_t lV0RadiusXi = -1000.0;
1090 Double_t lV0quality = 0.;
1092 // - 4th part of initialisation : Effective masses
1093 Double_t lInvMassXiMinus = 0.;
1094 Double_t lInvMassXiPlus = 0.;
1095 Double_t lInvMassOmegaMinus = 0.;
1096 Double_t lInvMassOmegaPlus = 0.;
1098 // - 6th part of initialisation : extra info for QA
1099 Double_t lXiMomX = 0. , lXiMomY = 0., lXiMomZ = 0.;
1100 Double_t lXiTransvMom = 0. ;
1101 //Double_t lXiTransvMomMC= 0. ;
1102 Double_t lXiTotMom = 0. ;
1104 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1105 //Double_t lBachTransvMom = 0.;
1106 //Double_t lBachTotMom = 0.;
1108 fTreeCascVarNegNSigmaPion = -100;
1109 fTreeCascVarNegNSigmaProton = -100;
1110 fTreeCascVarPosNSigmaPion = -100;
1111 fTreeCascVarPosNSigmaProton = -100;
1112 fTreeCascVarBachNSigmaPion = -100;
1113 fTreeCascVarBachNSigmaKaon = -100;
1115 Short_t lChargeXi = -2;
1116 //Double_t lV0toXiCosineOfPointingAngle = 0. ;
1118 Double_t lRapXi = -20.0, lRapOmega = -20.0; // lEta = -20.0, lTheta = 360., lPhi = 720. ;
1119 //Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1121 // -------------------------------------
1122 // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1124 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1127 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1130 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1132 lEffMassXi = xi->GetEffMassXi();
1133 //lChi2Xi = xi->GetChi2Xi();
1134 lDcaXiDaughters = xi->GetDcaXiDaughters();
1135 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1136 lBestPrimaryVtxPos[1],
1137 lBestPrimaryVtxPos[2] );
1138 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1140 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1141 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1143 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1144 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1147 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1148 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1149 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1150 // Care track label can be negative in MC production (linked with the track quality)
1151 // However = normally, not the case for track index ...
1153 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1154 if(lBachIdx == lIdxNegXi) {
1155 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1157 if(lBachIdx == lIdxPosXi) {
1158 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1161 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1162 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1163 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1165 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1166 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1170 fTreeCascVarPosEta = pTrackXi->Eta();
1171 fTreeCascVarNegEta = nTrackXi->Eta();
1172 fTreeCascVarBachEta = bachTrackXi->Eta();
1174 Double_t lBMom[3], lNMom[3], lPMom[3];
1175 xi->GetBPxPyPz( lBMom[0], lBMom[1], lBMom[2] );
1176 xi->GetPPxPyPz( lPMom[0], lPMom[1], lPMom[2] );
1177 xi->GetNPxPyPz( lNMom[0], lNMom[1], lNMom[2] );
1179 //fTreeCascVarBachTransMom = TMath::Sqrt( lBMom[0]*lBMom[0] + lBMom[1]*lBMom[1] );
1180 //fTreeCascVarPosTransMom = TMath::Sqrt( lPMom[0]*lPMom[0] + lPMom[1]*lPMom[1] );
1181 //fTreeCascVarNegTransMom = TMath::Sqrt( lNMom[0]*lNMom[0] + lNMom[1]*lNMom[1] );
1183 //------------------------------------------------
1184 // TPC dEdx information
1185 //------------------------------------------------
1186 fTreeCascVarNegNSigmaPion = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kPion );
1187 fTreeCascVarNegNSigmaProton = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kProton );
1188 fTreeCascVarPosNSigmaPion = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kPion );
1189 fTreeCascVarPosNSigmaProton = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kProton );
1190 fTreeCascVarBachNSigmaPion = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kPion );
1191 fTreeCascVarBachNSigmaKaon = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kKaon );
1193 //------------------------------------------------
1194 // TPC Number of clusters info
1195 // --- modified to save the smallest number
1196 // --- of TPC clusters for the 3 tracks
1197 //------------------------------------------------
1199 lPosTPCClusters = pTrackXi->GetTPCNcls();
1200 lNegTPCClusters = nTrackXi->GetTPCNcls();
1201 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1203 // 1 - Poor quality related to TPCrefit
1204 ULong_t pStatus = pTrackXi->GetStatus();
1205 ULong_t nStatus = nTrackXi->GetStatus();
1206 ULong_t bachStatus = bachTrackXi->GetStatus();
1208 //fTreeCascVarkITSRefitBachelor = kTRUE;
1209 //fTreeCascVarkITSRefitNegative = kTRUE;
1210 //fTreeCascVarkITSRefitPositive = kTRUE;
1212 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1213 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1214 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1216 // 2 - Poor quality related to TPC clusters: lowest cut of 70 clusters
1217 if(lPosTPCClusters < 70) { AliWarning("Pb / V0 Pos. track has less than 70 TPC clusters ... continue!"); continue; }
1218 if(lNegTPCClusters < 70) { AliWarning("Pb / V0 Neg. track has less than 70 TPC clusters ... continue!"); continue; }
1219 if(lBachTPCClusters < 70) { AliWarning("Pb / Bach. track has less than 70 TPC clusters ... continue!"); continue; }
1220 Int_t leastnumberofclusters = 1000;
1221 if( lPosTPCClusters < leastnumberofclusters ) leastnumberofclusters = lPosTPCClusters;
1222 if( lNegTPCClusters < leastnumberofclusters ) leastnumberofclusters = lNegTPCClusters;
1223 if( lBachTPCClusters < leastnumberofclusters ) leastnumberofclusters = lBachTPCClusters;
1225 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1226 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1227 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1228 //lV0Chi2Xi = xi->GetChi2V0();
1230 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1231 lBestPrimaryVtxPos[1],
1232 lBestPrimaryVtxPos[2] );
1233 //Modification: V0 CosPA wrt to Cascade decay vertex
1234 lV0CosineOfPointingAngleXiSpecial = xi->GetV0CosineOfPointingAngle( lPosXi[0],
1238 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1239 lBestPrimaryVtxPos[1],
1240 lBestPrimaryVtxPos[2] );
1242 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1243 lBestPrimaryVtxPos[1],
1245 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1247 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1248 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1250 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1251 lBestPrimaryVtxPos[1],
1254 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1255 lBestPrimaryVtxPos[1],
1258 // - II.Step 4 : around effective masses (ESD)
1259 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1261 if( bachTrackXi->Charge() < 0 ) {
1263 xi->ChangeMassHypothesis(lV0quality , 3312);
1264 // Calculate the effective mass of the Xi- candidate.
1265 // pdg code 3312 = Xi-
1266 lInvMassXiMinus = xi->GetEffMassXi();
1269 xi->ChangeMassHypothesis(lV0quality , 3334);
1270 // Calculate the effective mass of the Xi- candidate.
1271 // pdg code 3334 = Omega-
1272 lInvMassOmegaMinus = xi->GetEffMassXi();
1275 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1276 }// end if negative bachelor
1279 if( bachTrackXi->Charge() > 0 ){
1281 xi->ChangeMassHypothesis(lV0quality , -3312);
1282 // Calculate the effective mass of the Xi+ candidate.
1283 // pdg code -3312 = Xi+
1284 lInvMassXiPlus = xi->GetEffMassXi();
1287 xi->ChangeMassHypothesis(lV0quality , -3334);
1288 // Calculate the effective mass of the Xi+ candidate.
1289 // pdg code -3334 = Omega+
1290 lInvMassOmegaPlus = xi->GetEffMassXi();
1293 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1294 }// end if positive bachelor
1295 // - II.Step 6 : extra info for QA (ESD)
1296 // miscellaneous pieces of info that may help regarding data quality assessment.
1299 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1300 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1301 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1303 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1304 //lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1305 //lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1307 lChargeXi = xi->Charge();
1309 //lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1311 lRapXi = xi->RapXi();
1312 lRapOmega = xi->RapOmega();
1314 //lTheta = xi->Theta() *180.0/TMath::Pi();
1315 //lPhi = xi->Phi() *180.0/TMath::Pi();
1316 //lAlphaXi = xi->AlphaXi();
1317 //lPtArmXi = xi->PtArmXi();
1319 //------------------------------------------------
1320 // Set Variables for adding to tree
1321 //------------------------------------------------
1323 fTreeCascVarCharge = lChargeXi;
1324 if(lInvMassXiMinus!=0) fTreeCascVarMassAsXi = lInvMassXiMinus;
1325 if(lInvMassXiPlus!=0) fTreeCascVarMassAsXi = lInvMassXiPlus;
1326 if(lInvMassOmegaMinus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaMinus;
1327 if(lInvMassOmegaPlus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaPlus;
1328 fTreeCascVarPt = lXiTransvMom;
1329 fTreeCascVarRapXi = lRapXi ;
1330 fTreeCascVarRapOmega = lRapOmega ;
1331 fTreeCascVarDCACascDaughters = lDcaXiDaughters;
1332 fTreeCascVarDCABachToPrimVtx = lDcaBachToPrimVertexXi;
1333 fTreeCascVarDCAV0Daughters = lDcaV0DaughtersXi;
1334 fTreeCascVarDCAV0ToPrimVtx = lDcaV0ToPrimVertexXi;
1335 fTreeCascVarDCAPosToPrimVtx = lDcaPosToPrimVertexXi;
1336 fTreeCascVarDCANegToPrimVtx = lDcaNegToPrimVertexXi;
1337 fTreeCascVarCascCosPointingAngle = lXiCosineOfPointingAngle;
1338 fTreeCascVarCascRadius = lXiRadius;
1339 fTreeCascVarV0Mass = lInvMassLambdaAsCascDghter;
1340 fTreeCascVarV0CosPointingAngle = lV0CosineOfPointingAngleXi;
1341 fTreeCascVarV0CosPointingAngleSpecial = lV0CosineOfPointingAngleXiSpecial;
1342 fTreeCascVarV0Radius = lV0RadiusXi;
1343 fTreeCascVarLeastNbrClusters = leastnumberofclusters;
1345 //Copy Multiplicity information
1346 fTreeCascVarCentV0A = fCentrality_V0A;
1347 fTreeCascVarCentV0C = fCentrality_V0C;
1348 fTreeCascVarCentV0M = fCentrality_V0M;
1349 fTreeCascVarCentV0AEq = fCentrality_V0AEq;
1350 fTreeCascVarCentV0CEq = fCentrality_V0CEq;
1351 fTreeCascVarCentV0MEq = fCentrality_V0MEq;
1352 fTreeCascVarAmpV0A = fAmplitude_V0A;
1353 fTreeCascVarAmpV0C = fAmplitude_V0C;
1354 fTreeCascVarAmpV0AEq = fAmplitude_V0AEq;
1355 fTreeCascVarAmpV0CEq = fAmplitude_V0CEq;
1356 fTreeCascVarRefMultEta8 = fRefMultEta8;
1357 fTreeCascVarRefMultEta5 = fRefMultEta5;
1358 fTreeCascVarRunNumber = fRunNumber;
1360 fTreeCascVarDistOverTotMom = TMath::Sqrt(
1361 TMath::Power( lPosXi[0] - lBestPrimaryVtxPos[0] , 2) +
1362 TMath::Power( lPosXi[1] - lBestPrimaryVtxPos[1] , 2) +
1363 TMath::Power( lPosXi[2] - lBestPrimaryVtxPos[2] , 2)
1365 fTreeCascVarDistOverTotMom /= (lXiTotMom+1e-13);
1367 //All vars not specified here: specified elsewhere!
1369 //------------------------------------------------
1371 //------------------------------------------------
1373 // The conditional is meant to decrease excessive
1374 // memory usage! Be careful when loosening the
1377 //Xi Mass window: 150MeV wide
1378 //Omega mass window: 150MeV wide
1380 if( fkSaveCascadeTree && ( (fTreeCascVarMassAsXi<1.32+0.075&&fTreeCascVarMassAsXi>1.32-0.075) ||
1381 (fTreeCascVarMassAsOmega<1.68+0.075&&fTreeCascVarMassAsOmega>1.68-0.075) ) ){
1382 fTreeCascade->Fill();
1385 //------------------------------------------------
1387 //------------------------------------------------
1389 }// end of the Cascade loop (ESD or AOD)
1391 // Post output data.
1392 PostData(1, fListHist);
1393 PostData(2, fTreeEvent);
1394 PostData(3, fTreeV0);
1395 PostData(4, fTreeCascade);
1398 //________________________________________________________________________
1399 void AliAnalysisTaskStrangenessVsMultiplicity::Terminate(Option_t *)
1401 // Draw result to the screen
1402 // Called once at the end of the query
1404 TList *cRetrievedList = 0x0;
1405 cRetrievedList = (TList*)GetOutputData(1);
1406 if(!cRetrievedList){
1407 Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : ouput data container list not available\n");
1411 fHistEventCounter = dynamic_cast<TH1D*> ( cRetrievedList->FindObject("fHistEventCounter") );
1412 if (!fHistEventCounter) {
1413 Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : fHistEventCounter not available");
1417 TCanvas *canCheck = new TCanvas("AliAnalysisTaskStrangenessVsMultiplicity","V0 Multiplicity",10,10,510,510);
1418 canCheck->cd(1)->SetLogy();
1420 fHistEventCounter->SetMarkerStyle(22);
1421 fHistEventCounter->DrawCopy("E");
1424 //----------------------------------------------------------------------------
1426 Double_t AliAnalysisTaskStrangenessVsMultiplicity::MyRapidity(Double_t rE, Double_t rPz) const
1428 // Local calculation for rapidity
1429 Double_t ReturnValue = -100;
1430 if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){
1431 ReturnValue = 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));