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>
36 #include <TLorentzVector.h>
37 #include <TClonesArray.h>
38 #include "TDatabasePDG.h"
40 #include "AliAnalysisTaskJetCluster.h"
41 #include "AliAnalysisManager.h"
42 #include "AliJetFinder.h"
43 #include "AliJetHeader.h"
44 #include "AliJetReader.h"
45 #include "AliJetReaderHeader.h"
46 #include "AliUA1JetHeaderV1.h"
47 #include "AliESDEvent.h"
48 #include "AliAODEvent.h"
49 #include "AliAODHandler.h"
50 #include "AliAODTrack.h"
51 #include "AliAODJet.h"
52 #include "AliAODMCParticle.h"
53 #include "AliMCEventHandler.h"
54 #include "AliMCEvent.h"
56 #include "AliGenPythiaEventHeader.h"
57 #include "AliJetKineReaderHeader.h"
58 #include "AliGenCocktailEventHeader.h"
59 #include "AliInputEventHandler.h"
62 #include "fastjet/PseudoJet.hh"
63 #include "fastjet/ClusterSequenceArea.hh"
64 #include "fastjet/AreaDefinition.hh"
65 #include "fastjet/JetDefinition.hh"
66 // get info on how fastjet was configured
67 #include "fastjet/config.h"
70 ClassImp(AliAnalysisTaskJetCluster)
72 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
74 fUseAODTrackInput(kFALSE),
75 fUseAODMCInput(kFALSE),
76 fUseGlobalSelection(kFALSE),
78 fTrackTypeRec(kTrackUndef),
79 fTrackTypeGen(kTrackUndef),
84 fAlgorithm(fastjet::kt_algorithm),
85 fStrategy(fastjet::Best),
86 fRecombScheme(fastjet::BIpt_scheme),
87 fAreaType(fastjet::active_area),
95 fh1NConstLeadingRec(0x0),
97 fh1PtJetsLeadingRecIn(0x0),
98 fh1PtJetConstRec(0x0),
99 fh1PtJetConstLeadingRec(0x0),
100 fh1PtTracksRecIn(0x0),
101 fh1PtTracksLeadingRecIn(0x0),
103 fh1NConstRecRan(0x0),
104 fh1PtJetsLeadingRecInRan(0x0),
105 fh1NConstLeadingRecRan(0x0),
106 fh1PtJetsRecInRan(0x0),
107 fh1PtTracksGenIn(0x0),
109 fh2NRecTracksPt(0x0),
111 fh2NConstLeadingPt(0x0),
113 fh2LeadingJetPhiEta(0x0),
115 fh2LeadingJetEtaPt(0x0),
117 fh2LeadingTrackEtaPt(0x0),
118 fh2JetsLeadingPhiEta(0x0),
119 fh2JetsLeadingPhiPt(0x0),
120 fh2TracksLeadingPhiEta(0x0),
121 fh2TracksLeadingPhiPt(0x0),
122 fh2TracksLeadingJetPhiPt(0x0),
123 fh2JetsLeadingPhiPtW(0x0),
124 fh2TracksLeadingPhiPtW(0x0),
125 fh2TracksLeadingJetPhiPtW(0x0),
126 fh2NRecJetsPtRan(0x0),
128 fh2NConstLeadingPtRan(0x0),
129 fh2TracksLeadingJetPhiPtRan(0x0),
130 fh2TracksLeadingJetPhiPtWRan(0x0),
136 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
137 AliAnalysisTaskSE(name),
139 fUseAODTrackInput(kFALSE),
140 fUseAODMCInput(kFALSE),
141 fUseGlobalSelection(kFALSE),
143 fTrackTypeRec(kTrackUndef),
144 fTrackTypeGen(kTrackUndef),
149 fAlgorithm(fastjet::kt_algorithm),
150 fStrategy(fastjet::Best),
151 fRecombScheme(fastjet::BIpt_scheme),
152 fAreaType(fastjet::active_area),
157 fh1PtHardTrials(0x0),
160 fh1NConstLeadingRec(0x0),
162 fh1PtJetsLeadingRecIn(0x0),
163 fh1PtJetConstRec(0x0),
164 fh1PtJetConstLeadingRec(0x0),
165 fh1PtTracksRecIn(0x0),
166 fh1PtTracksLeadingRecIn(0x0),
168 fh1NConstRecRan(0x0),
169 fh1PtJetsLeadingRecInRan(0x0),
170 fh1NConstLeadingRecRan(0x0),
171 fh1PtJetsRecInRan(0x0),
172 fh1PtTracksGenIn(0x0),
174 fh2NRecTracksPt(0x0),
176 fh2NConstLeadingPt(0x0),
178 fh2LeadingJetPhiEta(0x0),
180 fh2LeadingJetEtaPt(0x0),
182 fh2LeadingTrackEtaPt(0x0),
183 fh2JetsLeadingPhiEta(0x0),
184 fh2JetsLeadingPhiPt(0x0),
185 fh2TracksLeadingPhiEta(0x0),
186 fh2TracksLeadingPhiPt(0x0),
187 fh2TracksLeadingJetPhiPt(0x0),
188 fh2JetsLeadingPhiPtW(0x0),
189 fh2TracksLeadingPhiPtW(0x0),
190 fh2TracksLeadingJetPhiPtW(0x0),
191 fh2NRecJetsPtRan(0x0),
193 fh2NConstLeadingPtRan(0x0),
194 fh2TracksLeadingJetPhiPtRan(0x0),
195 fh2TracksLeadingJetPhiPtWRan(0x0),
198 DefineOutput(1, TList::Class());
203 Bool_t AliAnalysisTaskJetCluster::Notify()
206 // Implemented Notify() to read the cross sections
207 // and number of trials from pyxsec.root
212 void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
216 // Create the output container
223 if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
226 if(!fHistList)fHistList = new TList();
228 Bool_t oldStatus = TH1::AddDirectoryStatus();
229 TH1::AddDirectory(kFALSE);
234 const Int_t nBinPt = 200;
235 Double_t binLimitsPt[nBinPt+1];
236 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
238 binLimitsPt[iPt] = 0.0;
241 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 0.5;
245 const Int_t nBinPhi = 90;
246 Double_t binLimitsPhi[nBinPhi+1];
247 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
249 binLimitsPhi[iPhi] = -1.*TMath::Pi();
252 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
258 const Int_t nBinEta = 40;
259 Double_t binLimitsEta[nBinEta+1];
260 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
262 binLimitsEta[iEta] = -2.0;
265 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
270 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
271 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
273 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
274 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
277 fh1NJetsRec = new TH1F("fh1NJetsRec","N reconstructed jets",120,-0.5,119.5);
278 fh1NJetsRecRan = new TH1F("fh1NJetsRecRan","N reconstructed jets",120,-0.5,119.5);
280 fh1NConstRec = new TH1F("fh1NConstRec","# jet constituents",120,-0.5,119.5);
281 fh1NConstRecRan = new TH1F("fh1NConstRecRan","# jet constituents",120,-0.5,119.5);
282 fh1NConstLeadingRec = new TH1F("fh1NConstLeadingRec","jet constituents",120,-0.5,119.5);
283 fh1NConstLeadingRecRan = new TH1F("fh1NConstLeadingRecRan","jet constituents",120,-0.5,119.5);
286 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
287 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
288 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
290 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
291 fh1PtJetsRecInRan = new TH1F("fh1PtJetsRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
292 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
293 fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
294 fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
295 fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
296 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
297 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
298 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
300 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
301 fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
302 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
306 fh2NConstPt = new TH2F("fh2NConstPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
307 fh2NConstLeadingPt = new TH2F("fh2NConstLeadingPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
308 fh2NConstPtRan = new TH2F("fh2NConstPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
309 fh2NConstLeadingPtRan = new TH2F("fh2NConstLeadingPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
311 fh2JetPhiEta = new TH2F("fh2JetPhiEta","eta vs phi all jets;#phi;#eta",
312 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
313 fh2LeadingJetPhiEta = new TH2F("fh2LeadingJetPhiEta","eta vs phi leading jets;#phi;#eta",
314 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
316 fh2JetEtaPt = new TH2F("fh2JetEtaPt","pt vs eta all jets;#eta;p_{T}",
317 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
318 fh2LeadingJetEtaPt = new TH2F("fh2LeadingJetEtaPt","pT vs eta leading jets;#eta;p_{T}",
319 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
321 fh2TrackEtaPt = new TH2F("fh2TrackEtaPt","pt vs eta all jets;#eta;p_{T}",
322 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
323 fh2LeadingTrackEtaPt = new TH2F("fh2LeadingTrackEtaPt","pT vs eta leading jets;#eta;p_{T}",
324 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
328 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
329 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
330 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
331 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
332 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
333 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
334 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
335 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
336 fh2TracksLeadingJetPhiPt = new TH2F("fh2TracksLeadingJetPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
337 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
338 fh2TracksLeadingJetPhiPtRan = new TH2F("fh2TracksLeadingJetPhiPtRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
339 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
341 fh2JetsLeadingPhiPtW = new TH2F("fh2JetsLeadingPhiPtW","leading p_T vs delta phi p_T weigted to leading jet;#Delta#phi;p_{T} (GeV/c)",
342 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
343 fh2TracksLeadingPhiPtW = new TH2F("fh2TracksLeadingPhiPtW","leading p_T vs delta phi to leading jet (p_T weighted);#Delta#phi;p_{T} (GeV/c)",
344 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
346 fh2TracksLeadingJetPhiPtW = new TH2F("fh2TracksLeadingJetPhiPtW","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
347 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
348 fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
349 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
353 const Int_t saveLevel = 3; // large save level more histos
355 fHistList->Add(fh1Xsec);
356 fHistList->Add(fh1Trials);
358 fHistList->Add(fh1NJetsRec);
359 fHistList->Add(fh1NConstRec);
360 fHistList->Add(fh1NConstLeadingRec);
361 fHistList->Add(fh1PtJetsRecIn);
362 fHistList->Add(fh1PtJetsLeadingRecIn);
363 fHistList->Add(fh1PtTracksRecIn);
364 fHistList->Add(fh1PtTracksLeadingRecIn);
365 fHistList->Add(fh1PtJetConstRec);
366 fHistList->Add(fh1PtJetConstLeadingRec);
367 fHistList->Add(fh1NJetsRecRan);
368 fHistList->Add(fh1NConstRecRan);
369 fHistList->Add(fh1PtJetsLeadingRecInRan);
370 fHistList->Add(fh1NConstLeadingRecRan);
371 fHistList->Add(fh1PtJetsRecInRan);
372 fHistList->Add(fh2NRecJetsPt);
373 fHistList->Add(fh2NRecTracksPt);
374 fHistList->Add(fh2NConstPt);
375 fHistList->Add(fh2NConstLeadingPt);
376 fHistList->Add(fh2JetPhiEta);
377 fHistList->Add(fh2LeadingJetPhiEta);
378 fHistList->Add(fh2JetEtaPt);
379 fHistList->Add(fh2LeadingJetEtaPt);
380 fHistList->Add(fh2TrackEtaPt);
381 fHistList->Add(fh2LeadingTrackEtaPt);
382 fHistList->Add(fh2JetsLeadingPhiEta );
383 fHistList->Add(fh2JetsLeadingPhiPt);
384 fHistList->Add(fh2TracksLeadingPhiEta);
385 fHistList->Add(fh2TracksLeadingPhiPt);
386 fHistList->Add(fh2TracksLeadingJetPhiPt);
387 fHistList->Add(fh2JetsLeadingPhiPtW);
388 fHistList->Add(fh2TracksLeadingPhiPtW);
389 fHistList->Add(fh2TracksLeadingJetPhiPtW);
390 fHistList->Add(fh2NRecJetsPtRan);
391 fHistList->Add(fh2NConstPtRan);
392 fHistList->Add(fh2NConstLeadingPtRan);
393 fHistList->Add(fh2TracksLeadingJetPhiPtRan);
394 fHistList->Add(fh2TracksLeadingJetPhiPtWRan);
397 // =========== Switch on Sumw2 for all histos ===========
398 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
399 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
404 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
407 TH1::AddDirectory(oldStatus);
410 void AliAnalysisTaskJetCluster::Init()
416 if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
420 void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
423 if(fUseGlobalSelection){
424 // no selection by the service task, we continue
425 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
426 PostData(1, fHistList);
431 // Execute analysis for current event
433 AliESDEvent *fESD = 0;
434 if(fUseAODTrackInput){
435 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
437 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
443 // assume that the AOD is in the general output...
446 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
450 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
454 Bool_t selectEvent = false;
455 Bool_t physicsSelection = true; // fInputHandler->IsEventSelected();
458 const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
459 if(vtxAOD->GetNContributors()>0){
460 Float_t zvtx = vtxAOD->GetZ();
461 Float_t yvtx = vtxAOD->GetY();
462 Float_t xvtx = vtxAOD->GetX();
463 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
464 if(TMath::Abs(zvtx)<8.&&r2<1.){
465 if(physicsSelection)selectEvent = true;
470 PostData(1, fHistList);
474 fh1Trials->Fill("#sum{ntrials}",1);
477 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
479 // ==== General variables needed
483 // we simply fetch the tracks/mc particles as a list of AliVParticles
488 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
489 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
490 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
491 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
495 vector<fastjet::PseudoJet> inputParticlesRec;
496 vector<fastjet::PseudoJet> inputParticlesRecRan;
497 for(int i = 0; i < recParticles.GetEntries(); i++){
498 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
499 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
500 // we talk total momentum here
501 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
502 jInp.set_user_index(i);
503 inputParticlesRec.push_back(jInp);
505 // the randomized input changes eta and phi, but keeps the p_T
506 Double_t pT = vp->Pt();
507 Double_t eta = 1.8 * gRandom->Rndm() - 0.9;
508 Double_t phi = 2.* TMath::Pi() * gRandom->Rndm();
511 Double_t theta = 2.*TMath::ATan(TMath::Exp(-2.*eta));
512 Double_t pZ = pT/TMath::Tan(theta);
514 Double_t pX = pT * TMath::Cos(phi);
515 Double_t pY = pT * TMath::Sin(phi);
516 Double_t p = TMath::Sqrt(pT*pT+pZ*pZ);
518 fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
519 jInpRan.set_user_index(i);
520 inputParticlesRecRan.push_back(jInpRan);
524 if(inputParticlesRec.size()==0){
525 if(fDebug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
526 PostData(1, fHistList);
531 fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
532 vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
533 fastjet::ClusterSequence clustSeq(inputParticlesRec, jetDef);
535 inclusiveJets = clustSeq.inclusive_jets();
536 sortedJets = sorted_by_pt(inclusiveJets);
538 if(fDebug)Printf("%s:%d Found %d jets",(char*)__FILE__,__LINE__, inclusiveJets.size());
540 fh1NJetsRec->Fill(sortedJets.size());
542 // loop over all jets an fill information, first on is the leading jet
544 Int_t nRecOver = inclusiveJets.size();
545 Int_t nRec = inclusiveJets.size();
546 if(inclusiveJets.size()>0){
547 AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
548 Float_t pt = leadingJet.Pt();
551 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
552 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
553 while(pt<ptCut&&iCount<nRec){
557 pt = sortedJets[iCount].perp();
560 if(nRecOver<=0)break;
561 fh2NRecJetsPt->Fill(ptCut,nRecOver);
563 Float_t phi = leadingJet.Phi();
564 if(phi<0)phi+=TMath::Pi()*2.;
565 Float_t eta = leadingJet.Eta();
566 pt = leadingJet.Pt();
568 // correlation of leading jet with tracks
569 TIterator *recIter = recParticles.MakeIterator();
570 AliVParticle *tmpRecTrack = (AliVParticle*)(recIter->Next());
573 while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
574 Float_t tmpPt = tmpRecTrack->Pt();
576 Float_t tmpPhi = tmpRecTrack->Phi();
577 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
578 Float_t dPhi = phi - tmpPhi;
579 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
580 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
581 // Float_t dEta = eta - tmpRecTrack->Eta();
582 fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
583 fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
588 for(int j = 0; j < nRec;j++){
589 AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
590 Float_t tmpPt = tmpRec.Pt();
591 fh1PtJetsRecIn->Fill(tmpPt);
592 // Fill Spectra with constituents
593 vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
594 fh1NConstRec->Fill(constituents.size());
595 fh2NConstPt->Fill(tmpPt,constituents.size());
596 // loop over constiutents and fill spectrum
597 for(unsigned int ic = 0; ic < constituents.size();ic++){
598 AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
599 fh1PtJetConstRec->Fill(part->Pt());
600 if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
604 Float_t tmpPhi = tmpRec.Phi();
605 Float_t tmpEta = tmpRec.Eta();
606 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
609 fh1PtJetsLeadingRecIn->Fill(tmpPt);
610 fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
611 fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
612 fh1NConstLeadingRec->Fill(constituents.size());
613 fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
616 fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
617 fh2JetEtaPt->Fill(tmpEta,tmpPt);
618 Float_t dPhi = phi - tmpPhi;
619 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
620 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
621 Float_t dEta = eta - tmpRec.Eta();
622 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
623 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
624 fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
630 // fill track information
631 Int_t nTrackOver = recParticles.GetSize();
632 // do the same for tracks and jets
634 TIterator *recIter = recParticles.MakeIterator();
635 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
636 Float_t pt = tmpRec->Pt();
637 // Printf("Leading track p_t %3.3E",pt);
638 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
639 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
640 while(pt<ptCut&&tmpRec){
642 tmpRec = (AliVParticle*)(recIter->Next());
647 if(nTrackOver<=0)break;
648 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
652 AliVParticle *leading = (AliVParticle*)recParticles.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 = (AliVParticle*)(recIter->Next()))){
658 Float_t tmpPt = tmpRec->Pt();
659 Float_t tmpEta = tmpRec->Eta();
660 fh1PtTracksRecIn->Fill(tmpPt);
661 fh2TrackEtaPt->Fill(tmpEta,tmpPt);
663 fh1PtTracksLeadingRecIn->Fill(tmpPt);
664 fh2LeadingTrackEtaPt->Fill(tmpEta,tmpPt);
668 Float_t tmpPhi = tmpRec->Phi();
670 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
671 Float_t dPhi = phi - tmpPhi;
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 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
676 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
677 fh2TracksLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
682 // find the random jets
683 vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
684 fastjet::ClusterSequence clustSeqRan(inputParticlesRecRan, jetDef);
686 inclusiveJetsRan = clustSeqRan.inclusive_jets();
687 sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
689 // fill the jet information from random track
691 fh1NJetsRecRan->Fill(sortedJetsRan.size());
693 // loop over all jets an fill information, first on is the leading jet
695 Int_t nRecOverRan = inclusiveJetsRan.size();
696 Int_t nRecRan = inclusiveJetsRan.size();
697 if(inclusiveJetsRan.size()>0){
698 AliAODJet leadingJet (sortedJetsRan[0].px(), sortedJetsRan[0].py(), sortedJetsRan[0].pz(), sortedJetsRan[0].E());
699 Float_t pt = leadingJet.Pt();
702 for(int i = 1;i <= fh2NRecJetsPtRan->GetNbinsX();i++){
703 Float_t ptCut = fh2NRecJetsPtRan->GetXaxis()->GetBinCenter(i);
704 while(pt<ptCut&&iCount<nRecRan){
708 pt = sortedJetsRan[iCount].perp();
711 if(nRecOverRan<=0)break;
712 fh2NRecJetsPtRan->Fill(ptCut,nRecOverRan);
714 Float_t phi = leadingJet.Phi();
715 if(phi<0)phi+=TMath::Pi()*2.;
716 pt = leadingJet.Pt();
718 // correlation of leading jet with random tracks
720 for(unsigned int ip = 0; ip < inputParticlesRecRan.size();ip++)
722 Float_t tmpPt = inputParticlesRecRan[ip].perp();
724 Float_t tmpPhi = inputParticlesRecRan[ip].phi();
725 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
726 Float_t dPhi = phi - tmpPhi;
727 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
728 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
729 // Float_t dEta = eta - tmpRecTrack->Eta();
730 fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
731 fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
736 for(int j = 0; j < nRecRan;j++){
737 AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
738 Float_t tmpPt = tmpRec.Pt();
739 fh1PtJetsRecInRan->Fill(tmpPt);
740 // Fill Spectra with constituents
741 vector<fastjet::PseudoJet> constituents = clustSeqRan.constituents(sortedJetsRan[j]);
742 fh1NConstRecRan->Fill(constituents.size());
743 fh2NConstPtRan->Fill(tmpPt,constituents.size());
746 Float_t tmpPhi = tmpRec.Phi();
747 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
750 fh1PtJetsLeadingRecInRan->Fill(tmpPt);
751 fh1NConstLeadingRecRan->Fill(constituents.size());
752 fh2NConstLeadingPtRan->Fill(tmpPt,constituents.size());
759 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
760 PostData(1, fHistList);
763 void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
765 // Terminate analysis
767 if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
771 Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
773 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
777 AliAODEvent *aod = 0;
778 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
779 else aod = AODEvent();
783 for(int it = 0;it < aod->GetNumberOfTracks();++it){
784 AliAODTrack *tr = aod->GetTrack(it);
785 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
786 if(TMath::Abs(tr->Eta())>0.9)continue;
787 // if(tr->Pt()<0.3)continue;
792 else if (type == kTrackKineAll||type == kTrackKineCharged){
793 AliMCEvent* mcEvent = MCEvent();
794 if(!mcEvent)return iCount;
795 // we want to have alivpartilces so use get track
796 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
797 if(!mcEvent->IsPhysicalPrimary(it))continue;
798 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
799 if(type == kTrackKineAll){
803 else if(type == kTrackKineCharged){
804 if(part->Particle()->GetPDG()->Charge()==0)continue;
810 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
811 AliAODEvent *aod = 0;
812 if(fUseAODMCInput)dynamic_cast<AliAODEvent*>(InputEvent());
813 else aod = AODEvent();
814 if(!aod)return iCount;
815 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
816 if(!tca)return iCount;
817 for(int it = 0;it < tca->GetEntriesFast();++it){
818 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
819 if(!part->IsPhysicalPrimary())continue;
820 if(type == kTrackAODMCAll){
824 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
825 if(part->Charge()==0)continue;
826 if(kTrackAODMCCharged){
830 if(TMath::Abs(part->Eta())>0.9)continue;
843 Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
844 for(int i = 0; i < particles.GetEntries(); i++){
845 AliVParticle *vp = (AliVParticle*)particles.At(i);
846 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
847 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->E());
848 jInp.set_user_index(i);
849 inputParticles.push_back(jInp);