2 // **************************************
3 // Task used for the correction of determiantion of reconstructed jet spectra
4 // Compares input (gen) and output (rec) jets
5 // *******************************************
8 /**************************************************************************
9 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
11 * Author: The ALICE Off-line Project. *
12 * Contributors are mentioned in the code where appropriate. *
14 * Permission to use, copy, modify and distribute this software and its *
15 * documentation strictly for non-commercial purposes is hereby granted *
16 * without fee, provided that the above copyright notice appears in all *
17 * copies and that both the copyright notice and this permission notice *
18 * appear in the supporting documentation. The authors make no claims *
19 * about the suitability of this software for any purpose. It is *
20 * provided "as is" without express or implied warranty. *
21 **************************************************************************/
27 #include <TInterpreter.h>
36 #include <TLorentzVector.h>
37 #include <TClonesArray.h>
38 #include "TDatabasePDG.h"
40 #include "AliAnalysisTaskJetSpectrum2.h"
41 #include "AliAnalysisManager.h"
42 #include "AliJetFinder.h"
43 #include "AliJetHeader.h"
44 #include "AliJetReader.h"
45 #include "AliJetReaderHeader.h"
46 #include "AliUA1JetHeaderV1.h"
47 #include "AliESDEvent.h"
48 #include "AliAODEvent.h"
49 #include "AliAODHandler.h"
50 #include "AliAODTrack.h"
51 #include "AliAODJet.h"
52 #include "AliAODJetEventBackground.h"
53 #include "AliAODMCParticle.h"
54 #include "AliMCEventHandler.h"
55 #include "AliMCEvent.h"
57 #include "AliGenPythiaEventHeader.h"
58 #include "AliJetKineReaderHeader.h"
59 #include "AliGenCocktailEventHeader.h"
60 #include "AliInputEventHandler.h"
63 #include "AliAnalysisHelperJetTasks.h"
65 ClassImp(AliAnalysisTaskJetSpectrum2)
67 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(): AliAnalysisTaskSE(),
74 fhnCorrelationPhiZRec(0x0),
80 fUseAODJetInput(kFALSE),
81 fUseAODTrackInput(kFALSE),
82 fUseAODMCInput(kFALSE),
83 fUseGlobalSelection(kFALSE),
84 fUseExternalWeightOnly(kFALSE),
85 fLimitGenJetEta(kFALSE),
86 fBkgSubtraction(kFALSE),
90 fEventSelectionMask(0),
92 fTrackTypeRec(kTrackUndef),
93 fTrackTypeGen(kTrackUndef),
97 fJetRecEtaWindow(0.5),
98 fTrackRecEtaWindow(0.5),
101 fDeltaPhiWindow(90./180.*TMath::Pi()),
106 fh1PtHardTrials(0x0),
111 fh1SumPtTrackRec(0x0),
112 fh1SumPtTrackAreaRec(0x0),
116 fh1PtJetsLeadingRecIn(0x0),
117 fh1PtTracksRecIn(0x0),
118 fh1PtTracksLeadingRecIn(0x0),
119 fh1PtTracksGenIn(0x0),
121 fh2NRecTracksPt(0x0),
123 fh2NGenTracksPt(0x0),
139 fh1Ptjethardest(0x0),
140 fh1Ptjetsubhardest1(0x0),
141 fh1Ptjetsubhardest2(0x0),
142 fh1Ptjetsubhardest3(0x0),
143 fh2Rhovspthardest1(0x0),
144 fh2Rhovspthardest2(0x0),
145 fh2Rhovspthardest3(0x0),
146 fh2Errorvspthardest1(0x0),
147 fh2Errorvspthardest2(0x0),
148 fh2Errorvspthardest3(0x0),
151 for(int i = 0;i < kMaxStep*2;++i){
152 fhnJetContainer[i] = 0;
154 for(int i = 0;i < kMaxJets;++i){
155 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
168 for(int ij = 0;ij <kJetTypes;++ij){
170 fh1SumPtTrack[ij] = 0;
172 fh1PtTracksIn[ij] = 0;
173 fh1PtTracksLeadingIn[ij] = 0;
175 fh2NTracksPt[ij] = 0;
176 fh2LeadingJetPtJetPhi[ij] = 0;
177 fh2LeadingTrackPtTrackPhi[ij] = 0;
178 for(int i = 0;i < kMaxJets;++i){
181 fh2PhiEta[ij][i] = 0;
188 fh1DijetMinv[ij] = 0;
189 fh2DijetDeltaPhiPt[ij] = 0;
190 fh2DijetAsymPt[ij] = 0;
191 fh2DijetPt2vsPt1[ij] = 0;
192 fh2DijetDifvsSum[ij] = 0;
197 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
198 AliAnalysisTaskSE(name),
205 fhnCorrelationPhiZRec(0x0),
211 fUseAODJetInput(kFALSE),
212 fUseAODTrackInput(kFALSE),
213 fUseAODMCInput(kFALSE),
214 fUseGlobalSelection(kFALSE),
215 fUseExternalWeightOnly(kFALSE),
216 fLimitGenJetEta(kFALSE),
217 fBkgSubtraction(kFALSE),
221 fEventSelectionMask(0),
223 fTrackTypeRec(kTrackUndef),
224 fTrackTypeGen(kTrackUndef),
228 fJetRecEtaWindow(0.5),
229 fTrackRecEtaWindow(0.5),
232 fDeltaPhiWindow(90./180.*TMath::Pi()),
237 fh1PtHardTrials(0x0),
242 fh1SumPtTrackRec(0x0),
243 fh1SumPtTrackAreaRec(0x0),
247 fh1PtJetsLeadingRecIn(0x0),
248 fh1PtTracksRecIn(0x0),
249 fh1PtTracksLeadingRecIn(0x0),
250 fh1PtTracksGenIn(0x0),
252 fh2NRecTracksPt(0x0),
254 fh2NGenTracksPt(0x0),
270 fh1Ptjethardest(0x0),
271 fh1Ptjetsubhardest1(0x0),
272 fh1Ptjetsubhardest2(0x0),
273 fh1Ptjetsubhardest3(0x0),
274 fh2Rhovspthardest1(0x0),
275 fh2Rhovspthardest2(0x0),
276 fh2Rhovspthardest3(0x0),
277 fh2Errorvspthardest1(0x0),
278 fh2Errorvspthardest2(0x0),
279 fh2Errorvspthardest3(0x0),
283 for(int i = 0;i < kMaxStep*2;++i){
284 fhnJetContainer[i] = 0;
286 for(int i = 0;i < kMaxJets;++i){
287 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
299 for(int ij = 0;ij <kJetTypes;++ij){
301 fh1SumPtTrack[ij] = 0;
303 fh1PtTracksIn[ij] = 0;
304 fh1PtTracksLeadingIn[ij] = 0;
306 fh2NTracksPt[ij] = 0;
307 fh2LeadingJetPtJetPhi[ij] = 0;
308 fh2LeadingTrackPtTrackPhi[ij] = 0;
309 for(int i = 0;i < kMaxJets;++i){
312 fh2PhiEta[ij][i] = 0;
319 fh1DijetMinv[ij] = 0;
320 fh2DijetDeltaPhiPt[ij] = 0;
321 fh2DijetAsymPt[ij] = 0;
322 fh2DijetPt2vsPt1[ij] = 0;
323 fh2DijetDifvsSum[ij] = 0;
326 DefineOutput(1, TList::Class());
331 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
337 // Implemented Notify() to read the cross sections
338 // and number of trials from pyxsec.root
341 // Fetch the aod also from the input in,
342 // have todo it in notify
345 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
346 // assume that the AOD is in the general output...
347 fAODOut = AODEvent();
349 if(fNonStdFile.Length()!=0){
350 // case that we have an AOD extension we need can fetch the jets from the extended output
351 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
352 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
354 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
359 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
360 Float_t xsection = 0;
365 TFile *curfile = tree->GetCurrentFile();
367 Error("Notify","No current file");
370 if(!fh1Xsec||!fh1Trials){
371 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
374 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
375 fh1Xsec->Fill("<#sigma>",xsection);
376 // construct a poor man average trials
377 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
378 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
385 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
395 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
398 if(!fHistList)fHistList = new TList();
399 fHistList->SetOwner(kTRUE);
400 Bool_t oldStatus = TH1::AddDirectoryStatus();
401 TH1::AddDirectory(kFALSE);
405 fHistList->Add(fhnCorrelation);
406 fHistList->Add(fhnCorrelationPhiZRec);
407 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
412 const Int_t nBinPt = 320;
413 Double_t binLimitsPt[nBinPt+1];
414 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
416 binLimitsPt[iPt] = 0.0;
419 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
423 const Int_t nBinPhi = 90;
424 Double_t binLimitsPhi[nBinPhi+1];
425 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
427 binLimitsPhi[iPhi] = -1.*TMath::Pi();
430 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
435 const Int_t nBinPhi2 = 360;
436 Double_t binLimitsPhi2[nBinPhi2+1];
437 for(Int_t iPhi2 = 0;iPhi2<=nBinPhi2;iPhi2++){
439 binLimitsPhi2[iPhi2] = 0.;
442 binLimitsPhi2[iPhi2] = binLimitsPhi2[iPhi2-1] + 1/(Float_t)nBinPhi2 * TMath::Pi()*2;
446 const Int_t nBinEta = 40;
447 Double_t binLimitsEta[nBinEta+1];
448 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
450 binLimitsEta[iEta] = -2.0;
453 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
458 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
459 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
460 fHistList->Add(fh1Xsec);
462 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
463 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
464 fHistList->Add(fh1Trials);
466 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
467 fHistList->Add(fh1PtHard);
469 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
470 fHistList->Add(fh1PtHardNoW);
472 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
473 fHistList->Add(fh1PtHardTrials);
476 fh1ZVtx = new TH1F("fh1ZVtx","z vtx;z_{vtx} (cm)",400,-20,20);
477 fHistList->Add(fh1ZVtx);
479 fh2PtFGen = new TH2F("fh2PtFGen",Form("%s vs. %s;p_{T,gen};p_{T,rec}",fBranchRec.Data(),fBranchGen.Data()),nBinPt,binLimitsPt,nBinPt,binLimitsPt);
480 fHistList->Add(fh2PtFGen);
482 fh2RelPtFGen = new TH2F("fh2RelPtFGen",";p_{T,gen};p_{T,rec}-p_{T,gen}/p_{T,Gen}",nBinPt,binLimitsPt,241,-2.41,2.41);
483 fHistList->Add(fh2RelPtFGen);
486 for(int ij = 0;ij <kJetTypes;++ij){
488 TString cJetBranch = "";
491 cJetBranch = fBranchRec.Data();
493 else if (ij==kJetGen){
495 cJetBranch = fBranchGen.Data();
498 fh1NJets[ij] =new TH1F(Form("fh1N%sJets",cAdd.Data()),Form("N %s jets",cAdd.Data()),50,-0.5,49.5);
499 fHistList->Add(fh1NJets[ij]);
501 fh1PtJetsIn[ij] = new TH1F(Form("fh1PtJets%sIn",cAdd.Data()),Form("%s jets p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
502 fHistList->Add(fh1PtJetsIn[ij]);
504 fh1PtTracksIn[ij] = new TH1F(Form("fh1PtTracks%sIn",cAdd.Data()),Form("%s track p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
505 fHistList->Add(fh1PtTracksIn[ij]);
507 fh1PtTracksLeadingIn[ij] = new TH1F(Form("fh1PtTracksLeading%sIn",cAdd.Data()),Form("%s track p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
508 fHistList->Add(fh1PtTracksLeadingIn[ij]);
510 fh1SumPtTrack[ij] = new TH1F(Form("fh1SumPtTrack%s",cAdd.Data()),Form("Sum %s track p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
511 fHistList->Add(fh1SumPtTrack[ij]);
513 fh2NJetsPt[ij] = new TH2F(Form("fh2N%sJetsPt",cAdd.Data()),Form("Number of %s jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",cAdd.Data()),nBinPt,binLimitsPt,50,-0.5,49.5);
514 fHistList->Add(fh2NJetsPt[ij]);
516 fh2NTracksPt[ij] = new TH2F(Form("fh2N%sTracksPt",cAdd.Data()),Form("Number of %s tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",cAdd.Data()),nBinPt,binLimitsPt,50,-0.5,49.5);
517 fHistList->Add(fh2NTracksPt[ij]);
519 fh2LeadingJetPtJetPhi[ij] = new TH2F(Form("fh2Leading%sJetPtJetPhi",cAdd.Data()),Form("phi of leading %s jet;p_{T};#phi;",cAdd.Data()),
520 nBinPt,binLimitsPt,nBinPhi,binLimitsPhi);
521 fHistList->Add(fh2LeadingJetPtJetPhi[ij]);
523 fh2LeadingTrackPtTrackPhi[ij] = new TH2F(Form("fh2Leading%sTrackPtTrackPhi",cAdd.Data()),Form("phi of leading %s track;p_{T};#phi;",cAdd.Data()),
524 nBinPt,binLimitsPt,nBinPhi,binLimitsPhi);
525 fHistList->Add(fh2LeadingTrackPtTrackPhi[ij]);
527 for(int i = 0;i < kMaxJets;++i){
529 fh1PtIn[ij][i] = new TH1F(Form("fh1Pt%sIn_j%d",cAdd.Data(),i),Form("%s p_T input ;p_{T}",cAdd.Data()),nBinPt,binLimitsPt);
530 fHistList->Add(fh1PtIn[ij][i]);
532 fh2RhoPt[ij][i] = new TH2F(Form("fh2RhoPt%s_j%d",cAdd.Data(),i),Form("jet shape rho for %s jets;r;p_{T};",cAdd.Data()),
533 40,0.,2.,nBinPt,binLimitsPt);
534 fHistList->Add(fh2RhoPt[ij][i]);
535 if(!fh1TmpRho)fh1TmpRho = new TH1F("fh1TmpRho","tmp histo for jet shape",40,0.,2);
538 fh2PsiPt[ij][i] = new TH2F(Form("fh2PsiPt%s_j%d",cAdd.Data(),i),Form("jet shape #psi for %s jets;r;p_{T};",cAdd.Data()),
539 40,0.,2.,nBinPt,binLimitsPt);
540 fHistList->Add(fh2PsiPt[ij][i]);
542 fh2PhiPt[ij][i] = new TH2F(Form("fh2PhiPt%s_j%d",cAdd.Data(),i),Form("pt vs phi %s;phi;p_{T};",cAdd.Data()),
543 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
544 fHistList->Add(fh2PhiPt[ij][i]);
545 fh2EtaPt[ij][i] = new TH2F(Form("fh2EtaPt%s_j%d",cAdd.Data(),i),Form("pt vs phi %s;phi;p_{T};",cAdd.Data()),
546 20,-1.,1.,nBinPt,binLimitsPt);
547 fHistList->Add(fh2EtaPt[ij][i]);
548 fh2PhiEta[ij][i] = new TH2F(Form("fh2PhiEta%s_j%d",cAdd.Data(),i),Form("phi vs eta %s ;phi;p_{T};",cAdd.Data()),
549 nBinPhi,binLimitsPhi,20,-1.,1.);
550 fHistList->Add(fh2PhiEta[ij][i]);
555 fh1DijetMinv[ij] = new TH1F(Form("fh1Dijet%sMinv",cAdd.Data()),"Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
556 fHistList->Add(fh1DijetMinv[ij]);
558 fh2DijetDeltaPhiPt[ij] = new TH2F(Form("fh2Dijet%sDeltaPhiPt",cAdd.Data()),"Difference in the azimuthal angle;#Delta#phi;p_{T,2};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
559 fHistList->Add(fh2DijetDeltaPhiPt[ij]);
561 fh2DijetAsymPt[ij] = new TH2F(Form("fh2Dijet%sAsym",cAdd.Data()),"Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
562 fHistList->Add(fh2DijetAsymPt[ij]);
564 fh2DijetPt2vsPt1[ij] = new TH2F(Form("fh2Dijet%sPt2vsPt1",cAdd.Data()),"Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
565 fHistList->Add(fh2DijetPt2vsPt1[ij]);
567 fh2DijetDifvsSum[ij] = new TH2F(Form("fh2Dijet%sDifvsSum",cAdd.Data()),"Pt difference vs Pt sum;p_{T,1}+p_{T,2} (GeV/c);#Deltap_{T} (GeV/c)",400,0.,400.,150,0.,150.);
568 fHistList->Add( fh2DijetDifvsSum[ij]);
571 // =========== Switch on Sumw2 for all histos ===========
572 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
573 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
578 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
581 TH1::AddDirectory(oldStatus);
584 void AliAnalysisTaskJetSpectrum2::Init()
590 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
594 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/){
597 Bool_t selected = kTRUE;
599 if(fUseGlobalSelection&&fEventSelectionMask==0){
600 selected = AliAnalysisHelperJetTasks::Selected();
602 else if(fUseGlobalSelection&&fEventSelectionMask>0){
603 selected = AliAnalysisHelperJetTasks::TestSelectInfo(fEventSelectionMask);
607 selected = selected&&(AliAnalysisHelperJetTasks::EventClass()==fEventClass);
611 // no selection by the service task, we continue
612 if (fDebug > 1)Printf("Not selected %s:%d SelectInfo %d Class %d",(char*)__FILE__,__LINE__, AliAnalysisHelperJetTasks::Selected(),AliAnalysisHelperJetTasks::EventClass());
613 PostData(1, fHistList);
618 static AliAODEvent* aod = 0;
620 // take all other information from the aod we take the tracks from
622 if(fUseAODTrackInput)aod = fAODIn;
628 // Execute analysis for current event
630 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
631 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
633 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
637 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
638 TClonesArray *aodRecJets = 0;
640 if(fAODOut&&!aodRecJets){
641 aodRecJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchRec.Data()));
643 if(fAODExtension&&!aodRecJets){
644 aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRec.Data()));
646 if(fAODIn&&!aodRecJets){
647 aodRecJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchRec.Data()));
653 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
657 TClonesArray *aodGenJets = 0;
658 if(fBranchGen.Length()>0){
659 if(fAODOut&&!aodGenJets){
660 aodGenJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchGen.Data()));
662 if(fAODExtension&&!aodGenJets){
663 aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGen.Data()));
665 if(fAODIn&&!aodGenJets){
666 aodGenJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchGen.Data()));
670 Printf("%s:%d no generated Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchGen.Data());
677 // first fill all the pure histograms, i.e. full jets
678 // in case of the correaltion limit to the n-leading jets
686 // second fill the correlation histograms, here we limit to the n-th leading jet in case of the reconstructed
689 TList genJetsList; // full acceptance
690 TList genJetsListCut; // acceptance cut
691 TList recJetsList; // full acceptance
692 TList recJetsListCut; // acceptance cut
695 GetListOfJets(&recJetsList,aodRecJets,0);
696 GetListOfJets(&recJetsListCut,aodRecJets,1);
698 if(fBranchGen.Length()>0){
699 GetListOfJets(&genJetsList,aodGenJets,0);
700 GetListOfJets(&genJetsListCut,aodGenJets,1);
705 Double_t nTrials = 1; // Trials for MC trigger
706 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
708 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
709 // this is the part we only use when we have MC information
710 AliMCEvent* mcEvent = MCEvent();
711 // AliStack *pStack = 0;
713 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
716 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
718 nTrials = pythiaGenHeader->Trials();
719 ptHard = pythiaGenHeader->GetPtHard();
720 int iProcessType = pythiaGenHeader->ProcessType();
722 // 12 f+barf -> f+barf
727 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
728 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
730 }// (fAnalysisType&kMCESD)==kMCESD)
733 // we simply fetch the tracks/mc particles as a list of AliVParticles
738 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
739 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
740 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
741 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
743 // Event control and counting ...
745 fh1PtHard->Fill(ptHard,eventW);
746 fh1PtHardNoW->Fill(ptHard,1);
747 fh1PtHardTrials->Fill(ptHard,nTrials);
750 if(aod->GetPrimaryVertex()){// No vtx for pure MC
751 fh1ZVtx->Fill(aod->GetPrimaryVertex()->GetZ());
754 // the loops for rec and gen should be indentical... pass it to a separate
761 FillJetHistos(recJetsListCut,recParticles,kJetRec);
762 FillTrackHistos(recParticles,kJetRec);
764 FillJetHistos(genJetsListCut,genParticles,kJetGen);
765 FillTrackHistos(genParticles,kJetGen);
767 // Here follows the jet matching part
768 // delegate to a separated method?
770 FillMatchHistos(recJetsList,genJetsList);
772 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
773 PostData(1, fHistList);
776 void AliAnalysisTaskJetSpectrum2::FillJetHistos(TList &jetsList,TList &particlesList,Int_t iType){
778 if(iType>=kJetTypes){
782 Int_t nJets = jetsList.GetEntries();
783 fh1NJets[iType]->Fill(nJets);
787 Float_t ptOld = 1.E+32;
796 for(int ij = 0;ij < nJets;ij++){
797 AliAODJet *jet = (AliAODJet*)jetsList.At(ij);
798 Float_t ptJet = jet->Pt();
799 fh1PtJetsIn[iType]->Fill(ptJet);
801 Printf("%s:%d Jets Type %d Not Sorted !! %d:%.3E %d:%.3E",(char*)__FILE__,__LINE__,iType,ij,ptJet,ij-1,ptOld);
805 // find the dijets assume sorting and acceptance cut...
810 if(phi0<0)phi0+=TMath::Pi()*2.;
813 // take only the backward hemisphere??
815 if(phi1<0)phi1+=TMath::Pi()*2.;
816 Float_t dPhi = phi1 - phi0;
817 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
818 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
819 if(TMath::Abs(TMath::Pi()-dPhi)<fDeltaPhiWindow){
824 // fill jet histos for kmax jets
826 Float_t phiJet = jet->Phi();
827 Float_t etaJet = jet->Eta();
828 if(phiJet<0)phiJet+=TMath::Pi()*2.;
830 fh1PtIn[iType][ij]->Fill(ptJet);
831 // fill leading jets...
832 fh2PhiEta[iType][ij]->Fill(phiJet,etaJet);
833 fh2PhiPt[iType][ij]->Fill(phiJet,ptJet);
834 if(ptJet>10)fh2EtaPt[iType][ij]->Fill(etaJet,ptJet);
836 fh2LeadingJetPtJetPhi[iType]->Fill(ptJet,phiJet);
837 if(ij==0&&iType==0&&fDebug>1){
838 Printf("%d %3.3f %p %s",iType,ptJet,jet,fBranchRec.Data());
841 if(particlesList.GetSize()){
843 // Particles... correlated with jets...
844 for(int it = 0;it<particlesList.GetEntries();++it){
845 AliVParticle *part = (AliVParticle*)particlesList.At(it);
846 Float_t deltaR = jet->DeltaR(part);
847 if(ptJet>0)fh1TmpRho->Fill(deltaR,part->Pt()/ptJet);
849 // fill the jet shapes
851 for(int ibx = 1;ibx<=fh2RhoPt[iType][ij]->GetNbinsX();ibx++){
852 Float_t r = fh2RhoPt[iType][ij]->GetXaxis()->GetBinCenter(ibx);
853 Float_t rho = fh1TmpRho->GetBinContent(ibx);
855 fh2RhoPt[iType][ij]->Fill(r,ptJet,rho);
856 fh2PsiPt[iType][ij]->Fill(r,ptJet,rhoSum);
858 }// if we have particles
863 // do something with dijets...
865 AliAODJet *jet0 = (AliAODJet*)jetsList.At(ij0);
866 Double_t ptJet0 = jet0->Pt();
867 Double_t phiJet0 = jet0->Phi();
868 if(phiJet0<0)phiJet0+=TMath::Pi()*2.;
870 AliAODJet *jet1 = (AliAODJet*)jetsList.At(ij1);
871 Double_t ptJet1 = jet1->Pt();
872 Double_t phiJet1 = jet1->Phi();
873 if(phiJet1<0)phiJet1+=TMath::Pi()*2.;
875 Float_t deltaPhi = phiJet0 - phiJet1;
876 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
877 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
878 deltaPhi = TMath::Abs(deltaPhi);
879 fh2DijetDeltaPhiPt[iType]->Fill(deltaPhi,ptJet1);
882 if((ptJet0+ptJet1)>0)asym = (ptJet0-ptJet1)/(ptJet0+ptJet1);
883 fh2DijetAsymPt[iType]->Fill(asym,ptJet0);
884 fh2DijetPt2vsPt1[iType]->Fill(ptJet0,ptJet1);
885 fh2DijetDifvsSum[iType]->Fill(ptJet0+ptJet1,ptJet0-ptJet1);
886 Float_t minv = 2.*(jet0->P()*jet1->P()-
887 jet0->Px()*jet1->Px()-
888 jet0->Py()*jet1->Py()-
889 jet0->Pz()*jet1->Pz()); // assume mass == 0;
890 if(minv<0)minv=0; // prevent numerical instabilities
891 minv = TMath::Sqrt(minv);
892 fh1DijetMinv[iType]->Fill(minv);
897 // count down the jets above thrueshold
900 TIterator *jetIter = jetsList.MakeIterator();
901 AliAODJet *tmpJet = (AliAODJet*)(jetIter->Next());
903 Float_t pt = tmpJet->Pt();
904 for(int i = 1;i <= fh2NJetsPt[iType]->GetNbinsX();i++){
905 Float_t ptCut = fh2NJetsPt[iType]->GetXaxis()->GetBinCenter(i);
906 while(pt<ptCut&&tmpJet){
908 tmpJet = (AliAODJet*)(jetIter->Next());
914 fh2NJetsPt[iType]->Fill(ptCut,nOver);
921 void AliAnalysisTaskJetSpectrum2::FillTrackHistos(TList &particlesList,int iType){
923 Int_t nTrackOver = particlesList.GetSize();
924 // do the same for tracks and jets
926 TIterator *trackIter = particlesList.MakeIterator();
927 AliVParticle *tmpTrack = (AliVParticle*)(trackIter->Next());
928 Float_t pt = tmpTrack->Pt();
929 for(int i = 1;i <= fh2NTracksPt[iType]->GetNbinsX();i++){
930 Float_t ptCut = fh2NTracksPt[iType]->GetXaxis()->GetBinCenter(i);
931 while(pt<ptCut&&tmpTrack){
933 tmpTrack = (AliVParticle*)(trackIter->Next());
938 if(nTrackOver<=0)break;
939 fh2NTracksPt[iType]->Fill(ptCut,nTrackOver);
944 AliVParticle *leading = (AliVParticle*)particlesList.At(0);
947 while((tmpTrack = (AliVParticle*)(trackIter->Next()))){
948 Float_t tmpPt = tmpTrack->Pt();
949 fh1PtTracksIn[iType]->Fill(tmpPt);
951 Float_t tmpPhi = tmpTrack->Phi();
952 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
953 if(tmpTrack==leading){
954 fh1PtTracksLeadingIn[iType]->Fill(tmpPt);
955 fh2LeadingTrackPtTrackPhi[iType]->Fill(tmpPt,tmpPhi);
959 fh1SumPtTrack[iType]->Fill(sumPt);
966 void AliAnalysisTaskJetSpectrum2::FillMatchHistos(TList &recJetsList,TList &genJetsList){
969 // Fill al the matching histos
970 // It is important that the acceptances for the mathing are as large as possible
971 // to avoid false matches on the edge of acceptance
972 // therefore we add some extra matching jets as overhead
974 static TArrayI aGenIndex(recJetsList.GetEntries());
975 if(aGenIndex.GetSize()<recJetsList.GetEntries())aGenIndex.Set(recJetsList.GetEntries());
977 static TArrayI aRecIndex(genJetsList.GetEntries());
978 if(aRecIndex.GetSize()<genJetsList.GetEntries())aRecIndex.Set(genJetsList.GetEntries());
981 Printf("New Gens List %d rec index Array %d",genJetsList.GetEntries(),aRecIndex.GetSize());
982 Printf("New Rec List %d gen indey Array %d",recJetsList.GetEntries(),aGenIndex.GetSize());
984 AliAnalysisHelperJetTasks::GetClosestJets(&genJetsList,TMath::Min((Int_t)fNMatchJets,(Int_t)genJetsList.GetEntries()),
985 &recJetsList,TMath::Min((Int_t)fNMatchJets,(Int_t)recJetsList.GetEntries()),
986 aGenIndex,aRecIndex,fDebug);
989 for(int i = 0;i< aGenIndex.GetSize();++i){
990 if(aGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,aGenIndex[i]);
992 for(int i = 0;i< aRecIndex.GetSize();++i){
993 if(aRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,aRecIndex[i]);
997 Double_t container[6];
998 Double_t containerPhiZ[6];
1000 // loop over generated jets
1002 for(int ig = 0;ig < genJetsList.GetEntries();++ig){
1003 AliAODJet *genJet = (AliAODJet*)genJetsList.At(ig);
1004 Double_t ptGen = genJet->Pt();
1005 Double_t phiGen = genJet->Phi();
1006 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1007 Double_t etaGen = genJet->Eta();
1008 container[3] = ptGen;
1009 container[4] = etaGen;
1010 container[5] = phiGen;
1011 fhnJetContainer[kStep0]->Fill(&container[3]);
1012 if(JetSelected(genJet)){
1013 fhnJetContainer[kStep1]->Fill(&container[3]);
1014 Int_t ir = aRecIndex[ig];
1015 if(ir>=0&&ir<recJetsList.GetEntries()){
1016 fhnJetContainer[kStep2]->Fill(&container[3]);
1017 AliAODJet* recJet = (AliAODJet*)recJetsList.At(ir);
1018 if(JetSelected(recJet))fhnJetContainer[kStep4]->Fill(&container[3]);
1019 if(JetSelected(recJet))fhnJetContainer[kStep3]->Fill(&container[3]);
1022 }// loop over generated jets used for matching...
1026 // loop over reconstructed jets
1027 for(int ir = 0;ir < recJetsList.GetEntries();++ir){
1028 AliAODJet *recJet = (AliAODJet*)recJetsList.At(ir);
1029 Double_t etaRec = recJet->Eta();
1030 Double_t ptRec = recJet->Pt();
1031 Double_t phiRec = recJet->Phi();
1032 if(phiRec<0)phiRec+=TMath::Pi()*2.;
1033 // do something with dijets...
1035 container[0] = ptRec;
1036 container[1] = etaRec;
1037 container[2] = phiRec;
1038 containerPhiZ[0] = ptRec;
1039 containerPhiZ[1] = phiRec;
1041 fhnJetContainer[kStep0+kMaxStep]->Fill(container);
1042 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1044 if(JetSelected(recJet)){
1045 fhnJetContainer[kStep1+kMaxStep]->Fill(container);
1047 Int_t ig = aGenIndex[ir];
1048 if(ig>=0 && ig<genJetsList.GetEntries()){
1049 fhnJetContainer[kStep2+kMaxStep]->Fill(container);
1050 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1051 AliAODJet *genJet = (AliAODJet*)genJetsList.At(ig);
1052 Double_t ptGen = genJet->Pt();
1053 Double_t phiGen = genJet->Phi();
1054 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1055 Double_t etaGen = genJet->Eta();
1057 container[3] = ptGen;
1058 container[4] = etaGen;
1059 container[5] = phiGen;
1060 containerPhiZ[3] = ptGen;
1062 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
1064 if(JetSelected(genJet))fhnJetContainer[kStep4+kMaxStep]->Fill(container);
1065 fhnJetContainer[kStep3+kMaxStep]->Fill(container);
1066 fhnCorrelation->Fill(container);
1068 Float_t delta = (ptRec-ptGen)/ptGen;
1069 fh2RelPtFGen->Fill(ptGen,delta);
1070 fh2PtFGen->Fill(ptGen,ptRec);
1072 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1075 containerPhiZ[3] = 0;
1076 if(fhnCorrelationPhiZRec)fhnCorrelationPhiZRec->Fill(containerPhiZ);
1078 }// loop over reconstructed jets
1080 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1084 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
1086 // Create the particle container for the correction framework manager and
1089 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
1090 const Double_t kPtmin = 0.0, kPtmax = 320.; // we do not want to have empty bins at the beginning...
1091 const Double_t kEtamin = -3.0, kEtamax = 3.0;
1092 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
1093 const Double_t kZmin = 0., kZmax = 1;
1095 // can we neglect migration in eta and phi?
1096 // phi should be no problem since we cover full phi and are phi symmetric
1097 // eta migration is more difficult due to needed acceptance correction
1098 // in limited eta range
1100 //arrays for the number of bins in each dimension
1102 iBin[0] = 320; //bins in pt
1103 iBin[1] = 1; //bins in eta
1104 iBin[2] = 1; // bins in phi
1106 //arrays for lower bounds :
1107 Double_t* binEdges[kNvar];
1108 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1109 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1111 //values for bin lower bounds
1112 // 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);
1113 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1114 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1115 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1118 for(int i = 0;i < kMaxStep*2;++i){
1119 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d",i),kNvar,iBin);
1120 for (int k=0; k<kNvar; k++) {
1121 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1124 //create correlation matrix for unfolding
1125 Int_t thnDim[2*kNvar];
1126 for (int k=0; k<kNvar; k++) {
1127 //first half : reconstructed
1129 thnDim[k] = iBin[k];
1130 thnDim[k+kNvar] = iBin[k];
1133 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1134 for (int k=0; k<kNvar; k++) {
1135 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1136 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1138 fhnCorrelation->Sumw2();
1140 // for second correlation histogram
1143 const Int_t kNvarPhiZ = 4;
1144 //arrays for the number of bins in each dimension
1145 Int_t iBinPhiZ[kNvarPhiZ];
1146 iBinPhiZ[0] = 80; //bins in pt
1147 iBinPhiZ[1] = 72; //bins in phi
1148 iBinPhiZ[2] = 20; // bins in Z
1149 iBinPhiZ[3] = 80; //bins in ptgen
1151 //arrays for lower bounds :
1152 Double_t* binEdgesPhiZ[kNvarPhiZ];
1153 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1154 binEdgesPhiZ[ivar] = new Double_t[iBinPhiZ[ivar] + 1];
1156 for(Int_t i=0; i<=iBinPhiZ[0]; i++) binEdgesPhiZ[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[0]*(Double_t)i;
1157 for(Int_t i=0; i<=iBinPhiZ[1]; i++) binEdgesPhiZ[1][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBinPhiZ[1]*(Double_t)i;
1158 for(Int_t i=0; i<=iBinPhiZ[2]; i++) binEdgesPhiZ[2][i]=(Double_t)kZmin + (kZmax-kZmin)/iBinPhiZ[2]*(Double_t)i;
1159 for(Int_t i=0; i<=iBinPhiZ[3]; i++) binEdgesPhiZ[3][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBinPhiZ[3]*(Double_t)i;
1161 fhnCorrelationPhiZRec = new THnSparseF("fhnCorrelationPhiZRec","THnSparse with correlations",kNvarPhiZ,iBinPhiZ);
1162 for (int k=0; k<kNvarPhiZ; k++) {
1163 fhnCorrelationPhiZRec->SetBinEdges(k,binEdgesPhiZ[k]);
1165 fhnCorrelationPhiZRec->Sumw2();
1168 // Add a histogram for Fake jets
1170 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1171 delete [] binEdges[ivar];
1173 for(Int_t ivar = 0; ivar < kNvarPhiZ; ivar++)
1174 delete [] binEdgesPhiZ[ivar];
1178 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1180 // Terminate analysis
1182 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1186 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1188 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1191 if(type==kTrackAOD){
1192 AliAODEvent *aod = 0;
1193 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1194 else aod = AODEvent();
1198 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1199 AliAODTrack *tr = aod->GetTrack(it);
1200 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1201 if(TMath::Abs(tr->Eta())>fTrackRecEtaWindow)continue;
1202 if(tr->Pt()<fMinTrackPt)continue;
1205 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1206 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(Int_t)fInputHandler->GetTree()->GetReadEntry());
1209 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1211 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1221 else if (type == kTrackKineAll||type == kTrackKineCharged){
1222 AliMCEvent* mcEvent = MCEvent();
1223 if(!mcEvent)return iCount;
1224 // we want to have alivpartilces so use get track
1225 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1226 if(!mcEvent->IsPhysicalPrimary(it))continue;
1227 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1228 if(part->Pt()<fMinTrackPt)continue;
1229 if(type == kTrackKineAll){
1233 else if(type == kTrackKineCharged){
1234 if(part->Particle()->GetPDG()->Charge()==0)continue;
1240 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1241 AliAODEvent *aod = 0;
1242 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1243 else aod = AODEvent();
1244 if(!aod)return iCount;
1245 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1246 if(!tca)return iCount;
1247 for(int it = 0;it < tca->GetEntriesFast();++it){
1248 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1250 if(part->Pt()<fMinTrackPt)continue;
1251 if(!part->IsPhysicalPrimary())continue;
1252 if(type == kTrackAODMCAll){
1256 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1257 if(part->Charge()==0)continue;
1258 if(kTrackAODMCCharged){
1262 if(TMath::Abs(part->Eta())>fTrackRecEtaWindow)continue;
1276 Bool_t AliAnalysisTaskJetSpectrum2::JetSelected(AliAODJet *jet){
1277 Bool_t selected = false;
1279 if(!jet)return selected;
1281 if(fabs(jet->Eta())<fJetRecEtaWindow&&jet->Pt()>fMinJetPt){
1288 Int_t AliAnalysisTaskJetSpectrum2::GetListOfJets(TList *list,TClonesArray* jarray,Int_t type){
1290 if(fDebug>2)Printf("%s:%d Selecting jets with cuts %d",(char*)__FILE__,__LINE__,type);
1294 Printf("%s:%d no Jet array",(char*)__FILE__,__LINE__);
1299 for(int ij=0;ij<jarray->GetEntries();ij++){
1300 AliAODJet* jet = (AliAODJet*)jarray->At(ij);
1303 // No cut at all, main purpose here is sorting
1309 if(JetSelected(jet)){