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 "AliAODJetEventBackground.h"
52 #include "AliAODMCParticle.h"
53 #include "AliMCEventHandler.h"
54 #include "AliMCEvent.h"
56 #include "AliGenPythiaEventHeader.h"
57 #include "AliJetKineReaderHeader.h"
58 #include "AliGenCocktailEventHeader.h"
59 #include "AliInputEventHandler.h"
62 #include "AliAnalysisHelperJetTasks.h"
64 ClassImp(AliAnalysisTaskJetSpectrum2)
66 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(): AliAnalysisTaskSE(),
71 fhnCorrelationPhiZRec(0x0),
76 fUseAODJetInput(kFALSE),
77 fUseAODTrackInput(kFALSE),
78 fUseAODMCInput(kFALSE),
79 fUseGlobalSelection(kFALSE),
80 fUseExternalWeightOnly(kFALSE),
81 fLimitGenJetEta(kFALSE),
82 fBkgSubtraction(kFALSE),
84 fEventSelectionMask(0),
86 fTrackTypeRec(kTrackUndef),
87 fTrackTypeGen(kTrackUndef),
92 fDeltaPhiWindow(20./180.*TMath::Pi()),
101 fh1SumPtTrackRec(0x0),
102 fh1SumPtTrackAreaRec(0x0),
105 fh1PtJetsLeadingRecIn(0x0),
106 fh1PtTracksRecIn(0x0),
107 fh1PtTracksLeadingRecIn(0x0),
108 fh1PtTracksGenIn(0x0),
110 fh2NRecTracksPt(0x0),
111 fh2JetsLeadingPhiEta(0x0),
112 fh2JetsLeadingPhiPt(0x0),
113 fh2TracksLeadingPhiEta(0x0),
114 fh2TracksLeadingPhiPt(0x0),
115 fh2TracksLeadingJetPhiPt(0x0),
117 fh2TrackPtTrackPhi(0x0),
119 fh2DijetDeltaPhiPt(0x0),
121 fh2DijetAsymPtCut(0x0),
122 fh2DijetDeltaPhiDeltaEta(0x0),
123 fh2DijetPt2vsPt1(0x0),
124 fh2DijetDifvsSum(0x0),
126 fh1DijetMinvCut(0x0),
136 fh1Ptjethardest(0x0),
137 fh1Ptjetsubhardest1(0x0),
138 fh1Ptjetsubhardest2(0x0),
139 fh1Rhovspthardest1(0x0),
140 fh1Rhovspthardest2(0x0),
141 fh1Errorvspthardest1(0x0),
142 fh1Errorvspthardest2(0x0),
145 for(int i = 0;i < kMaxStep*2;++i){
146 fhnJetContainer[i] = 0;
148 for(int i = 0;i < kMaxJets;++i){
149 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
165 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
166 AliAnalysisTaskSE(name),
171 fhnCorrelationPhiZRec(0x0),
176 fUseAODJetInput(kFALSE),
177 fUseAODTrackInput(kFALSE),
178 fUseAODMCInput(kFALSE),
179 fUseGlobalSelection(kFALSE),
180 fUseExternalWeightOnly(kFALSE),
181 fLimitGenJetEta(kFALSE),
182 fBkgSubtraction(kFALSE),
184 fEventSelectionMask(0),
186 fTrackTypeRec(kTrackUndef),
187 fTrackTypeGen(kTrackUndef),
192 fDeltaPhiWindow(20./180.*TMath::Pi()),
197 fh1PtHardTrials(0x0),
201 fh1SumPtTrackRec(0x0),
202 fh1SumPtTrackAreaRec(0x0),
205 fh1PtJetsLeadingRecIn(0x0),
206 fh1PtTracksRecIn(0x0),
207 fh1PtTracksLeadingRecIn(0x0),
208 fh1PtTracksGenIn(0x0),
210 fh2NRecTracksPt(0x0),
211 fh2JetsLeadingPhiEta(0x0),
212 fh2JetsLeadingPhiPt(0x0),
213 fh2TracksLeadingPhiEta(0x0),
214 fh2TracksLeadingPhiPt(0x0),
215 fh2TracksLeadingJetPhiPt(0x0),
217 fh2TrackPtTrackPhi(0x0),
219 fh2DijetDeltaPhiPt(0x0),
221 fh2DijetAsymPtCut(0x0),
222 fh2DijetDeltaPhiDeltaEta(0x0),
223 fh2DijetPt2vsPt1(0x0),
224 fh2DijetDifvsSum(0x0),
226 fh1DijetMinvCut(0x0),
236 fh1Ptjethardest(0x0),
237 fh1Ptjetsubhardest1(0x0),
238 fh1Ptjetsubhardest2(0x0),
239 fh1Rhovspthardest1(0x0),
240 fh1Rhovspthardest2(0x0),
241 fh1Errorvspthardest1(0x0),
242 fh1Errorvspthardest2(0x0),
246 for(int i = 0;i < kMaxStep*2;++i){
247 fhnJetContainer[i] = 0;
249 for(int i = 0;i < kMaxJets;++i){
250 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
263 DefineOutput(1, TList::Class());
268 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
271 // Implemented Notify() to read the cross sections
272 // and number of trials from pyxsec.root
275 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
276 Float_t xsection = 0;
281 TFile *curfile = tree->GetCurrentFile();
283 Error("Notify","No current file");
286 if(!fh1Xsec||!fh1Trials){
287 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
290 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
291 fh1Xsec->Fill("<#sigma>",xsection);
292 // construct a poor man average trials
293 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
294 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
299 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
303 // Create the output container
313 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
316 if(!fHistList)fHistList = new TList();
317 fHistList->SetOwner(kTRUE);
318 Bool_t oldStatus = TH1::AddDirectoryStatus();
319 TH1::AddDirectory(kFALSE);
324 const Int_t nBinPt = 320;
325 Double_t binLimitsPt[nBinPt+1];
326 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
328 binLimitsPt[iPt] = 0.0;
331 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
335 const Int_t nBinPhi = 90;
336 Double_t binLimitsPhi[nBinPhi+1];
337 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
339 binLimitsPhi[iPhi] = -1.*TMath::Pi();
342 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
347 const Int_t nBinPhi2 = 360;
348 Double_t binLimitsPhi2[nBinPhi2+1];
349 for(Int_t iPhi2 = 0;iPhi2<=nBinPhi2;iPhi2++){
351 binLimitsPhi2[iPhi2] = 0.;
354 binLimitsPhi2[iPhi2] = binLimitsPhi2[iPhi2-1] + 1/(Float_t)nBinPhi2 * TMath::Pi()*2;
360 const Int_t nBinEta = 40;
361 Double_t binLimitsEta[nBinEta+1];
362 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
364 binLimitsEta[iEta] = -2.0;
367 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
371 const Int_t nBinFrag = 25;
374 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
375 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
377 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
378 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
380 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
381 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
382 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
384 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
385 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
387 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
388 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
389 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);
391 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
392 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
393 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
394 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
395 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
397 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
398 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
401 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
402 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
403 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
404 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
405 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
406 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
407 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
408 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
410 fh2JetPtJetPhi = new TH2F("fh2JetPtJetPhi","Reconstructed jet phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
411 fh2TrackPtTrackPhi = new TH2F("fh2TrackPtTrackPhi","Reconstructed track phi vs. pt",nBinPt,binLimitsPt,nBinPhi2,binLimitsPhi2);
413 fh2RelPtFGen = new TH2F("fh2RelPtFGen",";p_{T,gen};#Delta p_{T}/p_{T,Gen}",nBinPt,binLimitsPt,120,-1.2,1.2);
415 for(int ij = 0;ij < kMaxJets;++ij){
416 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
417 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
419 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
420 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
422 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
423 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
425 fh2RhoPtRec[ij] = new TH2F(Form("fh2RhoPtRec_j%d",ij),"jet shape rho for jets;r;p_{T,rec};",
426 40,0.,1.,nBinPt,binLimitsPt);
427 fh2PsiPtRec[ij] = new TH2F(Form("fh2PsiPtRec_j%d",ij),"jet shape psi for jets;r;p_{T,rec};",
428 40,0.,2.,nBinPt,binLimitsPt);
430 fh2RhoPtGen[ij] = new TH2F(Form("fh2RhoPtGen_j%d",ij),"jet shape rho for jets;r;p_{T,gen};",
431 40,0.,2.,nBinPt,binLimitsPt);
432 fh2PsiPtGen[ij] = new TH2F(Form("fh2PsiPtGen_j%d",ij),"jet shape psi for jets;r;p_{T,gen};",
433 40,0.,2.,nBinPt,binLimitsPt);
434 if(!fh1TmpRho)fh1TmpRho = new TH1F("fh1TmpRho","tmp histo for jet shape",40,0.,2);
437 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",
438 nBinFrag,0.,1.,nBinPt,binLimitsPt);
439 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",
440 nBinFrag,0.,10.,nBinPt,binLimitsPt);
442 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",
443 nBinFrag,0.,1.,nBinPt,binLimitsPt);
444 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",
445 nBinFrag,0.,10.,nBinPt,binLimitsPt);
450 fh2DijetDeltaPhiPt = new TH2F("fh2DijetDeltaPhiPt","Difference in the azimuthal angle;#Delta#phi;p_{T,1};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
451 fh2DijetAsymPt = new TH2F("fh2DijetAsym","Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
452 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);
453 fh2DijetDeltaPhiDeltaEta = new TH2F("fh2DijetDeltaPhiDeltaEta","Difference in the azimuthal angle;#Delta#phi;Entries",180,0.,TMath::Pi(),20,-2.,2.);
454 fh2DijetPt2vsPt1 = new TH2F("fh2DijetPt2vsPt1","Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
455 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.);
456 fh1DijetMinv = new TH1F("fh1DijetMinv","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
457 fh1DijetMinvCut = new TH1F("fh1DijetMinvCut","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
458 //background histograms
460 fh1Bkg1 = new TH1F("fh1Bkg1","Background estimate 1",100,0.,10.);
461 fh1Bkg2 = new TH1F("fh1Bkg2","Background estimate 2",100,0.,10.);
462 fh1Sigma1 = new TH1F("fh1Sigma1","Background fluctuations 1",100,0.,10.);
463 fh1Sigma2 = new TH1F("fh1Sigma2","Background fluctuations 2",100,0.,10.);
464 fh1Area1 = new TH1F("fh1Area1","Background mean area 1",50,0.,5.);
465 fh1Area2 = new TH1F("fh1Area2","Background mean area 2",50,0.,5.);
467 fh1Ptjet = new TH1F("fh1Ptjet","Jet spectrum",100,0.,200.);
468 fh1Ptjetsub1 = new TH1F("fh1Ptjetsub1","Subtracted spectrum 1",50,0.,200.);
469 fh1Ptjetsub2 = new TH1F("fh1Ptjetsub2","Subtracted spectrum 2",50,0.,200.);
470 fh1Ptjethardest = new TH1F("fh1Ptjethardest","Hardest jet spectrum",50,0.,200.);
471 fh1Ptjetsubhardest1 = new TH1F("fh1Pthardestsub1","Subtracted hardest jet spectrum 1",100,0.,200.);
472 fh1Ptjetsubhardest2 = new TH1F("fh1Pthardestsub2","Subtracted hardest jet spectrum 2",100,0.,200.);
473 fh1Rhovspthardest1 = new TH2F("fh1Rhovspthardest1","Background vs pTjet 1",100,0.,200.,50,0.,5.);
474 fh1Rhovspthardest2 = new TH2F("fh1Rhovspthardest2","Background vs pTjet 2",100,0.,200.,50,0.,5.);
475 fh1Errorvspthardest1 = new TH2F("fhErorvspthardest1","Relative error 1",100,0.,200.,50,0.,5.);
476 fh1Errorvspthardest2 = new TH2F("fh1Errorvspthardest2","Relative error 2",100,0.,200.,50,0.,5.);
482 const Int_t saveLevel = 3; // large save level more histos
484 fHistList->Add(fh1Xsec);
485 fHistList->Add(fh1Trials);
486 fHistList->Add(fh1PtHard);
487 fHistList->Add(fh1PtHardNoW);
488 fHistList->Add(fh1PtHardTrials);
489 if(fBranchGen.Length()>0){
490 fHistList->Add(fh1NGenJets);
491 fHistList->Add(fh1PtTracksGenIn);
493 fHistList->Add(fh1PtJetsRecIn);
494 fHistList->Add(fh1PtJetsLeadingRecIn);
495 fHistList->Add(fh1PtTracksRecIn);
496 fHistList->Add(fh1PtTracksLeadingRecIn);
497 fHistList->Add(fh1NRecJets);
498 fHistList->Add(fh1PtTrackRec);
499 fHistList->Add(fh1SumPtTrackRec);
500 fHistList->Add(fh1SumPtTrackAreaRec);
501 fHistList->Add(fh2NRecJetsPt);
502 fHistList->Add(fh2NRecTracksPt);
503 fHistList->Add(fh2JetsLeadingPhiEta );
504 fHistList->Add(fh2JetsLeadingPhiPt );
505 fHistList->Add(fh2TracksLeadingPhiEta);
506 fHistList->Add(fh2TracksLeadingPhiPt);
507 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
508 for(int ij = 0;ij<kMaxJets;++ij){
509 fHistList->Add( fh1PtRecIn[ij]);
511 if(fBranchGen.Length()>0){
512 fHistList->Add(fh1PtGenIn[ij]);
513 fHistList->Add(fh2FragGen[ij]);
514 fHistList->Add(fh2FragLnGen[ij]);
515 fHistList->Add(fh2RhoPtGen[ij]);
516 fHistList->Add(fh2PsiPtGen[ij]);
518 fHistList->Add( fh2PhiPt[ij]);
519 fHistList->Add( fh2PhiEta[ij]);
520 fHistList->Add( fh2RhoPtRec[ij]);
521 fHistList->Add( fh2PsiPtRec[ij]);
522 fHistList->Add( fh2FragRec[ij]);
523 fHistList->Add( fh2FragLnRec[ij]);
525 fHistList->Add(fhnCorrelation);
526 fHistList->Add(fhnCorrelationPhiZRec);
527 fHistList->Add(fh2JetPtJetPhi);
528 fHistList->Add(fh2TrackPtTrackPhi);
529 fHistList->Add(fh2RelPtFGen);
531 fHistList->Add(fh2DijetDeltaPhiPt);
532 fHistList->Add(fh2DijetAsymPt);
533 fHistList->Add(fh2DijetAsymPtCut);
534 fHistList->Add(fh2DijetDeltaPhiDeltaEta);
535 fHistList->Add(fh2DijetPt2vsPt1);
536 fHistList->Add(fh2DijetDifvsSum);
537 fHistList->Add(fh1DijetMinv);
538 fHistList->Add(fh1DijetMinvCut);
540 fHistList->Add(fh1Bkg1);
541 fHistList->Add(fh1Bkg2);
542 fHistList->Add(fh1Sigma1);
543 fHistList->Add(fh1Sigma2);
544 fHistList->Add(fh1Area1);
545 fHistList->Add(fh1Area2);
546 fHistList->Add(fh1Ptjet);
547 fHistList->Add(fh1Ptjethardest);
548 fHistList->Add(fh1Ptjetsub1);
549 fHistList->Add(fh1Ptjetsub2);
551 fHistList->Add(fh1Ptjetsubhardest1);
552 fHistList->Add(fh1Ptjetsubhardest2);
553 fHistList->Add(fh1Rhovspthardest1);
554 fHistList->Add(fh1Rhovspthardest2);
556 fHistList->Add(fh1Errorvspthardest1);
557 fHistList->Add(fh1Errorvspthardest2);
561 // =========== Switch on Sumw2 for all histos ===========
562 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
563 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
568 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
571 TH1::AddDirectory(oldStatus);
574 void AliAnalysisTaskJetSpectrum2::Init()
580 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
584 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
587 Bool_t selected = kTRUE;
589 if(fUseGlobalSelection&&fEventSelectionMask==0){
590 selected = AliAnalysisHelperJetTasks::Selected();
592 else if(fUseGlobalSelection&&fEventSelectionMask>0){
593 selected = AliAnalysisHelperJetTasks::TestSelectInfo(fEventSelectionMask);
597 // no selection by the service task, we continue
598 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
599 PostData(1, fHistList);
605 // Execute analysis for current event
607 AliESDEvent *fESD = 0;
609 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
611 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
617 // assume that the AOD is in the general output...
620 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
623 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
629 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
632 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
635 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
639 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
640 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
642 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
647 AliAODJetEventBackground* evBkg=(AliAODJetEventBackground*)fAOD->FindListObject(fBranchBkg.Data());
651 Printf("%s:%d no reconstructed background array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchBkg.Data());
656 ///just to start: some very simple plots containing rho, sigma and area of the background.
658 Int_t nJets = aodRecJets->GetEntriesFast();
663 Float_t bkg1=evBkg->GetBackground(0);
664 Float_t bkg2=evBkg->GetBackground(1);
665 Float_t sigma1=evBkg->GetSigma(0);
666 Float_t sigma2=evBkg->GetSigma(1);
667 Float_t area1=evBkg->GetMeanarea(0);
668 Float_t area2=evBkg->GetMeanarea(1);
669 fh1Bkg1->Fill(bkg1); //rho computed with all background jets.
670 fh1Bkg2->Fill(bkg2); //rho computed with all background jets but the hardest.
671 fh1Sigma1->Fill(sigma1);
672 fh1Sigma2->Fill(sigma2);
673 fh1Area1->Fill(area1);
674 fh1Area2->Fill(area2);
678 for(Int_t k=0;k<nJets;k++){
679 AliAODJet *jet = dynamic_cast<AliAODJet*>(aodRecJets->At(k));
680 fh1Ptjet->Fill(jet->Pt());
681 Float_t ptsub1=jet->Pt()-bkg1*jet->EffectiveAreaCharged();
682 Float_t ptsub2=jet->Pt()-bkg2*jet->EffectiveAreaCharged();
683 Float_t err1=sigma1*sqrt(area1);
684 Float_t err2=sigma2*sqrt(area2);
686 fh1Ptjetsub1->Fill(ptsub1);
687 fh1Ptjetsub2->Fill(ptsub2);
691 fh1Ptjethardest->Fill(pthardest);
692 fh1Ptjetsubhardest1->Fill(ptsub1);
693 fh1Ptjetsubhardest2->Fill(ptsub2);
694 fh1Errorvspthardest1->Fill(ptsub1,err1/ptsub1);
695 fh1Errorvspthardest2->Fill(ptsub2,err2/ptsub2);
698 fh1Rhovspthardest1->Fill(pthardest,bkg1);
699 fh1Rhovspthardest2->Fill(pthardest,bkg2);
701 }// background subtraction
704 // ==== General variables needed
707 // We use statice array, not to fragment the memory
708 AliAODJet genJets[kMaxJets];
710 AliAODJet recJets[kMaxJets];
712 ///////////////////////////
717 Double_t nTrials = 1; // Trials for MC trigger
719 if(fUseExternalWeightOnly){
720 eventW = fExternalWeight;
723 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
724 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
725 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
726 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
727 // this is the part we only use when we have MC information
728 AliMCEvent* mcEvent = MCEvent();
729 // AliStack *pStack = 0;
731 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
734 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
737 nTrials = pythiaGenHeader->Trials();
738 ptHard = pythiaGenHeader->GetPtHard();
739 int iProcessType = pythiaGenHeader->ProcessType();
741 // 12 f+barf -> f+barf
746 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
747 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
749 // fetch the pythia generated jets only to be used here
750 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
751 AliAODJet pythiaGenJets[kMaxJets];
752 for(int ip = 0;ip < nPythiaGenJets;++ip){
753 if(iCount>=kMaxJets)continue;
755 pythiaGenHeader->TriggerJet(ip,p);
756 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
758 if(fBranchGen.Length()==0){
761 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
762 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
765 if(fMinJetPt>0&&pythiaGenJets[iCount].Pt()<fMinJetPt)continue;
766 // if we have MC particles and we do not read from the aod branch
767 // use the pythia jets
768 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
773 if(fBranchGen.Length()==0)nGenJets = iCount;
774 }// (fAnalysisType&kMCESD)==kMCESD)
777 // we simply fetch the tracks/mc particles as a list of AliVParticles
785 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
786 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
787 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
788 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
791 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
792 fh1PtHard->Fill(ptHard,eventW);
793 fh1PtHardNoW->Fill(ptHard,1);
794 fh1PtHardTrials->Fill(ptHard,nTrials);
796 // If we set a second branch for the input jets fetch this
797 if(fBranchGen.Length()>0){
798 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
801 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
802 if(iCount>=kMaxJets)continue;
803 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
807 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
808 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
811 if(fMinJetPt>0&&tmp->Pt()<fMinJetPt)continue;
812 genJets[iCount] = *tmp;
818 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
819 if(fDebug>2)fAOD->Print();
823 fh1NGenJets->Fill(nGenJets);
824 // We do not want to exceed the maximum jet number
825 nGenJets = TMath::Min(nGenJets,kMaxJets);
827 // Fetch the reconstructed jets...
829 nRecJets = aodRecJets->GetEntries();
831 nRecJets = aodRecJets->GetEntries();
832 fh1NRecJets->Fill(nRecJets);
834 // Do something with the all rec jets
835 Int_t nRecOver = nRecJets;
837 // check that the jets are sorted
838 Float_t ptOld = 999999;
839 for(int ir = 0;ir < nRecJets;ir++){
840 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
841 Float_t tmpPt = tmp->Pt();
843 Printf("%s:%d Jets Not Sorted %s !! %d:%.3E %d:%.3E",(char*)__FILE__,__LINE__,fBranchRec.Data(),ir,tmpPt,ir-1,ptOld);
850 TIterator *recIter = aodRecJets->MakeIterator();
851 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
852 Float_t pt = tmpRec->Pt();
854 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
855 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
856 while(pt<ptCut&&tmpRec){
858 tmpRec = (AliAODJet*)(recIter->Next());
863 if(nRecOver<=0)break;
864 fh2NRecJetsPt->Fill(ptCut,nRecOver);
868 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
869 Float_t phi = leading->Phi();
870 if(phi<0)phi+=TMath::Pi()*2.;
871 Float_t eta = leading->Eta();
873 while((tmpRec = (AliAODJet*)(recIter->Next()))){
874 Float_t tmpPt = tmpRec->Pt();
875 fh1PtJetsRecIn->Fill(tmpPt);
877 fh1PtJetsLeadingRecIn->Fill(tmpPt);
881 Float_t tmpPhi = tmpRec->Phi();
883 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
884 Float_t dPhi = phi - tmpRec->Phi();
885 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
886 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
887 Float_t dEta = eta - tmpRec->Eta();
888 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
889 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
894 Int_t nTrackOver = recParticles.GetSize();
895 // do the same for tracks and jets
897 TIterator *recIter = recParticles.MakeIterator();
898 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
899 Float_t pt = tmpRec->Pt();
900 // Printf("Leading track p_t %3.3E",pt);
901 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
902 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
903 while(pt<ptCut&&tmpRec){
905 tmpRec = (AliVParticle*)(recIter->Next());
910 if(nTrackOver<=0)break;
911 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
915 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
916 Float_t phi = leading->Phi();
917 if(phi<0)phi+=TMath::Pi()*2.;
918 Float_t eta = leading->Eta();
920 while((tmpRec = (AliVParticle*)(recIter->Next()))){
921 Float_t tmpPt = tmpRec->Pt();
922 fh1PtTracksRecIn->Fill(tmpPt);
924 fh1PtTracksLeadingRecIn->Fill(tmpPt);
928 Float_t tmpPhi = tmpRec->Phi();
930 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
931 Float_t dPhi = phi - tmpRec->Phi();
932 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
933 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
934 Float_t dEta = eta - tmpRec->Eta();
935 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
936 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
941 if(genParticles.GetSize()){
942 TIterator *genIter = genParticles.MakeIterator();
943 AliVParticle *tmpGen = 0;
944 while((tmpGen = (AliVParticle*)(genIter->Next()))){
945 if(TMath::Abs(tmpGen->Eta())<0.9){
946 Float_t tmpPt = tmpGen->Pt();
947 fh1PtTracksGenIn->Fill(tmpPt);
953 nRecJets = TMath::Min(nRecJets,kMaxJets);
956 for(int ir = 0;ir < nRecJets;++ir){
957 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
959 if(tmp->Pt()<fMinJetPt)continue;
963 nRecJets = iCountRec;
966 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
968 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
969 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
972 for(int i = 0;i<kMaxJets;++i){
973 iGenIndex[i] = iRecIndex[i] = -1;
976 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
977 iGenIndex,iRecIndex,fDebug);
978 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
981 for(int i = 0;i<kMaxJets;++i){
982 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
983 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
990 Double_t container[6];
991 Double_t containerPhiZ[6];
993 // loop over generated jets
995 // radius; tmp, get from the jet header itself
996 // at some point, how todeal woht FastJet on MC?
997 Float_t radiusGen =0.4;
998 Float_t radiusRec =0.4;
1000 for(int ig = 0;ig < nGenJets;++ig){
1001 Double_t ptGen = genJets[ig].Pt();
1002 Double_t phiGen = genJets[ig].Phi();
1003 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1004 Double_t etaGen = genJets[ig].Eta();
1006 container[3] = ptGen;
1007 container[4] = etaGen;
1008 container[5] = phiGen;
1009 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
1010 Int_t ir = iRecIndex[ig];
1012 if(TMath::Abs(etaGen)<fRecEtaWindow){
1015 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
1016 fh1PtGenIn[ig]->Fill(ptGen,eventW);
1017 // fill the fragmentation function
1018 for(int it = 0;it<genParticles.GetEntries();++it){
1019 AliVParticle *part = (AliVParticle*)genParticles.At(it);
1020 Float_t deltaR = genJets[ig].DeltaR(part);
1021 fh1TmpRho->Fill(deltaR,part->Pt()/ptGen);
1022 if(deltaR<radiusGen){
1023 Float_t z = part->Pt()/ptGen;
1024 Float_t lnz = -1.*TMath::Log(z);
1025 fh2FragGen[ig]->Fill(z,ptGen,eventW);
1026 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
1031 for(int ibx = 1;ibx<=fh2RhoPtGen[ir]->GetNbinsX();ibx++){
1032 Float_t r = fh2RhoPtGen[ir]->GetXaxis()->GetBinCenter(ibx);
1033 Float_t rho = fh1TmpRho->GetBinContent(ibx);
1035 fh2RhoPtGen[ig]->Fill(r,ptGen,rho);
1036 fh2PsiPtGen[ig]->Fill(r,ptGen,rhoSum);
1039 if(ir>=0&&ir<nRecJets){
1040 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
1041 Double_t etaRec = recJets[ir].Eta();
1042 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
1044 }// loop over generated jets
1047 for(int it = 0;it<recParticles.GetEntries();++it){
1048 AliVParticle *part = (AliVParticle*)recParticles.At(it);
1049 // fill sum pt and P_t of all paritles
1050 if(TMath::Abs(part->Eta())<0.9){
1051 Float_t pt = part->Pt();
1052 fh1PtTrackRec->Fill(pt,eventW);
1053 fh2TrackPtTrackPhi->Fill(pt,part->Phi());
1057 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
1058 fh1SumPtTrackRec->Fill(sumPt,eventW);
1061 // loop over reconstructed jets
1062 for(int ir = 0;ir < nRecJets;++ir){
1063 Double_t etaRec = recJets[ir].Eta();
1064 Double_t ptRec = recJets[ir].Pt();
1065 Double_t phiRec = recJets[ir].Phi();
1066 if(phiRec<0)phiRec+=TMath::Pi()*2.;
1069 // do something with dijets...
1071 Double_t etaRec1 = recJets[0].Eta();
1072 Double_t ptRec1 = recJets[0].Pt();
1073 Double_t phiRec1 = recJets[0].Phi();
1074 if(phiRec1<0)phiRec1+=TMath::Pi()*2.;
1077 if(TMath::Abs(etaRec1)<fRecEtaWindow
1078 &&TMath::Abs(etaRec)<fRecEtaWindow){
1080 Float_t deltaPhi = phiRec1 - phiRec;
1082 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
1083 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
1084 deltaPhi = TMath::Abs(deltaPhi);
1085 fh2DijetDeltaPhiPt->Fill(deltaPhi,ptRec1);
1086 Float_t asym = (ptRec1-ptRec)/(ptRec1+ptRec);
1087 fh2DijetAsymPt->Fill(asym,ptRec1);
1088 fh2DijetDeltaPhiDeltaEta->Fill(deltaPhi,etaRec1-etaRec);
1089 fh2DijetPt2vsPt1->Fill(ptRec1,ptRec);
1090 fh2DijetDifvsSum->Fill(ptRec1+ptRec,ptRec1-ptRec);
1091 Float_t minv = 2.*(recJets[0].P()*recJets[1].P()-
1092 recJets[0].Px()*recJets[1].Px()-
1093 recJets[0].Py()*recJets[1].Py()-
1094 recJets[0].Pz()*recJets[1].Py());
1095 minv = TMath::Sqrt(minv);
1098 fh1DijetMinv->Fill(minv);
1099 if((TMath::Pi()-deltaPhi)<fDeltaPhiWindow){
1100 fh1DijetMinvCut->Fill(minv);
1101 fh2DijetAsymPtCut->Fill(asym,ptRec1);
1107 container[0] = ptRec;
1108 container[1] = etaRec;
1109 container[2] = phiRec;
1110 containerPhiZ[0] = ptRec;
1111 containerPhiZ[1] = phiRec;
1112 if(ptRec>30.&&fDebug>0){
1113 // need to cast to int, otherwise the printf overwrites
1114 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
1115 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(int)fInputHandler->GetTree()->GetTree()->GetReadEntry());
1116 if(fESD)Printf("ESDEvent GetEventNumberInFile(): %d",fESD->GetEventNumberInFile());
1117 // aodH->SetFillAOD(kTRUE);
1118 fAOD->GetHeader()->Print();
1119 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
1120 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
1121 AliAODTrack *tr = fAOD->GetTrack(it);
1122 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1126 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1134 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
1135 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1137 Float_t zLeading = -1;
1138 if(TMath::Abs(etaRec)<fRecEtaWindow){
1139 fh2JetPtJetPhi->Fill(ptRec,phiRec);
1140 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
1141 fh1PtRecIn[ir]->Fill(ptRec,eventW);
1142 // fill the fragmentation function
1146 for(int it = 0;it<recParticles.GetEntries();++it){
1147 AliVParticle *part = (AliVParticle*)recParticles.At(it);
1148 Float_t eta = part->Eta();
1149 if(TMath::Abs(eta)<0.9){
1150 Float_t phi = part->Phi();
1151 if(phi<0)phi+=TMath::Pi()*2.;
1152 Float_t dPhi = phi - phiRec;
1153 Float_t dEta = eta - etaRec;
1154 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1155 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1156 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
1157 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
1160 Float_t deltaR = recJets[ir].DeltaR(part);
1161 fh1TmpRho->Fill(deltaR,part->Pt()/ptRec);
1164 if(deltaR<radiusRec){
1165 Float_t z = part->Pt()/ptRec;
1166 if(z>zLeading)zLeading=z;
1167 Float_t lnz = -1.*TMath::Log(z);
1168 fh2FragRec[ir]->Fill(z,ptRec,eventW);
1169 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
1172 // fill the jet shapes
1174 for(int ibx = 1;ibx<=fh2RhoPtRec[ir]->GetNbinsX();ibx++){
1175 Float_t r = fh2RhoPtRec[ir]->GetXaxis()->GetBinCenter(ibx);
1176 Float_t rho = fh1TmpRho->GetBinContent(ibx);
1178 fh2RhoPtRec[ir]->Fill(r,ptRec,rho);
1179 fh2PsiPtRec[ir]->Fill(r,ptRec,rhoSum);
1184 containerPhiZ[2] = zLeading;
1187 Int_t ig = iGenIndex[ir];
1188 if(ig>=0 && ig<nGenJets){
1189 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
1190 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1191 Double_t ptGen = genJets[ig].Pt();
1192 Double_t phiGen = genJets[ig].Phi();
1193 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1194 Double_t etaGen = genJets[ig].Eta();
1196 container[3] = ptGen;
1197 container[4] = etaGen;
1198 container[5] = phiGen;
1199 containerPhiZ[3] = ptGen;
1201 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
1204 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
1205 if(TMath::Abs(etaRec)<fRecEtaWindow){
1206 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
1207 fhnCorrelation->Fill(container);
1209 Float_t delta = (ptRec-ptGen)/ptGen;
1210 fh2RelPtFGen->Fill(ptGen,delta,eventW);
1212 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1214 }// if etarec in window
1218 containerPhiZ[3] = 0;
1219 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1221 }// loop over reconstructed jets
1224 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1225 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1226 PostData(1, fHistList);
1230 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
1232 // Create the particle container for the correction framework manager and
1235 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
1236 const Double_t kPtmin = 0.0, kPtmax = 320.; // we do not want to have empty bins at the beginning...
1237 const Double_t kEtamin = -3.0, kEtamax = 3.0;
1238 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
1239 const Double_t kZmin = 0., kZmax = 1;
1241 // can we neglect migration in eta and phi?
1242 // phi should be no problem since we cover full phi and are phi symmetric
1243 // eta migration is more difficult due to needed acceptance correction
1244 // in limited eta range
1246 //arrays for the number of bins in each dimension
1248 iBin[0] = 320; //bins in pt
1249 iBin[1] = 1; //bins in eta
1250 iBin[2] = 1; // bins in phi
1252 //arrays for lower bounds :
1253 Double_t* binEdges[kNvar];
1254 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1255 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1257 //values for bin lower bounds
1258 // 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);
1259 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1260 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1261 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1264 for(int i = 0;i < kMaxStep*2;++i){
1265 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d",i),kNvar,iBin);
1266 for (int k=0; k<kNvar; k++) {
1267 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1270 //create correlation matrix for unfolding
1271 Int_t thnDim[2*kNvar];
1272 for (int k=0; k<kNvar; k++) {
1273 //first half : reconstructed
1275 thnDim[k] = iBin[k];
1276 thnDim[k+kNvar] = iBin[k];
1279 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1280 for (int k=0; k<kNvar; k++) {
1281 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1282 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1284 fhnCorrelation->Sumw2();
1286 // for second correlation histogram
1289 const Int_t kNvarPhiZ = 4;
1290 //arrays for the number of bins in each dimension
1291 Int_t iBinPhiZ[kNvarPhiZ];
1292 iBinPhiZ[0] = 80; //bins in pt
1293 iBinPhiZ[1] = 72; //bins in phi
1294 iBinPhiZ[2] = 20; // bins in Z
1295 iBinPhiZ[3] = 80; //bins in ptgen
1297 //arrays for lower bounds :
1298 Double_t* binEdgesPhiZ[kNvarPhiZ];
1299 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1300 binEdgesPhiZ[ivar] = new Double_t[iBinPhiZ[ivar] + 1];
1302 for(Int_t i=0; i<=iBinPhiZ[0]; i++) binEdgesPhiZ[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[0]*(Double_t)i;
1303 for(Int_t i=0; i<=iBinPhiZ[1]; i++) binEdgesPhiZ[1][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBinPhiZ[1]*(Double_t)i;
1304 for(Int_t i=0; i<=iBinPhiZ[2]; i++) binEdgesPhiZ[2][i]=(Double_t)kZmin + (kZmax-kZmin)/iBinPhiZ[2]*(Double_t)i;
1305 for(Int_t i=0; i<=iBinPhiZ[3]; i++) binEdgesPhiZ[3][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[3]*(Double_t)i;
1307 fhnCorrelationPhiZRec = new THnSparseF("fhnCorrelationPhiZRec","THnSparse with correlations",kNvarPhiZ,iBinPhiZ);
1308 for (int k=0; k<kNvarPhiZ; k++) {
1309 fhnCorrelationPhiZRec->SetBinEdges(k,binEdgesPhiZ[k]);
1311 fhnCorrelationPhiZRec->Sumw2();
1314 // Add a histogram for Fake jets
1316 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1317 delete [] binEdges[ivar];
1319 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1320 delete [] binEdgesPhiZ[ivar];
1324 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1326 // Terminate analysis
1328 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1332 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1334 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1337 if(type==kTrackAOD){
1338 AliAODEvent *aod = 0;
1339 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1340 else aod = AODEvent();
1344 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1345 AliAODTrack *tr = aod->GetTrack(it);
1346 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1347 if(TMath::Abs(tr->Eta())>0.9)continue;
1350 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1351 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(Int_t)fInputHandler->GetTree()->GetReadEntry());
1354 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1356 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1366 else if (type == kTrackKineAll||type == kTrackKineCharged){
1367 AliMCEvent* mcEvent = MCEvent();
1368 if(!mcEvent)return iCount;
1369 // we want to have alivpartilces so use get track
1370 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1371 if(!mcEvent->IsPhysicalPrimary(it))continue;
1372 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1373 if(type == kTrackKineAll){
1377 else if(type == kTrackKineCharged){
1378 if(part->Particle()->GetPDG()->Charge()==0)continue;
1384 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1385 AliAODEvent *aod = 0;
1386 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1387 else aod = AODEvent();
1388 if(!aod)return iCount;
1389 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1390 if(!tca)return iCount;
1391 for(int it = 0;it < tca->GetEntriesFast();++it){
1392 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1393 if(!part->IsPhysicalPrimary())continue;
1394 if(type == kTrackAODMCAll){
1398 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1399 if(part->Charge()==0)continue;
1400 if(kTrackAODMCCharged){
1404 if(TMath::Abs(part->Eta())>0.9)continue;