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),
108 for(int i = 0;i < kMaxStep*2;++i){
109 fhnJetContainer[i] = 0;
111 for(int i = 0;i < kMaxJets;++i){
112 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
113 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
118 AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
119 AliAnalysisTaskSE(name),
126 fUseAODJetInput(kFALSE),
127 fUseAODTrackInput(kFALSE),
128 fUseAODMCInput(kFALSE),
129 fUseGlobalSelection(kFALSE),
130 fUseExternalWeightOnly(kFALSE),
131 fLimitGenJetEta(kFALSE),
134 fTrackTypeRec(kTrackUndef),
135 fTrackTypeGen(kTrackUndef),
143 fh1PtHardTrials(0x0),
147 fh1SumPtTrackRec(0x0),
148 fh1SumPtTrackAreaRec(0x0),
150 fh1PtJetsLeadingRecIn(0x0),
151 fh1PtTracksRecIn(0x0),
152 fh1PtTracksLeadingRecIn(0x0),
153 fh1PtTracksGenIn(0x0),
155 fh2NRecTracksPt(0x0),
156 fh2JetsLeadingPhiEta(0x0),
157 fh2JetsLeadingPhiPt(0x0),
158 fh2TracksLeadingPhiEta(0x0),
159 fh2TracksLeadingPhiPt(0x0),
163 for(int i = 0;i < kMaxStep*2;++i){
164 fhnJetContainer[i] = 0;
166 for(int i = 0;i < kMaxJets;++i){
167 fh2PhiPt[i] = fh2PhiEta[i] = fh2FragRec[i] = fh2FragLnRec[i] = fh2FragGen[i] = fh2FragLnGen[i] = 0;
168 fh1PtRecIn[i] = fh1PtGenIn[i] = 0;
170 DefineOutput(1, TList::Class());
175 Bool_t AliAnalysisTaskJetSpectrum2::Notify()
178 // Implemented Notify() to read the cross sections
179 // and number of trials from pyxsec.root
182 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
183 Float_t xsection = 0;
188 TFile *curfile = tree->GetCurrentFile();
190 Error("Notify","No current file");
193 if(!fh1Xsec||!fh1Trials){
194 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
197 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
198 fh1Xsec->Fill("<#sigma>",xsection);
199 // construct a poor man average trials
200 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
201 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
206 void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
210 // Create the output container
220 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
223 if(!fHistList)fHistList = new TList();
225 Bool_t oldStatus = TH1::AddDirectoryStatus();
226 TH1::AddDirectory(kFALSE);
231 const Int_t nBinPt = 100;
232 Double_t binLimitsPt[nBinPt+1];
233 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
235 binLimitsPt[iPt] = 0.0;
238 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
242 const Int_t nBinPhi = 90;
243 Double_t binLimitsPhi[nBinPhi+1];
244 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
246 binLimitsPhi[iPhi] = -1.*TMath::Pi();
249 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
255 const Int_t nBinEta = 40;
256 Double_t binLimitsEta[nBinEta+1];
257 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
259 binLimitsEta[iEta] = -2.0;
262 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 1/(Float_t)nBinEta + 0.1;
266 const Int_t nBinFrag = 25;
269 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
270 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
272 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
273 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
275 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
276 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
277 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
279 fh1NGenJets = new TH1F("fh1NGenJets","N generated jets",20,-0.5,19.5);
280 fh1NRecJets = new TH1F("fh1NRecJets","N reconstructed jets",20,-0.5,19.5);
282 fh1PtTrackRec = new TH1F("fh1PtTrackRec","Rec track P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
283 fh1SumPtTrackRec = new TH1F("fh1SumPtTrackRec","Sum Rec track P_T #eta <0.9;p_{T,sum} (GeV/c)",nBinPt,binLimitsPt);
284 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);
286 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
287 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
288 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
289 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
290 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
292 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
293 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
296 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
297 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
298 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
299 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
300 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
301 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
302 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
303 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
305 for(int ij = 0;ij < kMaxJets;++ij){
306 fh1PtRecIn[ij] = new TH1F(Form("fh1PtRecIn_j%d",ij),"rec p_T input ;p_{T,rec}",nBinPt,binLimitsPt);
307 fh1PtGenIn[ij] = new TH1F(Form("fh1PtGenIn_j%d",ij),"found p_T input ;p_{T,gen}",nBinPt,binLimitsPt);
309 fh2PhiPt[ij] = new TH2F(Form("fh2PhiPtRec_j%d",ij),"Jet pt vs delta phi;#Delta#phi;p_{T,jet}",
310 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
312 fh2PhiEta[ij] = new TH2F(Form("fh2PhiEtaRec_j%d",ij),"delta eta vs delta phi for jets;#Delta#phi;#Delta#eta",
313 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
316 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",
317 nBinFrag,0.,1.,nBinPt,binLimitsPt);
318 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",
319 nBinFrag,0.,10.,nBinPt,binLimitsPt);
321 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",
322 nBinFrag,0.,1.,nBinPt,binLimitsPt);
323 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",
324 nBinFrag,0.,10.,nBinPt,binLimitsPt);
328 const Int_t saveLevel = 3; // large save level more histos
330 fHistList->Add(fh1Xsec);
331 fHistList->Add(fh1Trials);
332 fHistList->Add(fh1PtHard);
333 fHistList->Add(fh1PtHardNoW);
334 fHistList->Add(fh1PtHardTrials);
335 if(fBranchGen.Length()>0){
336 fHistList->Add(fh1NGenJets);
337 fHistList->Add(fh1PtTracksGenIn);
339 fHistList->Add(fh1PtJetsRecIn);
340 fHistList->Add(fh1PtJetsLeadingRecIn);
341 fHistList->Add(fh1PtTracksRecIn);
342 fHistList->Add(fh1PtTracksLeadingRecIn);
343 fHistList->Add(fh1NRecJets);
344 fHistList->Add(fh1PtTrackRec);
345 fHistList->Add(fh1SumPtTrackRec);
346 fHistList->Add(fh1SumPtTrackAreaRec);
347 fHistList->Add(fh2NRecJetsPt);
348 fHistList->Add(fh2NRecTracksPt);
349 fHistList->Add(fh2JetsLeadingPhiEta );
350 fHistList->Add(fh2JetsLeadingPhiPt );
351 fHistList->Add(fh2TracksLeadingPhiEta);
352 fHistList->Add(fh2TracksLeadingPhiPt);
353 for(int i = 0;i<kMaxStep*2;++i)fHistList->Add(fhnJetContainer[i]);
354 for(int ij = 0;ij<kMaxJets;++ij){
355 fHistList->Add( fh1PtRecIn[ij]);
356 if(fBranchGen.Length()>0){
357 fHistList->Add( fh1PtGenIn[ij]);
358 fHistList->Add( fh2FragGen[ij]);
359 fHistList->Add( fh2FragLnGen[ij]);
361 fHistList->Add( fh2PhiPt[ij]);
362 fHistList->Add( fh2PhiEta[ij]);
363 fHistList->Add( fh2FragRec[ij]);
364 fHistList->Add( fh2FragLnRec[ij]);
366 fHistList->Add(fhnCorrelation);
369 // =========== Switch on Sumw2 for all histos ===========
370 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
371 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
376 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
379 TH1::AddDirectory(oldStatus);
382 void AliAnalysisTaskJetSpectrum2::Init()
388 Printf(">>> AnalysisTaskJetSpectrum2::Init() debug level %d\n",fDebug);
389 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
393 void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/)
396 if(!AliAnalysisHelperJetTasks::Selected()&&fUseGlobalSelection){
397 // no selection by the service task, we continue
398 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
399 PostData(1, fHistList);
404 // Execute analysis for current event
406 AliESDEvent *fESD = 0;
408 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
410 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODJetInput);
416 // assume that the AOD is in the general output...
419 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
423 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
430 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
433 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
436 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
440 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
441 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
443 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
447 // ==== General variables needed
450 // We use statice array, not to fragment the memory
451 AliAODJet genJets[kMaxJets];
453 AliAODJet recJets[kMaxJets];
455 ///////////////////////////
460 Double_t nTrials = 1; // Trials for MC trigger
462 if(fUseExternalWeightOnly){
463 eventW = fExternalWeight;
466 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
468 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
469 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
470 // this is the part we only use when we have MC information
471 AliMCEvent* mcEvent = MCEvent();
472 // AliStack *pStack = 0;
474 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
477 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
480 nTrials = pythiaGenHeader->Trials();
481 ptHard = pythiaGenHeader->GetPtHard();
482 int iProcessType = pythiaGenHeader->ProcessType();
484 // 12 f+barf -> f+barf
489 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
490 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
492 // fetch the pythia generated jets only to be used here
493 Int_t nPythiaGenJets = pythiaGenHeader->NTriggerJets();
494 AliAODJet pythiaGenJets[kMaxJets];
495 for(int ip = 0;ip < nPythiaGenJets;++ip){
496 if(iCount>=kMaxJets)continue;
498 pythiaGenHeader->TriggerJet(ip,p);
499 pythiaGenJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
502 if(pythiaGenJets[iCount].Eta()>fJetHeaderRec->GetJetEtaMax()||
503 pythiaGenJets[iCount].Eta()<fJetHeaderRec->GetJetEtaMin())continue;
507 if(fBranchGen.Length()==0){
508 // if we have MC particles and we do not read from the aod branch
509 // use the pythia jets
510 genJets[iCount].SetPxPyPzE(p[0],p[1],p[2],p[3]);
515 if(fBranchGen.Length()==0)nGenJets = iCount;
516 }// (fAnalysisType&kMCESD)==kMCESD)
519 // we simply fetch the tracks/mc particles as a list of AliVParticles
527 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
528 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
529 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
530 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
533 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
534 fh1PtHard->Fill(ptHard,eventW);
535 fh1PtHardNoW->Fill(ptHard,1);
536 fh1PtHardTrials->Fill(ptHard,nTrials);
538 // If we set a second branch for the input jets fetch this
539 if(fBranchGen.Length()>0){
540 TClonesArray *aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
543 for(int ig = 0;ig < aodGenJets->GetEntries();++ig){
544 if(iCount>=kMaxJets)continue;
545 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
548 if(tmp->Eta()>fJetHeaderRec->GetJetEtaMax()||
549 tmp->Eta()<fJetHeaderRec->GetJetEtaMin())continue;
551 genJets[iCount] = *tmp;
557 if(fDebug>0)Printf("%s:%d Generated jet branch %s not found",(char*)__FILE__,__LINE__,fBranchGen.Data());
558 if(fDebug>1)fAOD->Print();
562 fh1NGenJets->Fill(nGenJets);
563 // We do not want to exceed the maximum jet number
564 nGenJets = TMath::Min(nGenJets,kMaxJets);
566 // Fetch the reconstructed jets...
568 nRecJets = aodRecJets->GetEntries();
570 nRecJets = aodRecJets->GetEntries();
571 fh1NRecJets->Fill(nRecJets);
573 // Do something with the all rec jets
574 Int_t nRecOver = nRecJets;
576 // check that the jets are sorted
577 Float_t ptOld = 999999;
578 for(int ir = 0;ir < nRecJets;ir++){
579 AliAODJet *tmp = (AliAODJet*)(aodRecJets->At(ir));
580 Float_t tmpPt = tmp->Pt();
582 Printf("%s:%d Jets Not Sorted!! %d:%.3E %d%.3E",(char*)__FILE__,__LINE__,ir,tmpPt,ir-1,ptOld);
589 TIterator *recIter = aodRecJets->MakeIterator();
590 AliAODJet *tmpRec = (AliAODJet*)(recIter->Next());
591 Float_t pt = tmpRec->Pt();
593 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
594 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
595 while(pt<ptCut&&tmpRec){
597 tmpRec = (AliAODJet*)(recIter->Next());
602 if(nRecOver<=0)break;
603 fh2NRecJetsPt->Fill(ptCut,nRecOver);
607 AliAODJet *leading = (AliAODJet*)aodRecJets->At(0);
608 Float_t phi = leading->Phi();
609 if(phi<0)phi+=TMath::Pi()*2.;
610 Float_t eta = leading->Eta();
611 while((tmpRec = (AliAODJet*)(recIter->Next()))){
612 Float_t tmpPt = tmpRec->Pt();
613 fh1PtJetsRecIn->Fill(tmpPt);
615 fh1PtJetsLeadingRecIn->Fill(tmpPt);
619 Float_t tmpPhi = tmpRec->Phi();
621 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
622 Float_t dPhi = phi - tmpRec->Phi();
623 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
624 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
625 Float_t dEta = eta - tmpRec->Eta();
626 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
627 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
632 Int_t nTrackOver = recParticles.GetSize();
633 // do the same for tracks and jets
635 TIterator *recIter = recParticles.MakeIterator();
636 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
637 Float_t pt = tmpRec->Pt();
638 // Printf("Leading track p_t %3.3E",pt);
639 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
640 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
641 while(pt<ptCut&&tmpRec){
643 tmpRec = (AliVParticle*)(recIter->Next());
648 if(nTrackOver<=0)break;
649 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
653 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
654 Float_t phi = leading->Phi();
655 if(phi<0)phi+=TMath::Pi()*2.;
656 Float_t eta = leading->Eta();
657 while((tmpRec = (AliVParticle*)(recIter->Next()))){
658 Float_t tmpPt = tmpRec->Pt();
659 fh1PtTracksRecIn->Fill(tmpPt);
661 fh1PtTracksLeadingRecIn->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 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
673 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
678 if(genParticles.GetSize()){
679 TIterator *genIter = genParticles.MakeIterator();
680 AliVParticle *tmpGen = 0;
681 while((tmpGen = (AliVParticle*)(genIter->Next()))){
682 if(TMath::Abs(tmpGen->Eta())<0.9){
683 Float_t tmpPt = tmpGen->Pt();
684 fh1PtTracksGenIn->Fill(tmpPt);
690 fh1NRecJets->Fill(nRecJets);
691 nRecJets = TMath::Min(nRecJets,kMaxJets);
693 for(int ir = 0;ir < nRecJets;++ir){
694 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
700 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
702 Int_t iGenIndex[kMaxJets]; // Index of the generated jet for i-th rec -1 if none
703 Int_t iRecIndex[kMaxJets]; // Index of the rec jet for i-th gen -1 if none
706 for(int i = 0;i<kMaxJets;++i){
707 iGenIndex[i] = iRecIndex[i] = -1;
710 AliAnalysisHelperJetTasks::GetClosestJets(genJets,nGenJets,recJets,nRecJets,
711 iGenIndex,iRecIndex,fDebug);
712 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
715 for(int i = 0;i<kMaxJets;++i){
716 if(iGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,iGenIndex[i]);
717 if(iRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,iRecIndex[i]);
724 Double_t container[6];
726 // loop over generated jets
728 // radius; tmp, get from the jet header itself
729 // at some point, how todeal woht FastJet on MC?
730 Float_t radiusGen =0.4;
731 Float_t radiusRec =0.4;
733 for(int ig = 0;ig < nGenJets;++ig){
734 Double_t ptGen = genJets[ig].Pt();
735 Double_t phiGen = genJets[ig].Phi();
736 if(phiGen<0)phiGen+=TMath::Pi()*2.;
737 Double_t etaGen = genJets[ig].Eta();
739 container[3] = ptGen;
740 container[4] = etaGen;
741 container[5] = phiGen;
742 fhnJetContainer[kStep0]->Fill(&container[3],eventW);
743 Int_t ir = iRecIndex[ig];
745 if(TMath::Abs(etaGen)<fRecEtaWindow){
746 fhnJetContainer[kStep1]->Fill(&container[3],eventW);
747 fh1PtGenIn[ig]->Fill(ptGen,eventW);
748 // fill the fragmentation function
749 for(int it = 0;it<genParticles.GetEntries();++it){
750 AliVParticle *part = (AliVParticle*)genParticles.At(it);
751 if(genJets[ig].DeltaR(part)<radiusGen){
752 Float_t z = part->Pt()/ptGen;
753 Float_t lnz = -1.*TMath::Log(z);
754 fh2FragGen[ig]->Fill(z,ptGen,eventW);
755 fh2FragLnGen[ig]->Fill(lnz,ptGen,eventW);
758 if(ir>=0&&ir<nRecJets){
759 fhnJetContainer[kStep3]->Fill(&container[3],eventW);
763 if(ir>=0&&ir<nRecJets){
764 fhnJetContainer[kStep2]->Fill(&container[3],eventW);
765 Double_t etaRec = recJets[ir].Eta();
766 if(TMath::Abs(etaRec)<fRecEtaWindow)fhnJetContainer[kStep4]->Fill(&container[3],eventW);
768 }// loop over generated jets
772 for(int it = 0;it<recParticles.GetEntries();++it){
773 AliVParticle *part = (AliVParticle*)recParticles.At(it);
774 // fill sum pt and P_t of all paritles
775 if(TMath::Abs(part->Eta())<0.9){
776 Float_t pt = part->Pt();
777 fh1PtTrackRec->Fill(pt,eventW);
781 fh1SumPtTrackAreaRec->Fill(sumPt*0.4*0.4/(2.*1.8),eventW);
782 fh1SumPtTrackRec->Fill(sumPt,eventW);
785 // loop over reconstructed jets
786 for(int ir = 0;ir < nRecJets;++ir){
787 Double_t etaRec = recJets[ir].Eta();
788 Double_t ptRec = recJets[ir].Pt();
789 Double_t phiRec = recJets[ir].Phi();
790 if(phiRec<0)phiRec+=TMath::Pi()*2.;
791 container[0] = ptRec;
792 container[1] = etaRec;
793 container[2] = phiRec;
795 if(ptRec>10.&&fDebug>0){
796 // need to cast to int, otherwise the printf overwrites
797 Printf("Jet found in Event %d with p_T, %E",(int)Entry(),ptRec);
798 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),fInputHandler->GetTree()->GetReadEntry());
799 fAOD->GetHeader()->Print();
800 Printf("TriggerClasses: %s",fAOD->GetFiredTriggerClasses().Data());
801 for(int it = 0;it < fAOD->GetNumberOfTracks();++it){
802 AliAODTrack *tr = fAOD->GetTrack(it);
803 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
807 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(tr->GetID());
815 fhnJetContainer[kStep0+kMaxStep]->Fill(container,eventW);
816 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
817 if(TMath::Abs(etaRec)<fRecEtaWindow){
818 fhnJetContainer[kStep1+kMaxStep]->Fill(container,eventW);
819 fh1PtRecIn[ir]->Fill(ptRec,eventW);
820 // fill the fragmentation function
821 for(int it = 0;it<recParticles.GetEntries();++it){
822 AliVParticle *part = (AliVParticle*)recParticles.At(it);
823 Float_t eta = part->Eta();
824 if(TMath::Abs(eta)<0.9){
825 Float_t phi = part->Phi();
826 if(phi<0)phi+=TMath::Pi()*2.;
827 Float_t dPhi = phi - phiRec;
828 Float_t dEta = eta - etaRec;
829 if(dPhi<(-1.*TMath::Pi()))phiRec+=TMath::Pi()*2.;
830 fh2PhiPt[ir]->Fill(dPhi,ptRec,eventW);
831 fh2PhiEta[ir]->Fill(dPhi,dEta,eventW);
833 if(recJets[ir].DeltaR(part)<radiusRec){
834 Float_t z = part->Pt()/ptRec;
835 Float_t lnz = -1.*TMath::Log(z);
836 fh2FragRec[ir]->Fill(z,ptRec,eventW);
837 fh2FragLnRec[ir]->Fill(lnz,ptRec,eventW);
844 Int_t ig = iGenIndex[ir];
845 if(ig>=0 && ig<nGenJets){
846 fhnJetContainer[kStep2+kMaxStep]->Fill(container,eventW);
847 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
848 Double_t ptGen = genJets[ig].Pt();
849 Double_t phiGen = genJets[ig].Phi();
850 if(phiGen<0)phiGen+=TMath::Pi()*2.;
851 Double_t etaGen = genJets[ig].Eta();
853 container[3] = ptGen;
854 container[4] = etaGen;
855 container[5] = phiGen;
858 // we accept only jets which are detected within a smaller window, to avoid ambigious pair association at the edges of the acceptance
861 if(TMath::Abs(etaGen)<fRecEtaWindow)fhnJetContainer[kStep4+kMaxStep]->Fill(container,eventW);
862 if(TMath::Abs(etaRec)<fRecEtaWindow){
863 fhnJetContainer[kStep3+kMaxStep]->Fill(container,eventW);
864 fhnCorrelation->Fill(container);
865 }// if etarec in window
868 ////////////////////////////////////////////////////
872 }// loop over reconstructed jets
875 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
876 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
877 PostData(1, fHistList);
881 void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
883 // Create the particle container for the correction framework manager and
886 const Int_t kNvar = 3 ; //number of variables on the grid:pt,eta, phi
887 const Double_t kPtmin = 5.0, kPtmax = 105.; // we do not want to have empty bins at the beginning...
888 const Double_t kEtamin = -3.0, kEtamax = 3.0;
889 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
891 // can we neglect migration in eta and phi?
892 // phi should be no problem since we cover full phi and are phi symmetric
893 // eta migration is more difficult due to needed acceptance correction
894 // in limited eta range
897 //arrays for the number of bins in each dimension
899 iBin[0] = 100; //bins in pt
900 iBin[1] = 1; //bins in eta
901 iBin[2] = 1; // bins in phi
903 //arrays for lower bounds :
904 Double_t* binEdges[kNvar];
905 for(Int_t ivar = 0; ivar < kNvar; ivar++)
906 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
908 //values for bin lower bounds
909 // 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);
910 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
911 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
912 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
915 for(int i = 0;i < kMaxStep*2;++i){
916 fhnJetContainer[i] = new THnSparseF(Form("fhnJetContainer%d",i),Form("THnSparse jet info %d"),kNvar,iBin);
917 for (int k=0; k<kNvar; k++) {
918 fhnJetContainer[i]->SetBinEdges(k,binEdges[k]);
921 //create correlation matrix for unfolding
922 Int_t thnDim[2*kNvar];
923 for (int k=0; k<kNvar; k++) {
924 //first half : reconstructed
927 thnDim[k+kNvar] = iBin[k];
930 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
931 for (int k=0; k<kNvar; k++) {
932 fhnCorrelation->SetBinEdges(k,binEdges[k]);
933 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
935 fhnCorrelation->Sumw2();
937 // Add a histogram for Fake jets
938 // thnDim[3] = AliPID::kSPECIES;
939 // fFakeElectrons = new THnSparseF("fakeEkectrons", "Output for Fake Electrons", kNvar + 1, thnDim);
940 // for(Int_t idim = 0; idim < kNvar; idim++)
941 // fFakeElectrons->SetBinEdges(idim, binEdges[idim]);
944 void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
946 // Terminate analysis
948 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
952 Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
954 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
958 AliAODEvent *aod = 0;
959 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
960 else aod = AODEvent();
964 for(int it = 0;it < aod->GetNumberOfTracks();++it){
965 AliAODTrack *tr = aod->GetTrack(it);
966 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
967 if(TMath::Abs(tr->Eta())>0.9)continue;
972 else if (type == kTrackKineAll||type == kTrackKineCharged){
973 AliMCEvent* mcEvent = MCEvent();
974 if(!mcEvent)return iCount;
975 // we want to have alivpartilces so use get track
976 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
977 if(!mcEvent->IsPhysicalPrimary(it))continue;
978 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
979 if(type == kTrackKineAll){
983 else if(type == kTrackKineCharged){
984 if(part->Particle()->GetPDG()->Charge()==0)continue;
990 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
991 AliAODEvent *aod = 0;
992 if(fUseAODMCInput)dynamic_cast<AliAODEvent*>(InputEvent());
993 else aod = AODEvent();
994 if(!aod)return iCount;
995 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
996 if(!tca)return iCount;
997 for(int it = 0;it < tca->GetEntriesFast();++it){
998 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
999 if(!part->IsPhysicalPrimary())continue;
1000 if(type == kTrackAODMCAll){
1004 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1005 if(part->Charge()==0)continue;
1006 if(kTrackAODMCCharged){
1010 if(TMath::Abs(part->Eta())>0.9)continue;