1 /**************************************************************************
2 * Author: Boris Hippolyte. *
3 * Contributors are mentioned in the code where appropriate. *
5 * Permission to use, copy, modify and distribute this software and its *
6 * documentation strictly for non-commercial purposes is hereby granted *
7 * without fee, provided that the above copyright notice appears in all *
8 * copies and that both the copyright notice and this permission notice *
9 * appear in the supporting documentation. The authors make no claims *
10 * about the suitability of this software for any purpose. It is *
11 * provided "as is" without express or implied warranty. *
12 **************************************************************************/
14 //-----------------------------------------------------------------
15 // AliAnalysisTaskDedx class
16 // This task is for QAing the dE/dx from the ESD
17 // Origin: B.H. Nov2007, hippolyt@in2p3.fr
18 //-----------------------------------------------------------------
20 //-----------------------------------------------------------------
22 // 1) extent the use of fMidPseudoRapidityFlag to primaries
23 // 2) discuss the GetSigmaToVertex(AliESDtrack*)
24 // 3) decide the kind of refit to be used
25 //-----------------------------------------------------------------
33 #include "AliAnalysisTaskSE.h"
35 #include "AliESDEvent.h"
36 #include "AliESDVertex.h"
37 #include "AliAODEvent.h"
38 #include "AliAODVertex.h"
42 #include "AliAnalysisTaskDedx.h"
44 ClassImp(AliAnalysisTaskDedx)
46 //________________________________________________________________________
47 AliAnalysisTaskDedx::AliAnalysisTaskDedx()
48 : AliAnalysisTaskSE(), fAnalysisType("ESD"), fCollidingSystems(0), fListHist(),
49 fHistPtot(0), fHistMultiplicity(0), fHistTPCDedxVsMomentum(0), fHistITSDedxVsMomentum(0),
50 fHistMassK0(0), fHistMassLambda(0), fHistMassAntiLambda(0),
51 fHistTPCDedxVsMomPosK0(0), fHistTPCDedxVsMomNegK0(0),
52 fHistTPCDedxVsMomPosLambda(0), fHistTPCDedxVsMomNegLambda(0),
53 fHistTPCDedxVsMomPosAntiLambda(0), fHistTPCDedxVsMomNegAntiLambda(0),
54 fHistDiffInOutMomentum(0), fHistDiffPrimOutMomentum(0),
55 fHistDiffPrimMeanMomentum(0), fHistPercPrimMeanMomentum(0), fHistPrimEta(0),
56 fHistPercPrimMeanMomentumVsEta(0), fHistPercPrimMeanMomentumVsPrim(0),
58 fHistMultiplicityCuts(0), fHistTPCDedxVsMomentumCuts(0), fHistITSDedxVsMomentumCuts(0),
59 fHistMassK0Cuts(0), fHistMassLambdaCuts(0), fHistMassAntiLambdaCuts(0),
60 fHistTPCDedxVsMomPosK0Cuts(0), fHistTPCDedxVsMomNegK0Cuts(0),
61 fHistTPCDedxVsMomPosLambdaCuts(0), fHistTPCDedxVsMomNegLambdaCuts(0),
62 fHistTPCDedxVsMomPosAntiLambdaCuts(0), fHistTPCDedxVsMomNegAntiLambdaCuts(0),
63 fHistDiffInOutMomentumCuts(0), fHistDiffPrimOutMomentumCuts(0),
64 fHistDiffPrimMeanMomentumCuts(0), fHistPercPrimMeanMomentumCuts(0), fHistPrimEtaCuts(0),
65 fHistPercPrimMeanMomentumVsEtaCuts(0), fHistPercPrimMeanMomentumVsPrimCuts(0),
67 fAllConstrainedFlag(0), fMidPseudoRapidityFlag(0),
69 fSelTrackRemoveKink(0), fSelTrackWithOnTheFlyV0(0),
70 fSelTrackMinClustersTPC(0), fSelTrackMinClustersITS(0),
71 fSelTrackMaxChi2PerClusterTPC(0), fSelTrackMaxChi2PerClusterITS(0),
72 fSelTrackMaxCov11(0), fSelTrackMaxCov22(0), fSelTrackMaxCov33(0),
73 fSelTrackMaxCov44(0), fSelTrackMaxCov55(0),
74 fSelV0MaxDcaDaughters(0), fSelV0MinDecayLength(0)
78 //________________________________________________________________________
79 AliAnalysisTaskDedx::AliAnalysisTaskDedx(const char *rName,
80 const Bool_t rAllConstrainedFlag,
81 const Bool_t rMidPseudoRapidityFlag,
82 const Bool_t rSelTrackRemoveKink,
83 const Bool_t rSelTrackWithOnTheFlyV0,
84 const Int_t rSelTrackMinClustersTPC,
85 const Int_t rSelTrackMinClustersITS,
86 const Float_t rSelTrackMaxChi2PerClusterTPC,
87 const Float_t rSelTrackMaxChi2PerClusterITS,
88 const Double_t rSelTrackMaxCov11,
89 const Double_t rSelTrackMaxCov22,
90 const Double_t rSelTrackMaxCov33,
91 const Double_t rSelTrackMaxCov44,
92 const Double_t rSelTrackMaxCov55,
93 const Double_t rSelV0MaxDcaDaughters,
94 const Double_t rSelV0MinDecayLength)
96 : AliAnalysisTaskSE(rName), fAnalysisType("ESD"), fCollidingSystems(0), fListHist(),
97 fHistPtot(0), fHistMultiplicity(0), fHistTPCDedxVsMomentum(0), fHistITSDedxVsMomentum(0),
98 fHistMassK0(0), fHistMassLambda(0), fHistMassAntiLambda(0),
99 fHistTPCDedxVsMomPosK0(0), fHistTPCDedxVsMomNegK0(0),
100 fHistTPCDedxVsMomPosLambda(0), fHistTPCDedxVsMomNegLambda(0),
101 fHistTPCDedxVsMomPosAntiLambda(0), fHistTPCDedxVsMomNegAntiLambda(0),
102 fHistDiffInOutMomentum(0), fHistDiffPrimOutMomentum(0),
103 fHistDiffPrimMeanMomentum(0), fHistPercPrimMeanMomentum(0), fHistPrimEta(0),
104 fHistPercPrimMeanMomentumVsEta(0), fHistPercPrimMeanMomentumVsPrim(0),
106 fHistMultiplicityCuts(0), fHistTPCDedxVsMomentumCuts(0), fHistITSDedxVsMomentumCuts(0),
107 fHistMassK0Cuts(0), fHistMassLambdaCuts(0), fHistMassAntiLambdaCuts(0),
108 fHistTPCDedxVsMomPosK0Cuts(0), fHistTPCDedxVsMomNegK0Cuts(0),
109 fHistTPCDedxVsMomPosLambdaCuts(0), fHistTPCDedxVsMomNegLambdaCuts(0),
110 fHistTPCDedxVsMomPosAntiLambdaCuts(0), fHistTPCDedxVsMomNegAntiLambdaCuts(0),
111 fHistDiffInOutMomentumCuts(0), fHistDiffPrimOutMomentumCuts(0),
112 fHistDiffPrimMeanMomentumCuts(0), fHistPercPrimMeanMomentumCuts(0), fHistPrimEtaCuts(0),
113 fHistPercPrimMeanMomentumVsEtaCuts(0), fHistPercPrimMeanMomentumVsPrimCuts(0),
115 fAllConstrainedFlag(rAllConstrainedFlag), fMidPseudoRapidityFlag(rMidPseudoRapidityFlag),
117 fSelTrackRemoveKink(rSelTrackRemoveKink), fSelTrackWithOnTheFlyV0(rSelTrackWithOnTheFlyV0),
118 fSelTrackMinClustersTPC(rSelTrackMinClustersTPC), fSelTrackMinClustersITS(rSelTrackMinClustersITS),
119 fSelTrackMaxChi2PerClusterTPC(rSelTrackMaxChi2PerClusterTPC), fSelTrackMaxChi2PerClusterITS(rSelTrackMaxChi2PerClusterITS),
120 fSelTrackMaxCov11(rSelTrackMaxCov11), fSelTrackMaxCov22(rSelTrackMaxCov22), fSelTrackMaxCov33(rSelTrackMaxCov33),
121 fSelTrackMaxCov44(rSelTrackMaxCov44), fSelTrackMaxCov55(rSelTrackMaxCov55),
122 fSelV0MaxDcaDaughters(rSelV0MaxDcaDaughters), fSelV0MinDecayLength(rSelV0MinDecayLength)
125 // Define output slots only here
126 // Output slot #1 writes into a TList container
127 DefineOutput(1, TList::Class());
129 //________________________________________________________________________
130 void AliAnalysisTaskDedx::UserCreateOutputObjects()
135 fListHist = new TList();
137 fHistPtot = new TH1F("fHistPtot", "P_{tot} distribution;P_{tot} (GeV/c);dN/dP_{tot} (c/GeV)", 15, 0.1, 3.1);
138 fHistPtot->SetMarkerStyle(kFullCircle);
139 fListHist->Add(fHistPtot);
141 if (!fHistMultiplicity) {
142 if (fCollidingSystems)
143 fHistMultiplicity = new TH1F("fHistMultiplicity", "Multiplicity distribution;Number of tracks;Events", 200, 0, 40000);
145 fHistMultiplicity = new TH1F("fHistMultiplicity", "Multiplicity distribution;Number of tracks;Events", 250, 0, 250);
146 fHistMultiplicity->SetMarkerStyle(kFullCircle);
147 fListHist->Add(fHistMultiplicity);
149 if (!fHistTPCDedxVsMomentum) {
150 fHistTPCDedxVsMomentum = new TH2F("h2TPCDedxVsMomentum","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
151 fListHist->Add(fHistTPCDedxVsMomentum);
153 if (!fHistITSDedxVsMomentum) {
154 fHistITSDedxVsMomentum = new TH2F("h2ITSDedxVsMomentum","Bethe-Bloch Distribution for ITS;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
155 fListHist->Add(fHistITSDedxVsMomentum);
158 fHistMassK0 = new TH1F("h1MassK0","K^{0} candidates;M(#pi^{+}#pi^{-}) (GeV/c^{2});Counts",100,0.4,0.6);
159 fListHist->Add(fHistMassK0);
161 if (!fHistMassLambda) {
162 fHistMassLambda = new TH1F("h1MassLambda","#Lambda^{0} candidates;M(p#pi^{-}) (GeV/c^{2});Counts",75,1.05,1.2);
163 fListHist->Add(fHistMassLambda);
165 if (!fHistMassAntiLambda) {
166 fHistMassAntiLambda = new TH1F("h1MassAntiLambda","#bar{#Lambda}^{0} candidates;M(#bar{p}#pi^{+}) (GeV/c^{2});Counts",75,1.05,1.2);
167 fListHist->Add(fHistMassAntiLambda);
169 if (!fHistTPCDedxVsMomPosK0) {
170 fHistTPCDedxVsMomPosK0 = new TH2F("h2TPCDedxVsMomPosK0","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
171 fListHist->Add(fHistTPCDedxVsMomPosK0);
173 if (!fHistTPCDedxVsMomNegK0) {
174 fHistTPCDedxVsMomNegK0 = new TH2F("h2TPCDedxVsMomNegK0","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
175 fListHist->Add(fHistTPCDedxVsMomNegK0);
177 if (!fHistTPCDedxVsMomPosLambda) {
178 fHistTPCDedxVsMomPosLambda = new TH2F("h2TPCDedxVsMomPosLambda","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
179 fListHist->Add(fHistTPCDedxVsMomPosLambda);
181 if (!fHistTPCDedxVsMomNegLambda) {
182 fHistTPCDedxVsMomNegLambda = new TH2F("h2TPCDedxVsMomNegLambda","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
183 fListHist->Add(fHistTPCDedxVsMomNegLambda);
185 if (!fHistTPCDedxVsMomPosAntiLambda) {
186 fHistTPCDedxVsMomPosAntiLambda = new TH2F("h2TPCDedxVsMomPosAntiLambda","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
187 fListHist->Add(fHistTPCDedxVsMomPosAntiLambda);
189 if (!fHistTPCDedxVsMomNegAntiLambda) {
190 fHistTPCDedxVsMomNegAntiLambda = new TH2F("h2TPCDedxVsMomNegAntiLambda","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
191 fListHist->Add(fHistTPCDedxVsMomNegAntiLambda);
193 if (!fHistDiffInOutMomentum) {
194 fHistDiffInOutMomentum = new TH1F("h1DiffInOutMomentum","Momentum Difference In-Out;Momentum (GeV/c);Counts",200,-0.1,0.1);
195 fListHist->Add(fHistDiffInOutMomentum);
197 if (!fHistDiffPrimOutMomentum) {
198 fHistDiffPrimOutMomentum = new TH1F("h1DiffPrimOutMomentum","Momentum Difference Prim-Out;Momentum (GeV/c);Counts",200,-0.1,0.1);
199 fListHist->Add(fHistDiffPrimOutMomentum);
201 if (!fHistDiffPrimMeanMomentum) {
202 fHistDiffPrimMeanMomentum = new TH1F("h1DiffPrimMeanMomentum","Momentum Difference Prim-Mean;Momentum (GeV/c);Counts",200,-0.1,0.1);
203 fListHist->Add(fHistDiffPrimMeanMomentum);
205 if (!fHistPercPrimMeanMomentum) {
206 fHistPercPrimMeanMomentum = new TH1F("h1PercPrimMeanMomentum","Momentum Percentage (Prim-Mean)/Prim;(Primary-Mean)/Primary (%);Counts",200,-10,10);
207 fListHist->Add(fHistPercPrimMeanMomentum);
210 fHistPrimEta = new TH1F("h1PrimEta","Pseudorapidity Distribution (Primaries);#eta;Counts",300,-1.5,1.5);
211 fListHist->Add(fHistPrimEta);
213 if (!fHistPercPrimMeanMomentumVsEta) {
214 fHistPercPrimMeanMomentumVsEta = new TH2F("h2PercPrimMeanMomentumVsEta","Momentum Percentage (Prim-Mean)/Prim vs #eta;#eta;(Primary-Mean)/Primary (%)",100,-1.5,1.5,100,-10,10);
215 fListHist->Add(fHistPercPrimMeanMomentumVsEta);
217 if (!fHistPercPrimMeanMomentumVsPrim) {
218 fHistPercPrimMeanMomentumVsPrim = new TH2F("h2PercPrimMeanMomentumVsPrim","Momentum Percentage (Prim-Mean)/Prim vs Prim;Momentum (GeV/c);(Primary-Mean)/Primary (%)",1500,0,15,100,-10,10);
219 fListHist->Add(fHistPercPrimMeanMomentumVsPrim);
221 // Histograms after selections
222 if (!fHistMultiplicityCuts) {
223 if (fCollidingSystems)
224 fHistMultiplicityCuts = new TH1F("fHistMultiplicityCuts", "Multiplicity distribution;Number of tracks;Events", 200, 0, 40000);
226 fHistMultiplicityCuts = new TH1F("h1HistMultiplicityCuts","Number of Good tracks;Number of tracks;Event", 250, 0, 250);
227 fListHist->Add(fHistMultiplicityCuts);
229 if (!fHistTPCDedxVsMomentumCuts) {
230 fHistTPCDedxVsMomentumCuts = new TH2F("h2TPCDedxVsMomentumCuts","Bethe-Bloch Distribution for TPC w/cuts;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
231 fListHist->Add(fHistTPCDedxVsMomentumCuts);
233 if (!fHistITSDedxVsMomentumCuts) {
234 fHistITSDedxVsMomentumCuts = new TH2F("h2ITSDedxVsMomentumCuts","Bethe-Bloch Distribution for ITS w/cuts;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
235 fListHist->Add(fHistITSDedxVsMomentumCuts);
237 if (!fHistMassK0Cuts) {
238 fHistMassK0Cuts = new TH1F("h1MassK0Cuts","K^{0} candidates;M(#pi^{+}#pi^{-}) (GeV/c^{2});Counts",100,0.4,0.6);
239 fListHist->Add(fHistMassK0Cuts);
241 if (!fHistMassLambdaCuts) {
242 fHistMassLambdaCuts = new TH1F("h1MassLambdaCuts","#Lambda^{0} candidates;M(p#pi^{-}) (GeV/c^{2});Counts",75,1.05,1.2);
243 fListHist->Add(fHistMassLambdaCuts);
245 if (!fHistMassAntiLambdaCuts) {
246 fHistMassAntiLambdaCuts = new TH1F("h1MassAntiLambdaCuts","#bar{#Lambda}^{0} candidates;M(#bar{p}#pi^{+}) (GeV/c^{2});Counts",75,1.05,1.2);
247 fListHist->Add(fHistMassAntiLambdaCuts);
249 if (!fHistTPCDedxVsMomPosK0Cuts) {
250 fHistTPCDedxVsMomPosK0Cuts = new TH2F("h2TPCDedxVsMomPosK0Cuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
251 fListHist->Add(fHistTPCDedxVsMomPosK0Cuts);
253 if (!fHistTPCDedxVsMomNegK0Cuts) {
254 fHistTPCDedxVsMomNegK0Cuts = new TH2F("h2TPCDedxVsMomNegK0Cuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
255 fListHist->Add(fHistTPCDedxVsMomNegK0Cuts);
257 if (!fHistTPCDedxVsMomPosLambdaCuts) {
258 fHistTPCDedxVsMomPosLambdaCuts = new TH2F("h2TPCDedxVsMomPosLambdaCuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
259 fListHist->Add(fHistTPCDedxVsMomPosLambdaCuts);
261 if (!fHistTPCDedxVsMomNegLambdaCuts) {
262 fHistTPCDedxVsMomNegLambdaCuts = new TH2F("h2TPCDedxVsMomNegLambdaCuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
263 fListHist->Add(fHistTPCDedxVsMomNegLambdaCuts);
265 if (!fHistTPCDedxVsMomPosAntiLambdaCuts) {
266 fHistTPCDedxVsMomPosAntiLambdaCuts = new TH2F("h2TPCDedxVsMomPosAntiLambdaCuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
267 fListHist->Add(fHistTPCDedxVsMomPosAntiLambdaCuts);
269 if (!fHistTPCDedxVsMomNegAntiLambdaCuts) {
270 fHistTPCDedxVsMomNegAntiLambdaCuts = new TH2F("h2TPCDedxVsMomNegAntiLambdaCuts","Bethe-Bloch Distribution for TPC;Momentum (GeV/c);dE/dx (A.U.)",1500,0,15,100,0,100);
271 fListHist->Add(fHistTPCDedxVsMomNegAntiLambdaCuts);
273 if (!fHistDiffInOutMomentumCuts) {
274 fHistDiffInOutMomentumCuts = new TH1F("h1DiffInOutMomentumCuts","Momentum Difference In-Out;Momentum (GeV/c);Counts",200,-0.1,0.1);
275 fListHist->Add(fHistDiffInOutMomentumCuts);
277 if (!fHistDiffPrimOutMomentumCuts) {
278 fHistDiffPrimOutMomentumCuts = new TH1F("h1DiffPrimOutMomentumCuts","Momentum Difference Prim-Out;Momentum (GeV/c);Counts",200,-0.1,0.1);
279 fListHist->Add(fHistDiffPrimOutMomentumCuts);
281 if (!fHistDiffPrimMeanMomentumCuts) {
282 fHistDiffPrimMeanMomentumCuts = new TH1F("h1DiffPrimMeanMomentumCuts","Momentum Difference Prim-Mean;Momentum (GeV/c);Counts",200,-0.1,0.1);
283 fListHist->Add(fHistDiffPrimMeanMomentumCuts);
285 if (!fHistPercPrimMeanMomentumCuts) {
286 fHistPercPrimMeanMomentumCuts = new TH1F("h1PercPrimMeanMomentumCuts","Momentum Percentage (Prim-Mean)/Prim;(Primary-Mean)/Primary (%);Counts",200,-10,10);
287 fListHist->Add(fHistPercPrimMeanMomentumCuts);
289 if (!fHistPrimEtaCuts) {
290 fHistPrimEtaCuts = new TH1F("h1PrimEtaCuts","Pseudorapidity Distribution (Primaries);#eta;Counts",300,-1.5,1.5);
291 fListHist->Add(fHistPrimEtaCuts);
293 if (!fHistPercPrimMeanMomentumVsEtaCuts) {
294 fHistPercPrimMeanMomentumVsEtaCuts = new TH2F("h2PercPrimMeanMomentumVsEtaCuts","Momentum Percentage (Prim-Mean)/Prim vs #eta;#eta;(Primary-Mean)/Primary (%)",100,-1.5,1.5,100,-10,10);
295 fListHist->Add(fHistPercPrimMeanMomentumVsEtaCuts);
297 if (!fHistPercPrimMeanMomentumVsPrimCuts) {
298 fHistPercPrimMeanMomentumVsPrimCuts = new TH2F("h2PercPrimMeanMomentumVsPrimCuts","Momentum Percentage (Prim-Mean)/Prim vs Prim;Momentum (GeV/c);(Primary-Mean)/Primary (%)",1500,0,15,100,-10,10);
299 fListHist->Add(fHistPercPrimMeanMomentumVsPrimCuts);
303 //________________________________________________________________________
304 void AliAnalysisTaskDedx::UserExec(Option_t *)
307 // Called for each event
308 AliVEvent* lEvent = InputEvent();
310 Printf("ERROR: Event not available");
313 Int_t ntracks = lEvent->GetNumberOfTracks();
314 Printf("dE/dx analysis task: There are %d tracks in this event", ntracks);
316 Int_t nAllTracks = 0, nGoodTracks = 0;
317 Double_t lTPCDedx = 0, lITSDedx = 0;
319 if(fAnalysisType == "ESD") {
322 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
323 AliESDtrack* track = ((AliESDEvent*)lEvent)->GetTrack(iTracks);
325 Printf("ERROR: Could not retrieve track %d", iTracks);
328 fHistPtot->Fill(track->P()); // Fill a ptot spectrum before any selection
330 Double_t lPrimvtxMomemtum[3];
331 Bool_t lIsTrackConstrained = track->GetConstrainedPxPyPz(lPrimvtxMomemtum);
332 if (fAllConstrainedFlag && (!lIsTrackConstrained)) continue; // Constrained or not to Prim Vertex.
334 const AliExternalTrackParam *lInnerETP = track->GetInnerParam();
335 const AliExternalTrackParam *lOuterETP = track->GetOuterParam();
336 if ((!lInnerETP)||(!lOuterETP)) continue; // No inner nor outer params for this track.
338 Double_t lInnerMomentum = 0, lOuterMomentum = 0, lMeanMomentum = 0;
339 if (lInnerETP) lInnerMomentum = lInnerETP->GetP(); // The "inner" momentum.
340 if (lOuterETP) lOuterMomentum = lOuterETP->GetP(); // The "outer" momentum.
341 if (lInnerETP&&lOuterETP) lMeanMomentum = (lInnerMomentum+lOuterMomentum)/2.; // The "mean" momentum
343 lTPCDedx = track->GetTPCsignal();
344 lITSDedx = track->GetITSsignal();
345 // This needs to be discussed and implemented
346 // nSigmaToVertex = GetSigmaToVertex(track);
348 Float_t lPrimPseudoRap = 0, lPrimMomentum = 0;
349 if (lIsTrackConstrained){
350 TVector3 pPrimvtx(lPrimvtxMomemtum);
351 lPrimPseudoRap = pPrimvtx.Eta();
352 lPrimMomentum = pPrimvtx.Mag();
356 ((!fAllConstrainedFlag)||(TMath::Abs(lPrimPseudoRap) < 0.5)) &&
359 // fAllConstrained = 0 -> !fAllConstrained = 1 so ok anyway
360 // fAllConstrained = 1 -> !fAllConstrained = 0 so it depends on eta condition
363 fHistTPCDedxVsMomentum->Fill(lInnerMomentum,lTPCDedx);
364 fHistDiffInOutMomentum->Fill(lInnerMomentum-lOuterMomentum);
365 if (lIsTrackConstrained){
366 fHistITSDedxVsMomentum->Fill(lPrimMomentum,lITSDedx);
367 fHistDiffPrimOutMomentum->Fill(lPrimMomentum-lOuterMomentum);
368 fHistDiffPrimMeanMomentum->Fill(lPrimMomentum-lMeanMomentum);
370 fHistPercPrimMeanMomentum->Fill(100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
371 fHistPercPrimMeanMomentumVsEta->Fill(lPrimPseudoRap,100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
372 fHistPercPrimMeanMomentumVsPrim->Fill(lPrimMomentum,100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
374 fHistPrimEta->Fill(lPrimPseudoRap);
377 // (!fAllConstrainedFlag || (nSigmaToVertex < 3)) &&
380 fHistTPCDedxVsMomentumCuts->Fill(lInnerMomentum,lTPCDedx);
381 fHistDiffInOutMomentumCuts->Fill(lInnerMomentum-lOuterMomentum);
382 if (lIsTrackConstrained){
383 fHistITSDedxVsMomentumCuts->Fill(lPrimMomentum,lITSDedx);
384 fHistDiffPrimOutMomentumCuts->Fill(lPrimMomentum-lOuterMomentum);
385 fHistDiffPrimMeanMomentumCuts->Fill(lPrimMomentum-lMeanMomentum);
387 fHistPercPrimMeanMomentumCuts->Fill(100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
388 fHistPercPrimMeanMomentumVsEtaCuts->Fill(lPrimPseudoRap,100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
389 fHistPercPrimMeanMomentumVsPrimCuts->Fill(lPrimMomentum,100.*(lPrimMomentum-lMeanMomentum)/lPrimMomentum);
391 fHistPrimEtaCuts->Fill(lPrimPseudoRap);
397 fHistMultiplicity->Fill(ntracks);
398 fHistMultiplicityCuts->Fill(nGoodTracks);
401 nv0s = lEvent->GetNumberOfV0s();
403 Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
404 Double_t lTPCDedxPos = 0, lTPCDedxNeg = 0;
405 Float_t lInvMassK0 = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
406 for (Int_t iV0 = 0; iV0 < nv0s; iV0++)
407 {// This is the V0 loop
408 AliESDv0 *v0 = ((AliESDEvent*)lEvent)->GetV0(iV0);
410 if (v0->GetOnFlyStatus() != fSelTrackWithOnTheFlyV0) continue;
412 const AliESDVertex *lPrimaryVertex = ((AliESDEvent*)lEvent)->GetPrimaryVertex();
413 Double_t tPositionPrimaryVertex[3]; lPrimaryVertex->GetXYZ(tPositionPrimaryVertex);
414 Double_t v0PositionX = 0, v0PositionY = 0, v0PositionZ = 0; v0->GetXYZ(v0PositionX,v0PositionY,v0PositionZ);
415 Double_t v0DecayLength = TMath::Sqrt(
416 (v0PositionX-tPositionPrimaryVertex[0])*(v0PositionX-tPositionPrimaryVertex[0])+
417 (v0PositionY-tPositionPrimaryVertex[1])*(v0PositionY-tPositionPrimaryVertex[1])+
418 (v0PositionZ-tPositionPrimaryVertex[2])*(v0PositionZ-tPositionPrimaryVertex[2])
420 if (v0->GetDcaV0Daughters() > fSelV0MaxDcaDaughters) continue;
421 if (v0DecayLength < fSelV0MinDecayLength) continue;
423 // Getting invariant mass infos directly from ESD
424 v0->ChangeMassHypothesis(310);
425 lInvMassK0 = v0->GetEffMass();
426 v0->ChangeMassHypothesis(3122);
427 lInvMassLambda = v0->GetEffMass();
428 v0->ChangeMassHypothesis(-3122);
429 lInvMassAntiLambda = v0->GetEffMass();
431 // Filling invariant mass histos for all candidates
432 fHistMassK0->Fill(lInvMassK0);
433 fHistMassLambda->Fill(lInvMassLambda);
434 fHistMassAntiLambda->Fill(lInvMassAntiLambda);
436 // Accessing the daughter track infos
437 lIndexTrackPos = TMath::Abs(v0->GetPindex());
438 lIndexTrackNeg = TMath::Abs(v0->GetNindex());
439 AliESDtrack* trackPos =((AliESDEvent*)lEvent)->GetTrack(lIndexTrackPos);
440 AliESDtrack* trackNeg =((AliESDEvent*)lEvent)->GetTrack(lIndexTrackNeg);
442 Double_t lPrimvtxMomPos[3];
443 Bool_t lIsPosConstrained = trackPos->GetConstrainedPxPyPz(lPrimvtxMomPos);
444 if (fAllConstrainedFlag && (!lIsPosConstrained)) continue; // Constrained or not to Prim Vertex.
446 Double_t lPrimvtxMomNeg[3];
447 Bool_t lIsNegConstrained = trackNeg->GetConstrainedPxPyPz(lPrimvtxMomNeg);
448 if (fAllConstrainedFlag && (!lIsNegConstrained)) continue; // Constrained or not to Prim Vertex.
450 const AliExternalTrackParam *lInnerPosETP = trackPos->GetInnerParam();
451 const AliExternalTrackParam *lInnerNegETP = trackNeg->GetInnerParam();
452 if ((!lInnerPosETP)||(!lInnerNegETP)) continue; // No inner params for at least one track.
454 Double_t lInnerMomPos = 0, lInnerMomNeg = 0;
455 if (lInnerPosETP) lInnerMomPos = lInnerPosETP->GetP();
456 if (lInnerNegETP) lInnerMomNeg = lInnerNegETP->GetP();
458 lTPCDedxPos = trackPos->GetTPCsignal();
459 lTPCDedxNeg = trackNeg->GetTPCsignal();
461 Float_t lPrimPseudoRapPos = 0, lPrimPseudoRapNeg = 0;
462 if (lIsPosConstrained && lIsNegConstrained){
463 TVector3 pPrimPos(lPrimvtxMomPos);
464 TVector3 pPrimNeg(lPrimvtxMomNeg);
465 lPrimPseudoRapPos = pPrimPos.Eta();
466 lPrimPseudoRapNeg = pPrimNeg.Eta();
469 if (TMath::Abs(lInvMassK0-0.497)<0.01) {
470 fHistMassK0Cuts->Fill(lInvMassK0);
471 fHistTPCDedxVsMomPosK0->Fill(lInnerMomPos,lTPCDedxPos);
472 fHistTPCDedxVsMomNegK0->Fill(lInnerMomNeg,lTPCDedxNeg);
474 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapPos) < 0.5) &&
475 (IsAccepted(trackPos))
477 fHistTPCDedxVsMomPosK0Cuts->Fill(lInnerMomPos,lTPCDedxPos);
479 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapNeg) < 0.5) &&
480 (IsAccepted(trackNeg))
482 fHistTPCDedxVsMomNegK0Cuts->Fill(lInnerMomNeg,lTPCDedxNeg);
484 if (TMath::Abs(lInvMassLambda-1.115)<0.01) {
485 fHistMassLambdaCuts->Fill(lInvMassLambda);
486 fHistTPCDedxVsMomPosLambda->Fill(lInnerMomPos,lTPCDedxPos);
487 fHistTPCDedxVsMomNegLambda->Fill(lInnerMomNeg,lTPCDedxNeg);
489 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapPos) < 0.5) &&
490 (IsAccepted(trackPos))
492 fHistTPCDedxVsMomPosLambdaCuts->Fill(lInnerMomPos,lTPCDedxPos);
494 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapNeg) < 0.5) &&
495 (IsAccepted(trackNeg))
497 fHistTPCDedxVsMomNegLambdaCuts->Fill(lInnerMomNeg,lTPCDedxNeg);
499 if (TMath::Abs(lInvMassAntiLambda-1.115)<0.01) {
500 fHistMassAntiLambdaCuts->Fill(lInvMassAntiLambda);
501 fHistTPCDedxVsMomPosAntiLambda->Fill(lInnerMomPos,lTPCDedxPos);
502 fHistTPCDedxVsMomNegAntiLambda->Fill(lInnerMomNeg,lTPCDedxNeg);
504 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapPos) < 0.5) &&
505 (IsAccepted(trackPos))
507 fHistTPCDedxVsMomPosAntiLambdaCuts->Fill(lInnerMomPos,lTPCDedxPos);
509 (!fMidPseudoRapidityFlag) || ( TMath::Abs(lPrimPseudoRapNeg) < 0.5) &&
510 (IsAccepted(trackNeg))
512 fHistTPCDedxVsMomNegAntiLambdaCuts->Fill(lInnerMomNeg,lTPCDedxNeg);
518 PostData(1, fListHist);
521 //________________________________________________________________________
522 void AliAnalysisTaskDedx::Terminate(Option_t *)
524 // Draw result to the screen
525 // Called once at the end of the query
527 Printf("Reminder for options and selections: fAllConstrainedFlag = %d fMidPseudoRapidityFlag = %d fSelTrackRemoveKink = %d fSelTrackWithOnTheFlyV0 = %d fSelTrackMinClustersTPC = %d fSelTrackMinClustersITS = %d fSelTrackMaxChi2PerClusterTPC = %.2f fSelTrackMaxChi2PerClusterITS = %.2f fSelTrackMaxCov11 = %.2f fSelTrackMaxCov22 = %.2f fSelTrackMaxCov33 = %.2f fSelTrackMaxCov44 = %.2f fSelTrackMaxCov55 = %.2f fSelV0MaxDcaDaughters = %.2f fSelV0MinDecayLength= %.2f",
529 fMidPseudoRapidityFlag,fSelTrackRemoveKink,fSelTrackWithOnTheFlyV0,
530 fSelTrackMinClustersTPC,fSelTrackMinClustersITS,
531 fSelTrackMaxChi2PerClusterTPC,fSelTrackMaxChi2PerClusterITS,
532 fSelTrackMaxCov11,fSelTrackMaxCov22,fSelTrackMaxCov33,fSelTrackMaxCov44,fSelTrackMaxCov55,
533 fSelV0MaxDcaDaughters,fSelV0MinDecayLength);
535 fHistPtot = dynamic_cast<TH1F*> (((TList*)GetOutputData(1))->FindObject("fHistPtot"));
537 Printf("ERROR: fHistPtot not available");
541 TCanvas *cTaskDedx = new TCanvas("AliAnalysisTaskESDDedx","Ptot",10,10,510,510);
542 if(fHistPtot->GetMaximum() > 0.) cTaskDedx->cd(1)->SetLogy();
543 fHistPtot->DrawCopy("E");
545 //____________________________________________________________________//
546 Bool_t AliAnalysisTaskDedx::IsAccepted(AliESDtrack* track) {
547 // Checks if the track is excluded from the cuts
550 Int_t nClustersITS = track->GetITSclusters(fIdxInt);
551 Int_t nClustersTPC = track->GetTPCclusters(fIdxInt);
553 Float_t chi2PerClusterITS = -1;
554 Float_t chi2PerClusterTPC = -1;
556 chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC);
559 track->GetExternalCovariance(extCov);
561 if (fSelTrackRemoveKink)
562 if (track->GetKinkIndex(0)>0) return kFALSE;
563 if (fSelTrackMinClustersTPC)
564 if (nClustersTPC < fSelTrackMinClustersTPC) return kFALSE;
565 if (fSelTrackMinClustersITS)
566 if (nClustersITS < fSelTrackMinClustersITS) return kFALSE;
567 if (fSelTrackMaxChi2PerClusterTPC)
568 if (chi2PerClusterTPC > fSelTrackMaxChi2PerClusterTPC) return kFALSE;
569 if (fSelTrackMaxChi2PerClusterITS)
570 if (chi2PerClusterITS > fSelTrackMaxChi2PerClusterITS) return kFALSE;
572 if (fSelTrackMaxCov11)
573 if (extCov[0] > fSelTrackMaxCov11) return kFALSE;
574 if (fSelTrackMaxCov22)
575 if (extCov[2] > fSelTrackMaxCov22) return kFALSE;
576 if (fSelTrackMaxCov33)
577 if (extCov[5] > fSelTrackMaxCov33) return kFALSE;
578 if (fSelTrackMaxCov44)
579 if (extCov[9] > fSelTrackMaxCov44) return kFALSE;
580 if(fSelTrackMaxCov55)
581 if (extCov[14] > fSelTrackMaxCov55) return kFALSE;
583 if(fMaxSigmaToVertexFlag)
584 if(GetSigmaToVertex(track) > fMaxSigmaToVertex) return kFALSE;
586 if ((track->GetStatus() & AliESDtrack::kITSrefit) == 0) return kFALSE;
588 if ((track->GetStatus() & AliESDtrack::kTPCrefit) == 0) return kFALSE;
589 if((Pt < fMinPt) || (Pt > fMaxPt)) return kFALSE;