13 #include "AliAnalysisManager.h"
14 #include "AliInputEventHandler.h"
15 #include "AliVEvent.h"
16 #include "AliVTrack.h"
17 #include "AliVTrdTrack.h"
18 #include "AliVVertex.h"
19 #include "AliPIDResponse.h"
20 #include "AliEventPoolManager.h"
21 #include "AliOADBContainer.h"
22 #include "AliTOFPIDParams.h"
23 #include "AliAnalysisTaskVnV0.h"
26 #include "AliMCEvent.h"
27 #include "AliGenPythiaEventHeader.h"
30 #include "AliESDEvent.h"
31 #include "AliESDInputHandler.h"
32 #include "AliESDtrack.h"
33 #include "AliESDtrackCuts.h"
34 #include "AliESDTrdTrack.h"
35 #include "AliESDTrdTracklet.h"
36 #include "AliESDTrdTrigger.h"
39 #include "AliAODEvent.h"
40 #include "AliAODJet.h"
41 #include "AliAODTrack.h"
44 #include "AliAnalysisTaskJetServices.h"
45 #include "AliAnalysisHelperJetTasks.h"
47 #include "AliAnalysisTaskJetProtonCorr.h"
52 AliAnalysisTaskJetProtonCorr::AliAnalysisTaskJetProtonCorr(const char *name) :
53 AliAnalysisTaskSE(name),
58 fOADBContainerTOF(0x0),
64 fCentralityCheck(100.),
69 fEventPlaneAngleCheck(5.),
70 fEventPlaneAngle3(5.),
71 fPrimTrackArrayAss(0x0),
72 fPrimTrackArrayTrg(0x0),
73 fPrimConstrainedTrackArray(new TClonesArray("AliESDtrack", 100)),
81 fShortTaskId("jet_prot_corr"),
82 fUseStandardCuts(kTRUE),
83 fUseEvplaneV0(kFALSE),
85 fCutsPrimTrgConstrain(new AliESDtrackCuts()),
87 fCutsTwoTrackEff(0.02),
88 fAssFilterMask(1 << 10),
96 fTrgJetLeadTrkPtMin(6.),
97 fTrgJetLeadTrkPtMax(100.),
98 fTrgJetAreaMin(0.6 * TMath::Pi() * 0.2*0.2),
101 fTrgAngleToEvPlane(TMath::Pi() / 4.),
105 fTrgJetPhiModCent(new TF1("jetphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
106 fTrgJetPhiModSemi(new TF1("jetphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
107 fTrgHadPhiModCent(new TF1("hadphimodcent", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
108 fTrgHadPhiModSemi(new TF1("hadphimodsemi", "1 + 2 * [0] * cos(2*x)", 0., 2 * TMath::Pi())),
113 fSplineEventPlaneRes(0x0)
117 fkCorrTypeName[kCorrHadHad] = "hh";
118 fkCorrTypeName[kCorrHadProt] = "hp";
119 fkCorrTypeName[kCorrJetHad] = "jh";
120 fkCorrTypeName[kCorrJetProt] = "jp";
121 fkCorrTypeName[kCorrRndJetHad] = "rjh";
122 fkCorrTypeName[kCorrRndJetProt] = "rjp";
123 fkCorrTypeName[kCorrRndHadHad] = "rhh";
124 fkCorrTypeName[kCorrRndHadProt] = "rhp";
125 fkCorrTypeName[kCorrRndJetExcHad] = "rjeh";
126 fkCorrTypeName[kCorrRndJetExcProt] = "rjep";
127 fkCorrTypeName[kCorrRndHadExcHad] = "rheh";
128 fkCorrTypeName[kCorrRndHadExcProt] = "rhep";
130 fkClassName[kClCentral] = "cent";
131 fkClassName[kClSemiCentral] = "semi";
132 // fkClassName[kClDijet] = "dijet";
134 fkEvName[kEvSame] = "same";
135 fkEvName[kEvMix] = "mixed";
137 // track cuts for associates
138 if (fUseStandardCuts) {
139 fCutsPrimAss = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE);
141 fCutsPrimAss = new AliESDtrackCuts();
143 // this is taken from PWGJE track cuts
144 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
145 fCutsPrimAss->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
146 fCutsPrimAss->SetMinNClustersTPC(70);
147 fCutsPrimAss->SetMaxChi2PerClusterTPC(4);
148 fCutsPrimAss->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
149 fCutsPrimAss->SetAcceptKinkDaughters(kFALSE);
150 fCutsPrimAss->SetRequireTPCRefit(kTRUE);
151 fCutsPrimAss->SetMaxFractionSharedTPCClusters(0.4);
153 fCutsPrimAss->SetRequireITSRefit(kTRUE);
155 fCutsPrimAss->SetMaxDCAToVertexXY(2.4);
156 fCutsPrimAss->SetMaxDCAToVertexZ(3.2);
157 fCutsPrimAss->SetDCAToVertex2D(kTRUE);
159 fCutsPrimAss->SetMaxChi2PerClusterITS(36);
160 fCutsPrimAss->SetMaxChi2TPCConstrainedGlobal(36);
162 fCutsPrimAss->SetRequireSigmaToVertex(kFALSE);
164 fCutsPrimAss->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
167 fCutsPrimAss->SetEtaRange(-fHadEtaMax, fHadEtaMax);
168 fCutsPrimAss->SetPtRange(0.15, 1E+15);
170 // track cuts for triggers
171 fCutsPrimTrg = new AliESDtrackCuts(*fCutsPrimAss);
173 // azimuthal modulation for triggers
174 fTrgJetPhiModCent->SetParameter(0, fTrgJetV2Cent);
175 fTrgJetPhiModSemi->SetParameter(0, fTrgJetV2Semi);
176 fTrgHadPhiModCent->SetParameter(0, fTrgHadV2Cent);
177 fTrgHadPhiModSemi->SetParameter(0, fTrgHadV2Semi);
180 Double_t centralityBins[] = {
181 0., 2., 4., 6., 8., 10., // central
182 30., 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., // semi-central
185 Int_t nCentralityBins = sizeof(centralityBins)/sizeof(centralityBins[0]);
187 Double_t vertexBins[] = {
188 -10., -8., -6., -4., -2., 0., 2., 4., 6., 8., 10.
190 Int_t nVertexBins = sizeof(vertexBins)/sizeof(vertexBins[0]);
192 Double_t psiBins[12];
193 Int_t nPsiBins = sizeof(psiBins)/sizeof(psiBins[0]);
194 for (Int_t iBin = 0; iBin < nPsiBins; ++iBin)
195 psiBins[iBin] = iBin * TMath::Pi()/nPsiBins;
197 const Int_t poolSize = 10; // unused by current event pool implementation
198 const Int_t trackDepth = 50000; // number of tracks to maintain in mixing buffer
199 const Float_t trackDepthFraction = 0.1;
200 const Int_t targetEvents = 1;
201 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
202 GetPoolMgr((Ass_t) iAss) =
203 new AliEventPoolManager(poolSize, trackDepth,
204 nCentralityBins, centralityBins,
205 nVertexBins, vertexBins);
206 GetPoolMgr((Ass_t) iAss)->SetTargetValues(trackDepth, trackDepthFraction, targetEvents);
209 fHistCorr = new AliHistCorr*[kEvLast*kCorrLast*kClLast];
211 DefineOutput(1, TList::Class());
214 AliAnalysisTaskJetProtonCorr::~AliAnalysisTaskJetProtonCorr()
218 // delete [] fHistCorr;
221 void AliAnalysisTaskJetProtonCorr::UserCreateOutputObjects()
223 // create user output objects
225 // open OADB file and retrieve the OADB container with TOF parameters
226 TString oadbFileName =
227 TString::Format("%s/COMMON/PID/data/TOFPIDParams.root", AliAnalysisManager::GetOADBPath());
228 TFile *oadbFile = TFile::Open(oadbFileName);
229 if(!oadbFile->IsOpen())
230 AliFatal(Form("Cannot open OADB file %s", oadbFileName.Data()));
231 AliOADBContainer *oadbContainer =
232 (AliOADBContainer*) oadbFile->Get("TOFoadb");
234 AliFatal("Cannot fetch OADB container for VZERO EP selection");
235 fOADBContainerTOF = new AliOADBContainer(*oadbContainer);
241 fOutputList = new TList();
242 fOutputList->SetOwner();
246 TH1 *histStat = AddHistogram(ID(kHistStat), "event statistics;;counts",
247 kStatLast-1, .5, kStatLast-.5);
248 histStat->GetXaxis()->SetBinLabel(ID(kStatSeen));
249 histStat->GetXaxis()->SetBinLabel(ID(kStatTrg));
250 histStat->GetXaxis()->SetBinLabel(ID(kStatVtx));
251 histStat->GetXaxis()->SetBinLabel(ID(kStatEvCuts));
252 histStat->GetXaxis()->SetBinLabel(ID(kStatUsed));
253 histStat->GetXaxis()->SetBinLabel(ID(kStatCent));
254 histStat->GetXaxis()->SetBinLabel(ID(kStatEvPlane));
255 histStat->GetXaxis()->SetBinLabel(ID(kStatPID));
256 histStat->GetXaxis()->SetBinLabel(ID(kStatCentral));
257 histStat->GetXaxis()->SetBinLabel(ID(kStatSemiCentral));
259 AddHistogram(ID(kHistVertexNctb), "number of vertex contributors;N_{ctb};counts",
261 AddHistogram(ID(kHistVertexZ), "z-position of primary vertex;z (cm);counts",
264 AddHistogram(ID(kHistCentrality), "centrality;C;counts",
266 hist = AddHistogram(ID(kHistCentralityUsed), "centrality used;C;event class",
268 kClLast, -.5, kClLast-.5);
269 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
270 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
271 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
272 AddHistogram(ID(kHistCentralityCheck), "centrality check;C;counts",
274 hist = AddHistogram(ID(kHistCentralityCheckUsed), "centrality check used;C;event class",
276 kClLast, -.5, kClLast-.5);
277 hist->GetYaxis()->SetBinLabel(LAB(kClCentral));
278 hist->GetYaxis()->SetBinLabel(LAB(kClSemiCentral));
279 // hist->GetYaxis()->SetBinLabel(LAB(kClDijet));
280 AddHistogram(ID(kHistCentralityVsMult), "centrality - multiplicity;centrality percentile (%);N_{prim}",
284 AddHistogram(ID(kHistSignalTPC), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
285 100, 0., 10., 200, 0., 300.);
286 AddHistogram(ID(kHistSignalTOF), "TOF time of flight;p_{T} (GeV/#it{c});t (ns)",
287 100, 0., 10., 200, 0., 50.);
288 AddHistogram(ID(kHistBetaTOF), "TOF beta;p (GeV/#it{c}); #beta",
292 AddHistogram(ID(kHistDeltaTPC), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
293 100, 0., 10., 200, -100., 100.);
294 AddHistogram(ID(kHistDeltaTPCSemi), "TPC dE/dx;p (GeV/#it{c});dE/dx (arb. units)",
295 100, 0., 10., 200, -100., 100.);
296 AddHistogram(ID(kHistDeltaTOF), "TOF time of flight;p (GeV/#it{c});t (ns)",
297 100, 0., 10., 200, -2., 2.);
298 AddHistogram(ID(kHistDeltaTOFSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
299 100, 0., 10., 200, -2., 2.);
301 // Nsigma templates - central
302 AddHistogram(ID(kHistNsigmaTPCe), "TPC N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
305 AddHistogram(ID(kHistNsigmaTPCmu), "TPC N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
308 AddHistogram(ID(kHistNsigmaTPCpi), "TPC N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
311 AddHistogram(ID(kHistNsigmaTPCk), "TPC N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
314 AddHistogram(ID(kHistNsigmaTPCp), "TPC N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
317 AddHistogram(ID(kHistNsigmaTPCd), "TPC N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
320 AddHistogram(ID(kHistNsigmaTPCe_e), "TPC N_{#sigma,p} - e hypothesis (id. e);p (GeV/#it{c});N_{#sigma,p}",
324 AddHistogram(ID(kHistNsigmaTOFe), "TOF N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
327 AddHistogram(ID(kHistNsigmaTOFmu), "TOF N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
330 AddHistogram(ID(kHistNsigmaTOFpi), "TOF N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
333 AddHistogram(ID(kHistNsigmaTOFk), "TOF N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
336 AddHistogram(ID(kHistNsigmaTOFp), "TOF N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
339 AddHistogram(ID(kHistNsigmaTOFd), "TOF N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
342 AddHistogram(ID(kHistNsigmaTOFmismatch), "TOF N_{#sigma,p} - mismatch;p (GeV/#it{c});N_{#sigma,p}",
346 // Nsigma templates - semi-central
347 AddHistogram(ID(kHistNsigmaTPCeSemi), "TPC N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
350 AddHistogram(ID(kHistNsigmaTPCmuSemi), "TPC N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
353 AddHistogram(ID(kHistNsigmaTPCpiSemi), "TPC N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
356 AddHistogram(ID(kHistNsigmaTPCkSemi), "TPC N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
359 AddHistogram(ID(kHistNsigmaTPCpSemi), "TPC N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
362 AddHistogram(ID(kHistNsigmaTPCdSemi), "TPC N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
365 AddHistogram(ID(kHistNsigmaTPCe_eSemi), "TPC N_{#sigma,p} - e hypothesis (id. e);p (GeV/#it{c});N_{#sigma,p}",
369 AddHistogram(ID(kHistNsigmaTOFeSemi), "TOF N_{#sigma,p} - e hypothesis;p (GeV/#it{c});N_{#sigma,p}",
372 AddHistogram(ID(kHistNsigmaTOFmuSemi), "TOF N_{#sigma,p} - #mu hypothesis;p (GeV/#it{c});N_{#sigma,p}",
375 AddHistogram(ID(kHistNsigmaTOFpiSemi), "TOF N_{#sigma,p} - #pi hypothesis;p (GeV/#it{c});N_{#sigma,p}",
378 AddHistogram(ID(kHistNsigmaTOFkSemi), "TOF N_{#sigma,p} - K hypothesis;p (GeV/#it{c});N_{#sigma,p}",
381 AddHistogram(ID(kHistNsigmaTOFpSemi), "TOF N_{#sigma,p} - p hypothesis;p (GeV/#it{c});N_{#sigma,p}",
384 AddHistogram(ID(kHistNsigmaTOFdSemi), "TOF N_{#sigma,p} - d hypothesis;p (GeV/#it{c});N_{#sigma,p}",
387 AddHistogram(ID(kHistNsigmaTOFmismatchSemi), "TOF N_{#sigma,p} - mismatch;p (GeV/#it{c});N_{#sigma,p}",
392 AddHistogram(ID(kHistDeltaTOFe), "TOF #Delta;p (GeV/#it{c});t (ns)",
393 100, 0., 10., 200, -2., 2.);
394 AddHistogram(ID(kHistDeltaTOFmu), "TOF #Delta;p (GeV/#it{c});t (ns)",
395 100, 0., 10., 200, -2., 2.);
396 AddHistogram(ID(kHistDeltaTOFpi), "TOF #Delta;p (GeV/#it{c});t (ns)",
397 100, 0., 10., 200, -2., 2.);
398 AddHistogram(ID(kHistDeltaTOFk), "TOF #Delta;p (GeV/#it{c});t (ns)",
399 100, 0., 10., 200, -2., 2.);
400 AddHistogram(ID(kHistDeltaTOFp), "TOF #Delta;p (GeV/#it{c});t (ns)",
401 100, 0., 10., 200, -2., 2.);
402 AddHistogram(ID(kHistDeltaTOFd), "TOF #Delta;p (GeV/#it{c});t (ns)",
403 100, 0., 10., 200, -2., 2.);
405 AddHistogram(ID(kHistDeltaTOFeSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
406 100, 0., 10., 200, -2., 2.);
407 AddHistogram(ID(kHistDeltaTOFmuSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
408 100, 0., 10., 200, -2., 2.);
409 AddHistogram(ID(kHistDeltaTOFpiSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
410 100, 0., 10., 200, -2., 2.);
411 AddHistogram(ID(kHistDeltaTOFkSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
412 100, 0., 10., 200, -2., 2.);
413 AddHistogram(ID(kHistDeltaTOFpSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
414 100, 0., 10., 200, -2., 2.);
415 AddHistogram(ID(kHistDeltaTOFdSemi), "TOF #Delta;p (GeV/#it{c});t (ns)",
416 100, 0., 10., 200, -2., 2.);
419 // AddHistogram(ID(kHistExpSigmaTOFe), "TOF time of flight;p (GeV/#it{c});t (ns)",
420 // 100, 0., 10., 200, 0., .25);
421 // AddHistogram(ID(kHistExpSigmaTOFmu), "TOF time of flight;p (GeV/#it{c});t (ns)",
422 // 100, 0., 10., 200, 0., .25);
423 // AddHistogram(ID(kHistExpSigmaTOFpi), "TOF time of flight;p (GeV/#it{c});t (ns)",
424 // 100, 0., 10., 200, 0., .25);
425 // AddHistogram(ID(kHistExpSigmaTOFk), "TOF time of flight;p (GeV/#it{c});t (ns)",
426 // 100, 0., 10., 200, 0., .25);
427 // AddHistogram(ID(kHistExpSigmaTOFp), "TOF time of flight;p (GeV/#it{c});t (ns)",
428 // 100, 0., 10., 200, 0., .25);
429 // AddHistogram(ID(kHistExpSigmaTOFd), "TOF time of flight;p (GeV/#it{c});t (ns)",
430 // 100, 0., 10., 200, 0., .25);
432 // AddHistogram(ID(kHistExpSigmaTOFeSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
433 // 100, 0., 10., 200, 0., .25);
434 // AddHistogram(ID(kHistExpSigmaTOFmuSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
435 // 100, 0., 10., 200, 0., .25);
436 // AddHistogram(ID(kHistExpSigmaTOFpiSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
437 // 100, 0., 10., 200, 0., .25);
438 // AddHistogram(ID(kHistExpSigmaTOFkSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
439 // 100, 0., 10., 200, 0., .25);
440 // AddHistogram(ID(kHistExpSigmaTOFpSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
441 // 100, 0., 10., 200, 0., .25);
442 // AddHistogram(ID(kHistExpSigmaTOFdSemi), "TOF time of flight;p (GeV/#it{c});t (ns)",
443 // 100, 0., 10., 200, 0., .25);
445 // AddHistogram(ID(kHistCmpSigmaTOFe), "#sigma comparison;exp #sigma;template #sigma",
446 // 200, 0., .25, 200, 0., .25);
447 // AddHistogram(ID(kHistCmpSigmaTOFmu), "#sigma comparison;exp #sigma;template #sigma",
448 // 200, 0., .25, 200, 0., .25);
449 // AddHistogram(ID(kHistCmpSigmaTOFpi), "#sigma comparison;exp #sigma;template #sigma",
450 // 200, 0., .25, 200, 0., .25);
451 // AddHistogram(ID(kHistCmpSigmaTOFk), "#sigma comparison;exp #sigma;template #sigma",
452 // 200, 0., .25, 200, 0., .25);
453 // AddHistogram(ID(kHistCmpSigmaTOFp), "#sigma comparison;exp #sigma;template #sigma",
454 // 200, 0., .25, 200, 0., .25);
455 // AddHistogram(ID(kHistCmpSigmaTOFd), "#sigma comparison;exp #sigma;template #sigma",
456 // 200, 0., .25, 200, 0., .25);
458 // AddHistogram(ID(kHistCmpSigmaTOFeSemi), "#sigma comparison;exp #sigma;template #sigma",
459 // 200, 0., .25, 200, 0., .25);
460 // AddHistogram(ID(kHistCmpSigmaTOFmuSemi), "#sigma comparison;exp #sigma;template #sigma",
461 // 200, 0., .25, 200, 0., .25);
462 // AddHistogram(ID(kHistCmpSigmaTOFpiSemi), "#sigma comparison;exp #sigma;template #sigma",
463 // 200, 0., .25, 200, 0., .25);
464 // AddHistogram(ID(kHistCmpSigmaTOFkSemi), "#sigma comparison;exp #sigma;template #sigma",
465 // 200, 0., .25, 200, 0., .25);
466 // AddHistogram(ID(kHistCmpSigmaTOFpSemi), "#sigma comparison;exp #sigma;template #sigma",
467 // 200, 0., .25, 200, 0., .25);
468 // AddHistogram(ID(kHistCmpSigmaTOFdSemi), "#sigma comparison;exp #sigma;template #sigma",
469 // 200, 0., .25, 200, 0., .25);
471 // Nsigma distributions
472 AddHistogram(ID(kHistNsigmaTPCTOF), "N_{#sigma,p} TPC-TOF;p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
476 AddHistogram(ID(kHistNsigmaTPCTOFPt), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
480 AddHistogram(ID(kHistNsigmaTPCTOFUsed), "N_{#sigma,p} TPC-TOF;p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
484 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentral), "N_{#sigma,p} TPC-TOF (central);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
488 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentral), "N_{#sigma,p} TPC-TOF (semi-central);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
492 AddHistogram(ID(kHistNsigmaTPCTOFUsedPt), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
496 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtCentral), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
500 AddHistogram(ID(kHistNsigmaTPCTOFUsedPtSemiCentral), "N_{#sigma,p} TPC-TOF;p_{T} (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
505 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCe), "N_{#sigma,p} TPC-TOF (central, MC e);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
509 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCmu), "N_{#sigma,p} TPC-TOF (central, MC #mu);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
513 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCpi), "N_{#sigma,p} TPC-TOF (central, MC pi);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
517 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCk), "N_{#sigma,p} TPC-TOF (central, MC K);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
521 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCp), "N_{#sigma,p} TPC-TOF (central, MC p);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
525 AddHistogram(ID(kHistNsigmaTPCTOFUsedCentralMCd), "N_{#sigma,p} TPC-TOF (central, MC d);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
530 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCe), "N_{#sigma,p} TPC-TOF (semi-central, MC e);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
534 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCmu), "N_{#sigma,p} TPC-TOF (semi-central, MC #mu);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
538 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCpi), "N_{#sigma,p} TPC-TOF (semi-central, MC pi);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
542 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCk), "N_{#sigma,p} TPC-TOF (semi-central, MC K);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
546 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCp), "N_{#sigma,p} TPC-TOF (semi-central, MC p);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
550 AddHistogram(ID(kHistNsigmaTPCTOFUsedSemiCentralMCd), "N_{#sigma,p} TPC-TOF (semi-central, MC d);p (GeV/#it{c});N_{#sigma,p}^{TPC};N_{#sigma,p}^{TOF}",
555 AddHistogram(ID(kHistNevMix), "no. of events for mixing;N_{ev};counts",
559 AddHistogram(ID(kHistEvPlane), "default event plane;#Psi;counts",
560 100, -0. * TMath::Pi(), 1. * TMath::Pi());
561 AddHistogram(ID(kHistEvPlaneRes), "resolution of default event plane;R^{2};centrality (%)",
564 AddHistogram(ID(kHistEvPlaneUsed), "default event plane;#Psi;counts",
565 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
566 kClLast, -.5, kClLast-.5);
567 AddHistogram(ID(kHistEvPlaneCheck), "backup event plane;#Psi;counts",
568 100, -1. * TMath::Pi(), 1. * TMath::Pi());
569 AddHistogram(ID(kHistEvPlaneCheckUsed), "backup event plane;#Psi;counts",
570 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
571 kClLast, -.5, kClLast-.5);
572 AddHistogram(ID(kHistEvPlane3), "3rd order event plane;#Psi;counts",
573 100, -0. * TMath::Pi(), 2./3. * TMath::Pi());
574 AddHistogram(ID(kHistEvPlaneCorr), "default - backup event plane;#Psi_{def};#Psi_{bak};event class",
575 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
576 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
577 kClLast, -.5, kClLast-.5);
578 AddHistogram(ID(kHistEvPlaneCross), "default - backup event plane;R_{a} R_{b};centrality",
581 AddHistogram(ID(kHistEvPlaneCorrNoTrgJets), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
582 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
583 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
584 kClLast, -.5, kClLast-.5);
585 AddHistogram(ID(kHistEvPlaneCorrNoTrgJetsTrgd), "event plane w/ and w/o trigger jets;#Psi_{full};#Psi_{notrgjets};event class",
586 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
587 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
588 kClLast, -.5, kClLast-.5);
590 AddHistogram(ID(kHistJetPtCentral), "jet spectrum - central;p_{T}^{jet,ch} (GeV/#it{c});counts",
592 AddHistogram(ID(kHistJetPtSemi), "jet spectrum - semi-peripheral;p_{T}^{jet,ch} (GeV/#it{c});counts",
595 AddHistogram(ID(kHistEtaPhiTrgHad), "trg had;#varphi;#eta",
596 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
598 AddHistogram(ID(kHistEtaPhiTrgJet), "trg jet;#varphi;#eta",
599 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
601 AddHistogram(ID(kHistEtaPhiAssHad), "ass had;#varphi;#eta",
602 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
604 AddHistogram(ID(kHistEtaPhiAssProt), "ass proton;#varphi;#eta",
605 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
608 AddHistogram(ID(kHistPhiTrgJetEvPlane), "trg jet;#varphi - #Psi_{ev};centrality",
609 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
611 AddHistogram(ID(kHistPhiTrgHadEvPlane), "trg had;#varphi - #Psi_{ev};centrality",
612 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
614 AddHistogram(ID(kHistPhiRndTrgJetEvPlane), "rnd trg jet;#varphi - #Psi_{ev};centrality",
615 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
617 AddHistogram(ID(kHistPhiRndTrgHadEvPlane), "rnd trg had;#varphi - #Psi_{ev};centrality",
618 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
620 AddHistogram(ID(kHistPhiAssHadEvPlane), "ass had;#varphi - #Psi_{ev};centrality",
621 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
623 AddHistogram(ID(kHistPhiAssProtEvPlane), "ass prot;#varphi - #Psi_{ev};centrality",
624 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
626 AddHistogram(ID(kHistPhiAssHadVsEvPlane), "ass had;#Psi_{ev};#varphi;centrality",
627 100, -0. * TMath::Pi(), 1. * TMath::Pi(),
628 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
631 AddHistogram(ID(kHistPhiTrgJetEvPlane3), "trg jet;#varphi - #Psi_{ev};centrality",
632 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
634 AddHistogram(ID(kHistPhiTrgHadEvPlane3), "trg had;#varphi - #Psi_{ev};centrality",
635 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
637 AddHistogram(ID(kHistPhiAssHadEvPlane3), "ass had;#varphi - #Psi_{ev};centrality",
638 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
640 AddHistogram(ID(kHistPhiAssProtEvPlane3), "ass prot;#varphi - #Psi_{ev};centrality",
641 100, -0. * TMath::Pi(), 2. * TMath::Pi(),
644 for (Int_t iCorr = 0; iCorr < kCorrLast; ++iCorr) {
645 for (Int_t iCl = 0; iCl < kClLast; ++iCl) {
646 for (Int_t iEv = 0; iEv < kEvLast; ++iEv) {
647 // we don't need the mixed event histograms for the embedded excess particles
648 if ((iCorr > kCorrRndJetProt) && (iEv == kEvMix))
651 GetHistCorr((CorrType_t) iCorr, (Class_t) iCl, (Ev_t) iEv) =
652 new AliHistCorr(Form("corr_%s_%s_%s", fkCorrTypeName[iCorr], fkClassName[iCl], fkEvName[iEv]), fOutputList);
657 PostData(1, fOutputList);
660 Bool_t AliAnalysisTaskJetProtonCorr::Notify()
662 // actions to be taken upon notification about input file change
664 return AliAnalysisTaskSE::Notify();
667 void AliAnalysisTaskJetProtonCorr::SetParamsTOF()
670 dynamic_cast<AliTOFPIDParams*> (fOADBContainerTOF->GetObject(fRunNumber, "TOFparams"));
673 AliError(Form("failed to load TOF parameters for run %i", fRunNumber));
674 else if (fDebug > 2) {
675 printf("loaded TOF parameters for run %i\n",
677 printf(" intrinsic resolution: %f ps\n",
678 fParamsTOF->GetTOFresolution());
679 printf(" tail fraction: %f\n",
680 fParamsTOF->GetTOFtail());
681 printf(" start time method: %i\n",
682 fParamsTOF->GetStartTimeMethod());
683 printf(" TOF signal parametrization: %f, %f, %f, %f\n",
684 fParamsTOF->GetSigParams(0), fParamsTOF->GetSigParams(1),
685 fParamsTOF->GetSigParams(2), fParamsTOF->GetSigParams(3));
686 printf(" matching loss MC: %f%%\n",
687 fParamsTOF->GetTOFmatchingLossMC());
688 printf(" additional mismatch for MC: %f%%\n",
689 fParamsTOF->GetTOFadditionalMismForMC());
690 printf(" time offset: %f\n",
691 fParamsTOF->GetTOFtimeOffset());
695 void AliAnalysisTaskJetProtonCorr::UserExec(Option_t * /* option */)
699 // setup pointers to input data (null if unavailable)
701 // esdEvent: ESD input
702 // outEvent: AOD output
703 // aodEvent: AOD input if available, otherwise AOD output
705 fMCEvent = this->MCEvent();
706 fESDEvent = dynamic_cast<AliESDEvent*>(this->InputEvent()); // could also be AOD input
707 AliAODEvent* outEvent = this->AODEvent();
708 fAODEvent = dynamic_cast<AliAODEvent*> (this->InputEvent());
710 fAODEvent = outEvent;
712 if ((fDebug > 0) && fESDEvent)
713 printf("event: %s-%06i\n", CurrentFileName(), fESDEvent->GetEventNumberInFile());
715 // record number of sampled events and detect trigger contributions
716 FillH1(kHistStat, kStatSeen);
717 if (!DetectTriggers()) {
718 AliError("Failed to detect the triggers");
722 if (!IsTrigger(kTriggerInt))
725 FillH1(kHistStat, kStatTrg);
728 // (make sure it is cleaned up in the end)
729 if (PrepareEvent()) {
730 FillH1(kHistStat, kStatUsed);
731 FillH1(kHistCentrality, fCentrality);
732 FillH1(kHistCentralityCheck, fCentralityCheck);
734 FillH1(kHistVertexZ, fZvtx);
737 if (TMath::Abs(fZvtx) > 10.)
739 if (GetCentrality() > 90.)
742 FillH1(kHistStat, kStatEvCuts);
746 if (IsClass(kClCentral))
747 FillH1(kHistStat, kStatCentral);
748 if (IsClass(kClSemiCentral))
749 FillH1(kHistStat, kStatSemiCentral);
751 FillH1(kHistEvPlane, fEventPlaneAngle);
752 FillH2(kHistEvPlaneRes, fEventPlaneRes, fCentrality);
753 FillH1(kHistEvPlaneCheck, fEventPlaneAngleCheck);
754 FillH1(kHistEvPlane3, fEventPlaneAngle3);
755 FillH2(kHistEvPlaneCross, TMath::Cos(2. * (fEventPlaneAngle - fEventPlaneAngleCheck)), GetCentrality());
756 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
757 if (IsClass((Class_t) iClass)) {
758 FillH2(kHistCentralityUsed, fCentrality, iClass);
759 FillH2(kHistCentralityCheckUsed, fCentralityCheck, iClass);
760 FillH2(kHistEvPlaneUsed, fEventPlaneAngle, iClass);
761 FillH2(kHistEvPlaneCheckUsed, fEventPlaneAngleCheck, iClass);
762 FillH3(kHistEvPlaneCorr, fEventPlaneAngle, fEventPlaneAngleCheck, iClass);
766 Bool_t corrEta = fPIDResponse->UseTPCEtaCorrection();
767 Bool_t corrMult = fPIDResponse->UseTPCMultiplicityCorrection();
769 // select trigger particles and potential associated particles/protons
770 TObjArray trgArray[kTrgLast];
771 TObjArray assArray[kAssLast];
773 // prepare TOF response
774 TF1 fTOFsignal("fTOFsignal", &AliAnalysisTaskJetProtonCorr::TOFsignal, -2440., 2440., 4);
775 fTOFsignal.SetParameter(0, 1.);
776 fTOFsignal.SetParameter(1, 0.);
778 Float_t res = fParamsTOF->GetTOFresolution();
779 Float_t tail = fParamsTOF->GetTOFtail() * res;
780 fTOFsignal.SetParameter(2, res);
781 fTOFsignal.SetParameter(3, tail);
784 fTOFsignal.SetParameter(2, 85.);
785 fTOFsignal.SetParameter(3, 80.);
788 // associate candidates
789 const Int_t nPrimTracksAss = fPrimTrackArrayAss ? fPrimTrackArrayAss->GetEntries() : 0;
790 FillH2(kHistCentralityVsMult, fCentrality, nPrimTracksAss);
791 for (Int_t iTrack = 0; iTrack < nPrimTracksAss; ++iTrack) {
792 AliVTrack *trk = (AliVTrack*) fPrimTrackArrayAss->At(iTrack);
793 FillH2(kHistSignalTPC, trk->P(), trk->GetTPCsignal());
795 FillH2(kHistSignalTOF, trk->P(), trk->GetTOFsignal() * 1.e-3); // ps -> ns
796 FillH3(kHistNsigmaTPCTOF,
798 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
799 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
800 FillH3(kHistNsigmaTPCTOFPt,
802 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
803 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
805 FillH3(kHistPhiAssHadVsEvPlane, fEventPlaneAngle, trk->Phi(), fCentrality);
807 if (AcceptAssoc(trk)) {
808 Float_t phiRel = GetPhiRel2(trk);
809 Float_t phiRel3 = trk->Phi() - fEventPlaneAngle3;
811 phiRel3 += 2. * TMath::Pi();
812 assArray[kAssHad].Add(trk);
813 FillH1(kHistEtaPhiAssHad, trk->Phi(), trk->Eta());
814 FillH2(kHistPhiAssHadEvPlane, phiRel, fCentrality);
815 FillH2(kHistPhiAssHadEvPlane3, phiRel3, fCentrality);
816 FillH3(kHistNsigmaTPCTOFUsed,
818 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
819 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
820 FillH3(kHistNsigmaTPCTOFUsedPt,
822 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
823 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
826 if (IsClass(kClCentral)) {
827 FillH3(kHistNsigmaTPCTOFUsedCentral,
829 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
830 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
831 FillH3(kHistNsigmaTPCTOFUsedPtCentral,
833 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
834 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
836 if (AliMCParticle *mcPart = (AliMCParticle*) fMCEvent->GetTrack(TMath::Abs(trk->GetLabel()))) {
837 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
838 if (TMath::Abs(mcPart->Particle()->GetPdgCode()) == AliPID::ParticleCode(iParticle))
839 FillH3(kHistNsigmaTPCTOFUsedCentralMCe,
841 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
842 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton),
849 // semi-central events
850 if (IsClass(kClSemiCentral)) {
851 FillH3(kHistNsigmaTPCTOFUsedSemiCentral,
853 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
854 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
855 FillH3(kHistNsigmaTPCTOFUsedPtSemiCentral,
857 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
858 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton));
860 if (AliMCParticle *mcPart = (AliMCParticle*) fMCEvent->GetTrack(TMath::Abs(trk->GetLabel()))) {
861 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
862 if (TMath::Abs(mcPart->Particle()->GetPdgCode()) == AliPID::ParticleCode(iParticle))
863 FillH3(kHistNsigmaTPCTOFUsedSemiCentralMCe,
865 fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton),
866 fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton),
875 assArray[kAssProt].Add(trk);
876 FillH1(kHistEtaPhiAssProt, trk->Phi(), trk->Eta());
877 FillH2(kHistPhiAssProtEvPlane, phiRel, fCentrality);
878 FillH2(kHistPhiAssProtEvPlane3, phiRel3, fCentrality);
881 // template generation
882 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) {
884 fPIDResponse->GetSignalDelta(AliPIDResponse::kTPC, trk, AliPID::kProton, deltaTPC);
885 if (IsClass(kClCentral))
886 FillH2(kHistDeltaTPC, trk->P(), deltaTPC);
887 if (IsClass(kClSemiCentral))
888 FillH2(kHistDeltaTPCSemi, trk->P(), deltaTPC);
890 Double_t expTPC = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
891 Double_t expSigmaTPC = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::kProton, AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
893 // loop over particles
894 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
895 Double_t expTPCx = fPIDResponse->GetTPCResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
896 Double_t expSigmaTPCx = fPIDResponse->GetTPCResponse().GetExpectedSigma(trk, AliPID::EParticleType(iParticle), AliTPCPIDResponse::kdEdxDefault, corrEta, corrMult);
897 Double_t rndTPCx = gRandom->Gaus(expTPCx, expSigmaTPCx);
899 if(IsClass(kClCentral))
900 FillH2(kHistNsigmaTPCe, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
901 if(IsClass(kClSemiCentral))
902 FillH2(kHistNsigmaTPCeSemi, trk->P(), (rndTPCx-expTPC)/expSigmaTPC, 1., iParticle);
906 if (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk) {
908 fPIDResponse->GetSignalDelta(AliPIDResponse::kTOF, trk, AliPID::kProton, deltaTOF);
910 AliTOFPIDResponse &tofResponse = fPIDResponse->GetTOFResponse();
912 Float_t p = trk->P();
913 if (const AliExternalTrackParam *param = trk->GetInnerParam())
916 Double_t expTOF = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::kProton);
917 Double_t expSigmaTOF = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOF, AliPID::kProton);
918 Double_t length = trk->GetIntegratedLength() * 1.e-2; // cm -> m
919 Double_t tof = trk->GetTOFsignal() * 1.e-12; // ps -> s
920 Double_t beta = length / tof / TMath::C();
922 FillH2(kHistBetaTOF, p, beta);
924 // intrinsic TOF smearing
925 // Double_t signalSigma = TMath::Sqrt(fTOFsignal.Variance(-2000., 2000.));
926 Double_t signalSmear = fTOFsignal.GetRandom();
928 Float_t timezeroSigma = tofResponse.GetT0binRes(tofResponse.GetMomBin(p));
929 Double_t timezeroSmear = gRandom->Gaus(0., timezeroSigma);
930 // tracking smearing (default parameters, should be overwritten from OADB)
931 Double_t fPar[] = { 0.008, 0.008, 0.002, 40.0 };
933 for (Int_t i = 0; i < 4; ++i)
934 fPar[i] = fParamsTOF->GetSigParams(i);
936 // loop over particles
937 for (Int_t iParticle = 0; iParticle <= AliPID::kDeuteron; ++iParticle) {
938 Double_t expTOFx = fPIDResponse->GetTOFResponse().GetExpectedSignal(trk, AliPID::EParticleType(iParticle));
939 // Double_t cmpSigmaTOFx = fPIDResponse->GetTOFResponse().GetExpectedSigma(p, expTOFx, AliPID::EParticleType(iParticle));
942 Double_t massx = AliPID::ParticleMassZ(AliPID::EParticleType(iParticle));
943 Double_t dppx = fPar[0] + fPar[1] * p + fPar[2] * massx / p;
944 Double_t expSigmaTOFx = dppx * expTOFx / (1.+ p * p / (massx * massx));
945 Double_t texpSmearx = gRandom->Gaus(0., TMath::Sqrt(expSigmaTOFx * expSigmaTOFx + fPar[3]*fPar[3]/p/p));
946 // Double_t tmpSigmaTOFx = TMath::Sqrt(signalSigma*signalSigma +
947 // timezeroSigma*timezeroSigma +
948 // expSigmaTOFx*expSigmaTOFx + fPar[3]*fPar[3]/p/p);
949 // printf("sigma comparison %i, %f: %f, %f, %f -> %f vs %f\n",
950 // iParticle, expTOFx,
951 // signalSigma, // signal
952 // timezeroSigma, // timezero
953 // expSigmaTOFx, // tracking
954 // tmpSigmaTOFx, // total
955 // cmpSigmaTOFx); // from PID response
958 Double_t rndTOFx = expTOFx + signalSmear + timezeroSmear + texpSmearx;
960 if (IsClass(kClCentral)) {
961 FillH2(kHistNsigmaTOFe, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
962 FillH2(kHistDeltaTOFe, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
963 // FillH2(kHistExpSigmaTOFe, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
964 // FillH2(kHistCmpSigmaTOFe, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
966 if (IsClass(kClSemiCentral)) {
967 FillH2(kHistNsigmaTOFeSemi, trk->P(), (rndTOFx-expTOF)/expSigmaTOF, 1., iParticle);
968 FillH2(kHistDeltaTOFeSemi, trk->P(), (rndTOFx-expTOF) * 1.e-3, 1., iParticle);
969 // FillH2(kHistCmpSigmaTOFeSemi, cmpSigmaTOFx * 1.e-3, tmpSigmaTOFx * 1.e-3, 1., iParticle);
970 // FillH2(kHistExpSigmaTOFeSemi, p, cmpSigmaTOFx * 1.e-3, 1., iParticle);
974 Double_t rndTOFmismatch = AliTOFPIDResponse::GetMismatchRandomValue(trk->Eta());
976 if(IsClass(kClCentral)) {
977 FillH2(kHistNsigmaTOFmismatch, trk->P(), (rndTOFmismatch - expTOF) / expSigmaTOF);
978 FillH2(kHistDeltaTOF, trk->P(), deltaTOF * 1.e-3); // ps -> ns
980 if(IsClass(kClSemiCentral)) {
981 FillH2(kHistNsigmaTOFmismatchSemi, trk->P(), (rndTOFmismatch - expTOF) / expSigmaTOF);
982 FillH2(kHistDeltaTOFSemi, trk->P(), deltaTOF * 1.e-3); // ps -> ns
988 const Int_t nPrimTracksTrg = fPrimTrackArrayTrg ? fPrimTrackArrayTrg->GetEntries() : 0;
989 for (Int_t iTrack = 0; iTrack < nPrimTracksTrg; ++iTrack) {
990 AliVTrack *trk = (AliVTrack*) fPrimTrackArrayTrg->At(iTrack);
991 if (AcceptTrigger(trk)) {
992 trgArray[kTrgHad].Add(trk);
993 FillH1(kHistEtaPhiTrgHad, trk->Phi(), trk->Eta());
997 // select trigger jet
998 // and remove them from the Q vector
999 Int_t nJets = fJetArray ? fJetArray->GetEntries() : 0;
1000 const TVector2 *qVectorOrig = fEventplane->GetQVector();
1003 qVector = *qVectorOrig;
1005 for (Int_t iJet = 0; iJet < nJets; ++iJet) {
1006 AliAODJet *jet = (AliAODJet*) fJetArray->At(iJet);
1008 if (AcceptTrigger(jet)) {
1009 trgArray[kTrgJet].Add(jet);
1010 FillH1(kHistEtaPhiTrgJet, jet->Phi(), jet->Eta());
1013 Int_t nRefTracks = jet->GetRefTracks()->GetEntriesFast();
1014 for (Int_t iTrack = 0; iTrack < nRefTracks; ++iTrack) {
1015 AliVTrack *track = (AliVTrack*) jet->GetRefTracks()->At(iTrack);
1017 if (fEventplane && track &&
1018 (track->GetID() > -1)) {
1019 TVector2 evplaneContrib(fEventplane->GetQContributionX(track),
1020 fEventplane->GetQContributionY(track));
1021 qVector -= evplaneContrib;
1028 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
1029 if (IsClass((Class_t) iClass)) {
1030 FillH3(kHistEvPlaneCorrNoTrgJets, qVectorOrig->Phi()/2., qVector.Phi()/2., iClass);
1031 if (trgArray[kTrgJet].GetEntriesFast() > 0)
1032 FillH3(kHistEvPlaneCorrNoTrgJetsTrgd, qVectorOrig->Phi()/2., qVector.Phi()/2., iClass);
1037 // invent a trigger jet/hadron and correlated associates
1038 Float_t pFraction = assArray[kAssHad].GetEntries() > 0 ?
1039 (Float_t) (assArray[kAssProt].GetEntries()) / assArray[kAssHad].GetEntries() :
1041 GenerateRandom(&trgArray[kTrgJetRnd], &trgArray[kTrgHadRnd],
1042 &assArray[kAssHadJetExc], &assArray[kAssProtJetExc],
1043 &assArray[kAssHadHadExc], &assArray[kAssProtHadExc],
1046 // correlate, both same and mixed event
1047 for (Int_t iClass = 0; iClass < kClLast; ++iClass) {
1048 if (IsClass((Class_t) iClass)) {
1049 for (Int_t iTrg = 0; iTrg < kTrgLast; ++iTrg) {
1050 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1052 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvSame, &trgArray[iTrg], &assArray[iAss]);
1055 AliEventPool *pool = GetPool((Ass_t) iAss);
1057 FillH2(kHistNevMix, pool->GetCurrentNEvents(), iAss);
1058 if (pool && pool->IsReady()) {
1059 AliDebug(1, Form("----- using pool: %i %i %i -----", iClass, iTrg, iAss));
1060 const Int_t nEvents = pool->GetCurrentNEvents();
1061 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
1062 TObjArray *assTracks = pool->GetEvent(iEvent);
1063 Correlate((Trg_t) iTrg, (Ass_t) iAss, (Class_t) iClass, kEvMix, &trgArray[iTrg], assTracks, 1./nEvents);
1069 // fill event pool for mixing
1070 // >= 0: don't require a trigger in the event
1071 // >= 1: require a trigger in the event
1072 // if (trgArray[iTrg].GetEntries() >= 0) {
1073 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1074 AliEventPool *pool = GetPool((Ass_t) iAss);
1076 pool->UpdatePool(CloneTracks(&assArray[iAss]));
1077 AliDebug(1, Form("----- updating pool: %i -----", iAss));
1084 // correlate artificial triggers and associates
1085 Correlate(kCorrRndJetExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssHadJetExc]);
1086 Correlate(kCorrRndJetExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgJetRnd], &assArray[kAssProtJetExc]);
1087 Correlate(kCorrRndHadExcHad, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssHadHadExc]);
1088 Correlate(kCorrRndHadExcProt, (Class_t) iClass, kEvSame, &trgArray[kTrgHadRnd], &assArray[kAssProtHadExc]);
1092 trgArray[kTrgJetRnd].Delete();
1093 trgArray[kTrgHadRnd].Clear();
1094 assArray[kAssHadJetExc].Delete();
1095 assArray[kAssProtJetExc].Clear();
1096 assArray[kAssHadHadExc].Delete();
1097 assArray[kAssProtHadExc].Clear();
1103 PostData(1, fOutputList);
1106 void AliAnalysisTaskJetProtonCorr::Terminate(const Option_t * /* option */)
1108 // actions at task termination
1112 void AliAnalysisTaskJetProtonCorr::PrintTask(Option_t *option, Int_t indent) const
1114 AliAnalysisTaskSE::PrintTask(option, indent);
1116 std::cout << std::setw(indent) << " " << "using jet branch: " << fJetBranchName << std::endl;
1119 Bool_t AliAnalysisTaskJetProtonCorr::DetectTriggers()
1123 AliVEvent::EOfflineTriggerTypes physSel =
1124 (AliVEvent::EOfflineTriggerTypes) ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1125 // TString trgClasses = InputEvent()->GetFiredTriggerClasses();
1127 // physics selection
1128 if (physSel & (AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral))
1129 MarkTrigger(kTriggerInt);
1134 Bool_t AliAnalysisTaskJetProtonCorr::DetectClasses()
1139 MarkClass(kClCentral);
1141 if (IsSemiCentral())
1142 MarkClass(kClSemiCentral);
1147 Bool_t AliAnalysisTaskJetProtonCorr::PrepareEvent()
1149 Bool_t eventGood = kTRUE;
1151 // check for run change
1152 if (fRunNumber != InputEvent()->GetRunNumber()) {
1153 fRunNumber = InputEvent()->GetRunNumber();
1157 // retrieve z-vertex position
1159 const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
1161 FillH1(kHistStat, kStatVtx);
1162 FillH1(kHistVertexNctb, vtx->GetNContributors());
1163 if (vtx->GetNContributors() >= 3.)
1164 fZvtx = vtx->GetZ();
1167 // retrieve centrality
1168 AliCentrality *eventCentrality = InputEvent()->GetCentrality();
1169 if (eventCentrality) {
1170 fCentrality = eventCentrality->GetCentralityPercentile("V0M");
1171 fCentralityCheck = eventCentrality->GetCentralityPercentile("TRK");
1172 if (fCentrality >= 0.) {
1173 FillH1(kHistStat, kStatCent);
1175 // centrality estimation not reliable
1183 // retrieve event plane
1184 fEventplane = InputEvent()->GetEventplane();
1186 fEventPlaneAngle3 = fEventplane->GetEventplane("V0", InputEvent(), 3);
1188 if (fUseEvplaneV0) {
1189 fEventPlaneAngle = fEventplane->GetEventplane("V0", InputEvent());
1190 fEventPlaneAngleCheck = fEventplane->GetEventplane("Q");
1193 fEventPlaneAngle = fEventplane->GetEventplane("Q");
1194 fEventPlaneRes = TMath::Cos(2 * fEventplane->GetQsubRes());
1195 fEventPlaneAngleCheck = fEventplane->GetEventplane("V0", InputEvent());
1196 // use V0 event plane angle from flow task:
1197 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0A();
1198 // printf("V0A evplane = %f\n", fEventPlaneAngleCheck);
1199 // fEventPlaneAngleCheck = AliAnalysisTaskVnV0::GetPsi2V0C();
1200 // printf("V0C evplane = %f\n", fEventPlaneAngleCheck);
1203 // ensure angles to be in [0, ...)
1204 if (fEventPlaneAngle3 < 0)
1205 fEventPlaneAngle3 += 2.*TMath::Pi()/3.;
1206 if (fEventPlaneAngle < 0)
1207 fEventPlaneAngle += TMath::Pi();
1208 if (fEventPlaneAngleCheck < 0)
1209 fEventPlaneAngleCheck += TMath::Pi();
1211 FillH1(kHistStat, kStatEvPlane);
1217 fPIDResponse = ((AliInputEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
1219 FillH1(kHistStat, kStatPID);
1223 // retrieve primary tracks
1225 fPrimTrackArrayAss = fCutsPrimAss->GetAcceptedTracks(fESDEvent);
1226 fPrimTrackArrayTrg = fCutsPrimTrg->GetAcceptedTracks(fESDEvent);
1227 if (fCutsPrimTrgConstrain) {
1228 TIter trkIter(fCutsPrimTrgConstrain->GetAcceptedTracks(fESDEvent));
1229 while (AliESDtrack *trk = (AliESDtrack*) trkIter()) {
1230 if (!fCutsPrimTrg->IsSelected(trk)) {
1231 AliESDtrack *track = (AliESDtrack*) fPrimConstrainedTrackArray->ConstructedAt(fPrimConstrainedTrackArray->GetEntriesFast());
1232 if(trk->GetConstrainedParam()) {
1233 track->Set(trk->GetConstrainedParam()->GetX(),
1234 trk->GetConstrainedParam()->GetAlpha(),
1235 trk->GetConstrainedParam()->GetParameter(),
1236 trk->GetConstrainedParam()->GetCovariance());
1238 fPrimTrackArrayTrg->Add(track);
1243 else if (fAODEvent) {
1244 // associate candidates
1245 fPrimTrackArrayAss = new TObjArray();
1246 const Int_t nTracksAODAss = fAODEvent->GetNumberOfTracks();
1247 for (Int_t iTrack = 0; iTrack < nTracksAODAss; ++iTrack) {
1248 AliAODTrack *trk = fAODEvent->GetTrack(iTrack);
1249 if (trk->TestFilterBit(fAssFilterMask))
1250 fPrimTrackArrayAss->Add(trk);
1253 // trigger candidates
1254 fPrimTrackArrayTrg = new TObjArray();
1255 const Int_t nTracksAODTrg = fAODEvent->GetNumberOfTracks();
1256 for (Int_t iTrack = 0; iTrack < nTracksAODTrg; ++iTrack) {
1257 AliAODTrack *trk = fAODEvent->GetTrack(iTrack);
1258 if (trk->IsHybridGlobalConstrainedGlobal())
1259 fPrimTrackArrayTrg->Add(trk);
1265 // retrieve jet array
1267 fJetArray = dynamic_cast<TClonesArray*> (fAODEvent->FindListObject(fJetBranchName));
1269 // still try the output event
1271 fJetArray = dynamic_cast<TClonesArray*> (AODEvent()->FindListObject(fJetBranchName));
1273 if (fErrorMsg > 0) {
1274 AliError(Form("no jet branch \"%s\" found, in the AODs are:", fJetBranchName));
1278 fAODEvent->GetList()->Print();
1280 AODEvent()->GetList()->Print();
1286 // retrieve event pool for the event category
1288 for (Int_t iAss = 0; iAss <= kAssProt; ++iAss) {
1289 AliEventPoolManager *mgr = GetPoolMgr((Ass_t) iAss);
1290 GetPool((Ass_t) iAss) =
1291 // mgr ? mgr->GetEventPool(fCentrality, fZvtx, fEventPlaneAngle) : 0x0;
1292 mgr ? mgr->GetEventPool(fCentrality, fZvtx) : 0x0;
1299 Float_t AliAnalysisTaskJetProtonCorr::GetPhiRel2(AliVParticle *part) const
1301 // calculate the angle to the event plane
1302 // after removing the particle's own contribution to the Q vector
1304 AliVTrack *track = dynamic_cast<AliVTrack*> (part);
1305 AliAODJet *jet = dynamic_cast<AliAODJet*> (part);
1307 Float_t phiRel = -1.;
1312 const TVector2 *qVectorOrig = fEventplane->GetQVector();
1316 TVector2 qVector = *qVectorOrig;
1318 // ??? protect against negative ID
1319 // but should be handled properly by event plane
1320 if (track && (track->GetID() > -1)) {
1321 TVector2 evplaneContrib(fEventplane->GetQContributionX(track),
1322 fEventplane->GetQContributionY(track));
1323 qVector -= evplaneContrib;
1326 const Int_t nRefTracks = jet->GetRefTracks()->GetEntriesFast();
1327 for (Int_t iTrack = 0; iTrack < nRefTracks; ++iTrack) {
1328 AliVTrack *contrib = (AliVTrack*) jet->GetRefTracks()->At(iTrack);
1330 if (contrib && (contrib->GetID() > -1)) {
1331 TVector2 evplaneContrib(fEventplane->GetQContributionX(contrib),
1332 fEventplane->GetQContributionY(contrib));
1333 qVector -= evplaneContrib;
1338 // assign phiRel and map to [0, 2 pi)
1339 phiRel = part->Phi() - (qVector.Phi() / 2.);
1340 // if (gRandom->Rndm() > .5)
1341 // phiRel -= TMath::Pi();
1343 phiRel += TMath::TwoPi();
1344 while (phiRel > TMath::TwoPi())
1345 phiRel -= TMath::TwoPi();
1350 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(AliVTrack *trg)
1352 if (TMath::Abs(trg->Eta()) > fHadEtaMax)
1355 // check pt interval
1357 (trg->Pt() >= fTrgPartPtMin) &&
1358 (trg->Pt() <= fTrgPartPtMax);
1360 // for semi-central events check phi w.r.t. event plane
1361 Bool_t acceptOrientation = IsSemiCentral() ?
1362 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1366 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1367 // if (gRandom->Rndm() > .5)
1368 // phiRel -= TMath::Pi();
1370 phiRel += 2. * TMath::Pi();
1371 Float_t phiRel3 = trg->Phi() - fEventPlaneAngle3;
1373 phiRel3 += 2. * TMath::Pi();
1374 FillH2(kHistPhiTrgHadEvPlane, GetPhiRel2(trg), fCentrality);
1375 FillH2(kHistPhiTrgHadEvPlane3, phiRel3, fCentrality);
1378 return (acceptPt && acceptOrientation);
1381 AliVTrack* AliAnalysisTaskJetProtonCorr::GetLeadingTrack(const AliAODJet *jet) const
1383 // return leading track within a jet
1385 // check contributing tracks
1386 Int_t nJetTracks = jet->GetRefTracks()->GetEntriesFast();
1387 Int_t iLeadingTrack = -1;
1388 Float_t ptLeadingTrack = 0.;
1389 for (Int_t iTrack=0; iTrack < nJetTracks; ++iTrack) {
1390 AliAODTrack *track = (AliAODTrack*) jet->GetRefTracks()->At(iTrack);
1391 // find the leading track
1392 if (track->Pt() > ptLeadingTrack) {
1393 ptLeadingTrack = track->Pt();
1394 iLeadingTrack = iTrack;
1398 // retrieve the leading track
1399 return (AliAODTrack*) jet->GetRefTracks()->At(iLeadingTrack);
1402 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTrigger(AliAODJet *trg)
1405 if (TMath::Abs(trg->Eta()) > fTrgJetEtaMax)
1408 // reject too small jets
1409 if (trg->EffectiveAreaCharged() < fTrgJetAreaMin)
1412 // require hard leading track
1413 // (leading track biased jet sample)
1414 // but reject jets with too high pt constituents
1415 const Float_t ptLeadTrack = GetLeadingTrack(trg)->Pt();
1416 if ((ptLeadTrack < fTrgJetLeadTrkPtMin) ||
1417 (ptLeadTrack > fTrgJetLeadTrkPtMax))
1420 // check for jet orientation w.r.t. event plane
1421 // (constrained only for semi-central events)
1422 Bool_t acceptOrientation = IsSemiCentral() ?
1423 AcceptAngleToEvPlane(trg->Phi(), GetEventPlaneAngle()) :
1428 (trg->Pt() >= fTrgJetPtMin) &&
1429 (trg->Pt() <= fTrgJetPtMax);
1432 // store the azimuthal distribution relative to the event plane
1433 // for the jets in the pt range of interest
1434 Float_t phiRel = trg->Phi() - fEventPlaneAngle;
1435 // if (gRandom->Rndm() > .5)
1436 // phiRel -= TMath::Pi();
1438 phiRel += 2. * TMath::Pi();
1439 Float_t phiRel3 = trg->Phi() - fEventPlaneAngle3;
1441 phiRel3 += 2. * TMath::Pi();
1442 FillH2(kHistPhiTrgJetEvPlane, GetPhiRel2(trg), fCentrality);
1443 FillH2(kHistPhiTrgJetEvPlane3, phiRel3, fCentrality);
1446 if (acceptOrientation) {
1447 // spectrum for cross checks
1448 if (IsClass(kClCentral))
1449 FillH1(kHistJetPtCentral, trg->Pt());
1450 if (IsClass(kClSemiCentral))
1451 FillH1(kHistJetPtSemi, trg->Pt());
1454 return (acceptPt && acceptOrientation);
1457 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAssoc(const AliVTrack *trk) const
1459 if ((trk->Pt() > fAssPartPtMin) && (trk->Pt() < fAssPartPtMax) && (TMath::Abs(trk->Eta()) < fHadEtaMax))
1461 if ((fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) == AliPIDResponse::kDetPidOk) &&
1462 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) == AliPIDResponse::kDetPidOk) &&
1463 (trk->GetTPCsignalN() >= 60.) && (trk->GetTPCsignal() >= 10))
1474 Bool_t AliAnalysisTaskJetProtonCorr::IsProton(const AliVTrack *trk) const
1476 if ((fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC, trk) != AliPIDResponse::kDetPidOk) ||
1477 (fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF, trk) != AliPIDResponse::kDetPidOk) ||
1478 (trk->GetTPCsignalN() < 60.) || (trk->GetTPCsignal() < 10))
1481 Double_t nSigmaProtonTPC = fPIDResponse->NumberOfSigmasTPC(trk, AliPID::kProton);
1482 Double_t nSigmaProtonTOF = fPIDResponse->NumberOfSigmasTOF(trk, AliPID::kProton);
1484 if ((TMath::Abs(nSigmaProtonTPC) <= 2.) && (TMath::Abs(nSigmaProtonTOF) <= 2.)) {
1491 Bool_t AliAnalysisTaskJetProtonCorr::AcceptAngleToEvPlane(Float_t phi, Float_t psi) const
1493 Float_t deltaPhi = phi - psi;
1494 while (deltaPhi < 0.)
1495 deltaPhi += 2 * TMath::Pi();
1497 // map to interval [-pi/2, pi/2)
1498 deltaPhi = std::fmod(deltaPhi + TMath::Pi()/2., TMath::Pi()) - TMath::Pi()/2.;
1499 // printf("delta phi = %f with phi = %f, psi = %f\n", deltaPhi, phi, psi);
1501 if (TMath::Abs(deltaPhi) < fTrgAngleToEvPlane)
1507 Float_t AliAnalysisTaskJetProtonCorr::GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1,
1508 Float_t phi2, Float_t pt2, Float_t charge2,
1509 Float_t radius, Float_t bSign) const
1511 // calculates dphistar
1512 // from AliUEHistograms
1514 Float_t dphistar = phi1 - phi2
1515 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1)
1516 + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
1518 static const Double_t kPi = TMath::Pi();
1522 dphistar = kPi * 2 - dphistar;
1523 if (dphistar < -kPi)
1524 dphistar = -kPi * 2 - dphistar;
1525 if (dphistar > kPi) // might look funny but is needed
1526 dphistar = kPi * 2 - dphistar;
1532 Bool_t AliAnalysisTaskJetProtonCorr::AcceptTwoTracks(const AliVParticle *trgPart, const AliVParticle *assPart) const
1534 // apply two track pair cut
1536 Float_t phi1 = trgPart->Phi();
1537 Float_t pt1 = trgPart->Pt();
1538 Float_t charge1 = trgPart->Charge();
1540 Float_t phi2 = assPart->Phi();
1541 Float_t pt2 = assPart->Pt();
1542 Float_t charge2 = assPart->Charge();
1544 Float_t deta = trgPart->Eta() - assPart->Eta();
1546 Float_t bSign = (InputEvent()->GetMagneticField() > 0) ? 1 : -1;
1549 if (TMath::Abs(deta) < fCutsTwoTrackEff) {
1550 // check first boundaries to see if is worth to loop and find the minimum
1551 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
1552 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
1554 const Float_t kLimit = fCutsTwoTrackEff * 3;
1556 Float_t dphistarminabs = 1e5;
1557 // Float_t dphistarmin = 1e5;
1558 if ((TMath::Abs(dphistar1) < kLimit) ||
1559 (TMath::Abs(dphistar2) < kLimit) ||
1560 (dphistar1 * dphistar2 < 0)) {
1561 for (Double_t rad=0.8; rad<2.51; rad+=0.01) {
1562 Float_t dphistarabs = TMath::Abs(GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign));
1563 if (dphistarabs < dphistarminabs)
1564 dphistarminabs = dphistarabs;
1567 if (dphistarminabs < fCutsTwoTrackEff)
1575 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(CorrType_t corr, Class_t cl, Ev_t ev,
1576 TCollection *trgArray, TCollection *assArray, Float_t weight)
1578 AliHistCorr *histCorr = GetHistCorr(corr, cl, ev);
1580 AliError(Form("no correlation histograms for corr %i, cl %i, ev %i",
1585 TIter assIter(assArray);
1586 while (TObject *assObj = assIter()) {
1587 if (dynamic_cast<AliVParticle*> (assObj)) {
1588 AliVParticle *assPart = (AliVParticle*) assObj;
1589 histCorr->Ass(assPart->Phi(), assPart->Eta(),
1590 assPart->Pt() > 0. ? (assPart->Charge() / 3.) / assPart->Pt() : 1.e-4,
1593 else if (dynamic_cast<TLorentzVector*> (assObj)) {
1594 TLorentzVector *assVec = (TLorentzVector*) assObj;
1595 histCorr->Ass(TVector2::Phi_0_2pi(assVec->Phi()), assVec->Eta(), 0., weight);
1599 TIter trgIter(trgArray);
1600 while (TObject *trgObj = trgIter()) {
1601 if (AliVParticle *trgPart = dynamic_cast<AliVParticle*> (trgObj)) {
1602 // count the trigger
1603 histCorr->Trigger(trgPart->Phi(), trgPart->Eta(),
1604 trgPart->Pt() > 0. ? (trgPart->Charge() / 3.) / trgPart->Pt() : 1.e-4,
1607 // loop over associates
1609 while (TObject *assObj = assIter()) {
1610 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1611 if (AcceptTwoTracks(trgPart, assPart))
1612 histCorr->Fill(trgPart, assPart, weight);
1614 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1615 AliFatal(Form("got %p, but not implemented", assVec));
1619 else if (TLorentzVector *trgVec = dynamic_cast<TLorentzVector*> (trgObj)) {
1620 // count the trigger
1621 histCorr->Trigger(TVector2::Phi_0_2pi(trgVec->Phi()), trgVec->Eta(),
1625 // loop over associates
1627 while (TObject *assObj = assIter()) {
1628 if (AliVParticle *assPart = dynamic_cast<AliVParticle*> (assObj)) {
1629 histCorr->Fill(trgVec, assPart, weight);
1631 else if (TLorentzVector *assVec = dynamic_cast<TLorentzVector*> (assObj)) {
1632 histCorr->Fill(trgVec, assVec, weight);
1641 Bool_t AliAnalysisTaskJetProtonCorr::Correlate(Trg_t trg, Ass_t ass, Class_t cl, Ev_t ev,
1642 TCollection *trgArray, TCollection *assArray, Float_t weight)
1644 if ((trg < 0) || (trg > kTrgJetRnd))
1645 AliFatal(Form("wrong request for correlation with trigger: %d", trg));
1647 if ((ass < 0) || (ass > kAssProt))
1648 AliFatal(Form("wrong request for correlation with associate: %d", ass));
1650 CorrType_t corr = (CorrType_t) (2 * trg + ass);
1652 return Correlate(corr, cl, ev, trgArray, assArray, weight);
1655 Bool_t AliAnalysisTaskJetProtonCorr::GenerateRandom(TCollection *trgJetArray,
1656 TCollection *trgHadArray,
1657 TCollection *assHadJetArray,
1658 TCollection *assProtJetArray,
1659 TCollection *assHadHadArray,
1660 TCollection *assProtHadArray,
1663 const Int_t nPart = gRandom->Poisson(fToyMeanNoPart);
1665 // overcompensate modulation for event plane resolution
1666 if (fSplineEventPlaneRes) {
1667 fTrgJetPhiModCent->SetParameter(0, fTrgJetV2Cent / fSplineEventPlaneRes->Eval(GetCentrality()));
1668 fTrgJetPhiModSemi->SetParameter(0, fTrgJetV2Semi / fSplineEventPlaneRes->Eval(GetCentrality()));
1669 fTrgHadPhiModCent->SetParameter(0, fTrgHadV2Cent / fSplineEventPlaneRes->Eval(GetCentrality()));
1670 fTrgHadPhiModSemi->SetParameter(0, fTrgHadV2Semi / fSplineEventPlaneRes->Eval(GetCentrality()));
1673 printf("no event plane resolution spline available\n");
1674 fTrgJetPhiModCent->SetParameter(0, fTrgJetV2Cent);
1675 fTrgJetPhiModSemi->SetParameter(0, fTrgJetV2Semi);
1676 fTrgHadPhiModCent->SetParameter(0, fTrgHadV2Cent);
1677 fTrgHadPhiModSemi->SetParameter(0, fTrgHadV2Semi);
1680 // generate random direction
1681 Float_t trgJetEta = gRandom->Uniform(-fTrgJetEtaMax, fTrgJetEtaMax);
1682 Float_t trgJetPhi = 0.;
1684 trgJetPhi = IsClass(kClSemiCentral) ?
1685 fTrgJetPhiModSemi->GetRandom() :
1686 fTrgJetPhiModCent->GetRandom();
1688 trgJetPhi += fEventPlaneAngle;
1690 trgJetPhi += 2. * TMath::Pi();
1691 else if (trgJetPhi > 2. * TMath::Pi())
1692 trgJetPhi -= 2. * TMath::Pi();
1694 Float_t phiRel = trgJetPhi- fEventPlaneAngle;
1696 phiRel += 2. * TMath::Pi();
1697 FillH2(kHistPhiRndTrgJetEvPlane, phiRel, fCentrality);
1698 } while (IsClass(kClSemiCentral) &&
1699 !AcceptAngleToEvPlane(trgJetPhi, GetEventPlaneAngle()));
1701 // generate one trigger particle
1702 TLorentzVector *trgJet = new TLorentzVector();
1703 trgJet->SetPtEtaPhiM(50., trgJetEta, trgJetPhi, .14);
1704 trgJetArray->Add(trgJet);
1706 // generate direction for away side
1707 Float_t trgJetEtaAway = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1708 Float_t trgJetPhiAway = trgJetPhi + TMath::Pi() + gRandom->Gaus(0., fToySmearPhi);
1710 // generate associated particles
1711 // with proton/hadron ratio observed in this event
1712 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1713 Float_t deltaEta, deltaPhi;
1714 const Float_t r = fToyRadius;
1716 deltaEta = gRandom->Uniform(-r, r);
1717 deltaPhi = gRandom->Uniform(-r, r);
1718 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1720 TLorentzVector *assPart = new TLorentzVector();
1721 Float_t eta = trgJetEtaAway + deltaEta;
1722 Float_t phi = trgJetPhiAway + deltaPhi;
1723 if (TMath::Abs(eta) > fHadEtaMax) {
1728 phi += 2. * TMath::Pi();
1729 while (phi > 2. * TMath::Pi())
1730 phi -= 2. * TMath::Pi();
1731 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1732 assHadJetArray->Add(assPart);
1733 if (gRandom->Uniform() < pFraction)
1734 assProtJetArray->Add(assPart);
1738 Float_t trgHadEta = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1739 Float_t trgHadPhi = 0.;
1741 trgHadPhi = IsClass(kClSemiCentral) ?
1742 fTrgHadPhiModSemi->GetRandom() :
1743 fTrgHadPhiModCent->GetRandom();
1745 trgHadPhi += fEventPlaneAngle;
1747 trgHadPhi += 2. * TMath::Pi();
1748 else if (trgHadPhi > 2. * TMath::Pi())
1749 trgHadPhi -= 2. * TMath::Pi();
1751 Float_t phiRel = trgHadPhi - fEventPlaneAngle;
1753 phiRel += 2. * TMath::Pi();
1754 FillH2(kHistPhiRndTrgHadEvPlane, phiRel, fCentrality);
1755 } while (IsClass(kClSemiCentral) &&
1756 !AcceptAngleToEvPlane(trgHadPhi, GetEventPlaneAngle()));
1758 // generate one trigger particle
1759 TLorentzVector *trgHad = new TLorentzVector();
1760 trgHad->SetPtEtaPhiM(50., trgHadEta, trgHadPhi, .14);
1761 trgHadArray->Add(trgHad);
1763 // generate direction for away side
1764 Float_t trgHadEtaAway = gRandom->Uniform(-fHadEtaMax, fHadEtaMax);
1765 Float_t trgHadPhiAway = trgHadPhi + TMath::Pi() + gRandom->Gaus(0., fToySmearPhi);
1767 // generate associated particles
1768 // with proton/hadron ratio observed in this event
1769 for (Int_t iPart = 0; iPart < nPart; ++iPart) {
1770 Float_t deltaEta, deltaPhi;
1771 const Float_t r = fToyRadius;
1773 deltaEta = gRandom->Uniform(-r, r);
1774 deltaPhi = gRandom->Uniform(-r, r);
1775 } while ((deltaEta * deltaEta + deltaPhi * deltaPhi) > (r * r));
1777 TLorentzVector *assPart = new TLorentzVector();
1778 Float_t eta = trgHadEtaAway + deltaEta;
1779 Float_t phi = trgHadPhiAway + deltaPhi;
1780 if (TMath::Abs(eta) > fHadEtaMax) {
1785 phi += 2. * TMath::Pi();
1786 while (phi > 2. * TMath::Pi())
1787 phi -= 2. * TMath::Pi();
1788 assPart->SetPtEtaPhiM(3., eta, phi, .14);
1789 assHadHadArray->Add(assPart);
1790 if (gRandom->Uniform() < pFraction)
1791 assProtHadArray->Add(assPart);
1797 Bool_t AliAnalysisTaskJetProtonCorr::CleanUpEvent()
1800 delete fPrimTrackArrayAss;
1801 fPrimTrackArrayAss = 0x0;
1802 delete fPrimTrackArrayTrg;
1803 fPrimTrackArrayTrg = 0x0;
1806 fPrimConstrainedTrackArray->Delete();
1811 TObjArray* AliAnalysisTaskJetProtonCorr::CloneTracks(TObjArray* tracks) const
1813 TObjArray* tracksClone = new TObjArray;
1814 tracksClone->SetOwner(kTRUE);
1816 Int_t nTracks = tracks->GetEntriesFast();
1817 for (Int_t i = 0; i < nTracks; i++) {
1818 // WARNING: TObject::Clone() is very!!! expensive, unusable
1819 // tracksClone->Add(particle->Clone());
1821 // if (AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (tracks->At(i)))
1822 // tracksClone->Add(new AliESDtrack(*esdTrack));
1823 // else if (AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*> (tracks->At(i)))
1824 // tracksClone->Add(new AliAODTrack(*aodTrack));
1826 if (const AliVTrack *track = dynamic_cast<const AliVTrack*> (tracks->At(i)))
1827 tracksClone->Add(new AliPartCorr(*track));
1833 AliAnalysisTaskJetProtonCorr::AliHistCorr::AliHistCorr(TString name, TList *outputList) :
1835 fOutputList(outputList),
1839 fHistCorrEtaPhi(0x0),
1840 fHistCorrAvgEtaPhi(0x0),
1841 fHistCorrTrgEtaPhi(0x0),
1842 fHistCorrAssEtaPhi(0x0),
1843 fHistCorrTrgEtaPhiQpt(0x0),
1844 fHistCorrAssEtaPhiQpt(0x0),
1845 fHistDphiLo(-TMath::Pi() / 2.),
1846 fHistDphiNbins(120),
1851 fHistStat = new TH1F(Form("%s_stat", name.Data()), "statistics",
1854 fHistCorrPhi = new TH1F(Form("%s_phi", name.Data()), ";#Delta#varphi",
1855 fHistDphiNbins, fHistDphiLo, 2.*TMath::Pi() + fHistDphiLo);
1856 fHistCorrPhi->Sumw2();
1857 fHistCorrPhi2 = new TH2F(Form("%s_phi2", name.Data()), ";#varphi_{trg};#varphi_{ass}",
1858 120, 0.*TMath::Pi(), 2.*TMath::Pi(),
1859 120, 0.*TMath::Pi(), 2.*TMath::Pi());
1860 fHistCorrPhi2->Sumw2();
1861 fHistCorrEtaPhi = new TH2F(Form("%s_etaphi", name.Data()), ";#Delta#varphi;#Delta#eta",
1862 fHistDphiNbins, fHistDphiLo, 2*TMath::Pi() + fHistDphiLo,
1863 fHistDetaNbins, -2., 2.);
1864 fHistCorrEtaPhi->Sumw2();
1865 fHistCorrAvgEtaPhi = new TH2F(Form("%s_avgetaphi", name.Data()), ";#Delta#varphi;avg #eta",
1866 fHistDphiNbins, fHistDphiLo, 2*TMath::Pi() + fHistDphiLo,
1867 fHistDetaNbins, -2., 2.);
1868 fHistCorrAvgEtaPhi->Sumw2();
1869 fHistCorrTrgEtaPhi = new TH2F(Form("%s_trg_etaphi", name.Data()), ";#varphi;#eta",
1870 120, 0., 2*TMath::Pi(),
1872 fHistCorrTrgEtaPhi->Sumw2();
1873 fHistCorrAssEtaPhi = new TH2F(Form("%s_ass_etaphi", name.Data()), ";#varphi;#eta",
1874 120, 0., 2*TMath::Pi(),
1876 fHistCorrAssEtaPhi->Sumw2();
1878 // fHistCorrTrgEtaPhiQpt = new TH3F(Form("%s_trg_etaphi", name.Data()), ";#varphi;#eta;Q/p_{T}",
1879 // 120, 0., 2*TMath::Pi(),
1882 // fHistCorrTrgEtaPhiQpt->Sumw2();
1883 // fHistCorrAssEtaPhiQpt = new TH3F(Form("%s_ass_etaphi", name.Data()), ";#varphi;#etaQ/p_{T}",
1884 // 120, 0., 2*TMath::Pi(),
1887 // fHistCorrAssEtaPhiQpt->Sumw2();
1889 fOutputList->Add(fHistStat);
1890 fOutputList->Add(fHistCorrPhi);
1891 fOutputList->Add(fHistCorrPhi2);
1892 fOutputList->Add(fHistCorrEtaPhi);
1893 fOutputList->Add(fHistCorrAvgEtaPhi);
1894 fOutputList->Add(fHistCorrTrgEtaPhi);
1895 fOutputList->Add(fHistCorrAssEtaPhi);
1896 // fOutputList->Add(fHistCorrTrgEtaPhiQpt);
1897 // fOutputList->Add(fHistCorrAssEtaPhiQpt);
1900 AliAnalysisTaskJetProtonCorr::AliHistCorr::~AliHistCorr()
1905 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(AliVParticle *trgPart, AliVParticle *assPart, Float_t weight)
1907 // fill correlation histograms from trigger particle and associate particle
1909 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1910 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1911 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1912 while (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1913 deltaPhi -= 2. * TMath::Pi();
1914 while (deltaPhi < fHistDphiLo)
1915 deltaPhi += 2. * TMath::Pi();
1917 fHistCorrPhi->Fill(deltaPhi, weight);
1919 fHistCorrPhi2->Fill(trgPart->Phi(), assPart->Phi(), weight);
1920 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1921 if (fHistCorrAvgEtaPhi)
1922 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1925 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, AliVParticle *assPart, Float_t weight)
1927 // fill correlation histograms from trigger direction and associate particle
1929 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1930 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1931 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1932 while (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1933 deltaPhi -= 2. * TMath::Pi();
1934 while (deltaPhi < fHistDphiLo)
1935 deltaPhi += 2. * TMath::Pi();
1937 fHistCorrPhi->Fill(deltaPhi, weight);
1938 if (fHistCorrPhi2) {
1939 Float_t trgPhi = trgPart->Phi();
1941 trgPhi += 2. * TMath::Pi();
1942 fHistCorrPhi2->Fill(trgPhi, assPart->Phi(), weight);
1944 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1945 if (fHistCorrAvgEtaPhi)
1946 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1949 void AliAnalysisTaskJetProtonCorr::AliHistCorr::Fill(TLorentzVector *trgPart, TLorentzVector *assPart, Float_t weight)
1951 // fill correlation histograms from trigger direction and associate direction
1953 Float_t deltaEta = assPart->Eta() - trgPart->Eta();
1954 Float_t avgEta = (assPart->Eta() + trgPart->Eta()) / 2.;
1955 Float_t deltaPhi = assPart->Phi() - trgPart->Phi();
1956 if (deltaPhi > (2.*TMath::Pi() + fHistDphiLo))
1957 deltaPhi -= 2. * TMath::Pi();
1958 else if (deltaPhi < fHistDphiLo)
1959 deltaPhi += 2. * TMath::Pi();
1961 fHistCorrPhi->Fill(deltaPhi, weight);
1962 if (fHistCorrPhi2) {
1963 Float_t trgPhi = trgPart->Phi();
1965 trgPhi += 2. * TMath::Pi();
1966 Float_t assPhi = assPart->Phi();
1968 assPhi += 2. * TMath::Pi();
1969 fHistCorrPhi2->Fill(trgPhi, assPhi, weight);
1971 fHistCorrEtaPhi->Fill(deltaPhi, deltaEta, weight);
1972 if (fHistCorrAvgEtaPhi)
1973 fHistCorrAvgEtaPhi->Fill(deltaPhi, avgEta, weight);
1976 // ----- histogram management -----
1977 TH1* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1978 Int_t xbins, Float_t xmin, Float_t xmax,
1982 hName.Form("%s_%s", fShortTaskId, hid);
1986 h = new TH1I(hName.Data(), title,
1989 h = new TH1F(hName.Data(), title,
1991 GetHistogram(hist) = h;
1992 fOutputList->Add(h);
1996 TH2* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
1997 Int_t xbins, Float_t xmin, Float_t xmax,
1998 Int_t ybins, Float_t ymin, Float_t ymax,
2002 hName.Form("%s_%s", fShortTaskId, hid);
2006 h = GetHistogram(hist) = new TH2I(hName.Data(), title,
2010 h = GetHistogram(hist) = new TH2F(hName.Data(), title,
2013 fOutputList->Add(h);
2017 TH3* AliAnalysisTaskJetProtonCorr::AddHistogram(Hist_t hist, const char *hid, TString title,
2018 Int_t xbins, Float_t xmin, Float_t xmax,
2019 Int_t ybins, Float_t ymin, Float_t ymax,
2020 Int_t zbins, Float_t zmin, Float_t zmax,
2024 hName.Form("%s_%s", fShortTaskId, hid);
2028 h = GetHistogram(hist) = new TH3I(hName.Data(), title,
2033 h = GetHistogram(hist) = new TH3F(hName.Data(), title,
2037 fOutputList->Add(h);