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>
28 #include <TRefArray.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 "AliESDEvent.h"
46 #include "AliAODEvent.h"
47 #include "AliAODHandler.h"
48 #include "AliAODTrack.h"
49 #include "AliAODJet.h"
50 #include "AliAODMCParticle.h"
51 #include "AliMCEventHandler.h"
52 #include "AliMCEvent.h"
54 #include "AliGenPythiaEventHeader.h"
55 #include "AliJetKineReaderHeader.h"
56 #include "AliGenCocktailEventHeader.h"
57 #include "AliInputEventHandler.h"
58 #include "AliAODJetEventBackground.h"
60 #include "fastjet/PseudoJet.hh"
61 #include "fastjet/ClusterSequenceArea.hh"
62 #include "fastjet/AreaDefinition.hh"
63 #include "fastjet/JetDefinition.hh"
64 // get info on how fastjet was configured
65 #include "fastjet/config.h"
68 ClassImp(AliAnalysisTaskJetCluster)
70 AliAnalysisTaskJetCluster::~AliAnalysisTaskJetCluster(){
74 if(fTCAJetsOut)fTCAJetsOut->Delete();
76 if(fTCAJetsOutRan)fTCAJetsOutRan->Delete();
77 delete fTCAJetsOutRan;
78 if(fTCARandomConesOut)fTCARandomConesOut->Delete();
79 delete fTCARandomConesOut;
80 if(fTCARandomConesOutRan)fTCARandomConesOutRan->Delete();
81 delete fTCARandomConesOutRan;
82 if(fAODJetBackgroundOut)fAODJetBackgroundOut->Reset();
83 delete fAODJetBackgroundOut;
86 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
90 fUseAODTrackInput(kFALSE),
91 fUseAODMCInput(kFALSE),
92 fUseGlobalSelection(kFALSE),
93 fUseBackgroundCalc(kFALSE),
95 fTrackTypeRec(kTrackUndef),
96 fTrackTypeGen(kTrackUndef),
101 fTrackEtaWindow(0.9),
109 fBackgroundBranch(""),
112 fAlgorithm(fastjet::kt_algorithm),
113 fStrategy(fastjet::Best),
114 fRecombScheme(fastjet::BIpt_scheme),
115 fAreaType(fastjet::active_area),
117 fActiveAreaRepeats(1),
121 fTCARandomConesOut(0x0),
122 fTCARandomConesOutRan(0x0),
123 fAODJetBackgroundOut(0x0),
129 fh1PtHardTrials(0x0),
132 fh1NConstLeadingRec(0x0),
134 fh1PtJetsLeadingRecIn(0x0),
135 fh1PtJetConstRec(0x0),
136 fh1PtJetConstLeadingRec(0x0),
137 fh1PtTracksRecIn(0x0),
138 fh1PtTracksLeadingRecIn(0x0),
140 fh1NConstRecRan(0x0),
141 fh1PtJetsLeadingRecInRan(0x0),
142 fh1NConstLeadingRecRan(0x0),
143 fh1PtJetsRecInRan(0x0),
144 fh1PtTracksGenIn(0x0),
146 fh1CentralityPhySel(0x0),
148 fh1CentralitySelect(0x0),
153 fh2NRecTracksPt(0x0),
155 fh2NConstLeadingPt(0x0),
157 fh2LeadingJetPhiEta(0x0),
159 fh2LeadingJetEtaPt(0x0),
161 fh2LeadingTrackEtaPt(0x0),
162 fh2JetsLeadingPhiEta(0x0),
163 fh2JetsLeadingPhiPt(0x0),
164 fh2TracksLeadingPhiEta(0x0),
165 fh2TracksLeadingPhiPt(0x0),
166 fh2TracksLeadingJetPhiPt(0x0),
167 fh2JetsLeadingPhiPtW(0x0),
168 fh2TracksLeadingPhiPtW(0x0),
169 fh2TracksLeadingJetPhiPtW(0x0),
170 fh2NRecJetsPtRan(0x0),
172 fh2NConstLeadingPtRan(0x0),
177 fh2TracksLeadingJetPhiPtRan(0x0),
178 fh2TracksLeadingJetPhiPtWRan(0x0),
181 for(int i = 0;i<3;i++){
182 fh1BiARandomCones[i] = 0;
183 fh1BiARandomConesRan[i] = 0;
185 for(int i = 0;i<kMaxCent;i++){
186 fh2JetsLeadingPhiPtC[i] = 0;
187 fh2JetsLeadingPhiPtWC[i] = 0; //! jet correlation with leading jet
188 fh2TracksLeadingJetPhiPtC[i] = 0;
189 fh2TracksLeadingJetPhiPtWC[i] = 0;
193 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
194 AliAnalysisTaskSE(name),
198 fUseAODTrackInput(kFALSE),
199 fUseAODMCInput(kFALSE),
200 fUseGlobalSelection(kFALSE),
201 fUseBackgroundCalc(kFALSE),
203 fTrackTypeRec(kTrackUndef),
204 fTrackTypeGen(kTrackUndef),
209 fTrackEtaWindow(0.9),
217 fBackgroundBranch(""),
220 fAlgorithm(fastjet::kt_algorithm),
221 fStrategy(fastjet::Best),
222 fRecombScheme(fastjet::BIpt_scheme),
223 fAreaType(fastjet::active_area),
225 fActiveAreaRepeats(1),
229 fTCARandomConesOut(0x0),
230 fTCARandomConesOutRan(0x0),
231 fAODJetBackgroundOut(0x0),
237 fh1PtHardTrials(0x0),
240 fh1NConstLeadingRec(0x0),
242 fh1PtJetsLeadingRecIn(0x0),
243 fh1PtJetConstRec(0x0),
244 fh1PtJetConstLeadingRec(0x0),
245 fh1PtTracksRecIn(0x0),
246 fh1PtTracksLeadingRecIn(0x0),
248 fh1NConstRecRan(0x0),
249 fh1PtJetsLeadingRecInRan(0x0),
250 fh1NConstLeadingRecRan(0x0),
251 fh1PtJetsRecInRan(0x0),
252 fh1PtTracksGenIn(0x0),
254 fh1CentralityPhySel(0x0),
256 fh1CentralitySelect(0x0),
261 fh2NRecTracksPt(0x0),
263 fh2NConstLeadingPt(0x0),
265 fh2LeadingJetPhiEta(0x0),
267 fh2LeadingJetEtaPt(0x0),
269 fh2LeadingTrackEtaPt(0x0),
270 fh2JetsLeadingPhiEta(0x0),
271 fh2JetsLeadingPhiPt(0x0),
272 fh2TracksLeadingPhiEta(0x0),
273 fh2TracksLeadingPhiPt(0x0),
274 fh2TracksLeadingJetPhiPt(0x0),
275 fh2JetsLeadingPhiPtW(0x0),
276 fh2TracksLeadingPhiPtW(0x0),
277 fh2TracksLeadingJetPhiPtW(0x0),
278 fh2NRecJetsPtRan(0x0),
280 fh2NConstLeadingPtRan(0x0),
285 fh2TracksLeadingJetPhiPtRan(0x0),
286 fh2TracksLeadingJetPhiPtWRan(0x0),
289 for(int i = 0;i<3;i++){
290 fh1BiARandomCones[i] = 0;
291 fh1BiARandomConesRan[i] = 0;
293 for(int i = 0;i<kMaxCent;i++){
294 fh2JetsLeadingPhiPtC[i] = 0;
295 fh2JetsLeadingPhiPtWC[i] = 0; //! jet correlation with leading jet
296 fh2TracksLeadingJetPhiPtC[i] = 0;
297 fh2TracksLeadingJetPhiPtWC[i] = 0;
299 DefineOutput(1, TList::Class());
304 Bool_t AliAnalysisTaskJetCluster::Notify()
307 // Implemented Notify() to read the cross sections
308 // and number of trials from pyxsec.root
313 void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
317 // Create the output container
320 fRandom = new TRandom3(0);
326 if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
330 if(fNonStdBranch.Length()!=0)
332 // only create the output branch if we have a name
333 // Create a new branch for jets...
334 // -> cleared in the UserExec....
335 // here we can also have the case that the brnaches are written to a separate file
337 fTCAJetsOut = new TClonesArray("AliAODJet", 0);
338 fTCAJetsOut->SetName(fNonStdBranch.Data());
339 AddAODBranch("TClonesArray",&fTCAJetsOut,fNonStdFile.Data());
342 fTCAJetsOutRan = new TClonesArray("AliAODJet", 0);
343 fTCAJetsOutRan->SetName(Form("%s_%s",fNonStdBranch.Data(),"random"));
344 AddAODBranch("TClonesArray",&fTCAJetsOutRan,fNonStdFile.Data());
346 if(fUseBackgroundCalc){
347 if(!AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()))){
348 fAODJetBackgroundOut = new AliAODJetEventBackground();
349 fAODJetBackgroundOut->SetName(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()));
350 AddAODBranch("AliAODJetEventBackground",&fAODJetBackgroundOut,fNonStdFile.Data());
353 // create the branch for the random cones with the same R
354 TString cName = Form("%sRandomCone",fNonStdBranch.Data());
357 if(!AODEvent()->FindListObject(cName.Data())){
358 fTCARandomConesOut = new TClonesArray("AliAODJet", 0);
359 fTCARandomConesOut->SetName(cName.Data());
360 AddAODBranch("TClonesArray",&fTCARandomConesOut,fNonStdFile.Data());
362 // create the branch with the random for the random cones on the random event
363 cName = Form("%sRandomCone_random",fNonStdBranch.Data());
364 if(!AODEvent()->FindListObject(cName.Data())){
365 fTCARandomConesOutRan = new TClonesArray("AliAODJet", 0);
366 fTCARandomConesOutRan->SetName(cName.Data());
367 AddAODBranch("TClonesArray",&fTCARandomConesOutRan,fNonStdFile.Data());
371 if(fNonStdFile.Length()!=0){
373 // case that we have an AOD extension we need to fetch the jets from the extended output
374 // we identify the extension aod event by looking for the branchname
375 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
376 // case that we have an AOD extension we need can fetch the background maybe from the extended output
377 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
382 if(!fHistList)fHistList = new TList();
383 fHistList->SetOwner();
385 Bool_t oldStatus = TH1::AddDirectoryStatus();
386 TH1::AddDirectory(kFALSE);
391 const Int_t nBinPt = 200;
392 Double_t binLimitsPt[nBinPt+1];
393 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
395 binLimitsPt[iPt] = 0.0;
398 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
402 const Int_t nBinPhi = 90;
403 Double_t binLimitsPhi[nBinPhi+1];
404 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
406 binLimitsPhi[iPhi] = -1.*TMath::Pi();
409 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
415 const Int_t nBinEta = 40;
416 Double_t binLimitsEta[nBinEta+1];
417 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
419 binLimitsEta[iEta] = -2.0;
422 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
426 const int nChMax = 4000;
428 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
429 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
431 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
432 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
435 fh1NJetsRec = new TH1F("fh1NJetsRec","N reconstructed jets",120,-0.5,119.5);
436 fh1NJetsRecRan = new TH1F("fh1NJetsRecRan","N reconstructed jets",120,-0.5,119.5);
438 fh1NConstRec = new TH1F("fh1NConstRec","# jet constituents",120,-0.5,119.5);
439 fh1NConstRecRan = new TH1F("fh1NConstRecRan","# jet constituents",120,-0.5,119.5);
440 fh1NConstLeadingRec = new TH1F("fh1NConstLeadingRec","jet constituents",120,-0.5,119.5);
441 fh1NConstLeadingRecRan = new TH1F("fh1NConstLeadingRecRan","jet constituents",120,-0.5,119.5);
444 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
445 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
446 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
448 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
449 fh1PtJetsRecInRan = new TH1F("fh1PtJetsRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
450 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
451 fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
452 fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
453 fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
454 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn",Form("Rec tracks P_T #eta < %1.2f;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
455 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn",Form("Rec tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
456 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn",Form("gen tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
457 fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
459 fh1Centrality = new TH1F("fh1Centrality",";cent (%)",111,-0.5,110.5);
460 fh1CentralitySelect = new TH1F("fh1CentralitySelect",";cent (%)",111,-0.5,110.5);
461 fh1CentralityPhySel = new TH1F("fh1CentralityPhySel",";cent (%)",111,-0.5,110.5);
463 fh1Z = new TH1F("fh1Z",";zvtx",100,-25,25);
464 fh1ZSelect = new TH1F("fh1ZSelect",";zvtx",100,-25,25);
465 fh1ZPhySel = new TH1F("fh1ZPhySel",";zvtx",100,-25,25);
467 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
468 fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
469 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
473 fh2NConstPt = new TH2F("fh2NConstPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
474 fh2NConstLeadingPt = new TH2F("fh2NConstLeadingPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
475 fh2NConstPtRan = new TH2F("fh2NConstPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
476 fh2NConstLeadingPtRan = new TH2F("fh2NConstLeadingPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
478 fh2PtNch = new TH2F("fh2PtNch","p_T of cluster vs. multiplicity; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
479 fh2PtNchRan = new TH2F("fh2PtNchRan","p_T of cluster vs. multiplicity ran; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
480 fh2PtNchN = new TH2F("fh2PtNchN","p_T of cluster vs. multiplicity N weighted; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
481 fh2PtNchNRan = new TH2F("fh2PtNchNRan","p_T of cluster vs. multiplicity N weighted ran; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
485 fh2JetPhiEta = new TH2F("fh2JetPhiEta","eta vs phi all jets;#phi;#eta",
486 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
487 fh2LeadingJetPhiEta = new TH2F("fh2LeadingJetPhiEta","eta vs phi leading jets;#phi;#eta",
488 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
490 fh2JetEtaPt = new TH2F("fh2JetEtaPt","pt vs eta all jets;#eta;p_{T}",
491 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
492 fh2LeadingJetEtaPt = new TH2F("fh2LeadingJetEtaPt","pT vs eta leading jets;#eta;p_{T}",
493 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
495 fh2TrackEtaPt = new TH2F("fh2TrackEtaPt","pt vs eta all jets;#eta;p_{T}",
496 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
497 fh2LeadingTrackEtaPt = new TH2F("fh2LeadingTrackEtaPt","pT vs eta leading jets;#eta;p_{T}",
498 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
502 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
503 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
504 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
505 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
506 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
507 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
508 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
509 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
510 fh2TracksLeadingJetPhiPt = new TH2F("fh2TracksLeadingJetPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
511 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
512 fh2TracksLeadingJetPhiPtRan = new TH2F("fh2TracksLeadingJetPhiPtRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
513 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
515 fh2JetsLeadingPhiPtW = new TH2F("fh2JetsLeadingPhiPtW","leading p_T vs delta phi p_T weigted to leading jet;#Delta#phi;p_{T} (GeV/c)",
516 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
517 fh2TracksLeadingPhiPtW = new TH2F("fh2TracksLeadingPhiPtW","leading p_T vs delta phi to leading jet (p_T weighted);#Delta#phi;p_{T} (GeV/c)",
518 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
520 fh2TracksLeadingJetPhiPtW = new TH2F("fh2TracksLeadingJetPhiPtW","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
521 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
522 fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
523 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
526 if(fNRandomCones>0&&fUseBackgroundCalc){
527 for(int i = 0;i<3;i++){
528 fh1BiARandomCones[i] = new TH1F(Form("fh1BiARandomCones%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
529 fh1BiARandomConesRan[i] = new TH1F(Form("fh1BiARandomConesRan%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
533 for(int i = 0;i < kMaxCent;i++){
534 fh2JetsLeadingPhiPtC[i] = (TH2F*)fh2JetsLeadingPhiPt->Clone(Form("%s_C%02d",fh2JetsLeadingPhiPt->GetName(),i+1));
535 fh2JetsLeadingPhiPtWC[i]= (TH2F*)fh2JetsLeadingPhiPtW->Clone(Form("%s_C%02d",fh2JetsLeadingPhiPtW->GetName(),i+1));
536 fh2TracksLeadingJetPhiPtC[i] = (TH2F*)fh2TracksLeadingJetPhiPt->Clone(Form("%s_C%02d",fh2TracksLeadingJetPhiPt->GetName(),i+1));
537 fh2TracksLeadingJetPhiPtWC[i] = (TH2F*)fh2TracksLeadingJetPhiPtW->Clone(Form("%s_C%02d",fh2TracksLeadingJetPhiPtW->GetName(),i+1));
540 const Int_t saveLevel = 3; // large save level more histos
542 fHistList->Add(fh1Xsec);
543 fHistList->Add(fh1Trials);
545 fHistList->Add(fh1NJetsRec);
546 fHistList->Add(fh1NConstRec);
547 fHistList->Add(fh1NConstLeadingRec);
548 fHistList->Add(fh1PtJetsRecIn);
549 fHistList->Add(fh1PtJetsLeadingRecIn);
550 fHistList->Add(fh1PtTracksRecIn);
551 fHistList->Add(fh1PtTracksLeadingRecIn);
552 fHistList->Add(fh1PtJetConstRec);
553 fHistList->Add(fh1PtJetConstLeadingRec);
554 fHistList->Add(fh1NJetsRecRan);
555 fHistList->Add(fh1NConstRecRan);
556 fHistList->Add(fh1PtJetsLeadingRecInRan);
557 fHistList->Add(fh1NConstLeadingRecRan);
558 fHistList->Add(fh1PtJetsRecInRan);
559 fHistList->Add(fh1Nch);
560 fHistList->Add(fh1Centrality);
561 fHistList->Add(fh1CentralitySelect);
562 fHistList->Add(fh1CentralityPhySel);
563 fHistList->Add(fh1Z);
564 fHistList->Add(fh1ZSelect);
565 fHistList->Add(fh1ZPhySel);
566 if(fNRandomCones>0&&fUseBackgroundCalc){
567 for(int i = 0;i<3;i++){
568 fHistList->Add(fh1BiARandomCones[i]);
569 fHistList->Add(fh1BiARandomConesRan[i]);
572 for(int i = 0;i < kMaxCent;i++){
573 fHistList->Add(fh2JetsLeadingPhiPtC[i]);
574 fHistList->Add(fh2JetsLeadingPhiPtWC[i]);
575 fHistList->Add(fh2TracksLeadingJetPhiPtC[i]);
576 fHistList->Add(fh2TracksLeadingJetPhiPtWC[i]);
579 fHistList->Add(fh2NRecJetsPt);
580 fHistList->Add(fh2NRecTracksPt);
581 fHistList->Add(fh2NConstPt);
582 fHistList->Add(fh2NConstLeadingPt);
583 fHistList->Add(fh2PtNch);
584 fHistList->Add(fh2PtNchRan);
585 fHistList->Add(fh2PtNchN);
586 fHistList->Add(fh2PtNchNRan);
587 fHistList->Add(fh2JetPhiEta);
588 fHistList->Add(fh2LeadingJetPhiEta);
589 fHistList->Add(fh2JetEtaPt);
590 fHistList->Add(fh2LeadingJetEtaPt);
591 fHistList->Add(fh2TrackEtaPt);
592 fHistList->Add(fh2LeadingTrackEtaPt);
593 fHistList->Add(fh2JetsLeadingPhiEta );
594 fHistList->Add(fh2JetsLeadingPhiPt);
595 fHistList->Add(fh2TracksLeadingPhiEta);
596 fHistList->Add(fh2TracksLeadingPhiPt);
597 fHistList->Add(fh2TracksLeadingJetPhiPt);
598 fHistList->Add(fh2JetsLeadingPhiPtW);
599 fHistList->Add(fh2TracksLeadingPhiPtW);
600 fHistList->Add(fh2TracksLeadingJetPhiPtW);
601 fHistList->Add(fh2NRecJetsPtRan);
602 fHistList->Add(fh2NConstPtRan);
603 fHistList->Add(fh2NConstLeadingPtRan);
604 fHistList->Add(fh2TracksLeadingJetPhiPtRan);
605 fHistList->Add(fh2TracksLeadingJetPhiPtWRan);
608 // =========== Switch on Sumw2 for all histos ===========
609 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
610 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
615 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
618 TH1::AddDirectory(oldStatus);
621 void AliAnalysisTaskJetCluster::Init()
627 if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
631 void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
634 if(fUseGlobalSelection){
635 // no selection by the service task, we continue
636 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
637 PostData(1, fHistList);
643 // handle and reset the output jet branch
645 if(fTCAJetsOut)fTCAJetsOut->Delete();
646 if(fTCAJetsOutRan)fTCAJetsOutRan->Delete();
647 if(fTCARandomConesOut)fTCARandomConesOut->Delete();
648 if(fTCARandomConesOutRan)fTCARandomConesOutRan->Delete();
649 if(fAODJetBackgroundOut)fAODJetBackgroundOut->Reset();
651 AliAODJetEventBackground* externalBackground = 0;
652 if(!externalBackground&&fBackgroundBranch.Length()){
653 externalBackground = (AliAODJetEventBackground*)(AODEvent()->FindListObject(fBackgroundBranch.Data()));
654 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
657 // Execute analysis for current event
659 AliESDEvent *fESD = 0;
660 if(fUseAODTrackInput){
661 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
663 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
669 // assume that the AOD is in the general output...
672 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
676 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
680 Bool_t selectEvent = false;
681 Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
687 const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
688 TString vtxTitle(vtxAOD->GetTitle());
689 zVtx = vtxAOD->GetZ();
691 cent = fAOD->GetHeader()->GetCentrality();
692 if(cent<10)cenClass = 0;
693 else if(cent<30)cenClass = 1;
694 else if(cent<50)cenClass = 2;
695 else if(cent<80)cenClass = 3;
696 if(physicsSelection){
697 fh1CentralityPhySel->Fill(cent);
698 fh1ZPhySel->Fill(zVtx);
702 if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
703 Float_t yvtx = vtxAOD->GetY();
704 Float_t xvtx = vtxAOD->GetX();
705 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
706 if(TMath::Abs(zVtx)<8.&&r2<1.){ // apply vertex cut later on
707 if(physicsSelection){
713 if(cent<fCentCutLo||cent>fCentCutUp){
720 PostData(1, fHistList);
723 fh1Centrality->Fill(cent);
725 fh1Trials->Fill("#sum{ntrials}",1);
728 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
730 // ==== General variables needed
734 // we simply fetch the tracks/mc particles as a list of AliVParticles
739 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
740 Float_t nCh = recParticles.GetEntries();
742 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
743 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
744 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
748 vector<fastjet::PseudoJet> inputParticlesRec;
749 vector<fastjet::PseudoJet> inputParticlesRecRan;
751 // Generate the random cones
753 AliAODJet vTmpRan(1,0,0,1);
754 for(int i = 0; i < recParticles.GetEntries(); i++){
755 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
756 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
757 // we take total momentum here
758 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
759 jInp.set_user_index(i);
760 inputParticlesRec.push_back(jInp);
762 // the randomized input changes eta and phi, but keeps the p_T
763 if(i>=fNSkipLeadingRan){// eventually skip the leading particles
764 Double_t pT = vp->Pt();
765 Double_t eta = 2.*fTrackEtaWindow * fRandom->Rndm() - fTrackEtaWindow;
766 Double_t phi = 2.* TMath::Pi() * fRandom->Rndm();
768 Double_t theta = 2.*TMath::ATan(TMath::Exp(-eta));
769 Double_t pZ = pT/TMath::Tan(theta);
771 Double_t pX = pT * TMath::Cos(phi);
772 Double_t pY = pT * TMath::Sin(phi);
773 Double_t p = TMath::Sqrt(pT*pT+pZ*pZ);
774 fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
776 jInpRan.set_user_index(i);
777 inputParticlesRecRan.push_back(jInpRan);
778 vTmpRan.SetPxPyPzE(pX,pY,pZ,p);
781 // fill the tref array, only needed when we write out jets
784 fRef->Delete(); // make sure to delete before placement new...
785 new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp));
791 if(inputParticlesRec.size()==0){
792 if(fDebug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
793 PostData(1, fHistList);
798 // employ setters for these...
801 // now create the object that holds info about ghosts
802 if(!fUseBackgroundCalc&& fNonStdBranch.Length()==0){
803 // reduce CPU time...
805 fActiveAreaRepeats = 0;
808 fastjet::GhostedAreaSpec ghostSpec(fGhostEtamax, fActiveAreaRepeats, fGhostArea);
809 fastjet::AreaType areaType = fastjet::active_area;
810 fastjet::AreaDefinition areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
811 fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
812 vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
813 fastjet::ClusterSequenceArea clustSeq(inputParticlesRec, jetDef,areaDef);
815 //range where to compute background
816 Double_t phiMin = 0, phiMax = 0, rapMin = 0, rapMax = 0;
818 phiMax = 2*TMath::Pi();
819 rapMax = fGhostEtamax - fRparam;
820 rapMin = - fGhostEtamax + fRparam;
821 fastjet::RangeDefinition range(rapMin,rapMax, phiMin, phiMax);
825 inclusiveJets = clustSeq.inclusive_jets();
826 sortedJets = sorted_by_pt(inclusiveJets);
828 fh1NJetsRec->Fill(sortedJets.size());
830 // loop over all jets an fill information, first on is the leading jet
832 Int_t nRecOver = inclusiveJets.size();
833 Int_t nRec = inclusiveJets.size();
834 if(inclusiveJets.size()>0){
835 AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
836 Double_t area = clustSeq.area(sortedJets[0]);
837 leadingJet.SetEffArea(area,0);
838 Float_t pt = leadingJet.Pt();
839 Int_t nAodOutJets = 0;
840 Int_t nAodOutTracks = 0;
841 AliAODJet *aodOutJet = 0;
844 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
845 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
846 while(pt<ptCut&&iCount<nRec){
850 pt = sortedJets[iCount].perp();
853 if(nRecOver<=0)break;
854 fh2NRecJetsPt->Fill(ptCut,nRecOver);
856 Float_t phi = leadingJet.Phi();
857 if(phi<0)phi+=TMath::Pi()*2.;
858 Float_t eta = leadingJet.Eta();
860 if(externalBackground){
861 // carefull has to be filled in a task before
862 // todo, ReArrange to the botom
863 pTback = externalBackground->GetBackground(1)*leadingJet.EffectiveAreaCharged();
865 pt = leadingJet.Pt() - pTback;
866 // correlation of leading jet with tracks
867 TIterator *recIter = recParticles.MakeIterator();
869 AliVParticle *tmpRecTrack = 0;
870 while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
871 Float_t tmpPt = tmpRecTrack->Pt();
873 Float_t tmpPhi = tmpRecTrack->Phi();
874 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
875 Float_t dPhi = phi - tmpPhi;
876 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
877 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
878 fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
879 fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
881 fh2TracksLeadingJetPhiPtC[cenClass]->Fill(dPhi,pt);
882 fh2TracksLeadingJetPhiPtWC[cenClass]->Fill(dPhi,pt,tmpPt);
888 TLorentzVector vecareab;
889 for(int j = 0; j < nRec;j++){
890 AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
893 Float_t tmpPt = tmpRec.Pt();
895 if(tmpPt>fJetOutputMinPt&&fTCAJetsOut){// cut on the non-background subtracted...
896 aodOutJet = new ((*fTCAJetsOut)[nAodOutJets++]) AliAODJet(tmpRec);
897 Double_t area1 = clustSeq.area(sortedJets[j]);
898 aodOutJet->SetEffArea(area1,0);
899 fastjet::PseudoJet vecarea=clustSeq.area_4vector(sortedJets[j]);
900 vecareab.SetPxPyPzE(vecarea.px(),vecarea.py(),vecarea.pz(),vecarea.e());
901 aodOutJet->SetVectorAreaCharged(&vecareab);
907 Float_t tmpPtBack = 0;
908 if(externalBackground){
909 // carefull has to be filled in a task before
910 // todo, ReArrange to the botom
911 tmpPtBack = externalBackground->GetBackground(2)*tmpRec.EffectiveAreaCharged();
913 tmpPt = tmpPt - tmpPtBack;
914 if(tmpPt<0)tmpPt = 0; // avoid negative weights...
916 fh1PtJetsRecIn->Fill(tmpPt);
917 // Fill Spectra with constituents
918 vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
920 fh1NConstRec->Fill(constituents.size());
921 fh2PtNch->Fill(nCh,tmpPt);
922 fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
923 fh2NConstPt->Fill(tmpPt,constituents.size());
924 // loop over constiutents and fill spectrum
926 for(unsigned int ic = 0; ic < constituents.size();ic++){
927 AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
928 fh1PtJetConstRec->Fill(part->Pt());
930 aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
932 if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
936 Float_t tmpPhi = tmpRec.Phi();
937 Float_t tmpEta = tmpRec.Eta();
938 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
940 fh1PtJetsLeadingRecIn->Fill(tmpPt);
941 fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
942 fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
943 fh1NConstLeadingRec->Fill(constituents.size());
944 fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
947 fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
948 fh2JetEtaPt->Fill(tmpEta,tmpPt);
949 Float_t dPhi = phi - tmpPhi;
950 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
951 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
952 Float_t dEta = eta - tmpRec.Eta();
953 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
954 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
956 fh2JetsLeadingPhiPtC[cenClass]->Fill(dPhi,pt);
957 fh2JetsLeadingPhiPtWC[cenClass]->Fill(dPhi,pt,tmpPt);
959 fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
960 }// loop over reconstructed jets
965 // Add the random cones...
966 if(fNRandomCones>0&&fTCARandomConesOut){
967 // create a random jet within the acceptance
968 Double_t etaMax = 0.8 - fRparam;
971 Double_t pTC = 1; // small number
972 for(int ir = 0;ir < fNRandomCones;ir++){
973 Double_t etaC = etaMax*2.*(fRandom->Rndm()-0.5); // +- etamax
974 Double_t phiC = fRandom->Rndm()*2.*TMath::Pi(); // 0 - 2pi
976 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
977 Double_t pZC = pTC/TMath::Tan(thetaC);
978 Double_t pXC = pTC * TMath::Cos(phiC);
979 Double_t pYC = pTC * TMath::Sin(phiC);
980 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
981 AliAODJet tmpRecC (pXC,pYC,pZC, pC);
983 for(int jj = 0; jj < TMath::Min(nRec,2);jj++){// test for overlap with leading jets
984 AliAODJet jet (sortedJets[jj].px(), sortedJets[jj].py(), sortedJets[jj].pz(), sortedJets[jj].E());
985 if(jet.DeltaR(& tmpRecC)<2.*fRparam+0.2){
990 // test for overlap with previous cones to avoid double counting
991 for(int iic = 0;iic<ir;iic++){
992 AliAODJet *iicone = (AliAODJet*)fTCARandomConesOut->At(iic);
994 if(iicone->DeltaR(&tmpRecC)<2.*fRparam){
1001 tmpRecC.SetBgEnergy(0,0); // this is use as temporary storage of the summed p_T below
1002 if(fTCARandomConesOut)new ((*fTCARandomConesOut)[nConeRan++]) AliAODJet(tmpRecC);
1003 if(fTCARandomConesOutRan)new ((*fTCARandomConesOutRan)[nCone++]) AliAODJet(tmpRecC);
1004 }// loop over random cones creation
1007 // loop over the reconstructed particles and add up the pT in the random cones
1008 // maybe better to loop over randomized particles not in the real jets...
1009 // but this by definition brings dow average energy in the whole event
1010 AliAODJet vTmpRanR(1,0,0,1);
1011 for(int i = 0; i < recParticles.GetEntries(); i++){
1012 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
1013 if(fTCARandomConesOut){
1014 for(int ir = 0;ir < fNRandomCones;ir++){
1015 AliAODJet *jC = (AliAODJet*)fTCARandomConesOut->At(ir);
1016 if(jC&&jC->DeltaR(vp)<fRparam){
1017 jC->SetBgEnergy(jC->ChargedBgEnergy()+vp->Pt(),0);
1020 }// add up energy in cone
1022 // the randomized input changes eta and phi, but keeps the p_T
1023 if(i>=fNSkipLeadingRan){// eventually skip the leading particles
1024 Double_t pTR = vp->Pt();
1025 Double_t etaR = 2.*fTrackEtaWindow* fRandom->Rndm() - fTrackEtaWindow;
1026 Double_t phiR = 2.* TMath::Pi() * fRandom->Rndm();
1028 Double_t thetaR = 2.*TMath::ATan(TMath::Exp(-etaR));
1029 Double_t pZR = pTR/TMath::Tan(thetaR);
1031 Double_t pXR = pTR * TMath::Cos(phiR);
1032 Double_t pYR = pTR * TMath::Sin(phiR);
1033 Double_t pR = TMath::Sqrt(pTR*pTR+pZR*pZR);
1034 vTmpRanR.SetPxPyPzE(pXR,pYR,pZR,pR);
1035 if(fTCARandomConesOutRan){
1036 for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
1037 AliAODJet *jC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
1038 if(jC&&jC->DeltaR(&vTmpRanR)<fRparam){
1039 jC->SetBgEnergy(jC->ChargedBgEnergy()+vTmpRanR.Pt(),0);
1044 }// loop over recparticles
1046 Float_t jetArea = fRparam*fRparam*TMath::Pi();
1047 if(fTCARandomConesOut){
1048 for(int ir = 0;ir < fTCARandomConesOut->GetEntriesFast();ir++){
1049 // rescale the momntum vectors for the random cones
1051 AliAODJet *rC = (AliAODJet*)fTCARandomConesOut->At(ir);
1053 Double_t etaC = rC->Eta();
1054 Double_t phiC = rC->Phi();
1055 // massless jet, unit vector
1056 pTC = rC->ChargedBgEnergy();
1057 if(pTC<=0)pTC = 0.1; // for almost empty events
1058 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
1059 Double_t pZC = pTC/TMath::Tan(thetaC);
1060 Double_t pXC = pTC * TMath::Cos(phiC);
1061 Double_t pYC = pTC * TMath::Sin(phiC);
1062 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
1063 rC->SetPxPyPzE(pXC,pYC,pZC, pC);
1064 rC->SetBgEnergy(0,0);
1065 rC->SetEffArea(jetArea,0);
1069 if(!fTCARandomConesOutRan){
1070 for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
1071 AliAODJet* rC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
1074 Double_t etaC = rC->Eta();
1075 Double_t phiC = rC->Phi();
1076 // massless jet, unit vector
1077 pTC = rC->ChargedBgEnergy();
1078 if(pTC<=0)pTC = 0.1;// for almost empty events
1079 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
1080 Double_t pZC = pTC/TMath::Tan(thetaC);
1081 Double_t pXC = pTC * TMath::Cos(phiC);
1082 Double_t pYC = pTC * TMath::Sin(phiC);
1083 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
1084 rC->SetPxPyPzE(pXC,pYC,pZC, pC);
1085 rC->SetBgEnergy(0,0);
1086 rC->SetEffArea(jetArea,0);
1090 }// if(fNRandomCones
1092 //background estimates:all bckg jets(0) & wo the 2 hardest(1)
1098 if(fAODJetBackgroundOut){
1099 vector<fastjet::PseudoJet> jets2=sortedJets;
1100 if(jets2.size()>2) jets2.erase(jets2.begin(),jets2.begin()+2);
1103 Double_t meanarea1=0.;
1106 Double_t meanarea2=0.;
1108 clustSeq.get_median_rho_and_sigma(jets2, range, true, bkg1, sigma1, meanarea1, true);
1109 fAODJetBackgroundOut->SetBackground(0,bkg1,sigma1,meanarea1);
1111 // fh1BiARandomCones[0]->Fill(omCone-(bkg1*areaRandomCone));
1112 // fh1BiARandomConesRan[0]->Fill(ptRandomConeRan-(bkg1*areaRandomCone));
1114 clustSeq.get_median_rho_and_sigma(jets2, range, false, bkg2, sigma2, meanarea2, true);
1115 fAODJetBackgroundOut->SetBackground(1,bkg2,sigma2,meanarea2);
1116 // fh1BiARandomCones[1]->Fill(ptRandomCone-(bkg2*areaRandomCone));
1117 // fh1BiARandomConesRan[1]->Fill(ptRandomConeRan-(bkg2*areaRandomCone));
1126 // fill track information
1127 Int_t nTrackOver = recParticles.GetSize();
1128 // do the same for tracks and jets
1131 TIterator *recIter = recParticles.MakeIterator();
1132 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
1133 Float_t pt = tmpRec->Pt();
1135 // Printf("Leading track p_t %3.3E",pt);
1136 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
1137 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
1138 while(pt<ptCut&&tmpRec){
1140 tmpRec = (AliVParticle*)(recIter->Next());
1145 if(nTrackOver<=0)break;
1146 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
1150 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
1151 Float_t phi = leading->Phi();
1152 if(phi<0)phi+=TMath::Pi()*2.;
1153 Float_t eta = leading->Eta();
1155 while((tmpRec = (AliVParticle*)(recIter->Next()))){
1156 Float_t tmpPt = tmpRec->Pt();
1157 Float_t tmpEta = tmpRec->Eta();
1158 fh1PtTracksRecIn->Fill(tmpPt);
1159 fh2TrackEtaPt->Fill(tmpEta,tmpPt);
1160 if(tmpRec==leading){
1161 fh1PtTracksLeadingRecIn->Fill(tmpPt);
1162 fh2LeadingTrackEtaPt->Fill(tmpEta,tmpPt);
1166 Float_t tmpPhi = tmpRec->Phi();
1168 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1169 Float_t dPhi = phi - tmpPhi;
1170 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1171 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1172 Float_t dEta = eta - tmpRec->Eta();
1173 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
1174 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
1175 fh2TracksLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
1180 // find the random jets
1181 vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
1182 fastjet::ClusterSequenceArea clustSeqRan(inputParticlesRecRan, jetDef, areaDef);
1184 inclusiveJetsRan = clustSeqRan.inclusive_jets();
1185 sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
1187 // fill the jet information from random track
1189 fh1NJetsRecRan->Fill(sortedJetsRan.size());
1191 // loop over all jets an fill information, first on is the leading jet
1193 Int_t nRecOverRan = inclusiveJetsRan.size();
1194 Int_t nRecRan = inclusiveJetsRan.size();
1196 if(inclusiveJetsRan.size()>0){
1197 AliAODJet leadingJet (sortedJetsRan[0].px(), sortedJetsRan[0].py(), sortedJetsRan[0].pz(), sortedJetsRan[0].E());
1198 Float_t pt = leadingJet.Pt();
1201 TLorentzVector vecarearanb;
1203 for(int i = 1;i <= fh2NRecJetsPtRan->GetNbinsX();i++){
1204 Float_t ptCut = fh2NRecJetsPtRan->GetXaxis()->GetBinCenter(i);
1205 while(pt<ptCut&&iCount<nRecRan){
1209 pt = sortedJetsRan[iCount].perp();
1212 if(nRecOverRan<=0)break;
1213 fh2NRecJetsPtRan->Fill(ptCut,nRecOverRan);
1215 Float_t phi = leadingJet.Phi();
1216 if(phi<0)phi+=TMath::Pi()*2.;
1217 pt = leadingJet.Pt();
1219 // correlation of leading jet with random tracks
1221 for(unsigned int ip = 0; ip < inputParticlesRecRan.size();ip++)
1223 Float_t tmpPt = inputParticlesRecRan[ip].perp();
1225 Float_t tmpPhi = inputParticlesRecRan[ip].phi();
1226 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1227 Float_t dPhi = phi - tmpPhi;
1228 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1229 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1230 fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
1231 fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
1234 Int_t nAodOutJetsRan = 0;
1235 AliAODJet *aodOutJetRan = 0;
1236 for(int j = 0; j < nRecRan;j++){
1237 AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
1238 Float_t tmpPt = tmpRec.Pt();
1239 fh1PtJetsRecInRan->Fill(tmpPt);
1240 // Fill Spectra with constituents
1241 vector<fastjet::PseudoJet> constituents = clustSeqRan.constituents(sortedJetsRan[j]);
1242 fh1NConstRecRan->Fill(constituents.size());
1243 fh2NConstPtRan->Fill(tmpPt,constituents.size());
1244 fh2PtNchRan->Fill(nCh,tmpPt);
1245 fh2PtNchNRan->Fill(nCh,tmpPt,constituents.size());
1248 if(tmpPt>fJetOutputMinPt&&fTCAJetsOutRan){
1249 aodOutJetRan = new ((*fTCAJetsOutRan)[nAodOutJetsRan++]) AliAODJet(tmpRec);
1250 Double_t arearan=clustSeqRan.area(sortedJetsRan[j]);
1252 aodOutJetRan->SetEffArea(arearan,0);
1253 fastjet::PseudoJet vecarearan=clustSeqRan.area_4vector(sortedJetsRan[j]);
1254 vecarearanb.SetPxPyPzE(vecarearan.px(),vecarearan.py(),vecarearan.pz(),vecarearan.e());
1255 aodOutJetRan->SetVectorAreaCharged(&vecarearanb);
1262 for(unsigned int ic = 0; ic < constituents.size();ic++){
1263 // AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
1264 // fh1PtJetConstRec->Fill(part->Pt());
1266 aodOutJetRan->AddTrack(fRef->At(constituents[ic].user_index()));
1274 Float_t tmpPhi = tmpRec.Phi();
1275 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1278 fh1PtJetsLeadingRecInRan->Fill(tmpPt);
1279 fh1NConstLeadingRecRan->Fill(constituents.size());
1280 fh2NConstLeadingPtRan->Fill(tmpPt,constituents.size());
1286 if(fAODJetBackgroundOut){
1289 Double_t meanarea3=0.;
1290 clustSeqRan.get_median_rho_and_sigma(sortedJetsRan ,range, false, bkg3, sigma3, meanarea3, true);
1291 fAODJetBackgroundOut->SetBackground(2,bkg3,sigma3,meanarea3);
1292 // float areaRandomCone = rRandomCone2 *TMath::Pi();
1294 fh1BiARandomCones[2]->Fill(ptRandomCone-(bkg3*areaRandomCone));
1295 fh1BiARandomConesRan[2]->Fill(ptRandomConeRan-(bkg3*areaRandomCone));
1304 // do the event selection if activated
1305 if(fJetTriggerPtCut>0){
1306 bool select = false;
1307 Float_t minPt = fJetTriggerPtCut;
1309 // hard coded for now ...
1310 // 54.50 44.5 29.5 18.5 for anti-kt rejection 1E-3
1311 if(cent<10)minPt = 50;
1312 else if(cent<30)minPt = 42;
1313 else if(cent<50)minPt = 28;
1314 else if(cent<80)minPt = 18;
1317 if(externalBackground)rho = externalBackground->GetBackground(2);
1319 for(int i = 0;i < fTCAJetsOut->GetEntriesFast();i++){
1320 AliAODJet *jet = (AliAODJet*)fTCAJetsOut->At(i);
1321 Float_t ptSub = jet->Pt() - rho *jet->EffectiveAreaCharged();
1330 static AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1331 fh1CentralitySelect->Fill(cent);
1332 fh1ZSelect->Fill(zVtx);
1333 aodH->SetFillAOD(kTRUE);
1337 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1338 PostData(1, fHistList);
1341 void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
1343 // Terminate analysis
1345 if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
1349 Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
1351 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1354 if(type==kTrackAOD || type==kTrackAODextra || type==kTrackAODextraonly){
1355 if(type!=kTrackAODextraonly) {
1356 AliAODEvent *aod = 0;
1357 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1358 else aod = AODEvent();
1362 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1363 AliAODTrack *tr = aod->GetTrack(it);
1364 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1365 if(TMath::Abs(tr->Eta())>fTrackEtaWindow)continue;
1366 if(tr->Pt()<fTrackPtCut)continue;
1371 if(type==kTrackAODextra || type==kTrackAODextraonly) {
1372 AliAODEvent *aod = 0;
1373 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1374 else aod = AODEvent();
1379 TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(aod->FindListObject("aodExtraTracks"));
1380 if(!aodExtraTracks)return iCount;
1381 for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
1382 AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
1383 if (!track) continue;
1385 AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
1386 if(!trackAOD)continue;
1387 if(trackAOD->Pt()<fTrackPtCut) continue;
1388 list->Add(trackAOD);
1393 else if (type == kTrackKineAll||type == kTrackKineCharged){
1394 AliMCEvent* mcEvent = MCEvent();
1395 if(!mcEvent)return iCount;
1396 // we want to have alivpartilces so use get track
1397 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1398 if(!mcEvent->IsPhysicalPrimary(it))continue;
1399 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1400 if(type == kTrackKineAll){
1401 if(part->Pt()<fTrackPtCut)continue;
1405 else if(type == kTrackKineCharged){
1406 if(part->Particle()->GetPDG()->Charge()==0)continue;
1407 if(part->Pt()<fTrackPtCut)continue;
1413 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1414 AliAODEvent *aod = 0;
1415 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1416 else aod = AODEvent();
1417 if(!aod)return iCount;
1418 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1419 if(!tca)return iCount;
1420 for(int it = 0;it < tca->GetEntriesFast();++it){
1421 AliAODMCParticle *part = (AliAODMCParticle*)(tca->At(it));
1422 if(!part->IsPhysicalPrimary())continue;
1423 if(type == kTrackAODMCAll){
1424 if(part->Pt()<fTrackPtCut)continue;
1428 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1429 if(part->Charge()==0)continue;
1430 if(part->Pt()<fTrackPtCut)continue;
1431 if(kTrackAODMCCharged){
1435 if(TMath::Abs(part->Eta())>fTrackEtaWindow)continue;
1447 Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
1448 for(int i = 0; i < particles.GetEntries(); i++){
1449 AliVParticle *vp = (AliVParticle*)particles.At(i);
1450 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
1451 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->E());
1452 jInp.set_user_index(i);
1453 inputParticles.push_back(jInp);