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(),
72 fUseAODJetInput(kFALSE),
73 fUseAODTrackInput(kFALSE),
74 fUseAODMCInput(kFALSE),
75 fUseGlobalSelection(kFALSE),
76 fUseExternalWeightOnly(kFALSE),
77 fLimitGenJetEta(kFALSE),
80 fTrackTypeRec(kTrackUndef),
81 fTrackTypeGen(kTrackUndef),
86 fDeltaPhiWindow(20./180.*TMath::Pi()),
95 fh1SumPtTrackRec(0x0),
96 fh1SumPtTrackAreaRec(0x0),
98 fh1PtJetsLeadingRecIn(0x0),
99 fh1PtTracksRecIn(0x0),
100 fh1PtTracksLeadingRecIn(0x0),
101 fh1PtTracksGenIn(0x0),
103 fh2NRecTracksPt(0x0),
104 fh2JetsLeadingPhiEta(0x0),
105 fh2JetsLeadingPhiPt(0x0),
106 fh2TracksLeadingPhiEta(0x0),
107 fh2TracksLeadingPhiPt(0x0),
108 fh2TracksLeadingJetPhiPt(0x0),
109 fh2DijetDeltaPhiPt(0x0),
111 fh2DijetAsymPtCut(0x0),
112 fh2DijetDeltaPhiDeltaEta(0x0),
113 fh2DijetPt2vsPt1(0x0),
114 fh2DijetDifvsSum(0x0),
116 fh1DijetMinvCut(0x0),
119 for(int i = 0;i < kMaxStep*2;++i){
120 fhnJetContainer[i] = 0;
122 for(int i = 0;i < kMaxJets;++i){
123 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
124 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
129 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
130 AliAnalysisTaskSE(name),
137 fUseAODJetInput(kFALSE),
138 fUseAODTrackInput(kFALSE),
139 fUseAODMCInput(kFALSE),
140 fUseGlobalSelection(kFALSE),
141 fUseExternalWeightOnly(kFALSE),
142 fLimitGenJetEta(kFALSE),
145 fTrackTypeRec(kTrackUndef),
146 fTrackTypeGen(kTrackUndef),
151 fDeltaPhiWindow(20./180.*TMath::Pi()),
156 fh1PtHardTrials(0x0),
160 fh1SumPtTrackRec(0x0),
161 fh1SumPtTrackAreaRec(0x0),
163 fh1PtJetsLeadingRecIn(0x0),
164 fh1PtTracksRecIn(0x0),
165 fh1PtTracksLeadingRecIn(0x0),
166 fh1PtTracksGenIn(0x0),
168 fh2NRecTracksPt(0x0),
169 fh2JetsLeadingPhiEta(0x0),
170 fh2JetsLeadingPhiPt(0x0),
171 fh2TracksLeadingPhiEta(0x0),
172 fh2TracksLeadingPhiPt(0x0),
173 fh2TracksLeadingJetPhiPt(0x0),
174 fh2DijetDeltaPhiPt(0x0),
176 fh2DijetAsymPtCut(0x0),
177 fh2DijetDeltaPhiDeltaEta(0x0),
178 fh2DijetPt2vsPt1(0x0),
179 fh2DijetDifvsSum(0x0),
181 fh1DijetMinvCut(0x0),
185 for(int i = 0;i < kMaxStep*2;++i){
186 fhnJetContainer[i] = 0;
188 for(int i = 0;i < kMaxJets;++i){
189 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
190 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
192 DefineOutput(1, TList::Class());
197 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
200 // Implemented Notify() to read the cross sections
201 // and number of trials from pyxsec.root
204 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
205 Float_t xsection = 0;
210 TFile *curfile = tree->GetCurrentFile();
212 Error("Notify","No current file");
215 if(!fh1Xsec||!fh1Trials){
216 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
219 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
220 fh1Xsec->Fill("<#sigma>",xsection);
221 // construct a poor man average trials
222 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
223 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
228 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
232 // Create the output container
242 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
245 if(!fHistList)fHistList = new TList();
246 fHistList->SetOwner(kTRUE);
247 Bool_t oldStatus = TH1::AddDirectoryStatus();
248 TH1::AddDirectory(kFALSE);
253 const Int_t nBinPt = 100;
254 Double_t binLimitsPt[nBinPt+1];
255 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
257 binLimitsPt[iPt] = 0.0;
260 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
264 const Int_t nBinPhi = 90;
265 Double_t binLimitsPhi[nBinPhi+1];
266 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
268 binLimitsPhi[iPhi] = -1.*TMath::Pi();
271 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
277 const Int_t nBinEta = 40;
278 Double_t binLimitsEta[nBinEta+1];
279 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
281 binLimitsEta[iEta] = -2.0;
284 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
288 const Int_t nBinFrag = 25;
291 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
292 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
294 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
295 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
297 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
298 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
299 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
301 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
302 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
304 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
305 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
306 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);
308 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
309 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
310 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
311 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
312 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
314 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
315 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
318 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
319 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
320 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
321 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
322 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
323 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
324 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
325 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
327 for(int ij = 0;ij < kMaxJets;++ij){
328 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
329 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
331 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
332 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
334 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
335 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
338 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",
339 nBinFrag,0.,1.,nBinPt,binLimitsPt);
340 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",
341 nBinFrag,0.,10.,nBinPt,binLimitsPt);
343 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",
344 nBinFrag,0.,1.,nBinPt,binLimitsPt);
345 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",
346 nBinFrag,0.,10.,nBinPt,binLimitsPt);
351 fh2DijetDeltaPhiPt = new TH2F("fh2DeltaPhiPt","Difference in the azimuthal angle;#Delta#phi;p_{T,1};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
352 fh2DijetAsymPt = new TH2F("fh2DijetAsym","Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
353 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);
354 fh2DijetDeltaPhiDeltaEta = new TH2F("fh2DijetDeltaPhiDeltaEta","Difference in the azimuthal angle;#Delta#phi;Entries",180,0.,TMath::Pi(),20,-2.,2.);
355 fh2DijetPt2vsPt1 = new TH2F("fh2DijetPt2vsPt1","Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
356 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.);
357 fh1DijetMinv = new TH1F("fh1DijetMinv","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
358 fh1DijetMinvCut = new TH1F("fh1DijetMinvCut","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
363 const Int_t saveLevel = 3; // large save level more histos
365 fHistList->Add(fh1Xsec);
366 fHistList->Add(fh1Trials);
367 fHistList->Add(fh1PtHard);
368 fHistList->Add(fh1PtHardNoW);
369 fHistList->Add(fh1PtHardTrials);
370 if(fBranchGen.Length()>0){
371 fHistList->Add(fh1NGenJets);
372 fHistList->Add(fh1PtTracksGenIn);
374 fHistList->Add(fh1PtJetsRecIn);
375 fHistList->Add(fh1PtJetsLeadingRecIn);
376 fHistList->Add(fh1PtTracksRecIn);
377 fHistList->Add(fh1PtTracksLeadingRecIn);
378 fHistList->Add(fh1NRecJets);
379 fHistList->Add(fh1PtTrackRec);
380 fHistList->Add(fh1SumPtTrackRec);
381 fHistList->Add(fh1SumPtTrackAreaRec);
382 fHistList->Add(fh2NRecJetsPt);
383 fHistList->Add(fh2NRecTracksPt);
384 fHistList->Add(fh2JetsLeadingPhiEta );
385 fHistList->Add(fh2JetsLeadingPhiPt );
386 fHistList->Add(fh2TracksLeadingPhiEta);
387 fHistList->Add(fh2TracksLeadingPhiPt);
388 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
389 for(int ij = 0;ij<kMaxJets;++ij){
390 fHistList->Add( fh1PtRecIn[ij]);
391 if(fBranchGen.Length()>0){
392 fHistList->Add( fh1PtGenIn[ij]);
393 fHistList->Add( fh2FragGen[ij]);
394 fHistList->Add( fh2FragLnGen[ij]);
396 fHistList->Add( fh2PhiPt[ij]);
397 fHistList->Add( fh2PhiEta[ij]);
398 fHistList->Add( fh2FragRec[ij]);
399 fHistList->Add( fh2FragLnRec[ij]);
401 fHistList->Add(fhnCorrelation);
404 fHistList->Add(fh2DijetDeltaPhiPt);
405 fHistList->Add(fh2DijetAsymPt);
406 fHistList->Add(fh2DijetAsymPtCut);
407 fHistList->Add(fh2DijetDeltaPhiDeltaEta);
408 fHistList->Add(fh2DijetPt2vsPt1);
409 fHistList->Add(fh2DijetDifvsSum);
410 fHistList->Add(fh1DijetMinv);
411 fHistList->Add(fh1DijetMinvCut);
414 // =========== Switch on Sumw2 for all histos ===========
415 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
416 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
421 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
424 TH1::AddDirectory(oldStatus);
427 void AliAnalysisTaskJetSpectrum2::Init()
433 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
437 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
440 if(!AliAnalysisHelperJetTasks::Selected()&&fUseGlobalSelection){
441 // no selection by the service task, we continue
442 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
443 PostData(1, fHistList);
448 // Execute analysis for current event
450 AliESDEvent *fESD = 0;
452 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
454 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
460 // assume that the AOD is in the general output...
463 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
467 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
474 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
477 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
480 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
484 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
485 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
487 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
491 // ==== General variables needed
494 // We use statice array, not to fragment the memory
495 AliAODJet genJets[kMaxJets];
497 AliAODJet recJets[kMaxJets];
499 ///////////////////////////
504 Double_t nTrials = 1; // Trials for MC trigger
506 if(fUseExternalWeightOnly){
507 eventW = fExternalWeight;
510 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
511 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
512 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
513 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
514 // this is the part we only use when we have MC information
515 AliMCEvent* mcEvent = MCEvent();
516 // AliStack *pStack = 0;
518 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
521 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
524 nTrials = pythiaGenHeader->Trials();
525 ptHard = pythiaGenHeader->GetPtHard();
526 int iProcessType = pythiaGenHeader->ProcessType();
528 // 12 f+barf -> f+barf
533 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
534 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
536 // fetch the pythia generated jets only to be used here
537 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
538 AliAODJet pythiaGenJets[kMaxJets];
539 for(int ip = 0;ip < nPythiaGenJets;++ip){
540 if(iCount>=kMaxJets)continue;
542 pythiaGenHeader->TriggerJet(ip,p);
543 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
545 if(fBranchGen.Length()==0){
548 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
549 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
552 if(fMinJetPt>0&&pythiaGenJets[iCount].Pt()<fMinJetPt)continue;
553 // if we have MC particles and we do not read from the aod branch
554 // use the pythia jets
555 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
560 if(fBranchGen.Length()==0)nGenJets = iCount;
561 }// (fAnalysisType&kMCESD)==kMCESD)
564 // we simply fetch the tracks/mc particles as a list of AliVParticles
572 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
573 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
574 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
575 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
578 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
579 fh1PtHard->Fill(ptHard,eventW);
580 fh1PtHardNoW->Fill(ptHard,1);
581 fh1PtHardTrials->Fill(ptHard,nTrials);
583 // If we set a second branch for the input jets fetch this
584 if(fBranchGen.Length()>0){
585 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
588 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
589 if(iCount>=kMaxJets)continue;
590 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
594 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
595 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
598 if(fMinJetPt>0&&tmp->Pt()<fMinJetPt)continue;
599 genJets[iCount] = *tmp;
605 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
606 if(fDebug>2)fAOD->Print();
610 fh1NGenJets->Fill(nGenJets);
611 // We do not want to exceed the maximum jet number
612 nGenJets = TMath::Min(nGenJets,kMaxJets);
614 // Fetch the reconstructed jets...
616 nRecJets = aodRecJets->GetEntries();
618 nRecJets = aodRecJets->GetEntries();
619 fh1NRecJets->Fill(nRecJets);
621 // Do something with the all rec jets
622 Int_t nRecOver = nRecJets;
624 // check that the jets are sorted
625 Float_t ptOld = 999999;
626 for(int ir = 0;ir < nRecJets;ir++){
627 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
628 Float_t tmpPt = tmp->Pt();
630 Printf("%s:%d Jets Not Sorted!! %d:%.3E %d%.3E",(char*)__FILE__,__LINE__,ir,tmpPt,ir-1,ptOld);
637 TIterator *recIter = aodRecJets->MakeIterator();
638 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
639 Float_t pt = tmpRec->Pt();
641 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
642 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
643 while(pt<ptCut&&tmpRec){
645 tmpRec = (AliAODJet*)(recIter->Next());
650 if(nRecOver<=0)break;
651 fh2NRecJetsPt->Fill(ptCut,nRecOver);
655 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
656 Float_t phi = leading->Phi();
657 if(phi<0)phi+=TMath::Pi()*2.;
658 Float_t eta = leading->Eta();
660 while((tmpRec = (AliAODJet*)(recIter->Next()))){
661 Float_t tmpPt = tmpRec->Pt();
662 fh1PtJetsRecIn->Fill(tmpPt);
664 fh1PtJetsLeadingRecIn->Fill(tmpPt);
668 Float_t tmpPhi = tmpRec->Phi();
670 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
671 Float_t dPhi = phi - tmpRec->Phi();
672 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
673 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
674 Float_t dEta = eta - tmpRec->Eta();
675 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
676 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
681 Int_t nTrackOver = recParticles.GetSize();
682 // do the same for tracks and jets
684 TIterator *recIter = recParticles.MakeIterator();
685 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
686 Float_t pt = tmpRec->Pt();
687 // Printf("Leading track p_t %3.3E",pt);
688 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
689 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
690 while(pt<ptCut&&tmpRec){
692 tmpRec = (AliVParticle*)(recIter->Next());
697 if(nTrackOver<=0)break;
698 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
702 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
703 Float_t phi = leading->Phi();
704 if(phi<0)phi+=TMath::Pi()*2.;
705 Float_t eta = leading->Eta();
707 while((tmpRec = (AliVParticle*)(recIter->Next()))){
708 Float_t tmpPt = tmpRec->Pt();
709 fh1PtTracksRecIn->Fill(tmpPt);
711 fh1PtTracksLeadingRecIn->Fill(tmpPt);
715 Float_t tmpPhi = tmpRec->Phi();
717 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
718 Float_t dPhi = phi - tmpRec->Phi();
719 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
720 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
721 Float_t dEta = eta - tmpRec->Eta();
722 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
723 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
728 if(genParticles.GetSize()){
729 TIterator *genIter = genParticles.MakeIterator();
730 AliVParticle *tmpGen = 0;
731 while((tmpGen = (AliVParticle*)(genIter->Next()))){
732 if(TMath::Abs(tmpGen->Eta())<0.9){
733 Float_t tmpPt = tmpGen->Pt();
734 fh1PtTracksGenIn->Fill(tmpPt);
740 nRecJets = TMath::Min(nRecJets,kMaxJets);
743 for(int ir = 0;ir < nRecJets;++ir){
744 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
746 if(tmp->Pt()<fMinJetPt)continue;
750 nRecJets = iCountRec;
753 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
755 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
756 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
759 for(int i = 0;i<kMaxJets;++i){
760 iGenIndex[i] = iRecIndex[i] = -1;
763 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
764 iGenIndex,iRecIndex,fDebug);
765 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
768 for(int i = 0;i<kMaxJets;++i){
769 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
770 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
777 Double_t container[6];
779 // loop over generated jets
781 // radius; tmp, get from the jet header itself
782 // at some point, how todeal woht FastJet on MC?
783 Float_t radiusGen =0.4;
784 Float_t radiusRec =0.4;
786 for(int ig = 0;ig < nGenJets;++ig){
787 Double_t ptGen = genJets[ig].Pt();
788 Double_t phiGen = genJets[ig].Phi();
789 if(phiGen<0)phiGen+=TMath::Pi()*2.;
790 Double_t etaGen = genJets[ig].Eta();
792 container[3] = ptGen;
793 container[4] = etaGen;
794 container[5] = phiGen;
795 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
796 Int_t ir = iRecIndex[ig];
798 if(TMath::Abs(etaGen)<fRecEtaWindow){
799 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
800 fh1PtGenIn[ig]->Fill(ptGen,eventW);
801 // fill the fragmentation function
802 for(int it = 0;it<genParticles.GetEntries();++it){
803 AliVParticle *part = (AliVParticle*)genParticles.At(it);
804 if(genJets[ig].DeltaR(part)<radiusGen){
805 Float_t z = part->Pt()/ptGen;
806 Float_t lnz = -1.*TMath::Log(z);
807 fh2FragGen[ig]->Fill(z,ptGen,eventW);
808 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
811 if(ir>=0&&ir<nRecJets){
812 fhnJetContainer[kStep3]->Fill(&container[3],eventW);
816 if(ir>=0&&ir<nRecJets){
817 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
818 Double_t etaRec = recJets[ir].Eta();
819 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
821 }// loop over generated jets
825 for(int it = 0;it<recParticles.GetEntries();++it){
826 AliVParticle *part = (AliVParticle*)recParticles.At(it);
827 // fill sum pt and P_t of all paritles
828 if(TMath::Abs(part->Eta())<0.9){
829 Float_t pt = part->Pt();
830 fh1PtTrackRec->Fill(pt,eventW);
834 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
835 fh1SumPtTrackRec->Fill(sumPt,eventW);
838 // loop over reconstructed jets
839 for(int ir = 0;ir < nRecJets;++ir){
840 Double_t etaRec = recJets[ir].Eta();
841 Double_t ptRec = recJets[ir].Pt();
842 Double_t phiRec = recJets[ir].Phi();
843 if(phiRec<0)phiRec+=TMath::Pi()*2.;
846 // do something with dijets...
848 Double_t etaRec1 = recJets[0].Eta();
849 Double_t ptRec1 = recJets[0].Pt();
850 Double_t phiRec1 = recJets[0].Phi();
851 if(phiRec1<0)phiRec1+=TMath::Pi()*2.;
854 if(TMath::Abs(etaRec1)<fRecEtaWindow
855 &&TMath::Abs(etaRec)<fRecEtaWindow){
857 Float_t deltaPhi = phiRec1 - phiRec;
859 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
860 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
861 deltaPhi = TMath::Abs(deltaPhi);
862 fh2DijetDeltaPhiPt->Fill(deltaPhi,ptRec1);
863 Float_t asym = (ptRec1-ptRec)/(ptRec1+ptRec);
864 fh2DijetAsymPt->Fill(asym,ptRec1);
865 fh2DijetDeltaPhiDeltaEta->Fill(deltaPhi,etaRec1-etaRec);
866 fh2DijetPt2vsPt1->Fill(ptRec1,ptRec);
867 fh2DijetDifvsSum->Fill(ptRec1+ptRec,ptRec1-ptRec);
868 Float_t minv = 2.*(recJets[0].P()*recJets[1].P()-
869 recJets[0].Px()*recJets[1].Px()-
870 recJets[0].Py()*recJets[1].Py()-
871 recJets[0].Pz()*recJets[1].Py());
872 minv = TMath::Sqrt(minv);
875 fh1DijetMinv->Fill(minv);
876 if((TMath::Pi()-deltaPhi)<fDeltaPhiWindow){
877 fh1DijetMinvCut->Fill(minv);
878 fh2DijetAsymPtCut->Fill(asym,ptRec1);
884 container[0] = ptRec;
885 container[1] = etaRec;
886 container[2] = phiRec;
888 if(ptRec>30.&&fDebug>0){
889 // need to cast to int, otherwise the printf overwrites
890 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
891 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(int)fInputHandler->GetTree()->GetTree()->GetReadEntry());
892 if(fESD)Printf("ESDEvent GetEventNumberInFile(): %d",fESD->GetEventNumberInFile());
893 // aodH->SetFillAOD(kTRUE);
894 fAOD->GetHeader()->Print();
895 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
896 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
897 AliAODTrack *tr = fAOD->GetTrack(it);
898 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
902 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
910 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
911 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
912 if(TMath::Abs(etaRec)<fRecEtaWindow){
913 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
914 fh1PtRecIn[ir]->Fill(ptRec,eventW);
915 // fill the fragmentation function
916 for(int it = 0;it<recParticles.GetEntries();++it){
917 AliVParticle *part = (AliVParticle*)recParticles.At(it);
918 Float_t eta = part->Eta();
919 if(TMath::Abs(eta)<0.9){
920 Float_t phi = part->Phi();
921 if(phi<0)phi+=TMath::Pi()*2.;
922 Float_t dPhi = phi - phiRec;
923 Float_t dEta = eta - etaRec;
924 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
925 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
926 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
927 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
929 if(recJets[ir].DeltaR(part)<radiusRec){
930 Float_t z = part->Pt()/ptRec;
931 Float_t lnz = -1.*TMath::Log(z);
932 fh2FragRec[ir]->Fill(z,ptRec,eventW);
933 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
940 Int_t ig = iGenIndex[ir];
941 if(ig>=0 && ig<nGenJets){
942 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
943 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
944 Double_t ptGen = genJets[ig].Pt();
945 Double_t phiGen = genJets[ig].Phi();
946 if(phiGen<0)phiGen+=TMath::Pi()*2.;
947 Double_t etaGen = genJets[ig].Eta();
949 container[3] = ptGen;
950 container[4] = etaGen;
951 container[5] = phiGen;
954 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
957 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
958 if(TMath::Abs(etaRec)<fRecEtaWindow){
959 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
960 fhnCorrelation->Fill(container);
961 }// if etarec in window
964 ////////////////////////////////////////////////////
968 }// loop over reconstructed jets
971 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
972 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
973 PostData(1, fHistList);
977 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
979 // Create the particle container for the correction framework manager and
982 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
983 const Double_t kPtmin = 0.0, kPtmax = 160.; // we do not want to have empty bins at the beginning...
984 const Double_t kEtamin = -3.0, kEtamax = 3.0;
985 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
987 // can we neglect migration in eta and phi?
988 // phi should be no problem since we cover full phi and are phi symmetric
989 // eta migration is more difficult due to needed acceptance correction
990 // in limited eta range
993 //arrays for the number of bins in each dimension
995 iBin[0] = 160; //bins in pt
996 iBin[1] = 1; //bins in eta
997 iBin[2] = 1; // bins in phi
999 //arrays for lower bounds :
1000 Double_t* binEdges[kNvar];
1001 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1002 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1004 //values for bin lower bounds
1005 // 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);
1006 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1007 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1008 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1011 for(int i = 0;i < kMaxStep*2;++i){
1012 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d"),kNvar,iBin);
1013 for (int k=0; k<kNvar; k++) {
1014 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1017 //create correlation matrix for unfolding
1018 Int_t thnDim[2*kNvar];
1019 for (int k=0; k<kNvar; k++) {
1020 //first half : reconstructed
1022 thnDim[k] = iBin[k];
1023 thnDim[k+kNvar] = iBin[k];
1026 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1027 for (int k=0; k<kNvar; k++) {
1028 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1029 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1031 fhnCorrelation->Sumw2();
1033 // Add a histogram for Fake jets
1034 // thnDim[3] = AliPID::kSPECIES;
1035 // fFakeElectrons = new THnSparseF("fakeEkectrons", "Output for Fake Electrons", kNvar + 1, thnDim);
1036 // for(Int_t idim = 0; idim < kNvar; idim++)
1037 // fFakeElectrons->SetBinEdges(idim, binEdges[idim]);
1038 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1039 delete [] binEdges[ivar];
1043 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1045 // Terminate analysis
1047 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1051 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1053 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1056 if(type==kTrackAOD){
1057 AliAODEvent *aod = 0;
1058 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1059 else aod = AODEvent();
1063 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1064 AliAODTrack *tr = aod->GetTrack(it);
1065 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1066 if(TMath::Abs(tr->Eta())>0.9)continue;
1069 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1070 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
1073 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1075 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1085 else if (type == kTrackKineAll||type == kTrackKineCharged){
1086 AliMCEvent* mcEvent = MCEvent();
1087 if(!mcEvent)return iCount;
1088 // we want to have alivpartilces so use get track
1089 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1090 if(!mcEvent->IsPhysicalPrimary(it))continue;
1091 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1092 if(type == kTrackKineAll){
1096 else if(type == kTrackKineCharged){
1097 if(part->Particle()->GetPDG()->Charge()==0)continue;
1103 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1104 AliAODEvent *aod = 0;
1105 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1106 else aod = AODEvent();
1107 if(!aod)return iCount;
1108 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1109 if(!tca)return iCount;
1110 for(int it = 0;it < tca->GetEntriesFast();++it){
1111 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1112 if(!part->IsPhysicalPrimary())continue;
1113 if(type == kTrackAODMCAll){
1117 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1118 if(part->Charge()==0)continue;
1119 if(kTrackAODMCCharged){
1123 if(TMath::Abs(part->Eta())>0.9)continue;