]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/AliAnalysisTaskJetSpectrum2.cxx
Added data driven estimate for leading particle efficiency + coverity fixes (M. Verweij)
[u/mrichter/AliRoot.git] / PWGJE / AliAnalysisTaskJetSpectrum2.cxx
CommitLineData
3b7ffecf 1// **************************************
3170a3f8 2// used for the correction of determiantion of reconstructed jet spectra
3b7ffecf 3// Compares input (gen) and output (rec) jets
4// *******************************************
5
6
7/**************************************************************************
8 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
9 * *
10 * Author: The ALICE Off-line Project. *
11 * Contributors are mentioned in the code where appropriate. *
12 * *
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 **************************************************************************/
21
22
23#include <TROOT.h>
24#include <TRandom.h>
742ee86c 25#include <TRandom3.h>
3b7ffecf 26#include <TSystem.h>
27#include <TInterpreter.h>
28#include <TChain.h>
29#include <TFile.h>
30#include <TKey.h>
31#include <TH1F.h>
32#include <TH2F.h>
33#include <TH3F.h>
34#include <TProfile.h>
2eded560 35#include <TProfile2D.h>
3b7ffecf 36#include <TList.h>
37#include <TLorentzVector.h>
38#include <TClonesArray.h>
37eb26ea 39#include <TRefArray.h>
3b7ffecf 40#include "TDatabasePDG.h"
41
42#include "AliAnalysisTaskJetSpectrum2.h"
43#include "AliAnalysisManager.h"
44#include "AliJetFinder.h"
b99018c6 45#include "AliTHn.h"
3b7ffecf 46#include "AliJetHeader.h"
47#include "AliJetReader.h"
48#include "AliJetReaderHeader.h"
49#include "AliUA1JetHeaderV1.h"
50#include "AliESDEvent.h"
51#include "AliAODEvent.h"
52#include "AliAODHandler.h"
53#include "AliAODTrack.h"
54#include "AliAODJet.h"
c2785065 55#include "AliAODJetEventBackground.h"
3b7ffecf 56#include "AliAODMCParticle.h"
57#include "AliMCEventHandler.h"
58#include "AliMCEvent.h"
59#include "AliStack.h"
60#include "AliGenPythiaEventHeader.h"
61#include "AliJetKineReaderHeader.h"
62#include "AliGenCocktailEventHeader.h"
63#include "AliInputEventHandler.h"
152a0744 64#include "AliCFContainer.h"
3b7ffecf 65
66#include "AliAnalysisHelperJetTasks.h"
67
68ClassImp(AliAnalysisTaskJetSpectrum2)
69
37eb26ea 70AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2():
71 AliAnalysisTaskSE(),
a31b8a87 72 fJetHeaderRec(0x0),
73 fJetHeaderGen(0x0),
74 fAODIn(0x0),
75 fAODOut(0x0),
76 fAODExtension(0x0),
b99018c6 77 fhnJetContainer(0x0),
a31b8a87 78 fhnCorrelation(0x0),
90a006c2 79 fhnEvent(0x0),
c8eabe24 80 f1PtScale(0x0),
a31b8a87 81 fBranchRec("jets"),
82 fBranchGen(""),
37eb26ea 83 fBranchBkgRec(""),
84 fBranchBkgGen(""),
a31b8a87 85 fNonStdFile(""),
742ee86c 86 fRandomizer(0x0),
a31b8a87 87 fUseAODJetInput(kFALSE),
88 fUseAODTrackInput(kFALSE),
89 fUseAODMCInput(kFALSE),
90 fUseGlobalSelection(kFALSE),
91 fUseExternalWeightOnly(kFALSE),
92 fLimitGenJetEta(kFALSE),
b99018c6 93 fDoMatching(kFALSE),
a31b8a87 94 fNMatchJets(5),
7b822bc5 95 fNRPBins(3),
65c43de8 96 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
d7396b04 97 fJetTriggerBestMask(AliAODJet::kHighTrackPtBest),
a31b8a87 98 fFilterMask(0),
f2dd0695 99 fEventSelectionMask(0),
3d1dba29 100 fNTrigger(0),
101 fTriggerBit(0x0),
db745d29 102 fNAcceptance(0),
a31b8a87 103 fAnalysisType(0),
3b7ffecf 104 fTrackTypeRec(kTrackUndef),
105 fTrackTypeGen(kTrackUndef),
f4132e7d 106 fEventClass(0),
2eded560 107 fRPMethod(0),
3b7ffecf 108 fAvgTrials(1),
109 fExternalWeight(1),
a31b8a87 110 fJetRecEtaWindow(0.5),
111 fTrackRecEtaWindow(0.5),
9280dfa6 112 fMinJetPt(0),
a31b8a87 113 fMinTrackPt(0.15),
114 fDeltaPhiWindow(90./180.*TMath::Pi()),
69a0d320 115 fAcceptancePhiMin(0x0),
116 fAcceptancePhiMax(0x0),
117 fAcceptanceEtaMin(0x0),
118 fAcceptanceEtaMax(0x0),
742ee86c 119 fCentrality(100),
7b822bc5 120 fRPAngle(0),
37eb26ea 121 fMultRec(0),
122 fMultGen(0),
3d1dba29 123 fTriggerName(0x0),
3b7ffecf 124 fh1Xsec(0x0),
125 fh1Trials(0x0),
126 fh1PtHard(0x0),
127 fh1PtHardNoW(0x0),
128 fh1PtHardTrials(0x0),
57ca1193 129 fh1ZVtx(0x0),
7b822bc5 130 fh1RP(0x0),
742ee86c 131 fh1Centrality(0x0),
c8eabe24 132 fh1TmpRho(0x0),
37eb26ea 133 fh2MultRec(0x0),
134 fh2MultGen(0x0),
742ee86c 135 fh2RPCentrality(0x0),
a31b8a87 136 fh2PtFGen(0x0),
9a83d4af 137 fh2RelPtFGen(0x0),
3b7ffecf 138 fHistList(0x0)
139{
c17f867b 140
a31b8a87 141 for(int ij = 0;ij <kJetTypes;++ij){
742ee86c 142 fFlagJetType[ij] = 1; // default = on
a31b8a87 143 fh1NJets[ij] = 0;
144 fh1SumPtTrack[ij] = 0;
145 fh1PtJetsIn[ij] = 0;
65c43de8 146 fh1PtJetsInRej[ij] = 0;
b01d3ab7 147 fh1PtJetsInBest[ij] = 0;
a31b8a87 148 fh1PtTracksIn[ij] = 0;
cb883243 149 fh1PtTracksInLow[ij] = 0;
a31b8a87 150 fh2NJetsPt[ij] = 0;
151 fh2NTracksPt[ij] = 0;
2eded560 152 fp2MultRPPhiTrackPt[ij] = 0;
153 fp2CentRPPhiTrackPt[ij] = 0;
90a006c2 154 fhnJetPt[ij] = 0;
17f4943e 155 fhnJetPtBest[ij] = 0;
156 fhnJetPtRej[ij] = 0;
90a006c2 157 fhnJetPtQA[ij] = 0;
158 fhnTrackPt[ij] = 0;
159 fhnTrackPtQA[ij] = 0;
37eb26ea 160 for(int i = 0;i <= kMaxJets;++i){
d7117cbd 161 fh2LTrackPtJetPt[ij][i] = 0;
a31b8a87 162 fh1PtIn[ij][i] = 0;
a31b8a87 163 }
164
165 fh1DijetMinv[ij] = 0;
166 fh2DijetDeltaPhiPt[ij] = 0;
167 fh2DijetAsymPt[ij] = 0;
168 fh2DijetPt2vsPt1[ij] = 0;
169 fh2DijetDifvsSum[ij] = 0;
170
171 }
3b7ffecf 172}
173
174AliAnalysisTaskJetSpectrum2::AliAnalysisTaskJetSpectrum2(const char* name):
175 AliAnalysisTaskSE(name),
176 fJetHeaderRec(0x0),
177 fJetHeaderGen(0x0),
a31b8a87 178 fAODIn(0x0),
179 fAODOut(0x0),
180 fAODExtension(0x0),
b99018c6 181 fhnJetContainer(0x0),
3b7ffecf 182 fhnCorrelation(0x0),
90a006c2 183 fhnEvent(0x0),
c8eabe24 184 f1PtScale(0x0),
3b7ffecf 185 fBranchRec("jets"),
186 fBranchGen(""),
37eb26ea 187 fBranchBkgRec(""),
188 fBranchBkgGen(""),
a31b8a87 189 fNonStdFile(""),
742ee86c 190 fRandomizer(0x0),
565584e8 191 fUseAODJetInput(kFALSE),
192 fUseAODTrackInput(kFALSE),
193 fUseAODMCInput(kFALSE),
b5cc0c6d 194 fUseGlobalSelection(kFALSE),
3b7ffecf 195 fUseExternalWeightOnly(kFALSE),
196 fLimitGenJetEta(kFALSE),
b99018c6 197 fDoMatching(kFALSE),
a31b8a87 198 fNMatchJets(5),
7b822bc5 199 fNRPBins(3),
65c43de8 200 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
d7396b04 201 fJetTriggerBestMask(AliAODJet::kHighTrackPtBest),
3b7ffecf 202 fFilterMask(0),
f2dd0695 203 fEventSelectionMask(0),
3d1dba29 204 fNTrigger(0),
205 fTriggerBit(0x0),
db745d29 206 fNAcceptance(0),
3b7ffecf 207 fAnalysisType(0),
208 fTrackTypeRec(kTrackUndef),
209 fTrackTypeGen(kTrackUndef),
f4132e7d 210 fEventClass(0),
2eded560 211 fRPMethod(0),
3b7ffecf 212 fAvgTrials(1),
213 fExternalWeight(1),
a31b8a87 214 fJetRecEtaWindow(0.5),
215 fTrackRecEtaWindow(0.5),
9280dfa6 216 fMinJetPt(0),
a31b8a87 217 fMinTrackPt(0.15),
218 fDeltaPhiWindow(90./180.*TMath::Pi()),
69a0d320 219 fAcceptancePhiMin(0x0),
220 fAcceptancePhiMax(0x0),
221 fAcceptanceEtaMin(0x0),
222 fAcceptanceEtaMax(0x0),
742ee86c 223 fCentrality(100),
7b822bc5 224 fRPAngle(0),
37eb26ea 225 fMultRec(0),
226 fMultGen(0),
3d1dba29 227 fTriggerName(0x0),
3b7ffecf 228 fh1Xsec(0x0),
229 fh1Trials(0x0),
230 fh1PtHard(0x0),
231 fh1PtHardNoW(0x0),
232 fh1PtHardTrials(0x0),
57ca1193 233 fh1ZVtx(0x0),
7b822bc5 234 fh1RP(0x0),
742ee86c 235 fh1Centrality(0x0),
c8eabe24 236 fh1TmpRho(0x0),
37eb26ea 237 fh2MultRec(0x0),
238 fh2MultGen(0x0),
742ee86c 239 fh2RPCentrality(0x0),
a31b8a87 240 fh2PtFGen(0x0),
9a83d4af 241 fh2RelPtFGen(0x0),
3b7ffecf 242 fHistList(0x0)
243{
244
a31b8a87 245 for(int ij = 0;ij <kJetTypes;++ij){
742ee86c 246 fFlagJetType[ij] = 1; // default = on
a31b8a87 247 fh1NJets[ij] = 0;
248 fh1SumPtTrack[ij] = 0;
249 fh1PtJetsIn[ij] = 0;
65c43de8 250 fh1PtJetsInRej[ij] = 0;
b01d3ab7 251 fh1PtJetsInBest[ij] = 0;
a31b8a87 252 fh1PtTracksIn[ij] = 0;
cb883243 253 fh1PtTracksInLow[ij] = 0;
a31b8a87 254 fh2NJetsPt[ij] = 0;
255 fh2NTracksPt[ij] = 0;
2eded560 256 fp2MultRPPhiTrackPt[ij] = 0;
257 fp2CentRPPhiTrackPt[ij] = 0;
90a006c2 258 fhnJetPt[ij] = 0;
17f4943e 259 fhnJetPtBest[ij] = 0;
260 fhnJetPtRej[ij] = 0;
90a006c2 261 fhnJetPtQA[ij] = 0;
262 fhnTrackPt[ij] = 0;
263 fhnTrackPtQA[ij] = 0;
37eb26ea 264 for(int i = 0;i <= kMaxJets;++i){
d7117cbd 265 fh2LTrackPtJetPt[ij][i] = 0;
a31b8a87 266 fh1PtIn[ij][i] = 0;
a31b8a87 267 }
268
269 fh1DijetMinv[ij] = 0;
270 fh2DijetDeltaPhiPt[ij] = 0;
271 fh2DijetAsymPt[ij] = 0;
272 fh2DijetPt2vsPt1[ij] = 0;
273 fh2DijetDifvsSum[ij] = 0;
274 }
275
37eb26ea 276 DefineOutput(1, TList::Class());
3b7ffecf 277}
278
279
280
281Bool_t AliAnalysisTaskJetSpectrum2::Notify()
282{
a31b8a87 283
284
285
3b7ffecf 286 //
287 // Implemented Notify() to read the cross sections
288 // and number of trials from pyxsec.root
289 //
a31b8a87 290
291 // Fetch the aod also from the input in,
292 // have todo it in notify
293
294
295 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
296 // assume that the AOD is in the general output...
297 fAODOut = AODEvent();
298
299 if(fNonStdFile.Length()!=0){
300 // case that we have an AOD extension we need can fetch the jets from the extended output
301 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
e855f5c5 302 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
a31b8a87 303 if(!fAODExtension){
304 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
305 }
306 }
307
3b7ffecf 308
309 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
310 Float_t xsection = 0;
311 Float_t ftrials = 1;
312
313 fAvgTrials = 1;
314 if(tree){
315 TFile *curfile = tree->GetCurrentFile();
316 if (!curfile) {
317 Error("Notify","No current file");
318 return kFALSE;
319 }
320 if(!fh1Xsec||!fh1Trials){
321 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
322 return kFALSE;
323 }
324 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
325 fh1Xsec->Fill("<#sigma>",xsection);
326 // construct a poor man average trials
327 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
a221560c 328 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
3b7ffecf 329 }
a31b8a87 330
d7117cbd 331 if(fDebug)Printf("Reading File %s",fInputHandler->GetTree()->GetCurrentFile()->GetName());
a31b8a87 332
3b7ffecf 333 return kTRUE;
334}
335
336void AliAnalysisTaskJetSpectrum2::UserCreateOutputObjects()
337{
338
742ee86c 339
3b7ffecf 340 // Connect the AOD
341
3b7ffecf 342 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::UserCreateOutputObjects() \n");
3b7ffecf 343 OpenFile(1);
37eb26ea 344 if(!fHistList)fHistList = new TList();
40440b28 345 PostData(1, fHistList); // post data in any case once
346
742ee86c 347 if(!fRandomizer)fRandomizer = new TRandom3(0);
348
5cb0f438 349 fHistList->SetOwner(kTRUE);
37eb26ea 350 Bool_t oldStatus = TH1::AddDirectoryStatus();
3b7ffecf 351 TH1::AddDirectory(kFALSE);
352
90a006c2 353
354
355 // event npsparse cent, mult
3d1dba29 356 const Int_t nBinsSparse0 = 3;
357 const Int_t nBins0[nBinsSparse0] = { 100, 500,fNTrigger};
358 const Double_t xmin0[nBinsSparse0] = { 0, 0, -0.5};
359 const Double_t xmax0[nBinsSparse0] = { 100,5000,fNTrigger-0.5};
90a006c2 360
361
362 fhnEvent = new THnSparseF("fhnEvent",";cent;mult",nBinsSparse0,
363 nBins0,xmin0,xmax0);
364 fHistList->Add(fhnEvent);
365
b99018c6 366 if(fDoMatching){
367 MakeJetContainer();
368 fHistList->Add(fhnCorrelation);
369 fHistList->Add(fhnJetContainer);
370 }
3b7ffecf 371 //
372 // Histogram
373
90a006c2 374
375
ed5c9f3f 376 const Int_t nBinPt = 120;
3b7ffecf 377 Double_t binLimitsPt[nBinPt+1];
378 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
379 if(iPt == 0){
ed5c9f3f 380 binLimitsPt[iPt] = -50.0;
3b7ffecf 381 }
382 else {// 1.0
e24d63c0 383 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.5;
3b7ffecf 384 }
385 }
edfbe476 386 const Int_t nBinPhi = 90;
3b7ffecf 387 Double_t binLimitsPhi[nBinPhi+1];
388 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
389 if(iPhi==0){
37eb26ea 390 binLimitsPhi[iPhi] = 0;
3b7ffecf 391 }
392 else{
393 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
394 }
395 }
396
edfbe476 397 const Int_t nBinEta = 40;
398 Double_t binLimitsEta[nBinEta+1];
399 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
400 if(iEta==0){
401 binLimitsEta[iEta] = -2.0;
402 }
403 else{
cf049e94 404 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
edfbe476 405 }
406 }
407
a31b8a87 408
3b7ffecf 409 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
410 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
90a006c2 411 fHistList->Add(fh1Xsec);
3b7ffecf 412 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
413 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
a31b8a87 414 fHistList->Add(fh1Trials);
3b7ffecf 415 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
a31b8a87 416 fHistList->Add(fh1PtHard);
3b7ffecf 417 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
a31b8a87 418 fHistList->Add(fh1PtHardNoW);
3b7ffecf 419 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
a31b8a87 420 fHistList->Add(fh1PtHardTrials);
a31b8a87 421
57ca1193 422 fh1ZVtx = new TH1F("fh1ZVtx","z vtx;z_{vtx} (cm)",400,-20,20);
a31b8a87 423 fHistList->Add(fh1ZVtx);
7b822bc5 424
2eded560 425
9939142f 426 fh1RP = new TH1F("fh1RP","RP;#Psi",440, -1.*TMath::Pi(), 2.*TMath::Pi());
7b822bc5 427 fHistList->Add(fh1RP);
428
eb1739b7 429 fh1Centrality = new TH1F("fh1Centrality","cent;cent (%)",103,-1,102);
742ee86c 430 fHistList->Add(fh1Centrality);
431
3170a3f8 432 fh2MultRec = new TH2F("fh2MultRec","multiplicity rec;# tracks;# jetrefs",500,0,5000,500,0.,5000);
37eb26ea 433 fHistList->Add(fh2MultRec);
3170a3f8 434 fh2MultGen = new TH2F("fh2MultGen","multiplicity gen;# tracks;# jetrefs",400,0,5000,500,0.,5000);
37eb26ea 435 fHistList->Add(fh2MultGen);
a31b8a87 436
a31b8a87 437
742ee86c 438 fh2RPCentrality = new TH2F("fh2RPCentrality" ,"Reaction Plane Angle" , 20, 0.,100., 180, 0, TMath::Pi());
439 fHistList->Add(fh2RPCentrality);
a31b8a87 440
742ee86c 441 fh2PtFGen = new TH2F("fh2PtFGen",Form("%s vs. %s;p_{T,gen};p_{T,rec}",fBranchRec.Data(),fBranchGen.Data()),nBinPt,binLimitsPt,nBinPt,binLimitsPt);
442 fHistList->Add(fh2PtFGen);
a31b8a87 443
742ee86c 444 fh2RelPtFGen = new TH2F("fh2RelPtFGen",";p_{T,gen};p_{T,rec}-p_{T,gen}/p_{T,Gen}",nBinPt,binLimitsPt,241,-2.41,2.41);
445 fHistList->Add(fh2RelPtFGen);
742ee86c 446
447 for(int ij = 0;ij <kJetTypes;++ij){
448 TString cAdd = "";
449 TString cJetBranch = "";
450 if(ij==kJetRec){
451 cAdd = "Rec";
452 cJetBranch = fBranchRec.Data();
453 }
454 else if (ij==kJetGen){
455 cAdd = "Gen";
456 cJetBranch = fBranchGen.Data();
457 }
458 else if (ij==kJetRecFull){
459 cAdd = "RecFull";
460 cJetBranch = fBranchRec.Data();
461 }
462 else if (ij==kJetGenFull){
463 cAdd = "GenFull";
464 cJetBranch = fBranchGen.Data();
465 }
a31b8a87 466
742ee86c 467 if(cJetBranch.Length()==0)fFlagJetType[ij] = 0;
468 if(!fFlagJetType[ij])continue;
7b822bc5 469
742ee86c 470 fh1NJets[ij] =new TH1F(Form("fh1N%sJets",cAdd.Data()),Form("N %s jets",cAdd.Data()),50,-0.5,49.5);
471 fHistList->Add(fh1NJets[ij]);
472
473 fh1PtJetsIn[ij] = new TH1F(Form("fh1PtJets%sIn",cAdd.Data()),Form("%s jets p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
474 fHistList->Add(fh1PtJetsIn[ij]);
65c43de8 475
476 fh1PtJetsInRej[ij] = new TH1F(Form("fh1PtJets%sInRej",cAdd.Data()),Form("%s jets p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
477 fHistList->Add(fh1PtJetsInRej[ij]);
d7396b04 478
479 fh1PtJetsInBest[ij] = new TH1F(Form("fh1PtJets%sInBest",cAdd.Data()),Form("%s jets p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
480 fHistList->Add(fh1PtJetsInBest[ij]);
742ee86c 481
482 fh1PtTracksIn[ij] = new TH1F(Form("fh1PtTracks%sIn",cAdd.Data()),Form("%s track p_T;p_{T} (GeV/c)",cAdd.Data()),nBinPt,binLimitsPt);
483 fHistList->Add(fh1PtTracksIn[ij]);
484
2eded560 485 fh1PtTracksInLow[ij] = new TH1F(Form("fh1PtTracks%sInLow",cAdd.Data()),Form("%s track p_T;p_{T} (GeV/c)",cAdd.Data()),100,0.,5.);
742ee86c 486 fHistList->Add(fh1PtTracksInLow[ij]);
487
3170a3f8 488 fh1SumPtTrack[ij] = new TH1F(Form("fh1SumPtTrack%s",cAdd.Data()),Form("Sum %s track p_T;p_{T} (GeV/c)",cAdd.Data()),1000,0.,3000.);
742ee86c 489 fHistList->Add(fh1SumPtTrack[ij]);
490
491 fh2NJetsPt[ij] = new TH2F(Form("fh2N%sJetsPt",cAdd.Data()),Form("Number of %s jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",cAdd.Data()),nBinPt,binLimitsPt,50,-0.5,49.5);
492 fHistList->Add(fh2NJetsPt[ij]);
493
3170a3f8 494 fh2NTracksPt[ij] = new TH2F(Form("fh2N%sTracksPt",cAdd.Data()),Form("Number of %s tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",cAdd.Data()),nBinPt,binLimitsPt,1000,0.,5000);
742ee86c 495 fHistList->Add(fh2NTracksPt[ij]);
90a006c2 496
2eded560 497
498 fp2MultRPPhiTrackPt[ij] = new TProfile2D(Form("fp2MultRPPhiTrackPt%s",cAdd.Data()),"RP phi vs Number of tracks;# tracks;#Delta#phi_{RP}; <p_{T}>",20,0,4000,181,-1./180.*TMath::Pi(),TMath::Pi(),"S");
499 fHistList->Add(fp2MultRPPhiTrackPt[ij]);
500 fp2CentRPPhiTrackPt[ij] = new TProfile2D(Form("fp2CentRPPhiTrackPt%s",cAdd.Data()),"RP phi vs cent;# cent;#Delta#phi_{RP}; <p_{T}>",10,0,100,181,-1./180.*TMath::Pi(),TMath::Pi(),"S");
501 fHistList->Add(fp2CentRPPhiTrackPt[ij]);
502
556ccab2 503 // Bins: Jet number: pTJet, cent, mult, RP, Area, trigger, leading track pT total bins = 4.5M
db745d29 504 const Int_t nBinsSparse1 = 9;
556ccab2 505 const Int_t nBinsLeadingTrackPt = 10;
152a0744 506 const Int_t nBinsArea = 10;
507 Int_t nBins1[nBinsSparse1] = { kMaxJets+1,120, 10, 20, fNRPBins, nBinsArea,fNTrigger,nBinsLeadingTrackPt,fNAcceptance+1};
d01931c3 508 if(cJetBranch.Contains("RandomCone")){
509 nBins1[1] = 600;
510 nBins1[5] = 1;
511 }
152a0744 512 const Double_t xmin1[nBinsSparse1] = { -0.5,-50, 0, 0, -0.5, 0., -0.5, 0., -0.5,};
db745d29 513 const Double_t xmax1[nBinsSparse1] = {kMaxJets+0.5,250,100,4000,fNRPBins-0.5,1.0,fNTrigger-0.5,200.,fNAcceptance+0.5};
2eded560 514
152a0744 515 const Double_t binArrayArea[nBinsArea+1] = {xmin1[5],0.05,0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,xmax1[5]};
556ccab2 516 const Double_t binArrayLeadingTrackPt[nBinsLeadingTrackPt+1] = {xmin1[7],1.,2.,3.,4.,5.,6.,8.,10.,12.,xmax1[7]}; //store pT of leading track in jet
7bee4353 517
db745d29 518 fhnJetPt[ij] = new THnSparseF(Form("fhnJetPt%s",cAdd.Data()),";jet number;p_{T,jet};cent;# tracks;RP;area;trigger;leading track p_{T};acceptance bin",nBinsSparse1,nBins1,xmin1,xmax1);
152a0744 519 fhnJetPt[ij]->SetBinEdges(5,binArrayArea);
7bee4353 520 fhnJetPt[ij]->SetBinEdges(7,binArrayLeadingTrackPt);
2eded560 521 fHistList->Add(fhnJetPt[ij]);
17f4943e 522
523
524 // Bins: pTJet, cent, trigger,
525 const Int_t nBinsSparse1b = 3;
526 Int_t nBins1b[nBinsSparse1b] = {120, 10,fNTrigger};
527 const Double_t xmin1b[nBinsSparse1b] = {-50, 0,-0.5};
528 const Double_t xmax1b[nBinsSparse1b] = {250,100,fNTrigger-0.5};
529
530 fhnJetPtBest[ij] = new THnSparseF(Form("fhnJetPtBest%s",cAdd.Data()),";p_{T,jet};cent;trigger",nBinsSparse1b,nBins1b,xmin1b,xmax1b);
531 fHistList->Add(fhnJetPtBest[ij]);
532
533 fhnJetPtRej[ij] = new THnSparseF(Form("fhnJetPtRej%s",cAdd.Data()),";p_{T,jet};cent;trigger",nBinsSparse1b,nBins1b,xmin1b,xmax1b);
534 fHistList->Add(fhnJetPtRej[ij]);
2eded560 535
536 // Bins: Jet number: pTJet, cent, eta, phi, Area. total bins = 9.72 M
5662640e 537 const Int_t nBinsSparse2 = 9;
538 Int_t nBins2[nBinsSparse2] = { kMaxJets+1, 25, 8, 18, 180, 10,fNTrigger,fNAcceptance+0.5,10};
d01931c3 539 if(cJetBranch.Contains("RandomCone")){
540 nBins2[5] = 1;
541 }
5662640e 542 const Double_t xmin2[nBinsSparse2] = { -0.5, 0, 0,-0.9, 0, 0.,-0.5,-0.5,-100};
543 const Double_t xmax2[nBinsSparse2] = {kMaxJets+0.5,250, 80, 0.9, 2.*TMath::Pi(),1.0,fNTrigger-0.5,fNAcceptance+0.5,100};
544 fhnJetPtQA[ij] = new THnSparseF(Form("fhnJetPtQA%s",cAdd.Data()),";jet number;p_{T,jet};cent;#eta;#phi;area;trigger;acceptance bin;signed pt leading",nBinsSparse2,nBins2,xmin2,xmax2);
d01931c3 545 fHistList->Add(fhnJetPtQA[ij]);
546
547 // Bins:track number pTtrack, cent, mult, RP. total bins = 224 k
e5697f4d 548 const Int_t nBinsSparse3 = 6;
17f4943e 549 const Int_t nBins3[nBinsSparse3] = { 2, 100, 10, 1, fNRPBins,fNTrigger};
e5697f4d 550 const Double_t xmin3[nBinsSparse3] = { -0.5, 0, 0, 0, -0.5,-0.5};
551 const Double_t xmax3[nBinsSparse3] = { 1.5, 200, 100, 4000,fNRPBins-0.5,fNTrigger-0.5};
d01931c3 552
90a006c2 553 // change the binning ot the pT axis:
d01931c3 554 Double_t *xPt3 = new Double_t[nBins3[1]+1];
555 xPt3[0] = 0.;
556 for(int i = 1; i<=nBins3[1];i++){
557 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.05; // 1 - 40
558 else if(xPt3[i-1]<4)xPt3[i] = xPt3[i-1] + 0.2; // 41 - 50
559 else if(xPt3[i-1]<10)xPt3[i] = xPt3[i-1] + 0.5; // 50 - 62
17f4943e 560 else if(xPt3[i-1]<15)xPt3[i] = xPt3[i-1] + 1.; // 62 - 67
561 else if(xPt3[i-1]<20)xPt3[i] = xPt3[i-1] + 2.; // 67 - 72
562 else if(xPt3[i-1]<60)xPt3[i] = xPt3[i-1] + 5; // 72 - 76
563 else xPt3[i] = xPt3[i-1] + 10; // 76 - 100 = 140
d01931c3 564 }
565
17f4943e 566 fhnTrackPt[ij] = new THnSparseF(Form("fhnTrackPt%s",cAdd.Data()),";track number;p_{T};cent;#tracks;RP;trigger",nBinsSparse3,nBins3,xmin3,xmax3);
90a006c2 567 fhnTrackPt[ij]->SetBinEdges(1,xPt3);
568 fHistList->Add(fhnTrackPt[ij]);
569 delete [] xPt3;
570
571 // Track QA bins track nr, pTrack, cent, eta, phi bins 5.4 M
5662640e 572 const Int_t nBinsSparse4 = 6;
573 const Int_t nBins4[nBinsSparse4] = { 2, 50, 10, 20, 180,2};
574 const Double_t xmin4[nBinsSparse4] = { -0.5, 0, 0, -1.0, 0.,-1.5};
575 const Double_t xmax4[nBinsSparse4] = { 1.5,150, 100, 1.0,2.*TMath::Pi(),1.5};
90a006c2 576
577 // change the binning ot the pT axis:
578 Double_t *xPt4 = new Double_t[nBins4[1]+1];
579 xPt4[0] = 0.;
580 for(int i = 1; i<=nBins4[1];i++){
581 if(xPt4[i-1]<2)xPt4[i] = xPt4[i-1] + 0.1;
582 else if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 0.5;
583 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 1.;
e24d63c0 584 else if(xPt4[i-1]<30)xPt4[i] = xPt4[i-1] + 2.5;
90a006c2 585 else xPt4[i] = xPt4[i-1] + 5.;
586 }
5662640e 587 fhnTrackPtQA[ij] = new THnSparseF(Form("fhnTrackPtQA%s",cAdd.Data()),";track number;p_{T};cent;#eta;#phi;sign",nBinsSparse4,nBins4,xmin4,xmax4);
90a006c2 588 fhnTrackPtQA[ij]->SetBinEdges(1,xPt4);
589 fHistList->Add(fhnTrackPtQA[ij]);
590 delete [] xPt4;
a31b8a87 591
37eb26ea 592 for(int i = 0;i <= kMaxJets;++i){
a31b8a87 593 fh1PtIn[ij][i] = new TH1F(Form("fh1Pt%sIn_j%d",cAdd.Data(),i),Form("%s p_T input ;p_{T}",cAdd.Data()),nBinPt,binLimitsPt);
594 fHistList->Add(fh1PtIn[ij][i]);
595
d7117cbd 596
90a006c2 597 if(!fh1TmpRho)fh1TmpRho = new TH1F("fh1TmpRho","tmp histo for jet shape",40,0.,2);
d7117cbd 598 fh2LTrackPtJetPt[ij][i] = new TH2F(Form("fh2LTrackPtJetPt%s_j%d",cAdd.Data(),i),
599 Form("pt of leadin track within a jet vs jet %s;p_{T,lead in jet};p_{T.jet};",
600 cAdd.Data()),
601 200,0.,200.,nBinPt,binLimitsPt);
602 fHistList->Add(fh2LTrackPtJetPt[ij][i]);
a31b8a87 603 }
604
605
606 fh1DijetMinv[ij] = new TH1F(Form("fh1Dijet%sMinv",cAdd.Data()),"Dijet invariant mass;m_{JJ}",nBinPt,binLimitsPt);
607 fHistList->Add(fh1DijetMinv[ij]);
608
b5d90baf 609 fh2DijetDeltaPhiPt[ij] = new TH2F(Form("fh2Dijet%sDeltaPhiPt",cAdd.Data()),"Difference in the azimuthal angle;#Delta#phi;p_{T,2};Entries",180,0.,TMath::Pi(),nBinPt,binLimitsPt);
a31b8a87 610 fHistList->Add(fh2DijetDeltaPhiPt[ij]);
611
612 fh2DijetAsymPt[ij] = new TH2F(Form("fh2Dijet%sAsym",cAdd.Data()),"Pt asymmetry;#Deltap_{T}/(p_{T,1}+p_{T,2});p_{T,1};Entries",50,0.,1.,nBinPt,binLimitsPt);
613 fHistList->Add(fh2DijetAsymPt[ij]);
614
615 fh2DijetPt2vsPt1[ij] = new TH2F(Form("fh2Dijet%sPt2vsPt1",cAdd.Data()),"Pt2 versus Pt1;p_{T,1} (GeV/c);p_{T,2} (GeV/c)",250,0.,250.,250,0.,250.);
616 fHistList->Add(fh2DijetPt2vsPt1[ij]);
a31b8a87 617 fh2DijetDifvsSum[ij] = new TH2F(Form("fh2Dijet%sDifvsSum",cAdd.Data()),"Pt difference vs Pt sum;p_{T,1}+p_{T,2} (GeV/c);#Deltap_{T} (GeV/c)",400,0.,400.,150,0.,150.);
618 fHistList->Add( fh2DijetDifvsSum[ij]);
619 }
3b7ffecf 620 // =========== Switch on Sumw2 for all histos ===========
621 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
622 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
623 if (h1){
624 h1->Sumw2();
625 continue;
626 }
627 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
628 if(hn)hn->Sumw2();
629 }
630 TH1::AddDirectory(oldStatus);
631}
632
633void AliAnalysisTaskJetSpectrum2::Init()
634{
635 //
636 // Initialization
637 //
638
3b7ffecf 639 if (fDebug > 1) printf("AnalysisTaskJetSpectrum2::Init() \n");
640
641}
642
a31b8a87 643void AliAnalysisTaskJetSpectrum2::UserExec(Option_t */*option*/){
644
b5cc0c6d 645
f2dd0695 646 Bool_t selected = kTRUE;
647
648 if(fUseGlobalSelection&&fEventSelectionMask==0){
649 selected = AliAnalysisHelperJetTasks::Selected();
650 }
651 else if(fUseGlobalSelection&&fEventSelectionMask>0){
45a11aef 652 selected = AliAnalysisHelperJetTasks::TestSelectInfo(fEventSelectionMask);
f2dd0695 653 }
654
f4132e7d 655 if(fEventClass>0){
656 selected = selected&&(AliAnalysisHelperJetTasks::EventClass()==fEventClass);
657 }
658
f2dd0695 659 if(!selected){
b5cc0c6d 660 // no selection by the service task, we continue
f4132e7d 661 if (fDebug > 1)Printf("Not selected %s:%d SelectInfo %d Class %d",(char*)__FILE__,__LINE__, AliAnalysisHelperJetTasks::Selected(),AliAnalysisHelperJetTasks::EventClass());
b5cc0c6d 662 PostData(1, fHistList);
663 return;
664 }
665
f2dd0695 666
a31b8a87 667 static AliAODEvent* aod = 0;
668
669 // take all other information from the aod we take the tracks from
670 if(!aod){
671 if(fUseAODTrackInput)aod = fAODIn;
672 else aod = fAODOut;
673 }
674
675
3b7ffecf 676 //
677 // Execute analysis for current event
678 //
a31b8a87 679 if (fDebug > 1)printf("Analysing event # %5d\n", (Int_t) fEntry);
680 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
681 if(!aodH){
682 Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
683 return;
684 }
685
686 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
687 TClonesArray *aodRecJets = 0;
688
689 if(fAODOut&&!aodRecJets){
690 aodRecJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchRec.Data()));
691 }
692 if(fAODExtension&&!aodRecJets){
693 aodRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchRec.Data()));
694 }
695 if(fAODIn&&!aodRecJets){
696 aodRecJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchRec.Data()));
697 }
698
699
700
701 if(!aodRecJets){
d95fc15a 702 if(fDebug){
703
704 Printf("%s:%d no reconstructed Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchRec.Data());
705 if(fAODIn){
706 Printf("Input AOD >>>>");
707 fAODIn->Print();
708 }
709 if(fAODExtension){
710 Printf("AOD Extension >>>>");
711 fAODExtension->Print();
712 }
713 if(fAODOut){
714 Printf("Output AOD >>>>");
715 fAODOut->Print();
716 }
717 }
718 return;
a31b8a87 719 }
720
721 TClonesArray *aodGenJets = 0;
722 if(fBranchGen.Length()>0){
723 if(fAODOut&&!aodGenJets){
724 aodGenJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchGen.Data()));
725 }
726 if(fAODExtension&&!aodGenJets){
727 aodGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchGen.Data()));
728 }
729 if(fAODIn&&!aodGenJets){
730 aodGenJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchGen.Data()));
731 }
732
733 if(!aodGenJets){
734 Printf("%s:%d no generated Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchGen.Data());
3b7ffecf 735 return;
736 }
3b7ffecf 737 }
a31b8a87 738
37eb26ea 739 TClonesArray *aodBackRecJets = 0;
740 if(fBranchBkgRec.Length()>0){
741 if(fAODOut&&!aodBackRecJets){
742 aodBackRecJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchBkgRec.Data()));
743 }
744 if(fAODExtension&&!aodBackRecJets){
745 aodBackRecJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchBkgRec.Data()));
746 }
747 if(fAODIn&&!aodBackRecJets){
748 aodBackRecJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchBkgRec.Data()));
749 }
750
751 if(!aodBackRecJets){
752 Printf("%s:%d no background rec Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchBkgRec.Data());
753 return;
754 }
755 }
756
757
758 TClonesArray *aodBackGenJets = 0;
759
760 if(fBranchBkgGen.Length()>0){
761 if(fAODOut&&!aodBackGenJets){
762 aodBackGenJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fBranchBkgGen.Data()));
763 }
764 if(fAODExtension&&!aodBackGenJets){
765 aodBackGenJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fBranchBkgGen.Data()));
766 }
767 if(fAODIn&&!aodBackGenJets){
768 aodBackGenJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fBranchBkgGen.Data()));
769 }
770
771 if(!aodBackGenJets){
772 Printf("%s:%d no background rec Jet array with name %s in AOD",(char*)__FILE__,__LINE__,fBranchBkgGen.Data());
773 return;
774 }
775 }
776
a31b8a87 777
778 // new Scheme
779 // first fill all the pure histograms, i.e. full jets
780 // in case of the correaltion limit to the n-leading jets
781
782 // reconstructed
783
784
785 // generated
786
787
788 // second fill the correlation histograms, here we limit to the n-th leading jet in case of the reconstructed
789
790
742ee86c 791
a31b8a87 792 TList genJetsList; // full acceptance
793 TList genJetsListCut; // acceptance cut
794 TList recJetsList; // full acceptance
795 TList recJetsListCut; // acceptance cut
796
797
798 GetListOfJets(&recJetsList,aodRecJets,0);
799 GetListOfJets(&recJetsListCut,aodRecJets,1);
800
801 if(fBranchGen.Length()>0){
802 GetListOfJets(&genJetsList,aodGenJets,0);
803 GetListOfJets(&genJetsListCut,aodGenJets,1);
804 }
805
806 Double_t eventW = 1;
807 Double_t ptHard = 0;
808 Double_t nTrials = 1; // Trials for MC trigger
809 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
810
742ee86c 811 // Getting some global properties
812 fCentrality = GetCentrality();
aa3ba8d2 813 if(fCentrality<=0)fCentrality = 0;
742ee86c 814 fh1Centrality->Fill(fCentrality);
815
816
a31b8a87 817 if((fAnalysisType&kAnaMCESD)==kAnaMCESD){
818 // this is the part we only use when we have MC information
819 AliMCEvent* mcEvent = MCEvent();
820 // AliStack *pStack = 0;
821 if(!mcEvent){
822 Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
3b7ffecf 823 return;
824 }
a31b8a87 825 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
826 if(pythiaGenHeader){
827 nTrials = pythiaGenHeader->Trials();
828 ptHard = pythiaGenHeader->GetPtHard();
829 int iProcessType = pythiaGenHeader->ProcessType();
830 // 11 f+f -> f+f
831 // 12 f+barf -> f+barf
832 // 13 f+barf -> g+g
833 // 28 f+g -> f+g
834 // 53 g+g -> f+barf
835 // 68 g+g -> g+g
836 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
837 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
838 }
839 }// (fAnalysisType&kMCESD)==kMCESD)
840
841
842 // we simply fetch the tracks/mc particles as a list of AliVParticles
843
844 TList recParticles;
845 TList genParticles;
846
847 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
848 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
849 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
850 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
851
d3a3f33d 852 // CalculateReactionPlaneAngle(&recParticles);
2eded560 853 fRPAngle = 0;
854
855 if(fRPMethod==0)fRPAngle = aod->GetHeader()->GetEventplane();
856 else if(fRPMethod==1||fRPMethod==2){
857 fRPAngle = aod->GetHeader()->GetQTheta(fRPMethod);
858 }
859 fh1RP->Fill(fRPAngle);
860 fh2RPCentrality->Fill(fCentrality,fRPAngle);
a31b8a87 861 // Event control and counting ...
862 // MC
863 fh1PtHard->Fill(ptHard,eventW);
864 fh1PtHardNoW->Fill(ptHard,1);
865 fh1PtHardTrials->Fill(ptHard,nTrials);
866
867 // Real
784b1747 868 if(aod->GetPrimaryVertex()){// No vtx for pure MC
869 fh1ZVtx->Fill(aod->GetPrimaryVertex()->GetZ());
870 }
a31b8a87 871
a2522483 872
37eb26ea 873 Int_t recMult1 = recParticles.GetEntries();
874 Int_t genMult1 = genParticles.GetEntries();
875
742ee86c 876 Int_t recMult2 = MultFromJetRefs(aodBackRecJets);
877 Int_t genMult2 = MultFromJetRefs(aodBackGenJets);
37eb26ea 878
879 fh2MultRec->Fill(recMult1,recMult2);
880 fh2MultGen->Fill(genMult1,genMult2);
881 fMultRec = recMult1;
882 if(fMultRec<=0)fMultRec = recMult2;
883 fMultGen = genMult1;
884 if(fMultGen<=0)fMultGen = genMult2;
a2522483 885
441afcb9 886 Double_t var0[3] = {0,};
90a006c2 887 var0[0] = fCentrality;
888 var0[1] = fMultRec;
3d1dba29 889 for(int it=0;it<fNTrigger;it++){
890 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
891 var0[2] = it;
892 fhnEvent->Fill(var0);
893 }
894 }
a31b8a87 895 // the loops for rec and gen should be indentical... pass it to a separate
896 // function ...
897 // Jet Loop
898 // Track Loop
899 // Jet Jet Loop
900 // Jet Track loop
901
902 FillJetHistos(recJetsListCut,recParticles,kJetRec);
a2522483 903 FillJetHistos(recJetsList,recParticles,kJetRecFull);
a31b8a87 904 FillTrackHistos(recParticles,kJetRec);
905
906 FillJetHistos(genJetsListCut,genParticles,kJetGen);
a2522483 907 FillJetHistos(genJetsList,genParticles,kJetGenFull);
a31b8a87 908 FillTrackHistos(genParticles,kJetGen);
909
910 // Here follows the jet matching part
911 // delegate to a separated method?
912
b99018c6 913 if(fDoMatching){
914 FillMatchHistos(recJetsList,genJetsList);
915 }
916
a31b8a87 917 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
918 PostData(1, fHistList);
90a006c2 919}
a31b8a87 920
921void AliAnalysisTaskJetSpectrum2::FillJetHistos(TList &jetsList,TList &particlesList,Int_t iType){
922
923 if(iType>=kJetTypes){
924 return;
3b7ffecf 925 }
742ee86c 926 if(!fFlagJetType[iType])return;
a31b8a87 927
37eb26ea 928 Int_t refMult = fMultRec;
929 if(iType==kJetGen||iType==kJetGenFull){
930 refMult = fMultGen;
931 }
932
a31b8a87 933 Int_t nJets = jetsList.GetEntries();
934 fh1NJets[iType]->Fill(nJets);
935
936 if(nJets<=0)return;
3b7ffecf 937
a31b8a87 938 Float_t ptOld = 1.E+32;
939 Float_t pT0 = 0;
940 Float_t pT1 = 0;
941 Float_t phi0 = 0;
942 Float_t phi1 = 0;
943 Int_t ij0 = -1;
944 Int_t ij1 = -1;
945
db745d29 946 Double_t var1[9] = {0,}; // jet number;p_{T,jet};cent;# tracks;RP;area;trigger;leadingTrackPt
17f4943e 947 Double_t var1b[3] = {0,}; // p_{T,jet};cent;trigger;
7bee4353 948
90a006c2 949 var1[2] = fCentrality;
17f4943e 950 var1b[1] = fCentrality;
90a006c2 951 var1[3] = refMult;
952
17f4943e 953
954
5662640e 955 Double_t var2[9] = {0,}; // jet number;p_{T,jet};cent;#eta;#phi;area;trigger
90a006c2 956 var2[2] = fCentrality;
a31b8a87 957
958 for(int ij = 0;ij < nJets;ij++){
959 AliAODJet *jet = (AliAODJet*)jetsList.At(ij);
960 Float_t ptJet = jet->Pt();
17f4943e 961
962
4a828dd2 963 if(ptJet<0.150)ptJet = jet->GetPtSubtracted(0);
17f4943e 964
965 var1b[0] = ptJet;
d7396b04 966 if(jet->Trigger()&fJetTriggerBestMask){
967 fh1PtJetsInBest[iType]->Fill(ptJet);
17f4943e 968 for(int it = 0;it <fNTrigger;it++){
969 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
970 var1b[2] = it;
971 fhnJetPtBest[iType]->Fill(var1b);
972 }
973 }
d7396b04 974 }
65c43de8 975 if(jet->Trigger()&fJetTriggerExcludeMask){
976 fh1PtJetsInRej[iType]->Fill(ptJet);
17f4943e 977 for(int it = 0;it <fNTrigger;it++){
978 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
979 var1b[2] = it;
980 fhnJetPtRej[iType]->Fill(var1b);
981 }
982 }
65c43de8 983 continue;
984 }
a31b8a87 985 fh1PtJetsIn[iType]->Fill(ptJet);
a31b8a87 986 ptOld = ptJet;
987
b5d90baf 988 // find the dijets assume sorting and acceptance cut...
a31b8a87 989 if(ij==0){
990 ij0 = ij;
991 pT0 = ptJet;
992 phi0 = jet->Phi();
993 if(phi0<0)phi0+=TMath::Pi()*2.;
994 }
995 else if(ptJet>pT1){
996 // take only the backward hemisphere??
997 phi1 = jet->Phi();
b5d90baf 998 if(phi1<0)phi1+=TMath::Pi()*2.;
a31b8a87 999 Float_t dPhi = phi1 - phi0;
1000 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
1001 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
1002 if(TMath::Abs(TMath::Pi()-dPhi)<fDeltaPhiWindow){
1003 ij1 = ij;
1004 pT1 = ptJet;
1005 }
1006 }
1007 // fill jet histos for kmax jets
37eb26ea 1008
a31b8a87 1009 Float_t phiJet = jet->Phi();
f12de05f 1010 Float_t etaJet = jet->Eta();
a31b8a87 1011 if(phiJet<0)phiJet+=TMath::Pi()*2.;
1012 fh1TmpRho->Reset();
37eb26ea 1013 if(ij<kMaxJets)fh1PtIn[iType][ij]->Fill(ptJet);
90a006c2 1014
37eb26ea 1015 fh1PtIn[iType][kMaxJets]->Fill(ptJet);
a31b8a87 1016 // fill leading jets...
d7117cbd 1017 AliVParticle *leadTrack = LeadingTrackFromJetRefs(jet);
1018 // AliVParticle *leadTrack = LeadingTrackInCone(jet,&particlesList);
742ee86c 1019 Int_t phiBin = GetPhiBin(phiJet-fRPAngle);
152a0744 1020 Double_t ptLead = jet->GetPtLeading(); //pT of leading jet
90a006c2 1021
1022 var1[1] = ptJet;
1023 var1[4] = phiBin;
1024 var1[5] = jet->EffectiveAreaCharged();
152a0744 1025 var1[7] = ptLead;
db745d29 1026 var1[8] = CheckAcceptance(phiJet,etaJet);
90a006c2 1027
1028 var2[1] = ptJet;
1029 var2[3] = etaJet;
1030 var2[4] = phiJet;
1031 var2[5] = jet->EffectiveAreaCharged();
69a0d320 1032 var2[7] = var1[8];
152a0744 1033 var2[8] = (leadTrack?leadTrack->Charge()*leadTrack->Pt():0);//pT of leading jet x charge
5662640e 1034
37eb26ea 1035 if(ij<kMaxJets){
152a0744 1036 fh2LTrackPtJetPt[iType][ij]->Fill(jet->GetPtLeading(),ptJet);
90a006c2 1037 var1[0] = ij;
1038 var2[0] = ij;
3d1dba29 1039 for(int it = 0;it <fNTrigger;it++){
1040 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
1041 var1[6] = it;
17f4943e 1042 var2[6] = it;
3d1dba29 1043 fhnJetPt[iType]->Fill(var1);
17f4943e 1044 fhnJetPtQA[iType]->Fill(var2);
3d1dba29 1045 }
1046 }
a31b8a87 1047 }
90a006c2 1048 var1[0] = kMaxJets;// fill for all jets
1049 var2[0] = kMaxJets;// fill for all jets
3d1dba29 1050 for(int it = 0;it <fNTrigger;it++){
1051 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
1052 var1[6] = it;
1053 fhnJetPt[iType]->Fill(var1);
1d478650 1054 fhnJetPtQA[iType]->Fill(var2);
3d1dba29 1055 }
1056 }
1057
152a0744 1058 fh2LTrackPtJetPt[iType][kMaxJets]->Fill(jet->GetPtLeading(),ptJet);
a31b8a87 1059
37eb26ea 1060 if(particlesList.GetSize()&&ij<kMaxJets){
a31b8a87 1061 // Particles... correlated with jets...
1062 for(int it = 0;it<particlesList.GetEntries();++it){
1063 AliVParticle *part = (AliVParticle*)particlesList.At(it);
1064 Float_t deltaR = jet->DeltaR(part);
1065 if(ptJet>0)fh1TmpRho->Fill(deltaR,part->Pt()/ptJet);
1066 }
1067 // fill the jet shapes
a31b8a87 1068 }// if we have particles
a31b8a87 1069 }// Jet Loop
1070
1071
1072 // do something with dijets...
1073 if(ij0>=0&&ij1>0){
1074 AliAODJet *jet0 = (AliAODJet*)jetsList.At(ij0);
1075 Double_t ptJet0 = jet0->Pt();
1076 Double_t phiJet0 = jet0->Phi();
1077 if(phiJet0<0)phiJet0+=TMath::Pi()*2.;
1078
1079 AliAODJet *jet1 = (AliAODJet*)jetsList.At(ij1);
1080 Double_t ptJet1 = jet1->Pt();
1081 Double_t phiJet1 = jet1->Phi();
1082 if(phiJet1<0)phiJet1+=TMath::Pi()*2.;
1083
1084 Float_t deltaPhi = phiJet0 - phiJet1;
1085 if(deltaPhi>TMath::Pi())deltaPhi = deltaPhi - 2.*TMath::Pi();
1086 if(deltaPhi<(-1.*TMath::Pi()))deltaPhi = deltaPhi + 2.*TMath::Pi();
1087 deltaPhi = TMath::Abs(deltaPhi);
b5d90baf 1088 fh2DijetDeltaPhiPt[iType]->Fill(deltaPhi,ptJet1);
a31b8a87 1089
1090 Float_t asym = 9999;
1091 if((ptJet0+ptJet1)>0)asym = (ptJet0-ptJet1)/(ptJet0+ptJet1);
1092 fh2DijetAsymPt[iType]->Fill(asym,ptJet0);
1093 fh2DijetPt2vsPt1[iType]->Fill(ptJet0,ptJet1);
1094 fh2DijetDifvsSum[iType]->Fill(ptJet0+ptJet1,ptJet0-ptJet1);
1095 Float_t minv = 2.*(jet0->P()*jet1->P()-
1096 jet0->Px()*jet1->Px()-
1097 jet0->Py()*jet1->Py()-
1098 jet0->Pz()*jet1->Pz()); // assume mass == 0;
1099 if(minv<0)minv=0; // prevent numerical instabilities
1100 minv = TMath::Sqrt(minv);
1101 fh1DijetMinv[iType]->Fill(minv);
1102 }
1103
1104
1105
1106 // count down the jets above thrueshold
1107 Int_t nOver = nJets;
1108 if(nOver>0){
1109 TIterator *jetIter = jetsList.MakeIterator();
1110 AliAODJet *tmpJet = (AliAODJet*)(jetIter->Next());
a31b8a87 1111 if(tmpJet){
e855f5c5 1112 Float_t pt = tmpJet->Pt();
a31b8a87 1113 for(int i = 1;i <= fh2NJetsPt[iType]->GetNbinsX();i++){
1114 Float_t ptCut = fh2NJetsPt[iType]->GetXaxis()->GetBinCenter(i);
1115 while(pt<ptCut&&tmpJet){
1116 nOver--;
1117 tmpJet = (AliAODJet*)(jetIter->Next());
1118 if(tmpJet){
1119 pt = tmpJet->Pt();
1120 }
1121 }
1122 if(nOver<=0)break;
1123 fh2NJetsPt[iType]->Fill(ptCut,nOver);
1124 }
1125 }
1126 delete jetIter;
1127 }
1128}
1129
1130void AliAnalysisTaskJetSpectrum2::FillTrackHistos(TList &particlesList,int iType){
1131
90a006c2 1132 if(fFlagJetType[iType]<=0)return;
7b822bc5 1133 Int_t refMult = fMultRec;
1134 if(iType==kJetGen||iType==kJetGenFull){
1135 refMult = fMultGen;
742ee86c 1136
7b822bc5 1137 }
1138
90a006c2 1139 //
17f4943e 1140 Double_t var3[6]; // track number;p_{T};cent;#tracks;RP
90a006c2 1141 var3[2] = fCentrality;
1142 var3[3] = refMult;
5662640e 1143 Double_t var4[6]; // track number;p_{T};cent;#eta;#phi;sign
90a006c2 1144 var4[2] = fCentrality;
a31b8a87 1145 Int_t nTrackOver = particlesList.GetSize();
1146 // do the same for tracks and jets
1147 if(nTrackOver>0){
1148 TIterator *trackIter = particlesList.MakeIterator();
1149 AliVParticle *tmpTrack = (AliVParticle*)(trackIter->Next());
1150 Float_t pt = tmpTrack->Pt();
1151 for(int i = 1;i <= fh2NTracksPt[iType]->GetNbinsX();i++){
1152 Float_t ptCut = fh2NTracksPt[iType]->GetXaxis()->GetBinCenter(i);
1153 while(pt<ptCut&&tmpTrack){
1154 nTrackOver--;
1155 tmpTrack = (AliVParticle*)(trackIter->Next());
1156 if(tmpTrack){
1157 pt = tmpTrack->Pt();
1158 }
1159 }
1160 if(nTrackOver<=0)break;
1161 fh2NTracksPt[iType]->Fill(ptCut,nTrackOver);
1162 }
1163
1164
1165 trackIter->Reset();
1166 AliVParticle *leading = (AliVParticle*)particlesList.At(0);
1167 Float_t sumPt = 0;
1168
1169 while((tmpTrack = (AliVParticle*)(trackIter->Next()))){
1170 Float_t tmpPt = tmpTrack->Pt();
1171 fh1PtTracksIn[iType]->Fill(tmpPt);
cb883243 1172 fh1PtTracksInLow[iType]->Fill(tmpPt);
742ee86c 1173
a31b8a87 1174 sumPt += tmpPt;
1175 Float_t tmpPhi = tmpTrack->Phi();
1176 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
2eded560 1177
1178
1179 Float_t phiRP = tmpPhi-fRPAngle;
1180 if(phiRP>TMath::Pi())phiRP -= TMath::Pi();
1181 if(phiRP<0)phiRP += TMath::Pi();
1182 if(phiRP<0)phiRP += TMath::Pi();
1183 const float allPhi = -1./180.*TMath::Pi();
1184
dae7dd67 1185 if(tmpPt<100){
1186 fp2MultRPPhiTrackPt[iType]->Fill(refMult,phiRP,tmpPt);
1187 fp2MultRPPhiTrackPt[iType]->Fill(refMult,allPhi,tmpPt);
1188
1189 fp2CentRPPhiTrackPt[iType]->Fill(fCentrality,phiRP,tmpPt);
1190 fp2CentRPPhiTrackPt[iType]->Fill(fCentrality,allPhi,tmpPt);
1191 }
742ee86c 1192 Int_t phiBin = GetPhiBin(tmpPhi-fRPAngle);
90a006c2 1193 var3[0] = 1;
1194 var3[1] = tmpPt;
1195 var3[4] = phiBin;
1196
1197 var4[0] = 1;
1198 var4[1] = tmpPt;
1199 var4[3] = tmpTrack->Eta();
1200 var4[4] = tmpPhi;
5662640e 1201 var4[5] = tmpTrack->Charge();
90a006c2 1202
17f4943e 1203
1204 for(int it = 0;it <fNTrigger;it++){
1205 if(fInputHandler->IsEventSelected()&fTriggerBit[it]){
1206 var3[0] = 1;
1207 var3[5] = it;
1208 fhnTrackPt[iType]->Fill(var3);
1209 if(tmpTrack==leading){
1210 var3[0] = 0;
1211 fhnTrackPt[iType]->Fill(var3);
1212 }
1213 }
1214 }
1215
1216
1217
1218
1219
90a006c2 1220 fhnTrackPtQA[iType]->Fill(var4);
1221
a31b8a87 1222 if(tmpTrack==leading){
90a006c2 1223 var4[0] = 0;
90a006c2 1224 fhnTrackPtQA[iType]->Fill(var4);
a31b8a87 1225 continue;
1226 }
1227 }
1228 fh1SumPtTrack[iType]->Fill(sumPt);
1229 delete trackIter;
1230 }
1231
1232}
1233
1234
1235void AliAnalysisTaskJetSpectrum2::FillMatchHistos(TList &recJetsList,TList &genJetsList){
1236
1237
1238 // Fill al the matching histos
1239 // It is important that the acceptances for the mathing are as large as possible
1240 // to avoid false matches on the edge of acceptance
1241 // therefore we add some extra matching jets as overhead
1242
1243 static TArrayI aGenIndex(recJetsList.GetEntries());
1244 if(aGenIndex.GetSize()<recJetsList.GetEntries())aGenIndex.Set(recJetsList.GetEntries());
3b7ffecf 1245
a31b8a87 1246 static TArrayI aRecIndex(genJetsList.GetEntries());
1247 if(aRecIndex.GetSize()<genJetsList.GetEntries())aRecIndex.Set(genJetsList.GetEntries());
3b7ffecf 1248
a31b8a87 1249 if(fDebug){
1250 Printf("New Gens List %d rec index Array %d",genJetsList.GetEntries(),aRecIndex.GetSize());
1251 Printf("New Rec List %d gen indey Array %d",recJetsList.GetEntries(),aGenIndex.GetSize());
1252 }
1253 AliAnalysisHelperJetTasks::GetClosestJets(&genJetsList,TMath::Min((Int_t)fNMatchJets,(Int_t)genJetsList.GetEntries()),
1254 &recJetsList,TMath::Min((Int_t)fNMatchJets,(Int_t)recJetsList.GetEntries()),
1255 aGenIndex,aRecIndex,fDebug);
1256
1257 if(fDebug){
1258 for(int i = 0;i< aGenIndex.GetSize();++i){
1259 if(aGenIndex[i]>=0)Printf("iGenFound: %d -> %d",i,aGenIndex[i]);
1260 }
1261 for(int i = 0;i< aRecIndex.GetSize();++i){
1262 if(aRecIndex[i]>=0)Printf("iRecFound: %d -> %d",i,aRecIndex[i]);
1263 }
1264 }
1265
152a0744 1266 Double_t container[8];
1267 Double_t containerRec[4];
1268 Double_t containerGen[4];
a31b8a87 1269
1270 // loop over generated jets
1271 // consider the
1272 for(int ig = 0;ig < genJetsList.GetEntries();++ig){
1273 AliAODJet *genJet = (AliAODJet*)genJetsList.At(ig);
1274 Double_t ptGen = genJet->Pt();
1275 Double_t phiGen = genJet->Phi();
1276 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1277 Double_t etaGen = genJet->Eta();
152a0744 1278 containerGen[0] = ptGen;
1279 containerGen[1] = etaGen;
1280 containerGen[2] = phiGen;
1281 containerGen[3] = genJet->GetPtLeading();
1282
1283 fhnJetContainer->Fill(containerGen,kStep0); //all generated jets
1284
1285 Int_t ir = aRecIndex[ig];
1286 if(ir>=0&&ir<recJetsList.GetEntries()){
1287 fhnJetContainer->Fill(containerGen,kStep2); // all generated jets with reconstructed partner
1288
1289 if(JetSelected(genJet)){
1290 fhnJetContainer->Fill(containerGen,kStep1); // all generated jets in eta window
1291
a31b8a87 1292 AliAODJet* recJet = (AliAODJet*)recJetsList.At(ir);
152a0744 1293
1294 fhnJetContainer->Fill(containerGen,kStep3); // all generated jets in eta window with reconstructed partner
1295 if(JetSelected(recJet)) {
1296 fhnJetContainer->Fill(containerGen,kStep4); // all generated jets in eta window with reconstructed partner in eta window
1297
1298 containerGen[3] = recJet->GetPtLeading();
1299 fhnJetContainer->Fill(containerGen,kStep5); // all generated jets in eta window with reconstructed partner in eta window with leading track on reconstructed level
1300 }
a31b8a87 1301 }
1302 }
1303 }// loop over generated jets used for matching...
1304
1305
1306
1307 // loop over reconstructed jets
1308 for(int ir = 0;ir < recJetsList.GetEntries();++ir){
1309 AliAODJet *recJet = (AliAODJet*)recJetsList.At(ir);
1310 Double_t etaRec = recJet->Eta();
1311 Double_t ptRec = recJet->Pt();
1312 Double_t phiRec = recJet->Phi();
1313 if(phiRec<0)phiRec+=TMath::Pi()*2.;
a31b8a87 1314
152a0744 1315 containerRec[0] = ptRec;
1316 containerRec[1] = etaRec;
1317 containerRec[2] = phiRec;
1318 containerRec[3] = recJet->GetPtLeading();
1319
a31b8a87 1320 container[0] = ptRec;
1321 container[1] = etaRec;
1322 container[2] = phiRec;
152a0744 1323 container[3] = recJet->GetPtLeading();
a31b8a87 1324
a31b8a87 1325 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1326
1327 if(JetSelected(recJet)){
152a0744 1328 fhnJetContainer->Fill(containerRec,kStep7); //all rec jets in eta window
a31b8a87 1329 // Fill Correlation
1330 Int_t ig = aGenIndex[ir];
1331 if(ig>=0 && ig<genJetsList.GetEntries()){
a31b8a87 1332 if (fDebug > 10)Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1333 AliAODJet *genJet = (AliAODJet*)genJetsList.At(ig);
1334 Double_t ptGen = genJet->Pt();
1335 Double_t phiGen = genJet->Phi();
1336 if(phiGen<0)phiGen+=TMath::Pi()*2.;
1337 Double_t etaGen = genJet->Eta();
152a0744 1338
1339 containerGen[0] = ptGen;
1340 containerGen[1] = etaGen;
1341 containerGen[2] = phiGen;
1342 containerGen[3] = genJet->GetPtLeading();
1343
1344 container[4] = ptGen;
1345 container[5] = etaGen;
1346 container[6] = phiGen;
1347 container[7] = genJet->GetPtLeading();
1348
1349 fhnJetContainer->Fill(containerGen,kStep6); // all rec jets in eta window with generated partner
1350
1351 fhnCorrelation->Fill(container);
a31b8a87 1352 if(ptGen>0){
1353 Float_t delta = (ptRec-ptGen)/ptGen;
1354 fh2RelPtFGen->Fill(ptGen,delta);
1355 fh2PtFGen->Fill(ptGen,ptRec);
1356 }
a31b8a87 1357 }
a31b8a87 1358 }// loop over reconstructed jets
1359 }
1360 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
1361}
1362
1363
3b7ffecf 1364void AliAnalysisTaskJetSpectrum2::MakeJetContainer(){
1365 //
1366 // Create the particle container for the correction framework manager and
1367 // link it
1368 //
152a0744 1369 const Int_t kNvar = 4 ; //number of variables on the grid:pt,eta, phi
d95fc15a 1370 const Double_t kPtmin = 0.0, kPtmax = 250.; // we do not want to have empty bins at the beginning...
152a0744 1371 const Double_t kEtamin = -1.0, kEtamax = 1.0;
3b7ffecf 1372 const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
152a0744 1373 const Double_t kPtLeadingTrackPtMin = 0., kPtLeadingTrackPtMax = 200.;
3b7ffecf 1374
1375 // can we neglect migration in eta and phi?
1376 // phi should be no problem since we cover full phi and are phi symmetric
1377 // eta migration is more difficult due to needed acceptance correction
1378 // in limited eta range
1379
3b7ffecf 1380 //arrays for the number of bins in each dimension
1381 Int_t iBin[kNvar];
d95fc15a 1382 iBin[0] = 125; //bins in pt
152a0744 1383 iBin[1] = 4; //bins in eta
1384 iBin[2] = 1; // bins in phi
1385 iBin[3] = 10; // bins in leading track Pt
3b7ffecf 1386
1387 //arrays for lower bounds :
1388 Double_t* binEdges[kNvar];
1389 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1390 binEdges[ivar] = new Double_t[iBin[ivar] + 1];
1391
1392 //values for bin lower bounds
1393 // for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)TMath::Power(10,TMath::Log10(kPtmin) + (TMath::Log10(kPtmax)-TMath::Log10(kPtmin))/iBin[0]*(Double_t)i);
a923bd34 1394 for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
3b7ffecf 1395 for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
1396 for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;
152a0744 1397 binEdges[3][0]= kPtLeadingTrackPtMin;
1398 binEdges[3][1]= 1.;
1399 binEdges[3][2]= 2.;
1400 binEdges[3][3]= 3.;
1401 binEdges[3][4]= 4.;
1402 binEdges[3][5]= 5.;
1403 binEdges[3][6]= 6.;
1404 binEdges[3][7]= 8.;
1405 binEdges[3][8]= 10.;
1406 binEdges[3][9]= 12.;
1407 binEdges[3][10]= kPtLeadingTrackPtMax;
1408
1409 fhnJetContainer = new AliCFContainer(Form("fhnJetContainer"),Form("AliCFContainer jet info"),kMaxStep,kNvar,iBin);
b99018c6 1410 for (int k=0; k<kNvar; k++) {
1411 fhnJetContainer->SetBinLimits(k,binEdges[k]);
3b7ffecf 1412 }
b99018c6 1413
3b7ffecf 1414 //create correlation matrix for unfolding
1415 Int_t thnDim[2*kNvar];
1416 for (int k=0; k<kNvar; k++) {
1417 //first half : reconstructed
1418 //second half : MC
1419 thnDim[k] = iBin[k];
1420 thnDim[k+kNvar] = iBin[k];
1421 }
1422
152a0744 1423 fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparseF with correlations",2*kNvar,thnDim);
3b7ffecf 1424 for (int k=0; k<kNvar; k++) {
152a0744 1425 fhnCorrelation->SetBinEdges(k,binEdges[k]);
1426 fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
3b7ffecf 1427 }
742ee86c 1428
1429 for(Int_t ivar = 0; ivar < kNvar; ivar++)
1430 delete [] binEdges[ivar];
1431
1432
3b7ffecf 1433}
1434
1435void AliAnalysisTaskJetSpectrum2::Terminate(Option_t */*option*/)
1436{
1437// Terminate analysis
1438//
1439 if (fDebug > 1) printf("AnalysisJetSpectrum2: Terminate() \n");
1440}
1441
1442
1443Int_t AliAnalysisTaskJetSpectrum2::GetListOfTracks(TList *list,Int_t type){
1444
565584e8 1445 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
3b7ffecf 1446
1447 Int_t iCount = 0;
565584e8 1448 if(type==kTrackAOD){
3b7ffecf 1449 AliAODEvent *aod = 0;
565584e8 1450 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1451 else aod = AODEvent();
3b7ffecf 1452 if(!aod){
1453 return iCount;
1454 }
1455 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1456 AliAODTrack *tr = aod->GetTrack(it);
1457 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
a31b8a87 1458 if(TMath::Abs(tr->Eta())>fTrackRecEtaWindow)continue;
1459 if(tr->Pt()<fMinTrackPt)continue;
38ecb6a5 1460 if(fDebug>0){
1461 if(tr->Pt()>20){
1462 Printf("High pT track found in Event %d with p_T, %E",(int)Entry(),tr->Pt());
fd5db301 1463 Printf("%s read event, %d",fInputHandler->GetTree()->GetCurrentFile()->GetName(),(Int_t)fInputHandler->GetTree()->GetReadEntry());
38ecb6a5 1464 tr->Print();
1465 // tr->Dump();
1466 AliESDEvent *fESD = dynamic_cast<AliESDEvent*> (InputEvent());
1467 if(fESD){
a2522483 1468 AliESDtrack *esdTr = (AliESDtrack*)fESD->GetTrack(TMath::Abs(tr->GetID()+1));
38ecb6a5 1469 esdTr->Print("");
bb3d13aa 1470 // esdTr->Dump();
38ecb6a5 1471 }
1472 }
1473 }
3b7ffecf 1474 list->Add(tr);
1475 iCount++;
1476 }
1477 }
1478 else if (type == kTrackKineAll||type == kTrackKineCharged){
1479 AliMCEvent* mcEvent = MCEvent();
1480 if(!mcEvent)return iCount;
1481 // we want to have alivpartilces so use get track
1482 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
1483 if(!mcEvent->IsPhysicalPrimary(it))continue;
1484 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
a31b8a87 1485 if(part->Pt()<fMinTrackPt)continue;
3b7ffecf 1486 if(type == kTrackKineAll){
1487 list->Add(part);
1488 iCount++;
1489 }
1490 else if(type == kTrackKineCharged){
1491 if(part->Particle()->GetPDG()->Charge()==0)continue;
1492 list->Add(part);
1493 iCount++;
1494 }
1495 }
1496 }
565584e8 1497 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
1498 AliAODEvent *aod = 0;
5301f754 1499 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
565584e8 1500 else aod = AODEvent();
5010a3f7 1501 if(!aod)return iCount;
3b7ffecf 1502 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1503 if(!tca)return iCount;
1504 for(int it = 0;it < tca->GetEntriesFast();++it){
1505 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
e855f5c5 1506 if(!part)continue;
a31b8a87 1507 if(part->Pt()<fMinTrackPt)continue;
3b7ffecf 1508 if(!part->IsPhysicalPrimary())continue;
c4631cdb 1509 if(type == kTrackAODMCAll){
3b7ffecf 1510 list->Add(part);
1511 iCount++;
1512 }
565584e8 1513 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
3b7ffecf 1514 if(part->Charge()==0)continue;
565584e8 1515 if(kTrackAODMCCharged){
1516 list->Add(part);
1517 }
1518 else {
a31b8a87 1519 if(TMath::Abs(part->Eta())>fTrackRecEtaWindow)continue;
565584e8 1520 list->Add(part);
1521 }
3b7ffecf 1522 iCount++;
1523 }
1524 }
1525 }// AODMCparticle
cc0649e4 1526 list->Sort();
c4631cdb 1527 return iCount;
3b7ffecf 1528
1529}
a31b8a87 1530
1531
742ee86c 1532Float_t AliAnalysisTaskJetSpectrum2::GetCentrality(){
1533 AliAODEvent *aod = 0;
1534 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1535 else aod = AODEvent();
1536 if(!aod){
3170a3f8 1537 return 101;
742ee86c 1538 }
1539 return aod->GetHeader()->GetCentrality();
1540}
1541
1542
a31b8a87 1543
1544Bool_t AliAnalysisTaskJetSpectrum2::JetSelected(AliAODJet *jet){
1545 Bool_t selected = false;
1546
1547 if(!jet)return selected;
1548
1549 if(fabs(jet->Eta())<fJetRecEtaWindow&&jet->Pt()>fMinJetPt){
1550 selected = kTRUE;
1551 }
1552 return selected;
1553
1554}
1555
1556Int_t AliAnalysisTaskJetSpectrum2::GetListOfJets(TList *list,TClonesArray* jarray,Int_t type){
1557
1558 if(fDebug>2)Printf("%s:%d Selecting jets with cuts %d",(char*)__FILE__,__LINE__,type);
1559 Int_t iCount = 0;
1560
1561 if(!jarray){
1562 Printf("%s:%d no Jet array",(char*)__FILE__,__LINE__);
1563 return iCount;
1564 }
1565
1566
1567 for(int ij=0;ij<jarray->GetEntries();ij++){
1568 AliAODJet* jet = (AliAODJet*)jarray->At(ij);
1569 if(!jet)continue;
1570 if(type==0){
1571 // No cut at all, main purpose here is sorting
1572 list->Add(jet);
1573 iCount++;
1574 }
1575 else if(type == 1){
1576 // eta cut
1577 if(JetSelected(jet)){
1578 list->Add(jet);
1579 iCount++;
1580 }
1581 }
1582 }
1583
1584 list->Sort();
1585 return iCount;
1586
1587}
1588
1589
37eb26ea 1590Int_t AliAnalysisTaskJetSpectrum2::MultFromJetRefs(TClonesArray* jets){
1591 if(!jets)return 0;
1592
1593 Int_t refMult = 0;
1594 for(int ij = 0;ij < jets->GetEntries();++ij){
1595 AliAODJet* jet = (AliAODJet*)jets->At(ij);
1596 if(!jet)continue;
1597 TRefArray *refs = jet->GetRefTracks();
1598 if(!refs)continue;
1599 refMult += refs->GetEntries();
1600 }
1601 return refMult;
1602
1603}
d7117cbd 1604
1605
1606AliVParticle *AliAnalysisTaskJetSpectrum2::LeadingTrackFromJetRefs(AliAODJet* jet){
1607 if(!jet)return 0;
1608 TRefArray *refs = jet->GetRefTracks();
1609 if(!refs) return 0;
1610 AliVParticle *leading = 0;
1611 Float_t fMaxPt = 0;
1612 for(int i = 0;i<refs->GetEntries();i++){
1613 AliVParticle *tmp = dynamic_cast<AliVParticle*>(refs->At(i));
1614 if(!tmp)continue;
1615 if(tmp->Pt()>fMaxPt){
1616 leading = tmp;
1617 fMaxPt = tmp->Pt();
1618 }
1619 }
1620 return leading;
1621}
1622
1623
1624AliVParticle *AliAnalysisTaskJetSpectrum2::LeadingTrackInCone(AliAODJet* jet,TList *list,Float_t r){
1625 if(!jet)return 0;
1626 if(!list) return 0;
1627 AliVParticle *leading = 0;
1628 Float_t fMaxPt = 0;
1629 for(int i = 0;i<list->GetEntries();i++){
1630 AliVParticle *tmp = (AliVParticle*)(list->At(i));
1631 if(!tmp)continue;
1632 if(jet->DeltaR(tmp)>r)continue;
1633 if(tmp->Pt()>fMaxPt){
1634 leading = tmp;
1635 fMaxPt = tmp->Pt();
1636 }
1637 }
1638 return leading;
1639}
742ee86c 1640
742ee86c 1641Int_t AliAnalysisTaskJetSpectrum2::GetPhiBin(Double_t phi)
1642{
1643 Int_t phibin=-1;
1644 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1645 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1646 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1647 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1648 return phibin;
1649}
1650
3d1dba29 1651void AliAnalysisTaskJetSpectrum2::SetNTrigger(Int_t n){
db745d29 1652 //
1653 // set number of trigger bins
1654 //
3d1dba29 1655 if(n>0){
1656 fNTrigger = n;
1657 delete [] fTriggerName;
1658 fTriggerName = new TString [fNTrigger];
1659 delete [] fTriggerBit;fTriggerBit = 0;
1660 fTriggerBit = new UInt_t [fNTrigger];
1661 }
1662 else{
1663 fNTrigger = 0;
1664 }
1665}
1666
db745d29 1667
3d1dba29 1668void AliAnalysisTaskJetSpectrum2::SetTrigger(Int_t i,UInt_t it,const char* c){
db745d29 1669 //
1670 // set trigger bin
1671 //
3d1dba29 1672 if(i<fNTrigger){
1673 fTriggerBit[i] = it;
1674 fTriggerName[i] = c;
1675 }
1676}
1677
db745d29 1678
1679void AliAnalysisTaskJetSpectrum2::SetNAcceptance(Int_t n){
1680 //
1681 // Set number of acceptance bins
1682 //
1683
1684 if(n>0){
1685 fNAcceptance = n;
1686 delete [] fAcceptancePhiMin;
1687 delete [] fAcceptancePhiMax;
1688 delete [] fAcceptanceEtaMin;
1689 delete [] fAcceptanceEtaMax;
1690
1691 fAcceptancePhiMin = new Float_t[fNAcceptance];
1692 fAcceptancePhiMax = new Float_t[fNAcceptance];
1693 fAcceptanceEtaMin = new Float_t[fNAcceptance];
1694 fAcceptanceEtaMax = new Float_t[fNAcceptance];
1695 }
1696 else{
1697 fNTrigger = 0;
1698 }
1699}
1700
1701void AliAnalysisTaskJetSpectrum2::SetAcceptance(Int_t i,Float_t phiMin,Float_t phiMax,Float_t etaMin,Float_t etaMax){
1702 //
1703 // Set acceptance bins
1704 //
1705
1706 if(i<fNAcceptance){
24cc3482 1707 Printf("%s:%d Setting acceptance %d phi %3.3f-%3.3f eta %3.3f-%3.3f",(char*)__FILE__,__LINE__,i,phiMin,phiMax,etaMin,etaMax);
1708
1709 fAcceptancePhiMin[i] = phiMin;
1710 fAcceptancePhiMax[i] = phiMax;
1711 fAcceptanceEtaMin[i] = etaMin;
1712 fAcceptanceEtaMax[i] = etaMax;
db745d29 1713 }
1714 else{
1715 fNTrigger = 0;
1716 }
1717}
1718
1719
1720Int_t AliAnalysisTaskJetSpectrum2::CheckAcceptance(Float_t phi,Float_t eta){
1721
1722 //
1723 // return aceptnace bin do no use ovelapping bins
1724 //
1725
24cc3482 1726 for(int i = 0;i<fNAcceptance;i++){
db745d29 1727 if(phi<fAcceptancePhiMin[i])continue;
1728 if(phi>fAcceptancePhiMax[i])continue;
1729 if(eta<fAcceptanceEtaMin[i])continue;
1730 if(eta>fAcceptanceEtaMax[i])continue;
1731 return i;
1732 }
1733 // catch the rest
1734 return fNAcceptance;
1735}
1736
1737
1738
1739
1740
3d1dba29 1741AliAnalysisTaskJetSpectrum2::~AliAnalysisTaskJetSpectrum2(){
1742 //
1743 delete [] fTriggerBit;
1744 delete [] fTriggerName;
db745d29 1745
1746 delete [] fAcceptancePhiMin;
1747 delete [] fAcceptancePhiMax;
1748 delete [] fAcceptanceEtaMin;
1749 delete [] fAcceptanceEtaMax;
1750
1751
1752
3d1dba29 1753}