]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/STRANGENESS/Cascades/AliAnalysisTaskStrangenessVsMultiplicity.cxx
slightly revised calib maps
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / Cascades / AliAnalysisTaskStrangenessVsMultiplicity.cxx
CommitLineData
af0d4791 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// This task is meant to explore the possibility of using a VZERO amplitude
1b914674 19// based multiplicity estimator for proton-proton collisions. For this, two
20// main operation methods for this task are foreseen:
af0d4791 21//
1b914674 22// 1) (under development) it should act as an auxiliary task and provide a
23// calibrated estimator
24//
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:
28//
29// --- All VZERO Amplitudes (saved as Float_t)
af0d4791 30// --- (optional) time for each channel
1b914674 31// --- (optional) time width for each channel
32// --- GetReferenceMultiplicity Estimator, |eta|<0.5
33// --- GetReferenceMultiplicity Estimator, |eta|<0.8
af0d4791 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)
37// --- Run Number
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#include "AliCentrality.h"
b40a01ae 80#include "AliPPVsMultUtils.h"
af0d4791 81
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"
92
93using std::cout;
94using std::endl;
95
96ClassImp(AliAnalysisTaskStrangenessVsMultiplicity)
97
98AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity()
1b914674 99: AliAnalysisTaskSE(), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
100fkSaveV0Tree ( kFALSE ),
101fkSaveCascadeTree ( kTRUE ),
102fkRunVertexers ( kTRUE ),
103fkSkipEventSelection( kFALSE ),
104//---> Variables for fTreeEvent
105fAmplitude_V0A (0),
106fAmplitude_V0C (0),
107fAmplitude_V0AEq (0),
108fAmplitude_V0CEq (0),
109fCentrality_V0A(0),
110fCentrality_V0C(0),
111fCentrality_V0M(0),
112fCentrality_V0AEq(0),
113fCentrality_V0CEq(0),
114fCentrality_V0MEq(0),
115fCustomCentrality_V0M(0),
116fCustomCentrality_V0MEq(0),
117fRefMultEta5(0),
118fRefMultEta8(0),
119fRunNumber(0),
120fEvSel_HasAtLeastSPDVertex(0),
121fEvSel_VtxZCut(0),
122fEvSel_IsNotPileup(0),
123fEvSel_IsNotPileupMV(0),
124fEvSel_IsNotPileupInMultBins(0),
1b914674 125fEvSel_Triggered(0),
126fEvSel_nTracklets(0),
127fEvSel_nSPDClusters(0),
128fEvSel_VtxZ(0),
129fEvSel_nSPDPrimVertices(0),
130fEvSel_distZ(0),
212fd60c 131fEvSel_nContributors(0),
132fEvSel_nContributorsPileup(0),
1b914674 133
134//---> Variables for fTreeV0
135fTreeVariableChi2V0(0),
136fTreeVariableDcaV0Daughters(0),
137fTreeVariableDcaV0ToPrimVertex(0),
138fTreeVariableDcaPosToPrimVertex(0),
139fTreeVariableDcaNegToPrimVertex(0),
140fTreeVariableV0CosineOfPointingAngle(0),
141fTreeVariableV0Radius(0),
142fTreeVariablePt(0),
143fTreeVariableRapK0Short(0),
144fTreeVariableRapLambda(0),
145fTreeVariableInvMassK0s(0),
146fTreeVariableInvMassLambda(0),
147fTreeVariableInvMassAntiLambda(0),
148fTreeVariableAlphaV0(0),
149fTreeVariablePtArmV0(0),
150fTreeVariableNegEta(0),
151fTreeVariablePosEta(0),
152
153fTreeVariableNSigmasPosProton(0),
154fTreeVariableNSigmasPosPion(0),
155fTreeVariableNSigmasNegProton(0),
156fTreeVariableNSigmasNegPion(0),
157
158fTreeVariableDistOverTotMom(0),
159fTreeVariableLeastNbrCrossedRows(0),
160fTreeVariableLeastRatioCrossedRowsOverFindable(0),
161
162fTreeVariableCentV0A(0),
163fTreeVariableCentV0C(0),
164fTreeVariableCentV0M(0),
165fTreeVariableCentV0AEq(0),
166fTreeVariableCentV0CEq(0),
167fTreeVariableCentV0MEq(0),
168fTreeVariableAmpV0A(0),
169fTreeVariableAmpV0C(0),
170fTreeVariableAmpV0AEq(0),
171fTreeVariableAmpV0CEq(0),
172fTreeVariableRefMultEta8(0),
173fTreeVariableRefMultEta5(0),
174fTreeVariableRunNumber(0),
175//---> Variables for fTreeCascade
176fTreeCascVarCharge(0),
177fTreeCascVarMassAsXi(0),
178fTreeCascVarMassAsOmega(0),
179fTreeCascVarPt(0),
180fTreeCascVarRapXi(0),
181fTreeCascVarRapOmega(0),
182fTreeCascVarNegEta(0),
183fTreeCascVarPosEta(0),
184fTreeCascVarBachEta(0),
185fTreeCascVarDCACascDaughters(0),
186fTreeCascVarDCABachToPrimVtx(0),
187fTreeCascVarDCAV0Daughters(0),
188fTreeCascVarDCAV0ToPrimVtx(0),
189fTreeCascVarDCAPosToPrimVtx(0),
190fTreeCascVarDCANegToPrimVtx(0),
191fTreeCascVarCascCosPointingAngle(0),
192fTreeCascVarCascRadius(0),
193fTreeCascVarV0Mass(0),
194fTreeCascVarV0CosPointingAngle(0),
195fTreeCascVarV0CosPointingAngleSpecial(0),
196fTreeCascVarV0Radius(0),
197fTreeCascVarLeastNbrClusters(0),
198fTreeCascVarDistOverTotMom(0),
199fTreeCascVarNegNSigmaPion(0),
200fTreeCascVarNegNSigmaProton(0),
201fTreeCascVarPosNSigmaPion(0),
202fTreeCascVarPosNSigmaProton(0),
203fTreeCascVarBachNSigmaPion(0),
204fTreeCascVarBachNSigmaKaon(0),
205fTreeCascVarCentV0A(0),
206fTreeCascVarCentV0C(0),
207fTreeCascVarCentV0M(0),
208fTreeCascVarCentV0AEq(0),
209fTreeCascVarCentV0CEq(0),
210fTreeCascVarCentV0MEq(0),
211fTreeCascVarAmpV0A(0),
212fTreeCascVarAmpV0C(0),
213fTreeCascVarAmpV0AEq(0),
214fTreeCascVarAmpV0CEq(0),
215fTreeCascVarRefMultEta8(0),
216fTreeCascVarRefMultEta5(0),
217fTreeCascVarRunNumber(0),
218//Histos
219fHistEventCounter(0)
af0d4791 220//------------------------------------------------
1b914674 221// Tree Variables
af0d4791 222{
1b914674 223
af0d4791 224}
225
1b914674 226AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity(const char *name)
227: AliAnalysisTaskSE(name), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
228fkSaveV0Tree ( kFALSE ),
229fkSaveCascadeTree ( kTRUE ),
230fkRunVertexers ( kTRUE ),
231fkSkipEventSelection( kFALSE ),
232//---> Variables for fTreeEvent
233fAmplitude_V0A (0),
234fAmplitude_V0C (0),
235fAmplitude_V0AEq (0),
236fAmplitude_V0CEq (0),
237fCentrality_V0A(0),
238fCentrality_V0C(0),
239fCentrality_V0M(0),
240fCentrality_V0AEq(0),
241fCentrality_V0CEq(0),
242fCentrality_V0MEq(0),
243fCustomCentrality_V0M(0),
244fCustomCentrality_V0MEq(0),
245fRefMultEta5(0),
246fRefMultEta8(0),
247fRunNumber(0),
248fEvSel_HasAtLeastSPDVertex(0),
249fEvSel_VtxZCut(0),
250fEvSel_IsNotPileup(0),
251fEvSel_IsNotPileupMV(0),
252fEvSel_IsNotPileupInMultBins(0),
1b914674 253fEvSel_Triggered(0),
254fEvSel_nTracklets(0),
255fEvSel_nSPDClusters(0),
256fEvSel_VtxZ(0),
257fEvSel_nSPDPrimVertices(0),
258fEvSel_distZ(0),
212fd60c 259fEvSel_nContributors(0),
260fEvSel_nContributorsPileup(0),
1b914674 261
262//---> Variables for fTreeV0
263fTreeVariableChi2V0(0),
264fTreeVariableDcaV0Daughters(0),
265fTreeVariableDcaV0ToPrimVertex(0),
266fTreeVariableDcaPosToPrimVertex(0),
267fTreeVariableDcaNegToPrimVertex(0),
268fTreeVariableV0CosineOfPointingAngle(0),
269fTreeVariableV0Radius(0),
270fTreeVariablePt(0),
271fTreeVariableRapK0Short(0),
272fTreeVariableRapLambda(0),
273fTreeVariableInvMassK0s(0),
274fTreeVariableInvMassLambda(0),
275fTreeVariableInvMassAntiLambda(0),
276fTreeVariableAlphaV0(0),
277fTreeVariablePtArmV0(0),
278fTreeVariableNegEta(0),
279fTreeVariablePosEta(0),
280
281fTreeVariableNSigmasPosProton(0),
282fTreeVariableNSigmasPosPion(0),
283fTreeVariableNSigmasNegProton(0),
284fTreeVariableNSigmasNegPion(0),
285
286fTreeVariableDistOverTotMom(0),
287fTreeVariableLeastNbrCrossedRows(0),
288fTreeVariableLeastRatioCrossedRowsOverFindable(0),
289
290fTreeVariableCentV0A(0),
291fTreeVariableCentV0C(0),
292fTreeVariableCentV0M(0),
293fTreeVariableCentV0AEq(0),
294fTreeVariableCentV0CEq(0),
295fTreeVariableCentV0MEq(0),
296fTreeVariableAmpV0A(0),
297fTreeVariableAmpV0C(0),
298fTreeVariableAmpV0AEq(0),
299fTreeVariableAmpV0CEq(0),
300fTreeVariableRefMultEta8(0),
301fTreeVariableRefMultEta5(0),
302fTreeVariableRunNumber(0),
303//---> Variables for fTreeCascade
304fTreeCascVarCharge(0),
305fTreeCascVarMassAsXi(0),
306fTreeCascVarMassAsOmega(0),
307fTreeCascVarPt(0),
308fTreeCascVarRapXi(0),
309fTreeCascVarRapOmega(0),
310fTreeCascVarNegEta(0),
311fTreeCascVarPosEta(0),
312fTreeCascVarBachEta(0),
313fTreeCascVarDCACascDaughters(0),
314fTreeCascVarDCABachToPrimVtx(0),
315fTreeCascVarDCAV0Daughters(0),
316fTreeCascVarDCAV0ToPrimVtx(0),
317fTreeCascVarDCAPosToPrimVtx(0),
318fTreeCascVarDCANegToPrimVtx(0),
319fTreeCascVarCascCosPointingAngle(0),
320fTreeCascVarCascRadius(0),
321fTreeCascVarV0Mass(0),
322fTreeCascVarV0CosPointingAngle(0),
323fTreeCascVarV0CosPointingAngleSpecial(0),
324fTreeCascVarV0Radius(0),
325fTreeCascVarLeastNbrClusters(0),
326fTreeCascVarDistOverTotMom(0),
327fTreeCascVarNegNSigmaPion(0),
328fTreeCascVarNegNSigmaProton(0),
329fTreeCascVarPosNSigmaPion(0),
330fTreeCascVarPosNSigmaProton(0),
331fTreeCascVarBachNSigmaPion(0),
332fTreeCascVarBachNSigmaKaon(0),
333fTreeCascVarCentV0A(0),
334fTreeCascVarCentV0C(0),
335fTreeCascVarCentV0M(0),
336fTreeCascVarCentV0AEq(0),
337fTreeCascVarCentV0CEq(0),
338fTreeCascVarCentV0MEq(0),
339fTreeCascVarAmpV0A(0),
340fTreeCascVarAmpV0C(0),
341fTreeCascVarAmpV0AEq(0),
342fTreeCascVarAmpV0CEq(0),
343fTreeCascVarRefMultEta8(0),
344fTreeCascVarRefMultEta5(0),
345fTreeCascVarRunNumber(0),
346//Histos
347fHistEventCounter(0)
af0d4791 348{
1b914674 349
350 //Re-vertex: Will only apply for cascade candidates
351
352 fV0VertexerSels[0] = 33. ; // max allowed chi2
353 fV0VertexerSels[1] = 0.02; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
354 fV0VertexerSels[2] = 0.02; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
355 fV0VertexerSels[4] = 0.95; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
356 fV0VertexerSels[5] = 1.0 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
357 fV0VertexerSels[6] = 200. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
358
359 fCascadeVertexerSels[0] = 33. ; // max allowed chi2 (same as PDC07)
360 fCascadeVertexerSels[1] = 0.05 ; // min allowed V0 impact parameter (PDC07 : 0.05 / LHC09a4 : 0.025 )
361 fCascadeVertexerSels[2] = 0.010; // "window" around the Lambda mass (PDC07 : 0.008 / LHC09a4 : 0.010 )
362 fCascadeVertexerSels[3] = 0.03 ; // min allowed bachelor's impact parameter (PDC07 : 0.035 / LHC09a4 : 0.025 )
363 fCascadeVertexerSels[4] = 2.0 ; // max allowed DCA between the V0 and the bachelor (PDC07 : 0.1 / LHC09a4 : 0.2 )
364 fCascadeVertexerSels[5] = 0.95 ; // min allowed cosine of the cascade pointing angle (PDC07 : 0.9985 / LHC09a4 : 0.998 )
365 fCascadeVertexerSels[6] = 0.4 ; // min radius of the fiducial volume (PDC07 : 0.9 / LHC09a4 : 0.2 )
366 fCascadeVertexerSels[7] = 100. ; // max radius of the fiducial volume (PDC07 : 100 / LHC09a4 : 100 )
367
368
369 DefineOutput(1, TList::Class()); // Event Counter Histo
370 DefineOutput(2, TTree::Class()); // Event Tree
371 DefineOutput(3, TTree::Class()); // V0 Tree
372 DefineOutput(4, TTree::Class()); // Cascade Tree
af0d4791 373}
374
375
376AliAnalysisTaskStrangenessVsMultiplicity::~AliAnalysisTaskStrangenessVsMultiplicity()
377{
1b914674 378 //------------------------------------------------
379 // DESTRUCTOR
380 //------------------------------------------------
381
382 if (fListHist){
383 delete fListHist;
384 fListHist = 0x0;
385 }
386 if (fTreeEvent){
387 delete fTreeEvent;
388 fTreeEvent = 0x0;
389 }
390 if (fTreeV0){
391 delete fTreeV0;
392 fTreeV0 = 0x0;
393 }
394 if (fTreeCascade){
395 delete fTreeCascade;
396 fTreeCascade = 0x0;
397 }
b40a01ae 398 if (fPPVsMultUtils){
399 delete fPPVsMultUtils;
400 fPPVsMultUtils = 0x0;
401 }
1b914674 402 if (fUtils){
403 delete fUtils;
404 fUtils = 0x0;
405 }
af0d4791 406}
407
408//________________________________________________________________________
409void AliAnalysisTaskStrangenessVsMultiplicity::UserCreateOutputObjects()
410{
7f83b30f 411
1b914674 412 OpenFile(2);
413 // Called once
414
415 //------------------------------------------------
416
417 fTreeEvent = new TTree("fTreeEvent","Event");
418
419 //------------------------------------------------
420 // fTree Branch definitions - Event by Event info
421 //------------------------------------------------
422
423 //-----------BASIC-INFO---------------------------
424
425 //--- VZERO Data (Integrated)
426 fTreeEvent->Branch("fAmplitude_V0A",&fAmplitude_V0A,"fAmplitude_V0A/F");
427 fTreeEvent->Branch("fAmplitude_V0C",&fAmplitude_V0C,"fAmplitude_V0C/F");
428 fTreeEvent->Branch("fAmplitude_V0AEq",&fAmplitude_V0AEq,"fAmplitude_V0AEq/F");
429 fTreeEvent->Branch("fAmplitude_V0CEq",&fAmplitude_V0CEq,"fAmplitude_V0CEq/F");
430
431 //Info from AliCentrality (not necessarily 'centrality' per se)
432 fTreeEvent->Branch("fCentrality_V0A",&fCentrality_V0A,"fCentrality_V0A/F");
433 fTreeEvent->Branch("fCentrality_V0C",&fCentrality_V0C,"fCentrality_V0C/F");
434 fTreeEvent->Branch("fCentrality_V0M",&fCentrality_V0M,"fCentrality_V0M/F");
435 fTreeEvent->Branch("fCentrality_V0AEq",&fCentrality_V0AEq,"fCentrality_V0AEq/F");
436 fTreeEvent->Branch("fCentrality_V0CEq",&fCentrality_V0CEq,"fCentrality_V0CEq/F");
437 fTreeEvent->Branch("fCentrality_V0MEq",&fCentrality_V0MEq,"fCentrality_V0MEq/F");
438 fTreeEvent->Branch("fCustomCentrality_V0M",&fCustomCentrality_V0M,"fCustomCentrality_V0M/F");
439 fTreeEvent->Branch("fCustomCentrality_V0MEq",&fCustomCentrality_V0MEq,"fCustomCentrality_V0MEq/F");
440
441 //Official GetReferenceMultiplicity
442 fTreeEvent->Branch("fRefMultEta5",&fRefMultEta5,"fRefMultEta5/I");
443 fTreeEvent->Branch("fRefMultEta8",&fRefMultEta8,"fRefMultEta8/I");
444
445 //Run Number
446 fTreeEvent->Branch("fRunNumber", &fRunNumber, "fRunNumber/I");
447
448 //Booleans for Event Selection
449 fTreeEvent->Branch("fEvSel_HasAtLeastSPDVertex", &fEvSel_HasAtLeastSPDVertex, "fEvSel_HasAtLeastSPDVertex/O");
450 fTreeEvent->Branch("fEvSel_VtxZCut", &fEvSel_VtxZCut, "fEvSel_VtxZCut/O");
451 fTreeEvent->Branch("fEvSel_IsNotPileup", &fEvSel_IsNotPileup, "fEvSel_IsNotPileup/O");
452 fTreeEvent->Branch("fEvSel_IsNotPileupMV", &fEvSel_IsNotPileupMV, "fEvSel_IsNotPileupMV/O");
453 fTreeEvent->Branch("fEvSel_IsNotPileupInMultBins", &fEvSel_IsNotPileupInMultBins, "fEvSel_IsNotPileupInMultBins/O");
1b914674 454 fTreeEvent->Branch("fEvSel_Triggered", &fEvSel_Triggered, "fEvSel_Triggered/O");
455
456 //Tracklets vs clusters test
457 fTreeEvent->Branch("fEvSel_nTracklets", &fEvSel_nTracklets, "fEvSel_nTracklets/I");
458 fTreeEvent->Branch("fEvSel_nSPDClusters", &fEvSel_nSPDClusters, "fEvSel_nSPDClusters/I");
459
460 fTreeEvent->Branch("fEvSel_VtxZ", &fEvSel_VtxZ, "fEvSel_VtxZ/F");
461 fTreeEvent->Branch("fEvSel_nSPDPrimVertices", &fEvSel_nSPDPrimVertices, "fEvSel_nSPDPrimVertices/I");
462 fTreeEvent->Branch("fEvSel_distZ", &fEvSel_distZ, "fEvSel_distZ/F");
212fd60c 463 fTreeEvent->Branch("fEvSel_nContributors", &fEvSel_nContributors, "fEvSel_nContributors/I");
464 fTreeEvent->Branch("fEvSel_nContributorsPileup", &fEvSel_nContributorsPileup, "fEvSel_nContributorsPileup/I");
1b914674 465
466 //Create Basic V0 Output Tree
467 fTreeV0 = new TTree( "fTreeV0", "V0 Candidates");
468
469 //------------------------------------------------
470 // fTreeV0 Branch definitions
471 //------------------------------------------------
472
473 //-----------BASIC-INFO---------------------------
474 fTreeV0->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"fTreeVariableChi2V0/F");
475 fTreeV0->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
476 fTreeV0->Branch("fTreeVariableDcaV0ToPrimVertex",&fTreeVariableDcaV0ToPrimVertex,"fTreeVariableDcaV0ToPrimVertex/F");
477 fTreeV0->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
478 fTreeV0->Branch("fTreeVariableDcaNegToPrimVertex",&fTreeVariableDcaNegToPrimVertex,"fTreeVariableDcaNegToPrimVertex/F");
479 fTreeV0->Branch("fTreeVariableV0Radius",&fTreeVariableV0Radius,"fTreeVariableV0Radius/F");
480 fTreeV0->Branch("fTreeVariablePt",&fTreeVariablePt,"fTreeVariablePt/F");
481 fTreeV0->Branch("fTreeVariableRapK0Short",&fTreeVariableRapK0Short,"fTreeVariableRapK0Short/F");
482 fTreeV0->Branch("fTreeVariableRapLambda",&fTreeVariableRapLambda,"fTreeVariableRapLambda/F");
483 fTreeV0->Branch("fTreeVariableInvMassK0s",&fTreeVariableInvMassK0s,"fTreeVariableInvMassK0s/F");
484 fTreeV0->Branch("fTreeVariableInvMassLambda",&fTreeVariableInvMassLambda,"fTreeVariableInvMassLambda/F");
485 fTreeV0->Branch("fTreeVariableInvMassAntiLambda",&fTreeVariableInvMassAntiLambda,"fTreeVariableInvMassAntiLambda/F");
486 fTreeV0->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
487 fTreeV0->Branch("fTreeVariableAlphaV0",&fTreeVariableAlphaV0,"fTreeVariableAlphaV0/F");
488 fTreeV0->Branch("fTreeVariablePtArmV0",&fTreeVariablePtArmV0,"fTreeVariablePtArmV0/F");
489 fTreeV0->Branch("fTreeVariableLeastNbrCrossedRows",&fTreeVariableLeastNbrCrossedRows,"fTreeVariableLeastNbrCrossedRows/I");
490 fTreeV0->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
491 fTreeV0->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
492 fTreeV0->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
493 fTreeV0->Branch("fTreeVariableNSigmasPosPion",&fTreeVariableNSigmasPosPion,"fTreeVariableNSigmasPosPion/F");
494 fTreeV0->Branch("fTreeVariableNSigmasNegProton",&fTreeVariableNSigmasNegProton,"fTreeVariableNSigmasNegProton/F");
495 fTreeV0->Branch("fTreeVariableNSigmasNegPion",&fTreeVariableNSigmasNegPion,"fTreeVariableNSigmasNegPion/F");
496 fTreeV0->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
497 fTreeV0->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
498 //-----------MULTIPLICITY-INFO--------------------
499 fTreeV0->Branch("fTreeVariableCentV0A",&fTreeVariableCentV0A,"fTreeVariableCentV0A/F");
500 fTreeV0->Branch("fTreeVariableCentV0C",&fTreeVariableCentV0C,"fTreeVariableCentV0C/F");
501 fTreeV0->Branch("fTreeVariableCentV0M",&fTreeVariableCentV0M,"fTreeVariableCentV0M/F");
502 fTreeV0->Branch("fTreeVariableCentV0AEq",&fTreeVariableCentV0AEq,"fTreeVariableCentV0AEq/F");
503 fTreeV0->Branch("fTreeVariableCentV0CEq",&fTreeVariableCentV0CEq,"fTreeVariableCentV0CEq/F");
504 fTreeV0->Branch("fTreeVariableCentV0MEq",&fTreeVariableCentV0MEq,"fTreeVariableCentV0MEq/F");
505 fTreeV0->Branch("fTreeVariableAmpV0A",&fTreeVariableAmpV0A,"fTreeVariableAmpV0A/F");
506 fTreeV0->Branch("fTreeVariableAmpV0C",&fTreeVariableAmpV0C,"fTreeVariableAmpV0C/F");
507 fTreeV0->Branch("fTreeVariableAmpV0AEq",&fTreeVariableAmpV0AEq,"fTreeVariableAmpV0AEq/F");
508 fTreeV0->Branch("fTreeVariableAmpV0CEq",&fTreeVariableAmpV0CEq,"fTreeVariableAmpV0CEq/F");
509 fTreeV0->Branch("fTreeVariableRefMultEta8",&fTreeVariableRefMultEta8,"fTreeVariableRefMultEta8/I");
510 fTreeV0->Branch("fTreeVariableRefMultEta5",&fTreeVariableRefMultEta5,"fTreeVariableRefMultEta5/I");
511 fTreeV0->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
512 //------------------------------------------------
513
514 //Create Cascade output tree
515 fTreeCascade = new TTree("fTreeCascade","CascadeCandidates");
516
517 //------------------------------------------------
518 // fTreeCascade Branch definitions - Cascade Tree
519 //------------------------------------------------
520
521 //-----------BASIC-INFO---------------------------
522 fTreeCascade->Branch("fTreeCascVarCharge",&fTreeCascVarCharge,"fTreeCascVarCharge/I");
523 fTreeCascade->Branch("fTreeCascVarMassAsXi",&fTreeCascVarMassAsXi,"fTreeCascVarMassAsXi/F");
524 fTreeCascade->Branch("fTreeCascVarMassAsOmega",&fTreeCascVarMassAsOmega,"fTreeCascVarMassAsOmega/F");
525 fTreeCascade->Branch("fTreeCascVarPt",&fTreeCascVarPt,"fTreeCascVarPt/F");
526 fTreeCascade->Branch("fTreeCascVarRapXi",&fTreeCascVarRapXi,"fTreeCascVarRapXi/F");
527 fTreeCascade->Branch("fTreeCascVarRapOmega",&fTreeCascVarRapOmega,"fTreeCascVarRapOmega/F");
528 fTreeCascade->Branch("fTreeCascVarNegEta",&fTreeCascVarNegEta,"fTreeCascVarNegEta/F");
529 fTreeCascade->Branch("fTreeCascVarPosEta",&fTreeCascVarPosEta,"fTreeCascVarPosEta/F");
530 fTreeCascade->Branch("fTreeCascVarBachEta",&fTreeCascVarBachEta,"fTreeCascVarBachEta/F");
531 //-----------INFO-FOR-CUTS------------------------
532 fTreeCascade->Branch("fTreeCascVarDCACascDaughters",&fTreeCascVarDCACascDaughters,"fTreeCascVarDCACascDaughters/F");
533 fTreeCascade->Branch("fTreeCascVarDCABachToPrimVtx",&fTreeCascVarDCABachToPrimVtx,"fTreeCascVarDCABachToPrimVtx/F");
534 fTreeCascade->Branch("fTreeCascVarDCAV0Daughters",&fTreeCascVarDCAV0Daughters,"fTreeCascVarDCAV0Daughters/F");
535 fTreeCascade->Branch("fTreeCascVarDCAV0ToPrimVtx",&fTreeCascVarDCAV0ToPrimVtx,"fTreeCascVarDCAV0ToPrimVtx/F");
536 fTreeCascade->Branch("fTreeCascVarDCAPosToPrimVtx",&fTreeCascVarDCAPosToPrimVtx,"fTreeCascVarDCAPosToPrimVtx/F");
537 fTreeCascade->Branch("fTreeCascVarDCANegToPrimVtx",&fTreeCascVarDCANegToPrimVtx,"fTreeCascVarDCANegToPrimVtx/F");
538 fTreeCascade->Branch("fTreeCascVarCascCosPointingAngle",&fTreeCascVarCascCosPointingAngle,"fTreeCascVarCascCosPointingAngle/F");
539 fTreeCascade->Branch("fTreeCascVarCascRadius",&fTreeCascVarCascRadius,"fTreeCascVarCascRadius/F");
540 fTreeCascade->Branch("fTreeCascVarV0Mass",&fTreeCascVarV0Mass,"fTreeCascVarV0Mass/F");
541 fTreeCascade->Branch("fTreeCascVarV0CosPointingAngle",&fTreeCascVarV0CosPointingAngle,"fTreeCascVarV0CosPointingAngle/F");
542 fTreeCascade->Branch("fTreeCascVarV0CosPointingAngleSpecial",&fTreeCascVarV0CosPointingAngleSpecial,"fTreeCascVarV0CosPointingAngleSpecial/F");
543 fTreeCascade->Branch("fTreeCascVarV0Radius",&fTreeCascVarV0Radius,"fTreeCascVarV0Radius/F");
544 fTreeCascade->Branch("fTreeCascVarLeastNbrClusters",&fTreeCascVarLeastNbrClusters,"fTreeCascVarLeastNbrClusters/I");
545 //-----------MULTIPLICITY-INFO--------------------
546 fTreeCascade->Branch("fTreeCascVarCentV0A",&fTreeCascVarCentV0A,"fTreeCascVarCentV0A/F");
547 fTreeCascade->Branch("fTreeCascVarCentV0C",&fTreeCascVarCentV0C,"fTreeCascVarCentV0C/F");
548 fTreeCascade->Branch("fTreeCascVarCentV0M",&fTreeCascVarCentV0M,"fTreeCascVarCentV0M/F");
549 fTreeCascade->Branch("fTreeCascVarCentV0AEq",&fTreeCascVarCentV0AEq,"fTreeCascVarCentV0AEq/F");
550 fTreeCascade->Branch("fTreeCascVarCentV0CEq",&fTreeCascVarCentV0CEq,"fTreeCascVarCentV0CEq/F");
551 fTreeCascade->Branch("fTreeCascVarCentV0MEq",&fTreeCascVarCentV0MEq,"fTreeCascVarCentV0MEq/F");
552 fTreeCascade->Branch("fTreeCascVarAmpV0A",&fTreeCascVarAmpV0A,"fTreeCascVarAmpV0A/F");
553 fTreeCascade->Branch("fTreeCascVarAmpV0C",&fTreeCascVarAmpV0C,"fTreeCascVarAmpV0C/F");
554 fTreeCascade->Branch("fTreeCascVarAmpV0AEq",&fTreeCascVarAmpV0AEq,"fTreeCascVarAmpV0AEq/F");
555 fTreeCascade->Branch("fTreeCascVarAmpV0CEq",&fTreeCascVarAmpV0CEq,"fTreeCascVarAmpV0CEq/F");
556 fTreeCascade->Branch("fTreeCascVarRefMultEta8",&fTreeCascVarRefMultEta8,"fTreeCascVarRefMultEta8/I");
557 fTreeCascade->Branch("fTreeCascVarRefMultEta5",&fTreeCascVarRefMultEta5,"fTreeCascVarRefMultEta5/I");
558 fTreeCascade->Branch("fTreeCascVarRunNumber",&fTreeCascVarRunNumber,"fTreeCascVarRunNumber/I");
559 //-----------DECAY-LENGTH-INFO--------------------
560 fTreeCascade->Branch("fTreeCascVarDistOverTotMom",&fTreeCascVarDistOverTotMom,"fTreeCascVarDistOverTotMom/F");
561 //------------------------------------------------
562 fTreeCascade->Branch("fTreeCascVarNegNSigmaPion",&fTreeCascVarNegNSigmaPion,"fTreeCascVarNegNSigmaPion/F");
563 fTreeCascade->Branch("fTreeCascVarNegNSigmaProton",&fTreeCascVarNegNSigmaProton,"fTreeCascVarNegNSigmaProton/F");
564 fTreeCascade->Branch("fTreeCascVarPosNSigmaPion",&fTreeCascVarPosNSigmaPion,"fTreeCascVarPosNSigmaPion/F");
565 fTreeCascade->Branch("fTreeCascVarPosNSigmaProton",&fTreeCascVarPosNSigmaProton,"fTreeCascVarPosNSigmaProton/F");
566 fTreeCascade->Branch("fTreeCascVarBachNSigmaPion",&fTreeCascVarBachNSigmaPion,"fTreeCascVarBachNSigmaPion/F");
567 fTreeCascade->Branch("fTreeCascVarBachNSigmaKaon",&fTreeCascVarBachNSigmaKaon,"fTreeCascVarBachNSigmaKaon/F");
568
569 //------------------------------------------------
570 // Particle Identification Setup
571 //------------------------------------------------
572
573 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
574 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
575 fPIDResponse = inputHandler->GetPIDResponse();
576
577 // Multiplicity
578 if(! fESDtrackCuts ){
579 fESDtrackCuts = new AliESDtrackCuts();
580 }
581 //Helper
582 if(! fPPVsMultUtils ){
583 fPPVsMultUtils = new AliPPVsMultUtils();
584 }
585 //Analysis Utils
586 if(! fUtils ){
587 fUtils = new AliAnalysisUtils();
588 }
7f83b30f 589
1b914674 590 //------------------------------------------------
591 // V0 Multiplicity Histograms
592 //------------------------------------------------
593
594 // Create histograms
595 OpenFile(1);
596 fListHist = new TList();
597 fListHist->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
598
599 if(! fHistEventCounter ) {
600 //Histogram Output: Event-by-Event
601 fHistEventCounter = new TH1D( "fHistEventCounter", ";Evt. Sel. Step;Count",5,0,5);
602 fHistEventCounter->GetXaxis()->SetBinLabel(1, "Processed");
603 fHistEventCounter->GetXaxis()->SetBinLabel(2, "Phys-Sel");
604 fHistEventCounter->GetXaxis()->SetBinLabel(3, "Has Vtx");
605 fHistEventCounter->GetXaxis()->SetBinLabel(4, "Vtx |z|<10cm");
606 fHistEventCounter->GetXaxis()->SetBinLabel(5, "Isn't Pileup");
607 fListHist->Add(fHistEventCounter);
608 }
609
610 //List of Histograms: Normal
af0d4791 611 PostData(1, fListHist);
1b914674 612
613 //TTree Object: Saved to base directory. Should cache to disk while saving.
614 //(Important to avoid excessive memory usage, particularly when merging)
af0d4791 615 PostData(2, fTreeEvent);
616 PostData(3, fTreeV0);
617 PostData(4, fTreeCascade);
af0d4791 618
1b914674 619}// end UserCreateOutputObjects
af0d4791 620
af0d4791 621
1b914674 622//________________________________________________________________________
623void AliAnalysisTaskStrangenessVsMultiplicity::UserExec(Option_t *)
624{
625 // Main loop
626 // Called for each event
627
628 AliESDEvent *lESDevent = 0x0;
629
630 //Zero all booleans, etc
631 fEvSel_HasAtLeastSPDVertex = kFALSE;
632 fEvSel_VtxZCut = kFALSE;
633 fEvSel_IsNotPileup = kFALSE;
634 fEvSel_IsNotPileupInMultBins = kFALSE;
1b914674 635 fEvSel_Triggered = kFALSE;
636
637 fEvSel_nTracklets = -1;
638 fEvSel_nSPDClusters = -1;
212fd60c 639 fEvSel_nContributors = -1;
640 fEvSel_nContributorsPileup = -1;
1b914674 641
642 // Connect to the InputEvent
643 // After these lines, we should have an ESD/AOD event + the number of V0s in it.
644
645 // Appropriate for ESD analysis!
646
647 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
648 if (!lESDevent) {
649 AliWarning("ERROR: lESDevent not available \n");
650 return;
651 }
652
653 //Get VZERO Information for multiplicity later
654 AliVVZERO* esdV0 = lESDevent->GetVZEROData();
655 if (!esdV0) {
656 AliError("AliVVZERO not available");
657 return;
658 }
659
660 fRunNumber = lESDevent->GetRunNumber();
661
662 Double_t lMagneticField = -10;
663 lMagneticField = lESDevent->GetMagneticField( );
664
665 //------------------------------------------------
666 // Variable Definition
667 //------------------------------------------------
668
669 //------------------------------------------------
670 // Physics Selection
671 //------------------------------------------------
672
673 fHistEventCounter->Fill(0.5);
674
675 UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
676 Bool_t isSelected = 0;
677 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
678 fEvSel_Triggered = isSelected;
679
680 //Standard Min-Bias Selection - always do this!
681 if ( (! isSelected) && (! fkSkipEventSelection ) ) {
682 PostData(1, fListHist);
683 PostData(2, fTreeEvent);
684 PostData(3, fTreeV0);
685 PostData(4, fTreeCascade);
686 return;
687 }
688
689 fHistEventCounter->Fill(1.5);
690
691 //------------------------------------------------
692 // Primary Vertex Requirements Section:
693 // ---> pp: has vertex, |z|<10cm
694 //------------------------------------------------
695
696 //classical Proton-proton like selection
697 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
698 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
699 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
700
701 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
702 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
703
704 //Only accept if Tracking or SPD vertex is fine
705 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() && !fkSkipEventSelection ){
706 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
707 PostData(1, fListHist);
708 PostData(2, fTreeEvent);
709 PostData(3, fTreeV0);
710 PostData(4, fTreeCascade);
711 return;
712 }
713
714 if(! (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus()) ){
715 //Passed selection!
716 fEvSel_HasAtLeastSPDVertex = kTRUE;
717 }
718
719 //Has SPD or Tracking Vertex
720 fHistEventCounter -> Fill(2.5);
721
722 //Always do Primary Vertex Selection
723 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && !fkSkipEventSelection ) {
724 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
725 PostData(1, fListHist);
726 PostData(2, fTreeEvent);
727 PostData(3, fTreeV0);
728 PostData(4, fTreeCascade);
729 return;
730 }
731
732 if(TMath::Abs(lBestPrimaryVtxPos[2]) <= 10.0 ){
733 //Passed selection!
734 fEvSel_VtxZCut = kTRUE;
735 }
736 fEvSel_VtxZ = lBestPrimaryVtxPos[2] ; //Set
737
738 //Fill Event selected counter
739 fHistEventCounter -> Fill(3.5);
740
741 //------------------------------------------------
742 // Check if this isn't pileup
743 //------------------------------------------------
744
745 if(lESDevent->IsPileupFromSPDInMultBins() && !fkSkipEventSelection ){
746 // minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.
747 //-> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
748 AliWarning("Pb / Event tagged as pile-up by SPD... return !");
749 PostData(1, fListHist);
750 PostData(2, fTreeEvent);
751 PostData(3, fTreeV0);
752 PostData(4, fTreeCascade);
753 return;
754 }
755
756 if( !lESDevent->IsPileupFromSPD() ) fEvSel_IsNotPileup = kTRUE;
757 if( !lESDevent->IsPileupFromSPDInMultBins() ) fEvSel_IsNotPileupInMultBins = kTRUE;
758
212fd60c 759 fEvSel_nSPDPrimVertices = -1;
760 fEvSel_distZ = -1;
761
1b914674 762 //Acquire information to compute residual pileup
763 fEvSel_nSPDPrimVertices = lESDevent->GetNumberOfPileupVerticesSPD();
764
765 //Long_t lNcontributorsSPDvtx = lPrimarySPDVtx -> GetNContributors();
766 Long_t lNcontributorsSecondLargest = -1;
767 Long_t lIndexSecondLargest = -1;
768 //Look for the two events with the largest numbers of contributors...
769 for(Int_t i=0; i<fEvSel_nSPDPrimVertices;i++){
770 const AliESDVertex* pv=lESDevent -> GetPileupVertexSPD(i);
771 if( pv->GetNContributors() > lNcontributorsSecondLargest ){
772 lNcontributorsSecondLargest = pv->GetNContributors();
773 lIndexSecondLargest = i;
774 }
775 }
212fd60c 776 fEvSel_nContributors = lPrimaryBestESDVtx -> GetNContributors();
f9a713a5 777 if( fEvSel_nSPDPrimVertices > 0 && lIndexSecondLargest > -1){
778 const AliESDVertex* largestpv=lESDevent ->GetPileupVertexSPD(lIndexSecondLargest);
779 fEvSel_distZ = lPrimarySPDVtx->GetZ() - largestpv->GetZ();
780 fEvSel_nContributorsPileup = largestpv -> GetNContributors();
781 }
1b914674 782
783 //First implementation of pileup from multi-vertexer (simple use of analysis utils)
784 if ( !fUtils->IsPileUpMV( lESDevent ) ) fEvSel_IsNotPileupMV = kTRUE;
785
786 //Fill Event isn't pileup counter
787 fHistEventCounter -> Fill(4.5);
788
789 //------------------------------------------------
790 // Multiplicity Information Acquistion
791 //------------------------------------------------
792
793 //Standard GetReferenceMultiplicity Estimator (0.5 and 0.8)
794 fRefMultEta5 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
795 fRefMultEta8 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.8);
796
797 // VZERO PART
798 Float_t multV0A = 0; // multiplicity from V0 reco side A
799 Float_t multV0C = 0; // multiplicity from V0 reco side C
800 Float_t multV0AEq = 0; // multiplicity from V0 reco side A
801 Float_t multV0CEq = 0; // multiplicity from V0 reco side C
802 Float_t multV0ACorr = 0; // multiplicity from V0 reco side A
803 Float_t multV0CCorr = 0; // multiplicity from V0 reco side C
804
805 //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
806 //Getters for uncorrected multiplicity
807 multV0A=esdV0->GetMTotV0A();
808 multV0C=esdV0->GetMTotV0C();
809
810 //Get Z vertex position of SPD vertex (why not Tracking if available?)
811 Float_t zvtx = lPrimarySPDVtx->GetZ();
812
813 //Acquire Corrected multV0A
814 multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
815 multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
816
817 //Copy to Event Tree for extra information
818 fAmplitude_V0A = multV0ACorr;
819 fAmplitude_V0C = multV0CCorr;
820
821 // Equalized signals // From AliCentralitySelectionTask // Updated
822 for(Int_t iCh = 32; iCh < 64; ++iCh) {
823 Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
824 multV0AEq += mult;
825 }
826 for(Int_t iCh = 0; iCh < 32; ++iCh) {
827 Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
828 multV0CEq += mult;
829 }
830 fAmplitude_V0AEq = multV0AEq;
831 fAmplitude_V0CEq = multV0CEq;
832
833 fCentrality_V0A = -100;
834 fCentrality_V0C = -100;
835 fCentrality_V0M = -100;
836 fCentrality_V0AEq = -100;
837 fCentrality_V0CEq = -100;
838 fCentrality_V0MEq = -100;
839
840 //AliCentrality... Check if working?
841 AliCentrality* centrality;
842 centrality = lESDevent->GetCentrality();
843 if ( !(centrality->GetQuality()>1) ){
844 fCentrality_V0A = centrality->GetCentralityPercentile( "V0A" );
845 fCentrality_V0C = centrality->GetCentralityPercentile( "V0C" );
846 fCentrality_V0M = centrality->GetCentralityPercentile( "V0M" );
847 fCentrality_V0AEq = centrality->GetCentralityPercentile( "V0AEq" );
848 fCentrality_V0CEq = centrality->GetCentralityPercentile( "V0CEq" );
849 fCentrality_V0MEq = centrality->GetCentralityPercentile( "V0MEq" );
850 }
851
b40a01ae 852 //Cross-check/debug
853 fCustomCentrality_V0M = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0M");
854 fCustomCentrality_V0MEq = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0MEq");
855
1b914674 856 //Tracklets vs Clusters Exploratory data
857 fEvSel_nTracklets = lESDevent->GetMultiplicity()->GetNumberOfTracklets();
858 fEvSel_nSPDClusters = lESDevent->GetNumberOfITSClusters(0) + lESDevent->GetNumberOfITSClusters(1);
859
860 //Event-level fill
861 fTreeEvent->Fill() ;
862
863 //STOP HERE if skipping event selections (no point in doing the rest...)
864 if( fkSkipEventSelection ){
865 PostData(1, fListHist);
866 PostData(2, fTreeEvent);
867 PostData(3, fTreeV0);
868 PostData(4, fTreeCascade);
869 return;
870 }
af0d4791 871
af0d4791 872 //------------------------------------------------
1b914674 873
874 //------------------------------------------------
875 // Fill V0 Tree as needed
876 //------------------------------------------------
877
878 //Variable definition
879 Int_t lOnFlyStatus = 0;// nv0sOn = 0, nv0sOff = 0;
880 Double_t lChi2V0 = 0;
881 Double_t lDcaV0Daughters = 0, lDcaV0ToPrimVertex = 0;
882 Double_t lDcaPosToPrimVertex = 0, lDcaNegToPrimVertex = 0;
883 Double_t lV0CosineOfPointingAngle = 0;
884 Double_t lV0Radius = 0, lPt = 0;
885 Double_t lRapK0Short = 0, lRapLambda = 0;
886 Double_t lInvMassK0s = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
887 Double_t lAlphaV0 = 0, lPtArmV0 = 0;
888
889 Double_t fMinV0Pt = 0;
890 Double_t fMaxV0Pt = 100;
891
892 Int_t nv0s = 0;
893 nv0s = lESDevent->GetNumberOfV0s();
894
895 for (Int_t iV0 = 0; iV0 < nv0s; iV0++) //extra-crazy test
896 {// This is the begining of the V0 loop
897 AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
898 if (!v0) continue;
899
900 Double_t tDecayVertexV0[3]; v0->GetXYZ(tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]);
901
902 Double_t tV0mom[3];
903 v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] );
904 Double_t lV0TotalMomentum = TMath::Sqrt(
905 tV0mom[0]*tV0mom[0]+tV0mom[1]*tV0mom[1]+tV0mom[2]*tV0mom[2] );
906
907 lV0Radius = TMath::Sqrt(tDecayVertexV0[0]*tDecayVertexV0[0]+tDecayVertexV0[1]*tDecayVertexV0[1]);
908
909 lPt = v0->Pt();
910 lRapK0Short = v0->RapK0Short();
911 lRapLambda = v0->RapLambda();
912 if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
913
914 UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
915 UInt_t lKeyNeg = (UInt_t)TMath::Abs(v0->GetNindex());
916
917 Double_t lMomPos[3]; v0->GetPPxPyPz(lMomPos[0],lMomPos[1],lMomPos[2]);
918 Double_t lMomNeg[3]; v0->GetNPxPyPz(lMomNeg[0],lMomNeg[1],lMomNeg[2]);
919
920 AliESDtrack *pTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyPos);
921 AliESDtrack *nTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyNeg);
922 if (!pTrack || !nTrack) {
923 Printf("ERROR: Could not retreive one of the daughter track");
924 continue;
925 }
926
927 //Daughter Eta for Eta selection, afterwards
928 fTreeVariableNegEta = nTrack->Eta();
929 fTreeVariablePosEta = pTrack->Eta();
930
931 // Filter like-sign V0 (next: add counter and distribution)
932 if ( pTrack->GetSign() == nTrack->GetSign()){
933 continue;
934 }
935
936 //________________________________________________________________________
937 // Track quality cuts
938 Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
939 Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
940 fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
941 if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
942 fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
943
944 // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
945 if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
946 if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
947
948
949 if ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) ) continue;
950
951 //GetKinkIndex condition
952 if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
953
954 //Findable clusters > 0 condition
955 if( pTrack->GetTPCNclsF()<=0 || nTrack->GetTPCNclsF()<=0 ) continue;
956
957 //Compute ratio Crossed Rows / Findable clusters
958 //Note: above test avoids division by zero!
959 Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF()));
960 Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF()));
961
962 fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
963 if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
964 fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
965
966 //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
967 if ( fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8 ) continue;
968
969 //End track Quality Cuts
970 //________________________________________________________________________
971
972 lDcaPosToPrimVertex = TMath::Abs(pTrack->GetD(lBestPrimaryVtxPos[0],
973 lBestPrimaryVtxPos[1],
974 lMagneticField) );
975
976 lDcaNegToPrimVertex = TMath::Abs(nTrack->GetD(lBestPrimaryVtxPos[0],
977 lBestPrimaryVtxPos[1],
978 lMagneticField) );
979
980 lOnFlyStatus = v0->GetOnFlyStatus();
981 lChi2V0 = v0->GetChi2V0();
982 lDcaV0Daughters = v0->GetDcaV0Daughters();
983 lDcaV0ToPrimVertex = v0->GetD(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
984 lV0CosineOfPointingAngle = v0->GetV0CosineOfPointingAngle(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
985 fTreeVariableV0CosineOfPointingAngle=lV0CosineOfPointingAngle;
986
987 // Getting invariant mass infos directly from ESD
988 v0->ChangeMassHypothesis(310);
989 lInvMassK0s = v0->GetEffMass();
990 v0->ChangeMassHypothesis(3122);
991 lInvMassLambda = v0->GetEffMass();
992 v0->ChangeMassHypothesis(-3122);
993 lInvMassAntiLambda = v0->GetEffMass();
994 lAlphaV0 = v0->AlphaV0();
995 lPtArmV0 = v0->PtArmV0();
996
997 fTreeVariablePt = v0->Pt();
998 fTreeVariableChi2V0 = lChi2V0;
999 fTreeVariableDcaV0ToPrimVertex = lDcaV0ToPrimVertex;
1000 fTreeVariableDcaV0Daughters = lDcaV0Daughters;
1001 fTreeVariableV0CosineOfPointingAngle = lV0CosineOfPointingAngle;
1002 fTreeVariableV0Radius = lV0Radius;
1003 fTreeVariableDcaPosToPrimVertex = lDcaPosToPrimVertex;
1004 fTreeVariableDcaNegToPrimVertex = lDcaNegToPrimVertex;
1005 fTreeVariableInvMassK0s = lInvMassK0s;
1006 fTreeVariableInvMassLambda = lInvMassLambda;
1007 fTreeVariableInvMassAntiLambda = lInvMassAntiLambda;
1008 fTreeVariableRapK0Short = lRapK0Short;
1009 fTreeVariableRapLambda = lRapLambda;
1010 fTreeVariableAlphaV0 = lAlphaV0;
1011 fTreeVariablePtArmV0 = lPtArmV0;
1012
1013 //Official means of acquiring N-sigmas
1014 fTreeVariableNSigmasPosProton = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kProton );
1015 fTreeVariableNSigmasPosPion = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kPion );
1016 fTreeVariableNSigmasNegProton = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kProton );
1017 fTreeVariableNSigmasNegPion = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
1018
1019 //This requires an Invariant Mass Hypothesis afterwards
1020 fTreeVariableDistOverTotMom = TMath::Sqrt(
1021 TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
1022 TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
1023 TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
1024 );
1025 fTreeVariableDistOverTotMom /= (lV0TotalMomentum+1e-10); //avoid division by zero, to be sure
1026
1027 //Copy Multiplicity information
1028 fTreeVariableCentV0A = fCentrality_V0A;
1029 fTreeVariableCentV0C = fCentrality_V0C;
1030 fTreeVariableCentV0M = fCentrality_V0M;
1031 fTreeVariableCentV0AEq = fCentrality_V0AEq;
1032 fTreeVariableCentV0CEq = fCentrality_V0CEq;
1033 fTreeVariableCentV0MEq = fCentrality_V0MEq;
1034 fTreeVariableAmpV0A = fAmplitude_V0A;
1035 fTreeVariableAmpV0C = fAmplitude_V0C;
1036 fTreeVariableAmpV0AEq = fAmplitude_V0AEq;
1037 fTreeVariableAmpV0CEq = fAmplitude_V0CEq;
1038 fTreeVariableRefMultEta8 = fRefMultEta8;
1039 fTreeVariableRefMultEta5 = fRefMultEta5;
1040 fTreeVariableRunNumber = fRunNumber;
1041
1042 //------------------------------------------------
1043 // Fill Tree!
1044 //------------------------------------------------
1045
1046 // The conditionals are meant to decrease excessive
1047 // memory usage!
1048
1049 //First Selection: Reject OnFly
1050 if( lOnFlyStatus == 0 ){
1051 //Second Selection: rough 20-sigma band, parametric.
1052 //K0Short: Enough to parametrize peak broadening with linear function.
1053 Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt;
1054 Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
1055 //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
1056 //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
1057 Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt);
1058 Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
1059 //Do Selection
1060 if( (fTreeVariableInvMassLambda < lUpperLimitLambda && fTreeVariableInvMassLambda > lLowerLimitLambda ) ||
1061 (fTreeVariableInvMassAntiLambda < lUpperLimitLambda && fTreeVariableInvMassAntiLambda > lLowerLimitLambda ) ||
1062 (fTreeVariableInvMassK0s < lUpperLimitK0Short && fTreeVariableInvMassK0s > lLowerLimitK0Short ) ){
1063 //Pre-selection in case this is AA...
1064 if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && fkSaveV0Tree ) fTreeV0->Fill();
1065 }
1066 }
1067 }// This is the end of the V0 loop
1068
1069 //------------------------------------------------
1070 // Fill V0 tree over.
1071 //------------------------------------------------
1072
1073
1074
1075 //------------------------------------------------
1076 // Rerun cascade vertexer!
1077 //------------------------------------------------
1078
1079 if( fkRunVertexers ){
1080 lESDevent->ResetCascades();
1081 lESDevent->ResetV0s();
1082
1083 AliV0vertexer lV0vtxer;
1084 AliCascadeVertexer lCascVtxer;
1085
1086 lV0vtxer.SetDefaultCuts(fV0VertexerSels);
1087 lCascVtxer.SetDefaultCuts(fCascadeVertexerSels);
1088
1089 lV0vtxer.Tracks2V0vertices(lESDevent);
1090 lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1091 }
1092
1093 //------------------------------------------------
1094 // MAIN CASCADE LOOP STARTS HERE
1095 //------------------------------------------------
1096 // Code Credit: Antonin Maire (thanks^100)
1097 // ---> This is an adaptation
1098
1099 Long_t ncascades = 0;
1100 ncascades = lESDevent->GetNumberOfCascades();
1101
1102 for (Int_t iXi = 0; iXi < ncascades; iXi++){
1103 //------------------------------------------------
1104 // Initializations
1105 //------------------------------------------------
1106 //Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1107 //Double_t lBestPrimaryVtxRadius3D = -500.0;
1108
1109 // - 1st part of initialisation : variables needed to store AliESDCascade data members
1110 Double_t lEffMassXi = 0. ;
1111 //Double_t lChi2Xi = -1. ;
1112 Double_t lDcaXiDaughters = -1. ;
1113 Double_t lXiCosineOfPointingAngle = -1. ;
1114 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1115 Double_t lXiRadius = -1000. ;
1116
1117 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1118 Int_t lPosTPCClusters = -1; // For ESD only ...//FIXME : wait for availability in AOD
1119 Int_t lNegTPCClusters = -1; // For ESD only ...
1120 Int_t lBachTPCClusters = -1; // For ESD only ...
1121
1122 // - 3rd part of initialisation : about V0 part in cascades
1123 Double_t lInvMassLambdaAsCascDghter = 0.;
1124 //Double_t lV0Chi2Xi = -1. ;
1125 Double_t lDcaV0DaughtersXi = -1.;
af0d4791 1126
1b914674 1127 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1128 Double_t lDcaPosToPrimVertexXi = -1.;
1129 Double_t lDcaNegToPrimVertexXi = -1.;
1130 Double_t lV0CosineOfPointingAngleXi = -1. ;
1131 Double_t lV0CosineOfPointingAngleXiSpecial = -1. ;
1132 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1133 Double_t lV0RadiusXi = -1000.0;
1134 Double_t lV0quality = 0.;
1135
1136 // - 4th part of initialisation : Effective masses
1137 Double_t lInvMassXiMinus = 0.;
1138 Double_t lInvMassXiPlus = 0.;
1139 Double_t lInvMassOmegaMinus = 0.;
1140 Double_t lInvMassOmegaPlus = 0.;
1141
1142 // - 6th part of initialisation : extra info for QA
1143 Double_t lXiMomX = 0. , lXiMomY = 0., lXiMomZ = 0.;
1144 Double_t lXiTransvMom = 0. ;
1145 //Double_t lXiTransvMomMC= 0. ;
1146 Double_t lXiTotMom = 0. ;
af0d4791 1147
1b914674 1148 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1149 //Double_t lBachTransvMom = 0.;
1150 //Double_t lBachTotMom = 0.;
1151
1152 fTreeCascVarNegNSigmaPion = -100;
1153 fTreeCascVarNegNSigmaProton = -100;
1154 fTreeCascVarPosNSigmaPion = -100;
1155 fTreeCascVarPosNSigmaProton = -100;
1156 fTreeCascVarBachNSigmaPion = -100;
1157 fTreeCascVarBachNSigmaKaon = -100;
1158
1159 Short_t lChargeXi = -2;
1160 //Double_t lV0toXiCosineOfPointingAngle = 0. ;
1161
1162 Double_t lRapXi = -20.0, lRapOmega = -20.0; // lEta = -20.0, lTheta = 360., lPhi = 720. ;
1163 //Double_t lAlphaXi = -200., lPtArmXi = -200.0;
af0d4791 1164
1b914674 1165 // -------------------------------------
1166 // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1167
1168 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1169 if (!xi) continue;
1170
1171 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
af0d4791 1172 //-------------
1b914674 1173 lV0quality = 0.;
1174 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1175
1176 lEffMassXi = xi->GetEffMassXi();
1177 //lChi2Xi = xi->GetChi2Xi();
1178 lDcaXiDaughters = xi->GetDcaXiDaughters();
1179 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1180 lBestPrimaryVtxPos[1],
1181 lBestPrimaryVtxPos[2] );
1182 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1183
1184 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1185 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1186
af0d4791 1187 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1188 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1189 //-------------
1190
1191 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1192 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1193 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1b914674 1194 // Care track label can be negative in MC production (linked with the track quality)
1195 // However = normally, not the case for track index ...
1196
1197 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1198 if(lBachIdx == lIdxNegXi) {
1199 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1200 }
1201 if(lBachIdx == lIdxPosXi) {
1202 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1203 }
1204
1205 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1206 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1207 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1208
1209 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1210 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1211 continue;
1212 }
1213
1214 fTreeCascVarPosEta = pTrackXi->Eta();
1215 fTreeCascVarNegEta = nTrackXi->Eta();
1216 fTreeCascVarBachEta = bachTrackXi->Eta();
1217
1218 Double_t lBMom[3], lNMom[3], lPMom[3];
1219 xi->GetBPxPyPz( lBMom[0], lBMom[1], lBMom[2] );
1220 xi->GetPPxPyPz( lPMom[0], lPMom[1], lPMom[2] );
1221 xi->GetNPxPyPz( lNMom[0], lNMom[1], lNMom[2] );
1222
1223 //fTreeCascVarBachTransMom = TMath::Sqrt( lBMom[0]*lBMom[0] + lBMom[1]*lBMom[1] );
1224 //fTreeCascVarPosTransMom = TMath::Sqrt( lPMom[0]*lPMom[0] + lPMom[1]*lPMom[1] );
1225 //fTreeCascVarNegTransMom = TMath::Sqrt( lNMom[0]*lNMom[0] + lNMom[1]*lNMom[1] );
1226
1227 //------------------------------------------------
1228 // TPC dEdx information
1229 //------------------------------------------------
1230 fTreeCascVarNegNSigmaPion = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kPion );
1231 fTreeCascVarNegNSigmaProton = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kProton );
1232 fTreeCascVarPosNSigmaPion = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kPion );
1233 fTreeCascVarPosNSigmaProton = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kProton );
1234 fTreeCascVarBachNSigmaPion = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kPion );
1235 fTreeCascVarBachNSigmaKaon = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kKaon );
1236
1237 //------------------------------------------------
1238 // TPC Number of clusters info
1239 // --- modified to save the smallest number
1240 // --- of TPC clusters for the 3 tracks
1241 //------------------------------------------------
1242
1243 lPosTPCClusters = pTrackXi->GetTPCNcls();
1244 lNegTPCClusters = nTrackXi->GetTPCNcls();
1245 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1246
1247 // 1 - Poor quality related to TPCrefit
1248 ULong_t pStatus = pTrackXi->GetStatus();
1249 ULong_t nStatus = nTrackXi->GetStatus();
1250 ULong_t bachStatus = bachTrackXi->GetStatus();
1251
1252 //fTreeCascVarkITSRefitBachelor = kTRUE;
1253 //fTreeCascVarkITSRefitNegative = kTRUE;
1254 //fTreeCascVarkITSRefitPositive = kTRUE;
1255
1256 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1257 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1258 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1259
1260 // 2 - Poor quality related to TPC clusters: lowest cut of 70 clusters
1261 if(lPosTPCClusters < 70) { AliWarning("Pb / V0 Pos. track has less than 70 TPC clusters ... continue!"); continue; }
1262 if(lNegTPCClusters < 70) { AliWarning("Pb / V0 Neg. track has less than 70 TPC clusters ... continue!"); continue; }
1263 if(lBachTPCClusters < 70) { AliWarning("Pb / Bach. track has less than 70 TPC clusters ... continue!"); continue; }
1264 Int_t leastnumberofclusters = 1000;
1265 if( lPosTPCClusters < leastnumberofclusters ) leastnumberofclusters = lPosTPCClusters;
1266 if( lNegTPCClusters < leastnumberofclusters ) leastnumberofclusters = lNegTPCClusters;
1267 if( lBachTPCClusters < leastnumberofclusters ) leastnumberofclusters = lBachTPCClusters;
1268
1269 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1270 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1271 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1272 //lV0Chi2Xi = xi->GetChi2V0();
1273
1274 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1275 lBestPrimaryVtxPos[1],
1276 lBestPrimaryVtxPos[2] );
1277 //Modification: V0 CosPA wrt to Cascade decay vertex
1278 lV0CosineOfPointingAngleXiSpecial = xi->GetV0CosineOfPointingAngle( lPosXi[0],
1279 lPosXi[1],
1280 lPosXi[2] );
1281
1282 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1283 lBestPrimaryVtxPos[1],
1284 lBestPrimaryVtxPos[2] );
af0d4791 1285
1b914674 1286 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1287 lBestPrimaryVtxPos[1],
1288 lMagneticField ) );
1289 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
af0d4791 1290
1b914674 1291 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1292 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1293
1294 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1295 lBestPrimaryVtxPos[1],
1296 lMagneticField ) );
1297
1298 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1299 lBestPrimaryVtxPos[1],
1300 lMagneticField ) );
af0d4791 1301
1b914674 1302 // - II.Step 4 : around effective masses (ESD)
1303 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
af0d4791 1304
1b914674 1305 if( bachTrackXi->Charge() < 0 ) {
1306 lV0quality = 0.;
1307 xi->ChangeMassHypothesis(lV0quality , 3312);
1308 // Calculate the effective mass of the Xi- candidate.
1309 // pdg code 3312 = Xi-
1310 lInvMassXiMinus = xi->GetEffMassXi();
1311
1312 lV0quality = 0.;
1313 xi->ChangeMassHypothesis(lV0quality , 3334);
1314 // Calculate the effective mass of the Xi- candidate.
1315 // pdg code 3334 = Omega-
1316 lInvMassOmegaMinus = xi->GetEffMassXi();
1317
1318 lV0quality = 0.;
1319 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1320 }// end if negative bachelor
1321
1322
1323 if( bachTrackXi->Charge() > 0 ){
1324 lV0quality = 0.;
1325 xi->ChangeMassHypothesis(lV0quality , -3312);
1326 // Calculate the effective mass of the Xi+ candidate.
1327 // pdg code -3312 = Xi+
1328 lInvMassXiPlus = xi->GetEffMassXi();
1329
1330 lV0quality = 0.;
1331 xi->ChangeMassHypothesis(lV0quality , -3334);
1332 // Calculate the effective mass of the Xi+ candidate.
1333 // pdg code -3334 = Omega+
1334 lInvMassOmegaPlus = xi->GetEffMassXi();
1335
1336 lV0quality = 0.;
1337 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1338 }// end if positive bachelor
1339 // - II.Step 6 : extra info for QA (ESD)
1340 // miscellaneous pieces of info that may help regarding data quality assessment.
1341 //-------------
1342
1343 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1344 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1345 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
af0d4791 1346
1b914674 1347 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1348 //lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1349 //lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1350
1351 lChargeXi = xi->Charge();
1352
1353 //lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1354
1355 lRapXi = xi->RapXi();
1356 lRapOmega = xi->RapOmega();
1357 //lEta = xi->Eta();
1358 //lTheta = xi->Theta() *180.0/TMath::Pi();
1359 //lPhi = xi->Phi() *180.0/TMath::Pi();
1360 //lAlphaXi = xi->AlphaXi();
1361 //lPtArmXi = xi->PtArmXi();
1362
1363 //------------------------------------------------
1364 // Set Variables for adding to tree
1365 //------------------------------------------------
1366
1367 fTreeCascVarCharge = lChargeXi;
1368 if(lInvMassXiMinus!=0) fTreeCascVarMassAsXi = lInvMassXiMinus;
1369 if(lInvMassXiPlus!=0) fTreeCascVarMassAsXi = lInvMassXiPlus;
1370 if(lInvMassOmegaMinus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaMinus;
1371 if(lInvMassOmegaPlus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaPlus;
1372 fTreeCascVarPt = lXiTransvMom;
1373 fTreeCascVarRapXi = lRapXi ;
1374 fTreeCascVarRapOmega = lRapOmega ;
1375 fTreeCascVarDCACascDaughters = lDcaXiDaughters;
1376 fTreeCascVarDCABachToPrimVtx = lDcaBachToPrimVertexXi;
1377 fTreeCascVarDCAV0Daughters = lDcaV0DaughtersXi;
1378 fTreeCascVarDCAV0ToPrimVtx = lDcaV0ToPrimVertexXi;
1379 fTreeCascVarDCAPosToPrimVtx = lDcaPosToPrimVertexXi;
1380 fTreeCascVarDCANegToPrimVtx = lDcaNegToPrimVertexXi;
1381 fTreeCascVarCascCosPointingAngle = lXiCosineOfPointingAngle;
1382 fTreeCascVarCascRadius = lXiRadius;
1383 fTreeCascVarV0Mass = lInvMassLambdaAsCascDghter;
1384 fTreeCascVarV0CosPointingAngle = lV0CosineOfPointingAngleXi;
1385 fTreeCascVarV0CosPointingAngleSpecial = lV0CosineOfPointingAngleXiSpecial;
1386 fTreeCascVarV0Radius = lV0RadiusXi;
1387 fTreeCascVarLeastNbrClusters = leastnumberofclusters;
1388
1389 //Copy Multiplicity information
1390 fTreeCascVarCentV0A = fCentrality_V0A;
1391 fTreeCascVarCentV0C = fCentrality_V0C;
1392 fTreeCascVarCentV0M = fCentrality_V0M;
1393 fTreeCascVarCentV0AEq = fCentrality_V0AEq;
1394 fTreeCascVarCentV0CEq = fCentrality_V0CEq;
1395 fTreeCascVarCentV0MEq = fCentrality_V0MEq;
1396 fTreeCascVarAmpV0A = fAmplitude_V0A;
1397 fTreeCascVarAmpV0C = fAmplitude_V0C;
1398 fTreeCascVarAmpV0AEq = fAmplitude_V0AEq;
1399 fTreeCascVarAmpV0CEq = fAmplitude_V0CEq;
1400 fTreeCascVarRefMultEta8 = fRefMultEta8;
1401 fTreeCascVarRefMultEta5 = fRefMultEta5;
1402 fTreeCascVarRunNumber = fRunNumber;
1403
1404 fTreeCascVarDistOverTotMom = TMath::Sqrt(
1405 TMath::Power( lPosXi[0] - lBestPrimaryVtxPos[0] , 2) +
1406 TMath::Power( lPosXi[1] - lBestPrimaryVtxPos[1] , 2) +
1407 TMath::Power( lPosXi[2] - lBestPrimaryVtxPos[2] , 2)
1408 );
1409 fTreeCascVarDistOverTotMom /= (lXiTotMom+1e-13);
1410
1411 //All vars not specified here: specified elsewhere!
1412
1413 //------------------------------------------------
1414 // Fill Tree!
1415 //------------------------------------------------
1416
1417 // The conditional is meant to decrease excessive
1418 // memory usage! Be careful when loosening the
1419 // cut!
1420
1421 //Xi Mass window: 150MeV wide
1422 //Omega mass window: 150MeV wide
1423
1424 if( fkSaveCascadeTree && ( (fTreeCascVarMassAsXi<1.32+0.075&&fTreeCascVarMassAsXi>1.32-0.075) ||
1425 (fTreeCascVarMassAsOmega<1.68+0.075&&fTreeCascVarMassAsOmega>1.68-0.075) ) ){
1426 fTreeCascade->Fill();
1427 }
1428
1429 //------------------------------------------------
1430 // Fill tree over.
1431 //------------------------------------------------
1432
af0d4791 1433 }// end of the Cascade loop (ESD or AOD)
1b914674 1434
1435 // Post output data.
1436 PostData(1, fListHist);
1437 PostData(2, fTreeEvent);
1438 PostData(3, fTreeV0);
1439 PostData(4, fTreeCascade);
af0d4791 1440}
1441
1442//________________________________________________________________________
1443void AliAnalysisTaskStrangenessVsMultiplicity::Terminate(Option_t *)
1444{
1b914674 1445 // Draw result to the screen
1446 // Called once at the end of the query
1447
1448 TList *cRetrievedList = 0x0;
1449 cRetrievedList = (TList*)GetOutputData(1);
1450 if(!cRetrievedList){
1451 Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : ouput data container list not available\n");
1452 return;
1453 }
af0d4791 1454
1b914674 1455 fHistEventCounter = dynamic_cast<TH1D*> ( cRetrievedList->FindObject("fHistEventCounter") );
1456 if (!fHistEventCounter) {
1457 Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : fHistEventCounter not available");
1458 return;
1459 }
1460
1461 TCanvas *canCheck = new TCanvas("AliAnalysisTaskStrangenessVsMultiplicity","V0 Multiplicity",10,10,510,510);
1462 canCheck->cd(1)->SetLogy();
1463
1464 fHistEventCounter->SetMarkerStyle(22);
1465 fHistEventCounter->DrawCopy("E");
af0d4791 1466}
1467
1468//----------------------------------------------------------------------------
1469
1470Double_t AliAnalysisTaskStrangenessVsMultiplicity::MyRapidity(Double_t rE, Double_t rPz) const
1471{
1b914674 1472 // Local calculation for rapidity
1473 Double_t ReturnValue = -100;
1474 if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){
1475 ReturnValue = 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
1476 }
1477 return ReturnValue;
af0d4791 1478}