1 // **************************************
2 // Task used for the correction of determiantion of reconstructed jet spectra
3 // Compares input (gen) and output (rec) jets
4 // *******************************************
7 /**************************************************************************
8 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10 * Author: The ALICE Off-line Project. *
11 * Contributors are mentioned in the code where appropriate. *
13 * Permission to use, copy, modify and distribute this software and its *
14 * documentation strictly for non-commercial purposes is hereby granted *
15 * without fee, provided that the above copyright notice appears in all *
16 * copies and that both the copyright notice and this permission notice *
17 * appear in the supporting documentation. The authors make no claims *
18 * about the suitability of this software for any purpose. It is *
19 * provided "as is" without express or implied warranty. *
20 **************************************************************************/
26 #include <TInterpreter.h>
35 #include <TLorentzVector.h>
36 #include <TClonesArray.h>
37 #include "TDatabasePDG.h"
39 #include "AliAnalysisTaskJetSpectrum2.h"
40 #include "AliAnalysisManager.h"
41 #include "AliJetFinder.h"
42 #include "AliJetHeader.h"
43 #include "AliJetReader.h"
44 #include "AliJetReaderHeader.h"
45 #include "AliUA1JetHeaderV1.h"
46 #include "AliESDEvent.h"
47 #include "AliAODEvent.h"
48 #include "AliAODHandler.h"
49 #include "AliAODTrack.h"
50 #include "AliAODJet.h"
51 #include "AliAODMCParticle.h"
52 #include "AliMCEventHandler.h"
53 #include "AliMCEvent.h"
55 #include "AliGenPythiaEventHeader.h"
56 #include "AliJetKineReaderHeader.h"
57 #include "AliGenCocktailEventHeader.h"
58 #include "AliInputEventHandler.h"
61 #include "AliAnalysisHelperJetTasks.h"
63 ClassImp(AliAnalysisTaskJetSpectrum2)
65 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(): AliAnalysisTaskSE(),
70 fhnCorrelationPhiZRec(0x0),
74 fUseAODJetInput(kFALSE),
75 fUseAODTrackInput(kFALSE),
76 fUseAODMCInput(kFALSE),
77 fUseGlobalSelection(kFALSE),
78 fUseExternalWeightOnly(kFALSE),
79 fLimitGenJetEta(kFALSE),
82 fTrackTypeRec(kTrackUndef),
83 fTrackTypeGen(kTrackUndef),
88 fDeltaPhiWindow(20./180.*TMath::Pi()),
97 fh1SumPtTrackRec(0x0),
98 fh1SumPtTrackAreaRec(0x0),
101 fh1PtJetsLeadingRecIn(0x0),
102 fh1PtTracksRecIn(0x0),
103 fh1PtTracksLeadingRecIn(0x0),
104 fh1PtTracksGenIn(0x0),
106 fh2NRecTracksPt(0x0),
107 fh2JetsLeadingPhiEta(0x0),
108 fh2JetsLeadingPhiPt(0x0),
109 fh2TracksLeadingPhiEta(0x0),
110 fh2TracksLeadingPhiPt(0x0),
111 fh2TracksLeadingJetPhiPt(0x0),
113 fh2TrackPtTrackPhi(0x0),
114 fh2DijetDeltaPhiPt(0x0),
116 fh2DijetAsymPtCut(0x0),
117 fh2DijetDeltaPhiDeltaEta(0x0),
118 fh2DijetPt2vsPt1(0x0),
119 fh2DijetDifvsSum(0x0),
121 fh1DijetMinvCut(0x0),
124 for(int i = 0;i < kMaxStep*2;++i){
125 fhnJetContainer[i] = 0;
127 for(int i = 0;i < kMaxJets;++i){
128 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
144 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
145 AliAnalysisTaskSE(name),
150 fhnCorrelationPhiZRec(0x0),
154 fUseAODJetInput(kFALSE),
155 fUseAODTrackInput(kFALSE),
156 fUseAODMCInput(kFALSE),
157 fUseGlobalSelection(kFALSE),
158 fUseExternalWeightOnly(kFALSE),
159 fLimitGenJetEta(kFALSE),
162 fTrackTypeRec(kTrackUndef),
163 fTrackTypeGen(kTrackUndef),
168 fDeltaPhiWindow(20./180.*TMath::Pi()),
173 fh1PtHardTrials(0x0),
177 fh1SumPtTrackRec(0x0),
178 fh1SumPtTrackAreaRec(0x0),
181 fh1PtJetsLeadingRecIn(0x0),
182 fh1PtTracksRecIn(0x0),
183 fh1PtTracksLeadingRecIn(0x0),
184 fh1PtTracksGenIn(0x0),
186 fh2NRecTracksPt(0x0),
187 fh2JetsLeadingPhiEta(0x0),
188 fh2JetsLeadingPhiPt(0x0),
189 fh2TracksLeadingPhiEta(0x0),
190 fh2TracksLeadingPhiPt(0x0),
191 fh2TracksLeadingJetPhiPt(0x0),
193 fh2TrackPtTrackPhi(0x0),
194 fh2DijetDeltaPhiPt(0x0),
196 fh2DijetAsymPtCut(0x0),
197 fh2DijetDeltaPhiDeltaEta(0x0),
198 fh2DijetPt2vsPt1(0x0),
199 fh2DijetDifvsSum(0x0),
201 fh1DijetMinvCut(0x0),
205 for(int i = 0;i < kMaxStep*2;++i){
206 fhnJetContainer[i] = 0;
208 for(int i = 0;i < kMaxJets;++i){
209 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
222 DefineOutput(1, TList::Class());
227 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
230 // Implemented Notify() to read the cross sections
231 // and number of trials from pyxsec.root
234 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
235 Float_t xsection = 0;
240 TFile *curfile = tree->GetCurrentFile();
242 Error("Notify","No current file");
245 if(!fh1Xsec||!fh1Trials){
246 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
249 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
250 fh1Xsec->Fill("<#sigma>",xsection);
251 // construct a poor man average trials
252 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
253 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
258 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
262 // Create the output container
272 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
275 if(!fHistList)fHistList = new TList();
276 fHistList->SetOwner(kTRUE);
277 Bool_t oldStatus = TH1::AddDirectoryStatus();
278 TH1::AddDirectory(kFALSE);
283 const Int_t nBinPt = 240;
284 Double_t binLimitsPt[nBinPt+1];
285 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
287 binLimitsPt[iPt] = 0.0;
290 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
294 const Int_t nBinPhi = 90;
295 Double_t binLimitsPhi[nBinPhi+1];
296 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
298 binLimitsPhi[iPhi] = -1.*TMath::Pi();
301 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
306 const Int_t nBinPhi2 = 360;
307 Double_t binLimitsPhi2[nBinPhi2+1];
308 for(Int_t iPhi2 = 0;iPhi2<=nBinPhi2;iPhi2++){
310 binLimitsPhi2[iPhi2] = 0.;
313 binLimitsPhi2[iPhi2] = binLimitsPhi2[iPhi2-1] + 1/(Float_t)nBinPhi2 * TMath::Pi()*2;
319 const Int_t nBinEta = 40;
320 Double_t binLimitsEta[nBinEta+1];
321 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
323 binLimitsEta[iEta] = -2.0;
326 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
330 const Int_t nBinFrag = 25;
333 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
334 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
336 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
337 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
339 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
340 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
341 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
343 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
344 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
346 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
347 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
348 fh1SumPtTrackAreaRec = new TH1F("fh1SumPtTrackAreaRec","Sum Rec track P_T #eta <0.9 / 1.8 * 2 * 0.4*0.4;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
350 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
351 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
352 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
353 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
354 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
356 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
357 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
360 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
361 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
362 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
363 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
364 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
365 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
366 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
367 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
369 fh2JetPtJetPhi = new TH2F("fh2JetPtJetPhi","Reconstructed jet phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
370 fh2TrackPtTrackPhi = new TH2F("fh2TrackPtTrackPhi","Reconstructed track phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
373 for(int ij = 0;ij < kMaxJets;++ij){
374 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
375 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
377 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
378 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
380 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
381 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
383 fh2RhoPtRec[ij] = new TH2F(Form("fh2RhoPtRec_j%d",ij),"jet shape rho for jets;r;p_{T,rec};",
384 20,0.,1.,nBinPt,binLimitsPt);
385 fh2PsiPtRec[ij] = new TH2F(Form("fh2PsiPtRec_j%d",ij),"jet shape psi for jets;r;p_{T,rec};",
386 20,0.,1.,nBinPt,binLimitsPt);
388 fh2RhoPtGen[ij] = new TH2F(Form("fh2RhoPtGen_j%d",ij),"jet shape rho for jets;r;p_{T,gen};",
389 20,0.,1.,nBinPt,binLimitsPt);
390 fh2PsiPtGen[ij] = new TH2F(Form("fh2PsiPtGen_j%d",ij),"jet shape psi for jets;r;p_{T,gen};",
391 20,0.,1.,nBinPt,binLimitsPt);
392 if(!fh1TmpRho)fh1TmpRho = new TH1F("fh1TmpRho","tmp histo for jet shape",20,0.,1);
395 fh2FragRec[ij] = new TH2F(Form("fh2FragRec_j%d",ij),"Jet Fragmentation;x=p_{T,i}/p_{T,jet};p_{T,jet};1/N_{jet}dN_{ch}/dx",
396 nBinFrag,0.,1.,nBinPt,binLimitsPt);
397 fh2FragLnRec[ij] = new TH2F(Form("fh2FragLnRec_j%d",ij),"Jet Fragmentation Ln;#xi=ln(p_{T,jet}/p_{T,i});p_{T,jet}(GeV);1/N_{jet}dN_{ch}/d#xi",
398 nBinFrag,0.,10.,nBinPt,binLimitsPt);
400 fh2FragGen[ij] = new TH2F(Form("fh2FragGen_j%d",ij),"Jet Fragmentation;x=p_{T,i}/p_{T,jet};p_{T,jet};1/N_{jet}dN_{ch}/dx",
401 nBinFrag,0.,1.,nBinPt,binLimitsPt);
402 fh2FragLnGen[ij] = new TH2F(Form("fh2FragLnGen_j%d",ij),"Jet Fragmentation Ln;#xi=ln(p_{T,jet}/p_{T,i});p_{T,jet}(GeV);1/N_{jet}dN_{ch}/d#xi",
403 nBinFrag,0.,10.,nBinPt,binLimitsPt);
408 fh2DijetDeltaPhiPt = new TH2F("fh2DeltaPhiPt","Difference in the azimuthal angle;#Delta#phi;p_{T,1};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
409 fh2DijetAsymPt = new TH2F("fh2DijetAsym","Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
410 fh2DijetAsymPtCut = new TH2F("fh2DijetAsymCut","Pt asymmetry after delta phi cut;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
411 fh2DijetDeltaPhiDeltaEta = new TH2F("fh2DijetDeltaPhiDeltaEta","Difference in the azimuthal angle;#Delta#phi;Entries",180,0.,TMath::Pi(),20,-2.,2.);
412 fh2DijetPt2vsPt1 = new TH2F("fh2DijetPt2vsPt1","Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
413 fh2DijetDifvsSum = new TH2F("fh2DijetDifvsSum","Pt difference vs Pt sum;p_{T,1}+p_{T,2} (GeV/c);#Deltap_{T} (GeV/c)",400,0.,400.,150,0.,150.);
414 fh1DijetMinv = new TH1F("fh1DijetMinv","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
415 fh1DijetMinvCut = new TH1F("fh1DijetMinvCut","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
420 const Int_t saveLevel = 3; // large save level more histos
422 fHistList->Add(fh1Xsec);
423 fHistList->Add(fh1Trials);
424 fHistList->Add(fh1PtHard);
425 fHistList->Add(fh1PtHardNoW);
426 fHistList->Add(fh1PtHardTrials);
427 if(fBranchGen.Length()>0){
428 fHistList->Add(fh1NGenJets);
429 fHistList->Add(fh1PtTracksGenIn);
431 fHistList->Add(fh1PtJetsRecIn);
432 fHistList->Add(fh1PtJetsLeadingRecIn);
433 fHistList->Add(fh1PtTracksRecIn);
434 fHistList->Add(fh1PtTracksLeadingRecIn);
435 fHistList->Add(fh1NRecJets);
436 fHistList->Add(fh1PtTrackRec);
437 fHistList->Add(fh1SumPtTrackRec);
438 fHistList->Add(fh1SumPtTrackAreaRec);
439 fHistList->Add(fh2NRecJetsPt);
440 fHistList->Add(fh2NRecTracksPt);
441 fHistList->Add(fh2JetsLeadingPhiEta );
442 fHistList->Add(fh2JetsLeadingPhiPt );
443 fHistList->Add(fh2TracksLeadingPhiEta);
444 fHistList->Add(fh2TracksLeadingPhiPt);
445 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
446 for(int ij = 0;ij<kMaxJets;++ij){
447 fHistList->Add( fh1PtRecIn[ij]);
449 if(fBranchGen.Length()>0){
450 fHistList->Add( fh1PtGenIn[ij]);
451 fHistList->Add( fh2FragGen[ij]);
452 fHistList->Add( fh2FragLnGen[ij]);
453 fHistList->Add(fh2RhoPtGen[ij]);
454 fHistList->Add(fh2PsiPtGen[ij]);
455 fHistList->Add( fh2FragGen[ij]);
457 fHistList->Add( fh2PhiPt[ij]);
458 fHistList->Add( fh2PhiEta[ij]);
459 fHistList->Add(fh2RhoPtRec[ij]);
460 fHistList->Add(fh2PsiPtRec[ij]);
461 fHistList->Add( fh2FragRec[ij]);
462 fHistList->Add( fh2FragLnRec[ij]);
464 fHistList->Add(fhnCorrelation);
465 fHistList->Add(fhnCorrelationPhiZRec);
466 fHistList->Add(fh2JetPtJetPhi);
467 fHistList->Add(fh2TrackPtTrackPhi);
469 fHistList->Add(fh2DijetDeltaPhiPt);
470 fHistList->Add(fh2DijetAsymPt);
471 fHistList->Add(fh2DijetAsymPtCut);
472 fHistList->Add(fh2DijetDeltaPhiDeltaEta);
473 fHistList->Add(fh2DijetPt2vsPt1);
474 fHistList->Add(fh2DijetDifvsSum);
475 fHistList->Add(fh1DijetMinv);
476 fHistList->Add(fh1DijetMinvCut);
479 // =========== Switch on Sumw2 for all histos ===========
480 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
481 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
486 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
489 TH1::AddDirectory(oldStatus);
492 void AliAnalysisTaskJetSpectrum2::Init()
498 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
502 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
505 if(!AliAnalysisHelperJetTasks::Selected()&&fUseGlobalSelection){
506 // no selection by the service task, we continue
507 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
508 PostData(1, fHistList);
513 // Execute analysis for current event
515 AliESDEvent *fESD = 0;
517 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
519 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
525 // assume that the AOD is in the general output...
528 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
532 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
539 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
542 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
545 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
549 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
550 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
552 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
556 // ==== General variables needed
559 // We use statice array, not to fragment the memory
560 AliAODJet genJets[kMaxJets];
562 AliAODJet recJets[kMaxJets];
564 ///////////////////////////
569 Double_t nTrials = 1; // Trials for MC trigger
571 if(fUseExternalWeightOnly){
572 eventW = fExternalWeight;
575 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
576 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
577 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
578 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
579 // this is the part we only use when we have MC information
580 AliMCEvent* mcEvent = MCEvent();
581 // AliStack *pStack = 0;
583 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
586 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
589 nTrials = pythiaGenHeader->Trials();
590 ptHard = pythiaGenHeader->GetPtHard();
591 int iProcessType = pythiaGenHeader->ProcessType();
593 // 12 f+barf -> f+barf
598 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
599 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
601 // fetch the pythia generated jets only to be used here
602 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
603 AliAODJet pythiaGenJets[kMaxJets];
604 for(int ip = 0;ip < nPythiaGenJets;++ip){
605 if(iCount>=kMaxJets)continue;
607 pythiaGenHeader->TriggerJet(ip,p);
608 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
610 if(fBranchGen.Length()==0){
613 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
614 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
617 if(fMinJetPt>0&&pythiaGenJets[iCount].Pt()<fMinJetPt)continue;
618 // if we have MC particles and we do not read from the aod branch
619 // use the pythia jets
620 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
625 if(fBranchGen.Length()==0)nGenJets = iCount;
626 }// (fAnalysisType&kMCESD)==kMCESD)
629 // we simply fetch the tracks/mc particles as a list of AliVParticles
637 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
638 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
639 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
640 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
643 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
644 fh1PtHard->Fill(ptHard,eventW);
645 fh1PtHardNoW->Fill(ptHard,1);
646 fh1PtHardTrials->Fill(ptHard,nTrials);
648 // If we set a second branch for the input jets fetch this
649 if(fBranchGen.Length()>0){
650 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
653 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
654 if(iCount>=kMaxJets)continue;
655 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
659 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
660 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
663 if(fMinJetPt>0&&tmp->Pt()<fMinJetPt)continue;
664 genJets[iCount] = *tmp;
670 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
671 if(fDebug>2)fAOD->Print();
675 fh1NGenJets->Fill(nGenJets);
676 // We do not want to exceed the maximum jet number
677 nGenJets = TMath::Min(nGenJets,kMaxJets);
679 // Fetch the reconstructed jets...
681 nRecJets = aodRecJets->GetEntries();
683 nRecJets = aodRecJets->GetEntries();
684 fh1NRecJets->Fill(nRecJets);
686 // Do something with the all rec jets
687 Int_t nRecOver = nRecJets;
689 // check that the jets are sorted
690 Float_t ptOld = 999999;
691 for(int ir = 0;ir < nRecJets;ir++){
692 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
693 Float_t tmpPt = tmp->Pt();
695 Printf("%s:%d Jets Not Sorted %s !! %d:%.3E %d:%.3E",(char*)__FILE__,__LINE__,fBranchRec.Data(),ir,tmpPt,ir-1,ptOld);
702 TIterator *recIter = aodRecJets->MakeIterator();
703 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
704 Float_t pt = tmpRec->Pt();
706 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
707 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
708 while(pt<ptCut&&tmpRec){
710 tmpRec = (AliAODJet*)(recIter->Next());
715 if(nRecOver<=0)break;
716 fh2NRecJetsPt->Fill(ptCut,nRecOver);
720 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
721 Float_t phi = leading->Phi();
722 if(phi<0)phi+=TMath::Pi()*2.;
723 Float_t eta = leading->Eta();
725 while((tmpRec = (AliAODJet*)(recIter->Next()))){
726 Float_t tmpPt = tmpRec->Pt();
727 fh1PtJetsRecIn->Fill(tmpPt);
729 fh1PtJetsLeadingRecIn->Fill(tmpPt);
733 Float_t tmpPhi = tmpRec->Phi();
735 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
736 Float_t dPhi = phi - tmpRec->Phi();
737 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
738 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
739 Float_t dEta = eta - tmpRec->Eta();
740 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
741 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
746 Int_t nTrackOver = recParticles.GetSize();
747 // do the same for tracks and jets
749 TIterator *recIter = recParticles.MakeIterator();
750 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
751 Float_t pt = tmpRec->Pt();
752 // Printf("Leading track p_t %3.3E",pt);
753 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
754 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
755 while(pt<ptCut&&tmpRec){
757 tmpRec = (AliVParticle*)(recIter->Next());
762 if(nTrackOver<=0)break;
763 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
767 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
768 Float_t phi = leading->Phi();
769 if(phi<0)phi+=TMath::Pi()*2.;
770 Float_t eta = leading->Eta();
772 while((tmpRec = (AliVParticle*)(recIter->Next()))){
773 Float_t tmpPt = tmpRec->Pt();
774 fh1PtTracksRecIn->Fill(tmpPt);
776 fh1PtTracksLeadingRecIn->Fill(tmpPt);
780 Float_t tmpPhi = tmpRec->Phi();
782 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
783 Float_t dPhi = phi - tmpRec->Phi();
784 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
785 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
786 Float_t dEta = eta - tmpRec->Eta();
787 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
788 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
793 if(genParticles.GetSize()){
794 TIterator *genIter = genParticles.MakeIterator();
795 AliVParticle *tmpGen = 0;
796 while((tmpGen = (AliVParticle*)(genIter->Next()))){
797 if(TMath::Abs(tmpGen->Eta())<0.9){
798 Float_t tmpPt = tmpGen->Pt();
799 fh1PtTracksGenIn->Fill(tmpPt);
805 nRecJets = TMath::Min(nRecJets,kMaxJets);
808 for(int ir = 0;ir < nRecJets;++ir){
809 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
811 if(tmp->Pt()<fMinJetPt)continue;
815 nRecJets = iCountRec;
818 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
820 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
821 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
824 for(int i = 0;i<kMaxJets;++i){
825 iGenIndex[i] = iRecIndex[i] = -1;
828 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
829 iGenIndex,iRecIndex,fDebug);
830 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
833 for(int i = 0;i<kMaxJets;++i){
834 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
835 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
842 Double_t container[6];
843 Double_t containerPhiZ[6];
845 // loop over generated jets
847 // radius; tmp, get from the jet header itself
848 // at some point, how todeal woht FastJet on MC?
849 Float_t radiusGen =0.4;
850 Float_t radiusRec =0.4;
852 for(int ig = 0;ig < nGenJets;++ig){
853 Double_t ptGen = genJets[ig].Pt();
854 Double_t phiGen = genJets[ig].Phi();
855 if(phiGen<0)phiGen+=TMath::Pi()*2.;
856 Double_t etaGen = genJets[ig].Eta();
858 container[3] = ptGen;
859 container[4] = etaGen;
860 container[5] = phiGen;
861 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
862 Int_t ir = iRecIndex[ig];
864 if(TMath::Abs(etaGen)<fRecEtaWindow){
867 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
868 fh1PtGenIn[ig]->Fill(ptGen,eventW);
869 // fill the fragmentation function
870 for(int it = 0;it<genParticles.GetEntries();++it){
871 AliVParticle *part = (AliVParticle*)genParticles.At(it);
872 Float_t deltaR = genJets[ig].DeltaR(part);
873 fh1TmpRho->Fill(deltaR,part->Pt()/ptGen);
874 if(deltaR<radiusGen){
875 Float_t z = part->Pt()/ptGen;
876 Float_t lnz = -1.*TMath::Log(z);
877 fh2FragGen[ig]->Fill(z,ptGen,eventW);
878 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
883 for(int ibx = 1;ibx<fh2RhoPtGen[ir]->GetNbinsX();ibx++){
884 Float_t r = fh2RhoPtGen[ir]->GetXaxis()->GetBinCenter(ibx);
885 Float_t rho = fh1TmpRho->GetBinContent(ibx);
887 fh2RhoPtGen[ig]->Fill(r,ptGen,rho);
888 fh2PsiPtGen[ig]->Fill(r,ptGen,rhoSum);
891 if(ir>=0&&ir<nRecJets){
892 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
893 Double_t etaRec = recJets[ir].Eta();
894 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
896 }// loop over generated jets
899 for(int it = 0;it<recParticles.GetEntries();++it){
900 AliVParticle *part = (AliVParticle*)recParticles.At(it);
901 // fill sum pt and P_t of all paritles
902 if(TMath::Abs(part->Eta())<0.9){
903 Float_t pt = part->Pt();
904 fh1PtTrackRec->Fill(pt,eventW);
905 fh2TrackPtTrackPhi->Fill(pt,part->Phi());
909 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
910 fh1SumPtTrackRec->Fill(sumPt,eventW);
913 // loop over reconstructed jets
914 for(int ir = 0;ir < nRecJets;++ir){
915 Double_t etaRec = recJets[ir].Eta();
916 Double_t ptRec = recJets[ir].Pt();
917 Double_t phiRec = recJets[ir].Phi();
918 if(phiRec<0)phiRec+=TMath::Pi()*2.;
921 // do something with dijets...
923 Double_t etaRec1 = recJets[0].Eta();
924 Double_t ptRec1 = recJets[0].Pt();
925 Double_t phiRec1 = recJets[0].Phi();
926 if(phiRec1<0)phiRec1+=TMath::Pi()*2.;
929 if(TMath::Abs(etaRec1)<fRecEtaWindow
930 &&TMath::Abs(etaRec)<fRecEtaWindow){
932 Float_t deltaPhi = phiRec1 - phiRec;
934 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
935 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
936 deltaPhi = TMath::Abs(deltaPhi);
937 fh2DijetDeltaPhiPt->Fill(deltaPhi,ptRec1);
938 Float_t asym = (ptRec1-ptRec)/(ptRec1+ptRec);
939 fh2DijetAsymPt->Fill(asym,ptRec1);
940 fh2DijetDeltaPhiDeltaEta->Fill(deltaPhi,etaRec1-etaRec);
941 fh2DijetPt2vsPt1->Fill(ptRec1,ptRec);
942 fh2DijetDifvsSum->Fill(ptRec1+ptRec,ptRec1-ptRec);
943 Float_t minv = 2.*(recJets[0].P()*recJets[1].P()-
944 recJets[0].Px()*recJets[1].Px()-
945 recJets[0].Py()*recJets[1].Py()-
946 recJets[0].Pz()*recJets[1].Py());
947 minv = TMath::Sqrt(minv);
950 fh1DijetMinv->Fill(minv);
951 if((TMath::Pi()-deltaPhi)<fDeltaPhiWindow){
952 fh1DijetMinvCut->Fill(minv);
953 fh2DijetAsymPtCut->Fill(asym,ptRec1);
959 container[0] = ptRec;
960 container[1] = etaRec;
961 container[2] = phiRec;
962 containerPhiZ[0] = ptRec;
963 containerPhiZ[1] = phiRec;
964 if(ptRec>30.&&fDebug>0){
965 // need to cast to int, otherwise the printf overwrites
966 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
967 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(int)fInputHandler->GetTree()->GetTree()->GetReadEntry());
968 if(fESD)Printf("ESDEvent GetEventNumberInFile(): %d",fESD->GetEventNumberInFile());
969 // aodH->SetFillAOD(kTRUE);
970 fAOD->GetHeader()->Print();
971 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
972 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
973 AliAODTrack *tr = fAOD->GetTrack(it);
974 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
978 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
986 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
987 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
989 Float_t zLeading = -1;
990 if(TMath::Abs(etaRec)<fRecEtaWindow){
991 fh2JetPtJetPhi->Fill(ptRec,phiRec);
992 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
993 fh1PtRecIn[ir]->Fill(ptRec,eventW);
994 // fill the fragmentation function
998 for(int it = 0;it<recParticles.GetEntries();++it){
999 AliVParticle *part = (AliVParticle*)recParticles.At(it);
1000 Float_t eta = part->Eta();
1001 if(TMath::Abs(eta)<0.9){
1002 Float_t phi = part->Phi();
1003 if(phi<0)phi+=TMath::Pi()*2.;
1004 Float_t dPhi = phi - phiRec;
1005 Float_t dEta = eta - etaRec;
1006 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1007 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1008 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
1009 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
1012 Float_t deltaR = recJets[ir].DeltaR(part);
1013 fh1TmpRho->Fill(deltaR,part->Pt()/ptRec);
1016 if(deltaR<radiusRec){
1017 Float_t z = part->Pt()/ptRec;
1018 if(z>zLeading)zLeading=z;
1019 Float_t lnz = -1.*TMath::Log(z);
1020 fh2FragRec[ir]->Fill(z,ptRec,eventW);
1021 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
1024 // fill the jet shapes
1026 for(int ibx = 1;ibx<fh2RhoPtRec[ir]->GetNbinsX();ibx++){
1027 Float_t r = fh2RhoPtRec[ir]->GetXaxis()->GetBinCenter(ibx);
1028 Float_t rho = fh1TmpRho->GetBinContent(ibx);
1030 fh2RhoPtRec[ir]->Fill(r,ptRec,rho);
1031 fh2PsiPtRec[ir]->Fill(r,ptRec,rhoSum);
1036 containerPhiZ[2] = zLeading;
1039 Int_t ig = iGenIndex[ir];
1040 if(ig>=0 && ig<nGenJets){
1041 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
1042 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1043 Double_t ptGen = genJets[ig].Pt();
1044 Double_t phiGen = genJets[ig].Phi();
1045 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1046 Double_t etaGen = genJets[ig].Eta();
1048 container[3] = ptGen;
1049 container[4] = etaGen;
1050 container[5] = phiGen;
1051 containerPhiZ[3] = ptGen;
1053 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
1056 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
1057 if(TMath::Abs(etaRec)<fRecEtaWindow){
1058 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
1059 fhnCorrelation->Fill(container);
1060 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1062 }// if etarec in window
1066 containerPhiZ[3] = 0;
1067 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1069 }// loop over reconstructed jets
1072 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1073 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1074 PostData(1, fHistList);
1078 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
1080 // Create the particle container for the correction framework manager and
1083 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
1084 const Double_t kPtmin = 0.0, kPtmax = 160.; // we do not want to have empty bins at the beginning...
1085 const Double_t kEtamin = -3.0, kEtamax = 3.0;
1086 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
1087 const Double_t kZmin = 0., kZmax = 1;
1089 // can we neglect migration in eta and phi?
1090 // phi should be no problem since we cover full phi and are phi symmetric
1091 // eta migration is more difficult due to needed acceptance correction
1092 // in limited eta range
1094 //arrays for the number of bins in each dimension
1096 iBin[0] = 160; //bins in pt
1097 iBin[1] = 1; //bins in eta
1098 iBin[2] = 1; // bins in phi
1100 //arrays for lower bounds :
1101 Double_t* binEdges[kNvar];
1102 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1103 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1105 //values for bin lower bounds
1106 // for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)TMath::Power(10,TMath::Log10(kPtmin) + (TMath::Log10(kPtmax)-TMath::Log10(kPtmin))/iBin[0]*(Double_t)i);
1107 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1108 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1109 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1112 for(int i = 0;i < kMaxStep*2;++i){
1113 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d"),kNvar,iBin);
1114 for (int k=0; k<kNvar; k++) {
1115 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1118 //create correlation matrix for unfolding
1119 Int_t thnDim[2*kNvar];
1120 for (int k=0; k<kNvar; k++) {
1121 //first half : reconstructed
1123 thnDim[k] = iBin[k];
1124 thnDim[k+kNvar] = iBin[k];
1127 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1128 for (int k=0; k<kNvar; k++) {
1129 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1130 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1132 fhnCorrelation->Sumw2();
1134 // for second correlation histogram
1137 const Int_t kNvarPhiZ = 4;
1138 //arrays for the number of bins in each dimension
1139 Int_t iBinPhiZ[kNvarPhiZ];
1140 iBinPhiZ[0] = 80; //bins in pt
1141 iBinPhiZ[1] = 72; //bins in phi
1142 iBinPhiZ[2] = 20; // bins in Z
1143 iBinPhiZ[3] = 80; //bins in ptgen
1145 //arrays for lower bounds :
1146 Double_t* binEdgesPhiZ[kNvarPhiZ];
1147 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1148 binEdgesPhiZ[ivar] = new Double_t[iBinPhiZ[ivar] + 1];
1150 for(Int_t i=0; i<=iBinPhiZ[0]; i++) binEdgesPhiZ[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[0]*(Double_t)i;
1151 for(Int_t i=0; i<=iBinPhiZ[1]; i++) binEdgesPhiZ[1][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBinPhiZ[1]*(Double_t)i;
1152 for(Int_t i=0; i<=iBinPhiZ[2]; i++) binEdgesPhiZ[2][i]=(Double_t)kZmin + (kZmax-kZmin)/iBinPhiZ[2]*(Double_t)i;
1153 for(Int_t i=0; i<=iBinPhiZ[3]; i++) binEdgesPhiZ[3][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[3]*(Double_t)i;
1155 fhnCorrelationPhiZRec = new THnSparseF("fhnCorrelationPhiZRec","THnSparse with correlations",kNvarPhiZ,iBinPhiZ);
1156 for (int k=0; k<kNvarPhiZ; k++) {
1157 fhnCorrelationPhiZRec->SetBinEdges(k,binEdgesPhiZ[k]);
1159 fhnCorrelationPhiZRec->Sumw2();
1162 // Add a histogram for Fake jets
1164 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1165 delete [] binEdges[ivar];
1167 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1168 delete [] binEdgesPhiZ[ivar];
1172 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1174 // Terminate analysis
1176 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1180 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1182 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1185 if(type==kTrackAOD){
1186 AliAODEvent *aod = 0;
1187 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1188 else aod = AODEvent();
1192 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1193 AliAODTrack *tr = aod->GetTrack(it);
1194 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1195 if(TMath::Abs(tr->Eta())>0.9)continue;
1198 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1199 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
1202 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1204 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1214 else if (type == kTrackKineAll||type == kTrackKineCharged){
1215 AliMCEvent* mcEvent = MCEvent();
1216 if(!mcEvent)return iCount;
1217 // we want to have alivpartilces so use get track
1218 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1219 if(!mcEvent->IsPhysicalPrimary(it))continue;
1220 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1221 if(type == kTrackKineAll){
1225 else if(type == kTrackKineCharged){
1226 if(part->Particle()->GetPDG()->Charge()==0)continue;
1232 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1233 AliAODEvent *aod = 0;
1234 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1235 else aod = AODEvent();
1236 if(!aod)return iCount;
1237 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1238 if(!tca)return iCount;
1239 for(int it = 0;it < tca->GetEntriesFast();++it){
1240 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1241 if(!part->IsPhysicalPrimary())continue;
1242 if(type == kTrackAODMCAll){
1246 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1247 if(part->Charge()==0)continue;
1248 if(kTrackAODMCCharged){
1252 if(TMath::Abs(part->Eta())>0.9)continue;