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 //-----------------------------------------------------------------------
17 // This class stores QA variables as function of pT for different type
18 // of tracks and track selection criteria
19 // Output: Histograms for different set of cuts
20 //-----------------------------------------------------------------------
21 // Author : Marta Verweij - UU
22 //-----------------------------------------------------------------------
24 #ifndef ALIPWG4HIGHPTTRACKQA_CXX
25 #define ALIPWG4HIGHPTTRACKQA_CXX
27 #include "AliPWG4HighPtTrackQA.h"
41 #include "AliAnalysisManager.h"
42 #include "AliESDInputHandler.h"
43 #include "AliMCEvent.h"
44 #include "AliMCEventHandler.h"
46 #include "AliESDtrack.h"
47 #include "AliESDtrackCuts.h"
48 #include "AliExternalTrackParam.h"
50 #include "AliGenPythiaEventHeader.h"
51 #include "AliGenCocktailEventHeader.h"
52 #include "AliCentrality.h"
53 #include "AliAODVertex.h"
54 #include "AliAODEvent.h"
55 //#include "AliAnalysisHelperJetTasks.h"
57 using namespace std; //required for resolving the 'cout' symbol
59 ClassImp(AliPWG4HighPtTrackQA)
61 AliPWG4HighPtTrackQA::AliPWG4HighPtTrackQA()
62 : AliAnalysisTaskSE(),
68 fTrackCutsITSLoose(0x0),
69 fTrackCutsTPConly(0x0),
72 fSigmaConstrainedMax(-1.),
88 fh1NTracksReject(0x0),
99 fPtNSigmaToVertex(0x0),
100 fPtRelUncertainty1Pt(0x0),
101 fPtUncertainty1Pt(0x0),
102 fPtChi2PerClusterTPC(0x0),
103 fPtNCrossedRows(0x0),
104 fPtNCrossedRowsNClusF(0x0),
105 fPtNCrRNCrRNClusF(0x0),
113 fProfPtSigmaSnp2(0x0),
114 fProfPtSigmaTgl2(0x0),
115 fProfPtSigma1Pt2(0x0),
116 fProfPtSigma1Pt(0x0),
117 fProfPtPtSigma1Pt(0x0),
123 fPtBinEdges[0][0] = 10.;
124 fPtBinEdges[0][1] = 1.;
125 fPtBinEdges[1][0] = 20.;
126 fPtBinEdges[1][1] = 2.;
127 fPtBinEdges[2][0] = 50.;
128 fPtBinEdges[2][1] = 5.;
131 //________________________________________________________________________
132 AliPWG4HighPtTrackQA::AliPWG4HighPtTrackQA(const char *name):
133 AliAnalysisTaskSE(name),
139 fTrackCutsITSLoose(0x0),
140 fTrackCutsTPConly(0x0),
143 fSigmaConstrainedMax(-1.),
159 fh1NTracksReject(0x0),
167 fPtNClustersTPC(0x0),
170 fPtNSigmaToVertex(0x0),
171 fPtRelUncertainty1Pt(0x0),
172 fPtUncertainty1Pt(0x0),
173 fPtChi2PerClusterTPC(0x0),
174 fPtNCrossedRows(0x0),
175 fPtNCrossedRowsNClusF(0x0),
176 fPtNCrRNCrRNClusF(0x0),
184 fProfPtSigmaSnp2(0x0),
185 fProfPtSigmaTgl2(0x0),
186 fProfPtSigma1Pt2(0x0),
187 fProfPtSigma1Pt(0x0),
188 fProfPtPtSigma1Pt(0x0),
193 // Constructor. Initialization of Inputs and Outputs
195 AliDebug(2,Form("AliPWG4HighPtTrackQA Calling Constructor"));
199 fPtBinEdges[0][0] = 10.;
200 fPtBinEdges[0][1] = 1.;
201 fPtBinEdges[1][0] = 20.;
202 fPtBinEdges[1][1] = 2.;
203 fPtBinEdges[2][0] = 50.;
204 fPtBinEdges[2][1] = 5.;
206 // Input slot #0 works with a TChain ESD
207 DefineInput(0, TChain::Class());
208 // Output slot #1 write into a TList
209 DefineOutput(1, TList::Class());
212 //________________________________________________________________________
213 void AliPWG4HighPtTrackQA::SetPtBinEdges(Int_t region, Double_t ptmax, Double_t ptBinWidth) {
216 fPtBinEdges[region][0] = ptmax;
217 fPtBinEdges[region][1] = ptBinWidth;
220 AliError("Only 3 regions alowed. Use region 0/1/2\n");
226 //________________________________________________________________________
227 void AliPWG4HighPtTrackQA::UserCreateOutputObjects() {
228 //Create output objects
229 AliDebug(2,Form(">> AliPWG4HighPtTrackQA::UserCreateOutputObjects \n"));
231 Bool_t oldStatus = TH1::AddDirectoryStatus();
232 TH1::AddDirectory(kFALSE);
235 fHistList = new TList();
236 fHistList->SetOwner(kTRUE);
238 Float_t fgkPtMin = 0.;
239 Float_t fgkPtMax = fPtMax;
241 // Float_t ptBinEdges[2][2];
242 // ptBinEdges[0][0] = 10.;
243 // ptBinEdges[0][1] = 1.;
244 // ptBinEdges[1][0] = 20.;
245 // ptBinEdges[1][1] = 2.;
246 // Float_t binWidth3 = 5.;
248 // ptBinEdges[0][0] = 100.;
249 // ptBinEdges[0][1] = 5.;
250 // ptBinEdges[1][0] = 300.;
251 // ptBinEdges[1][1] = 10.;
255 //fPtBinEdges[region][0] = ptmax of region ; fPtBinEdges[region][1] = binWidth of region
256 const Float_t ptmin1 = fgkPtMin;
257 const Float_t ptmax1 = fPtBinEdges[0][0];
258 const Float_t ptmin2 = ptmax1 ;
259 const Float_t ptmax2 = fPtBinEdges[1][0];
260 const Float_t ptmin3 = ptmax2 ;
261 const Float_t ptmax3 = fgkPtMax;
262 const Int_t nbin11 = (int)((ptmax1-ptmin1)/fPtBinEdges[0][1]);
263 const Int_t nbin12 = (int)((ptmax2-ptmin2)/fPtBinEdges[1][1])+nbin11;
264 const Int_t nbin13 = (int)((ptmax3-ptmin3)/fPtBinEdges[2][1])+nbin12;
265 Int_t fgkNPtBins=nbin13;
266 //Create array with low edges of each bin
267 Double_t *binsPt=new Double_t[fgkNPtBins+1];
268 for(Int_t i=0; i<=fgkNPtBins; i++) {
269 if(i<=nbin11) binsPt[i]=(Double_t)ptmin1 + (ptmax1-ptmin1)/nbin11*(Double_t)i ;
270 if(i<=nbin12 && i>nbin11) binsPt[i]=(Double_t)ptmin2 + (ptmax2-ptmin2)/(nbin12-nbin11)*((Double_t)i-(Double_t)nbin11) ;
271 if(i<=nbin13 && i>nbin12) binsPt[i]=(Double_t)ptmin3 + (ptmax3-ptmin3)/(nbin13-nbin12)*((Double_t)i-(Double_t)nbin12) ;
274 Int_t fgkNPhiBins = 18*6;
275 Float_t kMinPhi = 0.;
276 Float_t kMaxPhi = 2.*TMath::Pi();
277 Double_t *binsPhi = new Double_t[fgkNPhiBins+1];
278 for(Int_t i=0; i<=fgkNPhiBins; i++) binsPhi[i]=(Double_t)kMinPhi + (kMaxPhi-kMinPhi)/fgkNPhiBins*(Double_t)i ;
280 Int_t fgkNEtaBins=20;
281 Float_t fgkEtaMin = -1.;
282 Float_t fgkEtaMax = 1.;
283 Double_t *binsEta=new Double_t[fgkNEtaBins+1];
284 for(Int_t i=0; i<=fgkNEtaBins; i++) binsEta[i]=(Double_t)fgkEtaMin + (fgkEtaMax-fgkEtaMin)/fgkNEtaBins*(Double_t)i ;
286 Int_t fgkNNClustersTPCBins=80;
287 Float_t fgkNClustersTPCMin = 0.5;
288 Float_t fgkNClustersTPCMax = 160.5;
289 Double_t *binsNClustersTPC=new Double_t[fgkNNClustersTPCBins+1];
290 for(Int_t i=0; i<=fgkNNClustersTPCBins; i++) binsNClustersTPC[i]=(Double_t)fgkNClustersTPCMin + (fgkNClustersTPCMax-fgkNClustersTPCMin)/fgkNNClustersTPCBins*(Double_t)i ;
292 Int_t fgkNDCA2DBins=80;
293 Float_t fgkDCA2DMin = -0.2;
294 Float_t fgkDCA2DMax = 0.2;
295 if(fTrackType==1 || fTrackType==2 || fTrackType==4) {
299 Double_t *binsDCA2D=new Double_t[fgkNDCA2DBins+1];
300 for(Int_t i=0; i<=fgkNDCA2DBins; i++) binsDCA2D[i]=(Double_t)fgkDCA2DMin + (fgkDCA2DMax-fgkDCA2DMin)/fgkNDCA2DBins*(Double_t)i ;
302 Int_t fgkNDCAZBins=80;
303 Float_t fgkDCAZMin = -2.;
304 Float_t fgkDCAZMax = 2.;
305 if(fTrackType==1 || fTrackType==2 || fTrackType==4) {
309 Double_t *binsDCAZ=new Double_t[fgkNDCAZBins+1];
310 for(Int_t i=0; i<=fgkNDCAZBins; i++) binsDCAZ[i]=(Double_t)fgkDCAZMin + (fgkDCAZMax-fgkDCAZMin)/fgkNDCAZBins*(Double_t)i ;
312 Int_t fgkNNPointITSBins=9;
313 Float_t fgkNPointITSMin = -0.5;
314 Float_t fgkNPointITSMax = 8.5;
315 Double_t *binsNPointITS=new Double_t[fgkNNPointITSBins+1];
316 for(Int_t i=0; i<=fgkNNPointITSBins; i++) binsNPointITS[i]=(Double_t)fgkNPointITSMin + (fgkNPointITSMax-fgkNPointITSMin)/fgkNNPointITSBins*(Double_t)i ;
318 Int_t fgkNNSigmaToVertexBins=40;
319 Float_t fgkNSigmaToVertexMin = 0.;
320 Float_t fgkNSigmaToVertexMax = 8.;
321 Double_t *binsNSigmaToVertex=new Double_t[fgkNNSigmaToVertexBins+1];
322 for(Int_t i=0; i<=fgkNNSigmaToVertexBins; i++) binsNSigmaToVertex[i]=(Double_t)fgkNSigmaToVertexMin + (fgkNSigmaToVertexMax-fgkNSigmaToVertexMin)/fgkNNSigmaToVertexBins*(Double_t)i ;
324 Int_t fgkNChi2CBins=20;
325 Float_t fgkChi2CMin = 0.;
326 Float_t fgkChi2CMax = 100.;
327 Double_t *binsChi2C=new Double_t[fgkNChi2CBins+1];
328 for(Int_t i=0; i<=fgkNChi2CBins; i++) binsChi2C[i]=(Double_t)fgkChi2CMin + (fgkChi2CMax-fgkChi2CMin)/fgkNChi2CBins*(Double_t)i ;
330 Int_t fgkNRel1PtUncertaintyBins=30;
331 Float_t fgkRel1PtUncertaintyMin = 0.;
332 Float_t fgkRel1PtUncertaintyMax = 0.3;
333 if(fTrackType==1 || fTrackType==2 || fTrackType==4)
334 fgkRel1PtUncertaintyMax = 0.5;
335 Double_t *binsRel1PtUncertainty=new Double_t[fgkNRel1PtUncertaintyBins+1];
336 for(Int_t i=0; i<=fgkNRel1PtUncertaintyBins; i++) binsRel1PtUncertainty[i]=(Double_t)fgkRel1PtUncertaintyMin + (fgkRel1PtUncertaintyMax-fgkRel1PtUncertaintyMin)/fgkNRel1PtUncertaintyBins*(Double_t)i ;
338 Int_t fgkNUncertainty1PtBins = 30;
339 Float_t fgkUncertainty1PtMin = 0.;
340 Float_t fgkUncertainty1PtMax = 0.1;
341 if(fTrackType==1 || fTrackType==2 || fTrackType==4)
342 fgkUncertainty1PtMax = 0.2;
343 Double_t *binsUncertainty1Pt=new Double_t[fgkNUncertainty1PtBins+1];
344 for(Int_t i=0; i<=fgkNUncertainty1PtBins; i++) binsUncertainty1Pt[i]=(Double_t)fgkUncertainty1PtMin + (fgkUncertainty1PtMax-fgkUncertainty1PtMin)/fgkNUncertainty1PtBins*(Double_t)i ;
346 Float_t fgkChi2PerClusMin = 0.;
347 Float_t fgkChi2PerClusMax = 4.;
348 Int_t fgkNChi2PerClusBins = (int)(fgkChi2PerClusMax*10.);
349 Double_t *binsChi2PerClus=new Double_t[fgkNChi2PerClusBins+1];
350 for(Int_t i=0; i<=fgkNChi2PerClusBins; i++) binsChi2PerClus[i]=(Double_t)fgkChi2PerClusMin + (fgkChi2PerClusMax-fgkChi2PerClusMin)/fgkNChi2PerClusBins*(Double_t)i ;
352 Int_t fgkNCrossedRowsNClusFBins = 50;
353 Float_t fgkNCrossedRowsNClusFMin = 0.;
354 Float_t fgkNCrossedRowsNClusFMax = 1.;
355 Double_t *binsNCrossedRowsNClusF=new Double_t[fgkNCrossedRowsNClusFBins+1];
356 for(Int_t i=0; i<=fgkNCrossedRowsNClusFBins; i++) binsNCrossedRowsNClusF[i]=(Double_t)fgkNCrossedRowsNClusFMin + (fgkNCrossedRowsNClusFMax-fgkNCrossedRowsNClusFMin)/fgkNCrossedRowsNClusFBins*(Double_t)i ;
358 Float_t fgk1PtMin = 0.;
359 Float_t fgk1PtMax = 6.;
360 Float_t binEdge1Pt1 = 1.;
361 Float_t binWidth1Pt1 = 0.05;
362 Int_t fgkN1PtBins1 = (int)((binEdge1Pt1-fgk1PtMin)/binWidth1Pt1);
363 Float_t binWidth1Pt2 = 0.1;
364 Int_t fgkN1PtBins2 = (int)((fgk1PtMax-binEdge1Pt1)/binWidth1Pt2);
365 Int_t fgkN1PtBins = fgkN1PtBins1+fgkN1PtBins2;
366 Double_t *bins1Pt=new Double_t[fgkN1PtBins+1];
368 for(Int_t i=0; i<=fgkN1PtBins; i++) {
370 bins1Pt[i]=(Double_t)fgk1PtMin + (Double_t)(binEdge1Pt1-fgk1PtMin)/(Double_t)fgkN1PtBins1*(Double_t)i;
371 if(i<=fgkN1PtBins && i>fgkN1PtBins1)
372 bins1Pt[i]=(Double_t)binEdge1Pt1 + (Double_t)(fgk1PtMax-binEdge1Pt1)/(Double_t)fgkN1PtBins2*(Double_t)(i-fgkN1PtBins1);
375 Int_t fgkNSigmaY2Bins = 50;
376 Float_t fgkSigmaY2Min = 0.;
377 Float_t fgkSigmaY2Max = 1.;
378 if(fTrackType==1) fgkSigmaY2Max = 4.;
379 if(fTrackType==2 || fTrackType==4) fgkSigmaY2Max = 0.1;
380 Double_t *binsSigmaY2=new Double_t[fgkNSigmaY2Bins+1];
381 for(Int_t i=0; i<=fgkNSigmaY2Bins; i++) binsSigmaY2[i]=(Double_t)fgkSigmaY2Min + (fgkSigmaY2Max-fgkSigmaY2Min)/fgkNSigmaY2Bins*(Double_t)i ;
383 Int_t fgkNSigmaZ2Bins = 50;
384 Float_t fgkSigmaZ2Min = 0.;
385 Float_t fgkSigmaZ2Max = 0.4;
386 Double_t *binsSigmaZ2=new Double_t[fgkNSigmaZ2Bins+1];
387 for(Int_t i=0; i<=fgkNSigmaZ2Bins; i++) binsSigmaZ2[i]=(Double_t)fgkSigmaZ2Min + (fgkSigmaZ2Max-fgkSigmaZ2Min)/fgkNSigmaZ2Bins*(Double_t)i ;
389 Int_t fgkNSigmaSnp2Bins = 50;
390 Float_t fgkSigmaSnp2Min = 0.;
391 Float_t fgkSigmaSnp2Max = 0.05;
392 if(fTrackType==1) fgkSigmaSnp2Max = 0.2;
393 if(fTrackType==2 || fTrackType==4) fgkSigmaSnp2Max = 0.1;
394 Double_t *binsSigmaSnp2=new Double_t[fgkNSigmaSnp2Bins+1];
395 for(Int_t i=0; i<=fgkNSigmaSnp2Bins; i++) binsSigmaSnp2[i]=(Double_t)fgkSigmaSnp2Min + (fgkSigmaSnp2Max-fgkSigmaSnp2Min)/fgkNSigmaSnp2Bins*(Double_t)i ;
397 Int_t fgkNSigmaTgl2Bins = 50;
398 Float_t fgkSigmaTgl2Min = 0.;
399 Float_t fgkSigmaTgl2Max = 0.1;
400 if(fTrackType==1) fgkSigmaTgl2Max = 0.2;
401 if(fTrackType==2 || fTrackType==4) fgkSigmaTgl2Max = 0.1;
402 Double_t *binsSigmaTgl2=new Double_t[fgkNSigmaTgl2Bins+1];
403 for(Int_t i=0; i<=fgkNSigmaTgl2Bins; i++) binsSigmaTgl2[i]=(Double_t)fgkSigmaTgl2Min + (fgkSigmaTgl2Max-fgkSigmaTgl2Min)/fgkNSigmaTgl2Bins*(Double_t)i ;
405 Int_t fgkNSigma1Pt2Bins = 50;
406 Float_t fgkSigma1Pt2Min = 0.;
407 Float_t fgkSigma1Pt2Max = 1.;
408 Double_t *binsSigma1Pt2=new Double_t[fgkNSigma1Pt2Bins+1];
409 for(Int_t i=0; i<=fgkNSigma1Pt2Bins; i++) binsSigma1Pt2[i]=(Double_t)fgkSigma1Pt2Min + (fgkSigma1Pt2Max-fgkSigma1Pt2Min)/fgkNSigma1Pt2Bins*(Double_t)i ;
412 fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5);
413 fHistList->Add(fNEventAll);
414 fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5);
415 fHistList->Add(fNEventSel);
416 fNEventReject = new TH1F("fNEventReject","Reason events are rejectected for analysis",20,0,20);
418 fNEventReject->Fill("noESD",0);
419 fNEventReject->Fill("Trigger",0);
420 fNEventReject->Fill("NTracks<2",0);
421 fNEventReject->Fill("noVTX",0);
422 fNEventReject->Fill("VtxStatus",0);
423 fNEventReject->Fill("NCont<2",0);
424 fNEventReject->Fill("ZVTX>10",0);
425 fNEventReject->Fill("cent",0);
426 fNEventReject->Fill("cent>90",0);
427 fHistList->Add(fNEventReject);
429 fh1Centrality = new TH1F("fh1Centrality","fh1Centrality; Centrality %",100,0,100);
430 fHistList->Add(fh1Centrality);
432 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
433 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
434 fHistList->Add(fh1Xsec);
436 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
437 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
438 fHistList->Add(fh1Trials);
440 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
441 fHistList->Add(fh1PtHard);
442 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
443 fHistList->Add(fh1PtHardTrials);
445 fh1NTracksAll = new TH1F("fh1NTracksAll","fh1NTracksAll",1,-0.5,0.5);
446 fHistList->Add(fh1NTracksAll);
448 fh1NTracksReject = new TH1F("fh1NTracksReject","fh1NTracksReject",1,-0.5,0.5);
449 fh1NTracksReject->Fill("noESDtrack",0);
450 fh1NTracksReject->Fill("noTPCInner",0);
451 fh1NTracksReject->Fill("FillTPC",0);
452 fh1NTracksReject->Fill("noTPConly",0);
453 fh1NTracksReject->Fill("relate",0);
454 fh1NTracksReject->Fill("trackCuts",0);
455 fh1NTracksReject->Fill("laser",0);
456 fh1NTracksReject->Fill("chi2",0);
457 fHistList->Add(fh1NTracksReject);
459 fh1NTracksSel = new TH1F("fh1NTracksSel","fh1NTracksSel",1,-0.5,0.5);
460 fHistList->Add(fh1NTracksSel);
462 fSystTrackCuts = new TH1F("fSystTrackCuts","fSystTrackCuts",1,-0.5,0.5);
463 fSystTrackCuts->Fill("noCut",0);
464 fSystTrackCuts->Fill("eta",0);
465 fSystTrackCuts->Fill("0.15<pT<1e10",0);
466 fSystTrackCuts->Fill("kink",0);
467 fSystTrackCuts->Fill("NClusterTPC",0);
468 fSystTrackCuts->Fill("Chi2PerNClusTPC",0);
469 fSystTrackCuts->Fill("DCA2D",0);
470 fHistList->Add(fSystTrackCuts);
473 fPtAll = new TH1F("fPtAll","PtAll",fgkNPtBins, binsPt);
474 fHistList->Add(fPtAll);
475 fPtSel = new TH1F("fPtSel","PtSel",fgkNPtBins, binsPt);
476 fHistList->Add(fPtSel);
478 fPtPhi = new TH2F("fPtPhi","fPtPhi",fgkNPtBins,binsPt,fgkNPhiBins,binsPhi);
479 fHistList->Add(fPtPhi);
481 fPtEta = new TH2F("fPtEta","fPtEta",fgkNPtBins,binsPt,fgkNEtaBins,binsEta);
482 fHistList->Add(fPtEta);
484 fPtDCA2D = new TH2F("fPtDCA2D","fPtDCA2D",fgkNPtBins,binsPt,fgkNDCA2DBins,binsDCA2D);
485 fHistList->Add(fPtDCA2D);
487 fPtDCAZ = new TH2F("fPtDCAZ","fPtDCAZ",fgkNPtBins,binsPt,fgkNDCAZBins,binsDCAZ);
488 fHistList->Add(fPtDCAZ);
490 fPtNClustersTPC = new TH2F("fPtNClustersTPC","fPtNClustersTPC",fgkNPtBins,binsPt,fgkNNClustersTPCBins,binsNClustersTPC);
491 fHistList->Add(fPtNClustersTPC);
493 fPtNPointITS = new TH2F("fPtNPointITS","fPtNPointITS",fgkNPtBins,binsPt,fgkNNPointITSBins,binsNPointITS);
494 fHistList->Add(fPtNPointITS);
496 fPtChi2C = new TH2F("fPtChi2C","fPtChi2C",fgkNPtBins,binsPt,fgkNChi2CBins,binsChi2C);
497 fHistList->Add(fPtChi2C);
499 fPtNSigmaToVertex = new TH2F("fPtNSigmaToVertex","fPtNSigmaToVertex",fgkNPtBins,binsPt,fgkNNSigmaToVertexBins,binsNSigmaToVertex);
500 fHistList->Add(fPtNSigmaToVertex);
502 fPtRelUncertainty1Pt = new TH2F("fPtRelUncertainty1Pt","fPtRelUncertainty1Pt",fgkNPtBins,binsPt,fgkNRel1PtUncertaintyBins,binsRel1PtUncertainty);
503 fHistList->Add(fPtRelUncertainty1Pt);
505 fPtUncertainty1Pt = new TH2F("fPtUncertainty1Pt","fPtUncertainty1Pt",fgkNPtBins,binsPt,fgkNUncertainty1PtBins,binsUncertainty1Pt);
506 fHistList->Add(fPtUncertainty1Pt);
508 fPtChi2PerClusterTPC = new TH2F("fPtChi2PerClusterTPC","fPtChi2PerClusterTPC",fgkNPtBins,binsPt,fgkNChi2PerClusBins,binsChi2PerClus);
509 fHistList->Add(fPtChi2PerClusterTPC);
511 fPtNCrossedRows = new TH2F("fPtNCrossedRows","fPtNCrossedRows",fgkNPtBins,binsPt,fgkNNClustersTPCBins,binsNClustersTPC);
512 fHistList->Add(fPtNCrossedRows);
514 fPtNCrossedRowsNClusF = new TH2F("fPtNCrossedRowsNClusF","fPtNCrossedRowsNClusF",fgkNPtBins,binsPt,fgkNCrossedRowsNClusFBins,binsNCrossedRowsNClusF);
515 fHistList->Add(fPtNCrossedRowsNClusF);
517 fPtNCrRNCrRNClusF = new TH3F("fPtNCrRNCrRNClusF","fPtNCrRNCrRNClusF",fgkNPtBins,binsPt,fgkNNClustersTPCBins,binsNClustersTPC,fgkNCrossedRowsNClusFBins,binsNCrossedRowsNClusF);
518 fHistList->Add(fPtNCrRNCrRNClusF);
520 fPtSigmaY2 = new TH2F("fPtSigmaY2","fPtSigmaY2",fgkN1PtBins,bins1Pt,fgkNSigmaY2Bins,binsSigmaY2);
521 fHistList->Add(fPtSigmaY2);
523 fPtSigmaZ2 = new TH2F("fPtSigmaZ2","fPtSigmaZ2",fgkN1PtBins,bins1Pt,fgkNSigmaZ2Bins,binsSigmaZ2);
524 fHistList->Add(fPtSigmaZ2);
526 fPtSigmaSnp2 = new TH2F("fPtSigmaSnp2","fPtSigmaSnp2",fgkN1PtBins,bins1Pt,fgkNSigmaSnp2Bins,binsSigmaSnp2);
527 fHistList->Add(fPtSigmaSnp2);
529 fPtSigmaTgl2 = new TH2F("fPtSigmaTgl2","fPtSigmaTgl2",fgkN1PtBins,bins1Pt,fgkNSigmaTgl2Bins,binsSigmaTgl2);
530 fHistList->Add(fPtSigmaTgl2);
532 fPtSigma1Pt2 = new TH2F("fPtSigma1Pt2","fPtSigma1Pt2",fgkN1PtBins,bins1Pt,fgkNSigma1Pt2Bins,binsSigma1Pt2);
533 fHistList->Add(fPtSigma1Pt2);
535 fProfPtSigmaY2 = new TProfile("fProfPtSigmaY2","fProfPtSigmaY2",fgkN1PtBins,bins1Pt);
536 fHistList->Add(fProfPtSigmaY2);
538 fProfPtSigmaZ2 = new TProfile("fProfPtSigmaZ2","fProfPtSigmaZ2",fgkN1PtBins,bins1Pt);
539 fHistList->Add(fProfPtSigmaZ2);
541 fProfPtSigmaSnp2 = new TProfile("fProfPtSigmaSnp2","fProfPtSigmaSnp2",fgkN1PtBins,bins1Pt);
542 fHistList->Add(fProfPtSigmaSnp2);
544 fProfPtSigmaTgl2 = new TProfile("fProfPtSigmaTgl2","fProfPtSigmaTgl2",fgkN1PtBins,bins1Pt);
545 fHistList->Add(fProfPtSigmaTgl2);
547 fProfPtSigma1Pt2 = new TProfile("fProfPtSigma1Pt2","fProfPtSigma1Pt2",fgkN1PtBins,bins1Pt);
548 fHistList->Add(fProfPtSigma1Pt2);
550 fProfPtSigma1Pt = new TProfile("fProfPtSigma1Pt","fProfPtSigma1Pt;p_{T};#sigma(1/p_{T})",fgkNPtBins,binsPt);
551 fHistList->Add(fProfPtSigma1Pt);
553 fProfPtPtSigma1Pt = new TProfile("fProfPtPtSigma1Pt","fProfPtPtSigma1Pt;p_{T};p_{T}#sigma(1/p_{T})",fgkNPtBins,binsPt);
554 fHistList->Add(fProfPtPtSigma1Pt);
556 TH1::AddDirectory(oldStatus);
558 PostData(1, fHistList);
560 if(binsPhi) delete [] binsPhi;
561 if(binsPt) delete [] binsPt;
562 if(binsNClustersTPC) delete [] binsNClustersTPC;
563 if(binsDCA2D) delete [] binsDCA2D;
564 if(binsDCAZ) delete [] binsDCAZ;
565 if(binsNPointITS) delete [] binsNPointITS;
566 if(binsNSigmaToVertex) delete [] binsNSigmaToVertex;
567 if(binsChi2C) delete [] binsChi2C;
568 if(binsEta) delete [] binsEta;
569 if(binsRel1PtUncertainty) delete [] binsRel1PtUncertainty;
570 if(binsUncertainty1Pt) delete [] binsUncertainty1Pt;
571 if(binsChi2PerClus) delete [] binsChi2PerClus;
572 if(binsChi2PerClus) delete [] binsNCrossedRowsNClusF;
573 if(bins1Pt) delete [] bins1Pt;
574 if(binsSigmaY2) delete [] binsSigmaY2;
575 if(binsSigmaZ2) delete [] binsSigmaZ2;
576 if(binsSigmaSnp2) delete [] binsSigmaSnp2;
577 if(binsSigmaTgl2) delete [] binsSigmaTgl2;
578 if(binsSigma1Pt2) delete [] binsSigma1Pt2;
581 //________________________________________________________________________
582 Bool_t AliPWG4HighPtTrackQA::SelectEvent() {
584 // Decide if event should be selected for analysis
587 // Checks following requirements:
588 // - fEvent available
589 // - trigger info from AliPhysicsSelection
590 // - MCevent available
591 // - number of reconstructed tracks > 1
592 // - primary vertex reconstructed
593 // - z-vertex < 10 cm
594 // - centrality in case of PbPb
596 Bool_t selectEvent = kTRUE;
598 //fEvent object available?
600 AliDebug(2,Form("ERROR: fInputEvent not available\n"));
601 fNEventReject->Fill("noAliVEvent",1);
602 selectEvent = kFALSE;
606 //Check if number of reconstructed tracks is larger than 1
607 if(!fEvent->GetNumberOfTracks() || fEvent->GetNumberOfTracks()<2) {
608 fNEventReject->Fill("NTracks<2",1);
609 selectEvent = kFALSE;
613 //Check if vertex is reconstructed
614 if(fDataType==kESD&&dynamic_cast<AliESDEvent*>(fEvent)) {
615 fVtx = ((AliESDEvent*)fEvent)->GetPrimaryVertexSPD();
618 fNEventReject->Fill("noVTX",1);
619 selectEvent = kFALSE;
623 if(!fVtx->GetStatus()) {
624 fNEventReject->Fill("VtxStatus",1);
625 selectEvent = kFALSE;
630 if(fVtx->GetNContributors()<2) {
631 fNEventReject->Fill("NCont<2",1);
632 selectEvent = kFALSE;
636 //Check if z-vertex < 10 cm
638 fVtx->GetXYZ(primVtx);
639 if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
640 fNEventReject->Fill("ZVTX>10",1);
641 selectEvent = kFALSE;
645 else if(fDataType==kAOD&&dynamic_cast<AliAODEvent*>(fEvent)) {
646 const AliAODVertex *vtx = ((AliAODEvent*)fEvent)->GetPrimaryVertexSPD();
648 fNEventReject->Fill("noVTX",1);
649 selectEvent = kFALSE;
654 if(vtx->GetNContributors()<2) {
655 fNEventReject->Fill("NCont<2",1);
656 selectEvent = kFALSE;
660 //Check if z-vertex < 10 cm
662 vtx->GetXYZ(primVtx);
663 if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
664 fNEventReject->Fill("ZVTX>10",1);
665 selectEvent = kFALSE;
671 //Centrality selection should only be done in case of PbPb
674 if(fCentClass!=CalculateCentrality(fEvent) && fCentClass!=10) {
675 fNEventReject->Fill("cent",1);
676 selectEvent = kFALSE;
680 if(fDataType==kESD) {
681 if(dynamic_cast<AliESDEvent*>(fEvent)->GetCentrality()) {
682 cent = dynamic_cast<AliESDEvent*>(fEvent)->GetCentrality()->GetCentralityPercentile("V0M");
685 else if(fDataType==kAOD) {
686 if(dynamic_cast<AliAODEvent*>(fEvent)->GetHeader()->GetCentrality())
687 cent = dynamic_cast<AliAODEvent*>(fEvent)->GetHeader()->GetCentrality();
690 fNEventReject->Fill("cent>90",1);
691 selectEvent = kFALSE;
694 fh1Centrality->Fill(cent);
702 //________________________________________________________________________
703 Int_t AliPWG4HighPtTrackQA::CalculateCentrality(AliVEvent *ev){
705 // Get centrality from ESD or AOD
709 return CalculateCentrality(dynamic_cast<AliESDEvent*>(ev));
710 else if(fDataType==kAOD)
711 return CalculateCentrality(dynamic_cast<AliAODEvent*>(ev));
716 //________________________________________________________________________
717 Int_t AliPWG4HighPtTrackQA::CalculateCentrality(AliESDEvent *esd){
719 // Get centrality from ESD
725 if(esd->GetCentrality()){
726 cent = esd->GetCentrality()->GetCentralityPercentile("V0M");
727 if(fDebug>3) printf("centrality: %f\n",cent);
731 return GetCentralityClass(cent);
735 //________________________________________________________________________
736 Int_t AliPWG4HighPtTrackQA::CalculateCentrality(AliAODEvent *aod){
738 // Get centrality from AOD
742 Float_t cent = aod->GetHeader()->GetCentrality();
743 if(fDebug>3) printf("centrality: %f\n",cent);
745 return GetCentralityClass(cent);
749 //________________________________________________________________________
750 Int_t AliPWG4HighPtTrackQA::GetCentralityClass(Float_t cent) {
752 // Get centrality class
755 if(cent<0) return 5; // OB - cent sometimes negative
756 if(cent>80) return 4;
757 if(cent>50) return 3;
758 if(cent>30) return 2;
759 if(cent>10) return 1;
764 //________________________________________________________________________
765 void AliPWG4HighPtTrackQA::UserExec(Option_t *) {
767 // Called for each event
768 AliDebug(2,Form(">> AliPWG4HighPtTrackQA::UserExec \n"));
770 fEvent = InputEvent();
771 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
773 // All events without selection
774 fNEventAll->Fill(0.);
778 PostData(1, fHistList);
783 //Need to keep track of selected events
784 fNEventSel->Fill(0.);
786 fVariables = new TArrayF(fNVariables);
788 if(fDataType==kESD) DoAnalysisESD();
789 if(fDataType==kAOD) DoAnalysisAOD();
791 //Delete old fVariables
792 if(fVariables) delete fVariables;
795 PostData(1, fHistList);
799 //________________________________________________________________________
800 void AliPWG4HighPtTrackQA::DoAnalysisESD() {
803 PostData(1, fHistList);
807 // ---- Get MC Header information (for MC productions in pThard bins) ----
808 Double_t ptHard = 0.;
809 Double_t nTrials = 1; // trials for MC trigger weight for real data
811 AliMCEventHandler *eventHandlerMC = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
812 if (eventHandlerMC) {
814 if(eventHandlerMC->MCEvent()){
815 AliGenPythiaEventHeader* pythiaGenHeader = GetPythiaEventHeader(eventHandlerMC->MCEvent());
817 nTrials = pythiaGenHeader->Trials();
818 ptHard = pythiaGenHeader->GetPtHard();
820 fh1PtHard->Fill(ptHard);
821 fh1PtHardTrials->Fill(ptHard,nTrials);
823 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
828 Int_t nTracks = fESD->GetNumberOfTracks();
829 AliDebug(2,Form("nTracks ESD%d", nTracks));
832 Variables to be put in fVariables
843 10: chi2PerClusterTPC
845 12: (#crossed rows)/(#findable clusters)
853 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
854 fh1NTracksAll->Fill(0.);
856 //Get track for analysis
857 AliESDtrack *track = 0x0;
858 AliESDtrack *esdtrack = fESD->GetTrack(iTrack);
860 fh1NTracksReject->Fill("noESDtrack",1);
865 FillSystematicCutHist(esdtrack);
866 if (!(fTrackCuts->AcceptTrack(esdtrack))) {
867 fh1NTracksReject->Fill("trackCuts",1);
873 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
874 else if(fTrackType==2 || fTrackType==4) {
875 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
877 fh1NTracksReject->Fill("noTPConly",1);
880 AliExternalTrackParam exParam;
881 Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
883 fh1NTracksReject->Fill("relate",1);
884 if(track) delete track;
887 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
889 else if(fTrackType==5 || fTrackType==6) {
890 if(fTrackCuts->AcceptTrack(esdtrack)) {
894 if( !(fTrackCutsITSLoose->AcceptTrack(esdtrack)) && fTrackCutsTPConly->AcceptTrack(esdtrack) ) {
897 //use TPConly constrained track
898 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
899 AliExternalTrackParam exParam;
900 Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
902 fh1NTracksReject->Fill("relate",1);
903 if(track) delete track;
906 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
908 else if(fTrackType==6) {
909 //use global constrained track
911 track->Set(esdtrack->GetConstrainedParam()->GetX(),esdtrack->GetConstrainedParam()->GetAlpha(),esdtrack->GetConstrainedParam()->GetParameter(),esdtrack->GetConstrainedParam()->GetCovariance());
924 if(fTrackType==2 || fTrackType==4 || fTrackType==5) {
925 //Cut on chi2 of constrained fit
926 if(track->GetConstrainedChi2TPC() > fSigmaConstrainedMax*fSigmaConstrainedMax && fSigmaConstrainedMax>0.) {
927 fh1NTracksReject->Fill("chi2",1);
928 if(track) delete track;
934 FillSystematicCutHist(track);
936 fPtAll->Fill(track->Pt());
938 if (!(fTrackCuts->AcceptTrack(track)) && fTrackType!=4 && fTrackType!=5 && fTrackType!=6) {
939 fh1NTracksReject->Fill("trackCuts",1);
940 if(fTrackType==1 || fTrackType==2) {
941 if(track) delete track;
946 fh1NTracksSel->Fill(0.);
948 fVariables->Reset(0.);
950 fVariables->SetAt(track->Pt(),0);
951 fVariables->SetAt(track->Phi(),1);
952 fVariables->SetAt(track->Eta(),2);
956 if(fTrackType==0) { //Global
957 track->GetImpactParameters(dca2D,dcaz);
959 else if(fTrackType==1 || fTrackType==2 || fTrackType==4) { //TPConly
960 track->GetImpactParametersTPC(dca2D,dcaz);
962 fVariables->SetAt(dca2D,3);
963 fVariables->SetAt(dcaz,5);
965 fVariables->SetAt((float)track->GetTPCNcls(),5);
968 UChar_t itsMap = track->GetITSClusterMap();
969 for (Int_t i=0; i < 6; i++) {
970 if (itsMap & (1 << i))
973 fVariables->SetAt((float)nPointITS,6);
974 Float_t chi2C = (float)track->GetConstrainedChi2();
975 if(fTrackType==1 || fTrackType==2 || fTrackType==4)
976 chi2C = (float)track->GetConstrainedChi2TPC();
977 fVariables->SetAt(chi2C,7);
978 fVariables->SetAt(fTrackCuts->GetSigmaToVertex(track),8);// Calculates the number of sigma to the vertex for a track.
980 fVariables->SetAt(TMath::Sqrt(track->GetSigma1Pt2())*fVariables->At(0),9);
982 if(fVariables->At(5)>0.) fVariables->SetAt(track->GetTPCchi2()/fVariables->At(5),10);
984 fVariables->SetAt(track->GetTPCClusterInfo(2,1),11); //#crossed rows
985 Float_t crossedRowsTPCNClsF = 1.;//track->GetTPCClusterInfo(2,0);
986 if(track->GetTPCNclsF()>0.) crossedRowsTPCNClsF = fVariables->At(11)/track->GetTPCNclsF();
987 fVariables->SetAt(crossedRowsTPCNClsF,12);//(#crossed rows)/(#findable clusters)
988 fVariables->SetAt(track->GetSigmaY2(),13);
989 fVariables->SetAt(track->GetSigmaZ2(),14);
990 fVariables->SetAt(track->GetSigmaSnp2(),15);
991 fVariables->SetAt(track->GetSigmaTgl2(),16);
992 fVariables->SetAt(track->GetSigma1Pt2(),17);
996 // int mult = fTrackCuts->CountAcceptedTracks(fESD);
998 if(fTrackType==1 || fTrackType==2 || fTrackType==4 || fTrackType==5) {
999 if(track) delete track;
1006 //________________________________________________________________________
1007 void AliPWG4HighPtTrackQA::DoAnalysisAOD() {
1009 AliAODEvent *aod = dynamic_cast<AliAODEvent*>(fEvent);
1011 for (Int_t iTrack = 0; iTrack < fEvent->GetNumberOfTracks(); iTrack++) {
1013 AliAODTrack *aodtrack = aod->GetTrack(iTrack);
1014 if( !aodtrack->TestFilterMask(fFilterMask) ) continue;
1016 fVariables->Reset(0.);
1018 fVariables->SetAt(aodtrack->Pt(),0);
1019 fVariables->SetAt(aodtrack->Phi(),1);
1020 fVariables->SetAt(aodtrack->Eta(),2);
1022 Double_t dca[2] = {1e6,1e6};
1023 Double_t covar[3] = {1e6,1e6,1e6};
1024 if(aodtrack->PropagateToDCA(fEvent->GetPrimaryVertex(),fEvent->GetMagneticField(),100.,dca,covar)) {
1025 fVariables->SetAt(dca[0],3);
1026 fVariables->SetAt(dca[1],4);
1029 fVariables->SetAt((float)aodtrack->GetTPCNcls(),5);
1030 fVariables->SetAt((float)aodtrack->GetITSNcls(),6);
1031 fVariables->SetAt(aodtrack->Chi2perNDF(),7);
1032 fVariables->SetAt(0.,8);
1033 fVariables->SetAt(0.,9);
1034 fVariables->SetAt(aodtrack->Chi2perNDF(),10);
1035 fVariables->SetAt(GetTPCClusterInfo(aodtrack,2),11);
1036 Float_t crossedRowsTPCNClsF = 0.;
1037 if(aodtrack->GetTPCNclsF()>0.) crossedRowsTPCNClsF = fVariables->At(11)/aodtrack->GetTPCNclsF();
1038 fVariables->SetAt(crossedRowsTPCNClsF,12);
1040 fPtAll->Fill(fVariables->At(0));
1048 //________________________________________________________________________
1049 void AliPWG4HighPtTrackQA::FillHistograms() {
1051 fPtSel->Fill(fVariables->At(0));
1052 fPtPhi->Fill(fVariables->At(0),fVariables->At(1));
1053 fPtEta->Fill(fVariables->At(0),fVariables->At(2));
1054 fPtDCA2D->Fill(fVariables->At(0),fVariables->At(3));
1055 fPtDCAZ->Fill(fVariables->At(0),fVariables->At(4));
1056 fPtNClustersTPC->Fill(fVariables->At(0),fVariables->At(5));
1057 fPtNPointITS->Fill(fVariables->At(0),fVariables->At(6));
1058 if(fDataType==kESD) {
1059 fPtChi2C->Fill(fVariables->At(0),fVariables->At(7));
1060 fPtNSigmaToVertex->Fill(fVariables->At(0),fVariables->At(8));
1061 fPtRelUncertainty1Pt->Fill(fVariables->At(0),fVariables->At(9));
1062 fPtUncertainty1Pt->Fill(fVariables->At(0),fVariables->At(0)*fVariables->At(9));
1063 fPtSigmaY2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(13)));
1064 fPtSigmaZ2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(14)));
1065 fPtSigmaSnp2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(15)));
1066 fPtSigmaTgl2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(16)));
1067 fPtSigma1Pt2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(17)));
1069 fProfPtSigmaY2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(13)));
1070 fProfPtSigmaZ2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(14)));
1071 fProfPtSigmaSnp2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(15)));
1072 fProfPtSigmaTgl2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(16)));
1073 fProfPtSigma1Pt2->Fill(1./fVariables->At(0),TMath::Sqrt(fVariables->At(17)));
1074 fProfPtSigma1Pt->Fill(fVariables->At(0),TMath::Sqrt(fVariables->At(17)));
1075 fProfPtPtSigma1Pt->Fill(fVariables->At(0),fVariables->At(0)*TMath::Sqrt(fVariables->At(17)));
1077 fPtChi2PerClusterTPC->Fill(fVariables->At(0),fVariables->At(10));
1078 fPtNCrossedRows->Fill(fVariables->At(0),fVariables->At(11));
1079 fPtNCrossedRowsNClusF->Fill(fVariables->At(0),fVariables->At(12));
1080 fPtNCrRNCrRNClusF->Fill(fVariables->At(0),fVariables->At(11),fVariables->At(12));
1083 //________________________________________________________________________
1084 Bool_t AliPWG4HighPtTrackQA::PythiaInfoFromFile(const char* currFile,Float_t &fXsec,Float_t &fTrials){
1086 // get the cross section and the trails either from pyxsec.root or from pysec_hists.root
1087 // This is to called in Notify and should provide the path to the AOD/ESD file
1088 // Copied from AliAnalysisTaskJetSpectrum2
1091 TString file(currFile);
1095 if(file.Contains("root_archive.zip#")){
1096 Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
1097 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
1098 file.Replace(pos+1,20,"");
1101 // not an archive take the basename....
1102 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
1104 // Printf("%s",file.Data());
1107 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
1109 // next trial fetch the histgram file
1110 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
1112 // not a severe condition but inciate that we have no information
1116 // find the tlist we want to be independtent of the name so use the Tkey
1117 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
1122 TList *list = dynamic_cast<TList*>(key->ReadObj());
1127 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
1128 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
1131 } // no tree pyxsec.root
1133 TTree *xtree = (TTree*)fxsec->Get("Xsection");
1139 Double_t xsection = 0;
1140 xtree->SetBranchAddress("xsection",&xsection);
1141 xtree->SetBranchAddress("ntrials",&ntrials);
1149 //________________________________________________________________________
1150 Bool_t AliPWG4HighPtTrackQA::Notify()
1153 // Implemented Notify() to read the cross sections
1154 // and number of trials from pyxsec.root
1155 // Copied from AliAnalysisTaskJetSpectrum2
1158 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
1159 Float_t xsection = 0;
1160 Float_t ftrials = 1;
1164 TFile *curfile = tree->GetCurrentFile();
1166 Error("Notify","No current file");
1169 if(!fh1Xsec||!fh1Trials){
1170 // Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
1173 PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
1174 fh1Xsec->Fill("<#sigma>",xsection);
1175 // construct a poor man average trials
1176 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
1177 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
1182 //________________________________________________________________________
1183 AliGenPythiaEventHeader* AliPWG4HighPtTrackQA::GetPythiaEventHeader(AliMCEvent *mcEvent){
1185 if(!mcEvent)return 0;
1186 AliGenEventHeader* genHeader = mcEvent->GenEventHeader();
1187 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
1188 if(!pythiaGenHeader){
1190 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
1192 if (!genCocktailHeader) {
1193 // AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Unknown header type (not Pythia or Cocktail)");
1194 // AliWarning(Form("%s %d: Unknown header type (not Pythia or Cocktail)",(char*)__FILE__,__LINE__));
1197 TList* headerList = genCocktailHeader->GetHeaders();
1198 for (Int_t i=0; i<headerList->GetEntries(); i++) {
1199 pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
1200 if (pythiaGenHeader)
1203 if(!pythiaGenHeader){
1204 AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Pythia event header not found");
1208 return pythiaGenHeader;
1212 //_______________________________________________________________________
1213 Float_t AliPWG4HighPtTrackQA::GetTPCClusterInfo(AliAODTrack *tr,Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1) const
1215 //MV: copied from AliESDtrack since method is not available in AliAODTrack
1218 // TPC cluster information
1219 // type 0: get fraction of found/findable clusters with neighbourhood definition
1220 // 1: findable clusters with neighbourhood definition
1221 // 2: found clusters
1223 // definition of findable clusters:
1224 // a cluster is defined as findable if there is another cluster
1225 // within +- nNeighbours pad rows. The idea is to overcome threshold
1226 // effects with a very simple algorithm.
1229 TBits fTPCClusterMap = tr->GetTPCClusterMap();
1230 if (type==2) return fTPCClusterMap.CountBits();
1234 Int_t last=-nNeighbours;
1236 for (Int_t i=row0; i<row1; ++i){
1237 //look to current row
1238 if (fTPCClusterMap[i]) {
1244 //look to nNeighbours before
1245 if ((i-last)<=nNeighbours) {
1249 //look to nNeighbours after
1250 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
1251 if (fTPCClusterMap[j]){
1257 if (type==1) return findable;
1262 fraction=(Float_t)found/(Float_t)findable;
1267 return 0; // undefined type - default value
1270 void AliPWG4HighPtTrackQA::FillSystematicCutHist(AliESDtrack *track) {
1272 fSystTrackCuts->Fill("noCut",1);
1273 if(TMath::Abs(track->Eta())>0.9)
1274 fSystTrackCuts->Fill("eta",1);
1275 if(track->Pt()<0.15 || track->Pt()>1e10)
1276 fSystTrackCuts->Fill("0.15<pT<1e10",1);
1277 if(track->GetKinkIndex(0)>0)
1278 fSystTrackCuts->Fill("kink",1);
1279 if(track->GetTPCclusters(0)<70)
1280 fSystTrackCuts->Fill("NClusterTPC",1);
1281 if(track->GetTPCclusters(0)>0.) {
1282 if(track->GetTPCchi2()/Float_t(track->GetTPCclusters(0))>4.)
1283 fSystTrackCuts->Fill("Chi2PerNClusTPC",1);
1286 Float_t dcaToVertexXY = 0.;
1287 Float_t dcaToVertexZ = 0.;
1288 track->GetImpactParameters(dcaToVertexXY,dcaToVertexZ);
1289 Float_t fCutMaxDCAToVertexXY = 2.4;
1290 Float_t fCutMaxDCAToVertexZ = 3.2;
1291 Float_t dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1293 fSystTrackCuts->Fill("DCA2D",1);
1297 //________________________________________________________________________
1298 void AliPWG4HighPtTrackQA::Terminate(Option_t *)
1300 // The Terminate() function is the last function to be called during
1301 // a query. It always runs on the client, it can be used to present
1302 // the results graphically or save the results to file.