1 // ----------------------------------------------------------------------------
\r
2 // This class makes di-hadron correlations, with TOF and TPC signals for
\r
3 // the associated particles.
\r
6 // - Added a number of setters/getters.
\r
7 // - Added spectra in pt, eta and phi as a function of performed cuts.
\r
8 // - Added DCA histogram.
\r
9 // - Added pp functionality.
\r
10 // - Added the option to make a DCA cut and an ITS cut.
\r
11 // - Variable centrality.
\r
12 // - Variable maximum p_T for triggers.
\r
13 // - Removed di-hadron correlations with one PID signal.
\r
15 // ----------------------------------------------------------------------------
\r
16 // Author: Misha Veldhoen (misha.veldhoen@cern.ch)
\r
17 // Last edit: Apr 12th 2012. (v 8.00)
\r
18 // ----------------------------------------------------------------------------
\r
26 #include "TCanvas.h"
\r
29 #include "AliAODTrack.h"
\r
30 #include "AliAODEvent.h"
\r
31 #include "AliAODInputHandler.h"
\r
32 #include "AliAODVertex.h"
\r
33 //#include "AliAODPid.h"
\r
35 #include "AliAnalysisManager.h"
\r
36 #include "AliInputEventHandler.h"
\r
37 #include "AliPIDResponse.h"
\r
38 #include "AliTPCPIDResponse.h"
\r
39 //#include "AliTOFPIDResponse.h"
\r
41 using namespace std;
\r
43 #include "AliAnalysisTaskDiHadronPID.h"
\r
45 ClassImp(AliAnalysisTaskDiHadronPID);
\r
47 //_____________________________________________________________________________
\r
48 AliAnalysisTaskDiHadronPID::AliAnalysisTaskDiHadronPID():
\r
49 AliAnalysisTaskSE(),
\r
60 fDCAZoomedTwice(0x0),
\r
63 fDCAZoomedTwiceCut(0x0),
\r
65 fTrackCutsCount(0x0),
\r
69 fEtaSpectrumTrig(0x0),
\r
70 fEtaSpectrumAssoc(0x0),
\r
71 fPhiSpectrumAssoc(0x0),
\r
72 fTPCnSigmaProton(0x0),
\r
73 fTOFnSigmaProton(0x0),
\r
74 fTPCnSigmaPion(0x0),
\r
75 fTOFnSigmaPion(0x0),
\r
76 fTPCnSigmaKaon(0x0),
\r
77 fTOFnSigmaKaon(0x0),
\r
82 fCalculateMixedEvents(kFALSE),
\r
89 fVertexZMixedEvents(2.),
\r
90 fCentralityCutMax(0.),
\r
91 fCentralityCutMin(10.),
\r
95 fDemandNoMismatch(kFALSE),
\r
97 fPrintBufferSize(kFALSE),
\r
98 fTrigBufferIndex(0),
\r
100 fTrigBufferMaxSize(1000)
\r
105 // Default Constructor.
\r
109 for(Int_t ii=0; ii<25000; ii++) {
\r
110 for(Int_t jj=0; jj<4; jj++) {
\r
111 fTrigBuffer[ii][jj]=0;
\r
115 // The identified di-hadron correlations.
\r
116 for (Int_t ii = 0; ii < 3; ii++) {
\r
117 for (Int_t jj = 0; jj < 10; jj++) {
\r
118 fDiHadronTPCTOF[ii][jj]=0x0;
\r
122 // Track cut labels.
\r
123 for (Int_t ii=0; ii<8; ii++) {
\r
124 fTrackCutLabelNumbers[ii]=ii+1;
\r
128 //_____________________________________________________________________________
\r
129 AliAnalysisTaskDiHadronPID::AliAnalysisTaskDiHadronPID(const char *name):
\r
130 AliAnalysisTaskSE(name),
\r
136 fGlobalTracks(0x0),
\r
141 fDCAZoomedTwice(0x0),
\r
143 fDCAZoomedCut(0x0),
\r
144 fDCAZoomedTwiceCut(0x0),
\r
146 fTrackCutsCount(0x0),
\r
148 fTrackCutsEta(0x0),
\r
149 fTrackCutsPhi(0x0),
\r
150 fEtaSpectrumTrig(0x0),
\r
151 fEtaSpectrumAssoc(0x0),
\r
152 fPhiSpectrumAssoc(0x0),
\r
153 fTPCnSigmaProton(0x0),
\r
154 fTOFnSigmaProton(0x0),
\r
155 fTPCnSigmaPion(0x0),
\r
156 fTOFnSigmaPion(0x0),
\r
157 fTPCnSigmaKaon(0x0),
\r
158 fTOFnSigmaKaon(0x0),
\r
163 fCalculateMixedEvents(kFALSE),
\r
170 fVertexZMixedEvents(2.),
\r
171 fCentralityCutMax(0.),
\r
172 fCentralityCutMin(10.),
\r
176 fDemandNoMismatch(kFALSE),
\r
178 fPrintBufferSize(kFALSE),
\r
179 fTrigBufferIndex(0),
\r
180 fTrigBufferSize(0),
\r
181 fTrigBufferMaxSize(1000)
\r
186 // Named Constructor.
\r
189 DefineInput(0, TChain::Class());
\r
190 DefineOutput(1, TList::Class());
\r
193 for(Int_t ii=0; ii<25000; ii++) {
\r
194 for(Int_t jj=0; jj<4; jj++) {
\r
195 fTrigBuffer[ii][jj]=0;
\r
199 // The identified di-hadron correlations.
\r
200 for (Int_t ii = 0; ii < 3; ii++) {
\r
201 for (Int_t jj = 0; jj < 10; jj++) {
\r
202 fDiHadronTPCTOF[ii][jj]=0x0;
\r
206 // Track cut labels.
\r
207 for (Int_t ii=0; ii<8; ii++) {
\r
208 fTrackCutLabelNumbers[ii]=ii+1;
\r
212 //_____________________________________________________________________________
\r
213 AliAnalysisTaskDiHadronPID::~AliAnalysisTaskDiHadronPID() {
\r
219 if(fGlobalTracks) {
\r
220 delete fGlobalTracks;
\r
226 //_____________________________________________________________________________
\r
227 void AliAnalysisTaskDiHadronPID::UserCreateOutputObjects()
\r
234 // Print the settings of the analysis task.
\r
236 cout<<"-----------------------------------------------"<<endl;
\r
237 cout<<" AliAnalysisTaskDiHadronPID Settings:"<<endl;
\r
238 cout<<"-----------------------------------------------"<<endl;
\r
239 cout<<"Verbose Level: "<<fVerbose<<endl;
\r
240 cout<<"Mixed Events Calculated: "<<fCalculateMixedEvents<<endl;
\r
241 cout<<"Beam Type: "<<fBeamType<<endl;
\r
242 cout<<Form("Max eta: %3.1f",fMaxEta)<<endl;
\r
243 cout<<Form("Max eta plotted: %3.1f",fMaxPlotEta)<<endl;
\r
244 cout<<Form("Max p_T for the triggers: %3.1f GeV/c.",fMaxPt)<<endl;
\r
245 cout<<"Nbins in eta and delta eta: "<<fNEtaBins<<endl;
\r
246 cout<<"Nbins in phi and delta phi: "<<fNPhiBins<<endl;
\r
247 cout<<Form("Events mixed if vertices differ %3.1f cm.",fVertexZMixedEvents)<<endl;
\r
248 cout<<Form("Centrality between %3.1f and %3.1f percent.",fCentralityCutMax,fCentralityCutMin)<<endl;
\r
249 cout<<"Tracks are cut if less than 2 SPD hits: "<<fDoITSCut<<endl;
\r
250 cout<<"Tracks cut if DCA is too big: "<<fDoDCACut<<endl;
\r
251 cout<<"Tracks cut if there is a TPC-TOF mismatch: "<<fDemandNoMismatch<<endl;
\r
252 cout<<"Maximum number of triggers stored: "<<fTrigBufferMaxSize<<endl;
\r
253 cout<<"-----------------------------------------------"<<endl;
\r
256 // Obtain a pointer to the analysis manager.
\r
257 AliAnalysisManager* manager = AliAnalysisManager::GetAnalysisManager();
\r
259 if (fVerbose>0) cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> ERROR: Analysis manager not found."<<endl;
\r
263 cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> Analysis manager found."<<endl;
\r
266 // Obtain a pointer to the input handler.
\r
267 AliInputEventHandler* inputHandler = dynamic_cast<AliInputEventHandler*> (manager->GetInputEventHandler());
\r
268 if (!inputHandler) {
\r
269 if (fVerbose>0) cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> ERROR: Input handler not found."<<endl;
\r
273 cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> Input handler found."<<endl;
\r
276 // Obtain a pointer to the PID response object.
\r
277 fPIDResponse = inputHandler->GetPIDResponse();
\r
278 if (!fPIDResponse) {
\r
279 if (fVerbose>0) cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> ERROR: PID response object not found."<<endl;
\r
283 cout<<"AliAnalysisTaskDiHadronPID::UserCreateOutputObjects -> PID response object found."<<endl;
\r
286 // Create the output of the task.
\r
287 fHistoList = new TList();
\r
288 fHistoList->SetOwner(kTRUE);
\r
290 // Ranges in dPhi, dEta, and the number of bins for di-hadron correlations.
\r
291 Int_t binsHisto[4] = {fNPhiBins,fNEtaBins};
\r
292 Double_t minHisto[4] = {-TMath::Pi()/2.,-2*fMaxPlotEta};
\r
293 Double_t maxHisto[4] = {3.*TMath::Pi()/2,2*fMaxPlotEta};
\r
295 // --- EVENT QA PLOTS ---
\r
297 fCentrality = new TH1F("fCentrality","Centrality;Centrality;N_{evt}",100,0,100);
\r
298 fHistoList->Add(fCentrality);
\r
299 fVertexZ = new TH1F("fVertexZ","Vertex Z position;z (cm);N_{evt}",30,-15,15);
\r
300 fHistoList->Add(fVertexZ);
\r
302 // --- TRACK QA PLOTS ---
\r
304 fDCA = new TH2F("fDCA","DCA positions TPC only cuts;xy (cm);z (cm)",100,-5,5,100,-5,5);
\r
305 fHistoList->Add(fDCA);
\r
306 fDCAZoomed = new TH2F("fDCAZoomed","DCA positions TPC only cuts;xy (cm);z (cm)",100,-.5,.5,100,-.5,.5);
\r
307 fHistoList->Add(fDCAZoomed);
\r
308 fDCAZoomedTwice = new TH2F("fDCAZoomedTwice","DCA positions TPC only cuts;xy (cm);z (cm)",100,-.05,.05,100,-.05,.05);
\r
309 fHistoList->Add(fDCAZoomedTwice);
\r
310 fDCACut = new TH2F("fDCACut","DCA positions after DCA cut;xy (cm);z (cm)",100,-5,5,100,-5,5);
\r
311 fHistoList->Add(fDCACut);
\r
312 fDCAZoomedCut = new TH2F("fDCAZoomedCut","DCA positions after DCA cut;xy (cm);z (cm)",100,-.5,.5,100,-.5,.5);
\r
313 fHistoList->Add(fDCAZoomedCut);
\r
314 fDCAZoomedTwiceCut = new TH2F("fDCAZoomedTwiceCut","DCA positions after DCA cut;xy (cm);z (cm)",100,-.05,.05,100,-.05,.05);
\r
315 fHistoList->Add(fDCAZoomedTwiceCut);
\r
317 fITSHits = new TH1F("fITSHits","ITS hits",3,0,3);
\r
318 (fITSHits->GetXaxis())->SetBinLabel(1,"No SPD hit");
\r
319 (fITSHits->GetXaxis())->SetBinLabel(2,"One SPD hit");
\r
320 (fITSHits->GetXaxis())->SetBinLabel(3,"Two SPD hits");
\r
321 fHistoList->Add(fITSHits);
\r
323 // Determine the bins used in the track cut histograms.
\r
324 const Int_t ncuts = 5 + fDoITSCut + fDoDCACut + fDemandNoMismatch;
\r
327 fTrackCutLabelNumbers[3]--;
\r
328 fTrackCutLabelNumbers[4]--;
\r
329 fTrackCutLabelNumbers[5]--;
\r
330 fTrackCutLabelNumbers[6]--;
\r
331 fTrackCutLabelNumbers[7]--;
\r
335 fTrackCutLabelNumbers[4]--;
\r
336 fTrackCutLabelNumbers[5]--;
\r
337 fTrackCutLabelNumbers[6]--;
\r
338 fTrackCutLabelNumbers[7]--;
\r
341 fTrackCutsCount = new TH1F("fTrackCutsCount","Track Cuts;;Count",ncuts,0,ncuts);
\r
342 (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[0],"Std. TPC Only");
\r
343 (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[1],Form("#eta < %3.1f",fMaxEta));
\r
344 if (fDoITSCut) (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[2],"1-2 SPD hits");
\r
345 if (fDoDCACut) (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[3],"DCA cut");
\r
346 (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[4],"p_{T} < 5.0 GeV/c");
\r
347 (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[5],"TPCpid (p_{T} < 5.0 GeV/c)");
\r
348 (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[6],"TOFpid (p_{T} < 5.0 GeV/c)");
\r
349 if (fDemandNoMismatch) (fTrackCutsCount->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[7],"No Mismatch (p_{T} < 5.0 GeV/c)");
\r
350 fHistoList->Add(fTrackCutsCount);
\r
352 fTrackCutsPt = new TH2F("fTrackCutsPt","Track Cuts vs p_{T};;p_{T};Count",ncuts,0,ncuts,40,0,fMaxPt);
\r
353 (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[0],"Std. TPC Only");
\r
354 (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[1],Form("#eta < %3.1f",fMaxEta));
\r
355 if (fDoITSCut) (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[2],"1-2 SPD hits");
\r
356 if (fDoDCACut) (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[3],"DCA cut");
\r
357 (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[4],"p_{T} < 5.0 GeV/c");
\r
358 (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[5],"TPCpid (p_{T} < 5.0 GeV/c)");
\r
359 (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[6],"TOFpid (p_{T} < 5.0 GeV/c)");
\r
360 if (fDemandNoMismatch) (fTrackCutsPt->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[7],"No Mismatch (p_{T} < 5.0 GeV/c)");
\r
361 fHistoList->Add(fTrackCutsPt);
\r
363 fTrackCutsEta = new TH2F("fTrackCutsEta","Track Cuts vs #eta;;#eta;Count",ncuts,0,ncuts,4*binsHisto[1],-fMaxPlotEta,fMaxPlotEta);
\r
364 (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[0],"Std. TPC Only");
\r
365 (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[1],Form("#eta < %3.1f",fMaxEta));
\r
366 if (fDoITSCut) (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[2],"1-2 SPD hits");
\r
367 if (fDoDCACut) (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[3],"DCA cut");
\r
368 (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[4],"p_{T} < 5.0 GeV/c");
\r
369 (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[5],"TPCpid (p_{T} < 5.0 GeV/c)");
\r
370 (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[6],"TOFpid (p_{T} < 5.0 GeV/c)");
\r
371 if (fDemandNoMismatch) (fTrackCutsEta->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[7],"No Mismatch (p_{T} < 5.0 GeV/c)");
\r
372 fHistoList->Add(fTrackCutsEta);
\r
374 fTrackCutsPhi = new TH2F("fTrackCutsPhi","Track Cuts vs #phi;;#phi;Count",ncuts,0,ncuts,72,0,2.*TMath::Pi());
\r
375 (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[0],"Std. TPC Only");
\r
376 (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[1],Form("#eta < %3.1f",fMaxEta));
\r
377 if (fDoITSCut) (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[2],"1-2 SPD hits");
\r
378 if (fDoDCACut) (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[3],"DCA cut");
\r
379 (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[4],"p_{T} < 5.0 GeV/c");
\r
380 (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[5],"TPCpid (p_{T} < 5.0 GeV/c)");
\r
381 (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[6],"TOFpid (p_{T} < 5.0 GeV/c)");
\r
382 if (fDemandNoMismatch) (fTrackCutsPhi->GetXaxis())->SetBinLabel(fTrackCutLabelNumbers[7],"No Mismatch (p_{T} < 5.0 GeV/c)");
\r
383 fHistoList->Add(fTrackCutsPhi);
\r
385 fEtaSpectrumTrig = new TH1F("fEtaSpectrumTrig","#eta Spectrum Triggers;#eta;Count",4*binsHisto[1],-fMaxPlotEta,fMaxPlotEta);
\r
386 fHistoList->Add(fEtaSpectrumTrig);
\r
387 fEtaSpectrumAssoc = new TH2F("fEtaSpectrumAssoc","#eta Spectrum Associateds;#eta;p_{T};Count",4*binsHisto[1],-fMaxPlotEta,fMaxPlotEta,10,0.,5.);
\r
388 fHistoList->Add(fEtaSpectrumAssoc);
\r
389 fPhiSpectrumAssoc = new TH2F("fPhiSpectrumAssoc","#phi Spectrum Associateds;#phi;p_{T};Count",72,0,2.*TMath::Pi(),10,0.,5.);
\r
390 fHistoList->Add(fPhiSpectrumAssoc);
\r
392 // --- QA PLOTS PID ---
\r
394 fTPCnSigmaProton = new TH2F("fTPCnSigmaProton","n#sigma plot for the TPC (Protons);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
395 fHistoList->Add(fTPCnSigmaProton);
\r
396 fTOFnSigmaProton = new TH2F("fTOFnSigmaProton","n#sigma plot for the TOF (Protons);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
397 fHistoList->Add(fTOFnSigmaProton);
\r
398 fTPCnSigmaPion = new TH2F("fTPCnSigmaPion","n#sigma plot for the TPC (Pions);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
399 fHistoList->Add(fTPCnSigmaPion);
\r
400 fTOFnSigmaPion = new TH2F("fTOFnSigmaPion","n#sigma plot for the TOF (Pions);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
401 fHistoList->Add(fTOFnSigmaPion);
\r
402 fTPCnSigmaKaon = new TH2F("fTPCnSigmaKaon","n#sigma plot for the TPC (Kaons);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
403 fHistoList->Add(fTPCnSigmaKaon);
\r
404 fTOFnSigmaKaon = new TH2F("fTOFnSigmaKaon","n#sigma plot for the TOF (Kaons);p (GeV/c);n#sigma",100,0.,5.,100,-10.,10.);
\r
405 fHistoList->Add(fTOFnSigmaKaon);
\r
406 fTPCSignal = new TH3F("fTPCSignal","TPC Signal;#eta;p_{T} GeV/c;dE/dx",25,-fMaxEta,fMaxEta,100,0.,5.,150,0.,300.);
\r
407 fHistoList->Add(fTPCSignal);
\r
408 fTOFSignal = new TH3F("fTOFSignal","TOF Signal;#eta;p_{T} GeV/c;t",25,-fMaxEta,fMaxEta,100,0.,5.,150,10000.,25000.);
\r
409 fHistoList->Add(fTOFSignal);
\r
411 // --- DI-HADRON CORRELATIONS WITH TPC AND TOF SIGNALS ---
\r
413 // Di Hadron Correlations with two PID signals, for each p_T bin and particle species separately. (i.e. 30 histo's)
\r
414 // Axes: {Dphi, Deta, TPC signal, TOF signal}
\r
416 // Unzoomed pictures.
\r
417 Int_t binsTPCnoZoom[3][10] = {{100,100,100,100,100,100,100,100,100,100},
\r
418 {100,100,100,100,100,100,100,100,100,100},
\r
419 {100,100,100,100,100,100,100,100,100,100}};
\r
421 Double_t minTPCnoZoom[3][10] = {{ -50., -50.,-30.,-30.,-30.,-30.,-30.,-30.,-30.,-30.},
\r
422 { -100., -50.,-20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.},
\r
423 { -200.,-150.,-50.,-30.,-20.,-20.,-20.,-20.,-20.,-20.}};
\r
424 Double_t maxTPCnoZoom[3][10] = {{ 150., 100., 50., 30., 25., 25., 25., 25., 25., 25.},
\r
425 { 50., 100., 40., 30., 30., 30., 30., 30., 30., 30.},
\r
426 { 100., 50., 50., 30., 30., 30., 30., 30., 30., 30.}};
\r
428 Int_t binsTOFnoZoom[3][10] = {{100,100,100,100,100,100,100,100,100,100},
\r
429 {100,100,100,100,100,100,100,100,100,100},
\r
430 {100,100,100,100,100,100,100,100,100,100}};
\r
432 Double_t minTOFnoZoom[3][10] = {{-2000.,-2000.,-1000., -500., -500., -500., -500., -500., -500., -500.},
\r
433 {-2000.,-2000.,-2000.,-1000.,-1000.,-1000.,-1000.,-1000.,-1000.,-1000.},
\r
434 {-2000.,-2000.,-6000.,-3000.,-2000.,-1500.,-1500.,-1500.,-1500.,-1500.}};
\r
435 Double_t maxTOFnoZoom[3][10] = {{ 2000., 2000., 5000., 3000., 2000., 1500., 1500., 1500., 1500., 1500.},
\r
436 { 2000., 2000., 5000., 2000., 1500., 1500., 1500., 1500., 1500., 1500.},
\r
437 { 2000., 2000., 2000., 1000., 1000., 1000., 1000., 1000., 1000., 1000.}};
\r
439 // Zoomed pictures.
\r
440 Int_t binsTPCZoom[3][10] = {{100,100,100,100,100,100,100,100,100,100},
\r
441 {100,100,100,100,100,100,100,100,100,100},
\r
442 {100,100,100,100,100,100,100,100,100,100}};
\r
444 Double_t minTPCZoom[3][10] = {{ -20., -20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.},
\r
445 { -20., -20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.},
\r
446 { -40., -20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.,-20.}};
\r
447 Double_t maxTPCZoom[3][10] = {{ 20., 20., 20., 20., 20., 20., 20., 20., 20., 20.},
\r
448 { 20., 20., 20., 20., 20., 20., 20., 20., 20., 20.},
\r
449 { 40., 20., 20., 20., 20., 30., 30., 30., 30., 30.}};
\r
451 Int_t binsTOFZoom[3][10] = {{100,100,100,100,100,100,100,100,100,100},
\r
452 {100,100,100,100,100,100,100,100,100,100},
\r
453 {100,100,100,100,100,100,100,100,100,100}};
\r
455 Double_t minTOFZoom[3][10] = {{-1000.,-1000., -500., -500., -500., -400., -400., -400., -400., -400.},
\r
456 { -800., -800., -800., -800., -800., -600., -500., -500., -400., -400.},
\r
457 {-1000.,-1000.,-1000.,-1000., -800.,-1000.,-1000., -800., -700., -700.}};
\r
458 Double_t maxTOFZoom[3][10] = {{ 1000., 1000., 1000., 1000., 1000., 1000., 1000., 900., 800., 700.},
\r
459 { 1000., 1000., 500., 500., 500., 900., 700., 700., 600., 500.},
\r
460 { 1000., 1000., 1000., 500., 500., 500., 500., 500., 500., 500.}};
\r
462 TString basenameTPCTOF("fDiHadronTPCTOF");
\r
463 TString basetitle("Di-Hadron correlation");
\r
464 TString finalname, finaltitle;
\r
465 TString species[3] = {"Pion","Kaon","Proton"};
\r
466 TString ptbins[11] = {"0.0","0.5","1.0","1.5","2.0","2.5","3.0","3.5","4.0","4.5","5.0"};
\r
468 // Recall that AliPID::kPion = 2, AliPID::kKaon = 3, AliPID::kProton = 4.
\r
469 for (Int_t iSpecies = 0; iSpecies < 3; iSpecies++) {
\r
471 for (Int_t iPtBin = 0; iPtBin < 10; iPtBin++) {
\r
474 binsHisto[2] = binsTPCZoom[iSpecies][iPtBin];
\r
475 binsHisto[3] = binsTOFZoom[iSpecies][iPtBin];
\r
476 minHisto[2] = minTPCZoom[iSpecies][iPtBin];
\r
477 minHisto[3] = minTOFZoom[iSpecies][iPtBin];
\r
478 maxHisto[2] = maxTPCZoom[iSpecies][iPtBin];
\r
479 maxHisto[3] = maxTOFZoom[iSpecies][iPtBin];
\r
481 binsHisto[2] = binsTPCnoZoom[iSpecies][iPtBin];
\r
482 binsHisto[3] = binsTOFnoZoom[iSpecies][iPtBin];
\r
483 minHisto[2] = minTPCnoZoom[iSpecies][iPtBin];
\r
484 minHisto[3] = minTOFnoZoom[iSpecies][iPtBin];
\r
485 maxHisto[2] = maxTPCnoZoom[iSpecies][iPtBin];
\r
486 maxHisto[3] = maxTOFnoZoom[iSpecies][iPtBin];
\r
489 // Make the di-hadron correlations with different pid signals.
\r
490 // TODO: Rewrite this with Form().
\r
491 finaltitle = basetitle;
\r
492 (((((finaltitle += " (") += species[iSpecies]) += ") ") += ptbins[iPtBin]) += " < P_t < ") += ptbins[iPtBin+1];
\r
493 finaltitle+=";#Delta#phi;#Delta#eta;dE/dx;t (ms)";
\r
494 finalname = basenameTPCTOF;
\r
495 (((finalname += "_") += species[iSpecies]) += "_") += iPtBin;
\r
497 fDiHadronTPCTOF[iSpecies][iPtBin] = new THnSparseF(finalname,finaltitle,4,binsHisto,minHisto,maxHisto);
\r
498 fHistoList->Add(fDiHadronTPCTOF[iSpecies][iPtBin]);
\r
503 // --- MIXED EVENTS ---
\r
505 if (fCalculateMixedEvents) {
\r
506 fMixedEvents = new TH3F("fMixedEvents","Mixed Events;#Delta#phi;#Delta#eta;p_{T_assoc}",binsHisto[0],minHisto[0],maxHisto[0],binsHisto[1],minHisto[1],maxHisto[1],10,0.,5.);
\r
507 fMixedEvents->Sumw2();
\r
508 fHistoList->Add(fMixedEvents);
\r
511 PostData(1, fHistoList);
\r
515 //_____________________________________________________________________________
\r
516 Int_t AliAnalysisTaskDiHadronPID::ClassifyTrack(AliAODTrack *track)
\r
520 // This function both classifies tracks, and fills the track QA histograms.
\r
522 // Classifies the track in:
\r
523 // 0 -> Not Useful,
\r
524 // 1 -> Associated,
\r
527 // IDEA: later we can do this with filterbits.
\r
529 // The following track cuts are applied for triggers:
\r
531 // 1a) pT > 5.0 GeV/c, pT < fPtMax,
\r
532 // 2) StandardTPCOnlyTrackCuts (filterbit 7 for AOD's),
\r
533 // 3) eta < fMaxEta,
\r
534 // 4) ITS track cut, a track is only selected if it has at least one hit in the SPD,
\r
535 // that is, in one of the first two layers of the ITS. (can be switched on and off
\r
536 // using (Bool_t)fDoITSCut),
\r
537 // 5) DCA track cut, of all tracks with at least one SPD hit, the DCA is constrained as
\r
538 // a function of pT, in order to remove lots of the secondaries. (can be switched on and
\r
539 // off by using (Bool_t)fDoDCACut),
\r
541 // For associateds all the same track cuts are applied, except 1a is
\r
542 // replaced by 2b. Moreover the following cuts are applied too:
\r
544 // 1b) pT < 5.0 GeV/c,
\r
547 // 8) no TPCTOF mismatch.
\r
550 // Check if a track is supplied.
\r
552 if (fVerbose>0) cout<<"AliAnalysisTaskDiHadronPID::SelectTrack -> ERROR: No track found."<<endl;
\r
556 // Get basic track information.
\r
557 Int_t classification=0;
\r
558 Double_t pt = track->Pt();
\r
559 Double_t eta = track->Eta();
\r
560 Double_t phi = track->Phi();
\r
562 // 1) pT cut: First separation between triggers and associateds.
\r
563 if (pt<5.0) classification=1;
\r
564 if ((pt>5.0)&&(pt<fMaxPt)) classification = 2;
\r
565 if (!classification) return 0;
\r
567 // 2) StandardTPCOnlyTrackCuts.
\r
568 if (!(track->TestFilterMask(1<<7))) {
\r
569 //if (fVerbose>3) cout<<"Track Ignored: Did Not pass filterbit."<<endl;
\r
575 cout<<"pt: "<<pt<<" eta: "<<eta<<" phi: "<<phi<<endl;
\r
578 fTrackCutsCount->Fill(fTrackCutLabelNumbers[0]-.5);
\r
579 fTrackCutsPt->Fill(fTrackCutLabelNumbers[0]-.5,pt);
\r
580 fTrackCutsEta->Fill(fTrackCutLabelNumbers[0]-.5,eta);
\r
581 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[0]-.5,phi);
\r
584 if (TMath::Abs(eta)>fMaxEta) {
\r
585 if (fVerbose>3) cout<<"Track Ignored: Eta too large."<<endl;
\r
589 fTrackCutsCount->Fill(fTrackCutLabelNumbers[1]-.5);
\r
590 fTrackCutsPt->Fill(fTrackCutLabelNumbers[1]-.5,pt);
\r
591 fTrackCutsEta->Fill(fTrackCutLabelNumbers[1]-.5,eta);
\r
592 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[1]-.5,phi);
\r
594 // Obtaining ITS information.
\r
595 AliAODTrack* globaltrack = GetGlobalTrack(track);
\r
596 Bool_t ITSLayerHit[6];
\r
597 for (Int_t iITSLayer=0; iITSLayer<6; iITSLayer++) {
\r
598 ITSLayerHit[iITSLayer] = globaltrack->HasPointOnITSLayer(iITSLayer);
\r
600 Int_t SPDHits=ITSLayerHit[0]+ITSLayerHit[1];
\r
602 if (fVerbose>3) cout<<"SPD hits: "<<SPDHits<<endl;
\r
604 // Fill the ITS hist.
\r
605 fITSHits->Fill(SPDHits+0.5);
\r
610 if (fVerbose>3) cout<<"Track Ignored: Not enough SPD hits."<<endl;
\r
613 fTrackCutsCount->Fill(fTrackCutLabelNumbers[2]-.5);
\r
614 fTrackCutsPt->Fill(fTrackCutLabelNumbers[2]-.5,pt);
\r
615 fTrackCutsEta->Fill(fTrackCutLabelNumbers[2]-.5,eta);
\r
616 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[2]-.5,phi);
\r
619 // Propagate the global track to the DCA.
\r
620 Double_t PosAtDCA[2] = {-999,-999};
\r
621 Double_t covar[3] = {-999,-999,-999};
\r
622 globaltrack->PropagateToDCA(fAODVertex,fAODEvent->GetMagneticField(),100.,PosAtDCA,covar);
\r
624 // Fill the DCA hist (before cut)
\r
625 fDCA->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
626 fDCAZoomed->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
627 fDCAZoomedTwice->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
629 // 5) DCA cut (See R_AA paper).
\r
630 Double_t DCAcutvalue[2];
\r
631 DCAcutvalue[0] = 0.018 + 0.035*TMath::Power(pt,-1.01);
\r
632 DCAcutvalue[1] = 2.;
\r
634 if (SPDHits&&((TMath::Abs(PosAtDCA[0])>DCAcutvalue[0])||(TMath::Abs(PosAtDCA[1])>DCAcutvalue[1]))) {
\r
635 if (fVerbose>3) cout<<"Track Ignored: Enough SPD hits, but out of DCA range."<<endl;
\r
638 fTrackCutsCount->Fill(fTrackCutLabelNumbers[3]-.5);
\r
639 fTrackCutsPt->Fill(fTrackCutLabelNumbers[3]-.5,pt);
\r
640 fTrackCutsEta->Fill(fTrackCutLabelNumbers[3]-.5,eta);
\r
641 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[3]-.5,phi);
\r
643 // Fill the DCA hist (after cut)
\r
644 fDCACut->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
645 fDCAZoomedCut->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
646 fDCAZoomedTwiceCut->Fill(PosAtDCA[0],PosAtDCA[1]);
\r
649 // Now all the common cuts have been performed. Tracks identified as a trigger will
\r
650 // be returned. Note that they will not appear in the histograms after track cut 5.
\r
651 if (classification==2) return 2;
\r
653 // Now we're left with only tracks with pT < 5.0 GeV/c.
\r
654 fTrackCutsCount->Fill(fTrackCutLabelNumbers[4]-.5);
\r
655 fTrackCutsPt->Fill(fTrackCutLabelNumbers[4]-.5,pt);
\r
656 fTrackCutsEta->Fill(fTrackCutLabelNumbers[4]-.5,eta);
\r
657 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[4]-.5,phi);
\r
659 // Obtain the status of the track.
\r
660 ULong_t status = globaltrack->GetStatus();
\r
663 if (!((status&AliAODTrack::kTPCpid)==AliAODTrack::kTPCpid)) {
\r
664 if (fVerbose>3) cout<<"Track Ignored: No TPC pid."<<endl;
\r
668 fTrackCutsCount->Fill(fTrackCutLabelNumbers[5]-.5);
\r
669 fTrackCutsPt->Fill(fTrackCutLabelNumbers[5]-.5,pt);
\r
670 fTrackCutsEta->Fill(fTrackCutLabelNumbers[5]-.5,eta);
\r
671 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[5]-.5,phi);
\r
674 if (!((status&AliAODTrack::kTOFpid)==AliAODTrack::kTOFpid)) {
\r
675 if (fVerbose>3) cout<<"Track Ignored: No TOF pid."<<endl;
\r
679 fTrackCutsCount->Fill(fTrackCutLabelNumbers[6]-.5);
\r
680 fTrackCutsPt->Fill(fTrackCutLabelNumbers[6]-.5,pt);
\r
681 fTrackCutsEta->Fill(fTrackCutLabelNumbers[6]-.5,eta);
\r
682 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[6]-.5,phi);
\r
684 // 8) TPC, TOF mismatch.
\r
685 if (fDemandNoMismatch) {
\r
686 if ((status&AliAODTrack::kTOFmismatch)==AliAODTrack::kTOFmismatch) {
\r
687 if (fVerbose>3) cout<<"Track Ignored: TOF mismatch found."<<endl;
\r
690 fTrackCutsCount->Fill(fTrackCutLabelNumbers[7]-.5);
\r
691 fTrackCutsPt->Fill(fTrackCutLabelNumbers[7]-.5,pt);
\r
692 fTrackCutsEta->Fill(fTrackCutLabelNumbers[7]-.5,eta);
\r
693 fTrackCutsPhi->Fill(fTrackCutLabelNumbers[7]-.5,phi);
\r
696 // All tracks which made it up to here are classified as associateds.
\r
698 // Fill the PID QA histograms.
\r
699 Double_t mom, nSigma;
\r
701 mom = globaltrack->GetTPCmomentum();
\r
702 nSigma = fPIDResponse->NumberOfSigmasTPC(globaltrack,AliPID::kProton);
\r
703 fTPCnSigmaProton->Fill(mom,nSigma);
\r
704 nSigma = fPIDResponse->NumberOfSigmasTPC(globaltrack,AliPID::kPion);
\r
705 fTPCnSigmaPion->Fill(mom,nSigma);
\r
706 nSigma = fPIDResponse->NumberOfSigmasTPC(globaltrack,AliPID::kKaon);
\r
707 fTPCnSigmaKaon->Fill(mom,nSigma);
\r
709 fTPCSignal->Fill(eta,pt,globaltrack->GetTPCsignal());
\r
711 mom =globaltrack->P();
\r
712 nSigma = fPIDResponse->NumberOfSigmasTOF(globaltrack,AliPID::kProton);
\r
713 fTOFnSigmaProton->Fill(mom,nSigma);
\r
714 nSigma = fPIDResponse->NumberOfSigmasTOF(globaltrack,AliPID::kPion);
\r
715 fTOFnSigmaPion->Fill(mom,nSigma);
\r
716 nSigma = fPIDResponse->NumberOfSigmasTOF(globaltrack,AliPID::kKaon);
\r
717 fTOFnSigmaKaon->Fill(mom,nSigma);
\r
719 fTOFSignal->Fill(eta,pt,globaltrack->GetTOFsignal());
\r
721 // Return associated.
\r
726 //____________________________________________________________________________
\r
727 Bool_t AliAnalysisTaskDiHadronPID::SelectEvent(AliAODVertex* vertex)
\r
732 // Event Selection.
\r
735 Double_t primVtx[3];
\r
736 vertex->GetXYZ(primVtx);
\r
737 if (TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2])>10.) {
\r
738 if (fVerbose>2) cout << "AliAnalysisTaskDiHadronPID::SelectEvent -> Vertex Out of Range." << endl;
\r
739 if (fVerbose>2) cout << "AliAnalysisTaskDiHadronPID::SelectEvent -> Event not selected." << endl;
\r
742 if (fVerbose>2) cout << "AliAnalysisTaskDiHadronPID::SelectEvent -> Vertex is OK." << endl;
\r
744 // We also wish to make centrality cut, but only if run on Pb+Pb.
\r
745 if (fBeamType=="PbPb") {
\r
746 Double_t cent = fAODHeader->GetCentrality();
\r
747 if (cent>fCentralityCutMin||cent<fCentralityCutMax) {
\r
748 if (fVerbose>2) cout<<"AliAnalysisTaskDiHadronPID::SelectEvent -> Event did not pass centaltity cut."<<endl;
\r
753 if (fVerbose>2) cout << "AliAnalysisTaskDiHadronPID::SelectEvent -> Event selected." << endl;
\r
758 //_____________________________________________________________________________
\r
759 void AliAnalysisTaskDiHadronPID::FillGlobalTracksArray() {
\r
761 // Initialize the mapping for corresponding PID tracks. (see
\r
762 // GetGlobalTrack(AliAODTrack* track)).
\r
766 if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::FillGlobalTracksArray -> ERROR: fAODEvent not set." << endl;
\r
770 fGlobalTracks = new TObjArray();
\r
771 AliAODTrack* track = 0x0;
\r
773 for (Int_t iTrack = 0; iTrack < fAODEvent->GetNumberOfTracks(); iTrack++) {
\r
775 track = fAODEvent->GetTrack(iTrack);
\r
777 // I.e., if it does NOT pass the filtermask.
\r
778 if (!(track->TestFilterMask(1<<7))) {
\r
779 if (track->GetID()>-1) fGlobalTracks->AddAtAndExpand(track,track->GetID());
\r
780 //if (track->GetID()<1) cout<<"Track ID: "<<track->GetID()<<" Partner ID: "<<(-track->GetID()-1)<<endl;
\r
787 //_____________________________________________________________________________
\r
788 AliAODTrack* AliAnalysisTaskDiHadronPID::GetGlobalTrack(AliAODTrack* track) {
\r
791 // Returns the "parner track" of track, which contains the pid information.
\r
794 AliAODTrack* partner = 0x0;
\r
796 partner = (AliAODTrack*)(fGlobalTracks->At(-track->GetID()-1));
\r
798 if (!partner&&(fVerbose>3)) cout<<"AliAnalysisTaskDiHadronPID::GetGlobalTrack -> No Global Track Found!"<<endl;
\r
804 //_____________________________________________________________________________
\r
805 Double_t AliAnalysisTaskDiHadronPID::PhiRange(Double_t DPhi)
\r
809 // Puts the argument in the range [-pi/2,3 pi/2].
\r
812 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
\r
813 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
\r
819 //_____________________________________________________________________________
\r
820 void AliAnalysisTaskDiHadronPID::UserExec(Option_t *)
\r
827 // Input the event.
\r
828 fAODEvent = dynamic_cast<AliAODEvent*>(InputEvent());
\r
830 if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: No AliAODEvent pointer could be created." << endl;
\r
834 // Get the event header.
\r
835 fAODHeader = fAODEvent->GetHeader();
\r
837 if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: No AliAODHeader pointer could be created."<<endl;
\r
841 // Get the event vertex.
\r
842 fAODVertex = fAODEvent->GetPrimaryVertex();
\r
844 if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: No AliAODVertex pointer could be created." << endl;
\r
848 // See if the event passes the event selection.
\r
849 if (!SelectEvent(fAODVertex)) return;
\r
851 // Display basic event information.
\r
852 if ((fVerbose>2)) cout << endl;
\r
853 if ((fVerbose>2)&&(fBeamType=="PbPb")) cout << "Event centrality: " << fAODHeader->GetCentrality() << endl;
\r
854 if ((fVerbose>2)) cout << "Event Vertex Z: " << fAODVertex->GetZ() << endl;
\r
855 if ((fVerbose>2)) cout << "Event tracks in AOD: " << fAODEvent->GetNumberOfTracks() << endl;
\r
856 if ((fVerbose>2)) cout << endl;
\r
858 // Filling Event QA plots.
\r
859 if (fBeamType=="PbPb") fCentrality->Fill(fAODHeader->GetCentrality());
\r
860 fVertexZ->Fill(fAODVertex->GetZ());
\r
862 // Fill the TObjArray which holds Global tracks.
\r
863 FillGlobalTracksArray();
\r
865 // Create object arrays for triggers and associateds.
\r
866 TObjArray *triggers = new TObjArray();
\r
867 TObjArray *associateds = new TObjArray();
\r
869 // In this loop the triggers and associateds will be identified, track QA and PID QA histograms will be filled.
\r
870 for (Int_t iTrack = 0; iTrack < fAODEvent->GetNumberOfTracks(); iTrack++) {
\r
872 // Obtain a pointer to the track.
\r
873 fAODTrack = fAODEvent->GetTrack(iTrack);
\r
874 if (!fAODTrack&&(fVerbose>0)) {
\r
875 cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: Track object not found." << endl;
\r
879 // Find the track classification.
\r
880 Int_t tracktype = ClassifyTrack(fAODTrack);
\r
882 if (tracktype==0) {
\r
886 if (tracktype==1) {
\r
887 if (fVerbose>3) cout<<"Track added to associated buffer."<<endl;
\r
888 associateds->AddLast(fAODTrack);
\r
889 fEtaSpectrumAssoc->Fill(fAODTrack->Eta(),fAODTrack->Pt());
\r
890 fPhiSpectrumAssoc->Fill(fAODTrack->Phi(),fAODTrack->Pt());
\r
893 if (tracktype==2) {
\r
894 if (fVerbose>3) cout<<"Track added to trigger buffer."<<endl;
\r
895 triggers->AddLast(fAODTrack);
\r
896 fEtaSpectrumTrig->Fill(fAODTrack->Eta());
\r
902 // In This Loop the di-hadron correlation will be made.
\r
903 Double_t histoFill[4]; // {Dphi, Deta, TPC signal, TOF signal}
\r
904 AliAODTrack* currentTrigger = 0x0;
\r
905 AliAODTrack* currentAssociated = 0x0;
\r
906 AliAODTrack* currentAssociatedGlobal = 0x0;
\r
908 AliTPCPIDResponse& TPCPIDResponse = fPIDResponse->GetTPCResponse();
\r
910 for (Int_t iTrig = 0; iTrig < triggers->GetEntriesFast(); iTrig++){
\r
912 currentTrigger = (AliAODTrack*)(triggers->At(iTrig));
\r
914 for (Int_t iAssoc = 0; iAssoc < associateds->GetEntriesFast(); iAssoc++) {
\r
916 currentAssociated = (AliAODTrack*)(associateds->At(iAssoc));
\r
917 currentAssociatedGlobal = GetGlobalTrack(currentAssociated);
\r
919 Double_t pt = currentAssociated->Pt();
\r
920 histoFill[0] = PhiRange(currentTrigger->Phi() - currentAssociated->Phi());
\r
921 histoFill[1] = currentTrigger->Eta() - currentAssociated->Eta();
\r
923 // Is there a caveat here when Pt = 5.00000000?
\r
924 const Int_t ptbin = (Int_t)(2*pt);
\r
926 if (currentAssociatedGlobal) {
\r
928 // Get TPC (expected) signals.
\r
929 Double_t TPCmom = currentAssociatedGlobal->GetTPCmomentum();
\r
930 Double_t TPCsignal = currentAssociatedGlobal->GetTPCsignal();
\r
931 Double_t expectedTPCsignalPion = TPCPIDResponse.GetExpectedSignal(TPCmom,AliPID::kPion);
\r
932 Double_t expectedTPCsignalKaon = TPCPIDResponse.GetExpectedSignal(TPCmom,AliPID::kKaon);
\r
933 Double_t expectedTPCsignalProton = TPCPIDResponse.GetExpectedSignal(TPCmom,AliPID::kProton);
\r
935 // Get TOF (expected) signals.
\r
936 Double_t TOFsignal = currentAssociatedGlobal->GetTOFsignal();
\r
937 Double_t times[AliPID::kSPECIES];
\r
938 currentAssociatedGlobal->GetIntegratedTimes(times);
\r
939 Double_t expectedTOFsignalPion = times[AliPID::kPion];
\r
940 Double_t expectedTOFsignalKaon = times[AliPID::kKaon];
\r
941 Double_t expectedTOFsignalProton = times[AliPID::kProton];
\r
943 // Fill the histograms.
\r
944 histoFill[2] = TPCsignal - expectedTPCsignalPion;
\r
945 histoFill[3] = TOFsignal - expectedTOFsignalPion;
\r
946 fDiHadronTPCTOF[0][ptbin]->Fill(histoFill);
\r
948 histoFill[2] = TPCsignal - expectedTPCsignalKaon;
\r
949 histoFill[3] = TOFsignal - expectedTOFsignalKaon;
\r
950 fDiHadronTPCTOF[1][ptbin]->Fill(histoFill);
\r
952 histoFill[2] = TPCsignal - expectedTPCsignalProton;
\r
953 histoFill[3] = TOFsignal - expectedTOFsignalProton;
\r
954 fDiHadronTPCTOF[2][ptbin]->Fill(histoFill);
\r
960 // In this loop we calculate the mixed events.
\r
961 if (fCalculateMixedEvents) {
\r
963 // Loop over the trigger buffer.
\r
964 if (fVerbose>3) cout << "AliAnalysisTaskDiHadronPID::UserExec -> Mixing the events with "<<fTrigBufferSize<<" triggers from the buffer." <<endl;
\r
965 if (fVerbose>3) cout << "AliAnalysisTaskDiHadronPID::UserExec -> Buffer size: "<<fTrigBufferIndex<<endl;
\r
967 for (Int_t iTrig=0;iTrig<fTrigBufferSize;iTrig++) {
\r
969 // Check if the trigger and the associated have a reconstructed
\r
970 // vertext no further than 2cm apart.
\r
972 // fTrigBuffer[i][0] = z
\r
973 // fTrigBuffer[i][1] = phi
\r
974 // fTrigBuffer[i][2] = eta
\r
975 // fTrigBuffer[i][3] = p_t
\r
977 if (TMath::Abs(fTrigBuffer[iTrig][0]-fAODVertex->GetZ())<fVertexZMixedEvents) {
\r
979 if (fVerbose>3) cout<<"AliAnalysisTaskDiHadronPID::UserExec -> Mixing with trigger Z: "<<fTrigBuffer[iTrig][0]<<", Pt: "<<fTrigBuffer[iTrig][3]<<endl;
\r
981 for (Int_t iAssoc = 0; iAssoc < associateds->GetEntriesFast(); iAssoc++) {
\r
983 currentAssociated = (AliAODTrack*)(associateds->At(iAssoc));
\r
984 currentAssociatedGlobal = GetGlobalTrack(currentAssociated);
\r
986 if (currentAssociatedGlobal) {
\r
988 Double_t DPhi = PhiRange(fTrigBuffer[iTrig][1] - currentAssociated->Phi());
\r
989 Double_t DEta = fTrigBuffer[iTrig][2] - currentAssociated->Eta();
\r
990 Double_t pt = currentAssociated->Pt();
\r
992 fMixedEvents->Fill(DPhi,DEta,pt);
\r
999 // Copy the triggers from the current event into the buffer.
\r
1000 if (fAODVertex->GetZ()<10.) {
\r
1002 if (fVerbose>3) cout<<"AliAnalysisTaskDiHadronPID::UserExec -> Copying "<<triggers->GetEntriesFast()<<" triggers with vertex z = "<<fAODVertex->GetZ()<<" to the buffer."<<endl;
\r
1004 for (Int_t iTrig = 0; iTrig<triggers->GetEntriesFast(); iTrig++) {
\r
1006 currentTrigger = (AliAODTrack*)(triggers->At(iTrig));
\r
1007 if (fVerbose>3) cout<<"AliAnalysisTaskDiHadronPID::UserExec -> Trigger pt = "<<currentTrigger->Pt()<<endl;
\r
1009 fTrigBuffer[fTrigBufferIndex][0] = fAODVertex->GetZ();
\r
1010 fTrigBuffer[fTrigBufferIndex][1] = currentTrigger->Phi();
\r
1011 fTrigBuffer[fTrigBufferIndex][2] = currentTrigger->Eta();
\r
1012 fTrigBuffer[fTrigBufferIndex][3] = currentTrigger->Pt();
\r
1013 fTrigBufferIndex++;
\r
1014 if (fTrigBufferSize<fTrigBufferMaxSize) {fTrigBufferSize++;} // 250 triggers should be enough to get 10 times more data in mixed events.
\r
1015 if (fTrigBufferIndex==fTrigBufferMaxSize) {fTrigBufferIndex=0;}
\r
1020 if (fPrintBufferSize) cout<<"AliAnalysisTaskDiHadronPID::UserExec -> Trigger buffer index: "<<fTrigBufferIndex<<", and size: "<<fTrigBufferSize<<endl;
\r
1023 delete associateds;
\r
1025 PostData(1,fHistoList);
\r
1029 //_____________________________________________________________________________
\r
1030 void AliAnalysisTaskDiHadronPID::Terminate(Option_t *)
\r