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),
93 fh1SumPtTrackRec(0x0),
94 fh1SumPtTrackAreaRec(0x0),
96 fh1PtJetsLeadingRecIn(0x0),
97 fh1PtTracksRecIn(0x0),
98 fh1PtTracksLeadingRecIn(0x0),
99 fh1PtTracksGenIn(0x0),
101 fh2NRecTracksPt(0x0),
102 fh2JetsLeadingPhiEta(0x0),
103 fh2JetsLeadingPhiPt(0x0),
104 fh2TracksLeadingPhiEta(0x0),
105 fh2TracksLeadingPhiPt(0x0),
106 fh2TracksLeadingJetPhiPt(0x0),
109 for(int i = 0;i < kMaxStep*2;++i){
110 fhnJetContainer[i] = 0;
112 for(int i = 0;i < kMaxJets;++i){
113 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
114 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
119 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
120 AliAnalysisTaskSE(name),
127 fUseAODJetInput(kFALSE),
128 fUseAODTrackInput(kFALSE),
129 fUseAODMCInput(kFALSE),
130 fUseGlobalSelection(kFALSE),
131 fUseExternalWeightOnly(kFALSE),
132 fLimitGenJetEta(kFALSE),
135 fTrackTypeRec(kTrackUndef),
136 fTrackTypeGen(kTrackUndef),
144 fh1PtHardTrials(0x0),
148 fh1SumPtTrackRec(0x0),
149 fh1SumPtTrackAreaRec(0x0),
151 fh1PtJetsLeadingRecIn(0x0),
152 fh1PtTracksRecIn(0x0),
153 fh1PtTracksLeadingRecIn(0x0),
154 fh1PtTracksGenIn(0x0),
156 fh2NRecTracksPt(0x0),
157 fh2JetsLeadingPhiEta(0x0),
158 fh2JetsLeadingPhiPt(0x0),
159 fh2TracksLeadingPhiEta(0x0),
160 fh2TracksLeadingPhiPt(0x0),
161 fh2TracksLeadingJetPhiPt(0x0),
165 for(int i = 0;i < kMaxStep*2;++i){
166 fhnJetContainer[i] = 0;
168 for(int i = 0;i < kMaxJets;++i){
169 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
170 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
172 DefineOutput(1, TList::Class());
177 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
180 // Implemented Notify() to read the cross sections
181 // and number of trials from pyxsec.root
184 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
185 Float_t xsection = 0;
190 TFile *curfile = tree->GetCurrentFile();
192 Error("Notify","No current file");
195 if(!fh1Xsec||!fh1Trials){
196 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
199 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
200 fh1Xsec->Fill("<#sigma>",xsection);
201 // construct a poor man average trials
202 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
203 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
208 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
212 // Create the output container
222 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
225 if(!fHistList)fHistList = new TList();
226 fHistList->SetOwner(kTRUE);
227 Bool_t oldStatus = TH1::AddDirectoryStatus();
228 TH1::AddDirectory(kFALSE);
233 const Int_t nBinPt = 100;
234 Double_t binLimitsPt[nBinPt+1];
235 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
237 binLimitsPt[iPt] = 0.0;
240 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
244 const Int_t nBinPhi = 90;
245 Double_t binLimitsPhi[nBinPhi+1];
246 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
248 binLimitsPhi[iPhi] = -1.*TMath::Pi();
251 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
257 const Int_t nBinEta = 40;
258 Double_t binLimitsEta[nBinEta+1];
259 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
261 binLimitsEta[iEta] = -2.0;
264 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
268 const Int_t nBinFrag = 25;
271 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
272 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
274 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
275 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
277 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
278 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
279 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
281 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
282 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
284 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
285 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
286 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);
288 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
289 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
290 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
291 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
292 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
294 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
295 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
298 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
299 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
300 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
301 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
302 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
303 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
304 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
305 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
307 for(int ij = 0;ij < kMaxJets;++ij){
308 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
309 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
311 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
312 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
314 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
315 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
318 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",
319 nBinFrag,0.,1.,nBinPt,binLimitsPt);
320 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",
321 nBinFrag,0.,10.,nBinPt,binLimitsPt);
323 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",
324 nBinFrag,0.,1.,nBinPt,binLimitsPt);
325 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",
326 nBinFrag,0.,10.,nBinPt,binLimitsPt);
330 const Int_t saveLevel = 3; // large save level more histos
332 fHistList->Add(fh1Xsec);
333 fHistList->Add(fh1Trials);
334 fHistList->Add(fh1PtHard);
335 fHistList->Add(fh1PtHardNoW);
336 fHistList->Add(fh1PtHardTrials);
337 if(fBranchGen.Length()>0){
338 fHistList->Add(fh1NGenJets);
339 fHistList->Add(fh1PtTracksGenIn);
341 fHistList->Add(fh1PtJetsRecIn);
342 fHistList->Add(fh1PtJetsLeadingRecIn);
343 fHistList->Add(fh1PtTracksRecIn);
344 fHistList->Add(fh1PtTracksLeadingRecIn);
345 fHistList->Add(fh1NRecJets);
346 fHistList->Add(fh1PtTrackRec);
347 fHistList->Add(fh1SumPtTrackRec);
348 fHistList->Add(fh1SumPtTrackAreaRec);
349 fHistList->Add(fh2NRecJetsPt);
350 fHistList->Add(fh2NRecTracksPt);
351 fHistList->Add(fh2JetsLeadingPhiEta );
352 fHistList->Add(fh2JetsLeadingPhiPt );
353 fHistList->Add(fh2TracksLeadingPhiEta);
354 fHistList->Add(fh2TracksLeadingPhiPt);
355 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
356 for(int ij = 0;ij<kMaxJets;++ij){
357 fHistList->Add( fh1PtRecIn[ij]);
358 if(fBranchGen.Length()>0){
359 fHistList->Add( fh1PtGenIn[ij]);
360 fHistList->Add( fh2FragGen[ij]);
361 fHistList->Add( fh2FragLnGen[ij]);
363 fHistList->Add( fh2PhiPt[ij]);
364 fHistList->Add( fh2PhiEta[ij]);
365 fHistList->Add( fh2FragRec[ij]);
366 fHistList->Add( fh2FragLnRec[ij]);
368 fHistList->Add(fhnCorrelation);
371 // =========== Switch on Sumw2 for all histos ===========
372 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
373 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
378 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
381 TH1::AddDirectory(oldStatus);
384 void AliAnalysisTaskJetSpectrum2::Init()
390 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
394 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
397 if(!AliAnalysisHelperJetTasks::Selected()&&fUseGlobalSelection){
398 // no selection by the service task, we continue
399 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
400 PostData(1, fHistList);
405 // Execute analysis for current event
407 AliESDEvent *fESD = 0;
409 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
411 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
417 // assume that the AOD is in the general output...
420 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
424 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
431 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
434 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
437 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
441 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
442 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
444 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
448 // ==== General variables needed
451 // We use statice array, not to fragment the memory
452 AliAODJet genJets[kMaxJets];
454 AliAODJet recJets[kMaxJets];
456 ///////////////////////////
461 Double_t nTrials = 1; // Trials for MC trigger
463 if(fUseExternalWeightOnly){
464 eventW = fExternalWeight;
467 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
468 // if(fDebug>0)aodH->SetFillAOD(kFALSE);
469 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
470 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
471 // this is the part we only use when we have MC information
472 AliMCEvent* mcEvent = MCEvent();
473 // AliStack *pStack = 0;
475 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
478 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
481 nTrials = pythiaGenHeader->Trials();
482 ptHard = pythiaGenHeader->GetPtHard();
483 int iProcessType = pythiaGenHeader->ProcessType();
485 // 12 f+barf -> f+barf
490 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
491 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
493 // fetch the pythia generated jets only to be used here
494 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
495 AliAODJet pythiaGenJets[kMaxJets];
496 for(int ip = 0;ip < nPythiaGenJets;++ip){
497 if(iCount>=kMaxJets)continue;
499 pythiaGenHeader->TriggerJet(ip,p);
500 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
504 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
505 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
509 if(fBranchGen.Length()==0){
510 // if we have MC particles and we do not read from the aod branch
511 // use the pythia jets
512 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
517 if(fBranchGen.Length()==0)nGenJets = iCount;
518 }// (fAnalysisType&kMCESD)==kMCESD)
521 // we simply fetch the tracks/mc particles as a list of AliVParticles
529 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
530 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
531 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
532 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
535 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
536 fh1PtHard->Fill(ptHard,eventW);
537 fh1PtHardNoW->Fill(ptHard,1);
538 fh1PtHardTrials->Fill(ptHard,nTrials);
540 // If we set a second branch for the input jets fetch this
541 if(fBranchGen.Length()>0){
542 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
545 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
546 if(iCount>=kMaxJets)continue;
547 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
551 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
552 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
555 genJets[iCount] = *tmp;
561 if(fDebug>1)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
562 if(fDebug>2)fAOD->Print();
566 fh1NGenJets->Fill(nGenJets);
567 // We do not want to exceed the maximum jet number
568 nGenJets = TMath::Min(nGenJets,kMaxJets);
570 // Fetch the reconstructed jets...
572 nRecJets = aodRecJets->GetEntries();
574 nRecJets = aodRecJets->GetEntries();
575 fh1NRecJets->Fill(nRecJets);
577 // Do something with the all rec jets
578 Int_t nRecOver = nRecJets;
580 // check that the jets are sorted
581 Float_t ptOld = 999999;
582 for(int ir = 0;ir < nRecJets;ir++){
583 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
584 Float_t tmpPt = tmp->Pt();
586 Printf("%s:%d Jets Not Sorted!! %d:%.3E %d%.3E",(char*)__FILE__,__LINE__,ir,tmpPt,ir-1,ptOld);
593 TIterator *recIter = aodRecJets->MakeIterator();
594 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
595 Float_t pt = tmpRec->Pt();
597 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
598 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
599 while(pt<ptCut&&tmpRec){
601 tmpRec = (AliAODJet*)(recIter->Next());
606 if(nRecOver<=0)break;
607 fh2NRecJetsPt->Fill(ptCut,nRecOver);
611 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
612 Float_t phi = leading->Phi();
613 if(phi<0)phi+=TMath::Pi()*2.;
614 Float_t eta = leading->Eta();
616 while((tmpRec = (AliAODJet*)(recIter->Next()))){
617 Float_t tmpPt = tmpRec->Pt();
618 fh1PtJetsRecIn->Fill(tmpPt);
620 fh1PtJetsLeadingRecIn->Fill(tmpPt);
624 Float_t tmpPhi = tmpRec->Phi();
626 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
627 Float_t dPhi = phi - tmpRec->Phi();
628 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
629 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
630 Float_t dEta = eta - tmpRec->Eta();
631 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
632 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
637 Int_t nTrackOver = recParticles.GetSize();
638 // do the same for tracks and jets
640 TIterator *recIter = recParticles.MakeIterator();
641 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
642 Float_t pt = tmpRec->Pt();
643 // Printf("Leading track p_t %3.3E",pt);
644 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
645 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
646 while(pt<ptCut&&tmpRec){
648 tmpRec = (AliVParticle*)(recIter->Next());
653 if(nTrackOver<=0)break;
654 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
658 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
659 Float_t phi = leading->Phi();
660 if(phi<0)phi+=TMath::Pi()*2.;
661 Float_t eta = leading->Eta();
663 while((tmpRec = (AliVParticle*)(recIter->Next()))){
664 Float_t tmpPt = tmpRec->Pt();
665 fh1PtTracksRecIn->Fill(tmpPt);
667 fh1PtTracksLeadingRecIn->Fill(tmpPt);
671 Float_t tmpPhi = tmpRec->Phi();
673 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
674 Float_t dPhi = phi - tmpRec->Phi();
675 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
676 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
677 Float_t dEta = eta - tmpRec->Eta();
678 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
679 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
684 if(genParticles.GetSize()){
685 TIterator *genIter = genParticles.MakeIterator();
686 AliVParticle *tmpGen = 0;
687 while((tmpGen = (AliVParticle*)(genIter->Next()))){
688 if(TMath::Abs(tmpGen->Eta())<0.9){
689 Float_t tmpPt = tmpGen->Pt();
690 fh1PtTracksGenIn->Fill(tmpPt);
696 fh1NRecJets->Fill(nRecJets);
697 nRecJets = TMath::Min(nRecJets,kMaxJets);
699 for(int ir = 0;ir < nRecJets;++ir){
700 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
706 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
708 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
709 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
712 for(int i = 0;i<kMaxJets;++i){
713 iGenIndex[i] = iRecIndex[i] = -1;
716 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
717 iGenIndex,iRecIndex,fDebug);
718 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
721 for(int i = 0;i<kMaxJets;++i){
722 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
723 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
730 Double_t container[6];
732 // loop over generated jets
734 // radius; tmp, get from the jet header itself
735 // at some point, how todeal woht FastJet on MC?
736 Float_t radiusGen =0.4;
737 Float_t radiusRec =0.4;
739 for(int ig = 0;ig < nGenJets;++ig){
740 Double_t ptGen = genJets[ig].Pt();
741 Double_t phiGen = genJets[ig].Phi();
742 if(phiGen<0)phiGen+=TMath::Pi()*2.;
743 Double_t etaGen = genJets[ig].Eta();
745 container[3] = ptGen;
746 container[4] = etaGen;
747 container[5] = phiGen;
748 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
749 Int_t ir = iRecIndex[ig];
751 if(TMath::Abs(etaGen)<fRecEtaWindow){
752 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
753 fh1PtGenIn[ig]->Fill(ptGen,eventW);
754 // fill the fragmentation function
755 for(int it = 0;it<genParticles.GetEntries();++it){
756 AliVParticle *part = (AliVParticle*)genParticles.At(it);
757 if(genJets[ig].DeltaR(part)<radiusGen){
758 Float_t z = part->Pt()/ptGen;
759 Float_t lnz = -1.*TMath::Log(z);
760 fh2FragGen[ig]->Fill(z,ptGen,eventW);
761 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
764 if(ir>=0&&ir<nRecJets){
765 fhnJetContainer[kStep3]->Fill(&container[3],eventW);
769 if(ir>=0&&ir<nRecJets){
770 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
771 Double_t etaRec = recJets[ir].Eta();
772 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
774 }// loop over generated jets
778 for(int it = 0;it<recParticles.GetEntries();++it){
779 AliVParticle *part = (AliVParticle*)recParticles.At(it);
780 // fill sum pt and P_t of all paritles
781 if(TMath::Abs(part->Eta())<0.9){
782 Float_t pt = part->Pt();
783 fh1PtTrackRec->Fill(pt,eventW);
787 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
788 fh1SumPtTrackRec->Fill(sumPt,eventW);
791 // loop over reconstructed jets
792 for(int ir = 0;ir < nRecJets;++ir){
793 Double_t etaRec = recJets[ir].Eta();
794 Double_t ptRec = recJets[ir].Pt();
795 Double_t phiRec = recJets[ir].Phi();
796 if(phiRec<0)phiRec+=TMath::Pi()*2.;
797 container[0] = ptRec;
798 container[1] = etaRec;
799 container[2] = phiRec;
801 if(ptRec>10.&&fDebug>0){
802 // need to cast to int, otherwise the printf overwrites
803 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
804 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
805 // aodH->SetFillAOD(kTRUE);
806 fAOD->GetHeader()->Print();
807 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
808 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
809 AliAODTrack *tr = fAOD->GetTrack(it);
810 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
814 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
822 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
823 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
824 if(TMath::Abs(etaRec)<fRecEtaWindow){
825 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
826 fh1PtRecIn[ir]->Fill(ptRec,eventW);
827 // fill the fragmentation function
828 for(int it = 0;it<recParticles.GetEntries();++it){
829 AliVParticle *part = (AliVParticle*)recParticles.At(it);
830 Float_t eta = part->Eta();
831 if(TMath::Abs(eta)<0.9){
832 Float_t phi = part->Phi();
833 if(phi<0)phi+=TMath::Pi()*2.;
834 Float_t dPhi = phi - phiRec;
835 Float_t dEta = eta - etaRec;
836 if(dPhi<(-1.*TMath::Pi()))phiRec+=TMath::Pi()*2.;
837 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
838 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
840 if(recJets[ir].DeltaR(part)<radiusRec){
841 Float_t z = part->Pt()/ptRec;
842 Float_t lnz = -1.*TMath::Log(z);
843 fh2FragRec[ir]->Fill(z,ptRec,eventW);
844 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
851 Int_t ig = iGenIndex[ir];
852 if(ig>=0 && ig<nGenJets){
853 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
854 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
855 Double_t ptGen = genJets[ig].Pt();
856 Double_t phiGen = genJets[ig].Phi();
857 if(phiGen<0)phiGen+=TMath::Pi()*2.;
858 Double_t etaGen = genJets[ig].Eta();
860 container[3] = ptGen;
861 container[4] = etaGen;
862 container[5] = phiGen;
865 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
868 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
869 if(TMath::Abs(etaRec)<fRecEtaWindow){
870 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
871 fhnCorrelation->Fill(container);
872 }// if etarec in window
875 ////////////////////////////////////////////////////
879 }// loop over reconstructed jets
882 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
883 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
884 PostData(1, fHistList);
888 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
890 // Create the particle container for the correction framework manager and
893 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
894 const Double_t kPtmin = 5.0, kPtmax = 105.; // we do not want to have empty bins at the beginning...
895 const Double_t kEtamin = -3.0, kEtamax = 3.0;
896 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
898 // can we neglect migration in eta and phi?
899 // phi should be no problem since we cover full phi and are phi symmetric
900 // eta migration is more difficult due to needed acceptance correction
901 // in limited eta range
904 //arrays for the number of bins in each dimension
906 iBin[0] = 100; //bins in pt
907 iBin[1] = 1; //bins in eta
908 iBin[2] = 1; // bins in phi
910 //arrays for lower bounds :
911 Double_t* binEdges[kNvar];
912 for(Int_t ivar = 0; ivar < kNvar; ivar++)
913 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
915 //values for bin lower bounds
916 // 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);
917 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
918 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
919 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
922 for(int i = 0;i < kMaxStep*2;++i){
923 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d"),kNvar,iBin);
924 for (int k=0; k<kNvar; k++) {
925 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
928 //create correlation matrix for unfolding
929 Int_t thnDim[2*kNvar];
930 for (int k=0; k<kNvar; k++) {
931 //first half : reconstructed
934 thnDim[k+kNvar] = iBin[k];
937 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
938 for (int k=0; k<kNvar; k++) {
939 fhnCorrelation->SetBinEdges(k,binEdges[k]);
940 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
942 fhnCorrelation->Sumw2();
944 // Add a histogram for Fake jets
945 // thnDim[3] = AliPID::kSPECIES;
946 // fFakeElectrons = new THnSparseF("fakeEkectrons", "Output for Fake Electrons", kNvar + 1, thnDim);
947 // for(Int_t idim = 0; idim < kNvar; idim++)
948 // fFakeElectrons->SetBinEdges(idim, binEdges[idim]);
949 for(Int_t ivar = 0; ivar < kNvar; ivar++)
950 delete [] binEdges[ivar];
954 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
956 // Terminate analysis
958 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
962 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
964 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
968 AliAODEvent *aod = 0;
969 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
970 else aod = AODEvent();
974 for(int it = 0;it < aod->GetNumberOfTracks();++it){
975 AliAODTrack *tr = aod->GetTrack(it);
976 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
977 if(TMath::Abs(tr->Eta())>0.9)continue;
980 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
981 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
984 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
986 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
996 else if (type == kTrackKineAll||type == kTrackKineCharged){
997 AliMCEvent* mcEvent = MCEvent();
998 if(!mcEvent)return iCount;
999 // we want to have alivpartilces so use get track
1000 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1001 if(!mcEvent->IsPhysicalPrimary(it))continue;
1002 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1003 if(type == kTrackKineAll){
1007 else if(type == kTrackKineCharged){
1008 if(part->Particle()->GetPDG()->Charge()==0)continue;
1014 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1015 AliAODEvent *aod = 0;
1016 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1017 else aod = AODEvent();
1018 if(!aod)return iCount;
1019 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1020 if(!tca)return iCount;
1021 for(int it = 0;it < tca->GetEntriesFast();++it){
1022 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1023 if(!part->IsPhysicalPrimary())continue;
1024 if(type == kTrackAODMCAll){
1028 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1029 if(part->Charge()==0)continue;
1030 if(kTrackAODMCCharged){
1034 if(TMath::Abs(part->Eta())>0.9)continue;