12 #include "AliAnalysisManager.h"
13 #include "AliInputEventHandler.h"
14 #include "AliVEvent.h"
15 #include "AliVTrack.h"
16 #include "AliVTrdTrack.h"
17 #include "AliVVertex.h"
18 #include "AliPIDResponse.h"
19 #include "AliEventPoolManager.h"
20 #include "AliOADBContainer.h"
21 #include "AliTOFPIDParams.h"
22 #include "AliAnalysisTaskVnV0.h"
25 #include "AliMCEvent.h"
26 #include "AliGenPythiaEventHeader.h"
29 #include "AliESDEvent.h"
30 #include "AliESDInputHandler.h"
31 #include "AliESDtrack.h"
32 #include "AliESDtrackCuts.h"
33 #include "AliESDTrdTrack.h"
34 #include "AliESDTrdTracklet.h"
35 #include "AliESDTrdTrigger.h"
38 #include "AliAODEvent.h"
39 #include "AliAODJet.h"
40 #include "AliAODTrack.h"
43 #include "AliAnalysisTaskJetServices.h"
44 #include "AliAnalysisHelperJetTasks.h"
46 #include "AliAnalysisTaskJetProtonCorr.h"
51 AliAnalysisTaskJetProtonCorr::AliAnalysisTaskJetProtonCorr(const char *name) :
52 AliAnalysisTaskSE(name),
57 fOADBContainerTOF(0x0),
63 fCentralityCheck(100.),
67 fEventPlaneAngleCheck(5.),
68 fEventPlaneAngle3(5.),
69 fPrimTrackArrayAss(0x0),
70 fPrimTrackArrayTrg(0x0),
71 fPrimConstrainedTrackArray(new TClonesArray("AliESDtrack", 100)),
79 fShortTaskId("jet_prot_corr"),
80 fUseStandardCuts(kTRUE),
81 fUseEvplaneV0(kFALSE),
83 fCutsPrimTrgConstrain(new AliESDtrackCuts()),
85 fCutsTwoTrackEff(0.02),
86 fAssFilterMask(1 << 10),
94 fTrgJetLeadTrkPtMin(6.),
95 fTrgJetLeadTrkPtMax(100.),
96 fTrgJetAreaMin(0.6 * TMath::Pi() * 0.2*0.2),
99 fTrgAngleToEvPlane(TMath::Pi() / 4.),
103 fTrgJetPhiModCent(new TF1("jetphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
104 fTrgJetPhiModSemi(new TF1("jetphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
105 fTrgHadPhiModCent(new TF1("hadphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
106 fTrgHadPhiModSemi(new TF1("hadphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi()))
110 fkCorrTypeName[kCorrHadHad] = "hh";
111 fkCorrTypeName[kCorrHadProt] = "hp";
112 fkCorrTypeName[kCorrJetHad] = "jh";
113 fkCorrTypeName[kCorrJetProt] = "jp";
114 fkCorrTypeName[kCorrRndJetHad] = "rjh";
115 fkCorrTypeName[kCorrRndJetProt] = "rjp";
116 fkCorrTypeName[kCorrRndHadHad] = "rhh";
117 fkCorrTypeName[kCorrRndHadProt] = "rhp";
118 fkCorrTypeName[kCorrRndJetExcHad] = "rjeh";
119 fkCorrTypeName[kCorrRndJetExcProt] = "rjep";
120 fkCorrTypeName[kCorrRndHadExcHad] = "rheh";
121 fkCorrTypeName[kCorrRndHadExcProt] = "rhep";
123 fkClassName[kClCentral] = "cent";
124 fkClassName[kClSemiCentral] = "semi";
125 // fkClassName[kClDijet] = "dijet";
127 fkEvName[kEvSame] = "same";
128 fkEvName[kEvMix] = "mixed";
130 // track cuts for associates
131 if (fUseStandardCuts) {
132 fCutsPrimAss = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE);
134 fCutsPrimAss = new AliESDtrackCuts();
136 // this is taken from PWGJE track cuts
137 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
138 fCutsPrimAss->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
139 fCutsPrimAss->SetMinNClustersTPC(70);
140 fCutsPrimAss->SetMaxChi2PerClusterTPC(4);
141 fCutsPrimAss->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
142 fCutsPrimAss->SetAcceptKinkDaughters(kFALSE);
143 fCutsPrimAss->SetRequireTPCRefit(kTRUE);
144 fCutsPrimAss->SetMaxFractionSharedTPCClusters(0.4);
146 fCutsPrimAss->SetRequireITSRefit(kTRUE);
148 fCutsPrimAss->SetMaxDCAToVertexXY(2.4);
149 fCutsPrimAss->SetMaxDCAToVertexZ(3.2);
150 fCutsPrimAss->SetDCAToVertex2D(kTRUE);
152 fCutsPrimAss->SetMaxChi2PerClusterITS(36);
153 fCutsPrimAss->SetMaxChi2TPCConstrainedGlobal(36);
155 fCutsPrimAss->SetRequireSigmaToVertex(kFALSE);
157 fCutsPrimAss->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
160 fCutsPrimAss->SetEtaRange(-fHadEtaMax, fHadEtaMax);
161 fCutsPrimAss->SetPtRange(0.15, 1E+15);
163 // track cuts for triggers
164 fCutsPrimTrg = new AliESDtrackCuts(*fCutsPrimAss);
166 // azimuthal modulation for triggers
167 fTrgJetPhiModCent->SetParameter(0, .10);
168 fTrgJetPhiModSemi->SetParameter(0, .10);
169 fTrgHadPhiModCent->SetParameter(0, .04);
170 fTrgHadPhiModSemi->SetParameter(0, .10);
173 Double_t centralityBins[] = {
174 0., 2., 4., 6., 8., 10., // central
175 30., 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., // semi-central
178 Int_t nCentralityBins = sizeof(centralityBins)/sizeof(centralityBins[0]);
180 Double_t vertexBins[] = {
181 -10., -8., -6., -4., -2., 0., 2., 4., 6., 8., 10.
183 Int_t nVertexBins = sizeof(vertexBins)/sizeof(vertexBins[0]);
185 Double_t psiBins[12];
186 Int_t nPsiBins = sizeof(psiBins)/sizeof(psiBins[0]);
187 for (Int_t iBin = 0; iBin < nPsiBins; ++iBin)
188 psiBins[iBin] = iBin * TMath::Pi()/nPsiBins;
190 const Int_t poolSize = 10; // unused by current event pool implementation
191 const Int_t trackDepth = 10000; // number of tracks to maintain in mixing buffer
192 const Float_t trackDepthFraction = 0.1;
193 const Int_t targetEvents = 1;
194 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
195 GetPoolMgr((Ass_t) iAss) =
196 new AliEventPoolManager(poolSize, trackDepth,
197 nCentralityBins, centralityBins,
198 nVertexBins, vertexBins);
199 GetPoolMgr((Ass_t) iAss)->SetTargetValues(trackDepth, trackDepthFraction, targetEvents);
202 fHistCorr = new AliHistCorr*[kEvLast*kCorrLast*kClLast];
204 DefineOutput(1, TList::Class());
207 AliAnalysisTaskJetProtonCorr::~AliAnalysisTaskJetProtonCorr()
211 // delete [] fHistCorr;
214 void AliAnalysisTaskJetProtonCorr::UserCreateOutputObjects()
216 // create user output objects
218 // open OADB file and retrieve the OADB container with TOF parameters
219 TString oadbFileName =
220 TString::Format("%s/COMMON/PID/data/TOFPIDParams.root", AliAnalysisManager::GetOADBPath());
221 TFile *oadbFile = TFile::Open(oadbFileName);
222 if(!oadbFile->IsOpen())
223 AliFatal(Form("Cannot open OADB file %s", oadbFileName.Data()));
224 AliOADBContainer *oadbContainer =
225 (AliOADBContainer*) oadbFile->Get("TOFoadb");
227 AliFatal("Cannot fetch OADB container for VZERO EP selection");
228 fOADBContainerTOF = new AliOADBContainer(*oadbContainer);
234 fOutputList = new TList();
235 fOutputList->SetOwner();
239 TH1 *histStat = AddHistogram(ID(kHistStat), "event statistics;;counts",
240 kStatLast-1, .5, kStatLast-.5);
241 histStat->GetXaxis()->SetBinLabel(ID(kStatSeen));
242 histStat->GetXaxis()->SetBinLabel(ID(kStatTrg));
243 histStat->GetXaxis()->SetBinLabel(ID(kStatVtx));
244 histStat->GetXaxis()->SetBinLabel(ID(kStatEvCuts));
245 histStat->GetXaxis()->SetBinLabel(ID(kStatUsed));
246 histStat->GetXaxis()->SetBinLabel(ID(kStatCent));
247 histStat->GetXaxis()->SetBinLabel(ID(kStatEvPlane));
248 histStat->GetXaxis()->SetBinLabel(ID(kStatPID));
249 histStat->GetXaxis()->SetBinLabel(ID(kStatCentral));
250 histStat->GetXaxis()->SetBinLabel(ID(kStatSemiCentral));
252 AddHistogram(ID(kHistVertexNctb), "number of vertex contributors;N_{ctb};counts",
254 AddHistogram(ID(kHistVertexZ), "z-position of primary vertex;z (cm);counts",
257 AddHistogram(ID(kHistCentrality), "centrality;C;counts",
259 hist = AddHistogram(ID(kHistCentralityUsed), "centrality used;C;event class",
261 kClLast, -.5, kClLast-.5);
262 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
263 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
264 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
265 AddHistogram(ID(kHistCentralityCheck), "centrality check;C;counts",
267 hist = AddHistogram(ID(kHistCentralityCheckUsed), "centrality check used;C;event class",
269 kClLast, -.5, kClLast-.5);
270 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
271 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
272 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
273 AddHistogram(ID(kHistCentralityVsMult), "centrality - multiplicity;centrality percentile (%);N_{prim}",
277 AddHistogram(ID(kHistSignalTPC), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
278 100, 0., 10., 200, 0., 300.);
279 AddHistogram(ID(kHistSignalTOF), "TOF time of flight;p_{T} (GeV/#it{c});t (ns)",
280 100, 0., 10., 200, 0., 50.);
281 AddHistogram(ID(kHistBetaTOF), "TOF beta;p (GeV/#it{c}); #beta",
285 AddHistogram(ID(kHistDeltaTPC), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
286 100, 0., 10., 200, -100., 100.);
287 AddHistogram(ID(kHistDeltaTPCSemi), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
288 100, 0., 10., 200, -100., 100.);
289 AddHistogram(ID(kHistDeltaTOF), "TOF time of flight;p (GeV/#it{c});t (ns)",
290 100, 0., 10., 200, -2., 2.);
291 AddHistogram(ID(kHistDeltaTOFSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
292 100, 0., 10., 200, -2., 2.);
294 // Nsigma templates - central
295 AddHistogram(ID(kHistNsigmaTPCe), "TPC N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
298 AddHistogram(ID(kHistNsigmaTPCmu), "TPC N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
301 AddHistogram(ID(kHistNsigmaTPCpi), "TPC N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
304 AddHistogram(ID(kHistNsigmaTPCk), "TPC N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
307 AddHistogram(ID(kHistNsigmaTPCp), "TPC N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
310 AddHistogram(ID(kHistNsigmaTPCd), "TPC N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
313 AddHistogram(ID(kHistNsigmaTPCe_e), "TPC N_{#sigma,p} - e hypothesis (id. e);p (GeV/#it{c});N_{#sigma,p}",
317 AddHistogram(ID(kHistNsigmaTOFe), "TOF N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
320 AddHistogram(ID(kHistNsigmaTOFmu), "TOF N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
323 AddHistogram(ID(kHistNsigmaTOFpi), "TOF N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
326 AddHistogram(ID(kHistNsigmaTOFk), "TOF N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
329 AddHistogram(ID(kHistNsigmaTOFp), "TOF N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
332 AddHistogram(ID(kHistNsigmaTOFd), "TOF N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
335 AddHistogram(ID(kHistNsigmaTOFmismatch), "TOF N_{#sigma,p} - mismatch;p (GeV/#it{c});N_{#sigma,p}",
339 // Nsigma templates - semi-central
340 AddHistogram(ID(kHistNsigmaTPCeSemi), "TPC N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
343 AddHistogram(ID(kHistNsigmaTPCmuSemi), "TPC N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
346 AddHistogram(ID(kHistNsigmaTPCpiSemi), "TPC N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
349 AddHistogram(ID(kHistNsigmaTPCkSemi), "TPC N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
352 AddHistogram(ID(kHistNsigmaTPCpSemi), "TPC N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
355 AddHistogram(ID(kHistNsigmaTPCdSemi), "TPC N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
358 AddHistogram(ID(kHistNsigmaTPCe_eSemi), "TPC N_{#sigma,p} - e hypothesis (id. e);p (GeV/#it{c});N_{#sigma,p}",
362 AddHistogram(ID(kHistNsigmaTOFeSemi), "TOF N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
365 AddHistogram(ID(kHistNsigmaTOFmuSemi), "TOF N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
368 AddHistogram(ID(kHistNsigmaTOFpiSemi), "TOF N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
371 AddHistogram(ID(kHistNsigmaTOFkSemi), "TOF N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
374 AddHistogram(ID(kHistNsigmaTOFpSemi), "TOF N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
377 AddHistogram(ID(kHistNsigmaTOFdSemi), "TOF N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
380 AddHistogram(ID(kHistNsigmaTOFmismatchSemi), "TOF N_{#sigma,p} - mismatch;p (GeV/#it{c});N_{#sigma,p}",
385 AddHistogram(ID(kHistDeltaTOFe), "TOF #Delta;p (GeV/#it{c});t (ns)",
386 100, 0., 10., 200, -2., 2.);
387 AddHistogram(ID(kHistDeltaTOFmu), "TOF #Delta;p (GeV/#it{c});t (ns)",
388 100, 0., 10., 200, -2., 2.);
389 AddHistogram(ID(kHistDeltaTOFpi), "TOF #Delta;p (GeV/#it{c});t (ns)",
390 100, 0., 10., 200, -2., 2.);
391 AddHistogram(ID(kHistDeltaTOFk), "TOF #Delta;p (GeV/#it{c});t (ns)",
392 100, 0., 10., 200, -2., 2.);
393 AddHistogram(ID(kHistDeltaTOFp), "TOF #Delta;p (GeV/#it{c});t (ns)",
394 100, 0., 10., 200, -2., 2.);
395 AddHistogram(ID(kHistDeltaTOFd), "TOF #Delta;p (GeV/#it{c});t (ns)",
396 100, 0., 10., 200, -2., 2.);
398 AddHistogram(ID(kHistDeltaTOFeSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
399 100, 0., 10., 200, -2., 2.);
400 AddHistogram(ID(kHistDeltaTOFmuSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
401 100, 0., 10., 200, -2., 2.);
402 AddHistogram(ID(kHistDeltaTOFpiSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
403 100, 0., 10., 200, -2., 2.);
404 AddHistogram(ID(kHistDeltaTOFkSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
405 100, 0., 10., 200, -2., 2.);
406 AddHistogram(ID(kHistDeltaTOFpSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
407 100, 0., 10., 200, -2., 2.);
408 AddHistogram(ID(kHistDeltaTOFdSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
409 100, 0., 10., 200, -2., 2.);
412 // AddHistogram(ID(kHistExpSigmaTOFe), "TOF time of flight;p (GeV/#it{c});t (ns)",
413 // 100, 0., 10., 200, 0., .25);
414 // AddHistogram(ID(kHistExpSigmaTOFmu), "TOF time of flight;p (GeV/#it{c});t (ns)",
415 // 100, 0., 10., 200, 0., .25);
416 // AddHistogram(ID(kHistExpSigmaTOFpi), "TOF time of flight;p (GeV/#it{c});t (ns)",
417 // 100, 0., 10., 200, 0., .25);
418 // AddHistogram(ID(kHistExpSigmaTOFk), "TOF time of flight;p (GeV/#it{c});t (ns)",
419 // 100, 0., 10., 200, 0., .25);
420 // AddHistogram(ID(kHistExpSigmaTOFp), "TOF time of flight;p (GeV/#it{c});t (ns)",
421 // 100, 0., 10., 200, 0., .25);
422 // AddHistogram(ID(kHistExpSigmaTOFd), "TOF time of flight;p (GeV/#it{c});t (ns)",
423 // 100, 0., 10., 200, 0., .25);
425 // AddHistogram(ID(kHistExpSigmaTOFeSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
426 // 100, 0., 10., 200, 0., .25);
427 // AddHistogram(ID(kHistExpSigmaTOFmuSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
428 // 100, 0., 10., 200, 0., .25);
429 // AddHistogram(ID(kHistExpSigmaTOFpiSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
430 // 100, 0., 10., 200, 0., .25);
431 // AddHistogram(ID(kHistExpSigmaTOFkSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
432 // 100, 0., 10., 200, 0., .25);
433 // AddHistogram(ID(kHistExpSigmaTOFpSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
434 // 100, 0., 10., 200, 0., .25);
435 // AddHistogram(ID(kHistExpSigmaTOFdSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
436 // 100, 0., 10., 200, 0., .25);
438 // AddHistogram(ID(kHistCmpSigmaTOFe), "#sigma comparison;exp #sigma;template #sigma",
439 // 200, 0., .25, 200, 0., .25);
440 // AddHistogram(ID(kHistCmpSigmaTOFmu), "#sigma comparison;exp #sigma;template #sigma",
441 // 200, 0., .25, 200, 0., .25);
442 // AddHistogram(ID(kHistCmpSigmaTOFpi), "#sigma comparison;exp #sigma;template #sigma",
443 // 200, 0., .25, 200, 0., .25);
444 // AddHistogram(ID(kHistCmpSigmaTOFk), "#sigma comparison;exp #sigma;template #sigma",
445 // 200, 0., .25, 200, 0., .25);
446 // AddHistogram(ID(kHistCmpSigmaTOFp), "#sigma comparison;exp #sigma;template #sigma",
447 // 200, 0., .25, 200, 0., .25);
448 // AddHistogram(ID(kHistCmpSigmaTOFd), "#sigma comparison;exp #sigma;template #sigma",
449 // 200, 0., .25, 200, 0., .25);
451 // AddHistogram(ID(kHistCmpSigmaTOFeSemi), "#sigma comparison;exp #sigma;template #sigma",
452 // 200, 0., .25, 200, 0., .25);
453 // AddHistogram(ID(kHistCmpSigmaTOFmuSemi), "#sigma comparison;exp #sigma;template #sigma",
454 // 200, 0., .25, 200, 0., .25);
455 // AddHistogram(ID(kHistCmpSigmaTOFpiSemi), "#sigma comparison;exp #sigma;template #sigma",
456 // 200, 0., .25, 200, 0., .25);
457 // AddHistogram(ID(kHistCmpSigmaTOFkSemi), "#sigma comparison;exp #sigma;template #sigma",
458 // 200, 0., .25, 200, 0., .25);
459 // AddHistogram(ID(kHistCmpSigmaTOFpSemi), "#sigma comparison;exp #sigma;template #sigma",
460 // 200, 0., .25, 200, 0., .25);
461 // AddHistogram(ID(kHistCmpSigmaTOFdSemi), "#sigma comparison;exp #sigma;template #sigma",
462 // 200, 0., .25, 200, 0., .25);
464 // Nsigma distributions
465 AddHistogram(ID(kHistNsigmaTPCTOF), "N_{#sigma,p} TPC-TOF;p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
469 AddHistogram(ID(kHistNsigmaTPCTOFPt), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
473 AddHistogram(ID(kHistNsigmaTPCTOFUsed), "N_{#sigma,p} TPC-TOF;p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
477 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentral), "N_{#sigma,p} TPC-TOF (central);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
481 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentral), "N_{#sigma,p} TPC-TOF (semi-central);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
485 AddHistogram(ID(kHistNsigmaTPCTOFUsedPt), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
489 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtCentral), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
493 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtSemiCentral), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
498 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCe), "N_{#sigma,p} TPC-TOF (central, MC e);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
502 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCmu), "N_{#sigma,p} TPC-TOF (central, MC #mu);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
506 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCpi), "N_{#sigma,p} TPC-TOF (central, MC pi);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
510 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCk), "N_{#sigma,p} TPC-TOF (central, MC K);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
514 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCp), "N_{#sigma,p} TPC-TOF (central, MC p);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
518 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCd), "N_{#sigma,p} TPC-TOF (central, MC d);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
523 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCe), "N_{#sigma,p} TPC-TOF (semi-central, MC e);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
527 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCmu), "N_{#sigma,p} TPC-TOF (semi-central, MC #mu);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
531 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCpi), "N_{#sigma,p} TPC-TOF (semi-central, MC pi);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
535 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCk), "N_{#sigma,p} TPC-TOF (semi-central, MC K);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
539 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCp), "N_{#sigma,p} TPC-TOF (semi-central, MC p);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
543 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCd), "N_{#sigma,p} TPC-TOF (semi-central, MC d);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
548 AddHistogram(ID(kHistEvPlane), "default event plane;#Psi;counts",
549 100, -0. * TMath::Pi(), 1. * TMath::Pi());
550 AddHistogram(ID(kHistEvPlaneUsed), "default event plane;#Psi;counts",
551 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
552 kClLast, -.5, kClLast-.5);
553 AddHistogram(ID(kHistEvPlaneCheck), "backup event plane;#Psi;counts",
554 100, -1. * TMath::Pi(), 1. * TMath::Pi());
555 AddHistogram(ID(kHistEvPlaneCheckUsed), "backup event plane;#Psi;counts",
556 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
557 kClLast, -.5, kClLast-.5);
558 AddHistogram(ID(kHistEvPlane3), "3rd order event plane;#Psi;counts",
559 100, -0. * TMath::Pi(), 2./3. * TMath::Pi());
560 AddHistogram(ID(kHistEvPlaneCorr), "default - backup event plane;#Psi_{def};#Psi_{bak};event class",
561 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
562 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
563 kClLast, -.5, kClLast-.5);
564 AddHistogram(ID(kHistEvPlaneCorrNoTrgJets), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
565 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
566 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
567 kClLast, -.5, kClLast-.5);
568 AddHistogram(ID(kHistEvPlaneCorrNoTrgJetsTrgd), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
569 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
570 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
571 kClLast, -.5, kClLast-.5);
573 AddHistogram(ID(kHistJetPtCentral), "jet spectrum - central;p_{T}^{jet,ch} (GeV/#it{c});counts",
575 AddHistogram(ID(kHistJetPtSemi), "jet spectrum - semi-peripheral;p_{T}^{jet,ch} (GeV/#it{c});counts",
578 AddHistogram(ID(kHistEtaPhiTrgHad), "trg had;#varphi;#eta",
579 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
581 AddHistogram(ID(kHistEtaPhiTrgJet), "trg jet;#varphi;#eta",
582 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
584 AddHistogram(ID(kHistEtaPhiAssHad), "ass had;#varphi;#eta",
585 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
587 AddHistogram(ID(kHistEtaPhiAssProt), "ass proton;#varphi;#eta",
588 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
591 AddHistogram(ID(kHistPhiTrgJetEvPlane), "trg jet;#varphi - #Psi_{ev};centrality",
592 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
594 AddHistogram(ID(kHistPhiTrgHadEvPlane), "trg had;#varphi - #Psi_{ev};centrality",
595 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
597 AddHistogram(ID(kHistPhiRndTrgJetEvPlane), "rnd trg jet;#varphi - #Psi_{ev};centrality",
598 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
600 AddHistogram(ID(kHistPhiRndTrgHadEvPlane), "rnd trg had;#varphi - #Psi_{ev};centrality",
601 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
603 AddHistogram(ID(kHistPhiAssHadEvPlane), "ass had;#varphi - #Psi_{ev};centrality",
604 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
606 AddHistogram(ID(kHistPhiAssProtEvPlane), "ass prot;#varphi - #Psi_{ev};centrality",
607 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
609 AddHistogram(ID(kHistPhiAssHadVsEvPlane), "ass had;#Psi_{ev};#varphi;centrality",
610 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
611 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
614 AddHistogram(ID(kHistPhiTrgJetEvPlane3), "trg jet;#varphi - #Psi_{ev};centrality",
615 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
617 AddHistogram(ID(kHistPhiTrgHadEvPlane3), "trg had;#varphi - #Psi_{ev};centrality",
618 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
620 AddHistogram(ID(kHistPhiAssHadEvPlane3), "ass had;#varphi - #Psi_{ev};centrality",
621 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
623 AddHistogram(ID(kHistPhiAssProtEvPlane3), "ass prot;#varphi - #Psi_{ev};centrality",
624 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
627 for (Int_t iCorr = 0; iCorr < kCorrLast; ++iCorr) {
628 for (Int_t iCl = 0; iCl < kClLast; ++iCl) {
629 for (Int_t iEv = 0; iEv < kEvLast; ++iEv) {
630 // we don't need the mixed event histograms for the embedded excess particles
631 if ((iCorr > kCorrRndJetProt) && (iEv == kEvMix))
634 GetHistCorr((CorrType_t) iCorr, (Class_t) iCl, (Ev_t) iEv) =
635 new AliHistCorr(Form("corr_%s_%s_%s", fkCorrTypeName[iCorr], fkClassName[iCl], fkEvName[iEv]), fOutputList);
640 PostData(1, fOutputList);
643 Bool_t AliAnalysisTaskJetProtonCorr::Notify()
645 // actions to be taken upon notification about input file change
647 return AliAnalysisTaskSE::Notify();
650 void AliAnalysisTaskJetProtonCorr::SetParamsTOF()
653 dynamic_cast<AliTOFPIDParams*> (fOADBContainerTOF->GetObject(fRunNumber, "TOFparams"));
656 AliError(Form("failed to load TOF parameters for run %i", fRunNumber));
657 else if (fDebug > 2) {
658 printf("loaded TOF parameters for run %i\n",
660 printf(" intrinsic resolution: %f ps\n",
661 fParamsTOF->GetTOFresolution());
662 printf(" tail fraction: %f\n",
663 fParamsTOF->GetTOFtail());
664 printf(" start time method: %i\n",
665 fParamsTOF->GetStartTimeMethod());
666 printf(" TOF signal parametrization: %f, %f, %f, %f\n",
667 fParamsTOF->GetSigParams(0), fParamsTOF->GetSigParams(1),
668 fParamsTOF->GetSigParams(2), fParamsTOF->GetSigParams(3));
669 printf(" matching loss MC: %f%%\n",
670 fParamsTOF->GetTOFmatchingLossMC());
671 printf(" additional mismatch for MC: %f%%\n",
672 fParamsTOF->GetTOFadditionalMismForMC());
673 printf(" time offset: %f\n",
674 fParamsTOF->GetTOFtimeOffset());
678 void AliAnalysisTaskJetProtonCorr::UserExec(Option_t * /* option */)
682 // setup pointers to input data (null if unavailable)
684 // esdEvent: ESD input
685 // outEvent: AOD output
686 // aodEvent: AOD input if available, otherwise AOD output
688 fMCEvent = this->MCEvent();
689 fESDEvent = dynamic_cast<AliESDEvent*>(this->InputEvent()); // could also be AOD input
690 AliAODEvent* outEvent = this->AODEvent();
691 fAODEvent = dynamic_cast<AliAODEvent*> (this->InputEvent());
693 fAODEvent = outEvent;
695 if ((fDebug > 0) && fESDEvent)
696 printf("event: %s-%06i\n", CurrentFileName(), fESDEvent->GetEventNumberInFile());
698 // record number of sampled events and detect trigger contributions
699 FillH1(kHistStat, kStatSeen);
700 if (!DetectTriggers()) {
701 AliError("Failed to detect the triggers");
705 if (!IsTrigger(kTriggerInt))
708 FillH1(kHistStat, kStatTrg);
711 // (make sure it is cleaned up in the end)
712 if (PrepareEvent()) {
713 FillH1(kHistStat, kStatUsed);
714 FillH1(kHistCentrality, fCentrality);
715 FillH1(kHistCentralityCheck, fCentralityCheck);
717 FillH1(kHistVertexZ, fZvtx);
720 if (TMath::Abs(fZvtx) > 10.)
722 if (GetCentrality() > 90.)
725 FillH1(kHistStat, kStatEvCuts);
729 if (IsClass(kClCentral))
730 FillH1(kHistStat, kStatCentral);
731 if (IsClass(kClSemiCentral))
732 FillH1(kHistStat, kStatSemiCentral);
734 FillH1(kHistEvPlane, fEventPlaneAngle);
735 FillH1(kHistEvPlaneCheck, fEventPlaneAngleCheck);
736 FillH1(kHistEvPlane3, fEventPlaneAngle3);
737 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
738 if (IsClass((Class_t) iClass)) {
739 FillH2(kHistCentralityUsed, fCentrality, iClass);
740 FillH2(kHistCentralityCheckUsed, fCentralityCheck, iClass);
741 FillH2(kHistEvPlaneUsed, fEventPlaneAngle, iClass);
742 FillH2(kHistEvPlaneCheckUsed, fEventPlaneAngleCheck, iClass);
743 FillH3(kHistEvPlaneCorr, fEventPlaneAngle, fEventPlaneAngleCheck, iClass);
747 Bool_t corrEta = fPIDResponse->UseTPCEtaCorrection();
748 Bool_t corrMult = fPIDResponse->UseTPCMultiplicityCorrection();
750 // select trigger particles and potential associated particles/protons
751 TObjArray trgArray[kTrgLast];
752 TObjArray assArray[kAssLast];
754 // prepare TOF response
755 TF1 fTOFsignal("fTOFsignal", &AliAnalysisTaskJetProtonCorr::TOFsignal, -2440., 2440., 4);
756 fTOFsignal.SetParameter(0, 1.);
757 fTOFsignal.SetParameter(1, 0.);
759 Float_t res = fParamsTOF->GetTOFresolution();
760 Float_t tail = fParamsTOF->GetTOFtail() * res;
761 fTOFsignal.SetParameter(2, res);
762 fTOFsignal.SetParameter(3, tail);
765 fTOFsignal.SetParameter(2, 85.);
766 fTOFsignal.SetParameter(3, 80.);
769 // associate candidates
770 const Int_t nPrimTracksAss = fPrimTrackArrayAss ? fPrimTrackArrayAss->GetEntries() : 0;
771 FillH2(kHistCentralityVsMult, fCentrality, nPrimTracksAss);
772 for (Int_t iTrack = 0; iTrack < nPrimTracksAss; ++iTrack) {
773 AliVTrack *trk = (AliVTrack*) fPrimTrackArrayAss->At(iTrack);
774 FillH2(kHistSignalTPC, trk->P(), trk->GetTPCsignal());
776 FillH2(kHistSignalTOF, trk->P(), trk->GetTOFsignal() * 1.e-3); // ps -> ns
777 FillH3(kHistNsigmaTPCTOF,
779 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
780 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
781 FillH3(kHistNsigmaTPCTOFPt,
783 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
784 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
786 FillH3(kHistPhiAssHadVsEvPlane, fEventPlaneAngle, trk->Phi(), fCentrality);
787 Float_t phiRel = trk->Phi() - fEventPlaneAngle;
788 if (gRandom->Rndm() > .5)
789 phiRel -= TMath::Pi();
791 phiRel += 2. * TMath::Pi();
793 AliError(Form("phiRel = %f less than zero, from phi = %f, psi = %f",
794 phiRel, trk->Phi(), fEventPlaneAngle));
795 else if (phiRel > 2*TMath::Pi())
796 AliError(Form("phiRel = %f greater than 2pi, from phi = %f, psi = %f",
797 phiRel, trk->Phi(), fEventPlaneAngle));
798 Float_t phiRel3 = trk->Phi() - fEventPlaneAngle3;
800 phiRel3 += 2. * TMath::Pi();
802 if (AcceptAssoc(trk)) {
803 assArray[kAssHad].Add(trk);
804 FillH1(kHistEtaPhiAssHad, trk->Phi(), trk->Eta());
805 FillH2(kHistPhiAssHadEvPlane, phiRel, fCentrality);
806 FillH2(kHistPhiAssHadEvPlane3, phiRel3, fCentrality);
807 FillH3(kHistNsigmaTPCTOFUsed,
809 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
810 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
811 FillH3(kHistNsigmaTPCTOFUsedPt,
813 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
814 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
815 if (IsClass(kClCentral)) {
816 FillH3(kHistNsigmaTPCTOFUsedCentral,
818 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
819 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
820 FillH3(kHistNsigmaTPCTOFUsedPtCentral,
822 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
823 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
825 if (AliMCParticle *mcPart = (AliMCParticle*) fMCEvent->GetTrack(TMath::Abs(trk->GetLabel()))) {
826 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
827 if (TMath::Abs(mcPart->Particle()->GetPdgCode()) == AliPID::ParticleCode(iParticle))
828 FillH3(kHistNsigmaTPCTOFUsedCentralMCe,
830 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
831 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton),
837 if (IsClass(kClSemiCentral)) {
838 FillH3(kHistNsigmaTPCTOFUsedSemiCentral,
840 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
841 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
842 FillH3(kHistNsigmaTPCTOFUsedPtSemiCentral,
844 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
845 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
847 if (AliMCParticle *mcPart = (AliMCParticle*) fMCEvent->GetTrack(TMath::Abs(trk->GetLabel()))) {
848 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
849 if (TMath::Abs(mcPart->Particle()->GetPdgCode()) == AliPID::ParticleCode(iParticle))
850 FillH3(kHistNsigmaTPCTOFUsedSemiCentralMCe,
852 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
853 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton),
860 assArray[kAssProt].Add(trk);
861 FillH1(kHistEtaPhiAssProt, trk->Phi(), trk->Eta());
862 FillH2(kHistPhiAssProtEvPlane, phiRel, fCentrality);
863 FillH2(kHistPhiAssProtEvPlane3, phiRel3, fCentrality);
866 // template generation
867 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) {
869 fPIDResponse->GetSignalDelta(AliPIDResponse::kTPC, trk, AliPID::kProton, deltaTPC);
870 if (IsClass(kClCentral))
871 FillH2(kHistDeltaTPC, trk->P(), deltaTPC);
872 if (IsClass(kClSemiCentral))
873 FillH2(kHistDeltaTPCSemi, trk->P(), deltaTPC);
875 Double_t expTPC = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
876 Double_t expSigmaTPC = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
878 // loop over particles
879 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
880 Double_t expTPCx = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
881 Double_t expSigmaTPCx = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
882 Double_t rndTPCx = gRandom->Gaus(expTPCx, expSigmaTPCx);
884 if(IsClass(kClCentral))
885 FillH2(kHistNsigmaTPCe, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
886 if(IsClass(kClSemiCentral))
887 FillH2(kHistNsigmaTPCeSemi, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
891 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk) {
893 fPIDResponse->GetSignalDelta(AliPIDResponse::kTOF, trk, AliPID::kProton, deltaTOF);
895 AliTOFPIDResponse &tofResponse = fPIDResponse->GetTOFResponse();
897 Float_t p = trk->P();
898 if (const AliExternalTrackParam *param = trk->GetInnerParam())
901 Double_t expTOF = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::kProton);
902 Double_t expSigmaTOF = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOF, AliPID::kProton);
903 Double_t length = trk->GetIntegratedLength() * 1.e-2; // cm -> m
904 Double_t tof = trk->GetTOFsignal() * 1.e-12; // ps -> s
905 Double_t beta = length / tof / TMath::C();
907 FillH2(kHistBetaTOF, p, beta);
909 // intrinsic TOF smearing
910 // Double_t signalSigma = TMath::Sqrt(fTOFsignal.Variance(-2000., 2000.));
911 Double_t signalSmear = fTOFsignal.GetRandom();
913 Float_t timezeroSigma = tofResponse.GetT0binRes(tofResponse.GetMomBin(p));
914 Double_t timezeroSmear = gRandom->Gaus(0., timezeroSigma);
915 // tracking smearing (default parameters, should be overwritten from OADB)
916 Double_t fPar[] = { 0.008, 0.008, 0.002, 40.0 };
918 for (Int_t i = 0; i < 4; ++i)
919 fPar[i] = fParamsTOF->GetSigParams(i);
921 // loop over particles
922 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
923 Double_t expTOFx = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle));
924 // Double_t cmpSigmaTOFx = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOFx, AliPID::EParticleType(iParticle));
927 Double_t massx = AliPID::ParticleMassZ(AliPID::EParticleType(iParticle));
928 Double_t dppx = fPar[0] + fPar[1] * p + fPar[2] * massx / p;
929 Double_t expSigmaTOFx = dppx * expTOFx / (1.+ p * p / (massx * massx));
930 Double_t texpSmearx = gRandom->Gaus(0., TMath::Sqrt(expSigmaTOFx * expSigmaTOFx + fPar[3]*fPar[3]/p/p));
931 // Double_t tmpSigmaTOFx = TMath::Sqrt(signalSigma*signalSigma +
932 // timezeroSigma*timezeroSigma +
933 // expSigmaTOFx*expSigmaTOFx + fPar[3]*fPar[3]/p/p);
934 // printf("sigma comparison %i, %f: %f, %f, %f -> %f vs %f\n",
935 // iParticle, expTOFx,
936 // signalSigma, // signal
937 // timezeroSigma, // timezero
938 // expSigmaTOFx, // tracking
939 // tmpSigmaTOFx, // total
940 // cmpSigmaTOFx); // from PID response
943 Double_t rndTOFx = expTOFx + signalSmear + timezeroSmear + texpSmearx;
945 if (IsClass(kClCentral)) {
946 FillH2(kHistNsigmaTOFe, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
947 FillH2(kHistDeltaTOFe, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
948 // FillH2(kHistExpSigmaTOFe, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
949 // FillH2(kHistCmpSigmaTOFe, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
951 if (IsClass(kClSemiCentral)) {
952 FillH2(kHistNsigmaTOFeSemi, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
953 FillH2(kHistDeltaTOFeSemi, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
954 // FillH2(kHistCmpSigmaTOFeSemi, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
955 // FillH2(kHistExpSigmaTOFeSemi, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
959 Double_t rndTOFmismatch = AliTOFPIDResponse::GetMismatchRandomValue(trk->Eta());
961 if(IsClass(kClCentral)) {
962 FillH2(kHistNsigmaTOFmismatch, trk->P(), (rndTOFmismatch - expTOF) / expSigmaTOF);
963 FillH2(kHistDeltaTOF, trk->P(), deltaTOF * 1.e-3); // ps -> ns
965 if(IsClass(kClSemiCentral)) {
966 FillH2(kHistNsigmaTOFmismatchSemi, trk->P(), (rndTOFmismatch - expTOF) / expSigmaTOF);
967 FillH2(kHistDeltaTOFSemi, trk->P(), deltaTOF * 1.e-3); // ps -> ns
973 const Int_t nPrimTracksTrg = fPrimTrackArrayTrg ? fPrimTrackArrayTrg->GetEntries() : 0;
974 for (Int_t iTrack = 0; iTrack < nPrimTracksTrg; ++iTrack) {
975 AliVTrack *trk = (AliVTrack*) fPrimTrackArrayTrg->At(iTrack);
976 if (AcceptTrigger(trk)) {
977 trgArray[kTrgHad].Add(trk);
978 FillH1(kHistEtaPhiTrgHad, trk->Phi(), trk->Eta());
982 // select trigger jet
983 // and remove them from the Q vector
984 Int_t nJets = fJetArray ? fJetArray->GetEntries() : 0;
985 const TVector2 *qVectorOrig = fEventplane->GetQVector();
988 qVector = *qVectorOrig;
990 for (Int_t iJet = 0; iJet < nJets; ++iJet) {
991 AliAODJet *jet = (AliAODJet*) fJetArray->At(iJet);
993 if (AcceptTrigger(jet)) {
994 trgArray[kTrgJet].Add(jet);
995 FillH1(kHistEtaPhiTrgJet, jet->Phi(), jet->Eta());
998 Int_t nRefTracks = jet->GetRefTracks()->GetEntriesFast();
999 for (Int_t iTrack = 0; iTrack < nRefTracks; ++iTrack) {
1000 AliVTrack *track = (AliVTrack*) jet->GetRefTracks()->At(iTrack);
1003 TVector2 evplaneContrib(fEventplane->GetQContributionX(track),
1004 fEventplane->GetQContributionY(track));
1005 qVector -= evplaneContrib;
1012 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
1013 if (IsClass((Class_t) iClass)) {
1014 FillH3(kHistEvPlaneCorrNoTrgJets, qVectorOrig->Phi()/2., qVector.Phi()/2., iClass);
1015 if (trgArray[kTrgJet].GetEntriesFast() > 0)
1016 FillH3(kHistEvPlaneCorrNoTrgJetsTrgd, qVectorOrig->Phi()/2., qVector.Phi()/2., iClass);
1021 // invent a trigger jet/hadron and correlated associates
1022 Float_t pFraction = assArray[kAssHad].GetEntries() > 0 ?
1023 (Float_t) (assArray[kAssProt].GetEntries()) / assArray[kAssHad].GetEntries() :
1025 GenerateRandom(&trgArray[kTrgJetRnd], &trgArray[kTrgHadRnd],
1026 &assArray[kAssHadJetExc], &assArray[kAssProtJetExc],
1027 &assArray[kAssHadHadExc], &assArray[kAssProtHadExc],
1030 // correlate, both same and mixed event
1031 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
1032 if (IsClass((Class_t) iClass)) {
1033 for (Int_t iTrg = 0; iTrg < kTrgLast; ++iTrg) {
1034 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1036 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvSame, &trgArray[iTrg], &assArray[iAss]);
1039 AliEventPool *pool = GetPool((Ass_t) iAss);
1040 if (pool && pool->IsReady()) {
1041 AliDebug(1, Form("----- using pool: %i %i %i -----", iClass, iTrg, iAss));
1042 const Int_t nEvents = pool->GetCurrentNEvents();
1043 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
1044 TObjArray *assTracks = pool->GetEvent(iEvent);
1045 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvMix, &trgArray[iTrg], assTracks, 1./nEvents);
1051 // fill event pool for mixing
1052 // >= 0: don't require a trigger in the event
1053 // >= 1: require a trigger in the event
1054 // if (trgArray[iTrg].GetEntries() >= 0) {
1055 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1056 AliEventPool *pool = GetPool((Ass_t) iAss);
1058 pool->UpdatePool(CloneTracks(&assArray[iAss]));
1059 AliDebug(1, Form("----- updating pool: %i -----", iAss));
1066 // correlate artificial triggers and associates
1067 Correlate(kCorrRndJetExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssHadJetExc]);
1068 Correlate(kCorrRndJetExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssProtJetExc]);
1069 Correlate(kCorrRndHadExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssHadHadExc]);
1070 Correlate(kCorrRndHadExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssProtHadExc]);
1074 trgArray[kTrgJetRnd].Delete();
1075 trgArray[kTrgHadRnd].Clear();
1076 assArray[kAssHadJetExc].Delete();
1077 assArray[kAssProtJetExc].Clear();
1078 assArray[kAssHadHadExc].Delete();
1079 assArray[kAssProtHadExc].Clear();
1085 PostData(1, fOutputList);
1088 void AliAnalysisTaskJetProtonCorr::Terminate(const Option_t * /* option */)
1090 // actions at task termination
1094 void AliAnalysisTaskJetProtonCorr::PrintTask(Option_t *option, Int_t indent) const
1096 AliAnalysisTaskSE::PrintTask(option, indent);
1098 std::cout << std::setw(indent) << " " << "using jet branch: " << fJetBranchName << std::endl;
1101 Bool_t AliAnalysisTaskJetProtonCorr::DetectTriggers()
1105 AliVEvent::EOfflineTriggerTypes physSel =
1106 (AliVEvent::EOfflineTriggerTypes) ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1107 // TString trgClasses = InputEvent()->GetFiredTriggerClasses();
1109 // physics selection
1110 if (physSel & (AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral))
1111 MarkTrigger(kTriggerInt);
1116 Bool_t AliAnalysisTaskJetProtonCorr::DetectClasses()
1121 MarkClass(kClCentral);
1123 if (IsSemiCentral())
1124 MarkClass(kClSemiCentral);
1129 Bool_t AliAnalysisTaskJetProtonCorr::PrepareEvent()
1131 Bool_t eventGood = kTRUE;
1133 // check for run change
1134 if (fRunNumber != InputEvent()->GetRunNumber()) {
1135 fRunNumber = InputEvent()->GetRunNumber();
1139 // retrieve z-vertex position
1141 const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
1143 FillH1(kHistStat, kStatVtx);
1144 FillH1(kHistVertexNctb, vtx->GetNContributors());
1145 if (vtx->GetNContributors() >= 3.)
1146 fZvtx = vtx->GetZ();
1149 // retrieve centrality
1150 AliCentrality *eventCentrality = InputEvent()->GetCentrality();
1151 if (eventCentrality) {
1152 fCentrality = eventCentrality->GetCentralityPercentile("V0M");
1153 fCentralityCheck = eventCentrality->GetCentralityPercentile("TRK");
1154 if (fCentrality >= 0.) {
1155 FillH1(kHistStat, kStatCent);
1157 // centrality estimation not reliable
1165 // retrieve event plane
1166 fEventplane = InputEvent()->GetEventplane();
1168 fEventPlaneAngle3 = fEventplane->GetEventplane("V0", InputEvent(), 3);
1170 if (fUseEvplaneV0) {
1171 fEventPlaneAngle = fEventplane->GetEventplane("V0", InputEvent());
1172 fEventPlaneAngleCheck = fEventplane->GetEventplane("Q");
1175 fEventPlaneAngle = fEventplane->GetEventplane("Q");
1176 fEventPlaneAngleCheck = fEventplane->GetEventplane("V0", InputEvent());
1177 // use V0 event plane angle from flow task:
1178 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0A();
1179 // printf("V0A evplane = %f\n", fEventPlaneAngleCheck);
1180 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0C();
1181 // printf("V0C evplane = %f\n", fEventPlaneAngleCheck);
1184 // ensure angles to be in [0, ...)
1185 if (fEventPlaneAngle3 < 0)
1186 fEventPlaneAngle3 += 2.*TMath::Pi()/3.;
1187 if (fEventPlaneAngle < 0)
1188 fEventPlaneAngle += TMath::Pi();
1189 if (fEventPlaneAngleCheck < 0)
1190 fEventPlaneAngleCheck += TMath::Pi();
1192 FillH1(kHistStat, kStatEvPlane);
1198 fPIDResponse = ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
1200 FillH1(kHistStat, kStatPID);
1204 // retrieve primary tracks
1206 fPrimTrackArrayAss = fCutsPrimAss->GetAcceptedTracks(fESDEvent);
1207 fPrimTrackArrayTrg = fCutsPrimTrg->GetAcceptedTracks(fESDEvent);
1208 if (fCutsPrimTrgConstrain) {
1209 TIter trkIter(fCutsPrimTrgConstrain->GetAcceptedTracks(fESDEvent));
1210 while (AliESDtrack *trk = (AliESDtrack*) trkIter()) {
1211 if (!fCutsPrimTrg->IsSelected(trk)) {
1212 AliESDtrack *track = (AliESDtrack*) fPrimConstrainedTrackArray->ConstructedAt(fPrimConstrainedTrackArray->GetEntriesFast());
1213 if(trk->GetConstrainedParam()) {
1214 track->Set(trk->GetConstrainedParam()->GetX(),
1215 trk->GetConstrainedParam()->GetAlpha(),
1216 trk->GetConstrainedParam()->GetParameter(),
1217 trk->GetConstrainedParam()->GetCovariance());
1219 fPrimTrackArrayTrg->Add(track);
1224 else if (fAODEvent) {
1225 // associate candidates
1226 fPrimTrackArrayAss = new TObjArray();
1227 const Int_t nTracksAODAss = fAODEvent->GetNumberOfTracks();
1228 for (Int_t iTrack = 0; iTrack < nTracksAODAss; ++iTrack) {
1229 AliAODTrack *trk = fAODEvent->GetTrack(iTrack);
1230 if (trk->TestFilterBit(fAssFilterMask))
1231 fPrimTrackArrayAss->Add(trk);
1234 // trigger candidates
1235 fPrimTrackArrayTrg = new TObjArray();
1236 const Int_t nTracksAODTrg = fAODEvent->GetNumberOfTracks();
1237 for (Int_t iTrack = 0; iTrack < nTracksAODTrg; ++iTrack) {
1238 AliAODTrack *trk = fAODEvent->GetTrack(iTrack);
1239 if (trk->IsHybridGlobalConstrainedGlobal())
1240 fPrimTrackArrayTrg->Add(trk);
1246 // retrieve jet array
1248 fJetArray = dynamic_cast<TClonesArray*> (fAODEvent->FindListObject(fJetBranchName));
1250 // still try the output event
1252 fJetArray = dynamic_cast<TClonesArray*> (AODEvent()->FindListObject(fJetBranchName));
1254 if (fErrorMsg > 0) {
1255 AliError(Form("no jet branch \"%s\" found, in the AODs are:", fJetBranchName));
1259 fAODEvent->GetList()->Print();
1261 AODEvent()->GetList()->Print();
1267 // retrieve event pool for the event category
1269 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1270 AliEventPoolManager *mgr = GetPoolMgr((Ass_t) iAss);
1271 GetPool((Ass_t) iAss) =
1272 // mgr ? mgr->GetEventPool(fCentrality, fZvtx, fEventPlaneAngle) : 0x0;
1273 mgr ? mgr->GetEventPool(fCentrality, fZvtx) : 0x0;
1280 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(const AliVTrack *trg)
1282 if (TMath::Abs(trg->Eta()) > fHadEtaMax)
1285 // check pt interval
1287 (trg->Pt() >= fTrgPartPtMin) &&
1288 (trg->Pt() <= fTrgPartPtMax);
1290 // for semi-central events check phi w.r.t. event plane
1291 Bool_t acceptOrientation = IsSemiCentral() ?
1292 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1296 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1297 if (gRandom->Rndm() > .5)
1298 phiRel -= TMath::Pi();
1300 phiRel += 2. * TMath::Pi();
1301 Float_t phiRel3 = trg->Phi() - fEventPlaneAngle3;
1303 phiRel3 += 2. * TMath::Pi();
1304 FillH2(kHistPhiTrgHadEvPlane, phiRel, fCentrality);
1305 FillH2(kHistPhiTrgHadEvPlane3, phiRel3, fCentrality);
1308 return (acceptPt && acceptOrientation);
1311 AliVTrack* AliAnalysisTaskJetProtonCorr::GetLeadingTrack(const AliAODJet *jet) const
1313 // return leading track within a jet
1315 // check contributing tracks
1316 Int_t nJetTracks = jet->GetRefTracks()->GetEntriesFast();
1317 Int_t iLeadingTrack = -1;
1318 Float_t ptLeadingTrack = 0.;
1319 for (Int_t iTrack=0; iTrack < nJetTracks; ++iTrack) {
1320 AliAODTrack *track = (AliAODTrack*) jet->GetRefTracks()->At(iTrack);
1321 // find the leading track
1322 if (track->Pt() > ptLeadingTrack) {
1323 ptLeadingTrack = track->Pt();
1324 iLeadingTrack = iTrack;
1328 // retrieve the leading track
1329 return (AliAODTrack*) jet->GetRefTracks()->At(iLeadingTrack);
1332 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(const AliAODJet *trg)
1335 if (TMath::Abs(trg->Eta()) > fTrgJetEtaMax)
1338 // reject too small jets
1339 if (trg->EffectiveAreaCharged() < fTrgJetAreaMin)
1342 // require hard leading track
1343 // (leading track biased jet sample)
1344 // but reject jets with too high pt constituents
1345 const Float_t ptLeadTrack = GetLeadingTrack(trg)->Pt();
1346 if ((ptLeadTrack < fTrgJetLeadTrkPtMin) ||
1347 (ptLeadTrack > fTrgJetLeadTrkPtMax))
1350 // check for jet orientation w.r.t. event plane
1351 // (constrained only for semi-central events)
1352 Bool_t acceptOrientation = IsSemiCentral() ?
1353 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1358 (trg->Pt() >= fTrgJetPtMin) &&
1359 (trg->Pt() <= fTrgJetPtMax);
1362 // store the azimuthal distribution relative to the event plane
1363 // for the jets in the pt range of interest
1364 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1365 if (gRandom->Rndm() > .5)
1366 phiRel -= TMath::Pi();
1368 phiRel += 2. * TMath::Pi();
1369 Float_t phiRel3 = trg->Phi() - fEventPlaneAngle3;
1371 phiRel3 += 2. * TMath::Pi();
1372 FillH2(kHistPhiTrgJetEvPlane, phiRel, fCentrality);
1373 FillH2(kHistPhiTrgJetEvPlane3, phiRel3, fCentrality);
1376 if (acceptOrientation) {
1377 // spectrum for cross checks
1378 if (IsClass(kClCentral))
1379 FillH1(kHistJetPtCentral, trg->Pt());
1380 if (IsClass(kClSemiCentral))
1381 FillH1(kHistJetPtSemi, trg->Pt());
1384 return (acceptPt && acceptOrientation);
1387 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAssoc(const AliVTrack *trk) const
1389 if ((trk->Pt() > fAssPartPtMin) && (trk->Pt() < fAssPartPtMax) && (TMath::Abs(trk->Eta()) < fHadEtaMax))
1391 if ((fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) &&
1392 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk) &&
1393 (trk->GetTPCsignalN() >= 60.) && (trk->GetTPCsignal() >= 10))
1404 Bool_t AliAnalysisTaskJetProtonCorr::IsProton(const AliVTrack *trk) const
1406 if ((fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) != AliPIDResponse::kDetPidOk) ||
1407 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) != AliPIDResponse::kDetPidOk) ||
1408 (trk->GetTPCsignalN() < 60.) || (trk->GetTPCsignal() < 10))
1411 Double_t nSigmaProtonTPC = fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton);
1412 Double_t nSigmaProtonTOF = fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton);
1414 if ((TMath::Abs(nSigmaProtonTPC) <= 2.) && (TMath::Abs(nSigmaProtonTOF) <= 2.)) {
1421 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAngleToEvPlane(Float_t phi, Float_t psi) const
1423 Float_t deltaPhi = phi - psi;
1424 while (deltaPhi < 0.)
1425 deltaPhi += 2 * TMath::Pi();
1427 // map to interval [-pi/2, pi/2)
1428 deltaPhi = std::fmod(deltaPhi + TMath::Pi()/2., TMath::Pi()) - TMath::Pi()/2.;
1429 // printf("delta phi = %f with phi = %f, psi = %f\n", deltaPhi, phi, psi);
1431 if (TMath::Abs(deltaPhi) < fTrgAngleToEvPlane)
1437 Float_t AliAnalysisTaskJetProtonCorr::GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1,
1438 Float_t phi2, Float_t pt2, Float_t charge2,
1439 Float_t radius, Float_t bSign) const
1441 // calculates dphistar
1442 // from AliUEHistograms
1444 Float_t dphistar = phi1 - phi2
1445 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1)
1446 + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
1448 static const Double_t kPi = TMath::Pi();
1452 dphistar = kPi * 2 - dphistar;
1453 if (dphistar < -kPi)
1454 dphistar = -kPi * 2 - dphistar;
1455 if (dphistar > kPi) // might look funny but is needed
1456 dphistar = kPi * 2 - dphistar;
1462 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTwoTracks(const AliVParticle *trgPart, const AliVParticle *assPart) const
1464 // apply two track pair cut
1466 Float_t phi1 = trgPart->Phi();
1467 Float_t pt1 = trgPart->Pt();
1468 Float_t charge1 = trgPart->Charge();
1470 Float_t phi2 = assPart->Phi();
1471 Float_t pt2 = assPart->Pt();
1472 Float_t charge2 = assPart->Charge();
1474 Float_t deta = trgPart->Eta() - assPart->Eta();
1476 Float_t bSign = (InputEvent()->GetMagneticField() > 0) ? 1 : -1;
1479 if (TMath::Abs(deta) < fCutsTwoTrackEff) {
1480 // check first boundaries to see if is worth to loop and find the minimum
1481 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
1482 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
1484 const Float_t kLimit = fCutsTwoTrackEff * 3;
1486 Float_t dphistarminabs = 1e5;
1487 // Float_t dphistarmin = 1e5;
1488 if ((TMath::Abs(dphistar1) < kLimit) ||
1489 (TMath::Abs(dphistar2) < kLimit) ||
1490 (dphistar1 * dphistar2 < 0)) {
1491 for (Double_t rad=0.8; rad<2.51; rad+=0.01) {
1492 Float_t dphistarabs = TMath::Abs(GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign));
1493 if (dphistarabs < dphistarminabs)
1494 dphistarminabs = dphistarabs;
1497 if (dphistarminabs < fCutsTwoTrackEff)
1505 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(CorrType_t corr, Class_t cl, Ev_t ev,
1506 TCollection *trgArray, TCollection *assArray, Float_t weight)
1508 AliHistCorr *histCorr = GetHistCorr(corr, cl, ev);
1510 AliError(Form("no correlation histograms for corr %i, cl %i, ev %i",
1515 TIter assIter(assArray);
1516 while (TObject *assObj = assIter()) {
1517 if (dynamic_cast<AliVParticle*> (assObj)) {
1518 AliVParticle *assPart = (AliVParticle*) assObj;
1519 histCorr->Ass(assPart->Phi(), assPart->Eta(), weight);
1521 else if (dynamic_cast<TLorentzVector*> (assObj)) {
1522 TLorentzVector *assVec = (TLorentzVector*) assObj;
1523 histCorr->Ass(assVec->Phi(), assVec->Eta(), weight);
1527 TIter trgIter(trgArray);
1528 while (TObject *trgObj = trgIter()) {
1529 if (AliVParticle *trgPart = dynamic_cast<AliVParticle*> (trgObj)) {
1530 // count the trigger
1531 histCorr->Trigger(trgPart->Phi(), trgPart->Eta(), weight);
1533 // loop over associates
1535 while (TObject *assObj = assIter()) {
1536 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1537 if (AcceptTwoTracks(trgPart, assPart))
1538 histCorr->Fill(trgPart, assPart, weight);
1540 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1541 AliFatal(Form("got %p, but not implemented", assVec));
1545 else if (TLorentzVector *trgVec = dynamic_cast<TLorentzVector*> (trgObj)) {
1546 // count the trigger
1547 histCorr->Trigger(trgVec->Phi(), trgVec->Eta(), weight);
1549 // loop over associates
1551 while (TObject *assObj = assIter()) {
1552 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1553 histCorr->Fill(trgVec, assPart, weight);
1555 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1556 histCorr->Fill(trgVec, assVec, weight);
1565 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(Trg_t trg, Ass_t ass, Class_t cl, Ev_t ev,
1566 TCollection *trgArray, TCollection *assArray, Float_t weight)
1568 if ((trg < 0) || (trg > kTrgJetRnd))
1569 AliFatal(Form("wrong request for correlation with trigger: %d", trg));
1571 if ((ass < 0) || (ass > kAssProt))
1572 AliFatal(Form("wrong request for correlation with associate: %d", ass));
1574 CorrType_t corr = (CorrType_t) (2 * trg + ass);
1576 return Correlate(corr, cl, ev, trgArray, assArray, weight);
1579 Bool_t AliAnalysisTaskJetProtonCorr::GenerateRandom(TCollection *trgJetArray,
1580 TCollection *trgHadArray,
1581 TCollection *assHadJetArray,
1582 TCollection *assProtJetArray,
1583 TCollection *assHadHadArray,
1584 TCollection *assProtHadArray,
1587 // generate random direction
1589 const Int_t nPart = gRandom->Poisson(fToyMeanNoPart);
1591 Float_t trgJetEta = gRandom->Uniform(-fTrgJetEtaMax, fTrgJetEtaMax);
1592 Float_t trgJetPhi = 0.;
1594 trgJetPhi = IsClass(kClSemiCentral) ?
1595 fTrgJetPhiModSemi->GetRandom() :
1596 fTrgJetPhiModCent->GetRandom();
1598 trgJetPhi += fEventPlaneAngle;
1600 trgJetPhi += 2. * TMath::Pi();
1601 else if (trgJetPhi > 2. * TMath::Pi())
1602 trgJetPhi -= 2. * TMath::Pi();
1604 Float_t phiRel = trgJetPhi- fEventPlaneAngle;
1606 phiRel += 2. * TMath::Pi();
1607 FillH2(kHistPhiRndTrgJetEvPlane, phiRel, fCentrality);
1608 } while (IsClass(kClSemiCentral) &&
1609 !AcceptAngleToEvPlane(trgJetPhi, GetEventPlaneAngle()));
1611 // generate one trigger particle
1612 TLorentzVector *trgJet = new TLorentzVector();
1613 trgJet->SetPtEtaPhiM(50., trgJetEta, trgJetPhi, .14);
1614 trgJetArray->Add(trgJet);
1616 // generate direction for away side
1617 Float_t trgJetEtaAway = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1618 Float_t trgJetPhiAway = trgJetPhi + TMath::Pi() + gRandom->Gaus(0., fToySmearPhi);
1620 // generate associated particles
1621 // with proton/hadron ratio observed in this event
1622 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1623 Float_t deltaEta, deltaPhi;
1624 const Float_t r = fToyRadius;
1626 deltaEta = gRandom->Uniform(-r, r);
1627 deltaPhi = gRandom->Uniform(-r, r);
1628 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1630 TLorentzVector *assPart = new TLorentzVector();
1631 Float_t eta = trgJetEtaAway + deltaEta;
1632 Float_t phi = trgJetPhiAway + deltaPhi;
1633 if (TMath::Abs(eta) > fHadEtaMax) {
1638 phi += 2. * TMath::Pi();
1639 while (phi > 2. * TMath::Pi())
1640 phi -= 2. * TMath::Pi();
1641 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1642 assHadJetArray->Add(assPart);
1643 if (gRandom->Uniform() < pFraction)
1644 assProtJetArray->Add(assPart);
1648 Float_t trgHadEta = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1649 Float_t trgHadPhi = 0.;
1651 trgHadPhi = IsClass(kClSemiCentral) ?
1652 fTrgHadPhiModSemi->GetRandom() :
1653 fTrgHadPhiModCent->GetRandom();
1655 trgHadPhi += fEventPlaneAngle;
1657 trgHadPhi += 2. * TMath::Pi();
1658 else if (trgHadPhi > 2. * TMath::Pi())
1659 trgHadPhi -= 2. * TMath::Pi();
1661 Float_t phiRel = trgHadPhi - fEventPlaneAngle;
1663 phiRel += 2. * TMath::Pi();
1664 FillH2(kHistPhiRndTrgHadEvPlane, phiRel, fCentrality);
1665 } while (IsClass(kClSemiCentral) &&
1666 !AcceptAngleToEvPlane(trgHadPhi, GetEventPlaneAngle()));
1668 // generate one trigger particle
1669 TLorentzVector *trgHad = new TLorentzVector();
1670 trgHad->SetPtEtaPhiM(50., trgHadEta, trgHadPhi, .14);
1671 trgHadArray->Add(trgHad);
1673 // generate direction for away side
1674 Float_t trgHadEtaAway = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1675 Float_t trgHadPhiAway = trgHadPhi + TMath::Pi() + gRandom->Gaus(0., fToySmearPhi);
1677 // generate associated particles
1678 // with proton/hadron ratio observed in this event
1679 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1680 Float_t deltaEta, deltaPhi;
1681 const Float_t r = fToyRadius;
1683 deltaEta = gRandom->Uniform(-r, r);
1684 deltaPhi = gRandom->Uniform(-r, r);
1685 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1687 TLorentzVector *assPart = new TLorentzVector();
1688 Float_t eta = trgHadEtaAway + deltaEta;
1689 Float_t phi = trgHadPhiAway + deltaPhi;
1690 if (TMath::Abs(eta) > fHadEtaMax) {
1695 phi += 2. * TMath::Pi();
1696 while (phi > 2. * TMath::Pi())
1697 phi -= 2. * TMath::Pi();
1698 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1699 assHadHadArray->Add(assPart);
1700 if (gRandom->Uniform() < pFraction)
1701 assProtHadArray->Add(assPart);
1707 Bool_t AliAnalysisTaskJetProtonCorr::CleanUpEvent()
1710 delete fPrimTrackArrayAss;
1711 fPrimTrackArrayAss = 0x0;
1712 delete fPrimTrackArrayTrg;
1713 fPrimTrackArrayTrg = 0x0;
1716 fPrimConstrainedTrackArray->Delete();
1721 TObjArray* AliAnalysisTaskJetProtonCorr::CloneTracks(TObjArray* tracks) const
1723 TObjArray* tracksClone = new TObjArray;
1724 tracksClone->SetOwner(kTRUE);
1726 Int_t nTracks = tracks->GetEntriesFast();
1727 for (Int_t i = 0; i < nTracks; i++) {
1728 // WARNING: TObject::Clone() is very!!! expensive, unusable
1729 // tracksClone->Add(particle->Clone());
1731 // if (AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (tracks->At(i)))
1732 // tracksClone->Add(new AliESDtrack(*esdTrack));
1733 // else if (AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*> (tracks->At(i)))
1734 // tracksClone->Add(new AliAODTrack(*aodTrack));
1736 if (const AliVTrack *track = dynamic_cast<const AliVTrack*> (tracks->At(i)))
1737 tracksClone->Add(new AliPartCorr(*track));
1743 AliAnalysisTaskJetProtonCorr::AliHistCorr::AliHistCorr(TString name, TList *outputList) :
1745 fOutputList(outputList),
1749 fHistCorrEtaPhi(0x0),
1750 fHistCorrAvgEtaPhi(0x0),
1751 fHistCorrTrgEtaPhi(0x0),
1752 fHistCorrAssEtaPhi(0x0),
1753 fHistDphiLo(-TMath::Pi() / 2.),
1754 fHistDphiNbins(120),
1759 fHistStat = new TH1F(Form("%s_stat", name.Data()), "statistics",
1762 fHistCorrPhi = new TH1F(Form("%s_phi", name.Data()), ";#Delta#phi",
1763 fHistDphiNbins, fHistDphiLo, 2.*TMath::Pi() + fHistDphiLo);
1764 fHistCorrPhi->Sumw2();
1765 // fHistCorrPhi2 = new TH2F(Form("%s_phi2", name.Data()), ";#phi_{trg};#phi_{ass}",
1766 // 120, 0.*TMath::Pi(), 2.*TMath::Pi(),
1767 // 120, 0.*TMath::Pi(), 2.*TMath::Pi());
1768 // fHistCorrPhi2->Sumw2();
1769 fHistCorrEtaPhi = new TH2F(Form("%s_etaphi", name.Data()), ";#Delta#phi;#Delta#eta",
1770 fHistDphiNbins, fHistDphiLo, 2*TMath::Pi() + fHistDphiLo,
1771 fHistDetaNbins, -2., 2.);
1772 fHistCorrEtaPhi->Sumw2();
1773 // fHistCorrAvgEtaPhi = new TH2F(Form("%s_avgetaphi", name.Data()), ";#Delta#phi;avg #eta",
1774 // fHistDphiNbins, fHistDphiLo, 2*TMath::Pi() + fHistDphiLo,
1775 // fHistDetaNbins, -2., 2.);
1776 // fHistCorrAvgEtaPhi->Sumw2();
1777 // fHistCorrTrgEtaPhi = new TH2F(Form("%s_trg_etaphi", name.Data()), ";#varphi;#eta",
1778 // 120, 0., 2*TMath::Pi(),
1780 // fHistCorrTrgEtaPhi->Sumw2();
1781 // fHistCorrAssEtaPhi = new TH2F(Form("%s_ass_etaphi", name.Data()), ";#varphi;#eta",
1782 // 120, 0., 2*TMath::Pi(),
1784 // fHistCorrAssEtaPhi->Sumw2();
1786 fOutputList->Add(fHistStat);
1787 fOutputList->Add(fHistCorrPhi);
1788 // fOutputList->Add(fHistCorrPhi2);
1789 fOutputList->Add(fHistCorrEtaPhi);
1790 // fOutputList->Add(fHistCorrAvgEtaPhi);
1791 // fOutputList->Add(fHistCorrTrgEtaPhi);
1792 // fOutputList->Add(fHistCorrAssEtaPhi);
1795 AliAnalysisTaskJetProtonCorr::AliHistCorr::~AliHistCorr()
1800 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(AliVParticle *trgPart, AliVParticle *assPart, Float_t weight)
1802 // fill correlation histograms from trigger particle and associate particle
1804 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1805 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1806 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1807 while (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1808 deltaPhi -= 2. * TMath::Pi();
1809 while (deltaPhi < fHistDphiLo)
1810 deltaPhi += 2. * TMath::Pi();
1812 fHistCorrPhi->Fill(deltaPhi, weight);
1814 fHistCorrPhi2->Fill(trgPart->Phi(), assPart->Phi(), weight);
1815 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1816 if (fHistCorrAvgEtaPhi)
1817 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1820 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, AliVParticle *assPart, Float_t weight)
1822 // fill correlation histograms from trigger direction and associate particle
1824 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1825 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1826 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1827 while (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1828 deltaPhi -= 2. * TMath::Pi();
1829 while (deltaPhi < fHistDphiLo)
1830 deltaPhi += 2. * TMath::Pi();
1832 fHistCorrPhi->Fill(deltaPhi, weight);
1833 if (fHistCorrPhi2) {
1834 Float_t trgPhi = trgPart->Phi();
1836 trgPhi += 2. * TMath::Pi();
1837 fHistCorrPhi2->Fill(trgPhi, assPart->Phi(), weight);
1839 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1840 if (fHistCorrAvgEtaPhi)
1841 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1844 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, TLorentzVector *assPart, Float_t weight)
1846 // fill correlation histograms from trigger direction and associate direction
1848 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1849 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1850 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1851 if (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1852 deltaPhi -= 2. * TMath::Pi();
1853 else if (deltaPhi < fHistDphiLo)
1854 deltaPhi += 2. * TMath::Pi();
1856 fHistCorrPhi->Fill(deltaPhi, weight);
1857 if (fHistCorrPhi2) {
1858 Float_t trgPhi = trgPart->Phi();
1860 trgPhi += 2. * TMath::Pi();
1861 Float_t assPhi = assPart->Phi();
1863 assPhi += 2. * TMath::Pi();
1864 fHistCorrPhi2->Fill(trgPhi, assPhi, weight);
1866 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1867 if (fHistCorrAvgEtaPhi)
1868 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1871 // ----- histogram management -----
1872 TH1* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1873 Int_t xbins, Float_t xmin, Float_t xmax,
1877 hName.Form("%s_%s", fShortTaskId, hid);
1881 h = new TH1I(hName.Data(), title,
1884 h = new TH1F(hName.Data(), title,
1886 GetHistogram(hist) = h;
1887 fOutputList->Add(h);
1891 TH2* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1892 Int_t xbins, Float_t xmin, Float_t xmax,
1893 Int_t ybins, Float_t ymin, Float_t ymax,
1897 hName.Form("%s_%s", fShortTaskId, hid);
1901 h = GetHistogram(hist) = new TH2I(hName.Data(), title,
1905 h = GetHistogram(hist) = new TH2F(hName.Data(), title,
1908 fOutputList->Add(h);
1912 TH3* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1913 Int_t xbins, Float_t xmin, Float_t xmax,
1914 Int_t ybins, Float_t ymin, Float_t ymax,
1915 Int_t zbins, Float_t zmin, Float_t zmax,
1919 hName.Form("%s_%s", fShortTaskId, hid);
1923 h = GetHistogram(hist) = new TH3I(hName.Data(), title,
1928 h = GetHistogram(hist) = new TH3F(hName.Data(), title,
1932 fOutputList->Add(h);