11 #include "AliAnalysisManager.h"
12 #include "AliInputEventHandler.h"
13 #include "AliVEvent.h"
14 #include "AliVTrack.h"
15 #include "AliVTrdTrack.h"
16 #include "AliVVertex.h"
17 #include "AliPIDResponse.h"
18 #include "AliEventPoolManager.h"
19 #include "AliOADBContainer.h"
20 #include "AliTOFPIDParams.h"
21 #include "AliAnalysisTaskVnV0.h"
24 #include "AliMCEvent.h"
25 #include "AliGenPythiaEventHeader.h"
28 #include "AliESDEvent.h"
29 #include "AliESDInputHandler.h"
30 #include "AliESDtrack.h"
31 #include "AliESDtrackCuts.h"
32 #include "AliESDTrdTrack.h"
33 #include "AliESDTrdTracklet.h"
34 #include "AliESDTrdTrigger.h"
37 #include "AliAODEvent.h"
38 #include "AliAODJet.h"
39 #include "AliAODTrack.h"
42 #include "AliAnalysisTaskJetServices.h"
43 #include "AliAnalysisHelperJetTasks.h"
45 #include "AliAnalysisTaskJetProtonCorr.h"
50 AliAnalysisTaskJetProtonCorr::AliAnalysisTaskJetProtonCorr(const char *name) :
51 AliAnalysisTaskSE(name),
56 fOADBContainerTOF(0x0),
62 fCentralityCheck(100.),
66 fEventPlaneAngleCheck(5.),
74 fShortTaskId("jet_prot_corr"),
75 fUseStandardCuts(kTRUE),
77 fCutsTwoTrackEff(0.02),
82 fTrgJetLeadTrkPtMin(5.),
85 fTrgAngleToEvPlane(TMath::Pi() / 4.),
86 fTrgJetPhiModCent(new TF1("jetphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
87 fTrgJetPhiModSemi(new TF1("jetphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
88 fTrgHadPhiModCent(new TF1("hadphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
89 fTrgHadPhiModSemi(new TF1("hadphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi()))
93 fkCorrTypeName[kCorrHadHad] = "hh";
94 fkCorrTypeName[kCorrHadProt] = "hp";
95 fkCorrTypeName[kCorrJetHad] = "jh";
96 fkCorrTypeName[kCorrJetProt] = "jp";
97 fkCorrTypeName[kCorrRndJetHad] = "rjh";
98 fkCorrTypeName[kCorrRndJetProt] = "rjp";
99 fkCorrTypeName[kCorrRndHadHad] = "rhh";
100 fkCorrTypeName[kCorrRndHadProt] = "rhp";
101 fkCorrTypeName[kCorrRndJetExcHad] = "rjeh";
102 fkCorrTypeName[kCorrRndJetExcProt] = "rjep";
103 fkCorrTypeName[kCorrRndHadExcHad] = "rheh";
104 fkCorrTypeName[kCorrRndHadExcProt] = "rhep";
106 fkClassName[kClCentral] = "cent";
107 fkClassName[kClSemiCentral] = "semi";
108 // fkClassName[kClDijet] = "dijet";
110 fkEvName[kEvSame] = "same";
111 fkEvName[kEvMix] = "mixed";
114 if (fUseStandardCuts) {
115 fCutsPrim = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE);
117 fCutsPrim = new AliESDtrackCuts();
119 // this is taken from PWGJE track cuts
120 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
121 fCutsPrim->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
122 fCutsPrim->SetMinNClustersTPC(70);
123 fCutsPrim->SetMaxChi2PerClusterTPC(4);
124 fCutsPrim->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
125 fCutsPrim->SetAcceptKinkDaughters(kFALSE);
126 fCutsPrim->SetRequireTPCRefit(kTRUE);
127 fCutsPrim->SetMaxFractionSharedTPCClusters(0.4);
129 fCutsPrim->SetRequireITSRefit(kTRUE);
131 fCutsPrim->SetMaxDCAToVertexXY(2.4);
132 fCutsPrim->SetMaxDCAToVertexZ(3.2);
133 fCutsPrim->SetDCAToVertex2D(kTRUE);
135 fCutsPrim->SetMaxChi2PerClusterITS(36);
136 fCutsPrim->SetMaxChi2TPCConstrainedGlobal(36);
138 fCutsPrim->SetRequireSigmaToVertex(kFALSE);
140 fCutsPrim->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
143 fCutsPrim->SetEtaRange(-0.9, 0.9);
144 fCutsPrim->SetPtRange(0.15, 1E+15);
146 fTrgJetPhiModCent->SetParameter(0, .05);
147 fTrgJetPhiModSemi->SetParameter(0, .20);
148 fTrgHadPhiModCent->SetParameter(0, .05);
149 fTrgHadPhiModSemi->SetParameter(0, .20);
152 Double_t centralityBins[] = {
153 0., 2., 4., 6., 8., 10., // central
154 30., 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., // semi-central
157 Int_t nCentralityBins = sizeof(centralityBins)/sizeof(centralityBins[0]);
159 Double_t vertexBins[] = {
160 -10., -8., -6., -4., -2., 0., 2., 4., 6., 8., 10.
162 Int_t nVertexBins = sizeof(vertexBins)/sizeof(vertexBins[0]);
164 Double_t psiBins[12];
165 Int_t nPsiBins = sizeof(psiBins)/sizeof(psiBins[0]);
166 for (Int_t iBin = 0; iBin < nPsiBins; ++iBin)
167 psiBins[iBin] = iBin * TMath::Pi()/nPsiBins;
169 const Int_t poolSize = 10; // unused by current event pool implementation
170 const Int_t trackDepth = 1000; // number of tracks to maintain in mixing buffer
171 const Float_t trackDepthFraction = 0.1;
172 const Int_t targetEvents = 1;
173 // for (Int_t iTrg = 0; iTrg < kTrgLast; ++iTrg) {
174 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
175 GetPoolMgr((Ass_t) iAss) =
176 new AliEventPoolManager(poolSize, trackDepth,
177 nCentralityBins, centralityBins,
178 nVertexBins, vertexBins);
179 // nPsiBins, psiBins);
180 GetPoolMgr((Ass_t) iAss)->SetTargetValues(trackDepth, trackDepthFraction, targetEvents);
184 fHistCorr = new AliHistCorr*[kEvLast*kCorrLast*kClLast];
186 DefineOutput(1, TList::Class());
189 AliAnalysisTaskJetProtonCorr::~AliAnalysisTaskJetProtonCorr()
193 // delete [] fHistCorr;
196 void AliAnalysisTaskJetProtonCorr::UserCreateOutputObjects()
198 // create user output objects
200 // open OADB file and retrieve the OADB container with TOF parameters
201 TString oadbFileName =
202 TString::Format("%s/COMMON/PID/data/TOFPIDParams.root", AliAnalysisManager::GetOADBPath());
203 TFile *oadbFile = TFile::Open(oadbFileName);
204 if(!oadbFile->IsOpen())
205 AliFatal(Form("Cannot open OADB file %s", oadbFileName.Data()));
206 AliOADBContainer *oadbContainer =
207 (AliOADBContainer*) oadbFile->Get("TOFoadb");
209 AliFatal("Cannot fetch OADB container for VZERO EP selection");
210 fOADBContainerTOF = new AliOADBContainer(*oadbContainer);
216 fOutputList = new TList();
217 fOutputList->SetOwner();
221 TH1 *histStat = AddHistogram(ID(kHistStat), "event statistics;;counts",
222 kStatLast-1, .5, kStatLast-.5);
223 histStat->GetXaxis()->SetBinLabel(ID(kStatSeen));
224 histStat->GetXaxis()->SetBinLabel(ID(kStatTrg));
225 histStat->GetXaxis()->SetBinLabel(ID(kStatVtx));
226 histStat->GetXaxis()->SetBinLabel(ID(kStatEvCuts));
227 histStat->GetXaxis()->SetBinLabel(ID(kStatUsed));
228 histStat->GetXaxis()->SetBinLabel(ID(kStatCent));
229 histStat->GetXaxis()->SetBinLabel(ID(kStatEvPlane));
230 histStat->GetXaxis()->SetBinLabel(ID(kStatPID));
231 histStat->GetXaxis()->SetBinLabel(ID(kStatCentral));
232 histStat->GetXaxis()->SetBinLabel(ID(kStatSemiCentral));
234 AddHistogram(ID(kHistVertexNctb), "number of vertex contributors;N_{ctb};counts",
236 AddHistogram(ID(kHistVertexZ), "z-position of primary vertex;z (cm);counts",
239 AddHistogram(ID(kHistCentrality), "centrality;C;counts",
241 hist = AddHistogram(ID(kHistCentralityUsed), "centrality used;C;event class",
243 kClLast, -.5, kClLast-.5);
244 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
245 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
246 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
247 AddHistogram(ID(kHistCentralityCheck), "centrality check;C;counts",
249 hist = AddHistogram(ID(kHistCentralityCheckUsed), "centrality check used;C;event class",
251 kClLast, -.5, kClLast-.5);
252 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
253 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
254 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
255 AddHistogram(ID(kHistCentralityVsMult), "centrality - multiplicity;centrality percentile (%);N_{prim}",
259 AddHistogram(ID(kHistSignalTPC), "TPC dE/dx;p (GeV/c);dE/dx (arb. units)",
260 100, 0., 10., 200, 0., 300.);
261 AddHistogram(ID(kHistSignalTOF), "TOF time of flight;p_{T} (GeV/c);t (ns)",
262 100, 0., 10., 200, 0., 50.);
263 AddHistogram(ID(kHistBetaTOF), "TOF beta;p (GeV/c); #beta",
267 AddHistogram(ID(kHistDeltaTPC), "TPC dE/dx;p (GeV/c);dE/dx (arb. units)",
268 100, 0., 10., 200, -100., 100.);
269 AddHistogram(ID(kHistDeltaTPCSemi), "TPC dE/dx;p (GeV/c);dE/dx (arb. units)",
270 100, 0., 10., 200, -100., 100.);
271 AddHistogram(ID(kHistDeltaTOF), "TOF time of flight;p (GeV/c);t (ns)",
272 100, 0., 10., 200, -2., 2.);
273 AddHistogram(ID(kHistDeltaTOFSemi), "TOF time of flight;p (GeV/c);t (ns)",
274 100, 0., 10., 200, -2., 2.);
276 // Nsigma templates - central
277 AddHistogram(ID(kHistNsigmaTPCe), "TPC N#sigma - e hypothesis;p (GeV/c)",
280 AddHistogram(ID(kHistNsigmaTPCmu), "TPC N#sigma - #mu hypothesis;p (GeV/c)",
283 AddHistogram(ID(kHistNsigmaTPCpi), "TPC N#sigma - #pi hypothesis;p (GeV/c)",
286 AddHistogram(ID(kHistNsigmaTPCk), "TPC N#sigma - K hypothesis;p (GeV/c)",
289 AddHistogram(ID(kHistNsigmaTPCp), "TPC N#sigma - p hypothesis;p (GeV/c)",
292 AddHistogram(ID(kHistNsigmaTPCd), "TPC N#sigma - d hypothesis;p (GeV/c)",
295 AddHistogram(ID(kHistNsigmaTPCe_e), "TPC N#sigma - e hypothesis (id. e);p (GeV/c)",
299 AddHistogram(ID(kHistNsigmaTOFe), "TOF N#sigma - e hypothesis;p (GeV/c)",
302 AddHistogram(ID(kHistNsigmaTOFmu), "TOF N#sigma - #mu hypothesis;p (GeV/c)",
305 AddHistogram(ID(kHistNsigmaTOFpi), "TOF N#sigma - #pi hypothesis;p (GeV/c)",
308 AddHistogram(ID(kHistNsigmaTOFk), "TOF N#sigma - K hypothesis;p (GeV/c)",
311 AddHistogram(ID(kHistNsigmaTOFp), "TOF N#sigma - p hypothesis;p (GeV/c)",
314 AddHistogram(ID(kHistNsigmaTOFd), "TOF N#sigma - d hypothesis;p (GeV/c)",
317 AddHistogram(ID(kHistNsigmaTOFmismatch), "TOF N#sigma - mismatch;p (GeV/c)",
321 // Nsigma templates - semi-central
322 AddHistogram(ID(kHistNsigmaTPCeSemi), "TPC N#sigma - e hypothesis;p (GeV/c)",
325 AddHistogram(ID(kHistNsigmaTPCmuSemi), "TPC N#sigma - #mu hypothesis;p (GeV/c)",
328 AddHistogram(ID(kHistNsigmaTPCpiSemi), "TPC N#sigma - #pi hypothesis;p (GeV/c)",
331 AddHistogram(ID(kHistNsigmaTPCkSemi), "TPC N#sigma - K hypothesis;p (GeV/c)",
334 AddHistogram(ID(kHistNsigmaTPCpSemi), "TPC N#sigma - p hypothesis;p (GeV/c)",
337 AddHistogram(ID(kHistNsigmaTPCdSemi), "TPC N#sigma - d hypothesis;p (GeV/c)",
340 AddHistogram(ID(kHistNsigmaTPCe_eSemi), "TPC N#sigma - e hypothesis (id. e);p (GeV/c)",
344 AddHistogram(ID(kHistNsigmaTOFeSemi), "TOF N#sigma - e hypothesis;p (GeV/c)",
347 AddHistogram(ID(kHistNsigmaTOFmuSemi), "TOF N#sigma - #mu hypothesis;p (GeV/c)",
350 AddHistogram(ID(kHistNsigmaTOFpiSemi), "TOF N#sigma - #pi hypothesis;p (GeV/c)",
353 AddHistogram(ID(kHistNsigmaTOFkSemi), "TOF N#sigma - K hypothesis;p (GeV/c)",
356 AddHistogram(ID(kHistNsigmaTOFpSemi), "TOF N#sigma - p hypothesis;p (GeV/c)",
359 AddHistogram(ID(kHistNsigmaTOFdSemi), "TOF N#sigma - d hypothesis;p (GeV/c)",
362 AddHistogram(ID(kHistNsigmaTOFmismatchSemi), "TOF N#sigma - mismatch;p (GeV/c)",
367 AddHistogram(ID(kHistDeltaTOFe), "TOF #Delta;p (GeV/c);t (ns)",
368 100, 0., 10., 200, -2., 2.);
369 AddHistogram(ID(kHistDeltaTOFmu), "TOF #Delta;p (GeV/c);t (ns)",
370 100, 0., 10., 200, -2., 2.);
371 AddHistogram(ID(kHistDeltaTOFpi), "TOF #Delta;p (GeV/c);t (ns)",
372 100, 0., 10., 200, -2., 2.);
373 AddHistogram(ID(kHistDeltaTOFk), "TOF #Delta;p (GeV/c);t (ns)",
374 100, 0., 10., 200, -2., 2.);
375 AddHistogram(ID(kHistDeltaTOFp), "TOF #Delta;p (GeV/c);t (ns)",
376 100, 0., 10., 200, -2., 2.);
377 AddHistogram(ID(kHistDeltaTOFd), "TOF #Delta;p (GeV/c);t (ns)",
378 100, 0., 10., 200, -2., 2.);
380 AddHistogram(ID(kHistDeltaTOFeSemi), "TOF #Delta;p (GeV/c);t (ns)",
381 100, 0., 10., 200, -2., 2.);
382 AddHistogram(ID(kHistDeltaTOFmuSemi), "TOF #Delta;p (GeV/c);t (ns)",
383 100, 0., 10., 200, -2., 2.);
384 AddHistogram(ID(kHistDeltaTOFpiSemi), "TOF #Delta;p (GeV/c);t (ns)",
385 100, 0., 10., 200, -2., 2.);
386 AddHistogram(ID(kHistDeltaTOFkSemi), "TOF #Delta;p (GeV/c);t (ns)",
387 100, 0., 10., 200, -2., 2.);
388 AddHistogram(ID(kHistDeltaTOFpSemi), "TOF #Delta;p (GeV/c);t (ns)",
389 100, 0., 10., 200, -2., 2.);
390 AddHistogram(ID(kHistDeltaTOFdSemi), "TOF #Delta;p (GeV/c);t (ns)",
391 100, 0., 10., 200, -2., 2.);
394 // AddHistogram(ID(kHistExpSigmaTOFe), "TOF time of flight;p (GeV/c);t (ns)",
395 // 100, 0., 10., 200, 0., .25);
396 // AddHistogram(ID(kHistExpSigmaTOFmu), "TOF time of flight;p (GeV/c);t (ns)",
397 // 100, 0., 10., 200, 0., .25);
398 // AddHistogram(ID(kHistExpSigmaTOFpi), "TOF time of flight;p (GeV/c);t (ns)",
399 // 100, 0., 10., 200, 0., .25);
400 // AddHistogram(ID(kHistExpSigmaTOFk), "TOF time of flight;p (GeV/c);t (ns)",
401 // 100, 0., 10., 200, 0., .25);
402 // AddHistogram(ID(kHistExpSigmaTOFp), "TOF time of flight;p (GeV/c);t (ns)",
403 // 100, 0., 10., 200, 0., .25);
404 // AddHistogram(ID(kHistExpSigmaTOFd), "TOF time of flight;p (GeV/c);t (ns)",
405 // 100, 0., 10., 200, 0., .25);
407 // AddHistogram(ID(kHistExpSigmaTOFeSemi), "TOF time of flight;p (GeV/c);t (ns)",
408 // 100, 0., 10., 200, 0., .25);
409 // AddHistogram(ID(kHistExpSigmaTOFmuSemi), "TOF time of flight;p (GeV/c);t (ns)",
410 // 100, 0., 10., 200, 0., .25);
411 // AddHistogram(ID(kHistExpSigmaTOFpiSemi), "TOF time of flight;p (GeV/c);t (ns)",
412 // 100, 0., 10., 200, 0., .25);
413 // AddHistogram(ID(kHistExpSigmaTOFkSemi), "TOF time of flight;p (GeV/c);t (ns)",
414 // 100, 0., 10., 200, 0., .25);
415 // AddHistogram(ID(kHistExpSigmaTOFpSemi), "TOF time of flight;p (GeV/c);t (ns)",
416 // 100, 0., 10., 200, 0., .25);
417 // AddHistogram(ID(kHistExpSigmaTOFdSemi), "TOF time of flight;p (GeV/c);t (ns)",
418 // 100, 0., 10., 200, 0., .25);
420 // AddHistogram(ID(kHistCmpSigmaTOFe), "#sigma comparison;exp #sigma;template #sigma",
421 // 200, 0., .25, 200, 0., .25);
422 // AddHistogram(ID(kHistCmpSigmaTOFmu), "#sigma comparison;exp #sigma;template #sigma",
423 // 200, 0., .25, 200, 0., .25);
424 // AddHistogram(ID(kHistCmpSigmaTOFpi), "#sigma comparison;exp #sigma;template #sigma",
425 // 200, 0., .25, 200, 0., .25);
426 // AddHistogram(ID(kHistCmpSigmaTOFk), "#sigma comparison;exp #sigma;template #sigma",
427 // 200, 0., .25, 200, 0., .25);
428 // AddHistogram(ID(kHistCmpSigmaTOFp), "#sigma comparison;exp #sigma;template #sigma",
429 // 200, 0., .25, 200, 0., .25);
430 // AddHistogram(ID(kHistCmpSigmaTOFd), "#sigma comparison;exp #sigma;template #sigma",
431 // 200, 0., .25, 200, 0., .25);
433 // AddHistogram(ID(kHistCmpSigmaTOFeSemi), "#sigma comparison;exp #sigma;template #sigma",
434 // 200, 0., .25, 200, 0., .25);
435 // AddHistogram(ID(kHistCmpSigmaTOFmuSemi), "#sigma comparison;exp #sigma;template #sigma",
436 // 200, 0., .25, 200, 0., .25);
437 // AddHistogram(ID(kHistCmpSigmaTOFpiSemi), "#sigma comparison;exp #sigma;template #sigma",
438 // 200, 0., .25, 200, 0., .25);
439 // AddHistogram(ID(kHistCmpSigmaTOFkSemi), "#sigma comparison;exp #sigma;template #sigma",
440 // 200, 0., .25, 200, 0., .25);
441 // AddHistogram(ID(kHistCmpSigmaTOFpSemi), "#sigma comparison;exp #sigma;template #sigma",
442 // 200, 0., .25, 200, 0., .25);
443 // AddHistogram(ID(kHistCmpSigmaTOFdSemi), "#sigma comparison;exp #sigma;template #sigma",
444 // 200, 0., .25, 200, 0., .25);
446 // Nsigma distributions
447 AddHistogram(ID(kHistNsigmaTPCTOF), "N#sigma TPC-TOF;p (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
451 AddHistogram(ID(kHistNsigmaTPCTOFPt), "N#sigma TPC-TOF;p_{T} (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
455 AddHistogram(ID(kHistNsigmaTPCTOFUsed), "N#sigma TPC-TOF;p (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
459 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentral), "N#sigma TPC-TOF (central);p (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
463 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentral), "N#sigma TPC-TOF (semi-central);p (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
467 AddHistogram(ID(kHistNsigmaTPCTOFUsedPt), "N#sigma TPC-TOF;p_{T} (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
471 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtCentral), "N#sigma TPC-TOF;p_{T} (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
475 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtSemiCentral), "N#sigma TPC-TOF;p_{T} (GeV/c);N#sigma_{TPC};N#sigma_{TOF}",
480 AddHistogram(ID(kHistEvPlane), "default event plane;#Psi;counts",
481 100, -0. * TMath::Pi(), 1. * TMath::Pi());
482 AddHistogram(ID(kHistEvPlaneUsed), "default event plane;#Psi;counts",
483 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
484 kClLast, -.5, kClLast-.5);
485 AddHistogram(ID(kHistEvPlaneCheck), "backup event plane;#Psi;counts",
486 100, -1. * TMath::Pi(), 1. * TMath::Pi());
487 AddHistogram(ID(kHistEvPlaneCheckUsed), "backup event plane;#Psi;counts",
488 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
489 kClLast, -.5, kClLast-.5);
490 AddHistogram(ID(kHistEvPlaneCorr), "default - backup event plane;#Psi_{def};#Psi_{bak};event class",
491 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
492 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
493 kClLast, -.5, kClLast-.5);
494 AddHistogram(ID(kHistEvPlaneCorrNoTrgJets), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
495 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
496 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
497 kClLast, -.5, kClLast-.5);
498 AddHistogram(ID(kHistEvPlaneCorrNoTrgJetsTrgd), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
499 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
500 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
501 kClLast, -.5, kClLast-.5);
503 AddHistogram(ID(kHistJetPtCentral), "jet spectrum - central;p_{T}^{jet,ch};counts",
505 AddHistogram(ID(kHistJetPtSemi), "jet spectrum - semi-peripheral;p_{T}^{jet,ch};counts",
508 AddHistogram(ID(kHistEtaPhiTrgHad), "trg had;#varphi;#eta",
509 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
511 AddHistogram(ID(kHistEtaPhiTrgJet), "trg jet;#varphi;#eta",
512 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
514 AddHistogram(ID(kHistEtaPhiAssHad), "ass had;#varphi;#eta",
515 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
517 AddHistogram(ID(kHistEtaPhiAssProt), "ass proton;#varphi;#eta",
518 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
521 AddHistogram(ID(kHistPhiTrgJetEvPlane), "trg jet;#varphi - #Psi_{ev};centrality",
522 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
524 AddHistogram(ID(kHistPhiTrgHadEvPlane), "trg had;#varphi - #Psi_{ev};centrality",
525 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
527 AddHistogram(ID(kHistPhiAssHadEvPlane), "ass had;#varphi - #Psi_{ev};centrality",
528 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
530 AddHistogram(ID(kHistPhiAssProtEvPlane), "ass prot;#varphi - #Psi_{ev};centrality",
531 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
533 AddHistogram(ID(kHistPhiAssHadVsEvPlane), "ass had;#Psi_{ev};#varphi;centrality",
534 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
535 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
538 for (Int_t iCorr = 0; iCorr < kCorrLast; ++iCorr) {
539 for (Int_t iCl = 0; iCl < kClLast; ++iCl) {
540 for (Int_t iEv = 0; iEv < kEvLast; ++iEv) {
541 // we don't need the mixed event histograms for the embedded excess particles
542 if ((iCorr > kCorrRndHadProt) && (iEv == kEvMix))
545 GetHistCorr((CorrType_t) iCorr, (Class_t) iCl, (Ev_t) iEv) =
546 new AliHistCorr(Form("corr_%s_%s_%s", fkCorrTypeName[iCorr], fkClassName[iCl], fkEvName[iEv]), fOutputList);
551 PostData(1, fOutputList);
554 Bool_t AliAnalysisTaskJetProtonCorr::Notify()
556 // actions to be taken upon notification about input file change
558 return AliAnalysisTaskSE::Notify();
561 void AliAnalysisTaskJetProtonCorr::SetParamsTOF()
564 dynamic_cast<AliTOFPIDParams*> (fOADBContainerTOF->GetObject(fRunNumber, "TOFparams"));
567 AliError(Form("failed to load TOF parameters for run %i", fRunNumber));
568 else if (fDebug > 2) {
569 printf("loaded TOF parameters for run %i\n",
571 printf(" intrinsic resolution: %f ps\n",
572 fParamsTOF->GetTOFresolution());
573 printf(" tail fraction: %f\n",
574 fParamsTOF->GetTOFtail());
575 printf(" start time method: %i\n",
576 fParamsTOF->GetStartTimeMethod());
577 printf(" TOF signal parametrization: %f, %f, %f, %f\n",
578 fParamsTOF->GetSigParams(0), fParamsTOF->GetSigParams(1),
579 fParamsTOF->GetSigParams(2), fParamsTOF->GetSigParams(3));
580 printf(" matching loss MC: %f%%\n",
581 fParamsTOF->GetTOFmatchingLossMC());
582 printf(" additional mismatch for MC: %f%%\n",
583 fParamsTOF->GetTOFadditionalMismForMC());
584 printf(" time offset: %f\n",
585 fParamsTOF->GetTOFtimeOffset());
589 void AliAnalysisTaskJetProtonCorr::UserExec(Option_t * /* option */)
593 // setup pointers to input data (null if unavailable)
595 // esdEvent: ESD input
596 // outEvent: AOD output
597 // aodEvent: AOD input if available, otherwise AOD output
599 fMCEvent = this->MCEvent();
600 fESDEvent = dynamic_cast<AliESDEvent*>(this->InputEvent()); // could also be AOD input
601 AliAODEvent* outEvent = this->AODEvent();
602 fAODEvent = dynamic_cast<AliAODEvent*> (this->InputEvent());
604 fAODEvent = outEvent;
606 if ((fDebug > 0) && fESDEvent)
607 printf("event: %s-%06i\n", CurrentFileName(), fESDEvent->GetEventNumberInFile());
609 // record number of sampled events and detect trigger contributions
610 FillH1(kHistStat, kStatSeen);
611 if (!DetectTriggers()) {
612 AliError("Failed to detect the triggers");
616 if (!IsTrigger(kTriggerInt))
619 FillH1(kHistStat, kStatTrg);
622 // (make sure it is cleaned up in the end)
623 if (PrepareEvent()) {
624 FillH1(kHistStat, kStatUsed);
625 FillH1(kHistCentrality, fCentrality);
626 FillH1(kHistCentralityCheck, fCentralityCheck);
628 FillH1(kHistVertexZ, fZvtx);
631 if (TMath::Abs(fZvtx) > 10.)
633 if (GetCentrality() > 90.)
636 FillH1(kHistStat, kStatEvCuts);
640 if (IsClass(kClCentral))
641 FillH1(kHistStat, kStatCentral);
642 if (IsClass(kClSemiCentral))
643 FillH1(kHistStat, kStatSemiCentral);
645 FillH1(kHistEvPlane, fEventPlaneAngle);
646 FillH1(kHistEvPlaneCheck, fEventPlaneAngleCheck);
647 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
648 if (IsClass((Class_t) iClass)) {
649 FillH2(kHistCentralityUsed, fCentrality, iClass);
650 FillH2(kHistCentralityCheckUsed, fCentralityCheck, iClass);
651 FillH2(kHistEvPlaneUsed, fEventPlaneAngle, iClass);
652 FillH2(kHistEvPlaneCheckUsed, fEventPlaneAngleCheck, iClass);
653 FillH3(kHistEvPlaneCorr, fEventPlaneAngle, fEventPlaneAngleCheck, iClass);
657 Bool_t corrEta = fPIDResponse->UseTPCEtaCorrection();
658 Bool_t corrMult = fPIDResponse->UseTPCMultiplicityCorrection();
660 // select trigger particles and potential associated particles/protons
661 TObjArray trgArray[kTrgLast];
662 TObjArray assArray[kAssLast];
664 TF1 fTOFsignal("fTOFsignal", &AliAnalysisTaskJetProtonCorr::TOFsignal, -2440., 2440., 4);
665 fTOFsignal.SetParameter(0, 1.);
666 fTOFsignal.SetParameter(1, 0.);
668 Float_t res = fParamsTOF->GetTOFresolution();
669 Float_t tail = fParamsTOF->GetTOFtail() * res;
670 fTOFsignal.SetParameter(2, res);
671 fTOFsignal.SetParameter(3, tail);
674 fTOFsignal.SetParameter(2, 85.);
675 fTOFsignal.SetParameter(3, 80.);
678 Int_t nPrimTracks = fPrimTrackArray ? fPrimTrackArray->GetEntries() : 0;
679 FillH2(kHistCentralityVsMult, fCentrality, nPrimTracks);
680 for (Int_t iTrack = 0; iTrack < nPrimTracks; ++iTrack) {
681 AliVTrack *trk = (AliVTrack*) fPrimTrackArray->At(iTrack);
682 FillH2(kHistSignalTPC, trk->P(), trk->GetTPCsignal());
684 FillH2(kHistSignalTOF, trk->P(), trk->GetTOFsignal() * 1.e-3); // ps -> ns
685 FillH3(kHistNsigmaTPCTOF,
687 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
688 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
689 FillH3(kHistNsigmaTPCTOFPt,
691 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
692 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
694 FillH3(kHistPhiAssHadVsEvPlane, fEventPlaneAngle, trk->Phi(), fCentrality);
695 Float_t phiRel = trk->Phi() - fEventPlaneAngle;
696 if (gRandom->Rndm() > .5)
697 phiRel -= TMath::Pi();
699 phiRel += 2. * TMath::Pi();
701 AliError(Form("phiRel = %f less than zero, from phi = %f, psi = %f",
702 phiRel, trk->Phi(), fEventPlaneAngle));
703 else if (phiRel > 2*TMath::Pi())
704 AliError(Form("phiRel = %f greater than 2pi, from phi = %f, psi = %f",
705 phiRel, trk->Phi(), fEventPlaneAngle));
707 if (AcceptTrigger(trk)) {
708 trgArray[kTrgHad].Add(trk);
709 FillH1(kHistEtaPhiTrgHad, trk->Phi(), trk->Eta());
711 if (AcceptAssoc(trk)) {
712 assArray[kAssHad].Add(trk);
713 FillH1(kHistEtaPhiAssHad, trk->Phi(), trk->Eta());
714 FillH2(kHistPhiAssHadEvPlane, phiRel, fCentrality);
715 FillH3(kHistNsigmaTPCTOFUsed,
717 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
718 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
719 FillH3(kHistNsigmaTPCTOFUsedPt,
721 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
722 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
723 if (IsClass(kClCentral)) {
724 FillH3(kHistNsigmaTPCTOFUsedCentral,
726 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
727 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
728 FillH3(kHistNsigmaTPCTOFUsedPtCentral,
730 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
731 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
733 if (IsClass(kClSemiCentral)) {
735 FillH1(kHistEtaPhiAssProt, trk->Phi(), trk->Eta());
736 FillH3(kHistNsigmaTPCTOFUsedSemiCentral,
738 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
739 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
740 FillH3(kHistNsigmaTPCTOFUsedPtSemiCentral,
742 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
743 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
746 assArray[kAssProt].Add(trk);
747 FillH1(kHistEtaPhiAssProt, trk->Phi(), trk->Eta());
748 FillH2(kHistPhiAssProtEvPlane, phiRel, fCentrality);
751 // template generation
753 fPIDResponse->GetSignalDelta(AliPIDResponse::kTPC, trk, AliPID::kProton, deltaTPC);
754 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) {
755 Double_t expTPC = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
756 Double_t expSigmaTPC = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
758 // loop over particles
759 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
760 Double_t expTPCx = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
761 Double_t expSigmaTPCx = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
762 Double_t rndTPCx = gRandom->Gaus(expTPCx, expSigmaTPCx);
764 if(IsClass(kClCentral)) {
765 FillH2(kHistNsigmaTPCe, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
766 FillH2(kHistDeltaTPC, trk->P(), deltaTPC);
768 if(IsClass(kClSemiCentral)) {
769 FillH2(kHistNsigmaTPCeSemi, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
770 FillH2(kHistDeltaTPCSemi, trk->P(), deltaTPC);
776 fPIDResponse->GetSignalDelta(AliPIDResponse::kTOF, trk, AliPID::kProton, deltaTOF);
777 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk) {
778 AliTOFPIDResponse &tofResponse = fPIDResponse->GetTOFResponse();
780 Float_t p = trk->P();
781 if (const AliExternalTrackParam *param = trk->GetInnerParam())
784 Double_t expTOF = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::kProton);
785 Double_t expSigmaTOF = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOF, AliPID::kProton);
786 Double_t length = trk->GetIntegratedLength() * 1.e-2; // cm -> m
787 Double_t tof = trk->GetTOFsignal() * 1.e-12; // ps -> s
788 Double_t beta = length / tof / TMath::C();
790 FillH2(kHistBetaTOF, p, beta);
792 // intrinsic TOF smearing
793 // Double_t signalSigma = TMath::Sqrt(fTOFsignal.Variance(-2000., 2000.));
794 Double_t signalSmear = fTOFsignal.GetRandom();
796 Float_t timezeroSigma = tofResponse.GetT0binRes(tofResponse.GetMomBin(p));
797 Double_t timezeroSmear = gRandom->Gaus(0., timezeroSigma);
798 // tracking smearing (default parameters, should be overwritten from OADB)
799 Double_t fPar[] = { 0.008, 0.008, 0.002, 40.0 };
801 for (Int_t i = 0; i < 4; ++i)
802 fPar[i] = fParamsTOF->GetSigParams(i);
804 // loop over particles
805 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
806 Double_t expTOFx = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle));
807 // Double_t cmpSigmaTOFx = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOFx, AliPID::EParticleType(iParticle));
810 Double_t massx = AliPID::ParticleMassZ(AliPID::EParticleType(iParticle));
811 Double_t dppx = fPar[0] + fPar[1] * p + fPar[2] * massx / p;
812 Double_t expSigmaTOFx = dppx * expTOFx / (1.+ p * p / (massx * massx));
813 Double_t texpSmearx = gRandom->Gaus(0., TMath::Sqrt(expSigmaTOFx * expSigmaTOFx + fPar[3]*fPar[3]/p/p));
814 // Double_t tmpSigmaTOFx = TMath::Sqrt(signalSigma*signalSigma +
815 // timezeroSigma*timezeroSigma +
816 // expSigmaTOFx*expSigmaTOFx + fPar[3]*fPar[3]/p/p);
817 // printf("sigma comparison %i, %f: %f, %f, %f -> %f vs %f\n",
818 // iParticle, expTOFx,
819 // signalSigma, // signal
820 // timezeroSigma, // timezero
821 // expSigmaTOFx, // tracking
822 // tmpSigmaTOFx, // total
823 // cmpSigmaTOFx); // from PID response
826 Double_t rndTOFx = expTOFx + signalSmear + timezeroSmear + texpSmearx;
828 if (IsClass(kClCentral)) {
829 FillH2(kHistNsigmaTOFe, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
830 FillH2(kHistDeltaTOFe, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
831 // FillH2(kHistExpSigmaTOFe, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
832 // FillH2(kHistCmpSigmaTOFe, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
834 if (IsClass(kClSemiCentral)) {
835 FillH2(kHistNsigmaTOFeSemi, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
836 FillH2(kHistDeltaTOFeSemi, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
837 // FillH2(kHistCmpSigmaTOFeSemi, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
838 // FillH2(kHistExpSigmaTOFeSemi, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
842 Double_t rndTOFmismatch = AliTOFPIDResponse::GetMismatchRandomValue(trk->Eta());
844 if(IsClass(kClCentral)) {
845 FillH2(kHistNsigmaTOFmismatch, p, (rndTOFmismatch - expTOF) / expSigmaTOF);
846 FillH2(kHistDeltaTOF, trk->P(), deltaTOF * 1.e-3); // ps -> ns
848 if(IsClass(kClSemiCentral)) {
849 FillH2(kHistNsigmaTOFmismatchSemi, p, (rndTOFmismatch - expTOF) / expSigmaTOF);
850 FillH2(kHistDeltaTOFSemi, trk->P(), deltaTOF * 1.e-3); // ps -> ns
856 // select trigger jet
857 // and remove them from the Q vector
858 Int_t nJets = fJetArray ? fJetArray->GetEntries() : 0;
859 TVector2 *qVector = fEventplane->GetQVector();
861 for (Int_t iJet = 0; iJet < nJets; ++iJet) {
862 AliAODJet *jet = (AliAODJet*) fJetArray->At(iJet);
864 if (AcceptTrigger(jet)) {
865 trgArray[kTrgJet].Add(jet);
866 FillH1(kHistEtaPhiTrgJet, jet->Phi(), jet->Eta());
869 Int_t nRefTracks = jet->GetRefTracks()->GetEntriesFast();
870 for (Int_t iTrack = 0; iTrack < nRefTracks; ++iTrack) {
871 AliVTrack *track = (AliVTrack*) jet->GetRefTracks()->At(iTrack);
874 TVector2 evplaneContrib(fEventplane->GetQContributionX(track),
875 fEventplane->GetQContributionY(track));
876 *qVector -= evplaneContrib;
882 // printf("event plane angle before/after removal of trigger jets: %f/%f, diff: %f\n",
883 // fEventPlaneAngle, qVector->Phi()/2., qVector->Phi()/2. - fEventPlaneAngle);
885 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
886 if (IsClass((Class_t) iClass)) {
887 FillH3(kHistEvPlaneCorrNoTrgJets, fEventPlaneAngle, qVector->Phi()/2., iClass);
888 if (trgArray[kTrgJet].GetEntriesFast() > 0)
889 FillH3(kHistEvPlaneCorrNoTrgJetsTrgd, fEventPlaneAngle, qVector->Phi()/2., iClass);
894 // invent a trigger jet/hadron and correlated associates
895 Float_t pFraction = assArray[kAssHad].GetEntries() > 0 ?
896 (Float_t) (assArray[kAssProt].GetEntries()) / assArray[kAssHad].GetEntries() :
898 GenerateRandom(&trgArray[kTrgJetRnd], &trgArray[kTrgHadRnd],
899 &assArray[kAssHadJetExc], &assArray[kAssProtJetExc],
900 &assArray[kAssHadHadExc], &assArray[kAssProtHadExc],
903 // correlate, both same and mixed event
904 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
905 if (IsClass((Class_t) iClass)) {
906 for (Int_t iTrg = 0; iTrg < kTrgLast; ++iTrg) {
907 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
909 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvSame, &trgArray[iTrg], &assArray[iAss]);
912 AliEventPool *pool = GetPool((Ass_t) iAss);
913 if (pool && pool->IsReady()) {
914 AliDebug(1, Form("----- using pool: %i %i %i -----", iClass, iTrg, iAss));
915 const Int_t nEvents = pool->GetCurrentNEvents();
916 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
917 TObjArray *assTracks = pool->GetEvent(iEvent);
918 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvMix, &trgArray[iTrg], assTracks, 1./nEvents);
924 // fill event pool for mixing
925 // >= 0: don't require a trigger in the event
926 // >= 1: require a trigger in the event
927 // if (trgArray[iTrg].GetEntries() >= 0) {
928 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
929 AliEventPool *pool = GetPool((Ass_t) iAss);
931 pool->UpdatePool(CloneTracks(&assArray[iAss]));
932 AliDebug(1, Form("----- updating pool: %i -----", iAss));
939 // correlate artificial triggers and associates
940 Correlate(kCorrRndJetExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssHadJetExc]);
941 Correlate(kCorrRndJetExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssProtJetExc]);
942 Correlate(kCorrRndHadExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssHadHadExc]);
943 Correlate(kCorrRndHadExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssProtHadExc]);
947 trgArray[kTrgJetRnd].Delete();
948 trgArray[kTrgHadRnd].Clear();
949 assArray[kAssHadJetExc].Delete();
950 assArray[kAssProtJetExc].Clear();
951 assArray[kAssHadHadExc].Delete();
952 assArray[kAssProtHadExc].Clear();
958 PostData(1, fOutputList);
961 void AliAnalysisTaskJetProtonCorr::Terminate(const Option_t * /* option */)
963 // actions at task termination
967 void AliAnalysisTaskJetProtonCorr::PrintTask(Option_t *option, Int_t indent) const
969 AliAnalysisTaskSE::PrintTask(option, indent);
971 std::cout << std::setw(indent) << " " << "using jet branch: " << fJetBranchName << std::endl;
974 Bool_t AliAnalysisTaskJetProtonCorr::DetectTriggers()
978 AliVEvent::EOfflineTriggerTypes physSel =
979 (AliVEvent::EOfflineTriggerTypes) ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
980 TString trgClasses = InputEvent()->GetFiredTriggerClasses();
983 if (physSel & (AliVEvent::kAnyINT | AliVEvent::kCentral | AliVEvent::kSemiCentral))
984 MarkTrigger(kTriggerInt);
989 Bool_t AliAnalysisTaskJetProtonCorr::DetectClasses()
994 MarkClass(kClCentral);
997 MarkClass(kClSemiCentral);
1002 Bool_t AliAnalysisTaskJetProtonCorr::PrepareEvent()
1004 Bool_t eventGood = kTRUE;
1006 // check for run change
1007 if (fRunNumber != InputEvent()->GetRunNumber()) {
1008 fRunNumber = InputEvent()->GetRunNumber();
1012 // retrieve z-vertex position
1014 const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
1016 FillH1(kHistStat, kStatVtx);
1017 FillH1(kHistVertexNctb, vtx->GetNContributors());
1018 if (vtx->GetNContributors() >= 3.)
1019 fZvtx = vtx->GetZ();
1022 // retrieve centrality
1023 AliCentrality *eventCentrality = InputEvent()->GetCentrality();
1024 if (eventCentrality) {
1025 fCentrality = eventCentrality->GetCentralityPercentile("V0M");
1026 fCentralityCheck = eventCentrality->GetCentralityPercentile("TRK");
1027 if (fCentrality >= 0.) {
1028 FillH1(kHistStat, kStatCent);
1030 // centrality estimation not reliable
1038 // retrieve event plane
1039 fEventplane = InputEvent()->GetEventplane();
1041 fEventPlaneAngle = fEventplane->GetEventplane("Q");
1042 fEventPlaneAngleCheck = fEventplane->GetEventplane("V0", InputEvent());
1043 // use V0 event plane angle from flow task:
1044 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0A();
1045 // printf("V0A evplane = %f\n", fEventPlaneAngleCheck);
1046 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0C();
1047 // printf("V0C evplane = %f\n", fEventPlaneAngleCheck);
1049 FillH1(kHistStat, kStatEvPlane);
1050 if (fEventPlaneAngleCheck < 0)
1051 fEventPlaneAngleCheck += TMath::Pi();
1057 fPIDResponse = ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
1059 FillH1(kHistStat, kStatPID);
1063 // retrieve primary tracks
1065 fPrimTrackArray = fCutsPrim->GetAcceptedTracks(fESDEvent);
1067 else if (fAODEvent) {
1068 fPrimTrackArray = new TObjArray();
1069 Int_t nTracksAOD = fAODEvent->GetNumberOfTracks();
1070 for (Int_t iTrack = 0; iTrack < nTracksAOD; ++iTrack) {
1071 AliAODTrack *trk = fAODEvent->GetTrack(iTrack);
1072 // 4: track cuts esdTrackCutsH ???
1074 if (trk->TestFilterMask(1 << 4))
1075 fPrimTrackArray->Add(trk);
1081 // retrieve jet array
1083 fJetArray = dynamic_cast<TClonesArray*> (fAODEvent->FindListObject(fJetBranchName));
1085 // still try the output event
1087 fJetArray = dynamic_cast<TClonesArray*> (AODEvent()->FindListObject(fJetBranchName));
1089 printf("no jet branch \"%s\" found, in the AODs are:\n", fJetBranchName);
1091 fAODEvent->GetList()->Print();
1093 AODEvent()->GetList()->Print();
1099 // retrieve event pool for the event category
1101 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1102 AliEventPoolManager *mgr = GetPoolMgr((Ass_t) iAss);
1103 GetPool((Ass_t) iAss) =
1104 // mgr ? mgr->GetEventPool(fCentrality, fZvtx, fEventPlaneAngle) : 0x0;
1105 mgr ? mgr->GetEventPool(fCentrality, fZvtx) : 0x0;
1112 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(AliVTrack *trg)
1114 // check pt interval
1116 (trg->Pt() >= fTrgPartPtMin) &&
1117 (trg->Pt() <= fTrgPartPtMax);
1119 // for semi-central events check phi w.r.t. event plane
1120 Bool_t acceptOrientation = IsSemiCentral() ?
1121 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1125 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1126 if (gRandom->Rndm() > .5)
1127 phiRel -= TMath::Pi();
1129 phiRel += 2. * TMath::Pi();
1130 FillH2(kHistPhiTrgHadEvPlane, phiRel, fCentrality);
1133 return (acceptPt && acceptOrientation);
1136 AliVTrack* AliAnalysisTaskJetProtonCorr::GetLeadingTrack(AliAODJet *jet) const
1138 // return leading track within a jet
1140 // check contributing tracks
1141 Int_t nJetTracks = jet->GetRefTracks()->GetEntriesFast();
1142 Int_t iLeadingTrack = -1;
1143 Float_t ptLeadingTrack = 0.;
1144 for (Int_t iTrack=0; iTrack < nJetTracks; ++iTrack) {
1145 AliAODTrack *track = (AliAODTrack*) jet->GetRefTracks()->At(iTrack);
1146 // find the leading track
1147 if (track->Pt() > ptLeadingTrack) {
1148 ptLeadingTrack = track->Pt();
1149 iLeadingTrack = iTrack;
1153 // retrieve the leading track
1154 return (AliAODTrack*) jet->GetRefTracks()->At(iLeadingTrack);
1157 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(AliAODJet *trg)
1160 if (TMath::Abs(trg->Eta()) > .5)
1163 // require hard leading track
1164 // (leading track biased jet sample)
1165 if (GetLeadingTrack(trg)->Pt() < fTrgJetLeadTrkPtMin)
1168 // check for jet orientation w.r.t. event plane
1169 // (constrained only for semi-central events)
1170 Bool_t acceptOrientation = IsSemiCentral() ?
1171 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1175 (trg->Pt() >= fTrgJetPtMin) &&
1176 (trg->Pt() <= fTrgJetPtMax);
1179 // store the azimuthal distribution relative to the event plane
1180 // for the jets in the pt range of interest
1181 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1182 if (gRandom->Rndm() > .5)
1183 phiRel -= TMath::Pi();
1185 phiRel += 2. * TMath::Pi();
1186 FillH2(kHistPhiTrgJetEvPlane, phiRel, fCentrality);
1189 if (acceptOrientation) {
1190 // spectrum for cross checks
1191 if (IsClass(kClCentral))
1192 FillH1(kHistJetPtCentral, trg->Pt());
1193 if (IsClass(kClSemiCentral))
1194 FillH1(kHistJetPtSemi, trg->Pt());
1197 return (acceptPt && acceptOrientation);
1200 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAssoc(AliVTrack *trk)
1202 if ((trk->Pt() > fAssPartPtMin) && (trk->Pt() < fAssPartPtMax) &&
1203 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) &&
1204 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk))
1205 if ((trk->GetTPCsignalN() >= 60.) &&
1206 (trk->GetTPCsignal() >= 10) &&
1207 (TMath::Abs(trk->Eta()) < .9))
1213 Bool_t AliAnalysisTaskJetProtonCorr::IsProton(AliVTrack *trk)
1215 Double_t nSigmaProtonTPC = fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton);
1216 Double_t nSigmaProtonTOF = fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton);
1218 if ((TMath::Abs(nSigmaProtonTPC) <= 2.) && (TMath::Abs(nSigmaProtonTOF) <= 2.)) {
1225 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAngleToEvPlane(Float_t phi, Float_t psi)
1227 Float_t deltaPhi = phi - psi;
1229 // map to interval [-pi/2, pi/2)
1230 deltaPhi = std::fmod(deltaPhi + TMath::Pi()/2., TMath::Pi()) - TMath::Pi()/2.;
1231 // printf("delta phi = %f with phi = %f, psi = %f\n", deltaPhi, phi, psi);
1233 if (TMath::Abs(deltaPhi) < fTrgAngleToEvPlane)
1239 Float_t AliAnalysisTaskJetProtonCorr::GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1,
1240 Float_t phi2, Float_t pt2, Float_t charge2,
1241 Float_t radius, Float_t bSign)
1243 // calculates dphistar
1244 // from AliUEHistograms
1246 Float_t dphistar = phi1 - phi2
1247 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1)
1248 + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
1250 static const Double_t kPi = TMath::Pi();
1254 dphistar = kPi * 2 - dphistar;
1255 if (dphistar < -kPi)
1256 dphistar = -kPi * 2 - dphistar;
1257 if (dphistar > kPi) // might look funny but is needed
1258 dphistar = kPi * 2 - dphistar;
1264 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTwoTracks(AliVParticle *trgPart, AliVParticle *assPart)
1266 // apply two track pair cut
1268 Float_t phi1 = trgPart->Phi();
1269 Float_t pt1 = trgPart->Pt();
1270 Float_t charge1 = trgPart->Charge();
1272 Float_t phi2 = assPart->Phi();
1273 Float_t pt2 = assPart->Pt();
1274 Float_t charge2 = assPart->Charge();
1276 Float_t deta = trgPart->Eta() - assPart->Eta();
1278 Float_t bSign = (InputEvent()->GetMagneticField() > 0) ? 1 : -1;
1281 if (TMath::Abs(deta) < fCutsTwoTrackEff) {
1282 // check first boundaries to see if is worth to loop and find the minimum
1283 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
1284 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
1286 const Float_t kLimit = fCutsTwoTrackEff * 3;
1288 Float_t dphistarminabs = 1e5;
1289 // Float_t dphistarmin = 1e5;
1290 if ((TMath::Abs(dphistar1) < kLimit) ||
1291 (TMath::Abs(dphistar2) < kLimit) ||
1292 (dphistar1 * dphistar2 < 0)) {
1293 for (Double_t rad=0.8; rad<2.51; rad+=0.01) {
1294 Float_t dphistarabs = TMath::Abs(GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign));
1295 if (dphistarabs < dphistarminabs)
1296 dphistarminabs = dphistarabs;
1299 if (dphistarminabs < fCutsTwoTrackEff)
1307 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(CorrType_t corr, Class_t cl, Ev_t ev,
1308 TCollection *trgArray, TCollection *assArray, Float_t weight)
1310 AliHistCorr *histCorr = GetHistCorr(corr, cl, ev);
1312 AliError(Form("no correlation histograms for corr %i, cl %i, ev %i",
1317 TIter assIter(assArray);
1318 while (TObject *assObj = assIter()) {
1319 if (dynamic_cast<AliVParticle*> (assObj)) {
1320 AliVParticle *assPart = (AliVParticle*) assObj;
1321 histCorr->Ass(assPart->Phi(), assPart->Eta(), weight);
1323 else if (dynamic_cast<TLorentzVector*> (assObj)) {
1324 TLorentzVector *assVec = (TLorentzVector*) assObj;
1325 histCorr->Ass(assVec->Phi(), assVec->Eta(), weight);
1329 TIter trgIter(trgArray);
1330 while (TObject *trgObj = trgIter()) {
1331 if (AliVParticle *trgPart = dynamic_cast<AliVParticle*> (trgObj)) {
1332 // count the trigger
1333 histCorr->Trigger(trgPart->Phi(), trgPart->Eta(), weight);
1335 // loop over associates
1337 while (TObject *assObj = assIter()) {
1338 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1339 if (AcceptTwoTracks(trgPart, assPart))
1340 histCorr->Fill(trgPart, assPart, weight);
1342 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1343 AliFatal(Form("got %p, but not implemented", assVec));
1347 else if (TLorentzVector *trgVec = dynamic_cast<TLorentzVector*> (trgObj)) {
1348 // count the trigger
1349 histCorr->Trigger(trgVec->Phi(), trgVec->Eta(), weight);
1351 // loop over associates
1353 while (TObject *assObj = assIter()) {
1354 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1355 histCorr->Fill(trgVec, assPart, weight);
1357 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1358 histCorr->Fill(trgVec, assVec, weight);
1367 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(Trg_t trg, Ass_t ass, Class_t cl, Ev_t ev,
1368 TCollection *trgArray, TCollection *assArray, Float_t weight)
1370 CorrType_t corr = (CorrType_t) (2 * trg + ass);
1372 return Correlate(corr, cl, ev, trgArray, assArray, weight);
1375 Bool_t AliAnalysisTaskJetProtonCorr::GenerateRandom(TCollection *trgJetArray,
1376 TCollection *trgHadArray,
1377 TCollection *assHadJetArray,
1378 TCollection *assProtJetArray,
1379 TCollection *assHadHadArray,
1380 TCollection *assProtHadArray,
1383 // generate random direction
1385 Float_t meanNoPart = 10;
1386 Int_t nPart = gRandom->Poisson(meanNoPart);
1388 Float_t trgJetEta = gRandom->Uniform(-.5, .5);
1389 Float_t trgJetPhi = 0.;
1390 if (IsClass(kClSemiCentral)) {
1392 trgJetPhi = fTrgJetPhiModSemi->GetRandom();
1393 } while (!AcceptAngleToEvPlane(trgJetPhi, 0));
1394 trgJetPhi += fEventPlaneAngle;
1396 trgJetPhi += 2. * TMath::Pi();
1397 else if (trgJetPhi > 2. * TMath::Pi())
1398 trgJetPhi -= 2. * TMath::Pi();
1401 trgJetPhi = fTrgJetPhiModCent->GetRandom();
1404 // generate one trigger particle
1405 TLorentzVector *trgJet = new TLorentzVector();
1406 trgJet->SetPtEtaPhiM(50., trgJetEta, trgJetPhi, .14);
1407 trgJetArray->Add(trgJet);
1409 // generate direction for away side
1410 Float_t trgJetEtaAway = gRandom->Uniform(-.9, .9);
1411 Float_t trgJetPhiAway = trgJetPhi + TMath::Pi() + gRandom->Gaus(0., .2);
1413 // generate associated particles
1414 // with proton/hadron ratio observed in this event
1415 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1416 Float_t deltaEta, deltaPhi;
1417 const Float_t r = .8;
1419 deltaEta = gRandom->Uniform(-r, r);
1420 deltaPhi = gRandom->Uniform(-r, r);
1421 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1423 TLorentzVector *assPart = new TLorentzVector();
1424 Float_t eta = trgJetEtaAway + deltaEta;
1425 Float_t phi = trgJetPhiAway + deltaPhi;
1431 phi += 2. * TMath::Pi();
1432 else if (phi > 2. * TMath::Pi())
1433 phi -= 2. * TMath::Pi();
1434 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1435 assHadJetArray->Add(assPart);
1436 if (gRandom->Uniform() < pFraction)
1437 assProtJetArray->Add(assPart);
1441 Float_t trgHadEta = gRandom->Uniform(-.9, .9);
1442 Float_t trgHadPhi = 0.;
1443 if (IsClass(kClSemiCentral)) {
1445 trgHadPhi = fTrgHadPhiModSemi->GetRandom();
1446 } while (!AcceptAngleToEvPlane(trgHadPhi, 0));
1447 trgHadPhi += fEventPlaneAngle;
1449 trgHadPhi += 2. * TMath::Pi();
1450 else if (trgHadPhi > 2. * TMath::Pi())
1451 trgHadPhi -= 2. * TMath::Pi();
1454 trgHadPhi = fTrgHadPhiModCent->GetRandom();
1457 // generate one trigger particle
1458 TLorentzVector *trgHad = new TLorentzVector();
1459 trgHad->SetPtEtaPhiM(50., trgHadEta, trgHadPhi, .14);
1460 trgHadArray->Add(trgHad);
1462 // generate direction for away side
1463 Float_t trgHadEtaAway = gRandom->Uniform(-.9, .9);
1464 Float_t trgHadPhiAway = trgHadPhi + TMath::Pi() + gRandom->Gaus(0., .2);
1466 // generate associated particles
1467 // with proton/hadron ratio observed in this event
1468 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1469 Float_t deltaEta, deltaPhi;
1470 const Float_t r = .8;
1472 deltaEta = gRandom->Uniform(-r, r);
1473 deltaPhi = gRandom->Uniform(-r, r);
1474 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1476 TLorentzVector *assPart = new TLorentzVector();
1477 Float_t eta = trgHadEtaAway + deltaEta;
1478 Float_t phi = trgHadPhiAway + deltaPhi;
1484 phi += 2. * TMath::Pi();
1485 else if (phi > 2. * TMath::Pi())
1486 phi -= 2. * TMath::Pi();
1487 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1488 assHadHadArray->Add(assPart);
1489 if (gRandom->Uniform() < pFraction)
1490 assProtHadArray->Add(assPart);
1496 Bool_t AliAnalysisTaskJetProtonCorr::CleanUpEvent()
1499 delete fPrimTrackArray;
1500 fPrimTrackArray = 0x0;
1506 TObjArray* AliAnalysisTaskJetProtonCorr::CloneTracks(TObjArray* tracks) const
1508 TObjArray* tracksClone = new TObjArray;
1509 tracksClone->SetOwner(kTRUE);
1511 Int_t nTracks = tracks->GetEntriesFast();
1512 for (Int_t i = 0; i < nTracks; i++) {
1513 // tracksClone->Add(new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge()));
1515 // WARNING: TObject::Clone() is very!!! expensive, unusable
1516 // tracksClone->Add(particle->Clone());
1518 if (AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (tracks->At(i)))
1519 tracksClone->Add(new AliESDtrack(*esdTrack));
1520 else if (AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*> (tracks->At(i)))
1521 tracksClone->Add(new AliAODTrack(*aodTrack));
1527 AliAnalysisTaskJetProtonCorr::AliHistCorr::AliHistCorr(TString name, TList *outputList) :
1529 fOutputList(outputList),
1533 fHistCorrEtaPhi(0x0),
1534 fHistCorrAvgEtaPhi(0x0),
1535 fHistCorrTrgEtaPhi(0x0),
1536 fHistCorrAssEtaPhi(0x0)
1540 fHistStat = new TH1F(Form("%s_stat", name.Data()), "statistics",
1543 fHistCorrPhi = new TH1F(Form("%s_phi", name.Data()), ";#Delta #phi",
1544 100, -2.*TMath::Pi(), 2.*TMath::Pi());
1545 fHistCorrPhi->Sumw2();
1546 fHistCorrPhi2 = new TH2F(Form("%s_phi2", name.Data()), ";#phi_{trg};#phi_{ass}",
1547 100, 0.*TMath::Pi(), 2.*TMath::Pi(),
1548 100, 0.*TMath::Pi(), 2.*TMath::Pi());
1549 fHistCorrPhi2->Sumw2();
1550 fHistCorrEtaPhi = new TH2F(Form("%s_etaphi", name.Data()), ";#Delta#phi;#Delta#eta",
1551 100, -1., 2*TMath::Pi()-1.,
1553 fHistCorrEtaPhi->Sumw2();
1554 fHistCorrAvgEtaPhi = new TH2F(Form("%s_avgetaphi", name.Data()), ";#Delta#phi;avg #eta",
1555 100, -1., 2*TMath::Pi()-1.,
1557 fHistCorrAvgEtaPhi->Sumw2();
1558 fHistCorrTrgEtaPhi = new TH2F(Form("%s_trg_etaphi", name.Data()), ";#varphi;#eta",
1559 100, 0., 2*TMath::Pi(),
1561 fHistCorrTrgEtaPhi->Sumw2();
1562 fHistCorrAssEtaPhi = new TH2F(Form("%s_ass_etaphi", name.Data()), ";#varphi;#eta",
1563 100, 0., 2*TMath::Pi(),
1565 fHistCorrAssEtaPhi->Sumw2();
1567 fOutputList->Add(fHistStat);
1568 fOutputList->Add(fHistCorrPhi);
1569 fOutputList->Add(fHistCorrPhi2);
1570 fOutputList->Add(fHistCorrEtaPhi);
1571 fOutputList->Add(fHistCorrAvgEtaPhi);
1572 fOutputList->Add(fHistCorrTrgEtaPhi);
1573 fOutputList->Add(fHistCorrAssEtaPhi);
1576 AliAnalysisTaskJetProtonCorr::AliHistCorr::~AliHistCorr()
1581 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(AliVParticle *trgPart, AliVParticle *assPart, Float_t weight)
1583 // fill correlation histograms from trigger particle and associate particle
1585 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1586 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1587 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1588 if (deltaPhi > (2.*TMath::Pi()-1.))
1589 deltaPhi -= 2. * TMath::Pi();
1590 else if (deltaPhi < -1.)
1591 deltaPhi += 2. * TMath::Pi();
1593 fHistCorrPhi->Fill(deltaPhi, weight);
1594 fHistCorrPhi2->Fill(trgPart->Phi(), assPart->Phi(), weight);
1595 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1596 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1599 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, AliVParticle *assPart, Float_t weight)
1601 // fill correlation histograms from trigger direction and associate particle
1603 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1604 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1605 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1606 if (deltaPhi > (2.*TMath::Pi()-1.))
1607 deltaPhi -= 2. * TMath::Pi();
1608 else if (deltaPhi < -1.)
1609 deltaPhi += 2. * TMath::Pi();
1611 fHistCorrPhi->Fill(deltaPhi, weight);
1612 Float_t trgPhi = trgPart->Phi();
1614 trgPhi += 2. * TMath::Pi();
1615 fHistCorrPhi2->Fill(trgPhi, assPart->Phi(), weight);
1616 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1617 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1620 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, TLorentzVector *assPart, Float_t weight)
1622 // fill correlation histograms from trigger direction and associate direction
1624 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1625 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1626 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1627 if (deltaPhi > (2.*TMath::Pi()-1.))
1628 deltaPhi -= 2. * TMath::Pi();
1629 else if (deltaPhi < -1.)
1630 deltaPhi += 2. * TMath::Pi();
1632 fHistCorrPhi->Fill(deltaPhi, weight);
1633 Float_t trgPhi = trgPart->Phi();
1635 trgPhi += 2. * TMath::Pi();
1636 Float_t assPhi = assPart->Phi();
1638 assPhi += 2. * TMath::Pi();
1639 fHistCorrPhi2->Fill(trgPhi, assPhi, weight);
1640 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1641 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1644 // ----- histogram management -----
1645 TH1* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1646 Int_t xbins, Float_t xmin, Float_t xmax,
1650 hName.Form("%s_%s", fShortTaskId, hid);
1654 h = new TH1I(hName.Data(), title,
1657 h = new TH1F(hName.Data(), title,
1659 GetHistogram(hist) = h;
1660 fOutputList->Add(h);
1664 TH2* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1665 Int_t xbins, Float_t xmin, Float_t xmax,
1666 Int_t ybins, Float_t ymin, Float_t ymax,
1670 hName.Form("%s_%s", fShortTaskId, hid);
1674 h = GetHistogram(hist) = new TH2I(hName.Data(), title,
1678 h = GetHistogram(hist) = new TH2F(hName.Data(), title,
1681 fOutputList->Add(h);
1685 TH3* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1686 Int_t xbins, Float_t xmin, Float_t xmax,
1687 Int_t ybins, Float_t ymin, Float_t ymax,
1688 Int_t zbins, Float_t zmin, Float_t zmax,
1692 hName.Form("%s_%s", fShortTaskId, hid);
1696 h = GetHistogram(hist) = new TH3I(hName.Data(), title,
1701 h = GetHistogram(hist) = new TH3F(hName.Data(), title,
1705 fOutputList->Add(h);