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