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 compares the global reconstruction with the MC information
18 // Momentum resolution is stored as function of track cuts and pt.
19 // Output: Histograms for different set of cuts
20 //-----------------------------------------------------------------------
21 // Author : Marta Verweij - UU
22 //-----------------------------------------------------------------------
24 #ifndef ALIPWG4HighPtQAMC_CXX
25 #define ALIPWG4HighPtQAMC_CXX
27 #include "AliPWG4HighPtQAMC.h"
40 #include "AliAnalysisTask.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 "AliAnalysisHelperJetTasks.h"
54 using namespace std; //required for resolving the 'cout' symbol
56 ClassImp(AliPWG4HighPtQAMC)
58 AliPWG4HighPtQAMC::AliPWG4HighPtQAMC()
59 : AliAnalysisTask("AliPWG4HighPtQAMC", ""),
85 fPtAllminPtMCvsPtAll(0),
86 fPtAllvsPtMCvsMult(0),
87 fPtAllminPtMCvsPtAllvsMult(0),
88 fPtAllminPtMCvsPtAllNPointTPC(0),
89 fPtAllminPtMCvsPtAllDCAR(0),
90 fPtAllminPtMCvsPtAllDCAZ(0),
91 fPtAllminPtMCvsPtAllPhi(0),
92 fPtAllminPtMCvsPtAllNPointITS(0),
93 fPtAllminPtMCvsPtAllNSigmaToVertex(0),
94 fPtAllminPtMCvsPtAllChi2C(0),
95 fPtAllminPtMCvsPtAllRel1PtUncertainty(0),
101 fPtITSminPtMCvsPtITS(0),
102 fPtITSminPtMCvsPtITSNPointTPC(0),
103 fPtITSminPtMCvsPtITSDCAR(0),
104 fPtITSminPtMCvsPtITSDCAZ(0),
105 fPtITSminPtMCvsPtITSPhi(0),
106 fPtITSminPtMCvsPtITSNPointITS(0),
107 fPtITSminPtMCvsPtITSNSigmaToVertex(0),
108 fPtITSminPtMCvsPtITSChi2C(0),
109 fPtITSminPtMCvsPtITSRel1PtUncertainty(0),
114 //________________________________________________________________________
115 AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(const char *name):
116 AliAnalysisTask(name,""),
139 fNPointTPCMultRec(0),
142 fPtAllminPtMCvsPtAll(0),
143 fPtAllvsPtMCvsMult(0),
144 fPtAllminPtMCvsPtAllvsMult(0),
145 fPtAllminPtMCvsPtAllNPointTPC(0),
146 fPtAllminPtMCvsPtAllDCAR(0),
147 fPtAllminPtMCvsPtAllDCAZ(0),
148 fPtAllminPtMCvsPtAllPhi(0),
149 fPtAllminPtMCvsPtAllNPointITS(0),
150 fPtAllminPtMCvsPtAllNSigmaToVertex(0),
151 fPtAllminPtMCvsPtAllChi2C(0),
152 fPtAllminPtMCvsPtAllRel1PtUncertainty(0),
158 fPtITSminPtMCvsPtITS(0),
159 fPtITSminPtMCvsPtITSNPointTPC(0),
160 fPtITSminPtMCvsPtITSDCAR(0),
161 fPtITSminPtMCvsPtITSDCAZ(0),
162 fPtITSminPtMCvsPtITSPhi(0),
163 fPtITSminPtMCvsPtITSNPointITS(0),
164 fPtITSminPtMCvsPtITSNSigmaToVertex(0),
165 fPtITSminPtMCvsPtITSChi2C(0),
166 fPtITSminPtMCvsPtITSRel1PtUncertainty(0),
170 // Constructor. Initialization of Inputs and Outputs
172 AliDebug(2,Form("AliPWG4HighPtQAMC Calling Constructor"));
173 // Input slot #0 works with a TChain ESD
174 DefineInput(0, TChain::Class());
175 // Output slot #0, #1 write into a TList
176 DefineOutput(0, TList::Class());
177 DefineOutput(1, TList::Class());
180 //________________________________________________________________________
181 void AliPWG4HighPtQAMC::ConnectInputData(Option_t *)
183 // Connect ESD and MC event handler here
185 AliDebug(2,Form(">> AliPWG4HighPtSpectra::ConnectInputData \n"));
186 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
188 AliDebug(2,Form( "ERROR: Could not read chain from input slot 0 \n"));
192 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
195 AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
198 fESD = esdH->GetEvent();
200 AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
202 AliDebug(2,Form( "ERROR: Could not retrieve MC event handler \n"));
205 fMC = eventHandler->MCEvent();
210 //________________________________________________________________________
211 void AliPWG4HighPtQAMC::CreateOutputObjects() {
212 //Create output objects
213 AliDebug(2,Form(">> AliPWG4HighPtQATPConly::CreateOutputObjects \n"));
215 Bool_t oldStatus = TH1::AddDirectoryStatus();
216 TH1::AddDirectory(kFALSE);
219 fHistList = new TList();
220 fHistList->SetOwner(kTRUE);
222 fHistListITS = new TList();
223 fHistListITS->SetOwner(kTRUE);
225 Int_t fgkNPhiBins=18;
226 Float_t kMinPhi = 0.;
227 Float_t kMaxPhi = 2.*TMath::Pi();
229 Int_t fgkNPtBins=100;
230 Float_t fgkPtMin=0.;//2.;
231 Float_t fgkPtMax=fPtMax;
232 Int_t fgkResPtBins=80;
234 Int_t fgkNMultBins = 50;
235 Float_t fgkMultMin = 0;
236 Float_t fgkMultMax = 500;
238 fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5);
239 fHistList->Add(fNEventAll);
240 fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5);
241 fHistList->Add(fNEventSel);
242 fNEventReject = new TH1F("fNEventReject","Reason events are rejectected for analysis",20,0,20);
244 fNEventReject->Fill("noESD",0);
245 fNEventReject->Fill("Trigger",0);
246 fNEventReject->Fill("noMCEvent",0);
247 fNEventReject->Fill("NTracks<2",0);
248 fNEventReject->Fill("noVTX",0);
249 fNEventReject->Fill("VtxStatus",0);
250 fNEventReject->Fill("NCont<2",0);
251 fNEventReject->Fill("ZVTX>10",0);
252 fHistList->Add(fNEventReject);
254 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
255 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
256 fHistList->Add(fh1Xsec);
258 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
259 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
260 fHistList->Add(fh1Trials);
262 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
263 fHistList->Add(fh1PtHard);
264 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
265 fHistList->Add(fh1PtHardTrials);
267 fPtAll = new TH1F("fPtAll","PtAll",fgkNPtBins, fgkPtMin, fgkPtMax);
268 fHistList->Add(fPtAll);
269 fPtSel = new TH1F("fPtSel","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
270 fHistList->Add(fPtSel);
272 fPtSelFakes = new TH1F("fPtSelFakes","PtSelFakes",fgkNPtBins, fgkPtMin, fgkPtMax);
273 fHistList->Add(fPtSelFakes);
275 fNPointTPCFakes = new TH1F("fNPointTPCFakes","fNPointTPCFakes",160,0.5,160.5);
276 fHistList->Add(fNPointTPCFakes);
278 fPtSelLargeLabel = new TH1F("fPtSelLargeLabel","PtSelLargeLabel",fgkNPtBins, fgkPtMin, fgkPtMax);
279 fHistList->Add(fPtSelLargeLabel);
281 fMultRec = new TH1F("fMultRec","Multiple reconstruction of tracks",20,0,20);
282 fHistList->Add(fMultRec);
284 fNPointTPCMultRec = new TH1F("fNPointTPCMultRec","Multiple reconstruction of tracks",160,0.5,160.5);
285 fHistList->Add(fNPointTPCMultRec);
287 fDeltaPtMultRec = new TH2F("fDeltaPtMultRec","Delta pT vs pT for multiple reconstructed tracks",100,0.,50.,100,-20.,20.);
288 fHistList->Add(fDeltaPtMultRec);
290 fPtAllvsPtMC = new TH2F("fPtAllvsPtMC","fPtAllvsPtMC;p_{T,MC};p_{T,rec}",fgkNPtBins, fgkPtMin,fgkPtMax,fgkNPtBins, fgkPtMin,fgkPtMax);
291 fHistList->Add(fPtAllvsPtMC);
293 fPtAllminPtMCvsPtAll = new TH2F("fPtAllminPtMCvsPtAll","PtAllminPtMCvsPtAll",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.);
294 fPtAllminPtMCvsPtAll->SetXTitle("p_{t}^{MC}");
295 fPtAllminPtMCvsPtAll->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
296 fHistList->Add(fPtAllminPtMCvsPtAll);
298 fPtAllvsPtMCvsMult = new TH3F("fPtAllvsPtMCvsMult","fPtAllvsPtMCvsMult;p_{T,MC};p_{T,rec};N_{tracks}",fgkNPtBins, fgkPtMin,fgkPtMax,fgkNPtBins, fgkPtMin,fgkPtMax,fgkNMultBins,fgkMultMin,fgkMultMax);
299 fHistList->Add(fPtAllvsPtMCvsMult);
301 fPtAllminPtMCvsPtAllvsMult = new TH3F("fPtAllminPtMCvsPtAllvsMult","fPtAllminPtMCvsPtAllvsMult",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,fgkNMultBins,fgkMultMin,fgkMultMax);
302 fPtAllminPtMCvsPtAllvsMult->SetXTitle("p_{t}^{MC}");
303 fPtAllminPtMCvsPtAllvsMult->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
304 fPtAllminPtMCvsPtAllvsMult->SetZTitle("N_{tracks}");
305 fHistList->Add(fPtAllminPtMCvsPtAllvsMult);
307 fPtAllminPtMCvsPtAllNPointTPC = new TH3F("fPtAllminPtMCvsPtAllNPointTPC","PtAllminPtMCvsPtAllNPointTPC",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,160,0.5,160.5);
308 fPtAllminPtMCvsPtAllNPointTPC->SetXTitle("p_{t}^{MC}");
309 fPtAllminPtMCvsPtAllNPointTPC->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
310 fPtAllminPtMCvsPtAllNPointTPC->SetZTitle("N_{point,TPC}");
311 fHistList->Add(fPtAllminPtMCvsPtAllNPointTPC);
313 fPtAllminPtMCvsPtAllDCAR = new TH3F("fPtAllminPtMCvsPtAllDCAR","PtAllminPtMCvsPtAllDCAR",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-0.2,0.2);
314 fPtAllminPtMCvsPtAllDCAR->SetXTitle("p_{t}^{MC}");
315 fPtAllminPtMCvsPtAllDCAR->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
316 fPtAllminPtMCvsPtAllDCAR->SetZTitle("DCA_{R}");
317 fHistList->Add(fPtAllminPtMCvsPtAllDCAR);
319 fPtAllminPtMCvsPtAllDCAZ = new TH3F("fPtAllminPtMCvsPtAllDCAZ","PtAllminPtMCvsPtAllDCAZ",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-2.,2.);
320 fPtAllminPtMCvsPtAllDCAZ->SetXTitle("p_{t}^{MC}");
321 fPtAllminPtMCvsPtAllDCAZ->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
322 fPtAllminPtMCvsPtAllDCAZ->SetZTitle("DCA_{Z}");
323 fHistList->Add(fPtAllminPtMCvsPtAllDCAZ);
325 fPtAllminPtMCvsPtAllPhi = new TH3F("fPtAllminPtMCvsPtAllPhi","PtAllminPtMCvsPtAllPhi",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,fgkNPhiBins,kMinPhi,kMaxPhi);
326 fPtAllminPtMCvsPtAllPhi->SetXTitle("p_{t}^{MC}");
327 fPtAllminPtMCvsPtAllPhi->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
328 fPtAllminPtMCvsPtAllPhi->SetZTitle("#phi");
329 fHistList->Add(fPtAllminPtMCvsPtAllPhi);
331 fPtAllminPtMCvsPtAllNPointITS = new TH3F("fPtAllminPtMCvsPtAllNPointITS","PtAllminPtMCvsPtAllNPointITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,9,-0.5,8.5);
332 fPtAllminPtMCvsPtAllNPointITS->SetXTitle("p_{t}^{MC}");
333 fPtAllminPtMCvsPtAllNPointITS->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
334 fPtAllminPtMCvsPtAllNPointITS->SetZTitle("N_{point,ITS}}");
335 fHistList->Add(fPtAllminPtMCvsPtAllNPointITS);
337 fPtAllminPtMCvsPtAllNSigmaToVertex = new TH3F("fPtAllminPtMCvsPtAllNSigmaToVertex","PtAllminPtMCvsPtAllNSigmaToVertex",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,40,0.,8.);
338 fPtAllminPtMCvsPtAllNSigmaToVertex->SetXTitle("p_{t}^{MC}");
339 fPtAllminPtMCvsPtAllNSigmaToVertex->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
340 fPtAllminPtMCvsPtAllNSigmaToVertex->SetZTitle("N#sigma to vertex");
341 fHistList->Add(fPtAllminPtMCvsPtAllNSigmaToVertex);
343 fPtAllminPtMCvsPtAllChi2C = new TH3F("fPtAllminPtMCvsPtAllChi2C","PtAllminPtMCvsPtAllChi2C",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,20,0.,10.);
344 fPtAllminPtMCvsPtAllChi2C->SetXTitle("p_{t}^{MC}");
345 fPtAllminPtMCvsPtAllChi2C->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
346 fPtAllminPtMCvsPtAllChi2C->SetZTitle("Constrained #chi^{2}");
347 fHistList->Add(fPtAllminPtMCvsPtAllChi2C);
349 fPtAllminPtMCvsPtAllRel1PtUncertainty = new TH3F("fPtAllminPtMCvsPtAllRel1PtUncertainty","PtAllminPtMCvsPtAllRel1PtUncertainty",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,30,0.,0.3);
350 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetXTitle("p_{t}^{MC}");
351 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
352 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetZTitle("Rel1PtUncertainty");
353 fHistList->Add(fPtAllminPtMCvsPtAllRel1PtUncertainty);
356 fPtSelITS = new TH1F("fPtSelITSrefit","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
357 fHistListITS->Add(fPtSelITS);
359 fPtITSminPtMCvsPtITS = new TH2F("fPtITSminPtMCvsPtITS","PtITSminPtMCvsPtITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.);
360 fPtITSminPtMCvsPtITS->SetXTitle("p_{t}^{MC}");
361 fPtITSminPtMCvsPtITS->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
362 fHistListITS->Add(fPtITSminPtMCvsPtITS);
364 fPtITSminPtMCvsPtITSNPointTPC = new TH3F("fPtITSminPtMCvsPtITSNPointTPC","PtITSminPtMCvsPtITSNPointTPC",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,160,0.5,160.5);
365 fPtITSminPtMCvsPtITSNPointTPC->SetXTitle("p_{t}^{MC}");
366 fPtITSminPtMCvsPtITSNPointTPC->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
367 fPtITSminPtMCvsPtITSNPointTPC->SetZTitle("N_{point,TPC}");
368 fHistListITS->Add(fPtITSminPtMCvsPtITSNPointTPC);
370 fPtITSminPtMCvsPtITSDCAR = new TH3F("fPtITSminPtMCvsPtITSDCAR","PtITSminPtMCvsPtITSDCAR",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-0.2,0.2);
371 fPtITSminPtMCvsPtITSDCAR->SetXTitle("p_{t}^{MC}");
372 fPtITSminPtMCvsPtITSDCAR->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
373 fPtITSminPtMCvsPtITSDCAR->SetZTitle("DCA_{R}");
374 fHistListITS->Add(fPtITSminPtMCvsPtITSDCAR);
376 fPtITSminPtMCvsPtITSDCAZ = new TH3F("fPtITSminPtMCvsPtITSDCAZ","PtITSminPtMCvsPtITSDCAZ",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-2.,2.);
377 fPtITSminPtMCvsPtITSDCAZ->SetXTitle("p_{t}^{MC}");
378 fPtITSminPtMCvsPtITSDCAZ->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
379 fPtITSminPtMCvsPtITSDCAZ->SetZTitle("DCA_{Z}");
380 fHistListITS->Add(fPtITSminPtMCvsPtITSDCAZ);
382 fPtITSminPtMCvsPtITSPhi = new TH3F("fPtITSminPtMCvsPtITSPhi","PtITSminPtMCvsPtITSPhi",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,fgkNPhiBins,kMinPhi,kMaxPhi);
383 fPtITSminPtMCvsPtITSPhi->SetXTitle("p_{t}^{MC}");
384 fPtITSminPtMCvsPtITSPhi->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
385 fPtITSminPtMCvsPtITSPhi->SetZTitle("#phi");
386 fHistListITS->Add(fPtITSminPtMCvsPtITSPhi);
388 fPtITSminPtMCvsPtITSNPointITS = new TH3F("fPtITSminPtMCvsPtITSNPointITS","PtITSminPtMCvsPtITSNPointITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,9,-0.5,8.5);
389 fPtITSminPtMCvsPtITSNPointITS->SetXTitle("p_{t}^{MC}");
390 fPtITSminPtMCvsPtITSNPointITS->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})}");
391 fPtITSminPtMCvsPtITSNPointITS->SetZTitle("N_{point,ITS}}");
392 fHistListITS->Add(fPtITSminPtMCvsPtITSNPointITS);
394 fPtITSminPtMCvsPtITSNSigmaToVertex = new TH3F("fPtITSminPtMCvsPtITSNSigmaToVertex","PtITSminPtMCvsPtITSNSigmaToVertex",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,40,0.,8.);
395 fPtITSminPtMCvsPtITSNSigmaToVertex->SetXTitle("p_{t}^{MC}");
396 fPtITSminPtMCvsPtITSNSigmaToVertex->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
397 fPtITSminPtMCvsPtITSNSigmaToVertex->SetZTitle("N#sigma to vertex");
398 fHistListITS->Add(fPtITSminPtMCvsPtITSNSigmaToVertex);
400 fPtITSminPtMCvsPtITSChi2C = new TH3F("fPtITSminPtMCvsPtITSChi2C","PtITSminPtMCvsPtITSChi2C",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,20,0.,10.);
401 fPtITSminPtMCvsPtITSChi2C->SetXTitle("p_{t}^{MC}");
402 fPtITSminPtMCvsPtITSChi2C->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
403 fPtITSminPtMCvsPtITSChi2C->SetZTitle("Constrained #chi^{2}");
404 fHistListITS->Add(fPtITSminPtMCvsPtITSChi2C);
406 fPtITSminPtMCvsPtITSRel1PtUncertainty = new TH3F("fPtITSminPtMCvsPtITSRel1PtUncertainty","PtITSminPtMCvsPtITSRel1PtUncertainty",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,30,0.,0.3);
407 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetXTitle("p_{t}^{MC}");
408 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
409 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetZTitle("Rel1PtUncertainty");
410 fHistListITS->Add(fPtITSminPtMCvsPtITSRel1PtUncertainty);
412 fPtAllMC = new TH1F("fPtAllMC","PtAll",fgkNPtBins, fgkPtMin, fgkPtMax);
413 fHistList->Add(fPtAllMC);
414 fPtSelMC = new TH1F("fPtSelMC","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
415 fHistList->Add(fPtSelMC);
416 fPtSelMCITS = new TH1F("fPtSelMCITS","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
417 fHistList->Add(fPtSelMCITS);
419 TH1::AddDirectory(oldStatus);
423 //________________________________________________________________________
424 Bool_t AliPWG4HighPtQAMC::SelectEvent() {
426 // Decide if event should be selected for analysis
429 // Checks following requirements:
431 // - trigger info from AliPhysicsSelection
432 // - MCevent available
433 // - number of reconstructed tracks > 1
434 // - primary vertex reconstructed
435 // - z-vertex < 10 cm
437 Bool_t selectEvent = kTRUE;
439 //fESD object available?
441 AliDebug(2,Form("ERROR: fInputEvent not available\n"));
442 fNEventReject->Fill("noESD",1);
443 selectEvent = kFALSE;
448 UInt_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
449 if(!(isSelected&AliVEvent::kMB)) { //Select collison candidates
450 AliDebug(2,Form(" Trigger Selection: event REJECTED ... "));
451 fNEventReject->Fill("Trigger",1);
452 selectEvent = kFALSE;
459 AliDebug(2,Form("MC particles: %d", fMC->GetNumberOfTracks()));
460 fStack = fMC->Stack(); //Particles Stack
461 AliDebug(2,Form("MC particles stack: %d", fStack->GetNtrack()));
463 AliDebug(2,Form("ERROR: Could not retrieve MC eventHandler"));
464 fNEventReject->Fill("noMCEvent",1);
465 selectEvent = kFALSE;
469 //Check if number of reconstructed tracks is larger than 1
470 if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2) {
471 fNEventReject->Fill("NTracks<2",1);
472 selectEvent = kFALSE;
476 //Check if vertex is reconstructed
477 if(fTrackType==1) fVtx = fESD->GetPrimaryVertexTPC();
478 else fVtx = fESD->GetPrimaryVertexSPD();
481 fNEventReject->Fill("noVTX",1);
482 selectEvent = kFALSE;
486 if(!fVtx->GetStatus()) {
487 fNEventReject->Fill("VtxStatus",1);
488 selectEvent = kFALSE;
493 // TString vtxName(fVtx->GetName());
494 if(fVtx->GetNContributors()<2) {
495 fNEventReject->Fill("NCont<2",1);
496 selectEvent = kFALSE;
500 //Check if z-vertex < 10 cm
502 fVtx->GetXYZ(primVtx);
503 if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
504 fNEventReject->Fill("ZVTX>10",1);
505 selectEvent = kFALSE;
509 AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",fVtx->GetTitle(), fVtx->GetStatus(), fVtx->GetNContributors()));
515 //________________________________________________________________________
516 void AliPWG4HighPtQAMC::Exec(Option_t *) {
518 // Called for each event
519 AliDebug(2,Form(">> AliPWG4HighPtQATPConly::Exec \n"));
520 // All events without selection
521 fNEventAll->Fill(0.);
525 PostData(0, fHistList);
526 PostData(1, fHistListITS);
530 // ---- Get MC Header information (for MC productions in pThard bins) ----
531 Double_t ptHard = 0.;
532 Double_t nTrials = 1; // trials for MC trigger weight for real data
535 AliGenPythiaEventHeader* pythiaGenHeader = GetPythiaEventHeader(fMC);
537 nTrials = pythiaGenHeader->Trials();
538 ptHard = pythiaGenHeader->GetPtHard();
540 fh1PtHard->Fill(ptHard);
541 fh1PtHardTrials->Fill(ptHard,nTrials);
543 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
547 //Need to keep track of selected events
548 fNEventSel->Fill(0.);
550 Int_t nTracks = fESD->GetNumberOfTracks();
551 AliDebug(2,Form("nTracks ESD%d", nTracks));
553 int nMCtracks = fStack->GetNtrack();
562 Float_t nSigmaToVertex = 0.;
563 Float_t relUncertainty1Pt = 0.;
565 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
568 AliESDtrack *esdtrack = fESD->GetTrack(iTrack);
569 if(!esdtrack) continue;
572 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
573 else if(fTrackType==2) {
574 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
579 AliExternalTrackParam exParam;
580 Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
585 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
591 if(fTrackType==1 || fTrackType==2) delete track;
595 Int_t label = TMath::Abs(track->GetLabel());
596 if(label>=nMCtracks) {
597 if (fTrackCuts->AcceptTrack(track)) { fPtSelLargeLabel->Fill(pt); }
598 if(fTrackType==1 || fTrackType==2) delete track;
601 TParticle *particle = fStack->Particle(label) ;
603 if(fTrackType==1 || fTrackType==2) delete track;
607 ptMC = particle->Pt();
609 if(fTrackType==0) { //Global
612 track->GetImpactParameters(dca2D,dcaZ);
614 else if(fTrackType==1 || fTrackType==2) { //TPConly
617 track->GetImpactParametersTPC(dca2D,dcaZ);
622 UChar_t itsMap = track->GetITSClusterMap();
623 for (Int_t i=0; i < 6; i++) {
624 if (itsMap & (1 << i))
627 nSigmaToVertex = fTrackCuts->GetSigmaToVertex(track);// Calculates the number of sigma to the vertex for a track.
628 chi2C = track->GetConstrainedChi2();
629 relUncertainty1Pt = TMath::Sqrt(track->GetSigma1Pt2())*pt;
632 fPtAllMC->Fill(ptMC);
634 if (fTrackCuts->AcceptTrack(track)) {
637 if(track->GetLabel()<0) {
638 fPtSelFakes->Fill(pt);
639 fNPointTPCFakes->Fill(track->GetTPCNcls());
641 fPtSelMC->Fill(ptMC);
642 fPtAllvsPtMC->Fill(ptMC,pt);
643 fPtAllminPtMCvsPtAll->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC) );
644 fPtAllminPtMCvsPtAllNPointTPC->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),track->GetTPCNcls());
645 fPtAllminPtMCvsPtAllDCAR->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dca2D);
646 fPtAllminPtMCvsPtAllDCAZ->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dcaZ);
647 fPtAllminPtMCvsPtAllPhi->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),phi);
648 fPtAllminPtMCvsPtAllNPointITS->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nPointITS);
649 fPtAllminPtMCvsPtAllNSigmaToVertex->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nSigmaToVertex);
650 fPtAllminPtMCvsPtAllChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
651 fPtAllminPtMCvsPtAllRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
653 int mult = fTrackCuts->CountAcceptedTracks(fESD);
654 fPtAllvsPtMCvsMult->Fill(ptMC,pt,mult);
655 fPtAllminPtMCvsPtAllvsMult->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC), mult);
657 //Check if track is reconstructed multiple times
659 for (Int_t iTrack2 = iTrack+1; iTrack2 < nTracks; iTrack2++) {
660 // AliESDtrack *track2 = GetTrackForAnalysis(iTrack2);
662 AliESDtrack *esdtrack2 = fESD->GetTrack(iTrack2);
663 if(!esdtrack2) continue;
666 track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
667 else if(fTrackType==2) {
668 track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
673 AliExternalTrackParam exParam2;
674 Bool_t relate = track2->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam2);
679 track2->Set(exParam2.GetX(),exParam2.GetAlpha(),exParam2.GetParameter(),exParam2.GetCovariance());
684 if(fTrackType==1 || fTrackType==2) delete track2;
688 if (fTrackCuts->AcceptTrack(track2)) {
689 Int_t label2 = TMath::Abs(track2->GetLabel());
691 fNPointTPCMultRec->Fill(track->GetTPCNcls());
692 fNPointTPCMultRec->Fill(track2->GetTPCNcls());
693 fDeltaPtMultRec->Fill(track->Pt(),track->Pt()-track2->Pt());
697 if(fTrackType==1 || fTrackType==2) delete track2;
699 if(multCounter>1) fMultRec->Fill(multCounter);
701 }//fTrackCuts selection
704 if (fTrackCutsITS->AcceptTrack(track) && fTrackType==0) {
707 fPtSelMCITS->Fill(ptMC);
708 fPtITSminPtMCvsPtITS->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC) );
709 fPtITSminPtMCvsPtITSNPointTPC->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),track->GetTPCNcls());
710 fPtITSminPtMCvsPtITSDCAR->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dca2D);
711 fPtITSminPtMCvsPtITSDCAZ->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dcaZ);
712 fPtITSminPtMCvsPtITSPhi->Fill(ptMC,(pt-ptMC)/(pt),phi);
713 fPtITSminPtMCvsPtITSNPointITS->Fill(ptMC,(pt-ptMC)/(pt),nPointITS);
714 fPtITSminPtMCvsPtITSNSigmaToVertex->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nSigmaToVertex);
715 fPtITSminPtMCvsPtITSChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
716 fPtITSminPtMCvsPtITSRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
717 }//fTrackCutsITS loop
719 if(fTrackType==1 || fTrackType==2) delete track;
724 PostData(0, fHistList);
725 PostData(1, fHistListITS);
728 //________________________________________________________________________
729 Bool_t AliPWG4HighPtQAMC::PythiaInfoFromFile(const char* currFile,Float_t &fXsec,Float_t &fTrials){
731 // get the cross section and the trails either from pyxsec.root or from pysec_hists.root
732 // This is to called in Notify and should provide the path to the AOD/ESD file
733 // Copied from AliAnalysisTaskJetSpectrum2
736 TString file(currFile);
740 if(file.Contains("root_archive.zip#")){
741 Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
742 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
743 file.Replace(pos+1,20,"");
746 // not an archive take the basename....
747 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
749 // Printf("%s",file.Data());
752 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
754 // next trial fetch the histgram file
755 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
757 // not a severe condition but inciate that we have no information
761 // find the tlist we want to be independtent of the name so use the Tkey
762 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
767 TList *list = dynamic_cast<TList*>(key->ReadObj());
772 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
773 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
776 } // no tree pyxsec.root
778 TTree *xtree = (TTree*)fxsec->Get("Xsection");
784 Double_t xsection = 0;
785 xtree->SetBranchAddress("xsection",&xsection);
786 xtree->SetBranchAddress("ntrials",&ntrials);
794 //________________________________________________________________________
795 Bool_t AliPWG4HighPtQAMC::Notify()
798 // Implemented Notify() to read the cross sections
799 // and number of trials from pyxsec.root
800 // Copied from AliAnalysisTaskJetSpectrum2
803 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
804 Float_t xsection = 0;
809 TFile *curfile = tree->GetCurrentFile();
811 Error("Notify","No current file");
814 if(!fh1Xsec||!fh1Trials){
815 // Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
818 PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
819 fh1Xsec->Fill("<#sigma>",xsection);
820 // construct a poor man average trials
821 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
822 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
827 //________________________________________________________________________
828 AliGenPythiaEventHeader* AliPWG4HighPtQAMC::GetPythiaEventHeader(AliMCEvent *mcEvent){
830 if(!mcEvent)return 0;
831 AliGenEventHeader* genHeader = mcEvent->GenEventHeader();
832 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
833 if(!pythiaGenHeader){
835 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
837 if (!genCocktailHeader) {
838 // AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Unknown header type (not Pythia or Cocktail)");
839 // AliWarning(Form("%s %d: Unknown header type (not Pythia or Cocktail)",(char*)__FILE__,__LINE__));
842 TList* headerList = genCocktailHeader->GetHeaders();
843 for (Int_t i=0; i<headerList->GetEntries(); i++) {
844 pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
848 if(!pythiaGenHeader){
849 AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Pythia event header not found");
853 return pythiaGenHeader;
857 //________________________________________________________________________
858 void AliPWG4HighPtQAMC::Terminate(Option_t *)
860 // The Terminate() function is the last function to be called during
861 // a query. It always runs on the client, it can be used to present
862 // the results graphically or save the results to file.