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 **************************************************************************/
28 #include "TClonesArray.h"
36 #include "THnSparse.h"
46 #include "AliAnalysisTask.h"
47 #include "AliAnalysisManager.h"
49 #include "AliVEvent.h"
50 #include "AliESDEvent.h"
51 #include "AliMCEvent.h"
52 #include "AliESDInputHandler.h"
53 #include "AliCentrality.h"
54 #include "AliAnalysisHelperJetTasks.h"
55 #include "AliInputEventHandler.h"
56 #include "AliAODJetEventBackground.h"
57 #include "AliGenPythiaEventHeader.h"
58 #include "AliAODMCParticle.h"
59 #include "AliMCParticle.h"
60 #include "AliAODEvent.h"
61 #include "AliAODHandler.h"
62 #include "AliAODJet.h"
63 #include "AliVVertex.h"
64 #include "AliVTrack.h"
65 #include "AliAnalysisTaskJetCorePP.h"
66 #include "AliHeader.h" //KF//
71 ClassImp(AliAnalysisTaskJetCorePP)
73 //Filip Krizek 1st March 2013
75 //---------------------------------------------------------------------
76 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP() :
85 fJetBranchNameChargMC(""),
86 fJetBranchNameKine(""),
87 fJetBranchNameFullMC(""),
89 fJetBranchNameBgChargMC(""),
90 fJetBranchNameBgKine(""),
93 fListJetsGenFull(0x0),
97 fSystem(0), //pp=0 pPb=1
102 fOfflineTrgMask(AliVEvent::kAny),
113 fTrackLowPtCut(0.15),
114 fUseExchContainer(0),
116 fHistEvtSelection(0x0),
119 fHJetSpecSubUeMedian(0x0),
120 fHJetSpecSubUeCone(0x0),
122 fHJetPhiCorrSubUeMedian(0x0),
123 fHJetPhiCorrSubUeCone(0x0),
126 fHRhoUeMedianVsCone(0x0),
128 //fHJetDensityA4(0x0),
134 fhVertexZAccept(0x0),
136 fhContribVtxAccept(0x0),
137 fhDphiTriggerJet(0x0),
138 fhDphiTriggerJetAccept(0x0),
140 fhCentralityAccept(0x0),
141 fhNofMultipleTriggers(0x0),
142 fhNofMultipleTriggersCone(0x0),
143 fhDeltaRMultTriggers(0x0),
145 //fHLeadingJetPtRaw(0x0),
146 //fHDphiVsJetPtAll(0x0),
147 fhJetPtGenVsJetPtRec(0x0),
148 fhJetPtGenVsJetPtRecSubUeMedian(0x0),
149 fhJetPtGenVsJetPtRecSubUeCone(0x0),
151 fhJetPtSubUeMedianGen(0x0),
152 fhJetPtSubUeConeGen(0x0),
153 fhJetPtGenChargVsJetPtGenFull(0x0),
155 fh2NtriggersGen(0x0),
157 fHJetSpecSubUeMedianGen(0x0),
158 fHJetSpecSubUeConeGen(0x0),
159 fHJetPhiCorrGen(0x0),
160 fHJetPhiCorrSubUeMedianGen(0x0),
161 fHJetPhiCorrSubUeConeGen(0x0),
162 fHJetUeMedianGen(0x0),
164 fhPtTrkTruePrimRec(0x0),
165 fhPtTrkTruePrimGen(0x0),
166 fhPtTrkSecOrFakeRec(0x0),
167 fHRhoUeMedianVsConeGen(0x0),
168 fhEntriesToMedian(0x0),
169 fhEntriesToMedianGen(0x0),
170 fhCellAreaToMedian(0x0),
171 fhCellAreaToMedianGen(0x0),
172 fhNofMultipleTriggersGen(0x0),
173 fhNofMultipleTriggersConeGen(0x0),
174 fhDeltaRMultTriggersGen(0x0),
175 fhNofMultipleTriggersConeGenA(0x0),
176 fhNofMultipleTriggersConeGenB(0x0),
182 fkAcceptance(2.0*TMath::Pi()*1.8),
183 fkDeltaPhiCut(TMath::Pi()-0.8),
189 fh1PtHardTrials(0x0),
192 fEventNumberRangeLow(0),
193 fEventNumberRangeHigh(99),
194 fTriggerPtRangeLow(0.0),
195 fTriggerPtRangeHigh(10000.0),
199 fJetFreeAreaFrac(0.5),
203 fPhiSize(2*TMath::Pi()/fnPhi),
204 fCellArea(fPhiSize*fEtaSize),
206 fDoubleBinning(kFALSE)
208 // default Constructor
211 //---------------------------------------------------------------------
213 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const char *name) :
214 AliAnalysisTaskSE(name),
222 fJetBranchNameChargMC(""),
223 fJetBranchNameKine(""),
224 fJetBranchNameFullMC(""),
225 fJetBranchNameBg(""),
226 fJetBranchNameBgChargMC(""),
227 fJetBranchNameBgKine(""),
230 fListJetsGenFull(0x0),
234 fSystem(0), //pp=0 pPb=1
239 fOfflineTrgMask(AliVEvent::kAny),
250 fTrackLowPtCut(0.15),
251 fUseExchContainer(0),
253 fHistEvtSelection(0x0),
256 fHJetSpecSubUeMedian(0x0),
257 fHJetSpecSubUeCone(0x0),
259 fHJetPhiCorrSubUeMedian(0x0),
260 fHJetPhiCorrSubUeCone(0x0),
263 fHRhoUeMedianVsCone(0x0),
265 //fHJetDensityA4(0x0),
271 fhVertexZAccept(0x0),
273 fhContribVtxAccept(0x0),
274 fhDphiTriggerJet(0x0),
275 fhDphiTriggerJetAccept(0x0),
277 fhCentralityAccept(0x0),
278 fhNofMultipleTriggers(0x0),
279 fhNofMultipleTriggersCone(0x0),
280 fhDeltaRMultTriggers(0x0),
282 //fHLeadingJetPtRaw(0x0),
283 //fHDphiVsJetPtAll(0x0),
284 fhJetPtGenVsJetPtRec(0x0),
285 fhJetPtGenVsJetPtRecSubUeMedian(0x0),
286 fhJetPtGenVsJetPtRecSubUeCone(0x0),
288 fhJetPtSubUeMedianGen(0x0),
289 fhJetPtSubUeConeGen(0x0),
290 fhJetPtGenChargVsJetPtGenFull(0x0),
292 fh2NtriggersGen(0x0),
294 fHJetSpecSubUeMedianGen(0x0),
295 fHJetSpecSubUeConeGen(0x0),
296 fHJetPhiCorrGen(0x0),
297 fHJetPhiCorrSubUeMedianGen(0x0),
298 fHJetPhiCorrSubUeConeGen(0x0),
299 fHJetUeMedianGen(0x0),
301 fhPtTrkTruePrimRec(0x0),
302 fhPtTrkTruePrimGen(0x0),
303 fhPtTrkSecOrFakeRec(0x0),
304 fHRhoUeMedianVsConeGen(0x0),
305 fhEntriesToMedian(0x0),
306 fhEntriesToMedianGen(0x0),
307 fhCellAreaToMedian(0x0),
308 fhCellAreaToMedianGen(0x0),
309 fhNofMultipleTriggersGen(0x0),
310 fhNofMultipleTriggersConeGen(0x0),
311 fhDeltaRMultTriggersGen(0x0),
312 fhNofMultipleTriggersConeGenA(0x0),
313 fhNofMultipleTriggersConeGenB(0x0),
319 fkAcceptance(2.0*TMath::Pi()*1.8),
320 fkDeltaPhiCut(TMath::Pi()-0.8),
326 fh1PtHardTrials(0x0),
329 fEventNumberRangeLow(0),
330 fEventNumberRangeHigh(99),
331 fTriggerPtRangeLow(0.0),
332 fTriggerPtRangeHigh(10000.0),
336 fJetFreeAreaFrac(0.5),
340 fPhiSize(2*TMath::Pi()/fnPhi),
341 fCellArea(fPhiSize*fEtaSize),
343 fDoubleBinning(kFALSE)
346 DefineOutput(1, TList::Class());
349 if(dummy.Contains("KINE")){
350 DefineInput(1, TClonesArray::Class());
351 DefineInput(2, TClonesArray::Class());
355 //--------------------------------------------------------------
356 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const AliAnalysisTaskJetCorePP& a):
357 AliAnalysisTaskSE(a.GetName()),
361 fAODExtension(a.fAODExtension),
362 fMcEvent(a.fMcEvent),
363 fMcHandler(a.fMcHandler),
364 fJetBranchName(a.fJetBranchName),
365 fJetBranchNameChargMC(a.fJetBranchNameChargMC),
366 fJetBranchNameKine(a.fJetBranchNameKine),
367 fJetBranchNameFullMC(a.fJetBranchNameFullMC),
368 fJetBranchNameBg(a.fJetBranchNameBg),
369 fJetBranchNameBgChargMC(a.fJetBranchNameBgChargMC),
370 fJetBranchNameBgKine(a.fJetBranchNameBgKine),
371 fListJets(a.fListJets),
372 fListJetsGen(a.fListJetsGen),
373 fListJetsGenFull(a.fListJetsGenFull),
374 fListJetsBg(a.fListJetsBg),
375 fListJetsBgGen(a.fListJetsBgGen),
376 fNonStdFile(a.fNonStdFile),
378 fJetParamR(a.fJetParamR),
379 fBgJetParamR(a.fBgJetParamR),
380 fBgMaxJetPt(a.fBgMaxJetPt),
381 fBgConeR(a.fBgConeR),
382 fOfflineTrgMask(a.fOfflineTrgMask),
383 fMinContribVtx(a.fMinContribVtx),
384 fVtxZMin(a.fVtxZMin),
385 fVtxZMax(a.fVtxZMax),
386 fFilterMask(a.fFilterMask),
387 fCentMin(a.fCentMin),
388 fCentMax(a.fCentMax),
389 fJetEtaMin(a.fJetEtaMin),
390 fJetEtaMax(a.fJetEtaMax),
391 fTriggerEtaCut(a.fTriggerEtaCut),
392 fTrackEtaCut(a.fTrackEtaCut),
393 fTrackLowPtCut(a.fTrackLowPtCut),
394 fUseExchContainer(a.fUseExchContainer),
395 fOutputList(a.fOutputList),
396 fHistEvtSelection(a.fHistEvtSelection),
397 fh2Ntriggers(a.fh2Ntriggers),
398 fHJetSpec(a.fHJetSpec),
399 fHJetSpecSubUeMedian(a.fHJetSpecSubUeMedian),
400 fHJetSpecSubUeCone(a.fHJetSpecSubUeCone),
401 fHJetPhiCorr(a.fHJetPhiCorr),
402 fHJetPhiCorrSubUeMedian(a.fHJetPhiCorrSubUeMedian),
403 fHJetPhiCorrSubUeCone(a.fHJetPhiCorrSubUeCone),
404 fHJetUeMedian(a.fHJetUeMedian),
405 fHJetUeCone(a.fHJetUeCone),
406 fHRhoUeMedianVsCone(a.fHRhoUeMedianVsCone),
407 //fHJetDensity(a.fHJetDensity),
408 //fHJetDensityA4(a.fHJetDensityA4),
409 fhJetPhi(a.fhJetPhi),
410 fhTriggerPhi(a.fhTriggerPhi),
411 fhJetEta(a.fhJetEta),
412 fhTriggerEta(a.fhTriggerEta),
413 fhVertexZ(a.fhVertexZ),
414 fhVertexZAccept(a.fhVertexZAccept),
415 fhContribVtx(a.fhContribVtx),
416 fhContribVtxAccept(a.fhContribVtxAccept),
417 fhDphiTriggerJet(a.fhDphiTriggerJet),
418 fhDphiTriggerJetAccept(a.fhDphiTriggerJetAccept),
419 fhCentrality(a.fhCentrality),
420 fhCentralityAccept(a.fhCentralityAccept),
421 fhNofMultipleTriggers(a.fhNofMultipleTriggers),
422 fhNofMultipleTriggersCone(a.fhNofMultipleTriggersCone),
423 fhDeltaRMultTriggers(a.fhDeltaRMultTriggers),
424 //fHJetPtRaw(a.fHJetPtRaw),
425 //fHLeadingJetPtRaw(a.fHLeadingJetPtRaw),
426 //fHDphiVsJetPtAll(a.fHDphiVsJetPtAll),
427 fhJetPtGenVsJetPtRec(a.fhJetPtGenVsJetPtRec),
428 fhJetPtGenVsJetPtRecSubUeMedian(a.fhJetPtGenVsJetPtRecSubUeMedian),
429 fhJetPtGenVsJetPtRecSubUeCone(a.fhJetPtGenVsJetPtRecSubUeCone),
430 fhJetPtGen(a.fhJetPtGen),
431 fhJetPtSubUeMedianGen(a.fhJetPtSubUeMedianGen),
432 fhJetPtSubUeConeGen(a.fhJetPtSubUeConeGen),
433 fhJetPtGenChargVsJetPtGenFull(a.fhJetPtGenChargVsJetPtGenFull),
434 fhJetPtGenFull(a.fhJetPtGenFull),
435 fh2NtriggersGen(a.fh2NtriggersGen),
436 fHJetSpecGen(a.fHJetSpecGen),
437 fHJetSpecSubUeMedianGen(a.fHJetSpecSubUeMedianGen),
438 fHJetSpecSubUeConeGen(a.fHJetSpecSubUeConeGen),
439 fHJetPhiCorrGen(a.fHJetPhiCorrGen),
440 fHJetPhiCorrSubUeMedianGen(a.fHJetPhiCorrSubUeMedianGen),
441 fHJetPhiCorrSubUeConeGen(a.fHJetPhiCorrSubUeConeGen),
442 fHJetUeMedianGen(a.fHJetUeMedianGen),
443 fHJetUeConeGen(a.fHJetUeConeGen),
444 fhPtTrkTruePrimRec(a.fhPtTrkTruePrimRec),
445 fhPtTrkTruePrimGen(a.fhPtTrkTruePrimGen),
446 fhPtTrkSecOrFakeRec(a.fhPtTrkSecOrFakeRec),
447 fHRhoUeMedianVsConeGen(a.fHRhoUeMedianVsConeGen),
448 fhEntriesToMedian(a.fhEntriesToMedian),
449 fhEntriesToMedianGen(a.fhEntriesToMedianGen),
450 fhCellAreaToMedian(a.fhCellAreaToMedian),
451 fhCellAreaToMedianGen(a.fhCellAreaToMedianGen),
452 fhNofMultipleTriggersGen(a.fhNofMultipleTriggersGen),
453 fhNofMultipleTriggersConeGen(a.fhNofMultipleTriggersConeGen),
454 fhDeltaRMultTriggersGen(a.fhDeltaRMultTriggersGen),
455 fhNofMultipleTriggersConeGenA(a.fhNofMultipleTriggersConeGenA),
456 fhNofMultipleTriggersConeGenB(a.fhNofMultipleTriggersConeGenB),
457 fIsChargedMC(a.fIsChargedMC),
459 fIsFullMC(a.fIsFullMC),
460 faGenIndex(a.faGenIndex),
461 faRecIndex(a.faRecIndex),
462 fkAcceptance(a.fkAcceptance),
463 fkDeltaPhiCut(a.fkDeltaPhiCut),
465 fh1Trials(a.fh1Trials),
466 fh1AvgTrials(a.fh1AvgTrials),
467 fh1PtHard(a.fh1PtHard),
468 fh1PtHardNoW(a.fh1PtHardNoW),
469 fh1PtHardTrials(a.fh1PtHardTrials),
470 fAvgTrials(a.fAvgTrials),
471 fHardest(a.fHardest),
472 fEventNumberRangeLow(a.fEventNumberRangeLow),
473 fEventNumberRangeHigh(a.fEventNumberRangeHigh),
474 fTriggerPtRangeLow(a.fTriggerPtRangeLow),
475 fTriggerPtRangeHigh(a.fTriggerPtRangeHigh),
476 fFillRespMx(a.fFillRespMx),
478 fnTrials(a.fnTrials),
479 fJetFreeAreaFrac(a.fJetFreeAreaFrac),
482 fEtaSize(a.fEtaSize),
483 fPhiSize(a.fPhiSize),
484 fCellArea(a.fCellArea),
485 fSafetyMargin(a.fSafetyMargin),
486 fDoubleBinning(a.fDoubleBinning)
491 //--------------------------------------------------------------
493 AliAnalysisTaskJetCorePP& AliAnalysisTaskJetCorePP::operator = (const AliAnalysisTaskJetCorePP& a){
494 // assignment operator
495 this->~AliAnalysisTaskJetCorePP();
496 new(this) AliAnalysisTaskJetCorePP(a);
499 //--------------------------------------------------------------
501 AliAnalysisTaskJetCorePP::~AliAnalysisTaskJetCorePP()
506 delete fListJetsGenFull;
508 delete fListJetsBgGen;
509 delete fOutputList; // ????
513 //--------------------------------------------------------------
516 Bool_t AliAnalysisTaskJetCorePP::Notify()
518 //Implemented Notify() to read the cross sections
519 //and number of trials from pyxsec.root
520 //inspired by AliAnalysisTaskJetSpectrum2::Notify()
521 if(!(fIsChargedMC || fIsKine)) return kFALSE;
522 Float_t xsection = 0;
527 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
529 if(fDebug>1) AliError("ESD not available");
530 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
533 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
536 if(fNonStdFile.Length()!=0){
537 // case that we have an AOD extension we can fetch the jets from the extended output
538 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
539 fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
541 if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
545 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
548 TFile *curfile = tree->GetCurrentFile();
550 Error("Notify","No current file");
553 if(!fh1Xsec || !fh1Trials){
554 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
557 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,trials);
558 fh1Xsec->Fill("<#sigma>",xsection);
559 // construct a poor man average trials
560 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
561 if(trials>=nEntries && nEntries>0.) fAvgTrials = trials/nEntries;
562 fh1Trials->Fill("#sum{ntrials}",trials);
565 if(fDebug)Printf("Reading File %s",fInputHandler->GetTree()->GetCurrentFile()->GetName());
571 //--------------------------------------------------------------
573 void AliAnalysisTaskJetCorePP::Init()
575 // check for jet branches
576 if(fJetBranchNameKine.Length()==0){
577 if(!strlen(fJetBranchName.Data())){
578 AliError("Jet branch name not set.");
581 fMcHandler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
586 //--------------------------------------------------------------
588 void AliAnalysisTaskJetCorePP::UserCreateOutputObjects()
590 // Create histograms and initilize variables
591 fSafetyMargin = fBgConeR*fBgConeR /(fBgJetParamR*fBgJetParamR);
594 fListJets = new TList(); //reconstructed level antikt jets
595 fListJetsBg = new TList(); //reconstructed jets to be removed from bg
597 fIsChargedMC = (fJetBranchNameChargMC.Length()>0) ? kTRUE : kFALSE;
598 fIsKine = (fJetBranchNameKine.Length()>0) ? kTRUE : kFALSE;
599 fIsFullMC = (fJetBranchNameFullMC.Length()>0) ? kTRUE : kFALSE;
601 fRandom = new TRandom3(0);
603 if(fIsChargedMC || fIsKine){ //full MC or pure kine
604 fListJetsGen = new TList(); //generator level charged antikt jets
605 fListJetsBgGen = new TList(); //generator level jets to be removed from bg
608 fListJetsGenFull = new TList(); //generator level full jets
611 if(!fOutputList) fOutputList = new TList();
612 fOutputList->SetOwner(kTRUE);
614 Bool_t oldStatus = TH1::AddDirectoryStatus();
615 TH1::AddDirectory(kFALSE);
617 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
618 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
619 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
620 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
621 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
622 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
623 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"event number (rejected)");
625 fOutputList->Add(fHistEvtSelection);
627 Int_t nBinsCentrality = (fSystem==0) ? 1 : 10; // pp=1 else 10
628 //trigger pt spectrum (reconstructed)
629 fh2Ntriggers = new TH2F("fh2Ntriggers","# of triggers",
630 nBinsCentrality,0.0,100.0,50,0.0,50.0);
631 if(!fIsKine) fOutputList->Add(fh2Ntriggers);
633 Int_t bw = (fDoubleBinning==0) ? 1 : 2; //make larger bin width
635 //Centrality, A, pTjet, pTtrigg, dphi
636 const Int_t dimSpec = 5;
637 const Int_t nBinsSpec[dimSpec] = {nBinsCentrality, 50, bw*110, 50, TMath::Nint(10*(TMath::Pi()-fkDeltaPhiCut))};
638 const Double_t lowBinSpec[dimSpec] = {0.0, 0.0, -20, 0.0, fkDeltaPhiCut};
639 const Double_t hiBinSpec[dimSpec] = {100.0, 1.0, 200.0,50.0, TMath::Pi()};
640 fHJetSpec = new THnSparseF("fHJetSpec",
641 "Recoil jet spectrum [cent,A,pTjet,pTtrig,dphi]",
642 dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
643 if(!fIsKine) fOutputList->Add(fHJetSpec);
645 //background estimated as median of kT jets
646 fHJetSpecSubUeMedian = (THnSparseF*) fHJetSpec->Clone("fHJetSpecSubUeMedian");
647 fHJetSpecSubUeMedian->SetTitle("Recoil jet spectrum [cent,A,pTjet-pTUe,pTtrig,dphi]");
648 if(!fIsKine) fOutputList->Add(fHJetSpecSubUeMedian);
649 //background estimated as weighted median of kT jets ala Cone
650 fHJetSpecSubUeCone = (THnSparseF*) fHJetSpec->Clone("fHJetSpecSubUeCone");
651 fHJetSpecSubUeCone->SetTitle("Recoil jet spectrum [cent,A,pTjet-pTUe,pTtrig,dphi]");
652 if(!fIsKine) fOutputList->Add(fHJetSpecSubUeCone);
655 //A, pTjet, pTtrigg, dphi
656 const Int_t dimCor = 4;
657 const Int_t nBinsCor[dimCor] = {50, 110, 50, 100};
658 const Double_t lowBinCor[dimCor] = {0.0, -20, 0.0, -0.5*TMath::Pi()};
659 const Double_t hiBinCor[dimCor] = {1.0, 200, 50.0, 1.5*TMath::Pi()};
660 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr",
661 "Recoil jet spectrum [A,pTjet,pTtrig,dphi]",
662 dimCor,nBinsCor,lowBinCor,hiBinCor);
664 if(!fIsKine) fOutputList->Add(fHJetPhiCorr); // Dphi distribution jet-triger
666 //background estimated as median of kT jets
667 fHJetPhiCorrSubUeMedian = (THnSparseF*) fHJetPhiCorr->Clone("fHJetPhiCorrSubUeMedian");
668 fHJetPhiCorrSubUeMedian->SetTitle("Recoil jet spectrum [A,pTjet-pTUe,pTtrig,dphi]");
669 if(!fIsKine) fOutputList->Add(fHJetPhiCorrSubUeMedian);
670 //background estimated as weighted median of kT jets ala Cone
671 fHJetPhiCorrSubUeCone = (THnSparseF*) fHJetPhiCorr->Clone("fHJetPhiCorrSubUeCone");
672 fHJetPhiCorrSubUeCone->SetTitle("Recoil jet spectrum [A,pTjet-pTUe,pTtrig,dphi]");
673 if(!fIsKine) fOutputList->Add(fHJetPhiCorrSubUeCone);
676 //------------------- HISTOS FOR DIAGNOSTIC ----------------------
677 //A, pTjet, pTjet-pTUe, pTUe, rhoUe bg estimate from kT median
678 const Int_t dimSpecMed = 5;
679 const Int_t nBinsSpecMed[dimSpecMed] = {25, 50, 60, 20, 20};
680 const Double_t lowBinSpecMed[dimSpecMed] = {0.0, 0.0, -20.0, 0.0, 0.0};
681 const Double_t hiBinSpecMed[dimSpecMed] = {1.0, 100.0, 100.0, 10.0, 20.0};
682 fHJetUeMedian = new THnSparseF("fHJetUeMedian",
683 "Recoil jet spectrum [A,pTjet,pTjet-pTUe, pTUe, rhoUe]",
684 dimSpecMed, nBinsSpecMed, lowBinSpecMed, hiBinSpecMed);
685 if(!fIsKine) fOutputList->Add(fHJetUeMedian);
687 //A, pTjet, pTjet-pTUe, pTUe, rhoUe bg estimate from kT median Cone
688 fHJetUeCone = (THnSparseF*) fHJetUeMedian->Clone("fHJetUeCone");
689 fHJetUeCone->SetTitle("Recoil jet spectrum [A,pTjet,pTjet-pTUe, pTUe, rhoUe]");
690 if(!fIsKine) fOutputList->Add(fHJetUeCone);
692 //rho bacground reconstructed data
693 const Int_t dimRho = 2;
694 const Int_t nBinsRho[dimRho] = {50 , 50};
695 const Double_t lowBinRho[dimRho] = {0.0 , 0.0};
696 const Double_t hiBinRho[dimRho] = {20.0 , 20.0};
698 fHRhoUeMedianVsCone = new THnSparseF("hRhoUeMedianVsCone","[Rho Cone, Rho Median]",
699 dimRho, nBinsRho, lowBinRho, hiBinRho);
700 if(!fIsKine) fOutputList->Add(fHRhoUeMedianVsCone);
702 //Jet number density histos [Trk Mult, jet density, pT trigger]
703 /*const Int_t dimJetDens = 3;
704 const Int_t nBinsJetDens[dimJetDens] = {100, 100, 10};
705 const Double_t lowBinJetDens[dimJetDens] = {0.0, 0.0, 0.0};
706 const Double_t hiBinJetDens[dimJetDens] = {500.0, 5.0, 50.0};
708 fHJetDensity = new THnSparseF("fHJetDensity","Jet dens vs trk mult A>0.07",
709 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
711 fHJetDensityA4 =new THnSparseF("fHJetDensityA4","Jet dens vs trk mult A>0.4",
712 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
714 fOutputList->Add(fHJetDensity);
715 fOutputList->Add(fHJetDensityA4);
718 //inclusive azimuthal and pseudorapidity histograms
719 fhJetPhi = new TH2D("fhJetPhi","Azim dist jets vs pTjet",
720 50, 0, 100, 50,-TMath::Pi(),TMath::Pi());
721 fhTriggerPhi= new TH2D("fhTriggerPhi","azim dist trig had vs pTtrigg",
722 50, 0, 50, 50,-TMath::Pi(),TMath::Pi());
723 fhJetEta = new TH2D("fhJetEta","Eta dist jets vs pTjet",
724 50,0, 100, 40,-0.9,0.9);
725 fhTriggerEta = new TH2D("fhTriggerEta","Eta dist trig had vs pTtrigg",
726 50, 0, 50, 40,-0.9,0.9);
728 fhVertexZ = new TH1D("fhVertexZ","z vertex",40,-20,20);
729 fhVertexZAccept = new TH1D("fhVertexZAccept","z vertex after cut",40,-20,20);
730 fhContribVtx = new TH1D("fhContribVtx","contrib to vtx",200,0,200);
731 fhContribVtxAccept = new TH1D("fhContribVtxAccept","contrib to vtx after cut",200,0,200);
732 fhDphiTriggerJet = new TH1D("fhDphiTriggerJet","Deltaphi trig-jet",50, -TMath::Pi(),TMath::Pi());
733 fhDphiTriggerJetAccept = new TH1D("fhDphiTriggerJetAccept","Deltaphi trig-jet after cut",50, -TMath::Pi(),TMath::Pi());
734 fhCentrality = new TH1D("fhCentrality","Centrality",20,0,100);
735 fhCentralityAccept = new TH1D("fhCentralityAccept","Centrality after cut",20,0,100);
736 fhEntriesToMedian = new TH1D("fhEntriesToMedian","fhEntriesToMedian",30,0,30);
737 fhCellAreaToMedian = new TH1D("fhCellAreaToMedian", "fhCellAreaToMedian", 75,0,1.5);
739 fhNofMultipleTriggers = new TH1D("fhNofMultipleTriggers","fhNofMultipleTriggers",100,0,100);
740 fhNofMultipleTriggersCone = new TH1D("fhNofMultipleTriggersCone","fhNofMultipleTriggersCone R<0.4",100,0,100);
741 fhDeltaRMultTriggers = new TH1D("fhDeltaRMultTriggers","fhDeltaRMultTriggers", 100,0,4);
744 fOutputList->Add(fhJetPhi);
745 fOutputList->Add(fhTriggerPhi);
746 fOutputList->Add(fhJetEta);
747 fOutputList->Add(fhTriggerEta);
749 fOutputList->Add(fhVertexZ);
750 fOutputList->Add(fhVertexZAccept);
752 fOutputList->Add(fhContribVtx);
753 fOutputList->Add(fhContribVtxAccept);
754 fOutputList->Add(fhDphiTriggerJet);
755 fOutputList->Add(fhDphiTriggerJetAccept);
756 fOutputList->Add(fhCentrality);
757 fOutputList->Add(fhCentralityAccept);
758 fOutputList->Add(fhEntriesToMedian);
759 fOutputList->Add(fhCellAreaToMedian);
760 fOutputList->Add(fhNofMultipleTriggers);
761 fOutputList->Add(fhNofMultipleTriggersCone);
762 fOutputList->Add(fhDeltaRMultTriggers);
764 // raw spectra of INCLUSIVE jets
765 //Centrality, pTjet, A
766 /*const Int_t dimRaw = 3;
767 const Int_t nBinsRaw[dimRaw] = {nBinsCentrality, 50, 100};
768 const Double_t lowBinRaw[dimRaw] = {0.0, 0.0, 0.0};
769 const Double_t hiBinRaw[dimRaw] = {100.0, 100, 1.0};
770 fHJetPtRaw = new THnSparseF("fHJetPtRaw",
771 "Incl. jet spectrum [cent,pTjet,A]",
772 dimRaw,nBinsRaw,lowBinRaw,hiBinRaw);
773 fOutputList->Add(fHJetPtRaw);
775 // raw spectra of LEADING jets
776 //Centrality, pTjet, A
777 fHLeadingJetPtRaw = new THnSparseF("fHLeadingJetPtRaw",
778 "Leading jet spectrum [cent,pTjet,A]",
779 dimRaw,nBinsRaw,lowBinRaw,hiBinRaw);
780 fOutputList->Add(fHLeadingJetPtRaw);
782 // Dphi versus pT jet
783 //Centrality, Dphi=phiTrig-phiJet, pTjet, pTtrigg
784 const Int_t dimDp = 4;
785 const Int_t nBinsDp[dimDp] = {nBinsCentrality, 50, 50, 50};
786 const Double_t lowBinDp[dimDp] = {0.0, -TMath::Pi(), 0.0, 0.0};
787 const Double_t hiBinDp[dimDp] = {100.0, TMath::Pi(), 100.0, 100.0};
788 fHDphiVsJetPtAll = new THnSparseF("fHDphiVsJetPtAll",
789 "Dphi vs jet pT [cent,Dphi,pTjet,pTtrigg]",
790 dimDp,nBinsDp,lowBinDp,hiBinDp);
791 fOutputList->Add(fHDphiVsJetPtAll);
794 //analyze MC generator level
795 if(fIsChargedMC || fIsKine){
797 //Fill response matrix only once
798 fhJetPtGenVsJetPtRec = new TH2D("fhJetPtGenVsJetPtRec","JetPtGenVsJetPtRec", bw*100,0,200, bw*100,0,200);
799 fOutputList->Add(fhJetPtGenVsJetPtRec); //gen MC charg jet pt spectrum versus rec charged jet pt spectrum
801 fhJetPtGenVsJetPtRecSubUeMedian = new TH2D("fhJetPtGenVsJetPtRecSubUeMedian","fhJetPtGenVsJetPtRecSubUeMedian", bw*110,-20,200, bw*110,-20,200);
802 fOutputList->Add(fhJetPtGenVsJetPtRecSubUeMedian); // with kT median bg subtr
804 fhJetPtGenVsJetPtRecSubUeCone=(TH2D*)fhJetPtGenVsJetPtRecSubUeMedian->Clone("fhJetPtGenVsJetPtRecSubUeCone");
805 fhJetPtGenVsJetPtRecSubUeCone->SetTitle("fhJetPtGenVsJetPtRecSubUeCone");
806 fOutputList->Add(fhJetPtGenVsJetPtRecSubUeCone); // with weighted kT median bg subtr
808 fhJetPtGen = new TH1D("fhJetPtGen","Jet Pt (MC Gen)",bw*100,0,200); //MC generator charged jet pt spectrum
809 fOutputList->Add(fhJetPtGen);
811 fhJetPtSubUeMedianGen = new TH1D("fhJetPtSubUeMedianGen","Jet Pt - UE pT (MC Gen)",bw*110,-20,200);
812 fOutputList->Add(fhJetPtSubUeMedianGen); // with kT median bg subtr
814 fhJetPtSubUeConeGen = (TH1D*) fhJetPtSubUeMedianGen->Clone("fhJetPtSubUeConeGen");
815 fOutputList->Add(fhJetPtSubUeConeGen); // with weighted kT median bg subtr
819 fhJetPtGenChargVsJetPtGenFull = new TH2D("fhJetPtGenChargVsJetPtGenFull","fhJetPtGenChargVsJetPtGenFull", 100,0,200, 100,0,200);
820 fOutputList->Add(fhJetPtGenChargVsJetPtGenFull); //gen full MC jet pt versus gen charged jet MC pt
822 fhJetPtGenFull = new TH1D("fhJetPtGenFull","Jet Pt (MC Full jets Gen)",100,0,200); //MC generator full jet pt spectrum
823 fOutputList->Add(fhJetPtGenFull);
827 fh2NtriggersGen = (TH2F*) fh2Ntriggers->Clone("fh2NtriggersGen");
828 fh2NtriggersGen->SetTitle(Form("%s Gen MC",fh2Ntriggers->GetTitle()));
829 fOutputList->Add(fh2NtriggersGen);
831 //Centrality, A, pT, pTtrigg
832 fHJetSpecGen = (THnSparseF*) fHJetSpec->Clone("fHJetSpecGen");
833 fHJetSpecGen->SetTitle(Form("%s Gen MC",fHJetSpec->GetTitle()));
834 fOutputList->Add(fHJetSpecGen);
836 fHJetSpecSubUeMedianGen = (THnSparseF*) fHJetSpecSubUeMedian->Clone("fHJetSpecSubUeMedianGen");
837 fHJetSpecSubUeMedianGen->SetTitle(Form("%s Gen MC",fHJetSpecSubUeMedian->GetTitle()));
838 fOutputList->Add(fHJetSpecSubUeMedianGen);
840 fHJetSpecSubUeConeGen = (THnSparseF*) fHJetSpecSubUeCone->Clone("fHJetSpecSubUeConeGen");
841 fHJetSpecSubUeConeGen->SetTitle(Form("%s Gen MC",fHJetSpecSubUeCone->GetTitle()));
842 fOutputList->Add(fHJetSpecSubUeConeGen);
844 fHJetPhiCorrGen = (THnSparseF*) fHJetPhiCorr->Clone("fHJetPhiCorrGen");
845 fHJetPhiCorrGen->SetTitle(Form("%s Gen MC",fHJetPhiCorr->GetTitle()));
846 fOutputList->Add(fHJetPhiCorrGen);
848 fHJetPhiCorrSubUeMedianGen = (THnSparseF*) fHJetPhiCorrSubUeMedian->Clone("fHJetPhiCorrSubUeMedianGen");
849 fHJetPhiCorrSubUeMedianGen->SetTitle(Form("%s Gen MC",fHJetPhiCorrSubUeMedian->GetTitle()));
850 fOutputList->Add(fHJetPhiCorrSubUeMedianGen);
852 fHJetPhiCorrSubUeConeGen = (THnSparseF*) fHJetPhiCorrSubUeCone->Clone("fHJetPhiCorrSubUeConeGen");
853 fHJetPhiCorrSubUeConeGen->SetTitle(Form("%s Gen MC", fHJetPhiCorrSubUeCone->GetTitle()));
854 fOutputList->Add(fHJetPhiCorrSubUeConeGen);
857 fHJetUeMedianGen = (THnSparseF*) fHJetUeMedian->Clone("fHJetUeMedianGen");
858 fHJetUeMedianGen->SetTitle(Form("%s Gen MC", fHJetUeMedian->GetTitle()));
859 fOutputList->Add(fHJetUeMedianGen);
861 fHJetUeConeGen = (THnSparseF*) fHJetUeCone->Clone("fHJetUeConeGen");
862 fHJetUeConeGen->SetTitle(Form("%s Gen MC", fHJetUeCone->GetTitle()));
863 fOutputList->Add(fHJetUeConeGen);
866 //track efficiency/contamination histograms eta versus pT
867 fhPtTrkTruePrimRec = new TH2D("fhPtTrkTruePrimRec","PtTrkTruePrimRec",100,0,20,18,-0.9,0.9);
868 fOutputList->Add(fhPtTrkTruePrimRec);
870 fhPtTrkTruePrimGen = (TH2D*) fhPtTrkTruePrimRec->Clone("fhPtTrkTruePrimGen");
871 fhPtTrkTruePrimGen->SetTitle("PtTrkTruePrimGen");
872 fOutputList->Add(fhPtTrkTruePrimGen);
874 fhPtTrkSecOrFakeRec = (TH2D*) fhPtTrkTruePrimRec->Clone("fhPtTrkSecOrFakeRec");
875 fhPtTrkSecOrFakeRec->SetTitle("PtTrkSecOrFakeRec");
876 fOutputList->Add(fhPtTrkSecOrFakeRec);
879 fHRhoUeMedianVsConeGen = (THnSparseF*) fHRhoUeMedianVsCone->Clone("hRhoUeMedianVsConeGen");
880 fHRhoUeMedianVsConeGen->SetTitle(Form("%s Gen MC", fHRhoUeMedianVsCone->GetTitle()));
881 fOutputList->Add(fHRhoUeMedianVsConeGen);
883 fhEntriesToMedianGen = (TH1D*) fhEntriesToMedian->Clone("fhEntriesToMedianGen");
884 fhEntriesToMedianGen->SetTitle(Form("%s Gen MC", fhEntriesToMedian->GetTitle()));
885 fOutputList->Add(fhEntriesToMedianGen);
887 fhCellAreaToMedianGen = (TH1D*) fhCellAreaToMedian->Clone("fhCellAreaToMedianGen");
888 fhCellAreaToMedianGen->SetTitle(Form("%s Gen MC", fhCellAreaToMedian->GetTitle()));
889 fOutputList->Add(fhCellAreaToMedianGen);
891 fhNofMultipleTriggersGen = (TH1D*) fhNofMultipleTriggers->Clone("fhNofMultipleTriggersGen");
892 fOutputList->Add(fhNofMultipleTriggersGen);
894 fhNofMultipleTriggersConeGen = (TH1D*) fhNofMultipleTriggersCone->Clone("fhNofMultipleTriggersConeGen");
895 fOutputList->Add(fhNofMultipleTriggersConeGen);
897 fhDeltaRMultTriggersGen = (TH1D*) fhDeltaRMultTriggers->Clone("fhDeltaRMultTriggersGen");
898 fOutputList->Add(fhDeltaRMultTriggersGen);
900 fhNofMultipleTriggersConeGenA = (TH1D*) fhNofMultipleTriggersConeGen->Clone("fhNofMultipleTriggersConeGen10");
901 fOutputList->Add(fhNofMultipleTriggersConeGenA);
903 fhNofMultipleTriggersConeGenB = (TH1D*) fhNofMultipleTriggersConeGen->Clone("fhNofMultipleTriggersConeGen5");
904 fOutputList->Add(fhNofMultipleTriggersConeGenB);
907 //-------------------------------------
909 const Int_t nBinPt = 150;
910 Double_t binLimitsPt[nBinPt+1];
911 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
913 binLimitsPt[iPt] = -50.0;
915 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.;
919 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
920 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
921 fOutputList->Add(fh1Xsec);
922 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
923 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
924 fOutputList->Add(fh1Trials);
925 fh1AvgTrials = new TH1F("fh1AvgTrials","trials root file",1,0,1);
926 fh1AvgTrials->GetXaxis()->SetBinLabel(1,"#sum{avg ntrials}");
927 fOutputList->Add(fh1AvgTrials);
928 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
929 fOutputList->Add(fh1PtHard);
930 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
931 fOutputList->Add(fh1PtHardNoW);
932 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
933 fOutputList->Add(fh1PtHardTrials);
936 // =========== Switch on Sumw2 for all histos ===========
937 for(Int_t i=0; i<fOutputList->GetEntries(); i++){
938 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
943 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
948 TH1::AddDirectory(oldStatus);
950 PostData(1, fOutputList);
953 //--------------------------------------------------------------------
955 void AliAnalysisTaskJetCorePP::UserExec(Option_t *)
961 Double_t eventW = 1.0;
962 Double_t ptHard = 0.0;
963 Double_t nTrials = 1.0; // Trials for MC trigger
964 if(fIsChargedMC || fIsKine) fh1AvgTrials->Fill("#sum{avg ntrials}",fAvgTrials);
966 if(TMath::Abs((Float_t) fJetParamR)<0.00001){
967 AliError("ANTIKT Cone radius is set to zero.");
971 if(TMath::Abs((Float_t) fBgJetParamR)<0.00001){
972 AliError("ANTIKT Cone radius is set to zero.");
976 if(!fIsKine){ //real data or full MC
977 if(!strlen(fJetBranchName.Data())){
978 AliError("Name of jet branch not set.");
981 if(!strlen(fJetBranchNameBg.Data())){
982 AliError("Name of jet bg branch not set.");
986 if(!strlen(fJetBranchNameBgKine.Data())){
987 AliError("Name of jet bg branch for kine not set.");
993 fMcEvent = fMcHandler->MCEvent();
995 if(fDebug > 1) printf("AliAnalysisTaskJetCorePP::Exec() fMcHandler=NULL\n");
996 PostData(1, fOutputList);
1000 if(fDebug > 1) printf("AliAnalysisTaskJetCorePP::Exec() fMcEvent=NULL \n");
1001 PostData(1, fOutputList);
1005 Float_t xsection = 0;
1008 AliGenPythiaEventHeader *genPH =
1009 dynamic_cast<AliGenPythiaEventHeader*> (fMcEvent->GenEventHeader());
1011 xsection = genPH->GetXsection();
1012 trials = genPH->Trials();
1013 ptHard = genPH->GetPtHard();
1015 fh1Xsec->Fill("<#sigma>",xsection);
1016 fh1Trials->Fill("#sum{ntrials}",trials);
1017 fh1PtHard->Fill(ptHard,eventW);
1018 fh1PtHardNoW->Fill(ptHard,1);
1019 fh1PtHardTrials->Fill(ptHard,trials);
1023 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
1025 if(fDebug>1) AliError("ESD not available");
1026 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
1029 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
1030 AliAODEvent* aod = NULL;
1031 // take all other information from the aod we take the tracks from
1032 if(!aod && !fIsKine){
1033 if(!fESD) aod = fAODIn; //not ESD and not kine => input AOD
1034 else aod = fAODOut;// ESD or kine
1038 if(fNonStdFile.Length()!=0){
1039 // case that we have an AOD extension we can fetch the jets from the extended output
1040 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1041 fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
1043 if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
1047 // ----------------- EVENT SELECTION --------------------------
1048 fHistEvtSelection->Fill(1); // number of events before event selection
1051 // physics selection
1052 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
1053 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1055 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
1056 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
1057 fHistEvtSelection->Fill(2);
1058 PostData(1, fOutputList);
1064 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
1065 fHistEvtSelection->Fill(3);
1066 PostData(1, fOutputList);
1070 // vertex selection for reconstructed data
1071 AliAODVertex* primVtx = aod->GetPrimaryVertex();
1074 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
1075 fHistEvtSelection->Fill(3);
1076 PostData(1, fOutputList);
1080 Int_t nTracksPrim = primVtx->GetNContributors();
1081 Float_t vtxz = primVtx->GetZ();
1083 fhContribVtx->Fill(nTracksPrim);
1084 if( nTracksPrim > 0 ) fhVertexZ->Fill(vtxz);
1086 if((nTracksPrim < fMinContribVtx) ||
1087 (vtxz < fVtxZMin) ||
1089 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",
1090 (char*)__FILE__,__LINE__,vtxz);
1091 fHistEvtSelection->Fill(3);
1092 PostData(1, fOutputList);
1096 fhContribVtxAccept->Fill(nTracksPrim);
1097 fhVertexZAccept->Fill(vtxz);
1099 }else{ //KINE cut on vertex
1100 const AliVVertex *vtxMC = fMcEvent->GetPrimaryVertex();
1101 Float_t zVtx = vtxMC->GetZ();
1102 fhVertexZ->Fill(zVtx);
1103 if(zVtx < fVtxZMin || zVtx > fVtxZMax){ //vertex cut
1104 fHistEvtSelection->Fill(3);
1105 PostData(1, fOutputList);
1108 fhVertexZAccept->Fill(zVtx);
1111 //FK// No event class selection imposed
1112 // event class selection (from jet helper task)
1113 //Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
1114 //if(fDebug) Printf("Event class %d", eventClass);
1115 //if(eventClass < fEvtClassMin || eventClass > fEvtClassMax){
1116 // fHistEvtSelection->Fill(4);
1117 // PostData(1, fOutputList);
1121 //------------------ CENTRALITY SELECTION ---------------
1122 AliCentrality *cent = 0x0;
1123 Double_t centValue = 0.0;
1124 if(fSystem){ //fSystem=0 for pp, fSystem=1 for pPb
1126 cent = fESD->GetCentrality();
1127 if(cent) centValue = cent->GetCentralityPercentile("V0M");
1129 //centValue = aod->GetHeader()->GetCentrality();
1130 centValue = ((AliVAODHeader*)aod->GetHeader())->GetCentrality();
1132 if(fDebug) printf("centrality: %f\n", centValue);
1134 fhCentrality->Fill(centValue);
1136 if(centValue < fCentMin || centValue > fCentMax){
1137 fHistEvtSelection->Fill(4);
1138 PostData(1, fOutputList);
1142 fhCentralityAccept->Fill( centValue );
1146 //-----------------select disjunct event subsamples ----------------
1147 if(!fIsKine){ //reconstructed data
1148 //Int_t eventnum = aod->GetHeader()->GetEventNumberESDFile();
1149 AliAODHeader * header = dynamic_cast<AliAODHeader*>(aod->GetHeader());
1150 if(!header) AliFatal("Not a standard AOD");
1152 Int_t eventnum = header->GetEventNumberESDFile();
1153 Int_t lastdigit = eventnum % 10;
1154 if(!(fEventNumberRangeLow<=lastdigit && lastdigit<=fEventNumberRangeHigh)){
1155 fHistEvtSelection->Fill(5);
1156 PostData(1, fOutputList);
1161 if(fDebug) std::cout<<" ACCEPTED EVENT "<<endl;
1162 fHistEvtSelection->Fill(0); // accepted events
1163 // ==================== end event selection ============================
1165 Double_t tmpArrayFive[5];
1166 Double_t tmpArrayFour[4];
1169 TList particleList; //list of tracks
1170 Int_t indexTrigg = -1;
1171 Double_t rhoFromCellMedian=0.0, rhoCone=0.0;
1174 //=============== Reconstructed antikt jets ===============
1175 ReadTClonesArray(fJetBranchName.Data() , fListJets);
1176 ReadTClonesArray(fJetBranchNameBg.Data(), fListJetsBg);
1178 //============ Estimate background in reconstructed events ===========
1180 //Find Hadron trigger and Estimate rho from cone
1181 indexTrigg = GetListOfTracks(&particleList); //index of trigger hadron in Particle list
1182 EstimateBgCone(fListJets, &particleList, rhoCone);
1184 //Estimate rho from cell median minus jets
1185 EstimateBgRhoMedian(fListJetsBg, &particleList, rhoFromCellMedian,0); //real data
1187 //============== analyze generator level MC ================
1188 TList particleListGen; //list of tracks in MC
1190 if(fIsChargedMC || fIsKine){
1192 if(fIsKine){ //pure kine
1194 //================= generated charged antikt jets ================
1195 ReadTClonesArray(fJetBranchNameKine.Data(), fListJetsGen);
1196 ReadTClonesArray(fJetBranchNameBgKine.Data(), fListJetsBgGen);
1198 //================= generated charged antikt jets ================
1199 ReadTClonesArray(fJetBranchNameChargMC.Data(), fListJetsGen);
1200 ReadTClonesArray(fJetBranchNameBgChargMC.Data(), fListJetsBgGen);
1202 if(fIsFullMC){ //generated full jets
1203 ReadTClonesArray(fJetBranchNameFullMC.Data(), fListJetsGenFull);
1206 //========================================================
1207 //serarch for charged trigger at the MC generator level
1209 Int_t indexTriggGen = -1;
1210 Double_t ptTriggGen = -1;
1211 Int_t iCounterGen = 0; //number of entries in particleListGen array
1212 Int_t triggersMC[200];//list of trigger candidates
1213 Int_t ntriggersMC = 0; //index in triggers array
1214 Int_t triggersMCa[200]; //list of trigger candidates 10%eloss
1215 Int_t ntriggersMCa = 0; //index in triggers array 10%eloss
1216 Int_t triggersMCb[200]; //list of trigger candidates 5%eloss
1217 Int_t ntriggersMCb = 0; //index in triggers array 5%eloss
1221 if(fESD){//ESD input
1223 AliMCEvent* mcEvent = MCEvent();
1225 PostData(1, fOutputList);
1229 AliGenPythiaEventHeader *pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
1230 if(pythiaGenHeader){
1231 nTrials = pythiaGenHeader->Trials();
1232 ptHard = pythiaGenHeader->GetPtHard();
1233 fh1PtHard->Fill(ptHard,eventW);
1234 fh1PtHardNoW->Fill(ptHard,1);
1235 fh1PtHardTrials->Fill(ptHard,nTrials);
1238 for(Int_t it = 0; it < mcEvent->GetNumberOfTracks(); it++){
1239 if(!mcEvent->IsPhysicalPrimary(it)) continue;
1240 AliMCParticle* part = (AliMCParticle*) mcEvent->GetTrack(it);
1242 if(SelectMCGenTracks((AliVParticle*) part, &particleListGen, ptTriggGen, indexTriggGen, iCounterGen)){
1244 if(fHardest==0 && ntriggersMC<200){//single inclusive trigger
1245 if(indexTriggGen > -1){//trigger candidate was found
1246 triggersMC[ntriggersMC] = indexTriggGen;
1251 iCounterGen++;//index in particleListGen array
1256 PostData(1, fOutputList);
1259 TClonesArray *tca = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(AliAODMCParticle::StdBranchName()));
1261 PostData(1, fOutputList);
1264 for(Int_t it = 0; it < tca->GetEntriesFast(); it++){
1265 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1267 if(!part->IsPhysicalPrimary()) continue;
1268 if(SelectMCGenTracks((AliVParticle*) part, &particleListGen, ptTriggGen, indexTriggGen, iCounterGen)){
1270 if(fHardest==0 && ntriggersMC<200){//single inclusive trigger
1271 if(indexTriggGen > -1){ //trigger candidater was found
1272 triggersMC[ntriggersMC] = indexTriggGen;
1277 iCounterGen++;//number of entries in particleListGen array
1281 }else{ //analyze kine
1283 for(Int_t it = 0; it < fMcEvent->GetNumberOfTracks(); it++){
1284 if(!fMcEvent->IsPhysicalPrimary(it)) continue;
1285 AliMCParticle* part = (AliMCParticle*) fMcEvent->GetTrack(it);
1287 if(SelectMCGenTracks((AliVParticle*) part, &particleListGen, ptTriggGen, indexTriggGen, iCounterGen)){
1289 if(fHardest==0 && ntriggersMC<200){//single inclusive trigger
1290 if(indexTriggGen > -1){//trigger candidate was found
1291 triggersMC[ntriggersMC] = indexTriggGen;
1296 iCounterGen++;//index in particleListGen array
1302 Int_t npar = particleListGen.GetEntries();
1303 for(Int_t ip=0; ip < npar; ip++){
1304 AliVParticle *part = (AliVParticle*) particleListGen.At(ip);
1307 Double_t pta = 0.9 * part->Pt(); //10% energy loss
1308 Double_t ptb = 0.95 * part->Pt(); //5% energy loss
1309 if(fTriggerPtRangeLow <= pta && pta < fTriggerPtRangeHigh && ntriggersMCa<200){
1310 triggersMCa[ntriggersMCa] = ip;
1314 if(fTriggerPtRangeLow <= ptb && ptb < fTriggerPtRangeHigh && ntriggersMCb<200){
1315 triggersMCb[ntriggersMCb] = ip;
1321 Int_t rnda = fRandom->Integer(ntriggersMCa); //0 to ntriggers-1
1322 Int_t indexTriggGena = triggersMCa[rnda];
1324 Double_t deltaPhia, deltaEtaa, deltaRa;
1327 //Correlation with single inclusive TRIGGER
1328 AliVParticle* tGenTa = (AliVParticle*) particleListGen.At(indexTriggGena);
1330 for(Int_t ia=0; ia<ntriggersMCa; ia++){
1331 if(indexTriggGena == triggersMCa[ia]) continue;
1333 AliVParticle* tGenTz = (AliVParticle*) particleListGen.At(triggersMCa[ia]);
1334 if(!tGenTz) continue;
1336 deltaPhia = RelativePhi(tGenTa->Phi(),tGenTz->Phi());
1337 deltaEtaa = tGenTa->Eta()-tGenTz->Eta();
1338 deltaRa = sqrt(deltaPhia*deltaPhia + deltaEtaa*deltaEtaa);
1340 if(deltaRa<0.4) aa++;
1343 fhNofMultipleTriggersConeGenA->Fill(aa);
1347 Int_t rndb = fRandom->Integer(ntriggersMCb); //0 to ntriggers-1
1348 Int_t indexTriggGenb = triggersMCb[rndb];
1350 Double_t deltaPhib, deltaEtab, deltaRb;
1353 //Correlation with single inclusive TRIGGER
1354 AliVParticle* tGenTb = (AliVParticle*) particleListGen.At(indexTriggGenb);
1356 for(Int_t ib=0; ib<ntriggersMCb; ib++){
1357 if(indexTriggGenb == triggersMCb[ib]) continue;
1359 AliVParticle* tGenTz = (AliVParticle*) particleListGen.At(triggersMCb[ib]);
1360 if(!tGenTz) continue;
1362 deltaPhib = RelativePhi(tGenTb->Phi(),tGenTz->Phi());
1363 deltaEtab = tGenTb->Eta()-tGenTz->Eta();
1364 deltaRb = sqrt(deltaPhib*deltaPhib + deltaEtab*deltaEtab);
1366 if(deltaRb<0.4) bb++;
1369 fhNofMultipleTriggersConeGenB->Fill(bb);
1375 //============== Estimate bg in generated events ==============
1376 Double_t rhoFromCellMedianGen=0.0, rhoConeGen=0.0;
1378 //Estimate rho from cone
1379 EstimateBgCone(fListJetsGen, &particleListGen, rhoConeGen);
1381 //Estimate rho from cell median minus jets
1382 EstimateBgRhoMedian(fListJetsBgGen, &particleListGen, rhoFromCellMedianGen,1);//mc data
1384 //============ Generator trigger+jet ==================
1385 if(fHardest==0){ //single inclusive trigger
1386 if(ntriggersMC>0){ //there is at least one trigger
1387 Int_t rnd = fRandom->Integer(ntriggersMC); //0 to ntriggers-1
1388 indexTriggGen = triggersMC[rnd];
1390 fhNofMultipleTriggersGen->Fill(ntriggersMC-1);
1392 Double_t deltaPhi, deltaEta, deltaR;
1395 //Correlation with single inclusive TRIGGER
1396 AliVParticle* tGenT1 = (AliVParticle*) particleListGen.At(indexTriggGen);
1398 for(Int_t ia=0; ia<ntriggersMC; ia++){
1399 if(indexTriggGen == triggersMC[ia]) continue;
1401 AliVParticle* tGenT2 = (AliVParticle*) particleListGen.At(triggersMC[ia]);
1402 if(!tGenT2) continue;
1404 deltaPhi = RelativePhi(tGenT1->Phi(),tGenT2->Phi());
1405 deltaEta = tGenT1->Eta()-tGenT2->Eta();
1406 deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
1411 fhNofMultipleTriggersConeGen->Fill(k);
1414 //Correlation of each trigger with any other trigger
1415 for(Int_t ia=0; ia<ntriggersMC-1; ia++){
1416 AliVParticle* tGenI = (AliVParticle*) particleListGen.At(triggersMC[ia]);
1417 if(!tGenI) continue;
1418 for(Int_t ib=ia+1; ib<ntriggersMC; ib++){
1419 AliVParticle* tGenII = (AliVParticle*) particleListGen.At(triggersMC[ib]);
1420 if(!tGenII) continue;
1422 deltaPhi = RelativePhi(tGenI->Phi(),tGenII->Phi());
1423 deltaEta = tGenI->Eta()-tGenII->Eta();
1424 deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
1425 fhDeltaRMultTriggersGen->Fill(deltaR);
1431 indexTriggGen = -1; //trigger not found
1436 Int_t ilowGen = (fHardest==0 || fHardest==1) ? indexTriggGen : 0;
1437 Int_t ihighGen = (fHardest==0 || fHardest==1) ? indexTriggGen+1 : particleListGen.GetEntries();
1438 Bool_t fillOnceGen = kTRUE;
1441 for(Int_t igen= ilowGen; igen< ihighGen; igen++){ //loop over possible trigger
1442 indexTriggGen = igen; //trigger hadron
1444 if(indexTriggGen == -1) continue;
1445 AliVParticle* triggerGen=(AliVParticle*) particleListGen.At(indexTriggGen);
1446 if(!triggerGen) continue;
1449 if(triggerGen->Pt() < 6.0) continue; //all hadrons pt>6
1451 if(TMath::Abs((Float_t) triggerGen->Eta()) > fTriggerEtaCut) continue;
1453 ptTriggGen = triggerGen->Pt(); //count triggers
1454 fh2NtriggersGen->Fill(centValue, ptTriggGen);
1456 //Count jets and trigger-jet pairs at MC generator level
1457 for(Int_t ij=0; ij<fListJetsGen->GetEntries(); ij++){
1458 AliAODJet* jet = (AliAODJet*)(fListJetsGen->At(ij));
1460 Double_t etaJetGen = jet->Eta();
1461 Double_t areaJetGen = jet->EffectiveAreaCharged();
1463 if((fJetEtaMin<=etaJetGen) && (etaJetGen<=fJetEtaMax)){
1465 Double_t ptUeFromCellMedianGen = rhoFromCellMedianGen*areaJetGen;
1466 Double_t ptUeConeGen = rhoConeGen*areaJetGen;
1468 //Rongrong's analysis
1469 Double_t dPhiGen = jet->Phi() - triggerGen->Phi();
1470 if(dPhiGen>2*TMath::Pi()) dPhiGen -= 2*TMath::Pi();
1471 if(dPhiGen<-2*TMath::Pi()) dPhiGen += 2*TMath::Pi();
1472 if(dPhiGen<-0.5*TMath::Pi()) dPhiGen += 2*TMath::Pi();
1473 if(dPhiGen>1.5*TMath::Pi()) dPhiGen -= 2*TMath::Pi();
1475 //[A,pTjet,pTtrig,dphi]
1476 tmpArrayFour[0] = areaJetGen;
1477 tmpArrayFour[1] = jet->Pt();
1478 tmpArrayFour[2] = ptTriggGen;
1479 tmpArrayFour[3] = dPhiGen;
1481 fHJetPhiCorrGen->Fill(tmpArrayFour); // Dphi distribution jet-triger
1483 //[A,pTjet-pTUe,pTtrig,dphi]
1484 tmpArrayFour[1] = jet->Pt() - ptUeFromCellMedianGen;
1485 fHJetPhiCorrSubUeMedianGen->Fill(tmpArrayFour);
1487 //[A,pTjet-pTUe,pTtrig,dphi]
1488 tmpArrayFour[1] = jet->Pt() - ptUeConeGen;
1489 fHJetPhiCorrSubUeConeGen->Fill(tmpArrayFour);
1491 //Leticia's analysis
1492 Double_t dphi = RelativePhi(triggerGen->Phi(), jet->Phi());
1493 if(TMath::Abs((Double_t) dphi) < fkDeltaPhiCut) continue;
1495 //Centrality, A, pT, pTtrigg
1496 tmpArrayFive[0] = centValue;
1497 tmpArrayFive[1] = areaJetGen;
1498 tmpArrayFive[2] = jet->Pt();
1499 tmpArrayFive[3] = ptTriggGen;
1500 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1501 fHJetSpecGen->Fill(tmpArrayFive);
1503 //Centrality, A, pTjet-pTbgCellMedian, pTtrigg, dphi
1504 tmpArrayFive[0] = centValue;
1505 tmpArrayFive[1] = areaJetGen;
1506 tmpArrayFive[2] = jet->Pt() - ptUeFromCellMedianGen;
1507 tmpArrayFive[3] = ptTriggGen;
1508 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1509 fHJetSpecSubUeMedianGen->Fill(tmpArrayFive);
1511 //Centrality, A, pTjet-pTbgCone, pTtrigg, dphi
1512 tmpArrayFive[0] = centValue;
1513 tmpArrayFive[1] = areaJetGen;
1514 tmpArrayFive[2] = jet->Pt() - ptUeConeGen;
1515 tmpArrayFive[3] = ptTriggGen;
1516 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1517 fHJetSpecSubUeConeGen->Fill(tmpArrayFive);
1519 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", kT median
1520 tmpArrayFive[0] = areaJetGen;
1521 tmpArrayFive[1] = jet->Pt();
1522 tmpArrayFive[2] = jet->Pt() - ptUeFromCellMedianGen;
1523 tmpArrayFive[3] = ptUeFromCellMedianGen;
1524 tmpArrayFive[4] = rhoFromCellMedianGen;
1525 fHJetUeMedianGen->Fill(tmpArrayFive);
1527 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", perpendicular Cone
1528 tmpArrayFive[0] = areaJetGen;
1529 tmpArrayFive[1] = jet->Pt();
1530 tmpArrayFive[2] = jet->Pt() - ptUeConeGen;
1531 tmpArrayFive[3] = ptUeConeGen;
1532 tmpArrayFive[4] = rhoConeGen;
1533 fHJetUeConeGen->Fill(tmpArrayFive);
1536 Double_t fillRhoGen[] = { rhoConeGen, rhoFromCellMedianGen};
1537 fHRhoUeMedianVsConeGen->Fill(fillRhoGen);
1538 fillOnceGen = kFALSE;
1540 }//back to back jet-trigger pair
1544 if(fFillRespMx && !fIsKine){
1545 //================ RESPONSE MATRIX ===============
1546 //Count jets and trigger-jet pairs at MC generator level
1547 for(Int_t ij=0; ij<fListJetsGen->GetEntries(); ij++){
1548 AliAODJet* jet = (AliAODJet*)(fListJetsGen->At(ij));
1550 Double_t etaJetGen = jet->Eta();
1551 Double_t ptJetGen = jet->Pt();
1553 if((fJetEtaMin<=etaJetGen) && (etaJetGen<=fJetEtaMax)){
1554 fhJetPtGen->Fill(ptJetGen); // gen level pt spectum of jets response mx normalization
1556 Double_t areaJetGen = jet->EffectiveAreaCharged();
1557 Double_t ptUeFromCellMedianGen = rhoFromCellMedianGen*areaJetGen;
1558 Double_t ptUeConeGen = rhoConeGen*areaJetGen;
1560 fhJetPtSubUeMedianGen->Fill(ptJetGen - ptUeFromCellMedianGen);
1561 fhJetPtSubUeConeGen->Fill(ptJetGen - ptUeConeGen);
1564 if(fListJets->GetEntries()>0 && fListJetsGen->GetEntries()>0){ //at least some reconstructed jets
1566 Int_t ng = (Int_t) fListJetsGen->GetEntries();
1567 Int_t nr = (Int_t) fListJets->GetEntries();
1569 //Find closest MC generator - reconstructed jets
1570 if(faGenIndex.GetSize()<nr) faGenIndex.Set(nr); //idx of gen jet assoc to rec jet
1571 if(faRecIndex.GetSize()<ng) faRecIndex.Set(ng); //idx of rec jet assoc to gen jet
1574 Printf("New Rec List %d gen index Array %d",nr,faGenIndex.GetSize());
1575 Printf("New Gen List %d rec index Array %d",ng,faRecIndex.GetSize());
1577 //matching of MC genrator level and reconstructed jets
1578 AliAnalysisHelperJetTasks::GetClosestJets(fListJetsGen,ng,fListJets,nr,faGenIndex,faRecIndex,fDebug);
1580 // Fill response matrix
1581 for(Int_t ir = 0; ir < nr; ir++){
1582 AliAODJet *recJet = (AliAODJet*) fListJets->At(ir);
1583 Double_t etaJetRec = recJet->Eta();
1584 Double_t ptJetRec = recJet->Pt();
1585 Double_t areaJetRec = recJet->EffectiveAreaCharged();
1586 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1588 if((fJetEtaMin <= etaJetRec) && (etaJetRec <= fJetEtaMax)){
1589 Int_t ig = faGenIndex[ir]; //associated generator level jet
1590 if(ig >= 0 && ig < ng){
1591 if(fDebug > 10) Printf("%s:%d ig = %d ir = %d",(char*)__FILE__,__LINE__,ig,ir);
1592 AliAODJet *genJet = (AliAODJet*) fListJetsGen->At(ig);
1593 Double_t ptJetGen = genJet->Pt();
1594 Double_t etaJetGen = genJet->Eta();
1596 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1597 if((fJetEtaMin <= etaJetGen) && (etaJetGen <= fJetEtaMax)){
1598 fhJetPtGenVsJetPtRec->Fill(ptJetRec, ptJetGen);
1600 Double_t areaJetGen = genJet->EffectiveAreaCharged();
1601 Double_t ptUeFromCellMedianGen = rhoFromCellMedianGen*areaJetGen;
1602 Double_t ptUeConeGen = rhoConeGen*areaJetGen;
1603 Double_t ptUeFromCellMedianRec = rhoFromCellMedian*areaJetRec;
1604 Double_t ptUeConeRec = rhoCone*areaJetRec;
1605 fhJetPtGenVsJetPtRecSubUeMedian->Fill(ptJetRec-ptUeFromCellMedianRec,
1606 ptJetGen-ptUeFromCellMedianGen);
1607 fhJetPtGenVsJetPtRecSubUeCone->Fill(ptJetRec-ptUeConeRec, ptJetGen-ptUeConeGen);
1610 }//rec jet in eta acceptance
1611 }//loop over reconstructed jets
1612 }// # of rec jets >0
1614 //=========================== Full jet vs charged jet matrix ==========================
1616 //Count full jets and charged-jet pairs at MC generator level
1617 for(Int_t ij=0; ij<fListJetsGenFull->GetEntries(); ij++){
1618 AliAODJet* jetFull = (AliAODJet*)(fListJetsGenFull->At(ij));
1619 if(!jetFull) continue;
1620 Double_t etaJetFull = jetFull->Eta();
1621 Double_t ptJetFull = jetFull->Pt();
1623 if((fJetEtaMin<=etaJetFull) && (etaJetFull<=fJetEtaMax)){
1624 fhJetPtGenFull->Fill(ptJetFull); // generator level pt spectum of full jets
1627 if(fListJetsGen->GetEntries()>0 && fListJetsGenFull->GetEntries()>0){ //at least some reconstructed jets
1628 Int_t nful = (Int_t) fListJetsGenFull->GetEntries();
1629 Int_t nchr = (Int_t) fListJetsGen->GetEntries();
1631 //Find closest MC generator full - charged jet
1632 if(faGenIndex.GetSize()<nchr) faGenIndex.Set(nchr); //idx of gen FULL jet assoc to gen CHARGED jet
1633 if(faRecIndex.GetSize()<nful) faRecIndex.Set(nful); //idx of gen CHARGED jet assoc to gen FULL jet
1636 Printf("New Charg List %d Full index Array %d",nchr,faGenIndex.GetSize());
1637 Printf("New Full List %d Charg index Array %d",nful,faRecIndex.GetSize());
1639 //matching of MC genrator level and reconstructed jets
1640 AliAnalysisHelperJetTasks::GetClosestJets(fListJetsGenFull,nful,fListJetsGen,nchr,faGenIndex,faRecIndex,fDebug);
1642 // Fill response matrix
1643 for(Int_t ichr = 0; ichr < nchr; ichr++){ //charged jet loop
1644 AliAODJet *chJet = (AliAODJet*) fListJetsGen->At(ichr);
1645 Double_t etaJetCh = chJet->Eta();
1646 Double_t ptJetCh = chJet->Pt();
1647 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1649 if((fJetEtaMin <= etaJetCh) && (etaJetCh <= fJetEtaMax)){
1650 Int_t iful = faGenIndex[ichr]; //associated generator level jet
1651 if(iful >= 0 && iful < nful){
1652 if(fDebug > 10) Printf("%s:%d iful = %d ichr = %d",(char*)__FILE__,__LINE__,iful,ichr);
1653 AliAODJet *genJetFull = (AliAODJet*) fListJetsGenFull->At(iful);
1654 Double_t ptJetFull = genJetFull->Pt();
1655 Double_t etaJetFull = genJetFull->Eta();
1657 //fill response matrix if generator and reconstructed jets are within |eta|<0.9-fiduc
1658 if((fJetEtaMin <= etaJetFull) && (etaJetFull <= fJetEtaMax)){
1659 fhJetPtGenChargVsJetPtGenFull->Fill(ptJetFull,ptJetCh);
1662 }//rec jet in eta acceptance
1663 }//loop over reconstructed jets
1664 }// # of rec jets >0
1665 }//pointer MC generator jets
1666 } //fill resp mx only for bin
1667 }//analyze generator level MC
1670 if(fIsKine){ //skip reconstructed data analysis in case of kine
1671 PostData(1, fOutputList);
1674 //============= RECONSTRUCTED INCLUSIVE JETS ===============
1676 Double_t etaJet = 0.0;
1677 Double_t pTJet = 0.0;
1678 Double_t areaJet = 0.0;
1679 Double_t phiJet = 0.0;
1680 //Int_t indexLeadingJet = -1;
1681 //Double_t pTLeadingJet = -10.0;
1682 //Double_t areaLeadingJet = -10.0;
1684 for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
1685 AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
1687 etaJet = jet->Eta();
1688 phiJet = jet->Phi();
1690 if(pTJet==0) continue;
1692 if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
1693 /*areaJet = jet->EffectiveAreaCharged();*/
1695 //Jet Diagnostics---------------------------------
1696 fhJetPhi->Fill(pTJet, RelativePhi(phiJet,0.0)); //phi -pi,pi
1697 fhJetEta->Fill(pTJet, etaJet);
1698 //search for leading jet
1699 /*if(pTJet > pTLeadingJet){
1700 indexLeadingJet = ij;
1701 pTLeadingJet = pTJet;
1702 areaLeadingJet = areaJet;
1705 // raw spectra of INCLUSIVE jets
1706 //Centrality, pTjet, A
1707 Double_t fillraw[] = { centValue,
1711 fHJetPtRaw->Fill(fillraw);*/
1714 if(indexLeadingJet > -1){
1715 // raw spectra of LEADING jets
1716 //Centrality, pTjet, A
1717 Double_t fillleading[] = { centValue,
1721 fHLeadingJetPtRaw->Fill(fillleading);
1725 // =============== RECONSTRUCTED TRIGGER-JET PAIRS ================
1726 if(fIsChargedMC && fFillRespMx){
1727 FillEffHistos(&particleList, &particleListGen); //Fill efficiency histos
1729 Bool_t filledOnce = kTRUE; //fill rho histogram only once per event
1730 //set ranges of the trigger loop
1731 Int_t ilow = (fHardest==0 || fHardest==1) ? indexTrigg : 0;
1732 Int_t ihigh = (fHardest==0 || fHardest==1) ? indexTrigg+1 : particleList.GetEntries();
1734 for(Int_t itrk= ilow; itrk< ihigh; itrk++){ //loop over possible trigger
1735 indexTrigg = itrk; //trigger hadron with pT >10 GeV
1737 if(indexTrigg < 0) continue;
1739 AliVParticle *triggerHadron = (AliVParticle*) particleList.At(indexTrigg);
1741 PostData(1, fOutputList);
1745 if(triggerHadron->Pt() < 6.0) continue; //all hadrons pt>6
1747 if(TMath::Abs((Float_t) triggerHadron->Eta())> fTriggerEtaCut) continue;
1749 //Fill trigger histograms
1750 fh2Ntriggers->Fill(centValue,triggerHadron->Pt()); //trigger pT
1751 fhTriggerPhi->Fill(triggerHadron->Pt(),RelativePhi(triggerHadron->Phi(),0.0)); //phi -pi,pi
1752 fhTriggerEta->Fill(triggerHadron->Pt(),triggerHadron->Eta());
1755 //---------- make trigger-jet pairs ---------
1759 for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
1760 AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
1762 etaJet = jet->Eta();
1763 phiJet = jet->Phi();
1765 if(pTJet==0) continue;
1767 if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
1768 areaJet = jet->EffectiveAreaCharged();
1770 //subtract bg using estinates base on median of kT jets
1771 Double_t ptUeFromCellMedian = rhoFromCellMedian*areaJet;
1772 Double_t ptUeCone = rhoCone*areaJet;
1774 //if(areaJet >= 0.07) injet++;
1775 //if(areaJet >= 0.4) injet4++;
1777 Double_t dphi = RelativePhi(triggerHadron->Phi(), phiJet);
1778 fhDphiTriggerJet->Fill(dphi); //Input
1780 //Dphi versus jet pT
1781 //Centrality, Dphi=phiTrig-phiJet, pTjet, pTtrigg
1782 /*Double_t filldp[] = { centValue,
1787 fHDphiVsJetPtAll->Fill(filldp);
1789 //Rongrong's analysis
1791 Double_t dPhi = phiJet - triggerHadron->Phi();
1792 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1793 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1794 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1795 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1797 //[A,pTjet,pTtrig,dphi]
1798 tmpArrayFour[0] = areaJet;
1799 tmpArrayFour[1] = pTJet;
1800 tmpArrayFour[2] = triggerHadron->Pt();
1801 tmpArrayFour[3] = dPhi;
1803 fHJetPhiCorr->Fill(tmpArrayFour); // Dphi distribution jet-triger
1805 //[A,pTjet-pTUe,pTtrig,dphi]
1806 tmpArrayFour[1] = pTJet - ptUeFromCellMedian;
1807 fHJetPhiCorrSubUeMedian->Fill(tmpArrayFour);
1809 //[A,pTjet-pTUe,pTtrig,dphi]
1810 tmpArrayFour[1] = pTJet - ptUeCone;
1811 fHJetPhiCorrSubUeCone->Fill(tmpArrayFour);
1813 //Leticia's analysis
1815 // Select back to back trigger - jet pairs
1816 if(TMath::Abs((Double_t) dphi) < fkDeltaPhiCut) continue;
1817 fhDphiTriggerJetAccept->Fill(dphi); //Accepted
1820 //Centrality, A, pTjet, pTtrigg, dphi
1821 tmpArrayFive[0] = centValue;
1822 tmpArrayFive[1] = areaJet;
1823 tmpArrayFive[2] = pTJet;
1824 tmpArrayFive[3] = triggerHadron->Pt();
1825 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1826 fHJetSpec->Fill(tmpArrayFive);
1828 //Centrality, A, pTjet-pTbgCellMedian, pTtrigg, dphi
1829 tmpArrayFive[0] = centValue;
1830 tmpArrayFive[1] = areaJet;
1831 tmpArrayFive[2] = pTJet-ptUeFromCellMedian;
1832 tmpArrayFive[3] = triggerHadron->Pt();
1833 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1834 fHJetSpecSubUeMedian->Fill(tmpArrayFive);
1836 //Centrality, A, pTjet-pTbgCone, pTtrigg, dphi
1837 tmpArrayFive[0] = centValue;
1838 tmpArrayFive[1] = areaJet;
1839 tmpArrayFive[2] = pTJet - ptUeCone;
1840 tmpArrayFive[3] = triggerHadron->Pt();
1841 tmpArrayFive[4] = TMath::Abs((Double_t) dphi);
1842 fHJetSpecSubUeCone->Fill(tmpArrayFive);
1844 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", kT median
1845 tmpArrayFive[0] = areaJet;
1846 tmpArrayFive[1] = pTJet;
1847 tmpArrayFive[2] = pTJet - ptUeFromCellMedian;
1848 tmpArrayFive[3] = ptUeFromCellMedian;
1849 tmpArrayFive[4] = rhoFromCellMedian;
1850 fHJetUeMedian->Fill(tmpArrayFive);
1852 //Ue diagnostics "[A,pTjet,pTjet-pTUe, pTUe, rhoUe]", Cone median
1853 tmpArrayFive[0] = areaJet;
1854 tmpArrayFive[1] = pTJet;
1855 tmpArrayFive[2] = pTJet - ptUeCone;
1856 tmpArrayFive[3] = ptUeCone;
1857 tmpArrayFive[4] = rhoCone;
1858 fHJetUeCone->Fill(tmpArrayFive);
1860 if(filledOnce){ //fill for each event only once
1861 Double_t fillRho[] = { rhoCone,rhoFromCellMedian};
1862 fHRhoUeMedianVsCone->Fill(fillRho);
1863 filledOnce = kFALSE;
1867 //Fill Jet Density In the Event A>0.07
1869 Double_t filldens[]={ (Double_t) particleList.GetEntries(),
1873 fHJetDensity->Fill(filldens);
1876 //Fill Jet Density In the Event A>0.4
1878 Double_t filldens4[]={ (Double_t) particleList.GetEntries(),
1879 injet4/fkAcceptance,
1882 fHJetDensityA4->Fill(filldens4);
1887 PostData(1, fOutputList);
1890 //----------------------------------------------------------------------------
1891 void AliAnalysisTaskJetCorePP::Terminate(const Option_t *)
1893 // Draw result to the screen
1894 // Called once at the end of the query
1896 if(fDebug) printf("AliAnalysisTaskJetCorePP DONE\n");
1897 if(!GetOutputData(1)) return;
1901 //----------------------------------------------------------------------------
1902 Int_t AliAnalysisTaskJetCorePP::GetListOfTracks(TList *list){
1903 //Fill the list of accepted tracks (passed track cut)
1904 //return consecutive index of the hardest ch hadron in the list
1906 AliAODEvent *aodevt = NULL;
1908 if(!fESD) aodevt = fAODIn;
1909 else aodevt = fAODOut;
1911 if(!aodevt) return -1;
1913 Int_t index = -1; //index of the highest particle in the list
1914 Double_t ptmax = -10;
1915 Int_t triggers[200];
1916 Int_t ntriggers = 0; //index in triggers array
1919 for(Int_t it = 0; it < aodevt->GetNumberOfTracks(); it++){
1920 //AliAODTrack *tr = aodevt->GetTrack(it);
1921 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aodevt->GetTrack(it));
1922 if(!tr) AliFatal("Not a standard AOD");
1924 if((fFilterMask > 0) && !(tr->TestFilterBit(fFilterMask))) continue;
1925 //if((fFilterMask > 0) && !(tr->IsHybridGlobalConstrainedGlobal())) continue;
1926 if(TMath::Abs((Float_t) tr->Eta()) > fTrackEtaCut) continue;
1927 if(tr->Pt() < fTrackLowPtCut) continue;
1931 if(fHardest>0){ //leading particle
1938 if(fHardest==0 && ntriggers<200){ //single inclusive
1939 if(fTriggerPtRangeLow <= tr->Pt() &&
1940 tr->Pt() < fTriggerPtRangeHigh){
1941 triggers[ntriggers] = iCount;
1949 if(fHardest==0 && ntriggers>0){ //select random inclusive trigger
1950 Int_t rnd = fRandom->Integer(ntriggers); //0 to ntriggers-1
1951 index = triggers[rnd];
1953 fhNofMultipleTriggers->Fill(ntriggers-1);
1955 Double_t deltaPhi, deltaEta, deltaR;
1957 //Correlation with single inclusive trigger
1958 AliVParticle* tGent1 = (AliVParticle*) list->At(index);
1960 for(Int_t ia=0; ia<ntriggers; ia++){
1961 if(triggers[ia]==index) continue;
1962 AliVParticle* tGent2 = (AliVParticle*) list->At(triggers[ia]);
1963 if(!tGent2) continue;
1964 deltaPhi = RelativePhi(tGent1->Phi(),tGent2->Phi());
1965 deltaEta = tGent1->Eta()-tGent2->Eta();
1966 deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
1970 fhNofMultipleTriggersCone->Fill(k);
1973 //Correlation with any other trigger
1974 for(Int_t ia=0; ia<ntriggers-1; ia++){
1975 AliVParticle* tGeni = (AliVParticle*) list->At(triggers[ia]);
1976 if(!tGeni) continue;
1977 for(Int_t ib=ia+1; ib<ntriggers; ib++){
1978 AliVParticle* tGenii = (AliVParticle*) list->At(triggers[ib]);
1979 if(!tGenii) continue;
1980 deltaPhi = RelativePhi(tGeni->Phi(),tGenii->Phi());
1981 deltaEta = tGeni->Eta()-tGenii->Eta();
1982 deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
1983 fhDeltaRMultTriggers->Fill(deltaR);
1992 //----------------------------------------------------------------------------
1994 Double_t AliAnalysisTaskJetCorePP::GetBackgroundInPerpCone(Float_t jetR, Double_t jetPhi, Double_t jetEta, TList* trkList){
1995 //calculate sum of track pT in the cone perpendicular in phi to the jet
1996 //jetR = cone radius
1997 // jetPhi, jetEta = direction of the jet
1998 Int_t numberOfTrks = trkList->GetEntries();
1999 Double_t pTsum = 0.0;
2000 Double_t perpConePhi = jetPhi + TMath::Pi()/2;//perp cone w.r.t. jet in phi
2001 for(Int_t it=0; it<numberOfTrks; it++){
2002 AliVParticle *trk = (AliVParticle*) trkList->At(it);
2003 Double_t dphi = RelativePhi(perpConePhi,trk->Phi());
2004 Double_t deta = trk->Eta()-jetEta;
2006 if( (dphi*dphi + deta*deta)< (jetR*jetR)){
2014 //----------------------------------------------------------------------------
2016 Double_t AliAnalysisTaskJetCorePP::RelativePhi(Double_t mphi,Double_t vphi){
2017 //Get relative azimuthal angle of two particles -pi to pi
2018 if (vphi < -TMath::Pi()) vphi += TMath::TwoPi();
2019 else if (vphi > TMath::Pi()) vphi -= TMath::TwoPi();
2021 if (mphi < -TMath::Pi()) mphi += TMath::TwoPi();
2022 else if (mphi > TMath::Pi()) mphi -= TMath::TwoPi();
2024 Double_t dphi = mphi - vphi;
2025 if (dphi < -TMath::Pi()) dphi += TMath::TwoPi();
2026 else if (dphi > TMath::Pi()) dphi -= TMath::TwoPi();
2028 return dphi;//dphi in [-Pi, Pi]
2032 //----------------------------------------------------------------------------
2033 Bool_t AliAnalysisTaskJetCorePP::SelectMCGenTracks(AliVParticle *trk, TList *trkList, Double_t &ptLeading, Int_t &index, Int_t counter){
2034 //fill track efficiency denominator
2035 if(trk->Pt() < fTrackLowPtCut) return kFALSE;
2036 if(trk->Charge()==0) return kFALSE;
2037 if(TMath::Abs((Float_t) trk->Eta()) > fTrackEtaCut) return kFALSE;
2039 if(fFillRespMx) fhPtTrkTruePrimGen->Fill(trk->Pt(),trk->Eta()); //Efficiency denominator
2042 if(fHardest>0){ //leading particle
2043 if(ptLeading < trk->Pt()){
2045 ptLeading = trk->Pt();
2049 if(fHardest==0){ //single inclusive
2051 if(fTriggerPtRangeLow <= trk->Pt() &&
2052 trk->Pt() < fTriggerPtRangeHigh){
2060 //----------------------------------------------------------------------------
2061 void AliAnalysisTaskJetCorePP::FillEffHistos(TList *recList, TList *genList){
2062 //fill track efficiency numerator
2063 if(!recList) return;
2064 if(!genList) return;
2065 Int_t nRec = recList->GetEntries();
2066 Int_t nGen = genList->GetEntries();
2067 for(Int_t ir=0; ir<nRec; ir++){
2068 AliAODTrack *trkRec = (AliAODTrack*) recList->At(ir);
2069 if(!trkRec) continue;
2070 Int_t recLabel = TMath::Abs(trkRec->GetLabel());
2071 Bool_t matched = kFALSE;
2073 for(Int_t ig=0; ig<nGen; ig++){
2074 AliVParticle *trkGen = (AliVParticle*) genList->At(ig);
2075 if(!trkGen) continue;
2076 Int_t genLabel = TMath::Abs(trkGen->GetLabel());
2077 if(recLabel==genLabel){
2078 fhPtTrkTruePrimRec->Fill(trkGen->Pt(),trkGen->Eta());
2083 if(!matched) fhPtTrkSecOrFakeRec->Fill(trkRec->Pt(),trkRec->Eta());
2088 //________________________________________________________________
2089 void AliAnalysisTaskJetCorePP::EstimateBgRhoMedian(TList *listJet, TList* listPart, Double_t &rhoMedian, Int_t mode){
2090 //Estimate background rho by means of integrating track pT outside identified jet cones
2094 //identify leading jet in the full track acceptance
2095 Int_t idxLeadingJet = -1;
2096 Double_t pTleading = 0.0;
2097 AliAODJet* jet = NULL;
2099 for(Int_t ij = 0; ij < listJet->GetEntries(); ij++){ //loop over bg kT jets
2100 jet = (AliAODJet*)(listJet->At(ij));
2102 if(TMath::Abs(jet->Eta()) > fTrackEtaCut) continue; //track acceptance cut
2103 if(jet->Pt() > pTleading){
2105 pTleading = jet->Pt();
2110 static Double_t jphi[100];
2111 static Double_t jeta[100];
2112 static Double_t jRsquared[100];
2114 for(Int_t ij = 0; ij< listJet->GetEntries(); ij++){ //loop over bg kT jets
2116 jet = (AliAODJet*)(listJet->At(ij));
2118 if(TMath::Abs(jet->Eta()) > fTrackEtaCut) continue;
2120 if((jet->Pt() > fBgMaxJetPt || ij== idxLeadingJet) && njets<100){
2121 jphi[njets] = RelativePhi(jet->Phi(),0.0); //-pi,pi
2122 jeta[njets] = jet->Eta();
2123 jRsquared[njets] = fSafetyMargin*jet->EffectiveAreaCharged()/TMath::Pi(); //scale jet radius
2129 static Double_t nOutCone[10][4];
2130 static Double_t sumPtOutOfCone[10][4];
2132 for(Int_t ie=0; ie<fnEta; ie++){
2133 for(Int_t ip=0; ip<fnPhi; ip++){
2134 nOutCone[ip][ie] = 0.0; //initialize counter
2135 sumPtOutOfCone[ip][ie] = 0.0;
2139 Double_t rndphi, rndeta;
2140 Double_t rndphishift, rndetashift;
2141 Double_t dphi, deta;
2144 for(Int_t it=0; it<fnTrials; it++){
2146 rndphi = fRandom->Uniform(0, fPhiSize);
2147 rndeta = fRandom->Uniform(0, fEtaSize);
2149 for(Int_t ip=0; ip<fnPhi; ip++){ //move radom position to each cell
2150 rndphishift = rndphi + ip*fPhiSize - TMath::Pi();
2151 for(Int_t ie=0; ie<fnEta; ie++){
2152 rndetashift = rndeta + ie*fEtaSize - fEtaSize;
2154 bIsInCone = 0; //tag if trial is in the jet cone
2155 for(Int_t ij=0; ij<njets; ij++){
2156 deta = jeta[ij] - rndetashift;
2157 dphi = RelativePhi(rndphishift,jphi[ij]);
2158 if((dphi*dphi + deta*deta) < jRsquared[ij]){
2163 if(!bIsInCone) nOutCone[ip][ie]++;
2169 //Sum particle pT outside jets in cells
2170 Int_t npart = listPart->GetEntries();
2171 Int_t phicell,etacell;
2172 AliVParticle *part = NULL;
2173 for(Int_t ip=0; ip < npart; ip++){
2175 part = (AliVParticle*) listPart->At(ip);
2177 if( TMath::Abs(part->Eta()) > fEtaSize) continue; //skip part outside +-0.7 in eta
2179 bIsInCone = 0; //init
2180 for(Int_t ij=0; ij<njets; ij++){
2181 dphi = RelativePhi(jphi[ij], part->Phi());
2182 deta = jeta[ij] - part->Eta();
2183 if((dphi*dphi + deta*deta) < jRsquared[ij]){
2189 phicell = TMath::Nint(TMath::Floor((RelativePhi(part->Phi(),0.0) + TMath::Pi())/fPhiSize));
2190 etacell = TMath::Nint(TMath::Floor((part->Eta()+fEtaSize)/fEtaSize));
2191 sumPtOutOfCone[phicell][etacell]+= part->Pt();
2195 static Double_t rhoInCells[20];
2196 Double_t relativeArea;
2198 Double_t bufferArea=0.0, bufferPt=0.0; //sum cells where A< fJetFreeAreaFrac
2199 for(Int_t ip=0; ip<fnPhi; ip++){
2200 for(Int_t ie=0; ie<fnEta; ie++){
2201 relativeArea = nOutCone[ip][ie]/fnTrials;
2202 //cout<<"RA= "<< relativeArea<<" BA="<<bufferArea<<" BPT="<< bufferPt <<endl;
2204 bufferArea += relativeArea;
2205 bufferPt += sumPtOutOfCone[ip][ie];
2206 if(bufferArea > fJetFreeAreaFrac){
2207 rhoInCells[nCells] = bufferPt/(bufferArea*fCellArea);
2209 if(mode==1) fhCellAreaToMedianGen->Fill(bufferArea*fCellArea);
2210 else fhCellAreaToMedian->Fill(bufferArea*fCellArea);
2221 rhoMedian = TMath::Median(nCells, rhoInCells);
2222 if(mode==1){ //mc data
2223 fhEntriesToMedianGen->Fill(nCells);
2225 fhEntriesToMedian->Fill(nCells);
2231 //__________________________________________________________________
2232 void AliAnalysisTaskJetCorePP::EstimateBgCone(TList *listJet, TList* listPart, Double_t &rhoPerpCone){
2234 rhoPerpCone = 0.0; //init
2236 if(!listJet) return;
2237 Int_t njet = listJet->GetEntries();
2238 Int_t npart = listPart->GetEntries();
2239 Double_t pTleading = 0.0;
2240 Double_t phiLeading = 1000.;
2241 Double_t etaLeading = 1000.;
2243 for(Int_t jsig=0; jsig < njet; jsig++){
2244 AliAODJet* signaljet = (AliAODJet*)(listJet->At(jsig));
2245 if(!signaljet) continue;
2246 if((signaljet->Eta()<fJetEtaMin) && (fJetEtaMax<signaljet->Eta())) continue; //acceptance cut
2247 if(signaljet->Pt() >= pTleading){ //replace leading and subleading jet
2248 pTleading = signaljet->Pt();
2249 phiLeading = signaljet->Phi();
2250 etaLeading = signaljet->Eta();
2254 Double_t phileftcone = phiLeading + TMath::Pi()/2;
2255 Double_t phirightcone = phiLeading - TMath::Pi()/2;
2258 for(Int_t ip=0; ip < npart; ip++){
2260 AliVParticle *part = (AliVParticle*) listPart->At(ip);
2265 dp = RelativePhi(phileftcone, part->Phi());
2266 de = etaLeading - part->Eta();
2267 if( sqrt(dp*dp + de*de)< fBgConeR) rhoPerpCone += part->Pt();
2269 dp = RelativePhi(phirightcone, part->Phi());
2270 if( sqrt(dp*dp + de*de)< fBgConeR) rhoPerpCone += part->Pt();
2274 //normalize total pT by two times cone are
2275 rhoPerpCone = rhoPerpCone/(2*TMath::Pi()*fBgConeR*fBgConeR);
2278 //__________________________________________________________________
2280 void AliAnalysisTaskJetCorePP::ReadTClonesArray(TString bname, TList *list){
2281 //Convert TClones array of jets to TList
2283 if(!strlen(bname.Data())){
2284 AliError(Form("Jet branch %s not set.", bname.Data()));
2288 TClonesArray *array=0x0;
2289 if(fUseExchContainer){ //take input from exchange containers
2290 if(fJetBranchNameKine.Length()>0 && bname.CompareTo(fJetBranchNameKine.Data())==0){
2291 array = dynamic_cast<TClonesArray*>(GetInputData(1)); //connect exchange container slot 1
2293 if(fJetBranchNameBgKine.Length()>0 && bname.CompareTo(fJetBranchNameBgKine.Data())==0){
2294 array = dynamic_cast<TClonesArray*>(GetInputData(2)); //connect exchange container slot 2
2296 }else{ //take input from AOD
2297 if(fAODOut&&!array){
2298 array = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(bname.Data()));
2300 if(fAODExtension&&!array){
2301 array = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(bname.Data()));
2304 array = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(bname.Data()));
2308 list->Clear(); //clear list beforehand
2312 Printf("########## %s: %d jets",bname.Data(), array->GetEntriesFast());
2315 for(Int_t iJet = 0; iJet < array->GetEntriesFast(); iJet++) {
2316 AliAODJet *jet = dynamic_cast<AliAODJet*>((*array)[iJet]);
2317 if (jet) list->Add(jet);