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