2 // ******************************************
3 // This task computes several jet observables like
4 // the fraction of energy in inner and outer coronnas,
5 // jet-track correlations,triggered jet shapes and
6 // correlation strength distribution of particles inside jets.
7 // Author: lcunquei@cern.ch
8 // *******************************************
11 /**************************************************************************
12 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
14 * Author: The ALICE Off-line Project. *
15 * Contributors are mentioned in the code where appropriate. *
17 * Permission to use, copy, modify and distribute this software and its *
18 * documentation strictly for non-commercial purposes is hereby granted *
19 * without fee, provided that the above copyright notice appears in all *
20 * copies and that both the copyright notice and this permission notice *
21 * appear in the supporting documentation. The authors make no claims *
22 * about the suitability of this software for any purpose. It is *
23 * provided "as is" without express or implied warranty. *
24 **************************************************************************/
35 #include "THnSparse.h"
45 #include "AliAnalysisTask.h"
46 #include "AliAnalysisManager.h"
48 #include "AliVEvent.h"
49 #include "AliESDEvent.h"
50 #include "AliMCEvent.h"
51 #include "AliESDInputHandler.h"
52 #include "AliCentrality.h"
53 #include "AliAnalysisHelperJetTasks.h"
54 #include "AliInputEventHandler.h"
55 #include "AliAODJetEventBackground.h"
56 #include "AliGenPythiaEventHeader.h"
57 #include "AliAODMCParticle.h"
58 #include "AliMCParticle.h"
59 #include "AliAODEvent.h"
60 #include "AliAODHandler.h"
61 #include "AliAODJet.h"
63 #include "AliAnalysisTaskJetCorePP.h"
68 ClassImp(AliAnalysisTaskJetCorePP)
70 //Filip Krizek 1st March 2013
72 //---------------------------------------------------------------------
73 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP() :
80 fJetBranchNameChargMC(""),
81 fJetBranchNameFullMC(""),
83 fJetBranchNameBgChargMC(""),
86 fListJetsGenFull(0x0),
90 fSystem(0), //pp=0 pPb=1
92 fOfflineTrgMask(AliVEvent::kAny),
103 fTrackLowPtCut(0.15),
105 fHistEvtSelection(0x0),
108 fHJetSpecSubUeMedian(0x0),
109 fHJetSpecSubUeCMS(0x0),
112 fHRhoUeMedianVsCMS(0x0),
114 //fHJetDensityA4(0x0),
120 fhVertexZAccept(0x0),
122 fhContribVtxAccept(0x0),
123 fhDphiTriggerJet(0x0),
124 fhDphiTriggerJetAccept(0x0),
126 fhCentralityAccept(0x0),
128 //fHLeadingJetPtRaw(0x0),
129 //fHDphiVsJetPtAll(0x0),
130 fhJetPtGenVsJetPtRec(0x0),
131 fhJetPtGenVsJetPtRecSubUeMedian(0x0),
132 fhJetPtGenVsJetPtRecSubUeCMS(0x0),
134 fhJetPtSubUeMedianGen(0x0),
135 fhJetPtSubUeCMSGen(0x0),
136 fhJetPtGenChargVsJetPtGenFull(0x0),
138 fh2NtriggersGen(0x0),
140 fHJetSpecSubUeMedianGen(0x0),
141 fHJetSpecSubUeCMSGen(0x0),
142 fHJetUeMedianGen(0x0),
144 fhPtTrkTruePrimRec(0x0),
145 fhPtTrkTruePrimGen(0x0),
146 fhPtTrkSecOrFakeRec(0x0),
147 fHRhoUeMedianVsCMSGen(0x0),
152 fkAcceptance(2.0*TMath::Pi()*1.8),
153 fkDeltaPhiCut(TMath::Pi()-0.8),
159 fh1PtHardTrials(0x0),
162 fEventNumberRangeLow(0),
163 fEventNumberRangeHigh(99),
164 fTriggerPtRangeLow(0.0),
165 fTriggerPtRangeHigh(10000.0),
168 // default Constructor
171 //---------------------------------------------------------------------
173 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const char *name) :
174 AliAnalysisTaskSE(name),
180 fJetBranchNameChargMC(""),
181 fJetBranchNameFullMC(""),
182 fJetBranchNameBg(""),
183 fJetBranchNameBgChargMC(""),
186 fListJetsGenFull(0x0),
190 fSystem(0), //pp=0 pPb=1
192 fOfflineTrgMask(AliVEvent::kAny),
203 fTrackLowPtCut(0.15),
205 fHistEvtSelection(0x0),
208 fHJetSpecSubUeMedian(0x0),
209 fHJetSpecSubUeCMS(0x0),
212 fHRhoUeMedianVsCMS(0x0),
214 //fHJetDensityA4(0x0),
220 fhVertexZAccept(0x0),
222 fhContribVtxAccept(0x0),
223 fhDphiTriggerJet(0x0),
224 fhDphiTriggerJetAccept(0x0),
226 fhCentralityAccept(0x0),
228 //fHLeadingJetPtRaw(0x0),
229 //fHDphiVsJetPtAll(0x0),
230 fhJetPtGenVsJetPtRec(0x0),
231 fhJetPtGenVsJetPtRecSubUeMedian(0x0),
232 fhJetPtGenVsJetPtRecSubUeCMS(0x0),
234 fhJetPtSubUeMedianGen(0x0),
235 fhJetPtSubUeCMSGen(0x0),
236 fhJetPtGenChargVsJetPtGenFull(0x0),
238 fh2NtriggersGen(0x0),
240 fHJetSpecSubUeMedianGen(0x0),
241 fHJetSpecSubUeCMSGen(0x0),
242 fHJetUeMedianGen(0x0),
244 fhPtTrkTruePrimRec(0x0),
245 fhPtTrkTruePrimGen(0x0),
246 fhPtTrkSecOrFakeRec(0x0),
247 fHRhoUeMedianVsCMSGen(0x0),
252 fkAcceptance(2.0*TMath::Pi()*1.8),
253 fkDeltaPhiCut(TMath::Pi()-0.8),
259 fh1PtHardTrials(0x0),
262 fEventNumberRangeLow(0),
263 fEventNumberRangeHigh(99),
264 fTriggerPtRangeLow(0.0),
265 fTriggerPtRangeHigh(10000.0),
270 DefineOutput(1, TList::Class());
273 //--------------------------------------------------------------
274 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const AliAnalysisTaskJetCorePP& a):
275 AliAnalysisTaskSE(a.GetName()),
279 fAODExtension(a.fAODExtension),
280 fJetBranchName(a.fJetBranchName),
281 fJetBranchNameChargMC(a.fJetBranchNameChargMC),
282 fJetBranchNameFullMC(a.fJetBranchNameFullMC),
283 fJetBranchNameBg(a.fJetBranchNameBg),
284 fJetBranchNameBgChargMC(a.fJetBranchNameBgChargMC),
285 fListJets(a.fListJets),
286 fListJetsGen(a.fListJetsGen),
287 fListJetsGenFull(a.fListJetsGenFull),
288 fListJetsBg(a.fListJetsBg),
289 fListJetsBgGen(a.fListJetsBgGen),
290 fNonStdFile(a.fNonStdFile),
292 fJetParamR(a.fJetParamR),
293 fOfflineTrgMask(a.fOfflineTrgMask),
294 fMinContribVtx(a.fMinContribVtx),
295 fVtxZMin(a.fVtxZMin),
296 fVtxZMax(a.fVtxZMax),
297 fFilterMask(a.fFilterMask),
298 fCentMin(a.fCentMin),
299 fCentMax(a.fCentMax),
300 fJetEtaMin(a.fJetEtaMin),
301 fJetEtaMax(a.fJetEtaMax),
302 fTriggerEtaCut(a.fTriggerEtaCut),
303 fTrackEtaCut(a.fTrackEtaCut),
304 fTrackLowPtCut(a.fTrackLowPtCut),
305 fOutputList(a.fOutputList),
306 fHistEvtSelection(a.fHistEvtSelection),
307 fh2Ntriggers(a.fh2Ntriggers),
308 fHJetSpec(a.fHJetSpec),
309 fHJetSpecSubUeMedian(a.fHJetSpecSubUeMedian),
310 fHJetSpecSubUeCMS(a.fHJetSpecSubUeCMS),
311 fHJetUeMedian(a.fHJetUeMedian),
312 fHJetUeCMS(a.fHJetUeCMS),
313 fHRhoUeMedianVsCMS(a.fHRhoUeMedianVsCMS),
314 //fHJetDensity(a.fHJetDensity),
315 //fHJetDensityA4(a.fHJetDensityA4),
316 fhJetPhi(a.fhJetPhi),
317 fhTriggerPhi(a.fhTriggerPhi),
318 fhJetEta(a.fhJetEta),
319 fhTriggerEta(a.fhTriggerEta),
320 fhVertexZ(a.fhVertexZ),
321 fhVertexZAccept(a.fhVertexZAccept),
322 fhContribVtx(a.fhContribVtx),
323 fhContribVtxAccept(a.fhContribVtxAccept),
324 fhDphiTriggerJet(a.fhDphiTriggerJet),
325 fhDphiTriggerJetAccept(a.fhDphiTriggerJetAccept),
326 fhCentrality(a.fhCentrality),
327 fhCentralityAccept(a.fhCentralityAccept),
328 //fHJetPtRaw(a.fHJetPtRaw),
329 //fHLeadingJetPtRaw(a.fHLeadingJetPtRaw),
330 //fHDphiVsJetPtAll(a.fHDphiVsJetPtAll),
331 fhJetPtGenVsJetPtRec(a.fhJetPtGenVsJetPtRec),
332 fhJetPtGenVsJetPtRecSubUeMedian(a.fhJetPtGenVsJetPtRecSubUeMedian),
333 fhJetPtGenVsJetPtRecSubUeCMS(a.fhJetPtGenVsJetPtRecSubUeCMS),
334 fhJetPtGen(a.fhJetPtGen),
335 fhJetPtSubUeMedianGen(a.fhJetPtSubUeMedianGen),
336 fhJetPtSubUeCMSGen(a.fhJetPtSubUeCMSGen),
337 fhJetPtGenChargVsJetPtGenFull(a.fhJetPtGenChargVsJetPtGenFull),
338 fhJetPtGenFull(a.fhJetPtGenFull),
339 fh2NtriggersGen(a.fh2NtriggersGen),
340 fHJetSpecGen(a.fHJetSpecGen),
341 fHJetSpecSubUeMedianGen(a.fHJetSpecSubUeMedianGen),
342 fHJetSpecSubUeCMSGen(a.fHJetSpecSubUeCMSGen),
343 fHJetUeMedianGen(a.fHJetUeMedianGen),
344 fHJetUeCMSGen(a.fHJetUeCMSGen),
345 fhPtTrkTruePrimRec(a.fhPtTrkTruePrimRec),
346 fhPtTrkTruePrimGen(a.fhPtTrkTruePrimGen),
347 fhPtTrkSecOrFakeRec(a.fhPtTrkSecOrFakeRec),
348 fHRhoUeMedianVsCMSGen(a.fHRhoUeMedianVsCMSGen),
349 fIsChargedMC(a.fIsChargedMC),
350 fIsFullMC(a.fIsFullMC),
351 faGenIndex(a.faGenIndex),
352 faRecIndex(a.faRecIndex),
353 fkAcceptance(a.fkAcceptance),
354 fkDeltaPhiCut(a.fkDeltaPhiCut),
356 fh1Trials(a.fh1Trials),
357 fh1AvgTrials(a.fh1AvgTrials),
358 fh1PtHard(a.fh1PtHard),
359 fh1PtHardNoW(a.fh1PtHardNoW),
360 fh1PtHardTrials(a.fh1PtHardTrials),
361 fAvgTrials(a.fAvgTrials),
362 fHardest(a.fHardest),
363 fEventNumberRangeLow(a.fEventNumberRangeLow),
364 fEventNumberRangeHigh(a.fEventNumberRangeHigh),
365 fTriggerPtRangeLow(a.fTriggerPtRangeLow),
366 fTriggerPtRangeHigh(a.fTriggerPtRangeHigh),
372 //--------------------------------------------------------------
374 AliAnalysisTaskJetCorePP& AliAnalysisTaskJetCorePP::operator = (const AliAnalysisTaskJetCorePP& a){
375 // assignment operator
376 this->~AliAnalysisTaskJetCorePP();
377 new(this) AliAnalysisTaskJetCorePP(a);
380 //--------------------------------------------------------------
382 AliAnalysisTaskJetCorePP::~AliAnalysisTaskJetCorePP()
387 delete fListJetsGenFull;
389 delete fListJetsBgGen;
390 delete fOutputList; // ????
394 //--------------------------------------------------------------
397 Bool_t AliAnalysisTaskJetCorePP::Notify()
399 //Implemented Notify() to read the cross sections
400 //and number of trials from pyxsec.root
401 //inspired by AliAnalysisTaskJetSpectrum2::Notify()
402 if(!fIsChargedMC) return kFALSE;
404 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
406 if(fDebug>1) AliError("ESD not available");
407 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
410 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
413 if(fNonStdFile.Length()!=0){
414 // case that we have an AOD extension we can fetch the jets from the extended output
415 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
416 fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
418 if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
422 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
423 Float_t xsection = 0;
428 TFile *curfile = tree->GetCurrentFile();
430 Error("Notify","No current file");
433 if(!fh1Xsec || !fh1Trials){
434 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
437 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
438 fh1Xsec->Fill("<#sigma>",xsection);
439 // construct a poor man average trials
440 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
441 if(ftrials>=nEntries && nEntries>0.) fAvgTrials = ftrials/nEntries;
442 fh1Trials->Fill("#sum{ntrials}",ftrials);
445 if(fDebug)Printf("Reading File %s",fInputHandler->GetTree()->GetCurrentFile()->GetName());
449 //--------------------------------------------------------------
451 void AliAnalysisTaskJetCorePP::Init()
453 // check for jet branches
454 if(!strlen(fJetBranchName.Data())){
455 AliError("Jet branch name not set.");
459 //--------------------------------------------------------------
461 void AliAnalysisTaskJetCorePP::UserCreateOutputObjects()
465 fListJets = new TList(); //reconstructed level antikt jets
466 fListJetsBg = new TList(); //reconstructed level bg kT jets
468 fIsChargedMC = (fJetBranchNameChargMC.Length()>0) ? kTRUE : kFALSE;
469 fIsFullMC = (fJetBranchNameFullMC.Length()>0) ? kTRUE : kFALSE;
471 fRandom = new TRandom3(0);
474 fListJetsGen = new TList(); //generator level charged antikt jets
475 fListJetsBgGen = new TList(); //generator level charged bg kT jets
478 fListJetsGenFull = new TList(); //generator level full jets
481 if(!fOutputList) fOutputList = new TList();
482 fOutputList->SetOwner(kTRUE);
484 Bool_t oldStatus = TH1::AddDirectoryStatus();
485 TH1::AddDirectory(kFALSE);
487 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
488 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
489 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
490 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
491 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
492 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
493 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"event number (rejected)");
495 fOutputList->Add(fHistEvtSelection);
497 Int_t nBinsCentrality = (fSystem==0) ? 1 : 10; // pp=1 else 10
498 //trigger pt spectrum (reconstructed)
499 fh2Ntriggers = new TH2F("fh2Ntriggers","# of triggers",
500 nBinsCentrality,0.0,100.0,50,0.0,50.0);
501 fOutputList->Add(fh2Ntriggers);
503 //Centrality, A, pTjet, pTtrigg, dphi
504 const Int_t dimSpec = 5;
505 const Int_t nBinsSpec[dimSpec] = {nBinsCentrality, 100, 220, 50, TMath::Nint(10*(TMath::Pi()-fkDeltaPhiCut))};
506 const Double_t lowBinSpec[dimSpec] = {0.0, 0.0, -20, 0.0, fkDeltaPhiCut};
507 const Double_t hiBinSpec[dimSpec] = {100.0, 1.0, 200.0,50.0, TMath::Pi()};
508 fHJetSpec = new THnSparseF("fHJetSpec",
509 "Recoil jet spectrum [cent,A,pTjet,pTtrig,dphi]",
510 dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
511 fOutputList->Add(fHJetSpec);
513 //background estimated as median of kT jets
514 fHJetSpecSubUeMedian = (THnSparseF*) fHJetSpec->Clone("fHJetSpecSubUeMedian");
515 fHJetSpecSubUeMedian->SetTitle("Recoil jet spectrum [cent,A,pTjet-pTUe,pTtrig,dphi]");
516 fOutputList->Add(fHJetSpecSubUeMedian);
517 //background estimated as weighted median of kT jets ala CMS
518 fHJetSpecSubUeCMS = (THnSparseF*) fHJetSpec->Clone("fHJetSpecSubUeCMS");
519 fHJetSpecSubUeCMS->SetTitle("Recoil jet spectrum [cent,A,pTjet-pTUe,pTtrig,dphi]");
520 fOutputList->Add(fHJetSpecSubUeCMS);
524 //------------------- HISTOS FOR DIAGNOSTIC ----------------------
525 //A, pTjet, pTjet-pTUe, pTUe, rhoUe bg estimate from kT median
526 const Int_t dimSpecMed = 5;
527 const Int_t nBinsSpecMed[dimSpecMed] = {50, 50, 50, 50, 50};
528 const Double_t lowBinSpecMed[dimSpecMed] = {0.0, 0.0, -50.0, 0.0, 0.0};
529 const Double_t hiBinSpecMed[dimSpecMed] = {1.0, 100.0, 100.0, 20.0, 20.0};
530 fHJetUeMedian = new THnSparseF("fHJetUeMedian",
531 "Recoil jet spectrum [A,pTjet,pTjet-pTUe, pTUe, rhoUe]",
532 dimSpecMed, nBinsSpecMed, lowBinSpecMed, hiBinSpecMed);
533 fOutputList->Add(fHJetUeMedian);
535 //A, pTjet, pTjet-pTUe, pTUe, rhoUe bg estimate from kT median CMS
536 fHJetUeCMS = (THnSparseF*) fHJetUeMedian->Clone("fHJetUeCMS");
537 fHJetUeCMS->SetTitle("Recoil jet spectrum [A,pTjet,pTjet-pTUe, pTUe, rhoUe]");
538 fOutputList->Add(fHJetUeCMS);
540 //rho bacground reconstructed data
541 const Int_t dimRho = 2;
542 const Int_t nBinsRho[dimRho] = {200 , 200};
543 const Double_t lowBinRho[dimRho] = {0.0 , 0.0};
544 const Double_t hiBinRho[dimRho] = {20.0 , 20.0};
546 fHRhoUeMedianVsCMS = new THnSparseF("hRhoUeMedianVsCMS","[Rho CMS, Rho Median]",
547 dimRho, nBinsRho, lowBinRho, hiBinRho);
548 fOutputList->Add(fHRhoUeMedianVsCMS);
550 //Jet number density histos [Trk Mult, jet density, pT trigger]
551 /*const Int_t dimJetDens = 3;
552 const Int_t nBinsJetDens[dimJetDens] = {100, 100, 10};
553 const Double_t lowBinJetDens[dimJetDens] = {0.0, 0.0, 0.0};
554 const Double_t hiBinJetDens[dimJetDens] = {500.0, 5.0, 50.0};
556 fHJetDensity = new THnSparseF("fHJetDensity","Jet dens vs trk mult A>0.07",
557 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
559 fHJetDensityA4 =new THnSparseF("fHJetDensityA4","Jet dens vs trk mult A>0.4",
560 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
562 fOutputList->Add(fHJetDensity);
563 fOutputList->Add(fHJetDensityA4);
566 //inclusive azimuthal and pseudorapidity histograms
567 fhJetPhi = new TH2D("fhJetPhi","Azim dist jets vs pTjet",
568 50, 0, 100, 50,-TMath::Pi(),TMath::Pi());
569 fhTriggerPhi= new TH2D("fhTriggerPhi","azim dist trig had vs pTtrigg",
570 50, 0, 50, 50,-TMath::Pi(),TMath::Pi());
571 fhJetEta = new TH2D("fhJetEta","Eta dist jets vs pTjet",
572 50,0, 100, 40,-0.9,0.9);
573 fhTriggerEta = new TH2D("fhTriggerEta","Eta dist trig had vs pTtrigg",
574 50, 0, 50, 40,-0.9,0.9);
576 fhVertexZ = new TH1D("fhVertexZ","z vertex",40,-20,20);
577 fhVertexZAccept = new TH1D("fhVertexZAccept","z vertex after cut",40,-20,20);
578 fhContribVtx = new TH1D("fhContribVtx","contrib to vtx",200,0,200);
579 fhContribVtxAccept = new TH1D("fhContribVtxAccept","contrib to vtx after cut",200,0,200);
580 fhDphiTriggerJet = new TH1D("fhDphiTriggerJet","Deltaphi trig-jet",50, -TMath::Pi(),TMath::Pi());
581 fhDphiTriggerJetAccept = new TH1D("fhDphiTriggerJetAccept","Deltaphi trig-jet after cut",50, -TMath::Pi(),TMath::Pi());
582 fhCentrality = new TH1D("fhCentrality","Centrality",20,0,100);
583 fhCentralityAccept = new TH1D("fhCentralityAccept","Centrality after cut",20,0,100);
585 fOutputList->Add(fhJetPhi);
586 fOutputList->Add(fhTriggerPhi);
587 fOutputList->Add(fhJetEta);
588 fOutputList->Add(fhTriggerEta);
589 fOutputList->Add(fhVertexZ);
590 fOutputList->Add(fhVertexZAccept);
591 fOutputList->Add(fhContribVtx);
592 fOutputList->Add(fhContribVtxAccept);
593 fOutputList->Add(fhDphiTriggerJet);
594 fOutputList->Add(fhDphiTriggerJetAccept);
595 fOutputList->Add(fhCentrality);
596 fOutputList->Add(fhCentralityAccept);
598 // raw spectra of INCLUSIVE jets
599 //Centrality, pTjet, A
600 /*const Int_t dimRaw = 3;
601 const Int_t nBinsRaw[dimRaw] = {nBinsCentrality, 50, 100};
602 const Double_t lowBinRaw[dimRaw] = {0.0, 0.0, 0.0};
603 const Double_t hiBinRaw[dimRaw] = {100.0, 100, 1.0};
604 fHJetPtRaw = new THnSparseF("fHJetPtRaw",
605 "Incl. jet spectrum [cent,pTjet,A]",
606 dimRaw,nBinsRaw,lowBinRaw,hiBinRaw);
607 fOutputList->Add(fHJetPtRaw);
609 // raw spectra of LEADING jets
610 //Centrality, pTjet, A
611 fHLeadingJetPtRaw = new THnSparseF("fHLeadingJetPtRaw",
612 "Leading jet spectrum [cent,pTjet,A]",
613 dimRaw,nBinsRaw,lowBinRaw,hiBinRaw);
614 fOutputList->Add(fHLeadingJetPtRaw);
616 // Dphi versus pT jet
617 //Centrality, Dphi=phiTrig-phiJet, pTjet, pTtrigg
618 const Int_t dimDp = 4;
619 const Int_t nBinsDp[dimDp] = {nBinsCentrality, 50, 50, 50};
620 const Double_t lowBinDp[dimDp] = {0.0, -TMath::Pi(), 0.0, 0.0};
621 const Double_t hiBinDp[dimDp] = {100.0, TMath::Pi(), 100.0, 100.0};
622 fHDphiVsJetPtAll = new THnSparseF("fHDphiVsJetPtAll",
623 "Dphi vs jet pT [cent,Dphi,pTjet,pTtrigg]",
624 dimDp,nBinsDp,lowBinDp,hiBinDp);
625 fOutputList->Add(fHDphiVsJetPtAll);
628 //analyze MC generator level
630 fhJetPtGenVsJetPtRec = new TH2D("fhJetPtGenVsJetPtRec","JetPtGenVsJetPtRec", 200,0,200, 200,0,200);
631 fOutputList->Add(fhJetPtGenVsJetPtRec); //gen MC charg jet pt spectrum versus rec charged jet pt spectrum
633 fhJetPtGenVsJetPtRecSubUeMedian = new TH2D("fhJetPtGenVsJetPtRecSubUeMedian","fhJetPtGenVsJetPtRecSubUeMedian", 220,-20,200, 220,-20,200);
634 fOutputList->Add(fhJetPtGenVsJetPtRecSubUeMedian); // with kT median bg subtr
636 fhJetPtGenVsJetPtRecSubUeCMS=(TH2D*)fhJetPtGenVsJetPtRecSubUeMedian->Clone("fhJetPtGenVsJetPtRecSubUeCMS");
637 fhJetPtGenVsJetPtRecSubUeCMS->SetTitle("fhJetPtGenVsJetPtRecSubUeCMS");
638 fOutputList->Add(fhJetPtGenVsJetPtRecSubUeCMS); // with weighted kT median bg subtr
640 fhJetPtGen = new TH1D("fhJetPtGen","Jet Pt (MC Gen)",200,0,200); //MC generator charged jet pt spectrum
641 fOutputList->Add(fhJetPtGen);
643 fhJetPtSubUeMedianGen = new TH1D("fhJetPtSubUeMedianGen","Jet Pt - UE pT (MC Gen)",220,-20,200);
644 fOutputList->Add(fhJetPtSubUeMedianGen); // with kT median bg subtr
646 fhJetPtSubUeCMSGen = (TH1D*) fhJetPtSubUeMedianGen->Clone("fhJetPtSubUeCMSGen");
647 fOutputList->Add(fhJetPtSubUeCMSGen); // with weighted kT median bg subtr
650 fhJetPtGenChargVsJetPtGenFull = new TH2D("fhJetPtGenChargVsJetPtGenFull","fhJetPtGenChargVsJetPtGenFull", 200,0,200, 200,0,200);
651 fOutputList->Add(fhJetPtGenChargVsJetPtGenFull); //gen full MC jet pt versus gen charged jet MC pt
653 fhJetPtGenFull = new TH1D("fhJetPtGenFull","Jet Pt (MC Full jets Gen)",200,0,200); //MC generator full jet pt spectrum
654 fOutputList->Add(fhJetPtGenFull);
657 fh2NtriggersGen = (TH2F*) fh2Ntriggers->Clone("fh2NtriggersGen");
658 fh2NtriggersGen->SetTitle(Form("%s Gen MC",fh2Ntriggers->GetTitle()));
659 fOutputList->Add(fh2NtriggersGen);
661 //Centrality, A, pT, pTtrigg
662 fHJetSpecGen = (THnSparseF*) fHJetSpec->Clone("fHJetSpecGen");
663 fHJetSpecGen->SetTitle(Form("%s Gen MC",fHJetSpec->GetTitle()));
664 fOutputList->Add(fHJetSpecGen);
666 fHJetSpecSubUeMedianGen = (THnSparseF*) fHJetSpecSubUeMedian->Clone("fHJetSpecSubUeMedianGen");
667 fHJetSpecSubUeMedianGen->SetTitle(Form("%s Gen MC",fHJetSpecSubUeMedian->GetTitle()));
668 fOutputList->Add(fHJetSpecSubUeMedianGen);
670 fHJetSpecSubUeCMSGen = (THnSparseF*) fHJetSpecSubUeCMS->Clone("fHJetSpecSubUeCMSGen");
671 fHJetSpecSubUeCMSGen->SetTitle(Form("%s Gen MC",fHJetSpecSubUeCMS->GetTitle()));
672 fOutputList->Add(fHJetSpecSubUeCMSGen);
674 fHJetUeMedianGen = (THnSparseF*) fHJetUeMedian->Clone("fHJetUeMedianGen");
675 fHJetUeMedianGen->SetTitle(Form("%s Gen MC", fHJetUeMedian->GetTitle()));
676 fOutputList->Add(fHJetUeMedianGen);
678 fHJetUeCMSGen = (THnSparseF*) fHJetUeCMS->Clone("fHJetUeCMSGen");
679 fHJetUeCMSGen->SetTitle(Form("%s Gen MC", fHJetUeCMS->GetTitle()));
680 fOutputList->Add(fHJetUeCMSGen);
682 //track efficiency/contamination histograms eta versus pT
683 fhPtTrkTruePrimRec = new TH2D("fhPtTrkTruePrimRec","PtTrkTruePrimRec",100,0,20,18,-0.9,0.9);
684 fOutputList->Add(fhPtTrkTruePrimRec);
686 fhPtTrkTruePrimGen = (TH2D*) fhPtTrkTruePrimRec->Clone("fhPtTrkTruePrimGen");
687 fhPtTrkTruePrimGen->SetTitle("PtTrkTruePrimGen");
688 fOutputList->Add(fhPtTrkTruePrimGen);
690 fhPtTrkSecOrFakeRec = (TH2D*) fhPtTrkTruePrimRec->Clone("fhPtTrkSecOrFakeRec");
691 fhPtTrkSecOrFakeRec->SetTitle("PtTrkSecOrFakeRec");
692 fOutputList->Add(fhPtTrkSecOrFakeRec);
694 fHRhoUeMedianVsCMSGen = (THnSparseF*) fHRhoUeMedianVsCMS->Clone("hRhoUeMedianVsCMSGen");
695 fHRhoUeMedianVsCMSGen->SetTitle(Form("%s Gen MC", fHRhoUeMedianVsCMS->GetTitle()));
696 fOutputList->Add(fHRhoUeMedianVsCMSGen);
698 //-------------------------------------
700 const Int_t nBinPt = 150;
701 Double_t binLimitsPt[nBinPt+1];
702 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
704 binLimitsPt[iPt] = -50.0;
706 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.;
710 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
711 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
712 fOutputList->Add(fh1Xsec);
713 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
714 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
715 fOutputList->Add(fh1Trials);
716 fh1AvgTrials = new TH1F("fh1AvgTrials","trials root file",1,0,1);
717 fh1AvgTrials->GetXaxis()->SetBinLabel(1,"#sum{avg ntrials}");
718 fOutputList->Add(fh1AvgTrials);
719 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
720 fOutputList->Add(fh1PtHard);
721 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
722 fOutputList->Add(fh1PtHardNoW);
723 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
724 fOutputList->Add(fh1PtHardTrials);
727 // =========== Switch on Sumw2 for all histos ===========
728 for(Int_t i=0; i<fOutputList->GetEntries(); i++){
729 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
734 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
739 TH1::AddDirectory(oldStatus);
741 PostData(1, fOutputList);
744 //--------------------------------------------------------------------
746 void AliAnalysisTaskJetCorePP::UserExec(Option_t *)
749 Double_t eventW = 1.0;
750 Double_t ptHard = 0.0;
751 Double_t nTrials = 1.0; // Trials for MC trigger
752 if(fIsChargedMC) fh1AvgTrials->Fill("#sum{avg ntrials}",fAvgTrials);
754 if(TMath::Abs((Float_t) fJetParamR)<0.00001){
755 AliError("Cone radius is set to zero.");
758 if(!strlen(fJetBranchName.Data())){
759 AliError("Jet branch name not set.");
762 if(!strlen(fJetBranchNameBg.Data())){
763 AliError("Jet bg branch name not set.");
768 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
770 if(fDebug>1) AliError("ESD not available");
771 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
774 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
775 AliAODEvent* aod = NULL;
776 // take all other information from the aod we take the tracks from
778 if(!fESD) aod = fAODIn;
782 if(fNonStdFile.Length()!=0){
783 // case that we have an AOD extension we can fetch the jets from the extended output
784 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
785 fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
787 if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
791 // ----------------- EVENT SELECTION --------------------------
792 fHistEvtSelection->Fill(1); // number of events before event selection
795 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
796 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
798 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
799 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
800 fHistEvtSelection->Fill(2);
801 PostData(1, fOutputList);
807 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
808 fHistEvtSelection->Fill(3);
809 PostData(1, fOutputList);
814 AliAODVertex* primVtx = aod->GetPrimaryVertex();
817 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
818 fHistEvtSelection->Fill(3);
819 PostData(1, fOutputList);
823 Int_t nTracksPrim = primVtx->GetNContributors();
824 Float_t vtxz = primVtx->GetZ();
826 fhContribVtx->Fill(nTracksPrim);
827 if( nTracksPrim > 0 ) fhVertexZ->Fill(vtxz);
829 if((nTracksPrim < fMinContribVtx) ||
832 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",
833 (char*)__FILE__,__LINE__,vtxz);
834 fHistEvtSelection->Fill(3);
835 PostData(1, fOutputList);
839 fhContribVtxAccept->Fill(nTracksPrim);
840 fhVertexZAccept->Fill(vtxz);
842 //FK// No event class selection imposed
843 // event class selection (from jet helper task)
844 //Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
845 //if(fDebug) Printf("Event class %d", eventClass);
846 //if(eventClass < fEvtClassMin || eventClass > fEvtClassMax){
847 // fHistEvtSelection->Fill(4);
848 // PostData(1, fOutputList);
852 //------------------ CENTRALITY SELECTION ---------------
853 AliCentrality *cent = 0x0;
854 Double_t centValue = 0.0;
855 if(fSystem){ //fSystem=0 for pp, fSystem=1 for pPb
857 cent = fESD->GetCentrality();
858 if(cent) centValue = cent->GetCentralityPercentile("V0M");
860 centValue = aod->GetHeader()->GetCentrality();
862 if(fDebug) printf("centrality: %f\n", centValue);
864 fhCentrality->Fill(centValue);
866 if(centValue < fCentMin || centValue > fCentMax){
867 fHistEvtSelection->Fill(4);
868 PostData(1, fOutputList);
872 fhCentralityAccept->Fill( centValue );
876 //-----------------select disjunct event subsamples ----------------
877 Int_t eventnum = aod->GetHeader()->GetEventNumberESDFile();
878 Int_t lastdigit = eventnum % 10;
879 if(!(fEventNumberRangeLow<=lastdigit && lastdigit<=fEventNumberRangeHigh)){
880 fHistEvtSelection->Fill(5);
881 PostData(1, fOutputList);
885 if(fDebug) std::cout<<" ACCEPTED EVENT "<<endl;
886 fHistEvtSelection->Fill(0); // accepted events
887 // ==================== end event selection ============================
889 Double_t tmpArrayFive[5];
891 //=============== Recnstricted antikt and kt jets ===============
892 ReadTClonesArray(fJetBranchName.Data() , fListJets);
893 ReadTClonesArray(fJetBranchNameBg.Data(), fListJetsBg);
895 //============ Estimate background in reconstructed events ===========
896 Double_t rhoFromKtMedian=0.0, rhoAlaCMS=0.0;
897 EstimateBgRhoAlaCMS(fListJetsBg, fListJets, rhoFromKtMedian, rhoAlaCMS);
898 fListJetsBg->Clear(); //this list is further not needed
902 //============== analyze generator level MC ================
903 TList particleListGen; //list of tracks in MC
906 //================= generated charged antikt and kt jets ================
907 ReadTClonesArray(fJetBranchNameChargMC.Data(), fListJetsGen);
908 ReadTClonesArray(fJetBranchNameBgChargMC.Data(), fListJetsBgGen);
910 if(fIsFullMC){ //generated full jets
911 ReadTClonesArray(fJetBranchNameFullMC.Data(), fListJetsGenFull);
914 //============== Estimate bg in generated events ==============
915 Double_t rhoFromKtMedianGen=0.0, rhoAlaCMSGen=0.0;
916 EstimateBgRhoAlaCMS(fListJetsBgGen, fListJetsGen, rhoFromKtMedianGen, rhoAlaCMSGen);
917 fListJetsBgGen->Clear();
919 //========================================================
920 //serarch for charged trigger at the MC generator level
922 Int_t indexTriggGen = -1;
923 Double_t ptTriggGen = -1;
924 Int_t iCounterGen = 0; //number of entries in particleListGen array
925 Int_t triggersMC[200];//list of trigger candidates
926 Int_t ntriggersMC = 0; //index in triggers array
930 AliMCEvent* mcEvent = MCEvent();
932 PostData(1, fOutputList);
936 AliGenPythiaEventHeader *pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
938 nTrials = pythiaGenHeader->Trials();
939 ptHard = pythiaGenHeader->GetPtHard();
940 fh1PtHard->Fill(ptHard,eventW);
941 fh1PtHardNoW->Fill(ptHard,1);
942 fh1PtHardTrials->Fill(ptHard,nTrials);
945 for(Int_t it = 0; it < mcEvent->GetNumberOfTracks(); it++){
946 if(!mcEvent->IsPhysicalPrimary(it)) continue;
947 AliMCParticle* part = (AliMCParticle*) mcEvent->GetTrack(it);
949 if(SelectMCGenTracks((AliVParticle*) part, &particleListGen, ptTriggGen, indexTriggGen, iCounterGen)){
951 if(fHardest==0 && ntriggersMC<200){//single inclusive trigger
952 if(indexTriggGen > -1){//trigger candidate was found
953 triggersMC[ntriggersMC] = indexTriggGen;
958 iCounterGen++;//index in particleListGen array
963 PostData(1, fOutputList);
966 TClonesArray *tca = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(AliAODMCParticle::StdBranchName()));
968 PostData(1, fOutputList);
971 for(Int_t it = 0; it < tca->GetEntriesFast(); it++){
972 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
974 if(!part->IsPhysicalPrimary()) continue;
975 if(SelectMCGenTracks((AliVParticle*) part, &particleListGen, ptTriggGen, indexTriggGen, iCounterGen)){
977 if(fHardest==0 && ntriggersMC<200){//single inclusive trigger
978 if(indexTriggGen > -1){ //trigger candidater was found
979 triggersMC[ntriggersMC] = indexTriggGen;
984 iCounterGen++;//number of entries in particleListGen array
989 //============ Generator trigger+jet ==================
990 if(fHardest==0){ //single inclusive trigger
991 if(ntriggersMC>0){ //there is at least one trigger
992 Int_t rnd = fRandom->Integer(ntriggersMC); //0 to ntriggers-1
993 indexTriggGen = triggersMC[rnd];
995 indexTriggGen = -1; //trigger not found
1000 Int_t ilowGen = (fHardest==0 || fHardest==1) ? indexTriggGen : 0;
1001 Int_t ihighGen = (fHardest==0 || fHardest==1) ? indexTriggGen+1 : particleListGen.GetEntries();
1002 Bool_t fillOnceGen = kTRUE;
1005 for(Int_t igen= ilowGen; igen< ihighGen; igen++){ //loop over possible trigger
1006 indexTriggGen = igen; //trigger hadron
1008 if(indexTriggGen == -1) continue;
1009 AliVParticle* triggerGen=(AliVParticle*) particleListGen.At(indexTriggGen);
1010 if(!triggerGen) continue;
1013 if(triggerGen->Pt() < 6.0) continue; //all hadrons pt>6
1015 if(TMath::Abs((Float_t) triggerGen->Eta()) > fTriggerEtaCut) continue;
1017 ptTriggGen = triggerGen->Pt(); //count triggers
1018 fh2NtriggersGen->Fill(centValue, ptTriggGen);
1020 //Count jets and trigger-jet pairs at MC generator level
1021 for(Int_t ij=0; ij<fListJetsGen->GetEntries(); ij++){
1022 AliAODJet* jet = (AliAODJet*)(fListJetsGen->At(ij));
1024 Double_t etaJetGen = jet->Eta();
1025 Double_t areaJetGen = jet->EffectiveAreaCharged();
1027 if((fJetEtaMin<=etaJetGen) && (etaJetGen<=fJetEtaMax)){
1029 Double_t dphi = RelativePhi(triggerGen->Phi(), jet->Phi());
1030 if(TMath::Abs((Double_t) dphi) < fkDeltaPhiCut) continue;
1032 //Centrality, A, pT, pTtrigg
1033 tmpArrayFive[0] = centValue;
1034 tmpArrayFive[1] = areaJetGen;
1035 tmpArrayFive[2] = jet->Pt();
1036 tmpArrayFive[3] = ptTriggGen;
1037 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1038 fHJetSpecGen->Fill(tmpArrayFive);
1041 Double_t ptUeFromKtMedianGen = rhoFromKtMedianGen*areaJetGen;
1042 Double_t ptUeAlaCMSGen = rhoAlaCMSGen*areaJetGen;
1044 //Centrality, A, pTjet-pTbgKtMedian, pTtrigg, dphi
1045 tmpArrayFive[0] = centValue;
1046 tmpArrayFive[1] = areaJetGen;
1047 tmpArrayFive[2] = jet->Pt() - ptUeFromKtMedianGen;
1048 tmpArrayFive[3] = ptTriggGen;
1049 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1050 fHJetSpecSubUeMedianGen->Fill(tmpArrayFive);
1052 //Centrality, A, pTjet-pTbgCMS, pTtrigg, dphi
1053 tmpArrayFive[0] = centValue;
1054 tmpArrayFive[1] = areaJetGen;
1055 tmpArrayFive[2] = jet->Pt() - ptUeAlaCMSGen;
1056 tmpArrayFive[3] = ptTriggGen;
1057 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1058 fHJetSpecSubUeCMSGen->Fill(tmpArrayFive);
1060 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", kT median
1061 tmpArrayFive[0] = areaJetGen;
1062 tmpArrayFive[1] = jet->Pt();
1063 tmpArrayFive[2] = jet->Pt() - ptUeFromKtMedianGen;
1064 tmpArrayFive[3] = ptUeFromKtMedianGen;
1065 tmpArrayFive[4] = rhoFromKtMedianGen;
1066 fHJetUeMedianGen->Fill(tmpArrayFive);
1068 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", CMS median
1069 tmpArrayFive[0] = areaJetGen;
1070 tmpArrayFive[1] = jet->Pt();
1071 tmpArrayFive[2] = jet->Pt() - ptUeAlaCMSGen;
1072 tmpArrayFive[3] = ptUeAlaCMSGen;
1073 tmpArrayFive[4] = rhoAlaCMSGen;
1074 fHJetUeCMSGen->Fill(tmpArrayFive);
1077 Double_t fillRhoGen[] = { rhoAlaCMSGen,rhoFromKtMedianGen};
1078 fHRhoUeMedianVsCMSGen->Fill(fillRhoGen);
1079 fillOnceGen = kFALSE;
1081 }//back to back jet-trigger pair
1085 //================ RESPONSE MATRIX ===============
1087 //Count jets and trigger-jet pairs at MC generator level
1089 for(Int_t ij=0; ij<fListJetsGen->GetEntries(); ij++){
1090 AliAODJet* jet = (AliAODJet*)(fListJetsGen->At(ij));
1092 Double_t etaJetGen = jet->Eta();
1093 Double_t ptJetGen = jet->Pt();
1095 if((fJetEtaMin<=etaJetGen) && (etaJetGen<=fJetEtaMax)){
1096 fhJetPtGen->Fill(ptJetGen); // gen level pt spectum of jets response mx normalization
1098 Double_t areaJetGen = jet->EffectiveAreaCharged();
1099 Double_t ptUeFromKtMedianGen = rhoFromKtMedianGen*areaJetGen;
1100 Double_t ptUeAlaCMSGen = rhoAlaCMSGen*areaJetGen;
1102 fhJetPtSubUeMedianGen->Fill(ptJetGen - ptUeFromKtMedianGen);
1103 fhJetPtSubUeCMSGen->Fill(ptJetGen - ptUeAlaCMSGen);
1106 if(fListJets->GetEntries()>0 && fListJetsGen->GetEntries()>0){ //at least some reconstructed jets
1108 Int_t ng = (Int_t) fListJetsGen->GetEntries();
1109 Int_t nr = (Int_t) fListJets->GetEntries();
1111 //Find closest MC generator - reconstructed jets
1112 if(faGenIndex.GetSize()<nr) faGenIndex.Set(nr); //idx of gen jet assoc to rec jet
1113 if(faRecIndex.GetSize()<ng) faRecIndex.Set(ng); //idx of rec jet assoc to gen jet
1116 Printf("New Rec List %d gen index Array %d",nr,faGenIndex.GetSize());
1117 Printf("New Gen List %d rec index Array %d",ng,faRecIndex.GetSize());
1119 //matching of MC genrator level and reconstructed jets
1120 AliAnalysisHelperJetTasks::GetClosestJets(fListJetsGen,ng,fListJets,nr,faGenIndex,faRecIndex,fDebug);
1122 // Fill response matrix
1123 for(Int_t ir = 0; ir < nr; ir++){
1124 AliAODJet *recJet = (AliAODJet*) fListJets->At(ir);
1125 Double_t etaJetRec = recJet->Eta();
1126 Double_t ptJetRec = recJet->Pt();
1127 Double_t areaJetRec = recJet->EffectiveAreaCharged();
1128 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1130 if((fJetEtaMin <= etaJetRec) && (etaJetRec <= fJetEtaMax)){
1131 Int_t ig = faGenIndex[ir]; //associated generator level jet
1132 if(ig >= 0 && ig < ng){
1133 if(fDebug > 10) Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1134 AliAODJet *genJet = (AliAODJet*) fListJetsGen->At(ig);
1135 Double_t ptJetGen = genJet->Pt();
1136 Double_t etaJetGen = genJet->Eta();
1138 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1139 if((fJetEtaMin <= etaJetGen) && (etaJetGen <= fJetEtaMax)){
1140 fhJetPtGenVsJetPtRec->Fill(ptJetRec, ptJetGen);
1142 Double_t areaJetGen = genJet->EffectiveAreaCharged();
1143 Double_t ptUeFromKtMedianGen = rhoFromKtMedianGen*areaJetGen;
1144 Double_t ptUeAlaCMSGen = rhoAlaCMSGen*areaJetGen;
1145 Double_t ptUeFromKtMedianRec = rhoFromKtMedian*areaJetRec;
1146 Double_t ptUeAlaCMSRec = rhoAlaCMS*areaJetRec;
1147 fhJetPtGenVsJetPtRecSubUeMedian->Fill(ptJetRec-ptUeFromKtMedianRec,
1148 ptJetGen-ptUeFromKtMedianGen);
1149 fhJetPtGenVsJetPtRecSubUeCMS->Fill(ptJetRec-ptUeAlaCMSRec, ptJetGen-ptUeAlaCMSGen);
1152 }//rec jet in eta acceptance
1153 }//loop over reconstructed jets
1154 }// # of rec jets >0
1156 //=========================== Full jet vs charged jet matrix ==========================
1158 //Count full jets and charged-jet pairs at MC generator level
1159 for(Int_t ij=0; ij<fListJetsGenFull->GetEntries(); ij++){
1160 AliAODJet* jetFull = (AliAODJet*)(fListJetsGenFull->At(ij));
1161 if(!jetFull) continue;
1162 Double_t etaJetFull = jetFull->Eta();
1163 Double_t ptJetFull = jetFull->Pt();
1165 if((fJetEtaMin<=etaJetFull) && (etaJetFull<=fJetEtaMax)){
1166 fhJetPtGenFull->Fill(ptJetFull); // generator level pt spectum of full jets
1169 if(fListJetsGen->GetEntries()>0 && fListJetsGenFull->GetEntries()>0){ //at least some reconstructed jets
1170 Int_t nful = (Int_t) fListJetsGenFull->GetEntries();
1171 Int_t nchr = (Int_t) fListJetsGen->GetEntries();
1173 //Find closest MC generator full - charged jet
1174 if(faGenIndex.GetSize()<nchr) faGenIndex.Set(nchr); //idx of gen FULL jet assoc to gen CHARGED jet
1175 if(faRecIndex.GetSize()<nful) faRecIndex.Set(nful); //idx of gen CHARGED jet assoc to gen FULL jet
1178 Printf("New Charg List %d Full index Array %d",nchr,faGenIndex.GetSize());
1179 Printf("New Full List %d Charg index Array %d",nful,faRecIndex.GetSize());
1181 //matching of MC genrator level and reconstructed jets
1182 AliAnalysisHelperJetTasks::GetClosestJets(fListJetsGenFull,nful,fListJetsGen,nchr,faGenIndex,faRecIndex,fDebug);
1184 // Fill response matrix
1185 for(Int_t ichr = 0; ichr < nchr; ichr++){ //charged jet loop
1186 AliAODJet *chJet = (AliAODJet*) fListJetsGen->At(ichr);
1187 Double_t etaJetCh = chJet->Eta();
1188 Double_t ptJetCh = chJet->Pt();
1189 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1191 if((fJetEtaMin <= etaJetCh) && (etaJetCh <= fJetEtaMax)){
1192 Int_t iful = faGenIndex[ichr]; //associated generator level jet
1193 if(iful >= 0 && iful < nful){
1194 if(fDebug > 10) Printf("%s:%d iful = %d ichr = %d",(char*)__FILE__,__LINE__,iful,ichr);
1195 AliAODJet *genJetFull = (AliAODJet*) fListJetsGenFull->At(iful);
1196 Double_t ptJetFull = genJetFull->Pt();
1197 Double_t etaJetFull = genJetFull->Eta();
1199 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1200 if((fJetEtaMin <= etaJetFull) && (etaJetFull <= fJetEtaMax)){
1201 fhJetPtGenChargVsJetPtGenFull->Fill(ptJetFull,ptJetCh);
1204 }//rec jet in eta acceptance
1205 }//loop over reconstructed jets
1206 }// # of rec jets >0
1207 }//pointer MC generator jets
1209 } //analyze generator level MC
1214 //============= RECONSTRUCTED INCLUSIVE JETS ===============
1216 Double_t etaJet = 0.0;
1217 Double_t pTJet = 0.0;
1218 Double_t areaJet = 0.0;
1219 Double_t phiJet = 0.0;
1220 Int_t indexLeadingJet = -1;
1221 Double_t pTLeadingJet = -10.0;
1222 Double_t areaLeadingJet = -10.0;
1224 for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
1225 AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
1227 etaJet = jet->Eta();
1228 phiJet = jet->Phi();
1230 if(pTJet==0) continue;
1232 if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
1233 /*areaJet = jet->EffectiveAreaCharged();*/
1235 //Jet Diagnostics---------------------------------
1236 fhJetPhi->Fill(pTJet, RelativePhi(phiJet,0.0)); //phi -pi,pi
1237 fhJetEta->Fill(pTJet, etaJet);
1238 //search for leading jet
1239 /*if(pTJet > pTLeadingJet){
1240 indexLeadingJet = ij;
1241 pTLeadingJet = pTJet;
1242 areaLeadingJet = areaJet;
1245 // raw spectra of INCLUSIVE jets
1246 //Centrality, pTjet, A
1247 Double_t fillraw[] = { centValue,
1251 fHJetPtRaw->Fill(fillraw);*/
1254 if(indexLeadingJet > -1){
1255 // raw spectra of LEADING jets
1256 //Centrality, pTjet, A
1257 Double_t fillleading[] = { centValue,
1261 fHLeadingJetPtRaw->Fill(fillleading);
1265 // =============== RECONSTRUCTED TRIGGER-JET PAIRS ================
1266 //Find Hadron trigger
1267 TList particleList; //list of tracks
1268 Int_t indexTrigg = GetListOfTracks(&particleList); //index of trigger hadron in Particle list
1269 if(fIsChargedMC) FillEffHistos(&particleList, &particleListGen); //Fill efficiency histos
1271 Bool_t filledOnce = kTRUE; //fill rho histogram only once per event
1272 //set ranges of the trigger loop
1273 Int_t ilow = (fHardest==0 || fHardest==1) ? indexTrigg : 0;
1274 Int_t ihigh = (fHardest==0 || fHardest==1) ? indexTrigg+1 : particleList.GetEntries();
1276 for(Int_t itrk= ilow; itrk< ihigh; itrk++){ //loop over possible trigger
1277 indexTrigg = itrk; //trigger hadron with pT >10 GeV
1279 if(indexTrigg < 0) continue;
1281 AliVParticle *triggerHadron = (AliVParticle*) particleList.At(indexTrigg);
1283 PostData(1, fOutputList);
1287 if(triggerHadron->Pt() < 6.0) continue; //all hadrons pt>6
1289 if(TMath::Abs((Float_t) triggerHadron->Eta())> fTriggerEtaCut) continue;
1291 //Fill trigger histograms
1292 fh2Ntriggers->Fill(centValue,triggerHadron->Pt()); //trigger pT
1293 fhTriggerPhi->Fill(triggerHadron->Pt(),RelativePhi(triggerHadron->Phi(),0.0)); //phi -pi,pi
1294 fhTriggerEta->Fill(triggerHadron->Pt(),triggerHadron->Eta());
1297 //---------- make trigger-jet pairs ---------
1300 //Double_t rhoFromKtMedian=0.0, rhoAlaCMS=0.0;
1301 //EstimateBgRhoAlaCMS(fListJetsBg, fListJets, rhoFromKtMedian, rhoAlaCMS);
1303 for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
1304 AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
1306 etaJet = jet->Eta();
1307 phiJet = jet->Phi();
1309 if(pTJet==0) continue;
1311 if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
1312 areaJet = jet->EffectiveAreaCharged();
1313 //if(areaJet >= 0.07) injet++;
1314 //if(areaJet >= 0.4) injet4++;
1316 Double_t dphi = RelativePhi(triggerHadron->Phi(), phiJet);
1317 fhDphiTriggerJet->Fill(dphi); //Input
1319 //Dphi versus jet pT
1320 //Centrality, Dphi=phiTrig-phiJet, pTjet, pTtrigg
1321 /*Double_t filldp[] = { centValue,
1326 fHDphiVsJetPtAll->Fill(filldp);
1328 // Select back to back trigger - jet pairs
1329 if(TMath::Abs((Double_t) dphi) < fkDeltaPhiCut) continue;
1330 fhDphiTriggerJetAccept->Fill(dphi); //Accepted
1333 //Centrality, A, pTjet, pTtrigg, dphi
1334 tmpArrayFive[0] = centValue;
1335 tmpArrayFive[1] = areaJet;
1336 tmpArrayFive[2] = pTJet;
1337 tmpArrayFive[3] = triggerHadron->Pt();
1338 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1339 fHJetSpec->Fill(tmpArrayFive);
1341 //subtract bg using estinates base on median of kT jets
1342 Double_t ptUeFromKtMedian = rhoFromKtMedian*areaJet;
1343 Double_t ptUeAlaCMS = rhoAlaCMS*areaJet;
1345 //Centrality, A, pTjet-pTbgKtMedian, pTtrigg, dphi
1346 tmpArrayFive[0] = centValue;
1347 tmpArrayFive[1] = areaJet;
1348 tmpArrayFive[2] = pTJet-ptUeFromKtMedian;
1349 tmpArrayFive[3] = triggerHadron->Pt();
1350 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1351 fHJetSpecSubUeMedian->Fill(tmpArrayFive);
1353 //Centrality, A, pTjet-pTbgCMS, pTtrigg, dphi
1354 tmpArrayFive[0] = centValue;
1355 tmpArrayFive[1] = areaJet;
1356 tmpArrayFive[2] = pTJet - ptUeAlaCMS;
1357 tmpArrayFive[3] = triggerHadron->Pt();
1358 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1359 fHJetSpecSubUeCMS->Fill(tmpArrayFive);
1361 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", kT median
1362 tmpArrayFive[0] = areaJet;
1363 tmpArrayFive[1] = pTJet;
1364 tmpArrayFive[2] = pTJet - ptUeFromKtMedian;
1365 tmpArrayFive[3] = ptUeFromKtMedian;
1366 tmpArrayFive[4] = rhoFromKtMedian;
1367 fHJetUeMedian->Fill(tmpArrayFive);
1369 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", CMS median
1370 tmpArrayFive[0] = areaJet;
1371 tmpArrayFive[1] = pTJet;
1372 tmpArrayFive[2] = pTJet - ptUeAlaCMS;
1373 tmpArrayFive[3] = ptUeAlaCMS;
1374 tmpArrayFive[4] = rhoAlaCMS;
1375 fHJetUeCMS->Fill(tmpArrayFive);
1377 if(filledOnce){ //fill for each event only once
1378 Double_t fillRho[] = { rhoAlaCMS,rhoFromKtMedian};
1379 fHRhoUeMedianVsCMS->Fill(fillRho);
1380 filledOnce = kFALSE;
1384 //Fill Jet Density In the Event A>0.07
1386 Double_t filldens[]={ (Double_t) particleList.GetEntries(),
1390 fHJetDensity->Fill(filldens);
1393 //Fill Jet Density In the Event A>0.4
1395 Double_t filldens4[]={ (Double_t) particleList.GetEntries(),
1396 injet4/fkAcceptance,
1399 fHJetDensityA4->Fill(filldens4);
1404 PostData(1, fOutputList);
1407 //----------------------------------------------------------------------------
1408 void AliAnalysisTaskJetCorePP::Terminate(const Option_t *)
1410 // Draw result to the screen
1411 // Called once at the end of the query
1413 if(fDebug) printf("AliAnalysisTaskJetCorePP DONE\n");
1414 if(!GetOutputData(1)) return;
1418 //----------------------------------------------------------------------------
1419 Int_t AliAnalysisTaskJetCorePP::GetListOfTracks(TList *list){
1420 //Fill the list of accepted tracks (passed track cut)
1421 //return consecutive index of the hardest ch hadron in the list
1423 AliAODEvent *aodevt = NULL;
1425 if(!fESD) aodevt = fAODIn;
1426 else aodevt = fAODOut;
1428 if(!aodevt) return -1;
1430 Int_t index = -1; //index of the highest particle in the list
1431 Double_t ptmax = -10;
1432 Int_t triggers[200];
1433 Int_t ntriggers = 0; //index in triggers array
1435 for(Int_t it = 0; it < aodevt->GetNumberOfTracks(); it++){
1436 AliAODTrack *tr = aodevt->GetTrack(it);
1438 //if((fFilterMask > 0) && !(tr->TestFilterBit(fFilterMask))) continue;
1439 if((fFilterMask > 0) && !(tr->IsHybridGlobalConstrainedGlobal())) continue;
1440 if(TMath::Abs((Float_t) tr->Eta()) > fTrackEtaCut) continue;
1441 if(tr->Pt() < fTrackLowPtCut) continue;
1445 if(fHardest>0){ //leading particle
1452 if(fHardest==0 && ntriggers<200){ //single inclusive
1453 if(fTriggerPtRangeLow <= tr->Pt() &&
1454 tr->Pt() < fTriggerPtRangeHigh){
1455 triggers[ntriggers] = iCount;
1463 if(fHardest==0 && ntriggers>0){ //select random inclusive trigger
1464 Int_t rnd = fRandom->Integer(ntriggers); //0 to ntriggers-1
1465 index = triggers[rnd];
1471 //----------------------------------------------------------------------------
1473 Double_t AliAnalysisTaskJetCorePP::GetBackgroundInPerpCone(Float_t jetR, Double_t jetPhi, Double_t jetEta, TList* trkList){
1474 //calculate sum of track pT in the cone perpendicular in phi to the jet
1475 //jetR = cone radius
1476 // jetPhi, jetEta = direction of the jet
1477 Int_t numberOfTrks = trkList->GetEntries();
1478 Double_t pTsum = 0.0;
1479 Double_t perpConePhi = jetPhi + TMath::Pi()/2;//perp cone w.r.t. jet in phi
1480 for(Int_t it=0; it<numberOfTrks; it++){
1481 AliVParticle *trk = (AliVParticle*) trkList->At(it);
1482 Double_t dphi = RelativePhi(perpConePhi,trk->Phi());
1483 Double_t deta = trk->Eta()-jetEta;
1485 if( (dphi*dphi + deta*deta)< (jetR*jetR)){
1493 //----------------------------------------------------------------------------
1495 Double_t AliAnalysisTaskJetCorePP::RelativePhi(Double_t mphi,Double_t vphi){
1496 //Get relative azimuthal angle of two particles -pi to pi
1497 if (vphi < -TMath::Pi()) vphi += TMath::TwoPi();
1498 else if (vphi > TMath::Pi()) vphi -= TMath::TwoPi();
1500 if (mphi < -TMath::Pi()) mphi += TMath::TwoPi();
1501 else if (mphi > TMath::Pi()) mphi -= TMath::TwoPi();
1503 Double_t dphi = mphi - vphi;
1504 if (dphi < -TMath::Pi()) dphi += TMath::TwoPi();
1505 else if (dphi > TMath::Pi()) dphi -= TMath::TwoPi();
1507 return dphi;//dphi in [-Pi, Pi]
1511 //----------------------------------------------------------------------------
1512 Bool_t AliAnalysisTaskJetCorePP::SelectMCGenTracks(AliVParticle *trk, TList *trkList, Double_t &ptLeading, Int_t &index, Int_t counter){
1513 //fill track efficiency denominator
1514 if(trk->Pt() < fTrackLowPtCut) return kFALSE;
1515 if(trk->Charge()==0) return kFALSE;
1516 if(TMath::Abs((Float_t) trk->Eta()) > fTrackEtaCut) return kFALSE;
1518 fhPtTrkTruePrimGen->Fill(trk->Pt(),trk->Eta()); //Efficiency denominator
1521 if(fHardest>0){ //leading particle
1522 if(ptLeading < trk->Pt()){
1524 ptLeading = trk->Pt();
1528 if(fHardest==0){ //single inclusive
1530 if(fTriggerPtRangeLow <= trk->Pt() &&
1531 trk->Pt() < fTriggerPtRangeHigh){
1539 //----------------------------------------------------------------------------
1540 void AliAnalysisTaskJetCorePP::FillEffHistos(TList *recList, TList *genList){
1541 //fill track efficiency numerator
1542 if(!recList) return;
1543 if(!genList) return;
1544 Int_t nRec = recList->GetEntries();
1545 Int_t nGen = genList->GetEntries();
1546 for(Int_t ir=0; ir<nRec; ir++){
1547 AliAODTrack *trkRec = (AliAODTrack*) recList->At(ir);
1548 if(!trkRec) continue;
1549 Int_t recLabel = TMath::Abs(trkRec->GetLabel());
1550 Bool_t matched = kFALSE;
1552 for(Int_t ig=0; ig<nGen; ig++){
1553 AliVParticle *trkGen = (AliVParticle*) genList->At(ig);
1554 if(!trkGen) continue;
1555 Int_t genLabel = TMath::Abs(trkGen->GetLabel());
1556 if(recLabel==genLabel){
1557 fhPtTrkTruePrimRec->Fill(trkGen->Pt(),trkGen->Eta());
1562 if(!matched) fhPtTrkSecOrFakeRec->Fill(trkRec->Pt(),trkRec->Eta());
1567 //________________________________________________________________
1568 void AliAnalysisTaskJetCorePP::EstimateBgRhoAlaCMS(TList *listJetBg, TList *listJet, Double_t &rhoMedian, Double_t& rhoImprovedCMS){
1569 //CMS method to estimate bg
1570 //adopted from Ruedinger
1571 // http://portal.nersc.gov/project/alice/htmldoc/src/AliAnalysisTaskChargedJetsPA.cxx.html#nP_gSD
1572 //AliAnalysisTaskChargedJetsPA::GetKTBackgroundDensity
1573 if(!listJetBg) return;
1575 static Double_t tmpRhoImprovedCMS[1024];
1576 Double_t tmpCoveredArea = 0.0;
1580 rhoImprovedCMS = 0.0;
1581 Int_t rhoImprovedCMSJetCount = 0;
1583 //Find two leading signal jets in the acceptance
1584 const Int_t kSigJets = 2;
1585 Int_t idxLeadingJets[kSigJets]={-1,-1};
1586 Double_t pTleading=-1., pTsubleading=-1.;
1588 for(Int_t jsig=0; jsig < listJet->GetEntries(); jsig++){
1589 AliAODJet* signaljet = (AliAODJet*)(listJet->At(jsig));
1590 if(!signaljet) continue;
1591 if((signaljet->Eta()<fJetEtaMin) && (fJetEtaMax<signaljet->Eta())) continue; //acceptance cut
1592 if(signaljet->Pt() >= pTleading){ //replace leading and subleading jet
1593 pTsubleading = pTleading;
1594 idxLeadingJets[1]=idxLeadingJets[0];
1595 pTleading = signaljet->Pt();
1596 idxLeadingJets[0]=jsig;
1597 }else if( signaljet->Pt() > pTsubleading){ //replace subleading jet
1598 pTsubleading = signaljet->Pt();
1599 idxLeadingJets[1]=jsig;
1604 for(Int_t ibg = 0; ibg< listJetBg->GetEntries(); ibg++){ //loop over bg kT jets
1606 AliAODJet* bgjet = (AliAODJet*)(listJetBg->At(ibg));
1607 if(!bgjet) continue;
1608 if((bgjet->Eta()<fJetEtaMin) && (fJetEtaMax<bgjet->Eta())) continue; //acceptance cut
1610 Int_t nbgtracks = (bgjet->GetRefTracks())->GetLast()+1;
1612 // Search for overlap with signal jets
1613 Bool_t isOverlapping = kFALSE;
1615 for(Int_t j=0;j<kSigJets;j++){ //skip jets wich share particles with the two leading jets
1616 if(idxLeadingJets[j]<0) continue;
1617 AliAODJet* signaljet = (AliAODJet*)(listJet->At(idxLeadingJets[j]));
1618 if(!signaljet) continue;
1619 Int_t nsignaltracks = (signaljet->GetRefTracks())->GetLast()+1;
1621 for(Int_t itrkbg=0; itrkbg < nbgtracks; itrkbg++ ){
1622 AliVParticle *trkbg = dynamic_cast<AliVParticle*> ( bgjet->GetTrack(itrkbg));
1623 if(!trkbg) continue;
1624 for(Int_t itrksig=0; itrksig < nsignaltracks; itrksig++ ){
1625 AliVParticle *trksig = dynamic_cast<AliVParticle*> ( signaljet->GetTrack(itrksig));
1626 if(!trksig) continue;
1627 if(trkbg->GetLabel() == trksig->GetLabel()){
1628 isOverlapping = kTRUE; // check phi and eta of the tracks id it is the same
1631 }//loop over antikt jet tracks
1632 if(isOverlapping) break;
1633 }//loop over jet bg tracks
1634 if(isOverlapping) break;
1635 }//loop over 2 leading antikt jets
1638 if(!bgjet->EffectiveAreaCharged()) continue;
1640 if(bgjet->Pt() > 0.150) tmpCoveredArea += bgjet->EffectiveAreaCharged();
1642 if(bgjet->Pt() > 0.150 && !isOverlapping){
1643 Double_t tmpRho = bgjet->Pt() / bgjet->EffectiveAreaCharged();
1644 tmpRhoImprovedCMS[rhoImprovedCMSJetCount] = tmpRho;
1645 rhoImprovedCMSJetCount++;
1647 }//loop over bg jets
1649 if(rhoImprovedCMSJetCount > 0){
1650 rhoMedian = TMath::Median(rhoImprovedCMSJetCount, tmpRhoImprovedCMS);
1651 rhoImprovedCMS = rhoMedian * tmpCoveredArea/fkAcceptance; //rescale to full akceptance
1655 //__________________________________________________________________
1657 void AliAnalysisTaskJetCorePP::ReadTClonesArray(TString bname, TList *list){
1658 //Convert TClones array of jets to TList
1660 if(!strlen(bname.Data())){
1661 AliError(Form("Jet branch %s not set.", bname.Data()));
1665 TClonesArray *array=0x0;
1667 if(fAODOut&&!array){
1668 array = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(bname.Data()));
1670 if(fAODExtension&&!array){
1671 array = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(bname.Data()));
1674 array = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(bname.Data()));
1677 list->Clear(); //clear list beforehand
1681 Printf("########## %s: %d jets",bname.Data(), array->GetEntriesFast());
1683 for(Int_t iJet = 0; iJet < array->GetEntriesFast(); iJet++) {
1684 AliAODJet *jet = dynamic_cast<AliAODJet*>((*array)[iJet]);
1685 if (jet) list->Add(jet);