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>
37 #include <TLorentzVector.h>
38 #include <TClonesArray.h>
39 #include "TDatabasePDG.h"
41 #include "AliAnalysisTaskJetCluster.h"
42 #include "AliAnalysisManager.h"
43 #include "AliJetFinder.h"
44 #include "AliJetHeader.h"
45 #include "AliJetReader.h"
46 #include "AliESDEvent.h"
47 #include "AliAODEvent.h"
48 #include "AliAODHandler.h"
49 #include "AliAODExtension.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"
60 #include "AliAODJetEventBackground.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(){
80 if(fTCAJetsOut)fTCAJetsOut->Delete();
83 if(fTCAJetsOutRan)fTCAJetsOutRan->Delete();
84 delete fTCAJetsOutRan;
86 if(fTCARandomConesOut)fTCARandomConesOut->Delete();
87 delete fTCARandomConesOut;
89 if(fTCARandomConesOutRan)fTCARandomConesOutRan->Delete();
90 delete fTCARandomConesOutRan;
92 if(fAODJetBackgroundOut)fAODJetBackgroundOut->Reset();
93 delete fAODJetBackgroundOut;
96 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster():
101 fUseAODTrackInput(kFALSE),
102 fUseAODMCInput(kFALSE),
103 fUseBackgroundCalc(kFALSE),
104 fEventSelection(kFALSE),
106 fFilterMaskBestPt(0),
109 fTrackTypeRec(kTrackUndef),
110 fTrackTypeGen(kTrackUndef),
112 fNSkipLeadingCone(0),
116 fTrackEtaWindow(0.9),
119 fJetOutputMinPt(0.150),
120 fMaxTrackPtInJet(100.),
127 fBackgroundBranch(""),
138 fUseTrMomentumSmearing(kFALSE),
139 fUseDiceEfficiency(kFALSE),
141 fAlgorithm(fastjet::kt_algorithm),
142 fStrategy(fastjet::Best),
143 fRecombScheme(fastjet::BIpt_scheme),
144 fAreaType(fastjet::active_area),
146 fActiveAreaRepeats(1),
150 fTCARandomConesOut(0x0),
151 fTCARandomConesOutRan(0x0),
152 fAODJetBackgroundOut(0x0),
158 fh1PtHardTrials(0x0),
161 fh1NConstLeadingRec(0x0),
163 fh1PtJetsLeadingRecIn(0x0),
164 fh1PtJetConstRec(0x0),
165 fh1PtJetConstLeadingRec(0x0),
166 fh1PtTracksRecIn(0x0),
167 fh1PtTracksLeadingRecIn(0x0),
169 fh1NConstRecRan(0x0),
170 fh1PtJetsLeadingRecInRan(0x0),
171 fh1NConstLeadingRecRan(0x0),
172 fh1PtJetsRecInRan(0x0),
173 fh1PtTracksGenIn(0x0),
175 fh1CentralityPhySel(0x0),
177 fh1CentralitySelect(0x0),
182 fh2NRecTracksPt(0x0),
184 fh2NConstLeadingPt(0x0),
186 fh2LeadingJetPhiEta(0x0),
188 fh2LeadingJetEtaPt(0x0),
190 fh2LeadingTrackEtaPt(0x0),
191 fh2JetsLeadingPhiEta(0x0),
192 fh2JetsLeadingPhiPt(0x0),
193 fh2TracksLeadingPhiEta(0x0),
194 fh2TracksLeadingPhiPt(0x0),
195 fh2TracksLeadingJetPhiPt(0x0),
196 fh2JetsLeadingPhiPtW(0x0),
197 fh2TracksLeadingPhiPtW(0x0),
198 fh2TracksLeadingJetPhiPtW(0x0),
199 fh2NRecJetsPtRan(0x0),
201 fh2NConstLeadingPtRan(0x0),
206 fh2TracksLeadingJetPhiPtRan(0x0),
207 fh2TracksLeadingJetPhiPtWRan(0x0),
208 fh2PtGenPtSmeared(0x0),
210 fp1PtResolution(0x0),
217 for(int i = 0;i<3;i++){
218 fh1BiARandomCones[i] = 0;
219 fh1BiARandomConesRan[i] = 0;
221 for(int i = 0;i<kMaxCent;i++){
222 fh2JetsLeadingPhiPtC[i] = 0;
223 fh2JetsLeadingPhiPtWC[i] = 0; //! jet correlation with leading jet
224 fh2TracksLeadingJetPhiPtC[i] = 0;
225 fh2TracksLeadingJetPhiPtWC[i] = 0;
229 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
230 AliAnalysisTaskSE(name),
234 fUseAODTrackInput(kFALSE),
235 fUseAODMCInput(kFALSE),
236 fUseBackgroundCalc(kFALSE),
237 fEventSelection(kFALSE), fFilterMask(0),
238 fFilterMaskBestPt(0),
241 fTrackTypeRec(kTrackUndef),
242 fTrackTypeGen(kTrackUndef),
244 fNSkipLeadingCone(0),
248 fTrackEtaWindow(0.9),
251 fJetOutputMinPt(0.150),
252 fMaxTrackPtInJet(100.),
259 fBackgroundBranch(""),
270 fUseTrMomentumSmearing(kFALSE),
271 fUseDiceEfficiency(kFALSE),
273 fAlgorithm(fastjet::kt_algorithm),
274 fStrategy(fastjet::Best),
275 fRecombScheme(fastjet::BIpt_scheme),
276 fAreaType(fastjet::active_area),
278 fActiveAreaRepeats(1),
282 fTCARandomConesOut(0x0),
283 fTCARandomConesOutRan(0x0),
284 fAODJetBackgroundOut(0x0),
290 fh1PtHardTrials(0x0),
293 fh1NConstLeadingRec(0x0),
295 fh1PtJetsLeadingRecIn(0x0),
296 fh1PtJetConstRec(0x0),
297 fh1PtJetConstLeadingRec(0x0),
298 fh1PtTracksRecIn(0x0),
299 fh1PtTracksLeadingRecIn(0x0),
301 fh1NConstRecRan(0x0),
302 fh1PtJetsLeadingRecInRan(0x0),
303 fh1NConstLeadingRecRan(0x0),
304 fh1PtJetsRecInRan(0x0),
305 fh1PtTracksGenIn(0x0),
307 fh1CentralityPhySel(0x0),
309 fh1CentralitySelect(0x0),
314 fh2NRecTracksPt(0x0),
316 fh2NConstLeadingPt(0x0),
318 fh2LeadingJetPhiEta(0x0),
320 fh2LeadingJetEtaPt(0x0),
322 fh2LeadingTrackEtaPt(0x0),
323 fh2JetsLeadingPhiEta(0x0),
324 fh2JetsLeadingPhiPt(0x0),
325 fh2TracksLeadingPhiEta(0x0),
326 fh2TracksLeadingPhiPt(0x0),
327 fh2TracksLeadingJetPhiPt(0x0),
328 fh2JetsLeadingPhiPtW(0x0),
329 fh2TracksLeadingPhiPtW(0x0),
330 fh2TracksLeadingJetPhiPtW(0x0),
331 fh2NRecJetsPtRan(0x0),
333 fh2NConstLeadingPtRan(0x0),
338 fh2TracksLeadingJetPhiPtRan(0x0),
339 fh2TracksLeadingJetPhiPtWRan(0x0),
340 fh2PtGenPtSmeared(0x0),
342 fp1PtResolution(0x0),
349 for(int i = 0;i<3;i++){
350 fh1BiARandomCones[i] = 0;
351 fh1BiARandomConesRan[i] = 0;
353 for(int i = 0;i<kMaxCent;i++){
354 fh2JetsLeadingPhiPtC[i] = 0;
355 fh2JetsLeadingPhiPtWC[i] = 0; //! jet correlation with leading jet
356 fh2TracksLeadingJetPhiPtC[i] = 0;
357 fh2TracksLeadingJetPhiPtWC[i] = 0;
359 DefineOutput(1, TList::Class());
364 Bool_t AliAnalysisTaskJetCluster::Notify()
367 // Implemented Notify() to read the cross sections
368 // and number of trials from pyxsec.root
373 void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
377 // Create the output container
380 fRandom = new TRandom3(0);
386 if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
390 if(fNonStdBranch.Length()!=0)
392 // only create the output branch if we have a name
393 // Create a new branch for jets...
394 // -> cleared in the UserExec....
395 // here we can also have the case that the brnaches are written to a separate file
398 fTCAJetsOut = new TClonesArray("AliAODJet", 0);
399 fTCAJetsOut->SetName(fNonStdBranch.Data());
400 AddAODBranch("TClonesArray",&fTCAJetsOut,fNonStdFile.Data());
403 if(fJetTypes&kJetRan){
404 fTCAJetsOutRan = new TClonesArray("AliAODJet", 0);
405 fTCAJetsOutRan->SetName(Form("%s_%s",fNonStdBranch.Data(),"random"));
406 if(fUseDiceEfficiency || fUseTrMomentumSmearing)
407 fTCAJetsOutRan->SetName(Form("%s_%sDetector%d%d",fNonStdBranch.Data(),"random",fUseTrMomentumSmearing,fUseDiceEfficiency));
408 AddAODBranch("TClonesArray",&fTCAJetsOutRan,fNonStdFile.Data());
411 if(fUseBackgroundCalc){
412 if(!AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()))){
413 fAODJetBackgroundOut = new AliAODJetEventBackground();
414 fAODJetBackgroundOut->SetName(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()));
415 if(fUseDiceEfficiency || fUseTrMomentumSmearing)
416 fAODJetBackgroundOut->SetName(Form("%s_%sDetector%d%d",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data(),fUseTrMomentumSmearing,fUseDiceEfficiency));
418 AddAODBranch("AliAODJetEventBackground",&fAODJetBackgroundOut,fNonStdFile.Data());
421 // create the branch for the random cones with the same R
422 TString cName = Form("%sRandomConeSkip%02d",fNonStdBranch.Data(),fNSkipLeadingCone);
423 if(fUseDiceEfficiency || fUseTrMomentumSmearing)
424 cName = Form("%sDetector%d%d_RandomConeSkip%02d",fNonStdBranch.Data(),fUseTrMomentumSmearing,fUseDiceEfficiency,fNSkipLeadingCone);
428 if(!AODEvent()->FindListObject(cName.Data())){
429 fTCARandomConesOut = new TClonesArray("AliAODJet", 0);
430 fTCARandomConesOut->SetName(cName.Data());
431 AddAODBranch("TClonesArray",&fTCARandomConesOut,fNonStdFile.Data());
434 // create the branch with the random for the random cones on the random event
435 if(fJetTypes&kRCRan){
436 cName = Form("%sRandomCone_random",fNonStdBranch.Data());
437 if(!AODEvent()->FindListObject(cName.Data())){
438 fTCARandomConesOutRan = new TClonesArray("AliAODJet", 0);
439 fTCARandomConesOutRan->SetName(cName.Data());
440 AddAODBranch("TClonesArray",&fTCARandomConesOutRan,fNonStdFile.Data());
445 if(fNonStdFile.Length()!=0){
447 // case that we have an AOD extension we need to fetch the jets from the extended output
448 // we identify the extension aod event by looking for the branchname
449 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
450 // case that we have an AOD extension we need can fetch the background maybe from the extended output
451 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
455 // FitMomentumResolution();
458 if(!fHistList)fHistList = new TList();
459 fHistList->SetOwner();
460 PostData(1, fHistList); // post data in any case once
462 Bool_t oldStatus = TH1::AddDirectoryStatus();
463 TH1::AddDirectory(kFALSE);
468 const Int_t nBinPt = 100;
469 Double_t binLimitsPt[nBinPt+1];
470 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
472 binLimitsPt[iPt] = 0.0;
475 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.0;
479 const Int_t nBinPhi = 90;
480 Double_t binLimitsPhi[nBinPhi+1];
481 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
483 binLimitsPhi[iPhi] = -1.*TMath::Pi();
486 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
492 const Int_t nBinEta = 40;
493 Double_t binLimitsEta[nBinEta+1];
494 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
496 binLimitsEta[iEta] = -2.0;
499 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
503 const int nChMax = 5000;
505 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
506 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
508 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
509 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
512 fh1NJetsRec = new TH1F("fh1NJetsRec","N reconstructed jets",120,-0.5,119.5);
513 fh1NJetsRecRan = new TH1F("fh1NJetsRecRan","N reconstructed jets",120,-0.5,119.5);
515 fh1NConstRec = new TH1F("fh1NConstRec","# jet constituents",120,-0.5,119.5);
516 fh1NConstRecRan = new TH1F("fh1NConstRecRan","# jet constituents",120,-0.5,119.5);
517 fh1NConstLeadingRec = new TH1F("fh1NConstLeadingRec","jet constituents",120,-0.5,119.5);
518 fh1NConstLeadingRecRan = new TH1F("fh1NConstLeadingRecRan","jet constituents",120,-0.5,119.5);
521 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
522 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
523 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
525 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
526 fh1PtJetsRecInRan = new TH1F("fh1PtJetsRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
527 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
528 fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
529 fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
530 fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
531 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn",Form("Rec tracks P_T #eta < %1.2f;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
532 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn",Form("Rec tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
533 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn",Form("gen tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
534 fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
536 fh1Centrality = new TH1F("fh1Centrality",";cent (%)",111,-0.5,110.5);
537 fh1CentralitySelect = new TH1F("fh1CentralitySelect",";cent (%)",111,-0.5,110.5);
538 fh1CentralityPhySel = new TH1F("fh1CentralityPhySel",";cent (%)",111,-0.5,110.5);
540 fh1Z = new TH1F("fh1Z",";zvtx",100,-25,25);
541 fh1ZSelect = new TH1F("fh1ZSelect",";zvtx",100,-25,25);
542 fh1ZPhySel = new TH1F("fh1ZPhySel",";zvtx",100,-25,25);
544 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
545 fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
546 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
550 fh2NConstPt = new TH2F("fh2NConstPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
551 fh2NConstLeadingPt = new TH2F("fh2NConstLeadingPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
552 fh2NConstPtRan = new TH2F("fh2NConstPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
553 fh2NConstLeadingPtRan = new TH2F("fh2NConstLeadingPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
555 fh2PtNch = new TH2F("fh2PtNch","p_T of cluster vs. multiplicity; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
556 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);
557 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);
558 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);
562 fh2JetPhiEta = new TH2F("fh2JetPhiEta","eta vs phi all jets;#phi;#eta",
563 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
564 fh2LeadingJetPhiEta = new TH2F("fh2LeadingJetPhiEta","eta vs phi leading jets;#phi;#eta",
565 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
567 fh2JetEtaPt = new TH2F("fh2JetEtaPt","pt vs eta all jets;#eta;p_{T}",
568 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
569 fh2LeadingJetEtaPt = new TH2F("fh2LeadingJetEtaPt","pT vs eta leading jets;#eta;p_{T}",
570 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
572 fh2TrackEtaPt = new TH2F("fh2TrackEtaPt","pt vs eta all jets;#eta;p_{T}",
573 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
574 fh2LeadingTrackEtaPt = new TH2F("fh2LeadingTrackEtaPt","pT vs eta leading jets;#eta;p_{T}",
575 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
579 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
580 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
581 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
582 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
583 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
584 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
585 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
586 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
587 fh2TracksLeadingJetPhiPt = new TH2F("fh2TracksLeadingJetPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
588 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
589 fh2TracksLeadingJetPhiPtRan = new TH2F("fh2TracksLeadingJetPhiPtRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
590 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
592 fh2JetsLeadingPhiPtW = new TH2F("fh2JetsLeadingPhiPtW","leading p_T vs delta phi p_T weigted to leading jet;#Delta#phi;p_{T} (GeV/c)",
593 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
594 fh2TracksLeadingPhiPtW = new TH2F("fh2TracksLeadingPhiPtW","leading p_T vs delta phi to leading jet (p_T weighted);#Delta#phi;p_{T} (GeV/c)",
595 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
597 fh2TracksLeadingJetPhiPtW = new TH2F("fh2TracksLeadingJetPhiPtW","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
598 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
599 fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
600 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
602 //Detector level effects histos
603 fh2PtGenPtSmeared = new TH2F("fh2PtGenPtSmeared","fh2PtGenPtSmeared",nBinPt,binLimitsPt,nBinPt,binLimitsPt);
605 fp1Efficiency = new TProfile("fp1Efficiency","fp1Efficiency",nBinPt,binLimitsPt);
606 fp1PtResolution = new TProfile("fp1PtResolution","fp1PtResolution",nBinPt,binLimitsPt);
608 fHistList->Add(fh2PtGenPtSmeared);
609 fHistList->Add(fp1Efficiency);
610 fHistList->Add(fp1PtResolution);
612 if(fNRandomCones>0&&fUseBackgroundCalc){
613 for(int i = 0;i<3;i++){
614 fh1BiARandomCones[i] = new TH1F(Form("fh1BiARandomCones%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
615 fh1BiARandomConesRan[i] = new TH1F(Form("fh1BiARandomConesRan%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
619 for(int i = 0;i < kMaxCent;i++){
620 fh2JetsLeadingPhiPtC[i] = (TH2F*)fh2JetsLeadingPhiPt->Clone(Form("%s_C%02d",fh2JetsLeadingPhiPt->GetName(),i+1));
621 fh2JetsLeadingPhiPtWC[i]= (TH2F*)fh2JetsLeadingPhiPtW->Clone(Form("%s_C%02d",fh2JetsLeadingPhiPtW->GetName(),i+1));
622 fh2TracksLeadingJetPhiPtC[i] = (TH2F*)fh2TracksLeadingJetPhiPt->Clone(Form("%s_C%02d",fh2TracksLeadingJetPhiPt->GetName(),i+1));
623 fh2TracksLeadingJetPhiPtWC[i] = (TH2F*)fh2TracksLeadingJetPhiPtW->Clone(Form("%s_C%02d",fh2TracksLeadingJetPhiPtW->GetName(),i+1));
626 const Int_t saveLevel = 3; // large save level more histos
628 fHistList->Add(fh1Xsec);
629 fHistList->Add(fh1Trials);
631 fHistList->Add(fh1NJetsRec);
632 fHistList->Add(fh1NConstRec);
633 fHistList->Add(fh1NConstLeadingRec);
634 fHistList->Add(fh1PtJetsRecIn);
635 fHistList->Add(fh1PtJetsLeadingRecIn);
636 fHistList->Add(fh1PtTracksRecIn);
637 fHistList->Add(fh1PtTracksLeadingRecIn);
638 fHistList->Add(fh1PtJetConstRec);
639 fHistList->Add(fh1PtJetConstLeadingRec);
640 fHistList->Add(fh1NJetsRecRan);
641 fHistList->Add(fh1NConstRecRan);
642 fHistList->Add(fh1PtJetsLeadingRecInRan);
643 fHistList->Add(fh1NConstLeadingRecRan);
644 fHistList->Add(fh1PtJetsRecInRan);
645 fHistList->Add(fh1Nch);
646 fHistList->Add(fh1Centrality);
647 fHistList->Add(fh1CentralitySelect);
648 fHistList->Add(fh1CentralityPhySel);
649 fHistList->Add(fh1Z);
650 fHistList->Add(fh1ZSelect);
651 fHistList->Add(fh1ZPhySel);
652 if(fNRandomCones>0&&fUseBackgroundCalc){
653 for(int i = 0;i<3;i++){
654 fHistList->Add(fh1BiARandomCones[i]);
655 fHistList->Add(fh1BiARandomConesRan[i]);
658 for(int i = 0;i < kMaxCent;i++){
659 fHistList->Add(fh2JetsLeadingPhiPtC[i]);
660 fHistList->Add(fh2JetsLeadingPhiPtWC[i]);
661 fHistList->Add(fh2TracksLeadingJetPhiPtC[i]);
662 fHistList->Add(fh2TracksLeadingJetPhiPtWC[i]);
665 fHistList->Add(fh2NRecJetsPt);
666 fHistList->Add(fh2NRecTracksPt);
667 fHistList->Add(fh2NConstPt);
668 fHistList->Add(fh2NConstLeadingPt);
669 fHistList->Add(fh2PtNch);
670 fHistList->Add(fh2PtNchRan);
671 fHistList->Add(fh2PtNchN);
672 fHistList->Add(fh2PtNchNRan);
673 fHistList->Add(fh2JetPhiEta);
674 fHistList->Add(fh2LeadingJetPhiEta);
675 fHistList->Add(fh2JetEtaPt);
676 fHistList->Add(fh2LeadingJetEtaPt);
677 fHistList->Add(fh2TrackEtaPt);
678 fHistList->Add(fh2LeadingTrackEtaPt);
679 fHistList->Add(fh2JetsLeadingPhiEta );
680 fHistList->Add(fh2JetsLeadingPhiPt);
681 fHistList->Add(fh2TracksLeadingPhiEta);
682 fHistList->Add(fh2TracksLeadingPhiPt);
683 fHistList->Add(fh2TracksLeadingJetPhiPt);
684 fHistList->Add(fh2JetsLeadingPhiPtW);
685 fHistList->Add(fh2TracksLeadingPhiPtW);
686 fHistList->Add(fh2TracksLeadingJetPhiPtW);
687 fHistList->Add(fh2NRecJetsPtRan);
688 fHistList->Add(fh2NConstPtRan);
689 fHistList->Add(fh2NConstLeadingPtRan);
690 fHistList->Add(fh2TracksLeadingJetPhiPtRan);
691 fHistList->Add(fh2TracksLeadingJetPhiPtWRan);
694 // =========== Switch on Sumw2 for all histos ===========
695 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
696 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
701 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
704 TH1::AddDirectory(oldStatus);
707 void AliAnalysisTaskJetCluster::Init()
713 if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
715 FitMomentumResolution();
719 void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
722 // handle and reset the output jet branch
724 if(fTCAJetsOut)fTCAJetsOut->Delete();
725 if(fTCAJetsOutRan)fTCAJetsOutRan->Delete();
726 if(fTCARandomConesOut)fTCARandomConesOut->Delete();
727 if(fTCARandomConesOutRan)fTCARandomConesOutRan->Delete();
728 if(fAODJetBackgroundOut)fAODJetBackgroundOut->Reset();
730 AliAODJetEventBackground* externalBackground = 0;
731 if(!externalBackground&&fBackgroundBranch.Length()){
732 externalBackground = (AliAODJetEventBackground*)(AODEvent()->FindListObject(fBackgroundBranch.Data()));
733 if((!externalBackground)&&fAODExtension)externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
734 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
737 // Execute analysis for current event
739 AliESDEvent *fESD = 0;
740 if(fUseAODTrackInput){
741 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
743 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
749 // assume that the AOD is in the general output...
752 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
756 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
760 //Check if information is provided detector level effects
761 if(!fMomResH1 || !fMomResH2 || !fMomResH3) fUseTrMomentumSmearing = kFALSE;
762 if(!fhEffH1 || !fhEffH2 || !fhEffH3) fUseDiceEfficiency = kFALSE;
764 Bool_t selectEvent = false;
765 Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
771 const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
772 TString vtxTitle(vtxAOD->GetTitle());
773 zVtx = vtxAOD->GetZ();
775 cent = fAOD->GetHeader()->GetCentrality();
776 if(cent<10)cenClass = 0;
777 else if(cent<30)cenClass = 1;
778 else if(cent<50)cenClass = 2;
779 else if(cent<80)cenClass = 3;
780 if(physicsSelection){
781 fh1CentralityPhySel->Fill(cent);
782 fh1ZPhySel->Fill(zVtx);
786 if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
787 Float_t yvtx = vtxAOD->GetY();
788 Float_t xvtx = vtxAOD->GetX();
789 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
790 if(TMath::Abs(zVtx)<fVtxZCut&&r2<fVtxR2Cut){ // apply vertex cut later on
791 if(physicsSelection){
797 if(cent<fCentCutLo||cent>fCentCutUp){
808 PostData(1, fHistList);
811 fh1Centrality->Fill(cent);
813 fh1Trials->Fill("#sum{ntrials}",1);
816 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
818 // ==== General variables needed
822 // we simply fetch the tracks/mc particles as a list of AliVParticles
827 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
828 Float_t nCh = recParticles.GetEntries();
830 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
831 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
832 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
836 vector<fastjet::PseudoJet> inputParticlesRec;
837 vector<fastjet::PseudoJet> inputParticlesRecRan;
839 // Generate the random cones
841 AliAODJet vTmpRan(1,0,0,1);
842 for(int i = 0; i < recParticles.GetEntries(); i++){
843 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
845 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
846 // we take total momentum here
848 if((!fUseTrMomentumSmearing) && (!fUseDiceEfficiency)) {
849 //Add particles to fastjet in case we are not running toy model
850 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
851 jInp.set_user_index(i);
852 inputParticlesRec.push_back(jInp);
854 else if(fUseDiceEfficiency) {
856 // Dice to decide if particle is kept or not - toy model for efficiency
858 Double_t rnd = fRandom->Uniform(1.);
859 Double_t pT = vp->Pt();
860 Double_t eff[3] = {0.};
862 if(pT>10.) pTtmp = 10.;
863 Double_t eff1 = fhEffH1->GetBinContent(fhEffH1->FindBin(pTtmp));
864 Double_t eff2 = fhEffH2->GetBinContent(fhEffH2->FindBin(pTtmp));
865 Double_t eff3 = fhEffH3->GetBinContent(fhEffH3->FindBin(pTtmp));
867 //Sort efficiencies from large to small
868 if(eff1>eff2 && eff1>eff3) {
883 else if(eff2>eff1 && eff2>eff3) {
898 else if(eff3>eff1 && eff3>eff2) {
914 Double_t sumEff = eff[0]+eff[1]+eff[2];
915 fp1Efficiency->Fill(vp->Pt(),sumEff);
916 if(rnd>sumEff) continue;
918 if(fUseTrMomentumSmearing) {
919 //Smear momentum of generated particle
921 //Select hybrid track category
923 smear = GetMomentumSmearing(cat[2],pT);
924 else if(rnd<=(eff[2]+eff[1]))
925 smear = GetMomentumSmearing(cat[1],pT);
927 smear = GetMomentumSmearing(cat[0],pT);
929 fp1PtResolution->Fill(vp->Pt(),smear);
931 Double_t sigma = vp->Pt()*smear;
932 Double_t pTrec = fRandom->Gaus(vp->Pt(),sigma);
934 Double_t phi = vp->Phi();
935 Double_t theta = 2.*TMath::ATan(TMath::Exp(-1.*(vp->Eta())));
936 Double_t pX = pTrec * TMath::Cos(phi);
937 Double_t pY = pTrec * TMath::Sin(phi);
938 Double_t pZ = pTrec/TMath::Tan(theta);
939 Double_t p=TMath::Sqrt(pTrec*pTrec+pZ*pZ);
941 fh2PtGenPtSmeared->Fill(vp->Pt(),pTrec);
943 fastjet::PseudoJet jInp(pX,pY,pZ,p);
944 jInp.set_user_index(i);
945 inputParticlesRec.push_back(jInp);
949 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
950 jInp.set_user_index(i);
951 inputParticlesRec.push_back(jInp);
957 // the randomized input changes eta and phi, but keeps the p_T
958 if(i>=fNSkipLeadingRan){// eventually skip the leading particles
959 Double_t pT = vp->Pt();
960 Double_t eta = 2.*fTrackEtaWindow * fRandom->Rndm() - fTrackEtaWindow;
961 Double_t phi = 2.* TMath::Pi() * fRandom->Rndm();
963 Double_t theta = 2.*TMath::ATan(TMath::Exp(-eta));
964 Double_t pZ = pT/TMath::Tan(theta);
966 Double_t pX = pT * TMath::Cos(phi);
967 Double_t pY = pT * TMath::Sin(phi);
968 Double_t p = TMath::Sqrt(pT*pT+pZ*pZ);
969 fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
971 jInpRan.set_user_index(i);
972 inputParticlesRecRan.push_back(jInpRan);
973 vTmpRan.SetPxPyPzE(pX,pY,pZ,p);
976 // fill the tref array, only needed when we write out jets
979 fRef->Delete(); // make sure to delete before placement new...
980 if((!fUseTrMomentumSmearing) && (!fUseDiceEfficiency)) {
981 new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp)); //TRefArray does not work with toy model ...
984 if((!fUseTrMomentumSmearing) && (!fUseDiceEfficiency)) fRef->Add(vp); //TRefArray does not work with toy model ...
988 if(inputParticlesRec.size()==0){
989 if(fDebug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
990 PostData(1, fHistList);
995 // employ setters for these...
998 // now create the object that holds info about ghosts
1000 if(!fUseBackgroundCalc&& fNonStdBranch.Length()==0){
1001 // reduce CPU time...
1003 fActiveAreaRepeats = 0;
1007 fastjet::GhostedAreaSpec ghostSpec(fGhostEtamax, fActiveAreaRepeats, fGhostArea);
1008 fastjet::AreaType areaType = fastjet::active_area;
1009 fastjet::AreaDefinition areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
1010 fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
1011 fastjet::ClusterSequenceArea clustSeq(inputParticlesRec, jetDef,areaDef);
1013 //range where to compute background
1014 Double_t phiMin = 0, phiMax = 0, rapMin = 0, rapMax = 0;
1016 phiMax = 2*TMath::Pi();
1017 rapMax = fGhostEtamax - fRparam;
1018 rapMin = - fGhostEtamax + fRparam;
1019 fastjet::RangeDefinition range(rapMin,rapMax, phiMin, phiMax);
1022 const vector <fastjet::PseudoJet> &inclusiveJets = clustSeq.inclusive_jets();
1023 const vector <fastjet::PseudoJet> &sortedJets = sorted_by_pt(inclusiveJets);
1026 fh1NJetsRec->Fill(sortedJets.size());
1028 // loop over all jets an fill information, first on is the leading jet
1030 Int_t nRecOver = inclusiveJets.size();
1031 Int_t nRec = inclusiveJets.size();
1032 if(inclusiveJets.size()>0){
1033 AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
1034 Double_t area = clustSeq.area(sortedJets[0]);
1035 leadingJet.SetEffArea(area,0);
1036 Float_t pt = leadingJet.Pt();
1037 Int_t nAodOutJets = 0;
1038 Int_t nAodOutTracks = 0;
1039 AliAODJet *aodOutJet = 0;
1042 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
1043 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
1044 while(pt<ptCut&&iCount<nRec){
1048 pt = sortedJets[iCount].perp();
1051 if(nRecOver<=0)break;
1052 fh2NRecJetsPt->Fill(ptCut,nRecOver);
1054 Float_t phi = leadingJet.Phi();
1055 if(phi<0)phi+=TMath::Pi()*2.;
1056 Float_t eta = leadingJet.Eta();
1058 if(externalBackground){
1059 // carefull has to be filled in a task before
1060 // todo, ReArrange to the botom
1061 pTback = externalBackground->GetBackground(2)*leadingJet.EffectiveAreaCharged();
1063 pt = leadingJet.Pt() - pTback;
1064 // correlation of leading jet with tracks
1065 TIterator *recIter = recParticles.MakeIterator();
1067 AliVParticle *tmpRecTrack = 0;
1068 while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
1069 Float_t tmpPt = tmpRecTrack->Pt();
1071 Float_t tmpPhi = tmpRecTrack->Phi();
1072 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1073 Float_t dPhi = phi - tmpPhi;
1074 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1075 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1076 fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
1077 fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
1079 fh2TracksLeadingJetPhiPtC[cenClass]->Fill(dPhi,pt);
1080 fh2TracksLeadingJetPhiPtWC[cenClass]->Fill(dPhi,pt,tmpPt);
1086 TLorentzVector vecareab;
1087 for(int j = 0; j < nRec;j++){
1088 AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
1091 Float_t tmpPt = tmpRec.Pt();
1093 if(tmpPt>fJetOutputMinPt&&fTCAJetsOut){// cut on the non-background subtracted...
1094 aodOutJet = new ((*fTCAJetsOut)[nAodOutJets++]) AliAODJet(tmpRec);
1095 aodOutJet->GetRefTracks()->Clear();
1096 Double_t area1 = clustSeq.area(sortedJets[j]);
1097 aodOutJet->SetEffArea(area1,0);
1098 fastjet::PseudoJet vecarea=clustSeq.area_4vector(sortedJets[j]);
1099 vecareab.SetPxPyPzE(vecarea.px(),vecarea.py(),vecarea.pz(),vecarea.e());
1100 aodOutJet->SetVectorAreaCharged(&vecareab);
1104 Float_t tmpPtBack = 0;
1105 if(externalBackground){
1106 // carefull has to be filled in a task before
1107 // todo, ReArrange to the botom
1108 tmpPtBack = externalBackground->GetBackground(2)*tmpRec.EffectiveAreaCharged();
1110 tmpPt = tmpPt - tmpPtBack;
1111 if(tmpPt<0)tmpPt = 0; // avoid negative weights...
1113 fh1PtJetsRecIn->Fill(tmpPt);
1114 // Fill Spectra with constituentsemacs
1115 const vector<fastjet::PseudoJet> &constituents = clustSeq.constituents(sortedJets[j]);
1117 fh1NConstRec->Fill(constituents.size());
1118 fh2PtNch->Fill(nCh,tmpPt);
1119 fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
1120 fh2NConstPt->Fill(tmpPt,constituents.size());
1121 // loop over constiutents and fill spectrum
1123 AliVParticle *partLead = 0;
1124 Float_t ptLead = -1;
1126 for(unsigned int ic = 0; ic < constituents.size();ic++){
1127 AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
1129 fh1PtJetConstRec->Fill(part->Pt());
1131 if((!fUseTrMomentumSmearing) && (!fUseDiceEfficiency)) aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
1132 if(part->Pt()>fMaxTrackPtInJet){
1133 aodOutJet->SetTrigger(AliAODJet::kHighTrackPtTriggered);
1136 if(part->Pt()>ptLead){
1139 if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
1141 //set pT of leading constituent of jet
1142 aodOutJet->SetPtLeading(partLead->Pt());
1144 AliAODTrack *aodT = 0;
1146 aodT = dynamic_cast<AliAODTrack*>(partLead);
1148 if(aodT->TestFilterBit(fFilterMaskBestPt)){
1149 aodOutJet->SetTrigger(AliAODJet::kHighTrackPtBest);
1155 Float_t tmpPhi = tmpRec.Phi();
1156 Float_t tmpEta = tmpRec.Eta();
1157 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1159 fh1PtJetsLeadingRecIn->Fill(tmpPt);
1160 fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
1161 fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
1162 fh1NConstLeadingRec->Fill(constituents.size());
1163 fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
1166 fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
1167 fh2JetEtaPt->Fill(tmpEta,tmpPt);
1168 Float_t dPhi = phi - tmpPhi;
1169 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1170 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1171 Float_t dEta = eta - tmpRec.Eta();
1172 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
1173 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
1175 fh2JetsLeadingPhiPtC[cenClass]->Fill(dPhi,pt);
1176 fh2JetsLeadingPhiPtWC[cenClass]->Fill(dPhi,pt,tmpPt);
1178 fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
1179 }// loop over reconstructed jets
1184 // Add the random cones...
1185 if(fNRandomCones>0&&fTCARandomConesOut){
1186 // create a random jet within the acceptance
1187 Double_t etaMax = fTrackEtaWindow - fRparam;
1190 Double_t pTC = 1; // small number
1191 for(int ir = 0;ir < fNRandomCones;ir++){
1192 Double_t etaC = etaMax*2.*(fRandom->Rndm()-0.5); // +- etamax
1193 Double_t phiC = fRandom->Rndm()*2.*TMath::Pi(); // 0 - 2pi
1195 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
1196 Double_t pZC = pTC/TMath::Tan(thetaC);
1197 Double_t pXC = pTC * TMath::Cos(phiC);
1198 Double_t pYC = pTC * TMath::Sin(phiC);
1199 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
1200 AliAODJet tmpRecC (pXC,pYC,pZC, pC);
1202 for(int jj = 0; jj < TMath::Min(nRec,fNSkipLeadingCone);jj++){// test for overlap with leading jets
1203 AliAODJet jet (sortedJets[jj].px(), sortedJets[jj].py(), sortedJets[jj].pz(), sortedJets[jj].E());
1204 if(jet.DeltaR(& tmpRecC)<2.*fRparam+0.2){
1209 // test for overlap with previous cones to avoid double counting
1210 for(int iic = 0;iic<ir;iic++){
1211 AliAODJet *iicone = (AliAODJet*)fTCARandomConesOut->At(iic);
1213 if(iicone->DeltaR(&tmpRecC)<2.*fRparam){
1220 tmpRecC.SetBgEnergy(0,0); // this is use as temporary storage of the summed p_T below
1221 if(fTCARandomConesOut)new ((*fTCARandomConesOut)[nCone++]) AliAODJet(tmpRecC);
1222 if(fTCARandomConesOutRan)new ((*fTCARandomConesOutRan)[nConeRan++]) AliAODJet(tmpRecC);
1223 }// loop over random cones creation
1226 // loop over the reconstructed particles and add up the pT in the random cones
1227 // maybe better to loop over randomized particles not in the real jets...
1228 // but this by definition brings dow average energy in the whole event
1229 AliAODJet vTmpRanR(1,0,0,1);
1230 for(int i = 0; i < recParticles.GetEntries(); i++){
1231 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
1232 if(fTCARandomConesOut){
1233 for(int ir = 0;ir < fNRandomCones;ir++){
1234 AliAODJet *jC = (AliAODJet*)fTCARandomConesOut->At(ir);
1235 if(jC&&jC->DeltaR(vp)<fRparam){
1236 if(vp->Pt()>fMaxTrackPtInJet)jC->SetTrigger(AliAODJet::kHighTrackPtTriggered);
1237 jC->SetBgEnergy(jC->ChargedBgEnergy()+vp->Pt(),0);
1240 }// add up energy in cone
1242 // the randomized input changes eta and phi, but keeps the p_T
1243 if(i>=fNSkipLeadingRan){// eventually skip the leading particles
1244 Double_t pTR = vp->Pt();
1245 Double_t etaR = 2.*fTrackEtaWindow* fRandom->Rndm() - fTrackEtaWindow;
1246 Double_t phiR = 2.* TMath::Pi() * fRandom->Rndm();
1248 Double_t thetaR = 2.*TMath::ATan(TMath::Exp(-etaR));
1249 Double_t pZR = pTR/TMath::Tan(thetaR);
1251 Double_t pXR = pTR * TMath::Cos(phiR);
1252 Double_t pYR = pTR * TMath::Sin(phiR);
1253 Double_t pR = TMath::Sqrt(pTR*pTR+pZR*pZR);
1254 vTmpRanR.SetPxPyPzE(pXR,pYR,pZR,pR);
1255 if(fTCARandomConesOutRan){
1256 for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
1257 AliAODJet *jC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
1258 if(jC&&jC->DeltaR(&vTmpRanR)<fRparam){
1259 if(vTmpRanR.Pt()>fMaxTrackPtInJet)jC->SetTrigger(AliAODJet::kHighTrackPtTriggered);
1260 jC->SetBgEnergy(jC->ChargedBgEnergy()+vTmpRanR.Pt(),0);
1265 }// loop over recparticles
1267 Float_t jetArea = fRparam*fRparam*TMath::Pi();
1268 if(fTCARandomConesOut){
1269 for(int ir = 0;ir < fTCARandomConesOut->GetEntriesFast();ir++){
1270 // rescale the momntum vectors for the random cones
1272 AliAODJet *rC = (AliAODJet*)fTCARandomConesOut->At(ir);
1274 Double_t etaC = rC->Eta();
1275 Double_t phiC = rC->Phi();
1276 // massless jet, unit vector
1277 pTC = rC->ChargedBgEnergy();
1278 if(pTC<=0)pTC = 0.001; // for almost empty events
1279 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
1280 Double_t pZC = pTC/TMath::Tan(thetaC);
1281 Double_t pXC = pTC * TMath::Cos(phiC);
1282 Double_t pYC = pTC * TMath::Sin(phiC);
1283 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
1284 rC->SetPxPyPzE(pXC,pYC,pZC, pC);
1285 rC->SetBgEnergy(0,0);
1286 rC->SetEffArea(jetArea,0);
1290 if(fTCARandomConesOutRan){
1291 for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
1292 AliAODJet* rC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
1295 Double_t etaC = rC->Eta();
1296 Double_t phiC = rC->Phi();
1297 // massless jet, unit vector
1298 pTC = rC->ChargedBgEnergy();
1299 if(pTC<=0)pTC = 0.001;// for almost empty events
1300 Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
1301 Double_t pZC = pTC/TMath::Tan(thetaC);
1302 Double_t pXC = pTC * TMath::Cos(phiC);
1303 Double_t pYC = pTC * TMath::Sin(phiC);
1304 Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
1305 rC->SetPxPyPzE(pXC,pYC,pZC, pC);
1306 rC->SetBgEnergy(0,0);
1307 rC->SetEffArea(jetArea,0);
1311 }// if(fNRandomCones
1313 //background estimates:all bckg jets(0) & wo the 2 hardest(1)
1319 if(fAODJetBackgroundOut){
1320 vector<fastjet::PseudoJet> jets2=sortedJets;
1321 if(jets2.size()>2) jets2.erase(jets2.begin(),jets2.begin()+2);
1324 Double_t meanarea1=0.;
1327 Double_t meanarea2=0.;
1329 clustSeq.get_median_rho_and_sigma(jets2, range, true, bkg1, sigma1, meanarea1, true);
1330 fAODJetBackgroundOut->SetBackground(0,bkg1,sigma1,meanarea1);
1332 // fh1BiARandomCones[0]->Fill(omCone-(bkg1*areaRandomCone));
1333 // fh1BiARandomConesRan[0]->Fill(ptRandomConeRan-(bkg1*areaRandomCone));
1335 clustSeq.get_median_rho_and_sigma(jets2, range, false, bkg2, sigma2, meanarea2, true);
1336 fAODJetBackgroundOut->SetBackground(1,bkg2,sigma2,meanarea2);
1337 // fh1BiARandomCones[1]->Fill(ptRandomCone-(bkg2*areaRandomCone));
1338 // fh1BiARandomConesRan[1]->Fill(ptRandomConeRan-(bkg2*areaRandomCone));
1347 // fill track information
1348 Int_t nTrackOver = recParticles.GetSize();
1349 // do the same for tracks and jets
1352 TIterator *recIter = recParticles.MakeIterator();
1353 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
1354 Float_t pt = tmpRec->Pt();
1356 // Printf("Leading track p_t %3.3E",pt);
1357 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
1358 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
1359 while(pt<ptCut&&tmpRec){
1361 tmpRec = (AliVParticle*)(recIter->Next());
1366 if(nTrackOver<=0)break;
1367 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
1371 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
1372 Float_t phi = leading->Phi();
1373 if(phi<0)phi+=TMath::Pi()*2.;
1374 Float_t eta = leading->Eta();
1376 while((tmpRec = (AliVParticle*)(recIter->Next()))){
1377 Float_t tmpPt = tmpRec->Pt();
1378 Float_t tmpEta = tmpRec->Eta();
1379 fh1PtTracksRecIn->Fill(tmpPt);
1380 fh2TrackEtaPt->Fill(tmpEta,tmpPt);
1381 if(tmpRec==leading){
1382 fh1PtTracksLeadingRecIn->Fill(tmpPt);
1383 fh2LeadingTrackEtaPt->Fill(tmpEta,tmpPt);
1387 Float_t tmpPhi = tmpRec->Phi();
1389 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1390 Float_t dPhi = phi - tmpPhi;
1391 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1392 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1393 Float_t dEta = eta - tmpRec->Eta();
1394 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
1395 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
1396 fh2TracksLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
1401 // find the random jets
1403 fastjet::ClusterSequenceArea clustSeqRan(inputParticlesRecRan, jetDef, areaDef);
1405 // fill the jet information from random track
1406 const vector <fastjet::PseudoJet> &inclusiveJetsRan = clustSeqRan.inclusive_jets();
1407 const vector <fastjet::PseudoJet> &sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
1409 fh1NJetsRecRan->Fill(sortedJetsRan.size());
1411 // loop over all jets an fill information, first on is the leading jet
1413 Int_t nRecOverRan = inclusiveJetsRan.size();
1414 Int_t nRecRan = inclusiveJetsRan.size();
1416 if(inclusiveJetsRan.size()>0){
1417 AliAODJet leadingJet (sortedJetsRan[0].px(), sortedJetsRan[0].py(), sortedJetsRan[0].pz(), sortedJetsRan[0].E());
1418 Float_t pt = leadingJet.Pt();
1421 TLorentzVector vecarearanb;
1423 for(int i = 1;i <= fh2NRecJetsPtRan->GetNbinsX();i++){
1424 Float_t ptCut = fh2NRecJetsPtRan->GetXaxis()->GetBinCenter(i);
1425 while(pt<ptCut&&iCount<nRecRan){
1429 pt = sortedJetsRan[iCount].perp();
1432 if(nRecOverRan<=0)break;
1433 fh2NRecJetsPtRan->Fill(ptCut,nRecOverRan);
1435 Float_t phi = leadingJet.Phi();
1436 if(phi<0)phi+=TMath::Pi()*2.;
1437 pt = leadingJet.Pt();
1439 // correlation of leading jet with random tracks
1441 for(unsigned int ip = 0; ip < inputParticlesRecRan.size();ip++)
1443 Float_t tmpPt = inputParticlesRecRan[ip].perp();
1445 Float_t tmpPhi = inputParticlesRecRan[ip].phi();
1446 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1447 Float_t dPhi = phi - tmpPhi;
1448 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1449 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1450 fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
1451 fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
1454 Int_t nAodOutJetsRan = 0;
1455 AliAODJet *aodOutJetRan = 0;
1456 for(int j = 0; j < nRecRan;j++){
1457 AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
1458 Float_t tmpPt = tmpRec.Pt();
1459 fh1PtJetsRecInRan->Fill(tmpPt);
1460 // Fill Spectra with constituents
1461 const vector<fastjet::PseudoJet> &constituents = clustSeqRan.constituents(sortedJetsRan[j]);
1462 fh1NConstRecRan->Fill(constituents.size());
1463 fh2NConstPtRan->Fill(tmpPt,constituents.size());
1464 fh2PtNchRan->Fill(nCh,tmpPt);
1465 fh2PtNchNRan->Fill(nCh,tmpPt,constituents.size());
1468 if(tmpPt>fJetOutputMinPt&&fTCAJetsOutRan){
1469 aodOutJetRan = new ((*fTCAJetsOutRan)[nAodOutJetsRan++]) AliAODJet(tmpRec);
1470 Double_t arearan=clustSeqRan.area(sortedJetsRan[j]);
1471 aodOutJetRan->GetRefTracks()->Clear();
1472 aodOutJetRan->SetEffArea(arearan,0);
1473 fastjet::PseudoJet vecarearan=clustSeqRan.area_4vector(sortedJetsRan[j]);
1474 vecarearanb.SetPxPyPzE(vecarearan.px(),vecarearan.py(),vecarearan.pz(),vecarearan.e());
1475 aodOutJetRan->SetVectorAreaCharged(&vecarearanb);
1480 Float_t tmpPhi = tmpRec.Phi();
1481 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
1484 fh1PtJetsLeadingRecInRan->Fill(tmpPt);
1485 fh1NConstLeadingRecRan->Fill(constituents.size());
1486 fh2NConstLeadingPtRan->Fill(tmpPt,constituents.size());
1492 if(fAODJetBackgroundOut){
1495 Double_t meanarea3=0.;
1496 clustSeqRan.get_median_rho_and_sigma(sortedJetsRan ,range, false, bkg3, sigma3, meanarea3, true);
1497 fAODJetBackgroundOut->SetBackground(2,bkg3,sigma3,meanarea3);
1498 // float areaRandomCone = rRandomCone2 *TMath::Pi();
1500 fh1BiARandomCones[2]->Fill(ptRandomCone-(bkg3*areaRandomCone));
1501 fh1BiARandomConesRan[2]->Fill(ptRandomConeRan-(bkg3*areaRandomCone));
1510 // do the event selection if activated
1511 if(fJetTriggerPtCut>0){
1512 bool select = false;
1513 Float_t minPt = fJetTriggerPtCut;
1515 // hard coded for now ...
1516 // 54.50 44.5 29.5 18.5 for anti-kt rejection 1E-3
1517 if(cent<10)minPt = 50;
1518 else if(cent<30)minPt = 42;
1519 else if(cent<50)minPt = 28;
1520 else if(cent<80)minPt = 18;
1523 if(externalBackground)rho = externalBackground->GetBackground(2);
1525 for(int i = 0;i < fTCAJetsOut->GetEntriesFast();i++){
1526 AliAODJet *jet = (AliAODJet*)fTCAJetsOut->At(i);
1527 Float_t ptSub = jet->Pt() - rho *jet->EffectiveAreaCharged();
1536 static AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1537 fh1CentralitySelect->Fill(cent);
1538 fh1ZSelect->Fill(zVtx);
1539 aodH->SetFillAOD(kTRUE);
1543 if(fTCAJetsOut)Printf("%s:%d Rec Jets %d",(char*)__FILE__,__LINE__,fTCAJetsOut->GetEntriesFast());
1544 if(fTCAJetsOutRan)Printf("%s:%d Rec Jets Ran %d",(char*)__FILE__,__LINE__,fTCAJetsOutRan->GetEntriesFast());
1545 if(fTCARandomConesOut)Printf("%s:%d RC %d",(char*)__FILE__,__LINE__,fTCARandomConesOut->GetEntriesFast());
1546 if(fTCARandomConesOutRan)Printf("%s:%d RC Ran %d",(char*)__FILE__,__LINE__,fTCARandomConesOutRan->GetEntriesFast());
1548 PostData(1, fHistList);
1551 void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
1554 // Terminate analysis
1556 if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
1558 if(fMomResH1Fit) delete fMomResH1Fit;
1559 if(fMomResH2Fit) delete fMomResH2Fit;
1560 if(fMomResH3Fit) delete fMomResH3Fit;
1565 Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
1568 // get list of tracks/particles for different types
1571 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
1574 if(type==kTrackAOD || type==kTrackAODextra || type==kTrackAODextraonly){
1575 if(type!=kTrackAODextraonly) {
1576 AliAODEvent *aod = 0;
1577 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1578 else aod = AODEvent();
1580 if(fDebug>2)Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
1584 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1585 AliAODTrack *tr = aod->GetTrack(it);
1586 Bool_t bGood = false;
1587 if(fFilterType == 0)bGood = true;
1588 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1589 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1590 if((fFilterMask>0)&&((!tr->TestFilterBit(fFilterMask)||(!bGood)))){
1591 if(fDebug>10)Printf("%s:%d Not matching filter %d/%d %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks(),fFilterMask,tr->GetFilterMap());
1594 if(TMath::Abs(tr->Eta())>fTrackEtaWindow){
1595 if(fDebug>10)Printf("%s:%d Not matching eta %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
1598 if(tr->Pt()<fTrackPtCut){
1599 if(fDebug>10)Printf("%s:%d Not matching pt %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
1602 if(fDebug>10)Printf("%s:%d MATCHED %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
1607 if(type==kTrackAODextra || type==kTrackAODextraonly) {
1608 AliAODEvent *aod = 0;
1609 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1610 else aod = AODEvent();
1615 TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(aod->FindListObject("aodExtraTracks"));
1616 if(!aodExtraTracks)return iCount;
1617 for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
1618 AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
1619 if (!track) continue;
1621 AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
1622 if(!trackAOD)continue;
1623 Bool_t bGood = false;
1624 if(fFilterType == 0)bGood = true;
1625 else if(fFilterType == 1)bGood = trackAOD->IsHybridTPCConstrainedGlobal();
1626 else if(fFilterType == 2)bGood = trackAOD->IsHybridGlobalConstrainedGlobal();
1627 if((fFilterMask>0)&&((!trackAOD->TestFilterBit(fFilterMask)||(!bGood))))continue;
1628 if(TMath::Abs(trackAOD->Eta())>fTrackEtaWindow) continue;
1629 if(trackAOD->Pt()<fTrackPtCut) continue;
1630 list->Add(trackAOD);
1635 else if (type == kTrackKineAll||type == kTrackKineCharged){
1636 AliMCEvent* mcEvent = MCEvent();
1637 if(!mcEvent)return iCount;
1638 // we want to have alivpartilces so use get track
1639 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1640 if(!mcEvent->IsPhysicalPrimary(it))continue;
1641 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
1642 if(type == kTrackKineAll){
1643 if(part->Pt()<fTrackPtCut)continue;
1647 else if(type == kTrackKineCharged){
1648 if(part->Particle()->GetPDG()->Charge()==0)continue;
1649 if(part->Pt()<fTrackPtCut)continue;
1655 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1656 AliAODEvent *aod = 0;
1657 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1658 else aod = AODEvent();
1659 if(!aod)return iCount;
1660 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1661 if(!tca)return iCount;
1662 for(int it = 0;it < tca->GetEntriesFast();++it){
1663 AliAODMCParticle *part = (AliAODMCParticle*)(tca->At(it));
1664 if(!part->IsPhysicalPrimary())continue;
1665 if(type == kTrackAODMCAll){
1666 if(part->Pt()<fTrackPtCut)continue;
1670 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
1671 if(part->Charge()==0)continue;
1672 if(part->Pt()<fTrackPtCut)continue;
1673 if(kTrackAODMCCharged){
1677 if(TMath::Abs(part->Eta())>fTrackEtaWindow)continue;
1688 void AliAnalysisTaskJetCluster::SetMomentumResolutionHybrid(TProfile *p1, TProfile *p2, TProfile *p3) {
1691 // set mom res profiles
1694 fMomResH1 = (TProfile*)p1->Clone("fMomResH1");
1695 fMomResH2 = (TProfile*)p2->Clone("fMomResH2");
1696 fMomResH3 = (TProfile*)p3->Clone("fMomResH3");
1699 void AliAnalysisTaskJetCluster:: SetEfficiencyHybrid(TH1 *h1, TH1 *h2, TH1 *h3) {
1701 // set tracking efficiency histos
1704 fhEffH1 = (TH1*)h1->Clone("fhEffH1");
1705 fhEffH2 = (TH1*)h2->Clone("fhEffH2");
1706 fhEffH3 = (TH1*)h3->Clone("fhEffH3");
1709 Double_t AliAnalysisTaskJetCluster::GetMomentumSmearing(Int_t cat, Double_t pt) {
1712 // Get smearing on generated momentum
1715 //printf("GetMomentumSmearing for cat %d and pt = %f \n",cat,pt);
1717 TProfile *fMomRes = 0x0;
1718 if(cat==1) fMomRes = (TProfile*)fMomResH1->Clone("fMomRes");
1719 if(cat==2) fMomRes = (TProfile*)fMomResH2->Clone("fMomRes");
1720 if(cat==3) fMomRes = (TProfile*)fMomResH3->Clone("fMomRes");
1727 Double_t smear = 0.;
1730 if(cat==1 && fMomResH1Fit) smear = fMomResH1Fit->Eval(pt);
1731 if(cat==2 && fMomResH2Fit) smear = fMomResH2Fit->Eval(pt);
1732 if(cat==3 && fMomResH3Fit) smear = fMomResH3Fit->Eval(pt);
1736 Int_t bin = fMomRes->FindBin(pt);
1738 smear = fRandom->Gaus(fMomRes->GetBinContent(bin),fMomRes->GetBinError(bin));
1742 if(fMomRes) delete fMomRes;
1747 void AliAnalysisTaskJetCluster::FitMomentumResolution() {
1749 // Fit linear function on momentum resolution at high pT
1752 if(!fMomResH1Fit && fMomResH1) {
1753 fMomResH1Fit = new TF1("fMomResH1Fit","[0]+[1]*x",0.,200.);
1754 fMomResH1->Fit(fMomResH1Fit,"LL V0","",5.,30.);
1755 fMomResH1Fit ->SetRange(5.,100.);
1758 if(!fMomResH2Fit && fMomResH2) {
1759 fMomResH2Fit = new TF1("fMomResH2Fit","[0]+[1]*x",0.,200.);
1760 fMomResH2->Fit(fMomResH2Fit,"LL V0","",5.,30.);
1761 fMomResH2Fit ->SetRange(5.,100.);
1764 if(!fMomResH3Fit && fMomResH3) {
1765 fMomResH3Fit = new TF1("fMomResH3Fit","[0]+[1]*x",0.,200.);
1766 fMomResH3->Fit(fMomResH3Fit,"LL V0","",5.,30.);
1767 fMomResH3Fit ->SetRange(5.,100.);
1773 Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
1774 for(int i = 0; i < particles.GetEntries(); i++){
1775 AliVParticle *vp = (AliVParticle*)particles.At(i);
1776 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
1777 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->E());
1778 jInp.set_user_index(i);
1779 inputParticles.push_back(jInp);