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", ""),
84 fPtAllminPtMCvsPtAll(0),
85 fPtAllminPtMCvsPtAllNPointTPC(0),
86 fPtAllminPtMCvsPtAllDCAR(0),
87 fPtAllminPtMCvsPtAllDCAZ(0),
88 fPtAllminPtMCvsPtAllPhi(0),
89 fPtAllminPtMCvsPtAllNPointITS(0),
90 fPtAllminPtMCvsPtAllNSigmaToVertex(0),
91 fPtAllminPtMCvsPtAllChi2C(0),
92 fPtAllminPtMCvsPtAllRel1PtUncertainty(0),
98 fPtITSminPtMCvsPtITS(0),
99 fPtITSminPtMCvsPtITSNPointTPC(0),
100 fPtITSminPtMCvsPtITSDCAR(0),
101 fPtITSminPtMCvsPtITSDCAZ(0),
102 fPtITSminPtMCvsPtITSPhi(0),
103 fPtITSminPtMCvsPtITSNPointITS(0),
104 fPtITSminPtMCvsPtITSNSigmaToVertex(0),
105 fPtITSminPtMCvsPtITSChi2C(0),
106 fPtITSminPtMCvsPtITSRel1PtUncertainty(0),
111 //________________________________________________________________________
112 AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(const char *name):
113 AliAnalysisTask(name,""),
136 fNPointTPCMultRec(0),
138 fPtAllminPtMCvsPtAll(0),
139 fPtAllminPtMCvsPtAllNPointTPC(0),
140 fPtAllminPtMCvsPtAllDCAR(0),
141 fPtAllminPtMCvsPtAllDCAZ(0),
142 fPtAllminPtMCvsPtAllPhi(0),
143 fPtAllminPtMCvsPtAllNPointITS(0),
144 fPtAllminPtMCvsPtAllNSigmaToVertex(0),
145 fPtAllminPtMCvsPtAllChi2C(0),
146 fPtAllminPtMCvsPtAllRel1PtUncertainty(0),
152 fPtITSminPtMCvsPtITS(0),
153 fPtITSminPtMCvsPtITSNPointTPC(0),
154 fPtITSminPtMCvsPtITSDCAR(0),
155 fPtITSminPtMCvsPtITSDCAZ(0),
156 fPtITSminPtMCvsPtITSPhi(0),
157 fPtITSminPtMCvsPtITSNPointITS(0),
158 fPtITSminPtMCvsPtITSNSigmaToVertex(0),
159 fPtITSminPtMCvsPtITSChi2C(0),
160 fPtITSminPtMCvsPtITSRel1PtUncertainty(0),
164 // Constructor. Initialization of Inputs and Outputs
166 AliDebug(2,Form("AliPWG4HighPtQAMC Calling Constructor"));
167 // Input slot #0 works with a TChain ESD
168 DefineInput(0, TChain::Class());
169 // Output slot #0, #1 write into a TList
170 DefineOutput(0, TList::Class());
171 DefineOutput(1, TList::Class());
174 //________________________________________________________________________
175 void AliPWG4HighPtQAMC::ConnectInputData(Option_t *)
177 // Connect ESD and MC event handler here
179 AliDebug(2,Form(">> AliPWG4HighPtSpectra::ConnectInputData \n"));
180 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
182 AliDebug(2,Form( "ERROR: Could not read chain from input slot 0 \n"));
186 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
189 AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
192 fESD = esdH->GetEvent();
194 AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
196 AliDebug(2,Form( "ERROR: Could not retrieve MC event handler \n"));
199 fMC = eventHandler->MCEvent();
204 //________________________________________________________________________
205 void AliPWG4HighPtQAMC::CreateOutputObjects() {
206 //Create output objects
207 AliDebug(2,Form(">> AliPWG4HighPtQATPConly::CreateOutputObjects \n"));
209 Bool_t oldStatus = TH1::AddDirectoryStatus();
210 TH1::AddDirectory(kFALSE);
213 fHistList = new TList();
214 fHistList->SetOwner(kTRUE);
216 fHistListITS = new TList();
217 fHistListITS->SetOwner(kTRUE);
219 Int_t fgkNPhiBins=18;
220 Float_t kMinPhi = 0.;
221 Float_t kMaxPhi = 2.*TMath::Pi();
225 Float_t fgkPtMax=fPtMax;
226 Int_t fgkResPtBins=80;
228 fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5);
229 fHistList->Add(fNEventAll);
230 fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5);
231 fHistList->Add(fNEventSel);
232 fNEventReject = new TH1F("fNEventReject","Reason events are rejectected for analysis",20,0,20);
234 fNEventReject->Fill("noESD",0);
235 fNEventReject->Fill("Trigger",0);
236 fNEventReject->Fill("noMCEvent",0);
237 fNEventReject->Fill("NTracks<2",0);
238 fNEventReject->Fill("noVTX",0);
239 fNEventReject->Fill("VtxStatus",0);
240 fNEventReject->Fill("NCont<2",0);
241 fNEventReject->Fill("ZVTX>10",0);
242 fHistList->Add(fNEventReject);
244 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
245 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
246 fHistList->Add(fh1Xsec);
248 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
249 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
250 fHistList->Add(fh1Trials);
252 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
253 fHistList->Add(fh1PtHard);
254 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
255 fHistList->Add(fh1PtHardTrials);
257 fPtAll = new TH1F("fPtAll","PtAll",fgkNPtBins, fgkPtMin, fgkPtMax);
258 fHistList->Add(fPtAll);
259 fPtSel = new TH1F("fPtSel","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
260 fHistList->Add(fPtSel);
262 fPtSelFakes = new TH1F("fPtSelFakes","PtSelFakes",fgkNPtBins, fgkPtMin, fgkPtMax);
263 fHistList->Add(fPtSelFakes);
265 fNPointTPCFakes = new TH1F("fNPointTPCFakes","fNPointTPCFakes",160,0.5,160.5);
266 fHistList->Add(fNPointTPCFakes);
268 fPtSelLargeLabel = new TH1F("fPtSelLargeLabel","PtSelLargeLabel",fgkNPtBins, fgkPtMin, fgkPtMax);
269 fHistList->Add(fPtSelLargeLabel);
271 fMultRec = new TH1F("fMultRec","Multiple reconstruction of tracks",20,0,20);
272 fHistList->Add(fMultRec);
274 fNPointTPCMultRec = new TH1F("fNPointTPCMultRec","Multiple reconstruction of tracks",160,0.5,160.5);
275 fHistList->Add(fNPointTPCMultRec);
277 fDeltaPtMultRec = new TH2F("fDeltaPtMultRec","Delta pT vs pT for multiple reconstructed tracks",100,0.,50.,100,-20.,20.);
278 fHistList->Add(fDeltaPtMultRec);
280 fPtAllminPtMCvsPtAll = new TH2F("fPtAllminPtMCvsPtAll","PtAllminPtMCvsPtAll",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.);
281 fPtAllminPtMCvsPtAll->SetXTitle("p_{t}^{MC}");
282 fPtAllminPtMCvsPtAll->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
283 fHistList->Add(fPtAllminPtMCvsPtAll);
285 fPtAllminPtMCvsPtAllNPointTPC = new TH3F("fPtAllminPtMCvsPtAllNPointTPC","PtAllminPtMCvsPtAllNPointTPC",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,160,0.5,160.5);
286 fPtAllminPtMCvsPtAllNPointTPC->SetXTitle("p_{t}^{MC}");
287 fPtAllminPtMCvsPtAllNPointTPC->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
288 fPtAllminPtMCvsPtAllNPointTPC->SetZTitle("N_{point,TPC}");
289 fHistList->Add(fPtAllminPtMCvsPtAllNPointTPC);
291 fPtAllminPtMCvsPtAllDCAR = new TH3F("fPtAllminPtMCvsPtAllDCAR","PtAllminPtMCvsPtAllDCAR",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-0.2,0.2);
292 fPtAllminPtMCvsPtAllDCAR->SetXTitle("p_{t}^{MC}");
293 fPtAllminPtMCvsPtAllDCAR->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
294 fPtAllminPtMCvsPtAllDCAR->SetZTitle("DCA_{R}");
295 fHistList->Add(fPtAllminPtMCvsPtAllDCAR);
297 fPtAllminPtMCvsPtAllDCAZ = new TH3F("fPtAllminPtMCvsPtAllDCAZ","PtAllminPtMCvsPtAllDCAZ",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-2.,2.);
298 fPtAllminPtMCvsPtAllDCAZ->SetXTitle("p_{t}^{MC}");
299 fPtAllminPtMCvsPtAllDCAZ->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
300 fPtAllminPtMCvsPtAllDCAZ->SetZTitle("DCA_{Z}");
301 fHistList->Add(fPtAllminPtMCvsPtAllDCAZ);
303 fPtAllminPtMCvsPtAllPhi = new TH3F("fPtAllminPtMCvsPtAllPhi","PtAllminPtMCvsPtAllPhi",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,fgkNPhiBins,kMinPhi,kMaxPhi);
304 fPtAllminPtMCvsPtAllPhi->SetXTitle("p_{t}^{MC}");
305 fPtAllminPtMCvsPtAllPhi->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
306 fPtAllminPtMCvsPtAllPhi->SetZTitle("#phi");
307 fHistList->Add(fPtAllminPtMCvsPtAllPhi);
309 fPtAllminPtMCvsPtAllNPointITS = new TH3F("fPtAllminPtMCvsPtAllNPointITS","PtAllminPtMCvsPtAllNPointITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,9,-0.5,8.5);
310 fPtAllminPtMCvsPtAllNPointITS->SetXTitle("p_{t}^{MC}");
311 fPtAllminPtMCvsPtAllNPointITS->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
312 fPtAllminPtMCvsPtAllNPointITS->SetZTitle("N_{point,ITS}}");
313 fHistList->Add(fPtAllminPtMCvsPtAllNPointITS);
315 fPtAllminPtMCvsPtAllNSigmaToVertex = new TH3F("fPtAllminPtMCvsPtAllNSigmaToVertex","PtAllminPtMCvsPtAllNSigmaToVertex",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,40,0.,8.);
316 fPtAllminPtMCvsPtAllNSigmaToVertex->SetXTitle("p_{t}^{MC}");
317 fPtAllminPtMCvsPtAllNSigmaToVertex->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
318 fPtAllminPtMCvsPtAllNSigmaToVertex->SetZTitle("N#sigma to vertex");
319 fHistList->Add(fPtAllminPtMCvsPtAllNSigmaToVertex);
321 fPtAllminPtMCvsPtAllChi2C = new TH3F("fPtAllminPtMCvsPtAllChi2C","PtAllminPtMCvsPtAllChi2C",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,20,0.,10.);
322 fPtAllminPtMCvsPtAllChi2C->SetXTitle("p_{t}^{MC}");
323 fPtAllminPtMCvsPtAllChi2C->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
324 fPtAllminPtMCvsPtAllChi2C->SetZTitle("Constrained #chi^{2}");
325 fHistList->Add(fPtAllminPtMCvsPtAllChi2C);
327 fPtAllminPtMCvsPtAllRel1PtUncertainty = new TH3F("fPtAllminPtMCvsPtAllRel1PtUncertainty","PtAllminPtMCvsPtAllRel1PtUncertainty",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,30,0.,0.3);
328 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetXTitle("p_{t}^{MC}");
329 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
330 fPtAllminPtMCvsPtAllRel1PtUncertainty->SetZTitle("Rel1PtUncertainty");
331 fHistList->Add(fPtAllminPtMCvsPtAllRel1PtUncertainty);
334 fPtSelITS = new TH1F("fPtSelITSrefit","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
335 fHistListITS->Add(fPtSelITS);
337 fPtITSminPtMCvsPtITS = new TH2F("fPtITSminPtMCvsPtITS","PtITSminPtMCvsPtITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.);
338 fPtITSminPtMCvsPtITS->SetXTitle("p_{t}^{MC}");
339 fPtITSminPtMCvsPtITS->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
340 fHistListITS->Add(fPtITSminPtMCvsPtITS);
342 fPtITSminPtMCvsPtITSNPointTPC = new TH3F("fPtITSminPtMCvsPtITSNPointTPC","PtITSminPtMCvsPtITSNPointTPC",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,160,0.5,160.5);
343 fPtITSminPtMCvsPtITSNPointTPC->SetXTitle("p_{t}^{MC}");
344 fPtITSminPtMCvsPtITSNPointTPC->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
345 fPtITSminPtMCvsPtITSNPointTPC->SetZTitle("N_{point,TPC}");
346 fHistListITS->Add(fPtITSminPtMCvsPtITSNPointTPC);
348 fPtITSminPtMCvsPtITSDCAR = new TH3F("fPtITSminPtMCvsPtITSDCAR","PtITSminPtMCvsPtITSDCAR",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-0.2,0.2);
349 fPtITSminPtMCvsPtITSDCAR->SetXTitle("p_{t}^{MC}");
350 fPtITSminPtMCvsPtITSDCAR->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
351 fPtITSminPtMCvsPtITSDCAR->SetZTitle("DCA_{R}");
352 fHistListITS->Add(fPtITSminPtMCvsPtITSDCAR);
354 fPtITSminPtMCvsPtITSDCAZ = new TH3F("fPtITSminPtMCvsPtITSDCAZ","PtITSminPtMCvsPtITSDCAZ",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,80,-2.,2.);
355 fPtITSminPtMCvsPtITSDCAZ->SetXTitle("p_{t}^{MC}");
356 fPtITSminPtMCvsPtITSDCAZ->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
357 fPtITSminPtMCvsPtITSDCAZ->SetZTitle("DCA_{Z}");
358 fHistListITS->Add(fPtITSminPtMCvsPtITSDCAZ);
360 fPtITSminPtMCvsPtITSPhi = new TH3F("fPtITSminPtMCvsPtITSPhi","PtITSminPtMCvsPtITSPhi",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,fgkNPhiBins,kMinPhi,kMaxPhi);
361 fPtITSminPtMCvsPtITSPhi->SetXTitle("p_{t}^{MC}");
362 fPtITSminPtMCvsPtITSPhi->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
363 fPtITSminPtMCvsPtITSPhi->SetZTitle("#phi");
364 fHistListITS->Add(fPtITSminPtMCvsPtITSPhi);
366 fPtITSminPtMCvsPtITSNPointITS = new TH3F("fPtITSminPtMCvsPtITSNPointITS","PtITSminPtMCvsPtITSNPointITS",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,9,-0.5,8.5);
367 fPtITSminPtMCvsPtITSNPointITS->SetXTitle("p_{t}^{MC}");
368 fPtITSminPtMCvsPtITSNPointITS->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})}");
369 fPtITSminPtMCvsPtITSNPointITS->SetZTitle("N_{point,ITS}}");
370 fHistListITS->Add(fPtITSminPtMCvsPtITSNPointITS);
372 fPtITSminPtMCvsPtITSNSigmaToVertex = new TH3F("fPtITSminPtMCvsPtITSNSigmaToVertex","PtITSminPtMCvsPtITSNSigmaToVertex",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,40,0.,8.);
373 fPtITSminPtMCvsPtITSNSigmaToVertex->SetXTitle("p_{t}^{MC}");
374 fPtITSminPtMCvsPtITSNSigmaToVertex->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
375 fPtITSminPtMCvsPtITSNSigmaToVertex->SetZTitle("N#sigma to vertex");
376 fHistListITS->Add(fPtITSminPtMCvsPtITSNSigmaToVertex);
378 fPtITSminPtMCvsPtITSChi2C = new TH3F("fPtITSminPtMCvsPtITSChi2C","PtITSminPtMCvsPtITSChi2C",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,20,0.,10.);
379 fPtITSminPtMCvsPtITSChi2C->SetXTitle("p_{t}^{MC}");
380 fPtITSminPtMCvsPtITSChi2C->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
381 fPtITSminPtMCvsPtITSChi2C->SetZTitle("Constrained #chi^{2}");
382 fHistListITS->Add(fPtITSminPtMCvsPtITSChi2C);
384 fPtITSminPtMCvsPtITSRel1PtUncertainty = new TH3F("fPtITSminPtMCvsPtITSRel1PtUncertainty","PtITSminPtMCvsPtITSRel1PtUncertainty",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.,30,0.,0.3);
385 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetXTitle("p_{t}^{MC}");
386 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetYTitle("(1/p_{t}^{ITS}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
387 fPtITSminPtMCvsPtITSRel1PtUncertainty->SetZTitle("Rel1PtUncertainty");
388 fHistListITS->Add(fPtITSminPtMCvsPtITSRel1PtUncertainty);
390 fPtAllMC = new TH1F("fPtAllMC","PtAll",fgkNPtBins, fgkPtMin, fgkPtMax);
391 fHistList->Add(fPtAllMC);
392 fPtSelMC = new TH1F("fPtSelMC","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
393 fHistList->Add(fPtSelMC);
394 fPtSelMCITS = new TH1F("fPtSelMCITS","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
395 fHistList->Add(fPtSelMCITS);
397 TH1::AddDirectory(oldStatus);
401 //________________________________________________________________________
402 Bool_t AliPWG4HighPtQAMC::SelectEvent() {
404 // Decide if event should be selected for analysis
407 // Checks following requirements:
409 // - trigger info from AliPhysicsSelection
410 // - MCevent available
411 // - number of reconstructed tracks > 1
412 // - primary vertex reconstructed
413 // - z-vertex < 10 cm
415 Bool_t selectEvent = kTRUE;
417 //fESD object available?
419 AliDebug(2,Form("ERROR: fInputEvent not available\n"));
420 fNEventReject->Fill("noESD",1);
421 selectEvent = kFALSE;
426 UInt_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
427 if(!(isSelected&AliVEvent::kMB)) { //Select collison candidates
428 AliDebug(2,Form(" Trigger Selection: event REJECTED ... "));
429 fNEventReject->Fill("Trigger",1);
430 selectEvent = kFALSE;
437 AliDebug(2,Form("MC particles: %d", fMC->GetNumberOfTracks()));
438 fStack = fMC->Stack(); //Particles Stack
439 AliDebug(2,Form("MC particles stack: %d", fStack->GetNtrack()));
441 AliDebug(2,Form("ERROR: Could not retrieve MC eventHandler"));
442 fNEventReject->Fill("noMCEvent",1);
443 selectEvent = kFALSE;
447 //Check if number of reconstructed tracks is larger than 1
448 if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2) {
449 fNEventReject->Fill("NTracks<2",1);
450 selectEvent = kFALSE;
454 //Check if vertex is reconstructed
455 if(fTrackType==1) fVtx = fESD->GetPrimaryVertexTPC();
456 else fVtx = fESD->GetPrimaryVertexSPD();
459 fNEventReject->Fill("noVTX",1);
460 selectEvent = kFALSE;
464 if(!fVtx->GetStatus()) {
465 fNEventReject->Fill("VtxStatus",1);
466 selectEvent = kFALSE;
471 // TString vtxName(fVtx->GetName());
472 if(fVtx->GetNContributors()<2) {
473 fNEventReject->Fill("NCont<2",1);
474 selectEvent = kFALSE;
478 //Check if z-vertex < 10 cm
480 fVtx->GetXYZ(primVtx);
481 if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
482 fNEventReject->Fill("ZVTX>10",1);
483 selectEvent = kFALSE;
487 AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",fVtx->GetTitle(), fVtx->GetStatus(), fVtx->GetNContributors()));
493 //________________________________________________________________________
494 void AliPWG4HighPtQAMC::Exec(Option_t *) {
496 // Called for each event
497 AliDebug(2,Form(">> AliPWG4HighPtQATPConly::Exec \n"));
498 // All events without selection
499 fNEventAll->Fill(0.);
503 PostData(0, fHistList);
504 PostData(1, fHistListITS);
508 // ---- Get MC Header information (for MC productions in pThard bins) ----
509 Double_t ptHard = 0.;
510 Double_t nTrials = 1; // trials for MC trigger weight for real data
513 AliGenPythiaEventHeader* pythiaGenHeader = GetPythiaEventHeader(fMC);
515 nTrials = pythiaGenHeader->Trials();
516 ptHard = pythiaGenHeader->GetPtHard();
518 fh1PtHard->Fill(ptHard);
519 fh1PtHardTrials->Fill(ptHard,nTrials);
521 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
525 //Need to keep track of selected events
526 fNEventSel->Fill(0.);
528 Int_t nTracks = fESD->GetNumberOfTracks();
529 AliDebug(2,Form("nTracks ESD%d", nTracks));
531 int nMCtracks = fStack->GetNtrack();
540 Float_t nSigmaToVertex = 0.;
541 Float_t relUncertainty1Pt = 0.;
543 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
546 AliESDtrack *esdtrack = fESD->GetTrack(iTrack);
547 if(!esdtrack) continue;
550 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
551 else if(fTrackType==2) {
552 track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
557 AliExternalTrackParam exParam;
558 Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
563 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
569 if(fTrackType==1 || fTrackType==2) delete track;
573 Int_t label = TMath::Abs(track->GetLabel());
574 if(label>=nMCtracks) {
575 if (fTrackCuts->AcceptTrack(track)) { fPtSelLargeLabel->Fill(pt); }
576 if(fTrackType==1 || fTrackType==2) delete track;
579 TParticle *particle = fStack->Particle(label) ;
581 if(fTrackType==1 || fTrackType==2) delete track;
585 ptMC = particle->Pt();
587 if(fTrackType==0) { //Global
590 track->GetImpactParameters(dca2D,dcaZ);
592 else if(fTrackType==1 || fTrackType==2) { //TPConly
595 track->GetImpactParametersTPC(dca2D,dcaZ);
600 UChar_t itsMap = track->GetITSClusterMap();
601 for (Int_t i=0; i < 6; i++) {
602 if (itsMap & (1 << i))
605 nSigmaToVertex = fTrackCuts->GetSigmaToVertex(track);// Calculates the number of sigma to the vertex for a track.
606 chi2C = track->GetConstrainedChi2();
607 relUncertainty1Pt = TMath::Sqrt(track->GetSigma1Pt2())*pt;
610 fPtAllMC->Fill(ptMC);
612 if (fTrackCuts->AcceptTrack(track)) {
615 if(track->GetLabel()<0) {
616 fPtSelFakes->Fill(pt);
617 fNPointTPCFakes->Fill(track->GetTPCNcls());
619 fPtSelMC->Fill(ptMC);
620 fPtAllminPtMCvsPtAll->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC) );
621 fPtAllminPtMCvsPtAllNPointTPC->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),track->GetTPCNcls());
622 fPtAllminPtMCvsPtAllDCAR->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dca2D);
623 fPtAllminPtMCvsPtAllDCAZ->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dcaZ);
624 fPtAllminPtMCvsPtAllPhi->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),phi);
625 fPtAllminPtMCvsPtAllNPointITS->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nPointITS);
626 fPtAllminPtMCvsPtAllNSigmaToVertex->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nSigmaToVertex);
627 fPtAllminPtMCvsPtAllChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
628 fPtAllminPtMCvsPtAllRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
631 //Check if track is reconstructed multiple times
633 for (Int_t iTrack2 = iTrack+1; iTrack2 < nTracks; iTrack2++) {
634 // AliESDtrack *track2 = GetTrackForAnalysis(iTrack2);
636 AliESDtrack *esdtrack2 = fESD->GetTrack(iTrack2);
637 if(!esdtrack2) continue;
640 track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
641 else if(fTrackType==2) {
642 track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
647 AliExternalTrackParam exParam2;
648 Bool_t relate = track2->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam2);
653 track2->Set(exParam2.GetX(),exParam2.GetAlpha(),exParam2.GetParameter(),exParam2.GetCovariance());
658 if(fTrackType==1 || fTrackType==2) delete track2;
662 if (fTrackCuts->AcceptTrack(track2)) {
663 Int_t label2 = TMath::Abs(track2->GetLabel());
665 fNPointTPCMultRec->Fill(track->GetTPCNcls());
666 fNPointTPCMultRec->Fill(track2->GetTPCNcls());
667 fDeltaPtMultRec->Fill(track->Pt(),track->Pt()-track2->Pt());
671 if(fTrackType==1 || fTrackType==2) delete track2;
673 if(multCounter>1) fMultRec->Fill(multCounter);
675 }//fTrackCuts selection
678 if (fTrackCutsITS->AcceptTrack(track) && fTrackType==0) {
681 fPtSelMCITS->Fill(ptMC);
682 fPtITSminPtMCvsPtITS->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC) );
683 fPtITSminPtMCvsPtITSNPointTPC->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),track->GetTPCNcls());
684 fPtITSminPtMCvsPtITSDCAR->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dca2D);
685 fPtITSminPtMCvsPtITSDCAZ->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),dcaZ);
686 fPtITSminPtMCvsPtITSPhi->Fill(ptMC,(pt-ptMC)/(pt),phi);
687 fPtITSminPtMCvsPtITSNPointITS->Fill(ptMC,(pt-ptMC)/(pt),nPointITS);
688 fPtITSminPtMCvsPtITSNSigmaToVertex->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nSigmaToVertex);
689 fPtITSminPtMCvsPtITSChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
690 fPtITSminPtMCvsPtITSRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
691 }//fTrackCutsITS loop
693 if(fTrackType==1 || fTrackType==2) delete track;
698 PostData(0, fHistList);
699 PostData(1, fHistListITS);
702 //________________________________________________________________________
703 Bool_t AliPWG4HighPtQAMC::PythiaInfoFromFile(const char* currFile,Float_t &fXsec,Float_t &fTrials){
705 // get the cross section and the trails either from pyxsec.root or from pysec_hists.root
706 // This is to called in Notify and should provide the path to the AOD/ESD file
707 // Copied from AliAnalysisTaskJetSpectrum2
710 TString file(currFile);
714 if(file.Contains("root_archive.zip#")){
715 Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
716 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
717 file.Replace(pos+1,20,"");
720 // not an archive take the basename....
721 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
723 // Printf("%s",file.Data());
726 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
728 // next trial fetch the histgram file
729 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
731 // not a severe condition but inciate that we have no information
735 // find the tlist we want to be independtent of the name so use the Tkey
736 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
741 TList *list = dynamic_cast<TList*>(key->ReadObj());
746 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
747 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
750 } // no tree pyxsec.root
752 TTree *xtree = (TTree*)fxsec->Get("Xsection");
758 Double_t xsection = 0;
759 xtree->SetBranchAddress("xsection",&xsection);
760 xtree->SetBranchAddress("ntrials",&ntrials);
768 //________________________________________________________________________
769 Bool_t AliPWG4HighPtQAMC::Notify()
772 // Implemented Notify() to read the cross sections
773 // and number of trials from pyxsec.root
774 // Copied from AliAnalysisTaskJetSpectrum2
777 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
778 Float_t xsection = 0;
783 TFile *curfile = tree->GetCurrentFile();
785 Error("Notify","No current file");
788 if(!fh1Xsec||!fh1Trials){
789 // Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
792 PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
793 fh1Xsec->Fill("<#sigma>",xsection);
794 // construct a poor man average trials
795 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
796 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
801 //________________________________________________________________________
802 AliGenPythiaEventHeader* AliPWG4HighPtQAMC::GetPythiaEventHeader(AliMCEvent *mcEvent){
804 if(!mcEvent)return 0;
805 AliGenEventHeader* genHeader = mcEvent->GenEventHeader();
806 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
807 if(!pythiaGenHeader){
809 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
811 if (!genCocktailHeader) {
812 // AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Unknown header type (not Pythia or Cocktail)");
813 // AliWarning(Form("%s %d: Unknown header type (not Pythia or Cocktail)",(char*)__FILE__,__LINE__));
816 TList* headerList = genCocktailHeader->GetHeaders();
817 for (Int_t i=0; i<headerList->GetEntries(); i++) {
818 pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
822 if(!pythiaGenHeader){
823 AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Pythia event header not found");
827 return pythiaGenHeader;
831 //________________________________________________________________________
832 void AliPWG4HighPtQAMC::Terminate(Option_t *)
834 // The Terminate() function is the last function to be called during
835 // a query. It always runs on the client, it can be used to present
836 // the results graphically or save the results to file.