14 #include <TProfile2D.h>
15 #include <THnSparse.h>
19 #include <TClonesArray.h>
24 #include "AliAODEvent.h"
25 #include "AliAODInputHandler.h"
26 #include "AliAnalysisManager.h"
27 #include "AliAnalysisTask.h"
28 #include "AliCentrality.h"
30 #include "AliESDEvent.h"
31 #include "AliESDInputHandler.h"
32 #include "AliESDtrackCuts.h"
33 #include "AliVParticle.h"
34 #include "AliInputEventHandler.h"
35 #include "AliEMCALGeometry.h"
36 #include "AliEMCALRecoUtils.h"
37 #include "TGeoManager.h"
38 #include "AliMCEvent.h"
39 #include "AliMCParticle.h"
41 #include "AliGenEventHeader.h"
42 #include "AliGenPythiaEventHeader.h"
43 #include "TGeoGlobalMagField.h"
45 #include "AliAODJet.h"
56 const
Float_t kRadius[3] = {0.4,0.2,0.3};
63 fVerbosity(0), fEDSFileCounter(0), fNTracksPerChunk(0), fRejectPileup(kFALSE), fRejectExoticTrigger(kTRUE),
64 fAnaType(0), fPeriod(
"lhc11a"), fESD(0), fAOD(0), fMC(0), fStack(0), fTrackArray(0x0), fClusterArray(0x0), fMcPartArray(0x0),
65 fIsMC(kFALSE), fPhySelForMC(kFALSE), fChargedMC(kFALSE), fXsecScale(0.),
66 fCentrality(99), fZVtxMax(10),
67 fTriggerType(-1), fCheckTriggerMask(kTRUE), fIsTPCOnlyVtx(kFALSE),
68 fIsExoticEvent3GeV(kFALSE), fIsExoticEvent5GeV(kFALSE), fIsEventTriggerBit(kFALSE), fOfflineTrigger(kFALSE), fTriggerMask(0x0),
69 fGeom(0x0), fRecoUtil(0x0),
70 fEsdTrackCuts(0x0), fHybridTrackCuts1(0x0), fHybridTrackCuts2(0x0),fTrackCutsType(0), fKinCutType(0), fTrkEtaMax(0.9),
71 fdEdxMin(73), fdEdxMax(90), fEoverPMin(0.8), fEoverPMax(1.2),
72 fMatchType(0), fRejectExoticCluster(kTRUE), fRemoveBadChannel(kFALSE), fUseGoodSM(kFALSE),
73 fStudySubEInHC(kFALSE), fStudyMcOverSubE(kFALSE),
74 fElectronRejection(kFALSE), fHadronicCorrection(kFALSE), fFractionHC(0.), fHCLowerPtCutMIP(1e4), fClusterEResolution(0x0),
75 fJetNEFMin(0.01), fJetNEFMax(0.98),
76 fSpotGoodJet(kFALSE), fFindChargedOnlyJet(kFALSE), fFindNeutralOnlyJet(kFALSE),
77 fCheckTrkEffCorr(kFALSE), fTrkEffCorrCutZ(0.3), fRandomGen(0x0), fRunUE(0), fCheckTPCOnlyVtx(0), fRunSecondaries(0),
78 fSysJetTrigEff(kFALSE), fVaryJetTrigEff(0),
79 fSysTrkPtRes(kFALSE), fVaryTrkPtRes(0), fSysTrkEff(kFALSE), fVaryTrkEff(0.),
80 fSysTrkClsMth(kFALSE), fCutdEta(0.05), fCutdPhi(0.05),
81 fSysNonLinearity(kFALSE), fNonLinear(0x0), fSysClusterEScale(kFALSE), fVaryClusterEScale(0), fSysClusterERes(kFALSE), fVaryClusterERes(0),
83 fNonStdBranch(
""), fNonStdFile(
""), fAlgorithm(
"aKt"), fRadius(
"0.4"), fRecombinationScheme(5),
84 fConstrainChInEMCal(kFALSE), fRejectNK(kFALSE), fRejectWD(kFALSE), fSmearMC(kFALSE), fTrkPtResData(0x0),
85 fOutputList(0x0), fSaveQAHistos(kTRUE), fhJetEventCount(0x0), fhJetEventStat(0x0), fhEventStatTPCVtx(0x0), fhChunkQA(0x0)
91 DefineInput(0, TChain::Class());
92 DefineOutput(1, TList::Class());
94 for(
Int_t i=0; i<2; i++)
106 for(
Int_t k=0; k<2; k++)
115 for(
Int_t j=0; j<5; j++)
119 for(
Int_t k=0; k<2; k++)
146 for(
Int_t k=0; k<2; k++)
161 for(
Int_t k=0; k<2; k++)
163 for(
Int_t l=0; l<2; l++)
172 for(
Int_t i=0; i<2; i++)
187 for(
Int_t s=0; s<3; s++)
189 for(
Int_t a=0; a<2; a++)
204 for(
Int_t j=0; j<3; j++)
209 for(
Int_t i=0; i<10; i++)
220 fVerbosity(0), fEDSFileCounter(0), fNTracksPerChunk(0), fRejectPileup(kFALSE), fRejectExoticTrigger(kTRUE),
221 fAnaType(0), fPeriod(
"lhc11a"), fESD(0), fAOD(0), fMC(0), fStack(0), fTrackArray(0x0), fClusterArray(0x0), fMcPartArray(0x0),
222 fIsMC(kFALSE), fPhySelForMC(kFALSE), fChargedMC(kFALSE), fXsecScale(0.),
223 fCentrality(99), fZVtxMax(10),
224 fTriggerType(-1), fCheckTriggerMask(kTRUE), fIsTPCOnlyVtx(kFALSE),
225 fIsExoticEvent3GeV(kFALSE), fIsExoticEvent5GeV(kFALSE), fIsEventTriggerBit(kFALSE), fOfflineTrigger(kFALSE), fTriggerMask(0x0),
226 fGeom(0x0), fRecoUtil(0x0),
227 fEsdTrackCuts(0x0), fHybridTrackCuts1(0x0), fHybridTrackCuts2(0x0), fTrackCutsType(0), fKinCutType(0), fTrkEtaMax(0.9),
228 fdEdxMin(73), fdEdxMax(90), fEoverPMin(0.8), fEoverPMax(1.2),
229 fMatchType(0), fRejectExoticCluster(kTRUE), fRemoveBadChannel(kFALSE), fUseGoodSM(kFALSE),
230 fStudySubEInHC(kFALSE), fStudyMcOverSubE(kFALSE),
231 fElectronRejection(kFALSE), fHadronicCorrection(kFALSE), fFractionHC(0.), fHCLowerPtCutMIP(1e4), fClusterEResolution(0x0),
232 fJetNEFMin(0.01), fJetNEFMax(0.98),
233 fSpotGoodJet(kFALSE), fFindChargedOnlyJet(kFALSE), fFindNeutralOnlyJet(kFALSE),
234 fCheckTrkEffCorr(kFALSE), fTrkEffCorrCutZ(0.3), fRandomGen(0x0), fRunUE(0), fCheckTPCOnlyVtx(0), fRunSecondaries(0),
235 fSysJetTrigEff(kFALSE), fVaryJetTrigEff(0),
236 fSysTrkPtRes(kFALSE), fVaryTrkPtRes(0), fSysTrkEff(kFALSE), fVaryTrkEff(0.),
237 fSysTrkClsMth(kFALSE), fCutdEta(0.05), fCutdPhi(0.05),
238 fSysNonLinearity(kFALSE), fNonLinear(0x0), fSysClusterEScale(kFALSE), fVaryClusterEScale(0), fSysClusterERes(kFALSE), fVaryClusterERes(0),
240 fNonStdBranch(
""), fNonStdFile(
""), fAlgorithm(
"aKt"), fRadius(
"0.4"), fRecombinationScheme(5),
241 fConstrainChInEMCal(kFALSE), fRejectNK(kFALSE), fRejectWD(kFALSE), fSmearMC(kFALSE), fTrkPtResData(0x0),
242 fOutputList(0x0), fSaveQAHistos(kTRUE), fhJetEventCount(0x0), fhJetEventStat(0x0), fhEventStatTPCVtx(0x0), fhChunkQA(0x0)
248 DefineInput(0, TChain::Class());
249 DefineOutput(1, TList::Class());
251 for(
Int_t i=0; i<2; i++)
263 for(
Int_t k=0; k<2; k++)
272 for(
Int_t j=0; j<5; j++)
276 for(
Int_t k=0; k<2; k++)
303 for(
Int_t k=0; k<2; k++)
318 for(
Int_t k=0; k<2; k++)
320 for(
Int_t l=0; l<2; l++)
329 for(
Int_t i=0; i<2; i++)
344 for(
Int_t s=0; s<3; s++)
346 for(
Int_t a=0; a<2; a++)
361 for(
Int_t j=0; j<3; j++)
366 for(
Int_t i=0; i<10; i++)
383 for(
Int_t s=0; s<3; s++)
385 for(
Int_t a=0; a<2; a++)
400 for(
Int_t i=0; i<3; i++)
405 for(
Int_t i=0; i<10; i++)
412 for(
Int_t j=0; j<2; j++)
453 const Int_t nTrkPtBins = 100;
454 const Float_t lowTrkPtBin=0, upTrkPtBin=100.;
458 for(
Int_t i=0; i<nbins+1; i++)
465 fhJetEventStat =
new TH1F(
"fhJetEventStat",
"Event statistics for jet analysis",12,0,12);
480 fhJetEventCount =
new TH1F(
"fhJetEventCount",
"Event statistics for jet analysis",12,0,12);
495 fhEventStatTPCVtx =
new TH1F(
"fhEventStatTPCVtx",
"Event statistics for TPC only vertex",9,0,9);
508 fhChunkQA =
new TH1F(
"fhChunkQA",
"# of hybrid tracks per chunk",200,0,200);
511 const Int_t dim1 = 3;
512 Int_t nBins1[dim1] = {200,50,110};
514 Double_t upBin1[dim1] = {200,0.5,1.1};
516 const Int_t dim2 = 3;
517 Int_t nBins2[dim2] = {200,50,50};
519 Double_t upBin2[dim2] = {200,0.5,50};
521 const char* triggerName[3] = {
"MB",
"EMC",
"MC"};
522 const char* triggerTitle[3] = {
"MB",
"EMCal-trigger",
"MC true"};
523 const char* fraction[5] = {
"MIP",
"30",
"50",
"70",
"100"};
524 const char* exotic[2] = {
"3GeV",
"5GeV"};
525 const char* vertexType[2] = {
"All MB",
"MB with vertex"};
526 const char *vertexName[2] = {
"All",
"Vertex"};
527 const char *clusterizerName[2] = {
"before",
"after"};
528 const char *UEName[2] = {
"charged",
"charged_neutral"};
529 const char *UETitle[2] = {
"charged",
"charged+neutral"};
530 const char *UEEventName[2] = {
"LeadingJet",
"Back-To-Back"};
534 for(
Int_t i=0; i<2; i++)
536 fhNTrials[i] =
new TH1F(Form(
"MC_%s_fhNTrials",triggerName[i]),Form(
"MC-%s: # of trials",triggerName[i]),1,0,1);
539 fVertexGenZ[i] =
new TH1F(Form(
"%s_fVertexGenZ",vertexName[i]),Form(
"Distribution of vertex z (%s); z (cm)",vertexType[i]),60,-30,30);
544 for(
Int_t i=0; i<3; i++)
546 if(!
fIsMC && i==2)
continue;
552 fEventZ[i] =
new TH1F(Form(
"%s_fEventZ",triggerName[i]),Form(
"%s: Distribution of vertex z; z (cm)",triggerTitle[i]),60,-30,30);
558 if(!
fRadius.Contains(
"0.4") && r==0)
continue;
559 if(!
fRadius.Contains(
"0.2") && r==1)
continue;
560 if(!
fRadius.Contains(
"0.3") && r==2)
continue;
562 fJetCount[i][r] =
new TH1F(Form(
"%s_fJetCount_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: jet p_{T} in EMCal (R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins);
565 fhNeutralPtInJet[i][r] =
new TH2F(Form(
"%s_fhNeutralPtInJet_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of neutral constituents vs jet p_{T} in EMCal(R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); p_{T} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,nTrkPtBins*10,lowTrkPtBin,upTrkPtBin);
568 fhTrigNeuPtInJet[i][r] =
new TH2F(Form(
"%s_fhTrigNeuPtInJet_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of triggered neutral constituents vs jet p_{T} in EMCal(R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); p_{T} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,nTrkPtBins*10,lowTrkPtBin,upTrkPtBin);
571 fhChargedPtInJet[i][r] =
new TH2F(Form(
"%s_fhChargedPtInJet_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of charged constituents vs jet p_{T} in EMCal (R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); p_{T} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,nTrkPtBins*10,lowTrkPtBin,upTrkPtBin);
574 fhLeadNePtInJet[i][r] =
new TH2F(Form(
"%s_fhLeadNePtInJet_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of leading neutral constituent vs jet p_{T} in EMCal(R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); p_{T}^{ne} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,100,0,100);
577 fhLeadChPtInJet[i][r] =
new TH2F(Form(
"%s_fhLeadChPtInJet_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of leading charged constituent vs jet p_{T} in EMCal(R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); p_{T}^{ch} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,100,0,100);
580 fhJetPtVsZ[i][r] =
new TH3F(Form(
"%s_fhJetPtVsZ_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: jet p_{T} vs Z_{h} vs constituent type in EMCal (R=%1.1f);p_{T}^{jet} (GeV/c); Z_{h};constituent type",triggerTitle[i],kRadius[r]),200,0,200,110,-0.05,1.05,4,0,4);
583 fJetEnergyFraction[i][r] =
new THnSparseF(Form(
"%s_fJetEnergyFraction_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: Jet p_{T} vs radius vs energy fraction in EMCal (R=%1.1f,Z<0.98); p_{T};R;Fraction",triggerName[i],kRadius[r]),dim1,nBins1,lowBin1,upBin1);
586 fJetNPartFraction[i][r] =
new THnSparseF(Form(
"%s_fJetNPartFraction_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: Jet p_{T} vs radius vs NPart in EMCal (R=%1.1f,Z<0.98); p_{T};R;NPart",triggerName[i],kRadius[r]),dim2,nBins2,lowBin2,upBin2);
591 fhJetPtInExoticEvent[i][r] =
new TH1F(Form(
"EMC_fhJetPtInExoticEvent_%1.1f_%s",kRadius[r],exotic[i]),Form(
"EMC: jet p_{T} in events with exotic cluster > %s (R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c)",exotic[i],kRadius[r]),nbins,xbins);
594 fRelTrkCon[i][r] =
new TH3F(Form(
"%s_fRelTrkCon_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: jet p_{T} vs (sum p_{T}^{ch})/p_{T}^{jet} vs track class in EMCal (R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); (sum p_{T}^{ch})/p_{T}^{jet}; track class",triggerTitle[i],kRadius[r]),200,0,200,110,-0.05,1.05,3,0,3);
597 fhFcrossVsZleading[i][r] =
new TH3F(Form(
"%s_fhFcrossVsZleading_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: jet p_{T} vs F_{cross} vs Z_{leading}^{ne} in EMCal (R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c);F_{cross};Z_{leading}^{ne}",triggerTitle[i],kRadius[r]),200,0,200,55,-0.05,1.05,55,-0.05,1.05);
600 fhChLeadZVsJetPt[i][r] =
new TH2F(Form(
"%s_fhChLeadZVsJetPt_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: Z of leading charged constituent vs jet p_{T} in EMCal(R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c); Z_{leading}^{ch}",triggerTitle[i],kRadius[r]),nbins,xbins,100,0,1);
603 fhJetPtWithTrkThres[i][r] =
new TH2F(Form(
"%s_fhJetPtWithTrkThres_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of jets containing tracks above certain threshold (15,25,40 GeV/c) (EMCal, R=%1.1f,Z<0.98);Threshold type;p_{T}^{jet} (GeV/c)",triggerTitle[i],kRadius[r]),3,0,3,nbins,xbins);
606 fhJetPtWithClsThres[i][r] =
new TH2F(Form(
"%s_fhJetPtWithClsThres_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: p_{T} of jets containing clusters above certain threshold (15,25,40 GeV) (EMCal, R=%1.1f,Z<0.98);Threshold type;p_{T}^{jet} (GeV/c)",triggerTitle[i],kRadius[r]),3,0,3,nbins,xbins);
609 fhJetPtVsLowPtCons[i][r][0] =
new TH2F(Form(
"%s_fhJetPtVsLowPtCons_150-300MeV_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: energy carried by constituents in 150-300MeV (EMCal, R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c);p_{T,em}^{low} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,100,0,1);
612 fhJetPtVsLowPtCons[i][r][1] =
new TH2F(Form(
"%s_fhJetPtVsLowPtCons_300-500MeV_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: energy carried by constituents in 300-500MeV (EMCal, R=%1.1f,Z<0.98);p_{T}^{jet} (GeV/c);p_{T,em}^{low} (GeV/c)",triggerTitle[i],kRadius[r]),nbins,xbins,100,0,1);
617 fhJetInTPCOnlyVtx[i][r] =
new TH3F(Form(
"%s_fhJetInTPCOnlyVtx_%1.1f",triggerName[i],kRadius[r]),Form(
"%s: jet pt in events with only TPC vertex (Full, R=%1.1f);p_{T}^{jet} (GeV/c);#phi;#eta",triggerTitle[i],kRadius[r]),20,0,100,36,0,360,20,-1,1);
623 for(
Int_t k=0; k<5; k++)
625 fhSubClsEVsJetPt[i][r][k] =
new TH2F(Form(
"%s_fhSubClsEVsJetPt_%s_%1.1f",triggerName[i],fraction[k],kRadius[r]),Form(
"%s: relative %s%% subtracted cluster Et vs jet pt (R=%1.1f);jet p_{T} (GeV/c);E_{t}^{sub}/p_{T,jet}",triggerTitle[i],fraction[k], kRadius[r]),nbins,xbins,50,0,0.5);
628 fhHCTrkPtClean[i][r][k] =
new TH2F(Form(
"%s_fhHCTrkPtClean_%s_%1.1f",triggerName[i],fraction[k],kRadius[r]),Form(
"%s: sum of track p_{T} that are cleanly subtracted vs jet pt (%s%%, R=%1.1f);jet p_{T} (GeV/c);#sum(p_{T,trk}^{clean})/p_{T,jet}",triggerTitle[i],fraction[k], kRadius[r]),nbins,xbins,100,-0.005,0.995);
631 fhHCTrkPtAmbig[i][r][k] =
new TH2F(Form(
"%s_fhHCTrkPtAmbig_%s_%1.1f",triggerName[i],fraction[k],kRadius[r]),Form(
"%s: sum of track p_{T} that are ambiguously subtracted vs jet pt (%s%%, R=%1.1f);jet p_{T} (GeV/c);#sum(p_{T,trk}^{ambig})/p_{T,jet}",triggerTitle[i],fraction[k], kRadius[r]),nbins,xbins,100,-0.005,0.995);
639 fhNMatchedTrack[i] =
new TH1F(Form(
"%s_fhNMatchedTrack",triggerName[i]),Form(
"%s: # of matched tracks per cluster; N_{mth}",triggerTitle[i]),5,0,5);
642 for(
Int_t j=0; j<4; j++)
644 fhSubEVsTrkPt[i][j] =
new TH2F(Form(
"%s_fhSubEVsTrkPt_%s",triggerName[i],fraction[j+1]),Form(
"%s: fractional subtracted energy (%s%% HC);#sum(p_{ch,T}^{mth}) (GeV/c);E_{sub}/#sum(P_{ch}^{mth})",triggerTitle[i],fraction[j+1]),50,0,50,110,0,1.1);
652 for(
Int_t k=0; k<2; k++)
654 for(
Int_t l=0; l<2; l++)
656 fhUEJetPtNorm[i][k][l] =
new TH1F(Form(
"%s_fhUEJetPtNorm_%s_%s",triggerName[i],UEName[k],UEEventName[l]),Form(
"%s: leading jet p_{T} in TPC (%s in %s event);p_{T,jet}^{ch} (GeV/c)",triggerTitle[i],UETitle[k], UEEventName[l]),nbins,xbins);
659 fhUEJetPtVsSumPt[i][k][l] =
new TH2F(Form(
"%s_fhUEJetPtVsSumPt_%s_%s",triggerName[i],UEName[k],UEEventName[l]),Form(
"%s: leading jet p_{T} vs underlying event contribution (R=0.4,%s in %s event);p_{T,jet}^{ch} (GeV/c);p_{T,UE}^{ch} (GeV/c)",triggerTitle[i],UETitle[k], UEEventName[l]),nbins,xbins,500,0,50);
662 fhUEJetPtVsConsPt[i][k][l] =
new TH2F(Form(
"%s_fhUEJetPtVsConsPt_%s_%s",triggerName[i],UEName[k],UEEventName[l]),Form(
"%s: leading jet p_{T} vs constituent pt in UE (R=0.4,%s in %s event);p_{T,jet}^{ch} (GeV/c);p_{T,cons}^{ch} (GeV/c)",triggerTitle[i],UETitle[k], UEEventName[l]),nbins,xbins,500,0,50);
670 fhClsE[i] =
new TH1F(Form(
"%s_fhClsE",triggerName[i]),Form(
"%s: cluster E;E (GeV)",triggerTitle[i]),1000,0,100);
676 for(
Int_t k=0; k<2; k++)
678 fhSysClusterE[i][k] =
new TH1F(Form(
"%s_fhSysClusterE_%sHC",triggerName[i],clusterizerName[k]),Form(
"%s: cluster E %s hadronic correction;E (GeV)",triggerTitle[i],clusterizerName[k]),100,0,100);
681 fhSysNCellVsClsE[i][k] =
new TH2F(Form(
"%s_fhSysNCellVsClsE_%sHC",triggerName[i],clusterizerName[k]),Form(
"%s: NCell vs cluster E %s hadronic correction;E (GeV);NCell",triggerTitle[i],clusterizerName[k]),100,0,100,50,0,50);
694 if(!
fRadius.Contains(
"0.4") && r==0)
continue;
695 if(!
fRadius.Contains(
"0.2") && r==1)
continue;
696 if(!
fRadius.Contains(
"0.3") && r==2)
continue;
697 for(
Int_t i=0; i<5; i++)
699 fHCOverSubE[r][i] =
new TH2F(Form(
"%s_HC_over_sub_e_%s_%1.1f",triggerName[2],fraction[i],kRadius[r]),Form(
"%s: oversubtracted neutral Et by %s%% HC (R=%1.1f);particle jet p_{T} (GeV/c);#DeltaE_{t} (GeV)",triggerName[2],fraction[i],kRadius[r]),nbins,xbins,200,-49.75,50.25);
701 fHCOverSubEFrac[r][i] =
new TH2F(Form(
"%s_HC_over_sub_e_frac_%s_%1.1f",triggerName[2],fraction[i],kRadius[r]),Form(
"%s: relative oversubtracted neutral Et fraction by %s%% HC (R=%1.1f);jet p_{T} (GeV/c);#DeltaE_{t}/p_{T}^{jet}",triggerName[2],fraction[i],kRadius[r]),nbins,xbins,200,-0.995,1.005);
708 for(
Int_t i=0; i<2; i++)
710 for(
Int_t r=0; r<3; r++)
712 fhNKFracVsJetPt[i][r] =
new TH2F(Form(
"%s_fhNKFracVsJetPt_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: energy fraction carried by n,k^{0}_{L} vs jet p_{T} (R=%1.1f,|#eta|<%1.1f);p_{T,jet} (GeV/c);fraction",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,200,0,1);
715 fhWeakFracVsJetPt[i][r] =
new TH2F(Form(
"%s_fhWeakFracVsJetPt_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: energy fraction carried by k^{0}_{S},hyperon vs jet p_{T} (R=%1.1f,|#eta|<%1.1f);p_{T,jet} (GeV/c);fraction",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,200,0,1);
718 fhJetResponseNK[i][r] =
new TH2F(Form(
"%s_fhJetResponseNK_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to missing n and k^{0}_{L} (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{gen} (GeV/c);p_{T,jet}^{rec} (GeV/c)",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,nbins,xbins);
721 fhJetResponseWP[i][r] =
new TH2F(Form(
"%s_fhJetResponseWP_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to k^{0}_{S}, #Lambda and hyperon (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{gen} (GeV/c);p_{T,jet}^{rec} (GeV/c)",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,nbins,xbins);
724 fhJetResolutionNK[i][r] =
new TH2F(Form(
"%s_fhJetResolutionNK_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to missing n and k^{0}_{L}: (p_{T,jet}^{rec}-p_{T,jet}^{gen})/p_{T,jet}^{rec} vs p_{T,jet}^{rec} (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{rec} (GeV/c);#Deltap_{T}/p_{T}",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,200,-0.995,1.005);
727 fhJetResolutionWP[i][r] =
new TH2F(Form(
"%s_fhJetResolutionWP_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to k^{0}_{S}, #Lambda and hyperon: (p_{T,jet}^{rec}-p_{T,jet}^{gen})/p_{T,jet}^{rec} vs p_{T,jet}^{rec} (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{rec} (GeV/c);#Deltap_{T}/p_{T}",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,200,-0.995,1.005);
730 fhJetResponseNKSM[i][r] =
new TH2F(Form(
"%s_fhJetResponseNKSM_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to missing n and k^{0}_{L} via matching (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{gen} (GeV/c);p_{T,jet}^{rec} (GeV/c)",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,nbins,xbins);
733 fhJetResponseWPSM[i][r] =
new TH2F(Form(
"%s_fhJetResponseWPSM_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet response due to k^{0}_{S}, #Lambda and hyperon via matching(R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{gen} (GeV/c);p_{T,jet}^{rec} (GeV/c)",triggerName[2],kRadius[r],i*0.5+0.5),nbins,xbins,nbins,xbins);
736 fhJetResolutionNKSM[i][r] =
new TH3F(Form(
"%s_fhJetResolutionNKSM_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet resolution due to missing n and k^{0}_{L} via matching (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{rec} (GeV/c);#Deltap_{T,jet}/p_{T,jet}^{rec};dR",triggerName[2],kRadius[r],i*0.5+0.5),220,0,220,200,-0.995,1.005,100,0,1);
739 fhJetResolutionWPSM[i][r] =
new TH3F(Form(
"%s_fhJetResolutionWPSM_%1.1f_EtaCut%1.1f",triggerName[2],kRadius[r],i*0.5+0.5),Form(
"%s: jet resolution due tok^{0}_{S}, #Lambda and hyperon via matching (R=%1.1f,|#eta|<%1.1f);p_{T,jet}^{rec} (GeV/c);#Deltap_{T,jet}/p_{T,jet}^{rec};dR",triggerName[2],kRadius[r],i*0.5+0.5),220,0,220,200,-0.995,1.005,100,0,1);
746 printf(
"\n=======================================\n");
747 printf(
"===== Jet task configuration ==========\n");
751 const char* species[3] = {
"in",
"ch",
"ne"};
752 const char* algorithm[2] = {
"akt",
"kt"};
753 const char* radii[
kNRadii] = {
"04",
"02",
"03"};
754 for(
Int_t s=0; s<3; s++)
758 for(
Int_t a=0; a<2; a++)
760 if(!
fAlgorithm.Contains(
"aKt") && a==0)
continue;
761 if(!
fAlgorithm.Contains(
"kt") && a==1)
continue;
764 if(!
fRadius.Contains(
"0.4") && r==0)
continue;
765 if(!
fRadius.Contains(
"0.2") && r==1)
continue;
766 if(!
fRadius.Contains(
"0.3") && r==2)
continue;
769 fJetTCA[s][a][r] =
new TClonesArray(
"AliAODJet",0);
770 fJetTCA[s][a][r]->SetName(Form(
"Jet_%s_%s_%s_%s",species[s],algorithm[a],radii[r],
fNonStdBranch.Data()));
772 printf(
"Add branch: Jet_%s_%s_%s_%s\n",species[s],algorithm[a],radii[r],
fNonStdBranch.Data());
792 printf(
"Add branch: Jet_mc_truth_in_akt_%s_%s\n",radii[r],
fNonStdBranch.Data());
811 TFile f (
"/project/projectdirs/alice/marr/Analysis/2.76Jet/CorrectionFunctions/TrkEffFit.root",
"read");
812 for(
Int_t i=0; i<3; i++)
814 fTrkEffFunc[i] =
new TF1(*((TF1*)f.Get(Form(
"Trk_eff_fit_%d",i+1))));
818 if(
fPeriod.CompareTo(
"lhc11a",TString::kIgnoreCase)==0 ||
fPeriod.CompareTo(
"lhc11aJet",TString::kIgnoreCase)==0)
820 TFile f1 (
"/project/projectdirs/alice/marr/Analysis/2.76Jet/CorrectionFunctions/TrkEffSampling.root",
"read");
821 for(
Int_t j=0; j<2; j++)
824 if(
fPeriod.CompareTo(
"lhc11aJet",TString::kIgnoreCase)==0) tmp = 2;
827 fhCorrTrkEffPtBin[j][r] =
new TH1F(*((TH1F*)f1.Get(Form(
"%s_%s_NTrackPerPtBin_%1.1f",
fPeriod.Data(),triggerName[tmp],kRadius[r]))));
830 fhCorrTrkEffSample[j][r][i] =
new TH1F(*((TH1F*)f1.Get(Form(
"%s_%s_ChTrkPt_Bin%d_%1.1f",
fPeriod.Data(),triggerName[tmp],i+1,kRadius[r]))));
840 const char *secondaryName[3] = {
"k0S",
"lamda",
"hyperon"};
841 TFile f2 (
"/project/projectdirs/alice/marr/Analysis/2.76Jet/CorrectionFunctions/SecondaryResponse.root",
"read");
842 for(
Int_t j=0; j<3; j++)
850 TString name =
"TriggerCurve.root";
851 if(
fAnaType==0) name =
"/project/projectdirs/alice/marr/Analysis/2.76Jet/CorrectionFunctions/TriggerCurve.root";
852 TFile f (name.Data(),
"read");
856 for(
Int_t i=0; i<10; i++)
858 fTriggerEfficiency[i] =
new TF1(*((TF1*)f.Get(Form(
"lhc11a_TriggerEfficiency_SM%d_fit",i))));
868 fGeom = AliEMCALGeometry::GetInstance(
"EMCAL_COMPLETEV1");
871 AliError(
"No EMCal geometry is available!");
876 fRecoUtil->SwitchOnRejectExoticCluster();
879 fRecoUtil->SwitchOffRejectExoticCluster();
886 for(
Int_t ieta=0; ieta<36; ieta++)
887 for(
Int_t iphi=0; iphi<8; iphi++)
888 fRecoUtil->SetEMCALChannelStatus(4,ieta,iphi);
891 fRecoUtil->SwitchOffBadChannelsRemoval();
893 fRecoUtil->SetNonLinearityFunction(AliEMCALRecoUtils::kBeamTestCorrected);
896 fNonLinear =
new TF1(
"TB_oldBest",
"([0])*(1./(1.+[1]*exp(-x/[2]))*1./(1.+[3]*exp((x-[4])/[5])))*1/([6])",0.1,110.);
897 fNonLinear->SetParameters(0.99078, 0.161499, 0.655166, 0.134101, 163.282, 23.6904, 0.978);
915 for(
Int_t i=0; i<nObj; i++)
918 if (obj->IsA()->InheritsFrom(
"THnSparse" ))
920 THnSparseF *hn = (THnSparseF*)obj;
938 if(
fVerbosity>10) printf(
"[i] Booking histograms \n");
956 printf(
"ERROR: Could not retrieve MC event");
960 TParticle *particle =
fStack->Particle(0);
963 vtxTrueZ = particle->Vz();
964 if(
fVerbosity>10) printf(
"Generated vertex coordinate: (x,y,z) = (%4.2f, %4.2f, %4.2f)\n", particle->Vx(), particle->Vy(), particle->Vz());
971 AliError(
"fESD is not available");
984 UInt_t trigger = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
985 if (trigger==0)
return;
989 if (trigger & AliVEvent::kFastOnly)
return;
990 if(
fPeriod.CompareTo(
"lhc11a",TString::kIgnoreCase)==0)
996 else if (
fPeriod.CompareTo(
"lhc11c",TString::kIgnoreCase)==0 ||
fPeriod.CompareTo(
"lhc11d",TString::kIgnoreCase)==0)
1010 else if (trigger & AliVEvent::kAnyINT)
fTriggerType = 0;
1022 if(
fVerbosity>10) printf(
"Error: worng trigger type %s\n",(
fESD->GetFiredTriggerClasses()).
Data());
1047 const AliESDVertex* vtx =
fESD->GetPrimaryVertex();
1053 if( TMath::Abs(zVertex) >
fZVtxMax )
return;
1059 if(!
fIsMC && fTriggerType==1)
1077 if(
fAnaType==0) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
1080 for(
Int_t s=0; s<3; s++)
1082 for(
Int_t a=0; a<2; a++)
1098 if(
fVerbosity>5) printf(
"# of jets after clear: %d\n",
fJetTCA[0][0][0]->GetEntries());
1111 for(
Int_t s=0; s<3; s++)
1113 for(
Int_t a=0; a<2; a++)
1122 if(s==0 && a==0 &&
fNonStdBranch.Contains(
"Baseline",TString::kIgnoreCase))
1154 if(s==1) isNe = kFALSE;
1155 if(s==2) isCh = kFALSE;
1160 Int_t countTracks = 0;
1162 for(
Int_t it=0; it<ntracks; it++)
1164 AliESDtrack *t = (AliESDtrack*)
fTrackArray->At(it);
1169 if(s==1 &&
fRunUE && pt<1)
continue;
1178 if(
fVerbosity>10) printf(
"%d: m_{ch}=%f\n",it+1,t->P()*t->P()-t->Px()*t->Px()-t->Py()*t->Py()-t->Pz()*t->Pz());
1180 if(
fVerbosity>5) printf(
"[i] # of tracks filled: %d\n",countTracks);
1186 fESD->GetVertex()->GetXYZ(vertex) ;
1187 TLorentzVector gamma;
1189 Int_t countClusters = 0;
1191 for (
Int_t ic = 0; ic < nclusters; ic++)
1193 AliESDCaloCluster * cl = (AliESDCaloCluster *)
fClusterArray->At(ic);
1195 cl->GetMomentum(gamma, vertex);
1201 if(
fVerbosity>5) printf(
"[i] # of clusters filled: %d\n",countClusters);
1216 Int_t radiusIndex = 0;
1217 TString arrayName = fJetArray->GetName();
1218 if(arrayName.Contains(
"_02_")) radiusIndex = 1;
1219 if(arrayName.Contains(
"_03_")) radiusIndex = 2;
1221 if(
fVerbosity>5 && radiusIndex==0) printf(
"[i] # of jets in %s : %d\n",fJetArray->GetName(),(
Int_t)jetsIncl.size());
1224 for(
UInt_t ij=0; ij<jetsIncl.size(); ij++)
1226 if(
fVerbosity>10) printf(
"fastjet: eta=%f, phi=%f\n",jetsIncl[ij].eta(),jetsIncl[ij].phi()*TMath::RadToDeg());
1227 if(!
IsGoodJet(jetsIncl[ij],0))
continue;
1229 AliAODJet tmpJet (jetsIncl[ij].px(), jetsIncl[ij].py(), jetsIncl[ij].pz(), jetsIncl[ij].E());
1230 jet =
new ((*fJetArray)[jetCount]) AliAODJet(tmpJet);
1232 if(
fVerbosity>10 && radiusIndex==0) printf(
"AOD jet: ij=%d, pt=%f, eta=%f, phi=%f\n",ij, jet->Pt(), jet->Eta(),jet->Phi()*TMath::RadToDeg());
1234 jet->GetRefTracks()->Clear();
1236 Double_t totE=0, totPt=0, totChPt=0, leadChPt=0, neE=0, totNePt=0, leadNePt=0, leadPt=0;
1237 Double_t leadTrkType=0, nChPart = 0, nNePart = 0;
1238 Bool_t isHighPtTrigger = kFALSE, isTriggering = kFALSE, isHyperTrack = kFALSE;
1239 Int_t leadIndex = -1;
1240 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1242 if(
fVerbosity>10 && radiusIndex==0) printf(
"ic=%d: user_index=%d, E=%f\n",ic,constituents[ic].user_index(),constituents[ic].E());
1243 if(constituents[ic].user_index()<0)
1246 totNePt += constituents[ic].perp();
1247 if(constituents[ic].perp()>leadNePt)
1248 leadNePt = constituents[ic].perp();
1250 neE += constituents[ic].E();
1252 isHighPtTrigger = kTRUE;
1255 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(constituents[ic].user_index()*(-1)-1);
1256 if(cluster->Chi2()>0.5) isTriggering = kTRUE;
1261 totChPt += constituents[ic].perp();
1263 if(constituents[ic].perp()>leadChPt)
1265 leadChPt = constituents[ic].perp();
1268 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[ic].user_index()-1);
1269 leadTrkType = track->GetTRDQuality();
1270 if(track->GetIntegratedLength()>500) isHyperTrack = kTRUE;
1274 isHighPtTrigger = kTRUE;
1277 part.SetMomentum(constituents[ic].px(),constituents[ic].py(),constituents[ic].pz(),constituents[ic].E());
1278 jet->AddTrack(&part);
1279 totE += constituents[ic].E();
1280 totPt += constituents[ic].perp();
1281 if(constituents[ic].perp()>leadPt)
1283 leadPt = constituents[ic].perp();
1288 if(isHighPtTrigger) jet->SetTrigger(AliAODJet::kHighTrackPtTriggered);
1289 if(
fTriggerType==1) jet->SetTrigger(AliAODJet::kEMCALTriggered);
1296 if(jetsIncl[ij].E()>0) jet->SetNEF(neE/jetsIncl[ij].E());
1297 jet->SetPtLeading(leadPt);
1298 jet->SetPtSubtracted(leadTrkType,0);
1300 Double_t effAErrCh = 0, effAErrNe = leadTrkType;
1301 Double_t chBgEnergy = 10, neBgEnergy = nNePart;
1305 if(
fIsMC && constituents[leadIndex].user_index()>0)
1307 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[leadIndex].user_index()-1);
1309 Int_t ipart = track->GetLabel();
1310 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
1312 AliVParticle* vParticle =
fMC->GetTrack(ipart);
1316 chBgEnergy = (truePt-pt)/truePt;
1322 jet->SetEffArea(leadPt, jetFinder->
GetJetArea(ij),effAErrCh,effAErrNe);
1323 jet->SetBgEnergy(chBgEnergy,neBgEnergy);
1324 if(
fVerbosity>10 && isTruth) cout<<jet->ErrorEffectiveAreaCharged()<<
" "<<jet->ErrorEffectiveAreaNeutral()<<endl;
1325 if(
fVerbosity>10) cout<<
"jet pt="<<jetsIncl[ij].perp()<<
", nef="<<jet->GetNEF()<<
", trk eff corr="<<chBgEnergy<<endl;
1328 printf(
"# of ref tracks: %d = %d, and nef=%f\n",jet->GetRefTracks()->GetEntries(), (
Int_t)constituents.size(), jet->GetNEF());
1333 if(jetsIncl[ij].perp()>100)
1335 printf(
"\n\n--- HAHAHA: High pt jets ---\n");
1336 printf(
"File: %s, event = %d, pt=%f\n",CurrentFileName(),(
Int_t)Entry(),jetsIncl[ij].perp());
1337 printf(
"%s , pt < %f\n", fJetArray->GetName(),
fTrkPtMax[1]);
1338 printf(
"Jet: E=%f, eta=%f, phi=%f, # of constituents=%d, nef=%f\n",jetsIncl[ij].E(),jetsIncl[ij].eta(), jetsIncl[ij].phi()*TMath::RadToDeg(), (
Int_t)constituents.size(),jet->GetNEF());
1339 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1341 if(constituents[ic].user_index()<0)
1343 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(constituents[ic].user_index()*(-1)-1);
1344 printf(
"id = %d, cluster with pt = %f, ncell = %d\n",ic,constituents[ic].perp(), cluster->GetNCells());
1348 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[ic].user_index()-1);
1349 printf(
"id = %d, track with pt = %f, track class = %d, originalPt = %f\n",ic,constituents[ic].perp(),(
Int_t)track->GetTRDQuality(), track->GetIntegratedLength());
1353 printf(
"==============================\n\n");
1358 if(
fVerbosity>5) printf(
"%s has %d jets\n",fJetArray->GetName(), fJetArray->GetEntries());
1379 if(jet.perp()<1)
return kFALSE;
1380 if(TMath::Abs(jet.eta())>(0.7-rad))
return kFALSE;
1381 if(jet.phi() < (80*TMath::DegToRad()+rad) || jet.phi() > (180*TMath::DegToRad()-rad) )
return kFALSE;
1393 Int_t npart =
fMC->GetNumberOfTracks();
1395 Int_t countPart = 0;
1396 for(
Int_t ipart=0; ipart<npart; ipart++)
1398 AliVParticle* vParticle =
fMC->GetTrack(ipart);
1401 Int_t pdgCode = vParticle->PdgCode();
1402 if(
fRejectNK && (pdgCode==130 || pdgCode==2112) )
continue;
1404 if(
fRejectWD && (pdgCode==310 || pdgCode==3112 || pdgCode==3122 || pdgCode==3222 || pdgCode==3312 || pdgCode==3322 || pdgCode==3334))
continue;
1406 if(
fChargedMC && vParticle->Charge()==0 )
continue;
1409 if(vParticle->Charge()==0) { index=-1; }
1415 printf(
"Input particle: ipart=%d, pdg=%d, species=%s, charge=%d, E=%4.3f\n",(ipart+1)*index,pdgCode,vParticle->GetName(), vParticle->Charge(),vParticle->P());
1427 for(
Int_t i=0; i<2; i++)
1446 fESD->GetVertex()->GetXYZ(vertex) ;
1447 TLorentzVector gamma;
1453 for(
Int_t i=0; i<nBins; i++)
1461 for(
UInt_t ij=0; ij<jetsIncl.size(); ij++)
1465 fhJetInTPCOnlyVtx[type][r]->Fill(jetsIncl[ij].perp(),jetsIncl[ij].phi()*TMath::RadToDeg(),jetsIncl[ij].eta());
1467 if(!
IsGoodJet(jetsIncl[ij],kRadius[r]))
continue;
1468 Float_t jetEta = jetsIncl[ij].eta();
1469 Float_t jetPhi = jetsIncl[ij].phi();
1470 Float_t jetE = jetsIncl[ij].E();
1471 Float_t jetPt = jetsIncl[ij].perp();
1474 Double_t neE=0, leadingZ = 0, maxPt = 0;
1475 Int_t constituentType = -1, leadingIndex = 0;
1476 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1478 if(constituents[ic].perp()>maxPt)
1480 maxPt = constituents[ic].perp();
1481 leadingIndex = constituents[ic].user_index();
1484 if(constituents[ic].user_index()<0)
1486 neE += constituents[ic].E();
1487 constituentType = 3;
1491 if(type==2) constituentType = 0;
1494 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[ic].user_index()-1);
1495 constituentType = (
Int_t)track->GetTRDQuality();
1498 Double_t cz =
GetZ(constituents[ic].px(),constituents[ic].py(),constituents[ic].pz(),jetsIncl[ij].px(),jetsIncl[ij].py(),jetsIncl[ij].pz());
1499 fhJetPtVsZ[type][r]->Fill(jetPt,cz, constituentType);
1500 if(cz>leadingZ) leadingZ = cz;
1503 if(type<2 && leadingIndex<0)
1505 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(leadingIndex*(-1)-1);
1509 if(leadingZ > 0.98)
continue;
1517 for(
Int_t i=0; i<nBins; i++) { eFraction[i] = 0.; nPart[i] = 0;}
1520 Double_t subTrkPtClean[5] = {0,0,0,0,0};
1521 Double_t subTrkPtAmbig[5] = {0,0,0,0,0};
1522 Double_t fraction[5] = {270,0.3,0.5,0.7,1};
1524 Int_t leadChIndex = -1;
1525 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1527 Float_t partEta = constituents[ic].eta();
1528 Float_t partPhi = constituents[ic].phi();
1529 Float_t partE = constituents[ic].E();
1530 Float_t partPt = constituents[ic].perp();
1532 if(constituents[ic].user_index()<0)
1539 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(constituents[ic].user_index()*(-1)-1);
1544 cluster->GetMomentum(gamma, vertex);
1545 Double_t sinTheta = TMath::Sqrt(1-TMath::Power(gamma.CosTheta(),2));
1547 Double_t subEtmp = cluster->GetDispersion();
1548 Double_t mipETmp = cluster->GetEmcCpvDistance();
1549 mcSubE += cluster->GetDistanceToBadChannel()*sinTheta;
1550 subClsE[0] += ((mipETmp>clsE)?clsE:mipETmp)*sinTheta;
1551 for(
Int_t j=1; j<5; j++)
1553 subClsE[j] += ((fraction[j]*subEtmp>clsE)?clsE:fraction[j]*subEtmp)*sinTheta;
1560 if(partPt>leadChPt) {leadChPt = partPt;leadChIndex=ic;}
1562 chPt += constituents[ic].perp();
1565 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[ic].user_index()-1);
1566 Int_t trkType = (
Int_t)track->GetTRDQuality();
1567 totTrkPt[trkType] += partPt;
1568 Int_t clusterIndex = track->GetEMCALcluster();
1569 Int_t clusterPos = -1;
1573 AliESDCaloCluster *cluster = (AliESDCaloCluster*)
fClusterArray->At(j);
1574 if( clusterIndex == cluster->GetID() )
1583 AliESDCaloCluster *cluster = (AliESDCaloCluster*)
fClusterArray->At(clusterPos);
1584 Double_t subEtmp = cluster->GetDispersion();
1585 Double_t mipETmp = cluster->GetEmcCpvDistance();
1586 for(
Int_t k=0; k<5; k++)
1590 if(mipETmp>cluster->E()) subTrkPtClean[k] += partPt;
1591 else subTrkPtAmbig[k] += partPt;
1595 if(fraction[k]*subEtmp>cluster->E()) subTrkPtClean[k] += partPt;
1596 else subTrkPtAmbig[k] += partPt;
1603 Float_t dR = TMath::Sqrt( (partEta-jetEta)*(partEta-jetEta) + (partPhi-jetPhi)*(partPhi-jetPhi) );
1604 for(
Int_t i=0; i<nBins; i++)
1606 if( dR < radiusCut[i] )
1608 eFraction[i] += partE;
1616 if(type<2 && leadChIndex>-1)
1618 Double_t cz =
GetZ(constituents[leadChIndex].px(),constituents[leadChIndex].py(),constituents[leadChIndex].pz(),jetsIncl[ij].px(),jetsIncl[ij].py(),jetsIncl[ij].pz());
1624 for(
Int_t i=0; i<5; i++)
1628 fhSubClsEVsJetPt[type][r][i]->Fill(jetPt-subClsE[4],subClsE[i]/(jetPt-subClsE[4]));
1629 fhHCTrkPtClean[type][r][i]->Fill(jetPt-subClsE[4],subTrkPtClean[i]/(jetPt-subClsE[4]));
1630 fhHCTrkPtAmbig[type][r][i]->Fill(jetPt-subClsE[4],subTrkPtAmbig[i]/(jetPt-subClsE[4]));
1634 fHCOverSubE[r][i]->Fill(jetPt-subClsE[4],subClsE[i]-mcSubE);
1635 fHCOverSubEFrac[r][i]->Fill(jetPt-subClsE[4],(subClsE[i]-mcSubE)/(jetPt-subClsE[4]));
1639 if(type<2 && chPt>0)
1641 for(
Int_t i=0; i<3; i++)
1643 fRelTrkCon[type][r]->Fill(jetPt,totTrkPt[i]/chPt,i);
1648 for(
Int_t ibin=0; ibin<nBins; ibin++)
1650 Double_t fill1[3] = {jetPt,radiusCut[ibin]-0.005,eFraction[ibin]/jetE};
1652 Double_t fill2[3] = {jetPt,radiusCut[ibin]-0.005,
static_cast<Double_t>(nPart[ibin])};
1660 Int_t okCh[3] = {0,0,0};
1661 Int_t okNe[3] = {0,0,0};
1663 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1665 Float_t partPt = constituents[ic].perp();
1667 if(partPt<0.3) lowPt[0] += partPt;
1668 else if(partPt<0.5) lowPt[1] += partPt;
1670 if(constituents[ic].user_index()>0)
1672 for(
Int_t it=0; it<3; it++)
1674 if(partPt>thres[it]) okCh[it] = 1;
1679 for(
Int_t icl=0; icl<3; icl++)
1681 if(partPt>thres[icl]) okNe[icl] = 1;
1685 for(
Int_t i=0; i<3; i++)
1705 for(
UInt_t ij=0; ij<jetsIncl.size(); ij++)
1707 Float_t jetEta = jetsIncl[ij].eta();
1708 Float_t jetPt = jetsIncl[ij].perp();
1709 if(TMath::Abs(jetEta)>0.5*etaCut+0.5 || jetPt<1)
continue;
1711 Double_t dNKPt = 0, dWPPt = 0, weakPt=0, nkPt=0;
1713 for(
UInt_t ic=0; ic<constituents.size(); ic++)
1715 Int_t ipart = TMath::Abs(constituents[ic].user_index())-1;
1716 AliMCParticle* mcParticle = (AliMCParticle*)
fMC->GetTrack(ipart);
1717 if(!mcParticle)
continue;
1719 if(pdg==310 || (pdg<=3400 && pdg>=3100)) weakPt += mcParticle->Pt();
1720 if(pdg==130 || pdg==2112) nkPt += mcParticle->Pt();
1723 if(pdg==310) type=0;
1724 else if (pdg==3122) type=1;
1725 else if (pdg<=3400 && pdg>=3100) type=2;
1732 dWPPt += pro*mcParticle->Pt() - mcParticle->Pt();
1737 if(pdg==130 || pdg==2112) dNKPt -= mcParticle->Pt();
1743 Double_t jetNewWPPt = jetPt + dWPPt;
1747 Double_t jetNewNKPt = jetPt + dNKPt;
1763 if(type!=0 && type!=1)
return;
1768 Int_t npart =
fMC->GetNumberOfTracks();
1770 for(
Int_t ipart=0; ipart<npart; ipart++)
1772 AliVParticle* vParticle =
fMC->GetTrack(ipart);
1774 Int_t pdgCode = vParticle->PdgCode();
1776 if( type==0 && (pdgCode==130 || pdgCode==2112) )
continue;
1779 if(pdgCode==310) pType=0;
1780 else if (pdgCode==3122) pType=1;
1781 else if (pdgCode<=3400 && pdgCode>=3100) pType=2;
1788 pt = pro * vParticle->Pt();
1793 if(vParticle->Charge()==0) { index=-1; }
1794 fj.
AddInputVector(vParticle->Px()*pt/vParticle->Pt(), vParticle->Py()*pt/vParticle->Pt(), vParticle->Pz(), vParticle->P(), (ipart+1)*index);
1799 std::vector<fastjet::PseudoJet> jets_incl_mc_std = jetFinder->
GetInclusiveJets();
1801 for(
UInt_t ij=0; ij<jets_incl_mc.size(); ij++)
1803 Float_t jetEta = jets_incl_mc[ij].eta();
1804 Float_t jetPt = jets_incl_mc[ij].perp();
1805 if(TMath::Abs(jetEta)>0.5*etaCut+0.5 || jetPt<5)
continue;
1810 Double_t jetPtStd = jets_incl_mc_std[index].perp();
1811 Double_t dR = TMath::Sqrt(dEta*dEta+dPhi*dPhi);
1832 Double_t leadpt=0, leadPhi = -999, leadEta = -999;
1833 Int_t leadIndex = -1;
1834 for(
UInt_t ij=0; ij<jetsIncl.size(); ij++)
1836 Double_t jetEta = jetsIncl[ij].eta();
1837 Double_t jetPt = jetsIncl[ij].perp();
1838 Double_t jetPhi = jetsIncl[ij].phi();
1847 if(leadpt<1 || TMath::Abs(leadEta)>0.5 )
return;
1849 Int_t backIndex = -1;
1850 Bool_t isBackToBack = kFALSE;
1851 for(
UInt_t ij=0; ij<jetsIncl.size(); ij++)
1853 Double_t dPhi = TMath::Abs(jetsIncl[ij].phi()-leadPhi);
1854 if(dPhi >
kPI) dPhi = 2*
kPI - dPhi;
1855 if(dPhi>150*TMath::DegToRad() && jetsIncl[ij].perp()/leadpt > 0.8)
1858 isBackToBack = kTRUE;
1862 for(
Int_t ij=0; ij<(
Int_t)jetsIncl.size(); ij++)
1864 if(ij==leadIndex || ij==backIndex)
continue;
1865 if(TMath::Abs(jetsIncl[ij].eta())>0.5)
continue;
1866 if(jetsIncl[ij].perp()>15) isBackToBack = kFALSE;
1871 if(axis[0]>2*
kPI) axis[0] -= 2*
kPI;
1872 if(axis[1]<0) axis[1] += 2*
kPI;
1881 fESD->GetVertex()->GetXYZ(vertex) ;
1882 TLorentzVector gamma;
1885 for(
Int_t j=0; j<2; j++)
1888 for(
Int_t it=0; it<ntracks; it++)
1890 AliESDtrack *t = (AliESDtrack*)
fTrackArray->At(it);
1892 Double_t dPhi = TMath::Abs(axis[j]-t->Phi());
1893 Double_t dEta = TMath::Abs(leadEta-t->Eta());
1894 if(dPhi >
kPI) dPhi = 2*
kPI - dPhi;
1895 if(TMath::Sqrt(dPhi*dPhi+dEta*dEta)<0.4)
1900 if(TMath::Abs(leadEta-0.4)<0.7 && axis[j]>80*TMath::DegToRad()+0.4 && axis[j]<180*TMath::DegToRad()-0.4)
1911 if(!(TMath::Abs(leadEta-0.4)<0.7 && axis[j]>80*TMath::DegToRad()+0.4 && axis[j]<180*TMath::DegToRad()-0.4))
continue;
1914 for(
Int_t ic=0; ic<nclusters; ic++)
1916 AliESDCaloCluster * cl = (AliESDCaloCluster *)
fClusterArray->At(ic);
1918 cl->GetMomentum(gamma, vertex);
1920 if(clsPhi<0) clsPhi += 2*
kPI;
1921 Double_t dPhi = TMath::Abs(axis[j]-clsPhi);
1922 Double_t dEta = TMath::Abs(leadEta-gamma.Eta());
1923 if(dPhi >
kPI) dPhi = 2*
kPI - dPhi;
1924 if(TMath::Sqrt(dPhi*dPhi+dEta*dEta)<0.4)
1926 ueChNe += gamma.Pt();
1940 for(
Int_t j=0; j<2; j++)
1942 Double_t ueCh = 0, ueChNe = 0., ueChNe2 = 0.;
1943 for(
Int_t ipos=0; ipos<npart; ipos++)
1946 if(!vParticle)
continue;
1947 Double_t dPhi = TMath::Abs(axis[j]-vParticle->Phi());
1948 Double_t dEta = TMath::Abs(leadEta-vParticle->Eta());
1949 if(dPhi >
kPI) dPhi = 2*
kPI - dPhi;
1950 if(TMath::Sqrt(dPhi*dPhi+dEta*dEta)<0.4)
1956 if( vParticle->Charge()!=0 )
1965 if(pt>0.5) ueChNe2 += pt;
1984 if(jet->Pt()<1)
return kFALSE;
1985 if(TMath::Abs(jet->Eta())>(0.7-rad))
return kFALSE;
1986 if(jet->Phi() < (80*TMath::DegToRad()+rad) || jet->Phi() > (180*TMath::DegToRad()-rad) )
return kFALSE;
1999 std::vector<fastjet::PseudoJet> constituents = jetFinder->
GetJetConstituents(jetIndex);
2003 for(
UInt_t ic=0; ic<constituents.size(); ic++)
2005 if(constituents[ic].perp()>maxPt)
2007 maxPt = constituents[ic].perp();
2012 z =
GetZ(constituents[index].px(),constituents[index].py(),constituents[index].pz(),jetsIncl[jetIndex].px(),jetsIncl[jetIndex].py(),jetsIncl[jetIndex].pz());
2023 return (trkPx*jetPx+trkPy*jetPy+trkPz*jetPz)/(jetPx*jetPx+jetPy*jetPy+jetPz*jetPz);
2034 std::vector<fastjet::PseudoJet> constituents = jetFinder->
GetJetConstituents(jetIndex);
2035 for(
UInt_t ic=0; ic<constituents.size(); ic++)
2037 if(constituents[ic].user_index()>0)
2039 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents[ic].user_index()-1);
2040 jetSigma2 += TMath::Power(track->Pt()*track->Pt()*TMath::Sqrt(track->GetSigma1Pt2()),2);
2044 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(constituents[ic].user_index()*(-1)-1);
2045 jetSigma2 += TMath::Power(cluster->GetTOF(),2);
2048 return TMath::Sqrt(jetSigma2);
2062 Double_t jetPt = jetsIncl[jetIndex].perp();
2065 printf(
"Warning: can't get the mean # of tracks per jet with pt=%f in: trigger=%d, radiusIndex=%d\n",jetPt,
fTriggerType,radiusIndex);
2071 printf(
"Warning: no sampling distrubtion for jet with pt=%f\n",jetPt);
2078 if(pro1<res) nTrk++;
2079 for(
Int_t itry=0; itry<nTrk; itry++)
2085 if(pro>eff) misspt += trkPt;
2098 if(!vParticle)
return kFALSE;
2099 if(!
fMC->IsPhysicalPrimary(ipart))
return kFALSE;
2100 if (TMath::Abs(vParticle->Eta())>2)
return kFALSE;
2112 dEta=-999, dPhi=-999;
2114 for(
UInt_t ij=0; ij<jets_incl.size(); ij++)
2116 if(jets_incl[ij].perp()<5)
continue;
2117 if(TMath::Abs(jets_incl[ij].eta())>1)
continue;
2118 Double_t tmpR = TMath::Sqrt( TMath::Power(jet.eta()-jets_incl[ij].eta(), 2) + TMath::Power(jet.phi()-jets_incl[ij].phi(), 2) );
2123 dEta = jet.eta()-jets_incl[ij].eta();
2124 dPhi = jet.phi()-jets_incl[ij].phi();
2137 Int_t matchedIndex = -1;
2138 std::vector<fastjet::PseudoJet> jetsIncl1 = jetFinder1->
GetInclusiveJets();
2139 std::vector<fastjet::PseudoJet> jetsIncl2 = jetFinder2->
GetInclusiveJets();
2140 std::vector<fastjet::PseudoJet> constituents1 = jetFinder1->
GetJetConstituents(index1);
2141 Double_t jetPt1 = jetsIncl1[index1].perp();
2142 if(jetPt1<0)
return matchedIndex;
2144 for(
UInt_t ij2=0; ij2<jetsIncl2.size(); ij2++)
2146 Double_t jetPt2 = jetsIncl2[ij2].perp();
2147 if(jetPt2<0)
return matchedIndex;
2149 Double_t sharedPt1 = 0., sharedPt2 = 0.;
2150 for(
UInt_t ic2=0; ic2<constituents2.size(); ic2++)
2152 Int_t mcLabel = constituents2[ic2].user_index()-1;
2153 Double_t consPt2 = constituents2[ic2].perp();
2154 for(
UInt_t ic1=0; ic1<constituents1.size(); ic1++)
2156 Double_t consPt1 = constituents1[ic1].perp();
2157 if(constituents1[ic1].user_index()>0)
2159 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(constituents1[ic1].user_index()-1);
2160 if(track->GetLabel()==mcLabel) {sharedPt2 += consPt2; sharedPt1 += consPt1; cout<<
"Found a matched track"<<endl;
break;}
2164 AliESDCaloCluster *cluster = (AliESDCaloCluster *)
fClusterArray->At(constituents1[ic1].user_index()*(-1)-1);
2165 if(cluster->GetLabel()==mcLabel) {sharedPt2 += consPt2; sharedPt1 += consPt1; cout<<
"Found a matched cluster"<<endl;
break;}
2169 cout<<sharedPt1/jetPt1<<
" "<<sharedPt2/jetPt2<<endl;
2170 if(sharedPt1/jetPt1 > fraction && sharedPt2/jetPt2 > fraction)
2176 return matchedIndex;
2186 Int_t nTrax =
fESD->GetNumberOfTracks();
2187 if(
fVerbosity>5) printf(
"[i] # of tracks in event: %d\n",nTrax);
2189 for (
Int_t i = 0; i < nTrax; ++i)
2191 AliESDtrack* esdtrack =
fESD->GetTrack(i);
2194 AliError(Form(
"Couldn't get ESD track %d\n", i));
2199 if(!newtrack)
continue;
2218 newtrack->SetIntegratedLength(esdtrack->Pt());
2234 AliESDtrack *newTrack = 0x0;
2240 newTrack =
new AliESDtrack(*esdtrack);
2241 newTrack->SetTRDQuality(0);
2245 if(esdtrack->GetConstrainedParam())
2247 newTrack =
new AliESDtrack(*esdtrack);
2248 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
2249 newTrack->Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
2250 newTrack->SetTRDQuality(1);
2257 if(esdtrack->GetConstrainedParam())
2259 newTrack =
new AliESDtrack(*esdtrack);
2260 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
2261 newTrack->Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
2262 newTrack->SetTRDQuality(2);
2276 newTrack = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(
fESD),esdtrack->GetID());
2277 if(!newTrack)
return 0x0;
2278 AliExternalTrackParam exParam;
2279 Bool_t relate = newTrack->RelateToVertexTPC(
fESD->GetPrimaryVertexSPD(),
fESD->GetMagneticField(),kVeryBig,&exParam);
2285 newTrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
2286 newTrack->SetTRDQuality(1);
2297 newTrack =
new AliESDtrack(*esdtrack);
2298 newTrack->SetTRDQuality(0);
2321 if (!TGeoGlobalMagField::Instance()->GetField())
fESD->InitMagneticField();
2327 const Int_t nCaloClusters =
fESD->GetNumberOfCaloClusters();
2328 for(
Int_t i = 0 ; i < nCaloClusters; i++)
2330 AliESDCaloCluster * cl = (AliESDCaloCluster *)
fESD->GetCaloCluster(i);
2332 AliESDCaloCluster *newCluster =
new AliESDCaloCluster(*cl);
2334 {
delete newCluster;
continue;}
2337 if(
fPeriod.Contains(
"lhc11a",TString::kIgnoreCase))
2339 Double_t newE = newCluster->E() * 1.02;
2340 newCluster->SetE(newE);
2347 newCluster->SetE(newE);
2351 if(
fPeriod.Contains(
"lhc12a15a",TString::kIgnoreCase))
fhClsE[0]->Fill(newCluster->E());
2360 newCluster->SetE(newE);
2370 newCluster->SetE(newE);
2378 newCluster->SetE(newE);
2390 Double_t subE = 0., eRes = 0., mcSubE = 0, MIPE = 0.;
2395 if(clsE<0) {
delete newCluster;
continue;}
2396 newCluster->SetE(clsE);
2397 newCluster->SetTOF(eRes);
2398 newCluster->SetDispersion(subE);
2399 newCluster->SetEmcCpvDistance(MIPE);
2400 newCluster->SetDistanceToBadChannel(mcSubE);
2423 if(!cluster)
return kFALSE;
2424 if (!cluster->IsEMCAL())
return kFALSE;
2443 Double_t subE = 0., sumTrkPt = 0., sumTrkP = 0.;
2445 TArrayI *matched = cluster->GetTracksMatched();
2446 if(!matched)
return 0;
2447 for(
Int_t im=0; im<matched->GetSize(); im++)
2449 Int_t trkIndex = matched->At(im);
2450 if(trkIndex<0 || trkIndex>=
fESD->GetNumberOfTracks())
continue;
2451 Bool_t isSelected = kFALSE;
2455 AliESDtrack *tr = (AliESDtrack*)
fTrackArray->At(j);
2456 if( trkIndex == tr->GetID() )
2463 if(!isSelected)
continue;
2465 AliESDtrack *track = (AliESDtrack*)
fTrackArray->At(index);
2467 sumTrkPt += track->Pt(); sumTrkP += track->P();
2475 eRes += TMath::Power(track->Pt()*track->Pt()*TMath::Sqrt(track->GetSigma1Pt2()),2);
2482 MIPE += (trkP>0.27)?0.27:trkP;
2492 eRes += TMath::Power(track->Pt()*track->Pt()*TMath::Sqrt(track->GetSigma1Pt2()),2);
2499 eRes += TMath::Power(
fFractionHC*track->Pt()*track->Pt()*TMath::Sqrt(track->GetSigma1Pt2()),2);
2508 Double_t fraction[4] = {0.3,0.5,0.7,1.0};
2509 for(
Int_t j=0; j<4; j++)
2511 Double_t subETmp = sumTrkP*fraction[j];
2512 if(subETmp>cluster->E()) subETmp = cluster->E();
2517 eRes = TMath::Sqrt(eRes);
2519 if(
fIsMC && nTrack>0)
2522 TArrayI* labels = cluster->GetLabelsArray();
2525 for(
Int_t il=0; il<labels->GetSize(); il++)
2527 Int_t ipart = labels->At(il);
2528 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
2530 AliVParticle* vParticle =
fMC->GetTrack(ipart);
2531 if(vParticle->Charge()==0)
2533 neutralE += vParticle->E();
2538 mcSubE = cluster->E() - neutralE;
2557 if(!cluster)
return -1;
2558 AliVCaloCells *cells = (AliVCaloCells*)
fESD->GetEMCALCells();
2559 if(!cells)
return -1;
2562 Int_t iSupMod = -1, absID = -1, ieta = -1, iphi = -1,iTower = -1, iIphi = -1, iIeta = -1;
2564 fRecoUtil->GetMaxEnergyCell(
fGeom, cells, cluster, absID, iSupMod, ieta, iphi, share);
2565 fGeom->GetCellIndex(absID,iSupMod,iTower,iIphi,iIeta);
2566 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
2568 Int_t absID1 =
fGeom-> GetAbsCellIdFromCellIndexes(iSupMod, iphi+1, ieta);
2569 Int_t absID2 =
fGeom-> GetAbsCellIdFromCellIndexes(iSupMod, iphi-1, ieta);
2570 Int_t absID3 =
fGeom-> GetAbsCellIdFromCellIndexes(iSupMod, iphi, ieta+1);
2571 Int_t absID4 =
fGeom-> GetAbsCellIdFromCellIndexes(iSupMod, iphi, ieta-1);
2573 Float_t ecell = 0, ecell1 = 0, ecell2 = 0, ecell3 = 0, ecell4 = 0;
2574 Double_t tcell = 0, tcell1 = 0, tcell2 = 0, tcell3 = 0, tcell4 = 0;
2575 Bool_t accept = 0, accept1 = 0, accept2 = 0, accept3 = 0, accept4 = 0;
2578 accept =
fRecoUtil->AcceptCalibrateCell(absID, bc, ecell ,tcell ,cells);
2580 if(!accept)
return -1;
2582 if(ecell < 0.5)
return -1;
2584 accept1 =
fRecoUtil->AcceptCalibrateCell(absID1,bc, ecell1,tcell1,cells);
2585 accept2 =
fRecoUtil->AcceptCalibrateCell(absID2,bc, ecell2,tcell2,cells);
2586 accept3 =
fRecoUtil->AcceptCalibrateCell(absID3,bc, ecell3,tcell3,cells);
2587 accept4 =
fRecoUtil->AcceptCalibrateCell(absID4,bc, ecell4,tcell4,cells);
2589 const Double_t exoticCellDiffTime = 1e6;
2590 if(TMath::Abs(tcell-tcell1)*1.e9 > exoticCellDiffTime) ecell1 = 0 ;
2591 if(TMath::Abs(tcell-tcell2)*1.e9 > exoticCellDiffTime) ecell2 = 0 ;
2592 if(TMath::Abs(tcell-tcell3)*1.e9 > exoticCellDiffTime) ecell3 = 0 ;
2593 if(TMath::Abs(tcell-tcell4)*1.e9 > exoticCellDiffTime) ecell4 = 0 ;
2595 Float_t eCross = ecell1+ecell2+ecell3+ecell4;
2597 return 1-eCross/ecell;
2611 AliGenEventHeader *head =
dynamic_cast<AliGenEventHeader*
>(
fMC->GenEventHeader());
2614 AliError(
"Could not get the event header");
2618 AliGenPythiaEventHeader *headPy =
dynamic_cast<AliGenPythiaEventHeader*
>(head);
2621 if (headPy->Trials() > 0)
2623 fhNTrials[0]->Fill(0.5,headPy->Trials());
2638 Info(
"Terminate",
"Terminate");
2639 AliAnalysisTaskSE::Terminate();
2653 Int_t isTrigger = 0;
2654 Int_t ncl =
fESD->GetNumberOfCaloClusters();
2655 for(
Int_t icl=0; icl<ncl; icl++)
2658 AliESDCaloCluster *cluster =
fESD->GetCaloCluster(icl);
2666 cluster->SetChi2(1);
2669 cluster->SetChi2(0);
2686 AliVCaloCells *cells = (AliVCaloCells*)
fESD->GetEMCALCells();
2687 Int_t iSupMod = -1, absID = -1, ieta = -1, iphi = -1,iTower = -1, iIphi = -1, iIeta = -1;
2689 fRecoUtil->GetMaxEnergyCell(
fGeom, cells, cluster, absID, iSupMod, ieta, iphi, share);
2690 fGeom->GetCellIndex(absID,iSupMod,iTower,iIphi,iIeta);
2691 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
2693 Int_t gphi = iphi + 24*(iSupMod/2);
2694 Int_t geta = ieta + 48*(iSupMod%2);
2696 Int_t fphi = gphi / 2;
2697 Int_t feta = geta / 2;
2702 if(clsE>10) pro = 1;
2724 cluster->GetPosition(pos);
2725 TVector3 clsVec(pos[0],pos[1],pos[2]);
2728 fGeom->SuperModuleNumberFromEtaPhi(clsVec.Eta(), clsVec.Phi(), sMod);
2755 Double_t ptBound[4] = {0, 0.5, 3.8, 300};
2757 for(
Int_t i=0; i<3; i++)
2759 if( inPt < ptBound[i+1] && inPt >= ptBound[i])
2775 Double_t resolution = track->Pt()*track->Pt()*TMath::Sqrt(track->GetSigma1Pt2());
2791 const Int_t nColsModule = 2;
2792 const Int_t nRowsModule = 5;
2793 const Int_t nRowsFeeModule = 24;
2794 const Int_t nColsFeeModule = 48;
2795 const Int_t nColsFaltroModule = 24;
2796 const Int_t nRowsFaltroModule = 12;
2799 Int_t trigtimes[30], globCol, globRow, ntimes;
2800 Int_t trigger[nColsFaltroModule*nColsModule][nRowsFaltroModule*nRowsModule];
2803 for(
Int_t i = 0; i < nColsFaltroModule*nColsModule; i++ )
2805 for(
Int_t j = 0; j < nRowsFaltroModule*nRowsModule; j++ )
2811 Int_t fTrigCutLow = 7, fTrigCutHigh = 10, trigInCut = 0;
2812 AliESDCaloTrigger * fCaloTrigger =
fESD->GetCaloTrigger(
"EMCAL" );
2814 if( fCaloTrigger->GetEntries() > 0 )
2817 fCaloTrigger->Reset();
2818 while( fCaloTrigger->Next() )
2820 fCaloTrigger->GetPosition( globCol, globRow );
2821 fCaloTrigger->GetNL0Times( ntimes );
2822 if( ntimes < 1 )
continue;
2823 fCaloTrigger->GetL0Times( trigtimes );
2826 for(
Int_t i = 0; i < ntimes; i++ )
2828 if( trigtimes[i] > fTrigCutLow && trigtimes[i] < fTrigCutHigh )
2833 if(trigInCut==1) trigger[globCol][globRow] = 1;
2842 Int_t absID = -1, nSupMod=-1, nModule=-1, nIphi=-1, nIeta=-1, iphi=-1, ieta=-1, gphi=-1, geta=-1, feta=-1, fphi=-1;
2844 AliVCaloCells *cells = (AliVCaloCells*)
fESD->GetEMCALCells();
2845 for(
Int_t icl=0; icl<
fESD->GetNumberOfCaloClusters(); icl++)
2847 AliESDCaloCluster *cluster =
fESD->GetCaloCluster(icl);
2848 if(!cluster || !cluster->IsEMCAL())
continue;
2849 cluster->SetChi2(0);
2853 fRecoUtil->GetMaxEnergyCell(
fGeom, cells, cluster, absID, nSupMod, ieta, iphi, share);
2854 fGeom->GetCellIndex(absID,nSupMod,nModule, nIphi, nIeta);
2855 fGeom->GetCellPhiEtaIndexInSModule(nSupMod,nModule, nIphi, nIeta, iphi, ieta);
2856 gphi = iphi + nRowsFeeModule*(nSupMod/2);
2857 geta = ieta + nColsFeeModule*(nSupMod%2);
2863 nCell = cluster->GetNCells();
2864 cellAddrs = cluster->GetCellsAbsId();
2865 for( iCell = 0; iCell < nCell; iCell++ )
2868 fGeom->GetCellIndex( cellAddrs[iCell], nSupMod, nModule, nIphi, nIeta );
2869 fGeom->GetCellPhiEtaIndexInSModule( nSupMod,nModule, nIphi, nIeta, iphi, ieta);
2872 gphi = iphi + nRowsFeeModule*(nSupMod/2);
2873 geta = ieta + nColsFeeModule*(nSupMod%2);
2879 if( trigger[feta][fphi] == 1)
2881 cluster->SetChi2(1);
2898 const char *trackCutName[3] = {
"Hybrid tracks",
"TPCOnly tracks",
"Golden tracks"};
2899 const char *triggerType[2] = {
"MB",
"EMC"};
2900 const char *decision[2] = {
"no",
"yes"};
2901 const char *recombination[] = {
"E_scheme",
"pt_scheme",
"pt2_scheme",
"Et_scheme",
"Et2_scheme",
"BIpt_scheme",
"BIpt2_scheme"};
2902 const char *type[2] = {
"local",
"grid"};
2905 printf(
"\n\n=================================\n");
2906 printf(
"======WARNING: HC is ingored!======\n");
2907 printf(
"====== NOT for PHYSICS! ======\n\n");
2909 printf(
"Run period: %s\n",
fPeriod.Data());
2912 printf(
"Is this MC data: %s\n",decision[
fIsMC]);
2913 printf(
"Only find charged jets in MC: %s\n",decision[
fChargedMC]);
2914 printf(
"Analyze on local or grid? %s\n",type[
fAnaType]);
2917 printf(
"Is K0 and n included: %s\n",decision[1-
fRejectNK]);
2920 for(
Int_t i=0; i<2; i++)
2922 printf(
"Track pt cut: %s -> %2.2f < pT < %2.1f\n",triggerType[i],
fTrkPtMin[i],
fTrkPtMax[i]);
2924 for(
Int_t i=0; i<2; i++)
2926 printf(
"Cluster selection: %s -> %2.2f < Et < %2.1f\n",triggerType[i],
fClsEtMin[i],
fClsEtMax[i]);
2931 printf(
"Use only good SM (1,2,6,7,8,9) for trigger: %s\n",decision[
fUseGoodSM]);
2938 printf(
"Jet radius: %s\n",
fRadius.Data());
2943 printf(
"Systematics: tracking efficiency: %s with variation %1.0f%%\n",decision[
fSysTrkEff],
fVaryTrkEff*100);
2946 printf(
"Systematics: EMCal non-linearity: %s\n",decision[
fSysNonLinearity]);
2949 printf(
"Smear lhc12a15a: %s\n",decision[
fSmearMC]);
2950 printf(
"Run UE analysis: %s\n",decision[
fRunUE]);
2952 printf(
"=======================================\n\n");
2963 Int_t nCls =
fESD->GetNumberOfCaloClusters();
2964 for(
Int_t icl=0; icl<nCls; icl++)
2966 AliESDCaloCluster *cluster =
fESD->GetCaloCluster(icl);
2967 if(!cluster)
continue;
2968 if (!cluster->IsEMCAL())
continue;
2969 if(
fRecoUtil->IsExoticCluster(cluster, (AliVCaloCells*)
fESD->GetEMCALCells()) && cluster->E()>leadingE)
2971 leadingE = cluster->E();
2985 const AliESDVertex* vtx =
fESD->GetPrimaryVertex();
2986 if (!vtx || vtx->GetNContributors()<1)
return kFALSE;
3009 Bool_t isGoodVtx = kTRUE;
3010 AliESDVertex* goodvtx =
const_cast<AliESDVertex*
>(
fESD->GetPrimaryVertexTracks());
3011 if(!goodvtx || goodvtx->GetNContributors()<1)
3012 goodvtx = const_cast<AliESDVertex*>(
fESD->GetPrimaryVertexSPD());
3013 if(!goodvtx || !goodvtx->GetStatus()) isGoodVtx = kFALSE;
3015 if( isPrimaryVtx && !isGoodVtx )
3027 Int_t lTriggerType = -1;
3028 if (trigger & AliVEvent::kMB) lTriggerType = 1;
3029 if (trigger & AliVEvent::kFastOnly) lTriggerType = 0;
3030 if (trigger & AliVEvent::kEMC1) lTriggerType = 2;
3031 if(lTriggerType==-1)
return;
3044 AliESDCaloCells *cells =
fESD->GetEMCALCells();
3045 Short_t nCells = cells->GetNumberOfCells();
3046 Int_t nCellCount[2] = {0,0};
3047 for(
Int_t iCell=0; iCell<nCells; iCell++)
3049 Int_t cellId = cells->GetCellNumber(iCell);
3050 Double_t cellE = cells->GetCellAmplitude(cellId);
3051 Int_t sMod =
fGeom->GetSuperModuleNumber(cellId);
3053 if(sMod==3 || sMod==4)
3056 nCellCount[sMod-3]++;
3061 if(
fPeriod.CompareTo(
"lhc11a")==0)
3063 if (nCellCount[1] > 100)
3066 if (runN>=146858 && runN<=146860)
Bool_t HasPrimaryVertex() const
Bool_t fRunUE
Random number generator.
Int_t RunOfflineTrigger()
TH2F * fhJetPtWithClsThres[2][kNRadii]
pt of jets containing tracks above certian threshold
Bool_t IsGoodCluster(AliESDCaloCluster *cluster)
TH2F * fhJetResolutionNK[2][kNRadii]
Jet response due to missing weakly decayed particles using response matrix.
TH2F * fhHCTrkPtAmbig[2][kNRadii][5]
Cleanly subtracted charged pt.
TH1F * fhUEJetPtNorm[3][2][2]
Leading jet pt vs constituent pt in underlying event.
TH3F * fhJetPtVsZ[3][kNRadii]
Leading charged constituent Z vs jet pt.
Bool_t fFindChargedOnlyJet
TH1F * fhJetPtInExoticEvent[2][kNRadii]
Jet pt vs Fcross vs Zleading.
TH2F * fhJetResponseNKSM[2][kNRadii]
Jet resolution due to missing weakly decayed particles using response matrix.
TH2F * fhHCTrkPtClean[2][kNRadii][5]
f*subtracted cluster energy vs jet pt
AliESDtrackCuts * fEsdTrackCuts
Reco utility.
void AnalyzeSecondaryContributionViaMatching(AliFJWrapper *jetFinder, const Int_t r, const Int_t type, const Int_t etaCut)
TH1F * fEventZ[2]
Generated event vertex z.
Bool_t fElectronRejection
Bool_t fSaveQAHistos
Output list.
TH1F * fhEventStatTPCVtx
Event counts used for jet analysis.
TClonesArray * fMcTruthAntikt[kNRadii]
Jet finder for particle jets.
virtual void CopySettingsFrom(const AliFJWrapper &wrapper)
Bool_t fRejectExoticTrigger
TH1F * fhSysClusterE[2][2]
Jets in full TPC acceptance in events with TPC only vertex.
Bool_t fRejectExoticCluster
TH3F * fhFcrossVsZleading[2][kNRadii]
Error made by hadronic correction assessed by using particle jet.
AliESDtrack * GetAcceptTrack(AliESDtrack *esdtrack)
TH2F * fhNeutralPtInJet[3][kNRadii]
Subtracted energy due to hadronic correction.
TH2F * fhJetResponseNK[2][kNRadii]
Energy fraction lost due to weakly decaying particles.
TH2F * fhChargedPtInJet[3][kNRadii]
pt of neutral constituents in jet
TH2F * fhTrigNeuPtInJet[3][kNRadii]
pt of neutral constituents in jet
void SetMaxRap(Double_t maxrap)
TH2F * fhUEJetPtVsSumPt[3][2][2]
Jet pt in exotic events.
Double_t GetLeadingZ(const Int_t jetIndex, AliFJWrapper *jetFinder)
void SetRecombScheme(const fastjet::RecombinationScheme &scheme)
Bool_t IsTPCOnlyVtx() const
TF1 * fTriggerEfficiency[10]
Trigger turn-on curves of EMCal clusters.
void FillAODJets(TClonesArray *fJetArray, AliFJWrapper *jetFinder, const Bool_t isTruth=0)
TH2F * fhSysNCellVsClsE[2][2]
Cluster energy distribution before and after hadonic correction.
Bool_t IsElectron(AliESDtrack *track, Double_t clsE) const
AliFJWrapper * fDetJetFinder[3][2][kNRadii]
void FindDetJets(const Int_t s=0, const Int_t a=0, const Int_t r=0)
void UserCreateOutputObjects()
TH2F * fhJetResponseWP[2][kNRadii]
Jet response due to missing neutron and K0L using response matrix.
TH2F * fhSubClsEVsJetPt[2][kNRadii][5]
pT distribution of pions detected
TH1F * fJetCount[3][kNRadii]
Jet NPart fraction.
Double_t GetSmearedTrackPt(AliESDtrack *track)
Int_t GetClusterSuperModule(AliESDCaloCluster *cluster)
THnSparse * fJetEnergyFraction[3][kNRadii]
Contribution of low pt particles to jet energy.
TClonesArray * fJetTCA[3][2][kNRadii]
Jet finder.
Double_t GetZ(const Double_t trkPx, const Double_t trkPy, const Double_t trkPz, const Double_t jetPx, const Double_t jetPy, const Double_t jetPz) const
const std::vector< fastjet::PseudoJet > & GetInclusiveJets() const
ClassImp(AliAnalysisTaskFullppJet) const Float_t kRadius[3]
Bool_t fIsMC
Array of MC particles.
Bool_t IsLEDEvent() const
void GetESDEMCalClusters()
TH1F * fhClsE[2]
Leading jet normalization.
Double_t GetExoticEnergyFraction(AliESDCaloCluster *cluster)
TH1F * fhNTrials[2]
reconstructed event vertex z
Bool_t fHadronicCorrection
Double_t GetJetArea(UInt_t idx) const
TH1D * fTriggerCurve[10]
Offline trigger mask.
TObjArray * fClusterArray
Array of input tracks.
void CheckTPCOnlyVtx(const UInt_t trigger)
TH2F * fhJetResponseWPSM[2][kNRadii]
Jet response due to missing neutron and K0L via matching.
void RunAnalyzeUE(AliFJWrapper *jetFinder, const Int_t type, const Bool_t isMCTruth)
Double_t SubtractClusterEnergy(AliESDCaloCluster *cluster, Double_t &eRes, Double_t &MIPE, Double_t &MCsubE)
void SetAlgorithm(const fastjet::JetAlgorithm &algor)
Double_t GetJetMissPtDueToTrackingEfficiency(const Int_t jetIndex, AliFJWrapper *jetFinder, const Int_t radiusIndex)
TH2F * fhJetResolutionWP[2][kNRadii]
Jet resolution due to missing neutron and K0L using response matrix.
Double_t fHCLowerPtCutMIP
TH1F * fhJetEventStat
Event counts to keep track of rejection criteria.
Bool_t fSysJetTrigEff
Response matrix for secondary particles.
AliEMCALGeometry * fGeom
Fit of trigger turn-on curves for EMCal clusters above 4-5 GeV.
Double_t fVaryClusterERes
TList * fOutputList
TCA of MC truth anti-kt jets.
AliEMCALRecoUtils * fRecoUtil
EMCal goemetry utility.
TH2F * fhJetPtWithTrkThres[2][kNRadii]
Jet pt vs track pt contribution vs track class.
virtual void Clear(const Option_t *="")
AliMCEvent * fMC
AOD object.
AliFJWrapper * fTrueJetFinder[kNRadii]
Parameterazation of momentum resolution estimated from data.
virtual ~AliAnalysisTaskFullppJet()
TH2F * fhSecondaryResponse[3]
Double_t GetOfflineTriggerProbability(AliESDCaloCluster *cluster)
Double_t fVaryClusterEScale
TH2F * fhChLeadZVsJetPt[2][kNRadii]
pt of leading charged constituents in jet
TH2F * fhUEJetPtVsConsPt[3][2][2]
Leading jet pt vs underlying event pt.
Bool_t fIsExoticEvent5GeV
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
TH3F * fRelTrkCon[2][kNRadii]
Jet pt vs constituent Z vs constituent type.
AliStack * fStack
MC object.
TH2F * fhNKFracVsJetPt[2][kNRadii]
NCell vs cluster energy before and after hadonic correction.
AliAnalysisTaskFullppJet()
void UserExec(Option_t *option)
TH3F * fhJetResolutionWPSM[2][kNRadii]
Jet resolution due to missing neutron and K0L via matching.
TArrayI * fMcPartArray
Array of input clusters.
TF1 * fClusterEResolution
std::vector< fastjet::PseudoJet > GetJetConstituents(UInt_t idx) const
TH2F * fhSubEVsTrkPt[2][4]
of matched tracks per cluster
Bool_t fIsEventTriggerBit
Double_t GetTrkEff(Double_t inPt)
TObjArray * fTrackArray
MC stack.
TH1F * fVertexGenZ[2]
Check if the chunk is corrupted.
Int_t GetParentParton(const Int_t ipart)
TH3F * fhJetResolutionNKSM[2][kNRadii]
Jet response due to missing weakly decayed particles via matching.
Bool_t fSysClusterEScale
Non-linearity correction functions for data.
Int_t FindEnergyMatchedJet(AliFJWrapper *jetFinder1, const Int_t index1, AliFJWrapper *jetFinder2, const Double_t fraction=0.5)
TH2F * fhLeadNePtInJet[3][kNRadii]
pt of charged constituents in jet
void ProcessMC(const Int_t r=0)
AliESDtrackCuts * fHybridTrackCuts1
TH2F * fhJetPtVsLowPtCons[2][kNRadii][2]
pt of jets containing clusters above certian threshold
Int_t fRecombinationScheme
AliESDtrackCuts * fHybridTrackCuts2
Bool_t fConstrainChInEMCal
TCA of jets: in - akt - r.
TH1F * fhChunkQA
Event counts for TPC only vertices.
Bool_t IsGoodJet(fastjet::PseudoJet jet, Double_t radius)
Bool_t IsPrimaryVertexOk() const
Int_t FindSpatialMatchedJet(fastjet::PseudoJet jet, AliFJWrapper *jetFinder, Double_t &dEta, Double_t &dPhi, Double_t maxR)
virtual void AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index=-99999)
TH1F * fhCorrTrkEffPtBin[2][kNRadii]
Fit function of tracking efficiency.
void CheckEventTriggerBit()
void Terminate(Option_t *)
Bool_t fFindNeutralOnlyJet
TH3F * fhJetInTPCOnlyVtx[2][kNRadii]
Cluster energy distribution.
Bool_t IsGoodMcPartilce(const AliVParticle *vParticle, const Int_t ipart)
TH2F * fHCOverSubE[kNRadii][5]
Ambiguously subtracted charged pt.
Double_t GetMeasuredJetPtResolution(const Int_t jetIndex, AliFJWrapper *jetFinder)
TH1F * fhCorrTrkEffSample[2][kNRadii][kNBins]
Number of tracks per jet pt bin, used to correct the tracking efficiency explicitly.
TH2F * fHCOverSubEFrac[kNRadii][5]
Error made by hadronic correction assessed by using particle jet.
void AnalyzeSecondaryContribution(AliFJWrapper *jetFinder, const Int_t r, const Int_t etaCut)
TH2F * fhWeakFracVsJetPt[2][kNRadii]
Energy fraction lost due to missing neutron and K0L.
TRandom3 * fRandomGen
Tracking efficiency estimated from simulation.
THnSparse * fJetNPartFraction[3][kNRadii]
Jet energy fraction.
Bool_t fIsExoticEvent3GeV
TH1F * fhNMatchedTrack[2]
of trials
TH2F * fhLeadChPtInJet[3][kNRadii]
pt of leading neutral constituents in jet
TList * OpenFile(const char *fname)
void AnalyzeJets(AliFJWrapper *jetFinder, const Int_t type, const Int_t r)