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),
85 fDeltaPhiWindow(20./180.*TMath::Pi()),
94 fh1SumPtTrackRec(0x0),
95 fh1SumPtTrackAreaRec(0x0),
97 fh1PtJetsLeadingRecIn(0x0),
98 fh1PtTracksRecIn(0x0),
99 fh1PtTracksLeadingRecIn(0x0),
100 fh1PtTracksGenIn(0x0),
102 fh2NRecTracksPt(0x0),
103 fh2JetsLeadingPhiEta(0x0),
104 fh2JetsLeadingPhiPt(0x0),
105 fh2TracksLeadingPhiEta(0x0),
106 fh2TracksLeadingPhiPt(0x0),
107 fh2TracksLeadingJetPhiPt(0x0),
108 fh2DijetDeltaPhiPt(0x0),
110 fh2DijetAsymPtCut(0x0),
111 fh2DijetDeltaPhiDeltaEta(0x0),
112 fh2DijetPt2vsPt1(0x0),
113 fh2DijetDifvsSum(0x0),
115 fh1DijetMinvCut(0x0),
118 for(int i = 0;i < kMaxStep*2;++i){
119 fhnJetContainer[i] = 0;
121 for(int i = 0;i < kMaxJets;++i){
122 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
123 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
128 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
129 AliAnalysisTaskSE(name),
136 fUseAODJetInput(kFALSE),
137 fUseAODTrackInput(kFALSE),
138 fUseAODMCInput(kFALSE),
139 fUseGlobalSelection(kFALSE),
140 fUseExternalWeightOnly(kFALSE),
141 fLimitGenJetEta(kFALSE),
144 fTrackTypeRec(kTrackUndef),
145 fTrackTypeGen(kTrackUndef),
149 fDeltaPhiWindow(20./180.*TMath::Pi()),
154 fh1PtHardTrials(0x0),
158 fh1SumPtTrackRec(0x0),
159 fh1SumPtTrackAreaRec(0x0),
161 fh1PtJetsLeadingRecIn(0x0),
162 fh1PtTracksRecIn(0x0),
163 fh1PtTracksLeadingRecIn(0x0),
164 fh1PtTracksGenIn(0x0),
166 fh2NRecTracksPt(0x0),
167 fh2JetsLeadingPhiEta(0x0),
168 fh2JetsLeadingPhiPt(0x0),
169 fh2TracksLeadingPhiEta(0x0),
170 fh2TracksLeadingPhiPt(0x0),
171 fh2TracksLeadingJetPhiPt(0x0),
172 fh2DijetDeltaPhiPt(0x0),
174 fh2DijetAsymPtCut(0x0),
175 fh2DijetDeltaPhiDeltaEta(0x0),
176 fh2DijetPt2vsPt1(0x0),
177 fh2DijetDifvsSum(0x0),
179 fh1DijetMinvCut(0x0),
183 for(int i = 0;i < kMaxStep*2;++i){
184 fhnJetContainer[i] = 0;
186 for(int i = 0;i < kMaxJets;++i){
187 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
188 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
190 DefineOutput(1, TList::Class());
195 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
198 // Implemented Notify() to read the cross sections
199 // and number of trials from pyxsec.root
202 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
203 Float_t xsection = 0;
208 TFile *curfile = tree->GetCurrentFile();
210 Error("Notify","No current file");
213 if(!fh1Xsec||!fh1Trials){
214 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
217 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
218 fh1Xsec->Fill("<#sigma>",xsection);
219 // construct a poor man average trials
220 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
221 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
226 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
230 // Create the output container
240 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
243 if(!fHistList)fHistList = new TList();
244 fHistList->SetOwner(kTRUE);
245 Bool_t oldStatus = TH1::AddDirectoryStatus();
246 TH1::AddDirectory(kFALSE);
251 const Int_t nBinPt = 100;
252 Double_t binLimitsPt[nBinPt+1];
253 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
255 binLimitsPt[iPt] = 0.0;
258 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
262 const Int_t nBinPhi = 90;
263 Double_t binLimitsPhi[nBinPhi+1];
264 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
266 binLimitsPhi[iPhi] = -1.*TMath::Pi();
269 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
275 const Int_t nBinEta = 40;
276 Double_t binLimitsEta[nBinEta+1];
277 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
279 binLimitsEta[iEta] = -2.0;
282 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
286 const Int_t nBinFrag = 25;
289 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
290 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
292 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
293 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
295 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
296 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
297 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
299 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
300 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
302 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
303 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
304 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);
306 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
307 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
308 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
309 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
310 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
312 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
313 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
316 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
317 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
318 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
319 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
320 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
321 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
322 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
323 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
325 for(int ij = 0;ij < kMaxJets;++ij){
326 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
327 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
329 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
330 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
332 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
333 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
336 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",
337 nBinFrag,0.,1.,nBinPt,binLimitsPt);
338 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",
339 nBinFrag,0.,10.,nBinPt,binLimitsPt);
341 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",
342 nBinFrag,0.,1.,nBinPt,binLimitsPt);
343 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",
344 nBinFrag,0.,10.,nBinPt,binLimitsPt);
349 fh2DijetDeltaPhiPt = new TH2F("fh2DeltaPhiPt","Difference in the azimuthal angle;#Delta#phi;p_{T,1};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
350 fh2DijetAsymPt = new TH2F("fh2DijetAsym","Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
351 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);
352 fh2DijetDeltaPhiDeltaEta = new TH2F("fh2DijetDeltaPhiDeltaEta","Difference in the azimuthal angle;#Delta#phi;Entries",180,0.,TMath::Pi(),20,-2.,2.);
353 fh2DijetPt2vsPt1 = new TH2F("fh2DijetPt2vsPt1","Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
354 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.);
355 fh1DijetMinv = new TH1F("fh1DijetMinv","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
356 fh1DijetMinvCut = new TH1F("fh1DijetMinvCut","Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
361 const Int_t saveLevel = 3; // large save level more histos
363 fHistList->Add(fh1Xsec);
364 fHistList->Add(fh1Trials);
365 fHistList->Add(fh1PtHard);
366 fHistList->Add(fh1PtHardNoW);
367 fHistList->Add(fh1PtHardTrials);
368 if(fBranchGen.Length()>0){
369 fHistList->Add(fh1NGenJets);
370 fHistList->Add(fh1PtTracksGenIn);
372 fHistList->Add(fh1PtJetsRecIn);
373 fHistList->Add(fh1PtJetsLeadingRecIn);
374 fHistList->Add(fh1PtTracksRecIn);
375 fHistList->Add(fh1PtTracksLeadingRecIn);
376 fHistList->Add(fh1NRecJets);
377 fHistList->Add(fh1PtTrackRec);
378 fHistList->Add(fh1SumPtTrackRec);
379 fHistList->Add(fh1SumPtTrackAreaRec);
380 fHistList->Add(fh2NRecJetsPt);
381 fHistList->Add(fh2NRecTracksPt);
382 fHistList->Add(fh2JetsLeadingPhiEta );
383 fHistList->Add(fh2JetsLeadingPhiPt );
384 fHistList->Add(fh2TracksLeadingPhiEta);
385 fHistList->Add(fh2TracksLeadingPhiPt);
386 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
387 for(int ij = 0;ij<kMaxJets;++ij){
388 fHistList->Add( fh1PtRecIn[ij]);
389 if(fBranchGen.Length()>0){
390 fHistList->Add( fh1PtGenIn[ij]);
391 fHistList->Add( fh2FragGen[ij]);
392 fHistList->Add( fh2FragLnGen[ij]);
394 fHistList->Add( fh2PhiPt[ij]);
395 fHistList->Add( fh2PhiEta[ij]);
396 fHistList->Add( fh2FragRec[ij]);
397 fHistList->Add( fh2FragLnRec[ij]);
399 fHistList->Add(fhnCorrelation);
402 fHistList->Add(fh2DijetDeltaPhiPt);
403 fHistList->Add(fh2DijetAsymPt);
404 fHistList->Add(fh2DijetAsymPtCut);
405 fHistList->Add(fh2DijetDeltaPhiDeltaEta);
406 fHistList->Add(fh2DijetPt2vsPt1);
407 fHistList->Add(fh2DijetDifvsSum);
408 fHistList->Add(fh1DijetMinv);
409 fHistList->Add(fh1DijetMinvCut);
412 // =========== Switch on Sumw2 for all histos ===========
413 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
414 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
419 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
422 TH1::AddDirectory(oldStatus);
425 void AliAnalysisTaskJetSpectrum2::Init()
431 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
435 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
438 if(!AliAnalysisHelperJetTasks::Selected()&&fUseGlobalSelection){
439 // no selection by the service task, we continue
440 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
441 PostData(1, fHistList);
446 // Execute analysis for current event
448 AliESDEvent *fESD = 0;
450 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
452 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
458 // assume that the AOD is in the general output...
461 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
465 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
472 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
475 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
478 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
482 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
483 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
485 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
489 // ==== General variables needed
492 // We use statice array, not to fragment the memory
493 AliAODJet genJets[kMaxJets];
495 AliAODJet recJets[kMaxJets];
497 ///////////////////////////
502 Double_t nTrials = 1; // Trials for MC trigger
504 if(fUseExternalWeightOnly){
505 eventW = fExternalWeight;
508 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
509 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
510 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
511 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
512 // this is the part we only use when we have MC information
513 AliMCEvent* mcEvent = MCEvent();
514 // AliStack *pStack = 0;
516 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
519 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
522 nTrials = pythiaGenHeader->Trials();
523 ptHard = pythiaGenHeader->GetPtHard();
524 int iProcessType = pythiaGenHeader->ProcessType();
526 // 12 f+barf -> f+barf
531 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
532 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
534 // fetch the pythia generated jets only to be used here
535 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
536 AliAODJet pythiaGenJets[kMaxJets];
537 for(int ip = 0;ip < nPythiaGenJets;++ip){
538 if(iCount>=kMaxJets)continue;
540 pythiaGenHeader->TriggerJet(ip,p);
541 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
545 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
546 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
550 if(fBranchGen.Length()==0){
551 // if we have MC particles and we do not read from the aod branch
552 // use the pythia jets
553 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
558 if(fBranchGen.Length()==0)nGenJets = iCount;
559 }// (fAnalysisType&kMCESD)==kMCESD)
562 // we simply fetch the tracks/mc particles as a list of AliVParticles
570 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
571 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
572 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
573 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
576 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
577 fh1PtHard->Fill(ptHard,eventW);
578 fh1PtHardNoW->Fill(ptHard,1);
579 fh1PtHardTrials->Fill(ptHard,nTrials);
581 // If we set a second branch for the input jets fetch this
582 if(fBranchGen.Length()>0){
583 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
586 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
587 if(iCount>=kMaxJets)continue;
588 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
592 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
593 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
596 genJets[iCount] = *tmp;
602 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
603 if(fDebug>2)fAOD->Print();
607 fh1NGenJets->Fill(nGenJets);
608 // We do not want to exceed the maximum jet number
609 nGenJets = TMath::Min(nGenJets,kMaxJets);
611 // Fetch the reconstructed jets...
613 nRecJets = aodRecJets->GetEntries();
615 nRecJets = aodRecJets->GetEntries();
616 fh1NRecJets->Fill(nRecJets);
618 // Do something with the all rec jets
619 Int_t nRecOver = nRecJets;
621 // check that the jets are sorted
622 Float_t ptOld = 999999;
623 for(int ir = 0;ir < nRecJets;ir++){
624 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
625 Float_t tmpPt = tmp->Pt();
627 Printf("%s:%d Jets Not Sorted!! %d:%.3E %d%.3E",(char*)__FILE__,__LINE__,ir,tmpPt,ir-1,ptOld);
634 TIterator *recIter = aodRecJets->MakeIterator();
635 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
636 Float_t pt = tmpRec->Pt();
638 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
639 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
640 while(pt<ptCut&&tmpRec){
642 tmpRec = (AliAODJet*)(recIter->Next());
647 if(nRecOver<=0)break;
648 fh2NRecJetsPt->Fill(ptCut,nRecOver);
652 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
653 Float_t phi = leading->Phi();
654 if(phi<0)phi+=TMath::Pi()*2.;
655 Float_t eta = leading->Eta();
657 while((tmpRec = (AliAODJet*)(recIter->Next()))){
658 Float_t tmpPt = tmpRec->Pt();
659 fh1PtJetsRecIn->Fill(tmpPt);
661 fh1PtJetsLeadingRecIn->Fill(tmpPt);
665 Float_t tmpPhi = tmpRec->Phi();
667 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
668 Float_t dPhi = phi - tmpRec->Phi();
669 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
670 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
671 Float_t dEta = eta - tmpRec->Eta();
672 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
673 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
678 Int_t nTrackOver = recParticles.GetSize();
679 // do the same for tracks and jets
681 TIterator *recIter = recParticles.MakeIterator();
682 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
683 Float_t pt = tmpRec->Pt();
684 // Printf("Leading track p_t %3.3E",pt);
685 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
686 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
687 while(pt<ptCut&&tmpRec){
689 tmpRec = (AliVParticle*)(recIter->Next());
694 if(nTrackOver<=0)break;
695 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
699 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
700 Float_t phi = leading->Phi();
701 if(phi<0)phi+=TMath::Pi()*2.;
702 Float_t eta = leading->Eta();
704 while((tmpRec = (AliVParticle*)(recIter->Next()))){
705 Float_t tmpPt = tmpRec->Pt();
706 fh1PtTracksRecIn->Fill(tmpPt);
708 fh1PtTracksLeadingRecIn->Fill(tmpPt);
712 Float_t tmpPhi = tmpRec->Phi();
714 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
715 Float_t dPhi = phi - tmpRec->Phi();
716 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
717 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
718 Float_t dEta = eta - tmpRec->Eta();
719 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
720 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
725 if(genParticles.GetSize()){
726 TIterator *genIter = genParticles.MakeIterator();
727 AliVParticle *tmpGen = 0;
728 while((tmpGen = (AliVParticle*)(genIter->Next()))){
729 if(TMath::Abs(tmpGen->Eta())<0.9){
730 Float_t tmpPt = tmpGen->Pt();
731 fh1PtTracksGenIn->Fill(tmpPt);
737 nRecJets = TMath::Min(nRecJets,kMaxJets);
739 for(int ir = 0;ir < nRecJets;++ir){
740 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
746 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
748 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
749 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
752 for(int i = 0;i<kMaxJets;++i){
753 iGenIndex[i] = iRecIndex[i] = -1;
756 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
757 iGenIndex,iRecIndex,fDebug);
758 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
761 for(int i = 0;i<kMaxJets;++i){
762 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
763 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
770 Double_t container[6];
772 // loop over generated jets
774 // radius; tmp, get from the jet header itself
775 // at some point, how todeal woht FastJet on MC?
776 Float_t radiusGen =0.4;
777 Float_t radiusRec =0.4;
779 for(int ig = 0;ig < nGenJets;++ig){
780 Double_t ptGen = genJets[ig].Pt();
781 Double_t phiGen = genJets[ig].Phi();
782 if(phiGen<0)phiGen+=TMath::Pi()*2.;
783 Double_t etaGen = genJets[ig].Eta();
785 container[3] = ptGen;
786 container[4] = etaGen;
787 container[5] = phiGen;
788 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
789 Int_t ir = iRecIndex[ig];
791 if(TMath::Abs(etaGen)<fRecEtaWindow){
792 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
793 fh1PtGenIn[ig]->Fill(ptGen,eventW);
794 // fill the fragmentation function
795 for(int it = 0;it<genParticles.GetEntries();++it){
796 AliVParticle *part = (AliVParticle*)genParticles.At(it);
797 if(genJets[ig].DeltaR(part)<radiusGen){
798 Float_t z = part->Pt()/ptGen;
799 Float_t lnz = -1.*TMath::Log(z);
800 fh2FragGen[ig]->Fill(z,ptGen,eventW);
801 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
804 if(ir>=0&&ir<nRecJets){
805 fhnJetContainer[kStep3]->Fill(&container[3],eventW);
809 if(ir>=0&&ir<nRecJets){
810 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
811 Double_t etaRec = recJets[ir].Eta();
812 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
814 }// loop over generated jets
818 for(int it = 0;it<recParticles.GetEntries();++it){
819 AliVParticle *part = (AliVParticle*)recParticles.At(it);
820 // fill sum pt and P_t of all paritles
821 if(TMath::Abs(part->Eta())<0.9){
822 Float_t pt = part->Pt();
823 fh1PtTrackRec->Fill(pt,eventW);
827 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
828 fh1SumPtTrackRec->Fill(sumPt,eventW);
831 // loop over reconstructed jets
832 for(int ir = 0;ir < nRecJets;++ir){
833 Double_t etaRec = recJets[ir].Eta();
834 Double_t ptRec = recJets[ir].Pt();
835 Double_t phiRec = recJets[ir].Phi();
836 if(phiRec<0)phiRec+=TMath::Pi()*2.;
839 // do something with dijets...
841 Double_t etaRec1 = recJets[0].Eta();
842 Double_t ptRec1 = recJets[0].Pt();
843 Double_t phiRec1 = recJets[0].Phi();
844 if(phiRec1<0)phiRec1+=TMath::Pi()*2.;
847 if(TMath::Abs(etaRec1)<fRecEtaWindow
848 &&TMath::Abs(etaRec)<fRecEtaWindow){
850 Float_t deltaPhi = phiRec1 - phiRec;
852 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
853 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
854 deltaPhi = TMath::Abs(deltaPhi);
855 fh2DijetDeltaPhiPt->Fill(deltaPhi,ptRec1);
856 Float_t asym = (ptRec1-ptRec)/(ptRec1+ptRec);
857 fh2DijetAsymPt->Fill(asym,ptRec1);
858 fh2DijetDeltaPhiDeltaEta->Fill(deltaPhi,etaRec1-etaRec);
859 fh2DijetPt2vsPt1->Fill(ptRec1,ptRec);
860 fh2DijetDifvsSum->Fill(ptRec1+ptRec,ptRec1-ptRec);
861 Float_t minv = 2.*(recJets[0].P()*recJets[1].P()-
862 recJets[0].Px()*recJets[1].Px()-
863 recJets[0].Py()*recJets[1].Py()-
864 recJets[0].Pz()*recJets[1].Py());
865 minv = TMath::Sqrt(minv);
868 fh1DijetMinv->Fill(minv);
869 if((TMath::Pi()-deltaPhi)<fDeltaPhiWindow){
870 fh1DijetMinvCut->Fill(minv);
871 fh2DijetAsymPtCut->Fill(asym,ptRec1);
877 container[0] = ptRec;
878 container[1] = etaRec;
879 container[2] = phiRec;
881 if(ptRec>30.&&fDebug>0){
882 // need to cast to int, otherwise the printf overwrites
883 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
884 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(int)fInputHandler->GetTree()->GetTree()->GetReadEntry());
885 if(fESD)Printf("ESDEvent GetEventNumberInFile(): %d",fESD->GetEventNumberInFile());
886 // aodH->SetFillAOD(kTRUE);
887 fAOD->GetHeader()->Print();
888 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
889 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
890 AliAODTrack *tr = fAOD->GetTrack(it);
891 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
895 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
903 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
904 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
905 if(TMath::Abs(etaRec)<fRecEtaWindow){
906 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
907 fh1PtRecIn[ir]->Fill(ptRec,eventW);
908 // fill the fragmentation function
909 for(int it = 0;it<recParticles.GetEntries();++it){
910 AliVParticle *part = (AliVParticle*)recParticles.At(it);
911 Float_t eta = part->Eta();
912 if(TMath::Abs(eta)<0.9){
913 Float_t phi = part->Phi();
914 if(phi<0)phi+=TMath::Pi()*2.;
915 Float_t dPhi = phi - phiRec;
916 Float_t dEta = eta - etaRec;
917 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
918 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
919 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
920 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
922 if(recJets[ir].DeltaR(part)<radiusRec){
923 Float_t z = part->Pt()/ptRec;
924 Float_t lnz = -1.*TMath::Log(z);
925 fh2FragRec[ir]->Fill(z,ptRec,eventW);
926 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
933 Int_t ig = iGenIndex[ir];
934 if(ig>=0 && ig<nGenJets){
935 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
936 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
937 Double_t ptGen = genJets[ig].Pt();
938 Double_t phiGen = genJets[ig].Phi();
939 if(phiGen<0)phiGen+=TMath::Pi()*2.;
940 Double_t etaGen = genJets[ig].Eta();
942 container[3] = ptGen;
943 container[4] = etaGen;
944 container[5] = phiGen;
947 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
950 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
951 if(TMath::Abs(etaRec)<fRecEtaWindow){
952 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
953 fhnCorrelation->Fill(container);
954 }// if etarec in window
957 ////////////////////////////////////////////////////
961 }// loop over reconstructed jets
964 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
965 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
966 PostData(1, fHistList);
970 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
972 // Create the particle container for the correction framework manager and
975 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
976 const Double_t kPtmin = 0.0, kPtmax = 160.; // we do not want to have empty bins at the beginning...
977 const Double_t kEtamin = -3.0, kEtamax = 3.0;
978 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
980 // can we neglect migration in eta and phi?
981 // phi should be no problem since we cover full phi and are phi symmetric
982 // eta migration is more difficult due to needed acceptance correction
983 // in limited eta range
986 //arrays for the number of bins in each dimension
988 iBin[0] = 160; //bins in pt
989 iBin[1] = 1; //bins in eta
990 iBin[2] = 1; // bins in phi
992 //arrays for lower bounds :
993 Double_t* binEdges[kNvar];
994 for(Int_t ivar = 0; ivar < kNvar; ivar++)
995 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
997 //values for bin lower bounds
998 // 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);
999 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
1000 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1001 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
1004 for(int i = 0;i < kMaxStep*2;++i){
1005 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d"),kNvar,iBin);
1006 for (int k=0; k<kNvar; k++) {
1007 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
1010 //create correlation matrix for unfolding
1011 Int_t thnDim[2*kNvar];
1012 for (int k=0; k<kNvar; k++) {
1013 //first half : reconstructed
1015 thnDim[k] = iBin[k];
1016 thnDim[k+kNvar] = iBin[k];
1019 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
1020 for (int k=0; k<kNvar; k++) {
1021 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1022 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
1024 fhnCorrelation->Sumw2();
1026 // Add a histogram for Fake jets
1027 // thnDim[3] = AliPID::kSPECIES;
1028 // fFakeElectrons = new THnSparseF("fakeEkectrons", "Output for Fake Electrons", kNvar + 1, thnDim);
1029 // for(Int_t idim = 0; idim < kNvar; idim++)
1030 // fFakeElectrons->SetBinEdges(idim, binEdges[idim]);
1031 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1032 delete [] binEdges[ivar];
1036 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1038 // Terminate analysis
1040 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1044 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1046 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1049 if(type==kTrackAOD){
1050 AliAODEvent *aod = 0;
1051 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1052 else aod = AODEvent();
1056 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1057 AliAODTrack *tr = aod->GetTrack(it);
1058 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1059 if(TMath::Abs(tr->Eta())>0.9)continue;
1062 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
1063 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
1066 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1068 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
1078 else if (type == kTrackKineAll||type == kTrackKineCharged){
1079 AliMCEvent* mcEvent = MCEvent();
1080 if(!mcEvent)return iCount;
1081 // we want to have alivpartilces so use get track
1082 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1083 if(!mcEvent->IsPhysicalPrimary(it))continue;
1084 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1085 if(type == kTrackKineAll){
1089 else if(type == kTrackKineCharged){
1090 if(part->Particle()->GetPDG()->Charge()==0)continue;
1096 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1097 AliAODEvent *aod = 0;
1098 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1099 else aod = AODEvent();
1100 if(!aod)return iCount;
1101 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1102 if(!tca)return iCount;
1103 for(int it = 0;it < tca->GetEntriesFast();++it){
1104 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1105 if(!part->IsPhysicalPrimary())continue;
1106 if(type == kTrackAODMCAll){
1110 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1111 if(part->Charge()==0)continue;
1112 if(kTrackAODMCCharged){
1116 if(TMath::Abs(part->Eta())>0.9)continue;