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),
81 fEventSelectionMask(0),
83 fTrackTypeRec(kTrackUndef),
84 fTrackTypeGen(kTrackUndef),
89 fDeltaPhiWindow(20./180.*TMath::Pi()),
98 fh1SumPtTrackRec(0x0),
99 fh1SumPtTrackAreaRec(0x0),
102 fh1PtJetsLeadingRecIn(0x0),
103 fh1PtTracksRecIn(0x0),
104 fh1PtTracksLeadingRecIn(0x0),
105 fh1PtTracksGenIn(0x0),
107 fh2NRecTracksPt(0x0),
108 fh2JetsLeadingPhiEta(0x0),
109 fh2JetsLeadingPhiPt(0x0),
110 fh2TracksLeadingPhiEta(0x0),
111 fh2TracksLeadingPhiPt(0x0),
112 fh2TracksLeadingJetPhiPt(0x0),
114 fh2TrackPtTrackPhi(0x0),
115 fh2DijetDeltaPhiPt(0x0),
117 fh2DijetAsymPtCut(0x0),
118 fh2DijetDeltaPhiDeltaEta(0x0),
119 fh2DijetPt2vsPt1(0x0),
120 fh2DijetDifvsSum(0x0),
122 fh1DijetMinvCut(0x0),
125 for(int i = 0;i < kMaxStep*2;++i){
126 fhnJetContainer[i] = 0;
128 for(int i = 0;i < kMaxJets;++i){
129 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
145 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
146 AliAnalysisTaskSE(name),
151 fhnCorrelationPhiZRec(0x0),
155 fUseAODJetInput(kFALSE),
156 fUseAODTrackInput(kFALSE),
157 fUseAODMCInput(kFALSE),
158 fUseGlobalSelection(kFALSE),
159 fUseExternalWeightOnly(kFALSE),
160 fLimitGenJetEta(kFALSE),
162 fEventSelectionMask(0),
164 fTrackTypeRec(kTrackUndef),
165 fTrackTypeGen(kTrackUndef),
170 fDeltaPhiWindow(20./180.*TMath::Pi()),
175 fh1PtHardTrials(0x0),
179 fh1SumPtTrackRec(0x0),
180 fh1SumPtTrackAreaRec(0x0),
183 fh1PtJetsLeadingRecIn(0x0),
184 fh1PtTracksRecIn(0x0),
185 fh1PtTracksLeadingRecIn(0x0),
186 fh1PtTracksGenIn(0x0),
188 fh2NRecTracksPt(0x0),
189 fh2JetsLeadingPhiEta(0x0),
190 fh2JetsLeadingPhiPt(0x0),
191 fh2TracksLeadingPhiEta(0x0),
192 fh2TracksLeadingPhiPt(0x0),
193 fh2TracksLeadingJetPhiPt(0x0),
195 fh2TrackPtTrackPhi(0x0),
196 fh2DijetDeltaPhiPt(0x0),
198 fh2DijetAsymPtCut(0x0),
199 fh2DijetDeltaPhiDeltaEta(0x0),
200 fh2DijetPt2vsPt1(0x0),
201 fh2DijetDifvsSum(0x0),
203 fh1DijetMinvCut(0x0),
207 for(int i = 0;i < kMaxStep*2;++i){
208 fhnJetContainer[i] = 0;
210 for(int i = 0;i < kMaxJets;++i){
211 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
224 DefineOutput(1, TList::Class());
229 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
232 // Implemented Notify() to read the cross sections
233 // and number of trials from pyxsec.root
236 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
237 Float_t xsection = 0;
242 TFile *curfile = tree->GetCurrentFile();
244 Error("Notify","No current file");
247 if(!fh1Xsec||!fh1Trials){
248 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
251 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
252 fh1Xsec->Fill("<#sigma>",xsection);
253 // construct a poor man average trials
254 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
255 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
260 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
264 // Create the output container
274 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
277 if(!fHistList)fHistList = new TList();
278 fHistList->SetOwner(kTRUE);
279 Bool_t oldStatus = TH1::AddDirectoryStatus();
280 TH1::AddDirectory(kFALSE);
285 const Int_t nBinPt = 320;
286 Double_t binLimitsPt[nBinPt+1];
287 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
289 binLimitsPt[iPt] = 0.0;
292 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
296 const Int_t nBinPhi = 90;
297 Double_t binLimitsPhi[nBinPhi+1];
298 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
300 binLimitsPhi[iPhi] = -1.*TMath::Pi();
303 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
308 const Int_t nBinPhi2 = 360;
309 Double_t binLimitsPhi2[nBinPhi2+1];
310 for(Int_t iPhi2 = 0;iPhi2<=nBinPhi2;iPhi2++){
312 binLimitsPhi2[iPhi2] = 0.;
315 binLimitsPhi2[iPhi2] = binLimitsPhi2[iPhi2-1] + 1/(Float_t)nBinPhi2 * TMath::Pi()*2;
321 const Int_t nBinEta = 40;
322 Double_t binLimitsEta[nBinEta+1];
323 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
325 binLimitsEta[iEta] = -2.0;
328 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
332 const Int_t nBinFrag = 25;
335 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
336 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
338 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
339 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
341 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
342 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
343 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
345 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
346 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
348 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
349 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
350 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);
352 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
353 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
354 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
355 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
356 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
358 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
359 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
362 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
363 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
364 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
365 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
366 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
367 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
368 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
369 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
371 fh2JetPtJetPhi = new TH2F("fh2JetPtJetPhi","Reconstructed jet phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
372 fh2TrackPtTrackPhi = new TH2F("fh2TrackPtTrackPhi","Reconstructed track phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
375 for(int ij = 0;ij < kMaxJets;++ij){
376 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
377 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
379 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
380 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
382 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
383 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
385 fh2RhoPtRec[ij] = new TH2F(Form("fh2RhoPtRec_j%d",ij),"jet shape rho for jets;r;p_{T,rec};",
386 20,0.,1.,nBinPt,binLimitsPt);
387 fh2PsiPtRec[ij] = new TH2F(Form("fh2PsiPtRec_j%d",ij),"jet shape psi for jets;r;p_{T,rec};",
388 20,0.,1.,nBinPt,binLimitsPt);
390 fh2RhoPtGen[ij] = new TH2F(Form("fh2RhoPtGen_j%d",ij),"jet shape rho for jets;r;p_{T,gen};",
391 20,0.,1.,nBinPt,binLimitsPt);
392 fh2PsiPtGen[ij] = new TH2F(Form("fh2PsiPtGen_j%d",ij),"jet shape psi for jets;r;p_{T,gen};",
393 20,0.,1.,nBinPt,binLimitsPt);
394 if(!fh1TmpRho)fh1TmpRho = new TH1F("fh1TmpRho","tmp histo for jet shape",20,0.,1);
397 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",
398 nBinFrag,0.,1.,nBinPt,binLimitsPt);
399 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",
400 nBinFrag,0.,10.,nBinPt,binLimitsPt);
402 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",
403 nBinFrag,0.,1.,nBinPt,binLimitsPt);
404 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",
405 nBinFrag,0.,10.,nBinPt,binLimitsPt);
410 fh2DijetDeltaPhiPt = new TH2F("fh2DeltaPhiPt","Difference in the azimuthal angle;#Delta#phi;p_{T,1};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
411 fh2DijetAsymPt = new TH2F("fh2DijetAsym","Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
412 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);
413 fh2DijetDeltaPhiDeltaEta = new TH2F("fh2DijetDeltaPhiDeltaEta","Difference in the azimuthal angle;#Delta#phi;Entries",180,0.,TMath::Pi(),20,-2.,2.);
414 fh2DijetPt2vsPt1 = new TH2F("fh2DijetPt2vsPt1","Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
415 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.);
416 fh1DijetMinv = new TH1F("fh1DijetMinv","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
417 fh1DijetMinvCut = new TH1F("fh1DijetMinvCut","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
422 const Int_t saveLevel = 3; // large save level more histos
424 fHistList->Add(fh1Xsec);
425 fHistList->Add(fh1Trials);
426 fHistList->Add(fh1PtHard);
427 fHistList->Add(fh1PtHardNoW);
428 fHistList->Add(fh1PtHardTrials);
429 if(fBranchGen.Length()>0){
430 fHistList->Add(fh1NGenJets);
431 fHistList->Add(fh1PtTracksGenIn);
433 fHistList->Add(fh1PtJetsRecIn);
434 fHistList->Add(fh1PtJetsLeadingRecIn);
435 fHistList->Add(fh1PtTracksRecIn);
436 fHistList->Add(fh1PtTracksLeadingRecIn);
437 fHistList->Add(fh1NRecJets);
438 fHistList->Add(fh1PtTrackRec);
439 fHistList->Add(fh1SumPtTrackRec);
440 fHistList->Add(fh1SumPtTrackAreaRec);
441 fHistList->Add(fh2NRecJetsPt);
442 fHistList->Add(fh2NRecTracksPt);
443 fHistList->Add(fh2JetsLeadingPhiEta );
444 fHistList->Add(fh2JetsLeadingPhiPt );
445 fHistList->Add(fh2TracksLeadingPhiEta);
446 fHistList->Add(fh2TracksLeadingPhiPt);
447 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
448 for(int ij = 0;ij<kMaxJets;++ij){
449 fHistList->Add( fh1PtRecIn[ij]);
451 if(fBranchGen.Length()>0){
452 fHistList->Add(fh1PtGenIn[ij]);
453 fHistList->Add(fh2FragGen[ij]);
454 fHistList->Add(fh2FragLnGen[ij]);
455 fHistList->Add(fh2RhoPtGen[ij]);
456 fHistList->Add(fh2PsiPtGen[ij]);
458 fHistList->Add( fh2PhiPt[ij]);
459 fHistList->Add( fh2PhiEta[ij]);
460 fHistList->Add( fh2RhoPtRec[ij]);
461 fHistList->Add( fh2PsiPtRec[ij]);
462 fHistList->Add( fh2FragRec[ij]);
463 fHistList->Add( fh2FragLnRec[ij]);
465 fHistList->Add(fhnCorrelation);
466 fHistList->Add(fhnCorrelationPhiZRec);
467 fHistList->Add(fh2JetPtJetPhi);
468 fHistList->Add(fh2TrackPtTrackPhi);
470 fHistList->Add(fh2DijetDeltaPhiPt);
471 fHistList->Add(fh2DijetAsymPt);
472 fHistList->Add(fh2DijetAsymPtCut);
473 fHistList->Add(fh2DijetDeltaPhiDeltaEta);
474 fHistList->Add(fh2DijetPt2vsPt1);
475 fHistList->Add(fh2DijetDifvsSum);
476 fHistList->Add(fh1DijetMinv);
477 fHistList->Add(fh1DijetMinvCut);
480 // =========== Switch on Sumw2 for all histos ===========
481 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
482 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
487 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
490 TH1::AddDirectory(oldStatus);
493 void AliAnalysisTaskJetSpectrum2::Init()
499 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
503 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
506 Bool_t selected = kTRUE;
508 if(fUseGlobalSelection&&fEventSelectionMask==0){
509 selected = AliAnalysisHelperJetTasks::Selected();
511 else if(fUseGlobalSelection&&fEventSelectionMask>0){
512 selected = AliAnalysisHelperJetTasks::TestSelectInfo(fEventSelectionMask);
516 // no selection by the service task, we continue
517 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
518 PostData(1, fHistList);
524 // Execute analysis for current event
526 AliESDEvent *fESD = 0;
528 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
530 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
536 // assume that the AOD is in the general output...
539 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
543 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
550 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
553 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
556 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
560 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
561 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
563 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
567 // ==== General variables needed
570 // We use statice array, not to fragment the memory
571 AliAODJet genJets[kMaxJets];
573 AliAODJet recJets[kMaxJets];
575 ///////////////////////////
580 Double_t nTrials = 1; // Trials for MC trigger
582 if(fUseExternalWeightOnly){
583 eventW = fExternalWeight;
586 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
587 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
588 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
589 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
590 // this is the part we only use when we have MC information
591 AliMCEvent* mcEvent = MCEvent();
592 // AliStack *pStack = 0;
594 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
597 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
600 nTrials = pythiaGenHeader->Trials();
601 ptHard = pythiaGenHeader->GetPtHard();
602 int iProcessType = pythiaGenHeader->ProcessType();
604 // 12 f+barf -> f+barf
609 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
610 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
612 // fetch the pythia generated jets only to be used here
613 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
614 AliAODJet pythiaGenJets[kMaxJets];
615 for(int ip = 0;ip < nPythiaGenJets;++ip){
616 if(iCount>=kMaxJets)continue;
618 pythiaGenHeader->TriggerJet(ip,p);
619 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
621 if(fBranchGen.Length()==0){
624 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
625 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
628 if(fMinJetPt>0&&pythiaGenJets[iCount].Pt()<fMinJetPt)continue;
629 // if we have MC particles and we do not read from the aod branch
630 // use the pythia jets
631 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
636 if(fBranchGen.Length()==0)nGenJets = iCount;
637 }// (fAnalysisType&kMCESD)==kMCESD)
640 // we simply fetch the tracks/mc particles as a list of AliVParticles
648 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
649 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
650 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
651 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
654 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
655 fh1PtHard->Fill(ptHard,eventW);
656 fh1PtHardNoW->Fill(ptHard,1);
657 fh1PtHardTrials->Fill(ptHard,nTrials);
659 // If we set a second branch for the input jets fetch this
660 if(fBranchGen.Length()>0){
661 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
664 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
665 if(iCount>=kMaxJets)continue;
666 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
670 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
671 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
674 if(fMinJetPt>0&&tmp->Pt()<fMinJetPt)continue;
675 genJets[iCount] = *tmp;
681 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
682 if(fDebug>2)fAOD->Print();
686 fh1NGenJets->Fill(nGenJets);
687 // We do not want to exceed the maximum jet number
688 nGenJets = TMath::Min(nGenJets,kMaxJets);
690 // Fetch the reconstructed jets...
692 nRecJets = aodRecJets->GetEntries();
694 nRecJets = aodRecJets->GetEntries();
695 fh1NRecJets->Fill(nRecJets);
697 // Do something with the all rec jets
698 Int_t nRecOver = nRecJets;
700 // check that the jets are sorted
701 Float_t ptOld = 999999;
702 for(int ir = 0;ir < nRecJets;ir++){
703 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
704 Float_t tmpPt = tmp->Pt();
706 Printf("%s:%d Jets Not Sorted %s !! %d:%.3E %d:%.3E",(char*)__FILE__,__LINE__,fBranchRec.Data(),ir,tmpPt,ir-1,ptOld);
713 TIterator *recIter = aodRecJets->MakeIterator();
714 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
715 Float_t pt = tmpRec->Pt();
717 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
718 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
719 while(pt<ptCut&&tmpRec){
721 tmpRec = (AliAODJet*)(recIter->Next());
726 if(nRecOver<=0)break;
727 fh2NRecJetsPt->Fill(ptCut,nRecOver);
731 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
732 Float_t phi = leading->Phi();
733 if(phi<0)phi+=TMath::Pi()*2.;
734 Float_t eta = leading->Eta();
736 while((tmpRec = (AliAODJet*)(recIter->Next()))){
737 Float_t tmpPt = tmpRec->Pt();
738 fh1PtJetsRecIn->Fill(tmpPt);
740 fh1PtJetsLeadingRecIn->Fill(tmpPt);
744 Float_t tmpPhi = tmpRec->Phi();
746 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
747 Float_t dPhi = phi - tmpRec->Phi();
748 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
749 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
750 Float_t dEta = eta - tmpRec->Eta();
751 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
752 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
757 Int_t nTrackOver = recParticles.GetSize();
758 // do the same for tracks and jets
760 TIterator *recIter = recParticles.MakeIterator();
761 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
762 Float_t pt = tmpRec->Pt();
763 // Printf("Leading track p_t %3.3E",pt);
764 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
765 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
766 while(pt<ptCut&&tmpRec){
768 tmpRec = (AliVParticle*)(recIter->Next());
773 if(nTrackOver<=0)break;
774 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
778 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
779 Float_t phi = leading->Phi();
780 if(phi<0)phi+=TMath::Pi()*2.;
781 Float_t eta = leading->Eta();
783 while((tmpRec = (AliVParticle*)(recIter->Next()))){
784 Float_t tmpPt = tmpRec->Pt();
785 fh1PtTracksRecIn->Fill(tmpPt);
787 fh1PtTracksLeadingRecIn->Fill(tmpPt);
791 Float_t tmpPhi = tmpRec->Phi();
793 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
794 Float_t dPhi = phi - tmpRec->Phi();
795 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
796 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
797 Float_t dEta = eta - tmpRec->Eta();
798 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
799 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
804 if(genParticles.GetSize()){
805 TIterator *genIter = genParticles.MakeIterator();
806 AliVParticle *tmpGen = 0;
807 while((tmpGen = (AliVParticle*)(genIter->Next()))){
808 if(TMath::Abs(tmpGen->Eta())<0.9){
809 Float_t tmpPt = tmpGen->Pt();
810 fh1PtTracksGenIn->Fill(tmpPt);
816 nRecJets = TMath::Min(nRecJets,kMaxJets);
819 for(int ir = 0;ir < nRecJets;++ir){
820 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
822 if(tmp->Pt()<fMinJetPt)continue;
826 nRecJets = iCountRec;
829 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
831 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
832 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
835 for(int i = 0;i<kMaxJets;++i){
836 iGenIndex[i] = iRecIndex[i] = -1;
839 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
840 iGenIndex,iRecIndex,fDebug);
841 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
844 for(int i = 0;i<kMaxJets;++i){
845 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
846 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
853 Double_t container[6];
854 Double_t containerPhiZ[6];
856 // loop over generated jets
858 // radius; tmp, get from the jet header itself
859 // at some point, how todeal woht FastJet on MC?
860 Float_t radiusGen =0.4;
861 Float_t radiusRec =0.4;
863 for(int ig = 0;ig < nGenJets;++ig){
864 Double_t ptGen = genJets[ig].Pt();
865 Double_t phiGen = genJets[ig].Phi();
866 if(phiGen<0)phiGen+=TMath::Pi()*2.;
867 Double_t etaGen = genJets[ig].Eta();
869 container[3] = ptGen;
870 container[4] = etaGen;
871 container[5] = phiGen;
872 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
873 Int_t ir = iRecIndex[ig];
875 if(TMath::Abs(etaGen)<fRecEtaWindow){
878 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
879 fh1PtGenIn[ig]->Fill(ptGen,eventW);
880 // fill the fragmentation function
881 for(int it = 0;it<genParticles.GetEntries();++it){
882 AliVParticle *part = (AliVParticle*)genParticles.At(it);
883 Float_t deltaR = genJets[ig].DeltaR(part);
884 fh1TmpRho->Fill(deltaR,part->Pt()/ptGen);
885 if(deltaR<radiusGen){
886 Float_t z = part->Pt()/ptGen;
887 Float_t lnz = -1.*TMath::Log(z);
888 fh2FragGen[ig]->Fill(z,ptGen,eventW);
889 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
894 for(int ibx = 1;ibx<fh2RhoPtGen[ir]->GetNbinsX();ibx++){
895 Float_t r = fh2RhoPtGen[ir]->GetXaxis()->GetBinCenter(ibx);
896 Float_t rho = fh1TmpRho->GetBinContent(ibx);
898 fh2RhoPtGen[ig]->Fill(r,ptGen,rho);
899 fh2PsiPtGen[ig]->Fill(r,ptGen,rhoSum);
902 if(ir>=0&&ir<nRecJets){
903 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
904 Double_t etaRec = recJets[ir].Eta();
905 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
907 }// loop over generated jets
910 for(int it = 0;it<recParticles.GetEntries();++it){
911 AliVParticle *part = (AliVParticle*)recParticles.At(it);
912 // fill sum pt and P_t of all paritles
913 if(TMath::Abs(part->Eta())<0.9){
914 Float_t pt = part->Pt();
915 fh1PtTrackRec->Fill(pt,eventW);
916 fh2TrackPtTrackPhi->Fill(pt,part->Phi());
920 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
921 fh1SumPtTrackRec->Fill(sumPt,eventW);
924 // loop over reconstructed jets
925 for(int ir = 0;ir < nRecJets;++ir){
926 Double_t etaRec = recJets[ir].Eta();
927 Double_t ptRec = recJets[ir].Pt();
928 Double_t phiRec = recJets[ir].Phi();
929 if(phiRec<0)phiRec+=TMath::Pi()*2.;
932 // do something with dijets...
934 Double_t etaRec1 = recJets[0].Eta();
935 Double_t ptRec1 = recJets[0].Pt();
936 Double_t phiRec1 = recJets[0].Phi();
937 if(phiRec1<0)phiRec1+=TMath::Pi()*2.;
940 if(TMath::Abs(etaRec1)<fRecEtaWindow
941 &&TMath::Abs(etaRec)<fRecEtaWindow){
943 Float_t deltaPhi = phiRec1 - phiRec;
945 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
946 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
947 deltaPhi = TMath::Abs(deltaPhi);
948 fh2DijetDeltaPhiPt->Fill(deltaPhi,ptRec1);
949 Float_t asym = (ptRec1-ptRec)/(ptRec1+ptRec);
950 fh2DijetAsymPt->Fill(asym,ptRec1);
951 fh2DijetDeltaPhiDeltaEta->Fill(deltaPhi,etaRec1-etaRec);
952 fh2DijetPt2vsPt1->Fill(ptRec1,ptRec);
953 fh2DijetDifvsSum->Fill(ptRec1+ptRec,ptRec1-ptRec);
954 Float_t minv = 2.*(recJets[0].P()*recJets[1].P()-
955 recJets[0].Px()*recJets[1].Px()-
956 recJets[0].Py()*recJets[1].Py()-
957 recJets[0].Pz()*recJets[1].Py());
958 minv = TMath::Sqrt(minv);
961 fh1DijetMinv->Fill(minv);
962 if((TMath::Pi()-deltaPhi)<fDeltaPhiWindow){
963 fh1DijetMinvCut->Fill(minv);
964 fh2DijetAsymPtCut->Fill(asym,ptRec1);
970 container[0] = ptRec;
971 container[1] = etaRec;
972 container[2] = phiRec;
973 containerPhiZ[0] = ptRec;
974 containerPhiZ[1] = phiRec;
975 if(ptRec>30.&&fDebug>0){
976 // need to cast to int, otherwise the printf overwrites
977 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
978 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(int)fInputHandler->GetTree()->GetTree()->GetReadEntry());
979 if(fESD)Printf("ESDEvent GetEventNumberInFile(): %d",fESD->GetEventNumberInFile());
980 // aodH->SetFillAOD(kTRUE);
981 fAOD->GetHeader()->Print();
982 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
983 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
984 AliAODTrack *tr = fAOD->GetTrack(it);
985 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
989 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
997 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
998 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1000 Float_t zLeading = -1;
1001 if(TMath::Abs(etaRec)<fRecEtaWindow){
1002 fh2JetPtJetPhi->Fill(ptRec,phiRec);
1003 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
1004 fh1PtRecIn[ir]->Fill(ptRec,eventW);
1005 // fill the fragmentation function
1009 for(int it = 0;it<recParticles.GetEntries();++it){
1010 AliVParticle *part = (AliVParticle*)recParticles.At(it);
1011 Float_t eta = part->Eta();
1012 if(TMath::Abs(eta)<0.9){
1013 Float_t phi = part->Phi();
1014 if(phi<0)phi+=TMath::Pi()*2.;
1015 Float_t dPhi = phi - phiRec;
1016 Float_t dEta = eta - etaRec;
1017 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1018 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1019 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
1020 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
1023 Float_t deltaR = recJets[ir].DeltaR(part);
1024 fh1TmpRho->Fill(deltaR,part->Pt()/ptRec);
1027 if(deltaR<radiusRec){
1028 Float_t z = part->Pt()/ptRec;
1029 if(z>zLeading)zLeading=z;
1030 Float_t lnz = -1.*TMath::Log(z);
1031 fh2FragRec[ir]->Fill(z,ptRec,eventW);
1032 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
1035 // fill the jet shapes
1037 for(int ibx = 1;ibx<fh2RhoPtRec[ir]->GetNbinsX();ibx++){
1038 Float_t r = fh2RhoPtRec[ir]->GetXaxis()->GetBinCenter(ibx);
1039 Float_t rho = fh1TmpRho->GetBinContent(ibx);
1041 fh2RhoPtRec[ir]->Fill(r,ptRec,rho);
1042 fh2PsiPtRec[ir]->Fill(r,ptRec,rhoSum);
1047 containerPhiZ[2] = zLeading;
1050 Int_t ig = iGenIndex[ir];
1051 if(ig>=0 && ig<nGenJets){
1052 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
1053 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1054 Double_t ptGen = genJets[ig].Pt();
1055 Double_t phiGen = genJets[ig].Phi();
1056 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1057 Double_t etaGen = genJets[ig].Eta();
1059 container[3] = ptGen;
1060 container[4] = etaGen;
1061 container[5] = phiGen;
1062 containerPhiZ[3] = ptGen;
1064 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
1067 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
1068 if(TMath::Abs(etaRec)<fRecEtaWindow){
1069 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
1070 fhnCorrelation->Fill(container);
1071 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1073 }// if etarec in window
1077 containerPhiZ[3] = 0;
1078 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1080 }// loop over reconstructed jets
1083 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1084 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1085 PostData(1, fHistList);
1089 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
1091 // Create the particle container for the correction framework manager and
1094 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
1095 const Double_t kPtmin = 0.0, kPtmax = 320.; // we do not want to have empty bins at the beginning...
1096 const Double_t kEtamin = -3.0, kEtamax = 3.0;
1097 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
1098 const Double_t kZmin = 0., kZmax = 1;
1100 // can we neglect migration in eta and phi?
1101 // phi should be no problem since we cover full phi and are phi symmetric
1102 // eta migration is more difficult due to needed acceptance correction
1103 // in limited eta range
1105 //arrays for the number of bins in each dimension
1107 iBin[0] = 320; //bins in pt
1108 iBin[1] = 1; //bins in eta
1109 iBin[2] = 1; // bins in phi
1111 //arrays for lower bounds :
1112 Double_t* binEdges[kNvar];
1113 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1114 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1116 //values for bin lower bounds
1117 // 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);
1118 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1119 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1120 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1123 for(int i = 0;i < kMaxStep*2;++i){
1124 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d",i),kNvar,iBin);
1125 for (int k=0; k<kNvar; k++) {
1126 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1129 //create correlation matrix for unfolding
1130 Int_t thnDim[2*kNvar];
1131 for (int k=0; k<kNvar; k++) {
1132 //first half : reconstructed
1134 thnDim[k] = iBin[k];
1135 thnDim[k+kNvar] = iBin[k];
1138 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1139 for (int k=0; k<kNvar; k++) {
1140 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1141 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1143 fhnCorrelation->Sumw2();
1145 // for second correlation histogram
1148 const Int_t kNvarPhiZ = 4;
1149 //arrays for the number of bins in each dimension
1150 Int_t iBinPhiZ[kNvarPhiZ];
1151 iBinPhiZ[0] = 80; //bins in pt
1152 iBinPhiZ[1] = 72; //bins in phi
1153 iBinPhiZ[2] = 20; // bins in Z
1154 iBinPhiZ[3] = 80; //bins in ptgen
1156 //arrays for lower bounds :
1157 Double_t* binEdgesPhiZ[kNvarPhiZ];
1158 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1159 binEdgesPhiZ[ivar] = new Double_t[iBinPhiZ[ivar] + 1];
1161 for(Int_t i=0; i<=iBinPhiZ[0]; i++) binEdgesPhiZ[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[0]*(Double_t)i;
1162 for(Int_t i=0; i<=iBinPhiZ[1]; i++) binEdgesPhiZ[1][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBinPhiZ[1]*(Double_t)i;
1163 for(Int_t i=0; i<=iBinPhiZ[2]; i++) binEdgesPhiZ[2][i]=(Double_t)kZmin + (kZmax-kZmin)/iBinPhiZ[2]*(Double_t)i;
1164 for(Int_t i=0; i<=iBinPhiZ[3]; i++) binEdgesPhiZ[3][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[3]*(Double_t)i;
1166 fhnCorrelationPhiZRec = new THnSparseF("fhnCorrelationPhiZRec","THnSparse with correlations",kNvarPhiZ,iBinPhiZ);
1167 for (int k=0; k<kNvarPhiZ; k++) {
1168 fhnCorrelationPhiZRec->SetBinEdges(k,binEdgesPhiZ[k]);
1170 fhnCorrelationPhiZRec->Sumw2();
1173 // Add a histogram for Fake jets
1175 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1176 delete [] binEdges[ivar];
1178 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1179 delete [] binEdgesPhiZ[ivar];
1183 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1185 // Terminate analysis
1187 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1191 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1193 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1196 if(type==kTrackAOD){
1197 AliAODEvent *aod = 0;
1198 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1199 else aod = AODEvent();
1203 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1204 AliAODTrack *tr = aod->GetTrack(it);
1205 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1206 if(TMath::Abs(tr->Eta())>0.9)continue;
1209 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1210 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(Int_t)fInputHandler->GetTree()->GetReadEntry());
1213 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1215 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1225 else if (type == kTrackKineAll||type == kTrackKineCharged){
1226 AliMCEvent* mcEvent = MCEvent();
1227 if(!mcEvent)return iCount;
1228 // we want to have alivpartilces so use get track
1229 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1230 if(!mcEvent->IsPhysicalPrimary(it))continue;
1231 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1232 if(type == kTrackKineAll){
1236 else if(type == kTrackKineCharged){
1237 if(part->Particle()->GetPDG()->Charge()==0)continue;
1243 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1244 AliAODEvent *aod = 0;
1245 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1246 else aod = AODEvent();
1247 if(!aod)return iCount;
1248 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1249 if(!tca)return iCount;
1250 for(int it = 0;it < tca->GetEntriesFast();++it){
1251 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1252 if(!part->IsPhysicalPrimary())continue;
1253 if(type == kTrackAODMCAll){
1257 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1258 if(part->Charge()==0)continue;
1259 if(kTrackAODMCCharged){
1263 if(TMath::Abs(part->Eta())>0.9)continue;