1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 #include "AliAnalysisTaskPIDCORR.h"
20 #include "Riostream.h"
28 #include "AliAODEvent.h"
29 #include "AliAODTrack.h"
30 #include "AliPIDResponse.h"
32 #include "AliAODInputHandler.h"
33 #include "AliVEvent.h"
34 #include "AliVParticle.h"
36 #include "AliAODMCHeader.h"
37 #include "AliAODMCParticle.h"
38 #include "AliMCEventHandler.h"
39 #include "AliMCEvent.h"
40 #include "TParticle.h"
41 #include <TDatabasePDG.h>
42 #include <TParticlePDG.h>
44 #include "AliAnalysisManager.h"
45 #include "AliAnalysisTaskSE.h"
47 #include "AliEventPoolManager.h"
50 ClassImp(AliAnalysisTaskPIDCORR)
51 ClassImp(AliPIDCorrParticle)
53 //________________________________________________________________________
54 AliAnalysisTaskPIDCORR::AliAnalysisTaskPIDCORR() // All data members should be initialised here
64 fTriggerPhiKaonProton(0),
67 fTriggerEtaKaonProton(0),
84 fDihadronCorrelation[i]=NULL;
85 fDihadronCorrelationPion[i]=NULL;
86 fDihadronCorrelationProtonKaon[i]=NULL;
87 fHistNSigmaTPCPion[i]=NULL;
90 fMixedProtonKaon[i]=NULL;
97 fHistNSProton[j]=NULL;
100 fHistASProton[j]=NULL;
103 fHistBgProton[j]=NULL;
104 fHistBulkAll[j]=NULL;
105 fHistBulkPion[j]=NULL;
106 fHistBulkProton[j]=NULL;
114 //________________________________________________________________________
115 AliAnalysisTaskPIDCORR::AliAnalysisTaskPIDCORR(const char *name) // All data members should be initialised here
116 :AliAnalysisTaskSE(name),
125 fTriggerPhiKaonProton(0),
128 fTriggerEtaKaonProton(0),
142 for(int i=0;i<10;i++)
144 fDihadronCorrelation[i]=NULL;
145 fDihadronCorrelationPion[i]=NULL;
146 fDihadronCorrelationProtonKaon[i]=NULL;
147 fHistNSigmaTPCPion[i]=NULL;
150 fMixedProtonKaon[i]=NULL;
157 fHistNSProton[j]=NULL;
160 fHistASProton[j]=NULL;
163 fHistBgProton[j]=NULL;
164 fHistBulkAll[j]=NULL;
165 fHistBulkPion[j]=NULL;
166 fHistBulkProton[j]=NULL;
172 // The last in the above list should not have a comma after it
175 // Define input and output slots here (never in the dummy constructor)
176 // Input slot #0 works with a TChain - it is connected to the default input container
177 // Output slot #1 writes into a TH1 container
179 DefineOutput(1, TList::Class()); // for output list
182 //________________________________________________________________________
183 AliAnalysisTaskPIDCORR::~AliAnalysisTaskPIDCORR()
185 // Destructor. Clean-up the output list, but not the histograms that are put inside
186 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
187 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
193 //________________________________________________________________________
194 void AliAnalysisTaskPIDCORR::UserCreateOutputObjects()
197 // Called once (on the worker node)
199 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
200 AliInputEventHandler *inputHandler = (AliInputEventHandler*)man->GetInputEventHandler();
201 fPIDResponse = inputHandler->GetPIDResponse();
203 fOutputList = new TList();
204 fOutputList->SetOwner(); // IMPORTANT!
211 fHistPt = new TH1F("fHistPt", "P_{T} distribution", 15, 0.1, 3.1);
212 fHistdEdx = new TH2F("fHistdEdx","TPC signal distribution",1000,0.,50.,1000,0,500);
217 for(int i=0;i<10;i++)
219 HistName="fDihadronCorrelation";HistName+=i;
220 fDihadronCorrelation[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
221 fDihadronCorrelation[i]->Sumw2();
222 fOutputList->Add(fDihadronCorrelation[i]);
224 HistName="fDihadronCorrelationPion";HistName+=i;
225 fDihadronCorrelationPion[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
226 fDihadronCorrelationPion[i]->Sumw2();
227 fOutputList->Add(fDihadronCorrelationPion[i]);
229 HistName="fDihadronCorrelationProtonKaon";HistName+=i;
230 fDihadronCorrelationProtonKaon[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
231 fDihadronCorrelationProtonKaon[i]->Sumw2();
232 fOutputList->Add(fDihadronCorrelationProtonKaon[i]);
234 HistName="fMixedEvent";HistName+=i;
235 fMixedEvent[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
236 fMixedEvent[i]->Sumw2();
237 fOutputList->Add(fMixedEvent[i]);
239 HistName="fMixedPion";HistName+=i;
240 fMixedPion[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
241 fMixedPion[i]->Sumw2();
242 fOutputList->Add(fMixedPion[i]);
244 HistName="fMixedProtonKaon";HistName+=i;
245 fMixedProtonKaon[i]= new TH2F(HistName.Data(),"#delta#eta-#delta#phi correlation",36,-TMath::Pi()/2,3.*TMath::Pi()/2,32,-1.6,1.6);
246 fMixedProtonKaon[i]->Sumw2();
247 fOutputList->Add(fMixedProtonKaon[i]);
249 HistName="fHistNSigmaTPCPion";HistName+=i;
250 fHistNSigmaTPCPion[i]= new TH1F(HistName.Data(),"NSigma distribution for all particles",200,-10,10);
251 fHistNSigmaTPCPion[i]->Sumw2();
252 fOutputList->Add(fHistNSigmaTPCPion[i]);
255 for(Int_t l=0;l<3;l++)
257 HistName="fHistNSPtSpectraAll";HistName+=l;
258 fHistNSAll[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
259 fHistNSAll[l]->Sumw2();
260 fOutputList->Add(fHistNSAll[l]);
262 HistName="fHistNSPtSpectraPion";HistName+=l;
263 fHistNSPion[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
264 fHistNSPion[l]->Sumw2();
265 fOutputList->Add(fHistNSPion[l]);
267 HistName="fHistNSPtSpectraProton";HistName+=l;
268 fHistNSProton[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
269 fHistNSProton[l]->Sumw2();
270 fOutputList->Add(fHistNSProton[l]);
272 HistName="fHistASPtSpectraAll";HistName+=l;
273 fHistASAll[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
274 fHistASAll[l]->Sumw2();
275 fOutputList->Add(fHistASAll[l]);
277 HistName="fHistASPtSpectraPion";HistName+=l;
278 fHistASPion[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
279 fHistASPion[l]->Sumw2();
280 fOutputList->Add(fHistASPion[l]);
282 HistName="fHistASPtSpectraProton";HistName+=l;
283 fHistASProton[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
284 fHistASProton[l]->Sumw2();
285 fOutputList->Add(fHistASProton[l]);
287 HistName="fHistBgPtSpectraAll";HistName+=l;
288 fHistBgAll[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
289 fHistBgAll[l]->Sumw2();
290 fOutputList->Add(fHistBgAll[l]);
292 HistName="fHistBgPtSpectraPion";HistName+=l;
293 fHistBgPion[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
294 fHistBgPion[l]->Sumw2();
295 fOutputList->Add(fHistBgPion[l]);
297 HistName="fHistBgPtSpectraProton";HistName+=l;
298 fHistBgProton[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
299 fHistBgProton[l]->Sumw2();
300 fOutputList->Add(fHistBgProton[l]);
304 HistName="fHistBulkPtSpectraAll";HistName+=l;
305 fHistBulkAll[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
306 fHistBulkAll[l]->Sumw2();
307 fOutputList->Add(fHistBulkAll[l]);
309 HistName="fHistBulkPtSpectraPion";HistName+=l;
310 fHistBulkPion[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
311 fHistBulkPion[l]->Sumw2();
312 fOutputList->Add(fHistBulkPion[l]);
314 HistName="fHistBulkPtSpectraProton";HistName+=l;
315 fHistBulkProton[l]= new TH1F(HistName.Data(),"Pt_spectra of Associated",15,0.5,3.5);
316 fHistBulkProton[l]->Sumw2();
317 fOutputList->Add(fHistBulkProton[l]);
321 fTriggerPhiAll = new TH1F("fTriggerPhiAll","Phi distribution of All trigger particles",340,0.0,2*TMath::Pi());
322 fTriggerPhiPion = new TH1F("fTriggerPhiPion","Phi distribution of Pion trigger particles",340,0.0,2*TMath::Pi());
323 fTriggerPhiKaonProton = new TH1F("fTriggerPhiKaonProton","Phi distribution of Kaon & Proton trigger particles",340,0.0,2*TMath::Pi());
325 fTriggerEtaAll = new TH1F("fTriggerEtaAll","Eta distribution of All trigger particles",16,-0.8,0.8);
326 fTriggerEtaPion = new TH1F("fTriggerEtaPion","Eta distribution of Pion trigger particles",16,-0.8,0.8);
327 fTriggerEtaKaonProton = new TH1F("fTriggerEtaKaonProton","Eta distribution of Kaon & Proton trigger particles",16,-0.8,0.8);
329 fAssoPhi = new TH1F("fAssoPhi","Phi distribution of Associated particles",340,0.0,2*TMath::Pi());
330 fAssoEta = new TH1F("fAssoEta","Eta distribution of Associated particles",16,-0.8,0.8);
334 fOutputList->Add(fTriggerPhiAll);
335 fOutputList->Add(fTriggerPhiPion);
336 fOutputList->Add(fTriggerPhiKaonProton);
337 fOutputList->Add(fTriggerEtaAll);
338 fOutputList->Add(fTriggerEtaPion);
339 fOutputList->Add(fTriggerEtaKaonProton);
340 fOutputList->Add(fAssoPhi);
341 fOutputList->Add(fAssoEta);
342 fOutputList->Add(fHistPt);
343 fOutputList->Add(fHistdEdx);
356 PostData(1, fOutputList); // Post data for ALL output slots >0 here, to get at least an empty histogram
359 //________________________________________________________________________
360 Bool_t AliAnalysisTaskPIDCORR :: SelectEvent(AliAODVertex* vertex)
370 vertex->GetXYZ(primVtx);
371 if (TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2])>10.) {
379 //_______________________________________________________________________
380 Int_t AliAnalysisTaskPIDCORR::ClassifyTrack(AliAODTrack* track)
382 //Int_t Classification=999;
383 Double_t pt = track->Pt();
384 Double_t eta = track->Eta();
385 //Double_t phi = track->Phi();
387 if (!(track->TestFilterMask(1<<7))) {
397 if (TMath::Abs(eta)>=0.8) {
410 if(track->Charge()==0) return 0;
412 AliAODTrack *globaltrack=GetGlobalTrack(track->GetID());
413 if(!globaltrack) return 0;
419 dz = track->ZAtDCA();
420 //cout<<dxy<<" "<<dz<<endl;
421 if(TMath ::Abs(dxy) >2.4 || TMath ::Abs(dz)>3.2) return 0;
423 Double_t chi2ndf = track->Chi2perNDF();
424 if(chi2ndf>4.0) return 0;
426 Double_t nclus = track->GetTPCClusterInfo(2,1);
427 if(nclus<80) return 0;
430 if(track->GetType() != AliAODTrack::kPrimary) return 0;
434 //________________________________________________________________
435 void AliAnalysisTaskPIDCORR::FillGlobalTracksArray() {
440 //if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::FillGlobalTracksArray -> ERROR: fAODEvent not set." << endl;
446 fGlobalTracks = new TObjArray();
447 AliAODTrack* track = 0x0;
449 for (Int_t iTrack = 0; iTrack < fAOD->GetNumberOfTracks(); iTrack++) {
451 track = fAOD->GetTrack(iTrack);
453 // I.e., if it does NOT pass the filtermask.
454 if (!(track->TestFilterMask(1<<7))) {
455 if (track->GetID()>-1) fGlobalTracks->AddAtAndExpand(track,track->GetID());
456 //cout<<"Track ID: "<<track->GetID()<<" Partner ID: "<<(-track->GetID()-1)<<endl;
461 //_______________________________________________________________________
463 AliAODTrack* AliAnalysisTaskPIDCORR::GetGlobalTrack(Int_t trackID) {
467 AliAODTrack* partner = 0x0;
469 partner = (AliAODTrack*)(fGlobalTracks->At(-trackID-1));
477 //________________________________________________________________________
478 void AliAnalysisTaskPIDCORR::UserExec(Option_t *)
481 // Called for each event
485 AliVEvent *event = InputEvent();
486 if (!event) { return; }
489 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
491 // printf("ERROR: fAOD not available\n");
498 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
499 if(!isSelected) return;
501 fAODVertex = fAOD->GetPrimaryVertex();
503 //if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: No AliAODVertex pointer could be created." << endl;
508 if(!SelectEvent(fAODVertex)) return;
510 /*fHistVx->Fill(fAODVertex->GetX());
511 fHistVy->Fill(fAODVertex->GetY());
512 fHistVz->Fill(fAODVertex->GetZ());*/
515 //Float_t bSign = (fAOD->GetMagneticField() > 0) ? 1 : -1;
517 /*fArrayMC = (TClonesArray*)fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
519 // AliFatal("Error: MC particles branch not found!\n");
523 /*AliAODMCHeader *mcHdr=NULL;
524 mcHdr=(AliAODMCHeader*)fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
526 //printf("MC header branch not found!\n");
530 // Fill the TObjArray which holds Global tracks.
531 FillGlobalTracksArray();
533 // Create object arrays for associateds.
534 TObjArray *associateds = new TObjArray();
537 Int_t TriggerIndx=-99999;
538 Double_t TriggerPtMin=4.00;
539 Double_t TriggerPtMax=8.00;
540 Double_t TriggerPhi=1e-10;
541 Double_t TriggerEta=1e-10;
542 Double_t TriggerPt=TriggerPtMin;
548 // Track loop to fill a pT spectrum
549 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++)
551 AliAODTrack* track = fAOD->GetTrack(iTracks);
553 //printf("ERROR: Could not receive track %d\n", iTracks);
557 Int_t tracktype=ClassifyTrack(track);
559 if(tracktype==0) continue;
564 AliAODTrack *globaltrack=GetGlobalTrack(track->GetID());
565 Double_t pT=globaltrack->Pt();
566 Double_t Eta=globaltrack->Eta();
569 Double_t dEdx=globaltrack->GetTPCsignal();
570 if(dEdx==0) continue;
573 fHistdEdx->Fill(globaltrack->P(),dEdx);
577 if(pT>TriggerPtMin && pT<=TriggerPtMax)
580 TriggerPhi=globaltrack->Phi();
581 TriggerEta=globaltrack->Eta();
582 TriggerIndx=track->GetID();
583 TriggerPtMin=TriggerPt;
586 if(pT>0.2 && TMath::Abs(Eta)<0.8)
587 associateds->AddLast(globaltrack);
596 Bool_t IsPion=kFALSE;
597 Bool_t IsKaonProton=kFALSE;
598 //cout<<"***************************************************************************"<<TriggerEta<<endl;
599 if(TMath::Abs(TriggerEta)>0.8) return;
601 if(TriggerIndx!=-99999)
604 //Float_t bSign = (fAOD->GetMagneticField() > 0) ? 1 : -1;
606 AliAODTrack *currentAssociateds=0x0;
608 AliAODTrack *TriggerTrck=GetGlobalTrack(TriggerIndx);
610 if(!TriggerTrck) return;
618 Int_t TrgrPtBin=GetTriggerPtBin(TriggerTrck);
620 if(TrgrPtBin> 7) return;
622 Bool_t CheckTrackPIDqa=GetTrackStatus(TriggerTrck);
623 if(!CheckTrackPIDqa) return;
625 Double_t nSigma_TPC=(fPIDResponse->NumberOfSigmasTPC(TriggerTrck, (AliPID ::EParticleType)2));
628 fHistNSigmaTPCPion[TrgrPtBin]->Fill(nSigma_TPC);
629 //if(nSigma_TPC >= 4.0 || nSigma_TPC< -7.5) return;
630 if(nSigma_TPC > 0.0 && nSigma_TPC< 4.0) IsPion=kTRUE;
631 if(nSigma_TPC > -6.0 && nSigma_TPC< -3.0) IsKaonProton=kTRUE;
632 //cout<<"NSigma_TPC********************************************************************************"<<nSigma_TPC<<" "<<TriggerTrck->GetTPCsignalN()<<endl;
634 EffEtaTrigAll=GetEtaCorrectionFactorTrigAll(TriggerEta) ;
635 fTriggerPhiAll->Fill(TriggerPhi);
636 fTriggerEtaAll->Fill(TriggerEta,1./(EffEtaTrigAll));
639 EffEtaTrigPi=GetEtaCorrectionFactorTrigPion(TriggerEta) ;
640 fTriggerPhiPion->Fill(TriggerPhi);
641 fTriggerEtaPion->Fill(TriggerEta,1./(EffEtaTrigPi));
645 EffEtaTrigPr=GetEtaCorrectionFactorTrigProton(TriggerEta) ;//Eff value of triggers
646 fTriggerPhiKaonProton->Fill(TriggerPhi);
647 fTriggerEtaKaonProton->Fill(TriggerEta,1./(EffEtaTrigPr));
649 //cout<<"PROTON TRIGGER***************************************************************"<<" "<<EffEtaTrigP<<endl;
654 for(Int_t iasso=0;iasso<associateds->GetEntriesFast();iasso++ )
656 currentAssociateds = (AliAODTrack*)(associateds->At(iasso));
657 Double_t assoPt=currentAssociateds->Pt();
659 Int_t AssoPtBin=(Int_t)(2*assoPt);
663 //Bool_t TwoTrackEff=TwoTrackEfficiency(TriggerTrck,currentAssociateds,0.02,bSign);
665 //if(!TwoTrackEff) continue;
667 //Identify Associated**********************************************************************
669 IdentifyAssociated(TriggerEta,TriggerPhi,IsPion,IsKaonProton,currentAssociateds);
671 //Identify Associated***********************************************************************
673 fAssoPhi->Fill(currentAssociateds->Phi());
674 fAssoEta->Fill(currentAssociateds->Eta());
676 Double_t delphi= PhiRange(TriggerPhi - currentAssociateds->Phi());
677 Double_t deleta=TriggerEta - currentAssociateds->Eta();
679 Float_t EffEtaAsso=GetEtaCorrectionFactorAsso(currentAssociateds->Eta());//Eff value of associateds
681 Float_t WeightSAll=(1./(EffEtaAsso*EffEtaTrigAll));
682 fDihadronCorrelation[AssoPtBin]->Fill(delphi,deleta,WeightSAll);
685 Float_t WeightSPi=(1./(EffEtaAsso*EffEtaTrigPi));
686 fDihadronCorrelationPion[AssoPtBin]->Fill(delphi,deleta,WeightSPi);
692 Float_t WeightSPr=(1./(EffEtaAsso*EffEtaTrigPr));
693 //cout<<WeightS<<endl;
694 fDihadronCorrelationProtonKaon[AssoPtBin]->Fill(delphi,deleta,WeightSPr);//Applied Efficiency Correction
703 //Mixing starts here----------------------------------------------------------------------------------------------------------------
705 Double_t multiplicity=fAOD->GetNumberOfTracks();
706 Double_t MultipORcent=multiplicity;
707 AliAODVertex *vtx =fAOD->GetPrimaryVertex();
708 Double_t zvertex =vtx->GetZ();
710 Double_t poolmax=150;
711 if(TMath:: Abs(zvertex)>=10 || MultipORcent>poolmax || MultipORcent<poolmin) return ;
712 AliEventPool* pool =NULL;
713 pool=fPoolMgr->GetEventPool(MultipORcent, zvertex);
716 //AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipORcent, zvertex));
719 if (pool->IsReady() || pool->NTracksInPool() > 50000/ 10 || pool->GetCurrentNEvents() >=5)
721 const Int_t nMix = pool->GetCurrentNEvents();
723 for (Int_t jMix=0; jMix<nMix; jMix++)
725 TObjArray* bgTracks = NULL;
726 bgTracks=pool->GetEvent(jMix);
727 if(!bgTracks) continue;
728 for(Int_t itrack=0;itrack<bgTracks->GetEntriesFast();++itrack)
730 AliPIDCorrParticle *PIDCorrParticle =NULL;
731 PIDCorrParticle=(AliPIDCorrParticle*)(bgTracks->At(itrack));
732 Double_t assoPt=PIDCorrParticle->Pt();
733 Int_t Ptbinbg=(Int_t)(assoPt*2);
737 Float_t EffEtaAssoMixed=GetEtaCorrectionFactorAsso(PIDCorrParticle->Eta());
739 Double_t mixedDelPhi=PhiRange(TriggerPhi-PIDCorrParticle->Phi());
740 Double_t mixedDelEta=TriggerEta-PIDCorrParticle->Eta();
743 if(TriggerIndx!=-99999)
745 Float_t WeightMAll=(1./(EffEtaAssoMixed*EffEtaTrigAll));
746 fMixedEvent[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMAll);
749 Float_t WeightMPi=(1./(EffEtaAssoMixed*EffEtaTrigPi));
750 fMixedPion[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMPi);
755 Float_t WeightMPr=(1./(EffEtaAssoMixed*EffEtaTrigPr));
756 //cout<<WeightM<<endl;
757 fMixedProtonKaon[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMPr);
768 TObjArray* objArray = NULL;
769 objArray = (TObjArray*)AcceptTracksforMixing(fAOD);
770 if(!objArray) return;
771 if(objArray->GetEntriesFast()>0) {
772 pool->UpdatePool(objArray);
777 PostData(1, fOutputList);
779 //_______________________________________________________________________________________
781 Double_t AliAnalysisTaskPIDCORR::PhiRange(Double_t DPhi)
785 // Puts the argument in the range [-pi/2,3 pi/2].
788 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
789 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
795 //________________________________________________________________________
796 Int_t AliAnalysisTaskPIDCORR:: GetTriggerPtBin(AliAODTrack *track)
799 Double_t Pt_Max=track->Pt();
800 if(Pt_Max<4.0) Bin=999;
801 if(Pt_Max>=4.0 && Pt_Max<4.5) Bin=0;
802 if(Pt_Max>=4.5 && Pt_Max<5.0) Bin=1;
803 if(Pt_Max>=5.0 && Pt_Max<5.5) Bin=2;
804 if(Pt_Max>=5.5 && Pt_Max<6.0) Bin=3;
805 if(Pt_Max>=6.0 && Pt_Max<6.5) Bin=4;
806 if(Pt_Max>=6.5 && Pt_Max<7.0) Bin=5;
807 if(Pt_Max>=7.0 && Pt_Max<7.5) Bin=6;
808 if(Pt_Max>=7.5 && Pt_Max<8.0) Bin=7;
809 if(Pt_Max>=8.0) Bin=999;
815 //______________________________________________________________________
816 Bool_t AliAnalysisTaskPIDCORR :: GetTrackStatus(AliAODTrack *track)
818 if ((track->GetStatus() & AliAODTrack::kTPCin ) == 0) return kFALSE;
819 if ((track->GetStatus() & AliAODTrack::kTPCrefit) == 0) return kFALSE;
820 if ((track->GetStatus() & AliAODTrack::kITSrefit) == 0) return kFALSE;
823 //______________________________________________________________________
825 void AliAnalysisTaskPIDCORR ::DefineEventPool()
827 const Int_t MaxNofEvents=1000;
828 const Int_t MinNofTracks=50000;
829 const Int_t NofCentBins=3;
830 Double_t CentralityBins[NofCentBins+1]={2,20,50,150};
831 const Int_t NofVrtxBins=10;
832 Double_t ZvrtxBins[NofVrtxBins+1]={-10,-8,-6,-4,-2,0,2,4,6,8,10};
835 fPoolMgr = new AliEventPoolManager(MaxNofEvents,MinNofTracks,NofCentBins,CentralityBins,NofVrtxBins,ZvrtxBins);
837 //_______________________________________________________________________
838 TObjArray *AliAnalysisTaskPIDCORR::AcceptTracksforMixing(AliAODEvent *inputEvent)
840 Int_t nTracks = inputEvent->GetNumberOfTracks();
844 TObjArray* tracksClone = new TObjArray;
845 tracksClone->SetOwner(kTRUE);
847 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
849 AliAODTrack* track = inputEvent->GetTrack(iTrack);
851 Int_t trackclass=ClassifyTrack(track);
854 //AliAODTrack *globaltrack=GetGlobalTrack(track->GetID());
855 //Double_t MpT=globaltrack->Pt();
856 //Double_t MEta=globaltrack->Eta();
857 //if(MpT>0.2 && TMath::Abs(MEta)<=0.8)
858 tracksClone->Add(new AliPIDCorrParticle(track->Eta(), track->Phi(), track->Pt(),track->Charge()));
864 //_________________________________________________________________________________________________________________________
867 Bool_t AliAnalysisTaskPIDCORR::TwoTrackEfficiency(AliAODTrack *trig,AliAODTrack *asso,Float_t ftwoTrackEfficiencyCutValue,Float_t bSign)
869 if(!trig || !asso) return kFALSE;
870 //if (twoTrackEfficiencyCut)
872 // the variables & cuthave been developed by the HBT group
873 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
875 Float_t phi1 = trig->Phi();
876 Float_t pt1 = trig->Pt();
877 Float_t charge1 = trig->Charge();
878 Float_t eta1=trig->Eta();
880 Float_t phi2 = asso->Phi();
881 Float_t pt2 = asso->Pt();
882 Float_t charge2 = asso->Charge();
883 Float_t eta2=asso->Eta();
885 Float_t deta=eta1-eta2;
887 if (TMath::Abs(deta) < ftwoTrackEfficiencyCutValue * 2.5 * 3)
889 // check first boundaries to see if is worth to loop and find the minimum
890 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
891 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
893 const Float_t kLimit = ftwoTrackEfficiencyCutValue * 3;
895 Float_t dphistarminabs = 1e5;
896 Float_t dphistarmin = 1e5;
897 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
899 for (Double_t rad=0.8; rad<2.51; rad+=0.01)
901 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
903 Float_t dphistarabs = TMath::Abs(dphistar);
905 if (dphistarabs < dphistarminabs)
907 dphistarmin = dphistar;
908 dphistarminabs = dphistarabs;
912 //fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
914 if (dphistarminabs < ftwoTrackEfficiencyCutValue && TMath::Abs(deta) < ftwoTrackEfficiencyCutValue)
916 // Printf("Removed track pair %d %d with %f %f %f %f %f %f %f %f %f", i, j, deta, dphistarminabs, phi1, pt1, charge1, phi2, pt2, charge2, bSign);
920 //fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
926 //_________________________________________________________________________________________________________________________________________
928 Bool_t AliAnalysisTaskPIDCORR::TwoTrackEfficiencyBg(AliAODTrack *trig,AliPIDCorrParticle *asso,Float_t ftwoTrackEfficiencyCutValue,Float_t bSign)
930 if(!trig || !asso) return kFALSE;
931 //if (twoTrackEfficiencyCut)
933 // the variables & cuthave been developed by the HBT group
934 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
936 Float_t phi1 = trig->Phi();
937 Float_t pt1 = trig->Pt();
938 Float_t charge1 = trig->Charge();
939 Float_t eta1=trig->Eta();
941 Float_t phi2 = asso->Phi();
942 Float_t pt2 = asso->Pt();
943 Float_t charge2 = asso->Charge();
944 Float_t eta2=asso->Eta();
946 Float_t deta=eta1-eta2;
948 if (TMath::Abs(deta) < ftwoTrackEfficiencyCutValue * 2.5 * 3)
950 // check first boundaries to see if is worth to loop and find the minimum
951 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
952 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
954 const Float_t kLimit = ftwoTrackEfficiencyCutValue * 3;
956 Float_t dphistarminabs = 1e5;
957 Float_t dphistarmin = 1e5;
958 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
960 for (Double_t rad=0.8; rad<2.51; rad+=0.01)
962 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
964 Float_t dphistarabs = TMath::Abs(dphistar);
966 if (dphistarabs < dphistarminabs)
968 dphistarmin = dphistar;
969 dphistarminabs = dphistarabs;
973 //fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
975 if (dphistarminabs < ftwoTrackEfficiencyCutValue && TMath::Abs(deta) < ftwoTrackEfficiencyCutValue)
977 // Printf("Removed track pair %d %d with %f %f %f %f %f %f %f %f %f", i, j, deta, dphistarminabs, phi1, pt1, charge1, phi2, pt2, charge2, bSign);
981 //fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
988 //__________________________________________________________________________________________________________________________________________
990 Float_t AliAnalysisTaskPIDCORR::GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1, Float_t phi2, Float_t pt2, Float_t charge2, Float_t radius, Float_t bSign)
993 // calculates dphistar
996 Float_t dphistar = phi1 - phi2 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1) + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
998 static const Double_t kPi = TMath::Pi();
1001 // if (dphistar > 2 * kPi)
1002 // dphistar -= 2 * kPi;
1003 // if (dphistar < -2 * kPi)
1004 // dphistar += 2 * kPi;
1007 dphistar = kPi * 2 - dphistar;
1008 if (dphistar < -kPi)
1009 dphistar = -kPi * 2 - dphistar;
1010 if (dphistar > kPi) // might look funny but is needed
1011 dphistar = kPi * 2 - dphistar;
1015 //_______________________________________________________________________
1016 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorAsso(Double_t Eta)
1020 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1021 Int_t BIN=TMath::Abs(Etabin);
1023 Float_t eff[16]={0.773274,0.783099,0.774943,0.769163,0.759582,0.74767,0.732028,0.724823,0.756575,0.780094,0.788648,0.79306,0.796114,0.801123,0.799477,0.779948};
1030 //____________________________________________________________________________________
1031 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigAll(Double_t Eta)
1035 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1036 Int_t BIN=TMath::Abs(Etabin);
1040 Float_t EffAll[16]={0.705833,0.715773,0.72209,0.718895,0.703701,0.691354,0.679242,0.65723,0.698546,0.72464,0.730565,0.732914,0.733499,0.746637,0.738133,0.720495};
1046 //_____________________________________________________________________________________________
1047 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigPion(Double_t Eta)
1051 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1052 Int_t BIN=TMath::Abs(Etabin);
1055 Float_t EffPion[16]={0.36819,0.369563,0.378747,0.378856,0.361426,0.372088,0.355179,0.344626,0.376348,0.387998,0.381553,0.373258,0.397368,0.380326,0.381536,0.369155};
1057 return EffPion[BIN];
1062 //______________________________________________________________________________________________________
1063 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigProton(Double_t Eta)
1067 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1068 Int_t BIN=TMath::Abs(Etabin);
1070 Float_t EffProton[16]={0.698916,0.708791,0.686047,0.663609,0.621142,0.57571,0.556255,0.518182,0.54031,0.58828,0.62885,0.675739,0.686916,0.707395,0.714397,0.693769};
1071 return EffProton[BIN];
1077 //_______________________________________________________________________
1078 Bool_t AliAnalysisTaskPIDCORR::CheckTOF(AliVTrack * trk)
1080 //in addition to KTOFout and kTIME we look at the pt
1081 if(trk->Pt()<0.6)return kFALSE;
1083 //check if the particle has TOF Matching
1085 status=trk->GetStatus();
1086 if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)return kFALSE;
1092 //________________________________________________________________________
1093 void AliAnalysisTaskPIDCORR::IdentifyAssociated(Double_t Eta_trig,Double_t Phi_trig,Bool_t PION,Bool_t PROTON,AliAODTrack *TRK)
1095 Bool_t HasTOFPID=CheckTOF(TRK);
1096 //Bool_t HasTPCPID=GetTrackStatus(TRK);
1100 Double_t Eta_asso=TRK->Eta();
1101 Double_t Phi_asso=TRK->Phi();
1103 Int_t Ptype=GetTOFPID(TRK);
1106 //cout<<"TOFPID"<<HasTOFPID<<" "<<"ParticleType"<<Ptype<<endl;
1107 //Int_t Ptype=GetTPCTOFPID(TRK);
1109 if(TMath::Abs(Eta_trig-Eta_asso)<=0.5)
1112 if(TMath::Abs(Phi_trig-Phi_asso)<=0.5)
1114 fHistNSAll[Ptype]->Fill(TRK->Pt());
1116 fHistNSPion[Ptype]->Fill(TRK->Pt());
1118 fHistNSProton[Ptype]->Fill(TRK->Pt());
1121 if((Phi_trig-Phi_asso)>=TMath::Pi()-0.5 && (Phi_trig-Phi_asso)<=TMath::Pi()+0.5)
1123 fHistASAll[Ptype]->Fill(TRK->Pt());
1125 fHistASPion[Ptype]->Fill(TRK->Pt());
1127 fHistASProton[Ptype]->Fill(TRK->Pt());
1130 if((Phi_trig-Phi_asso)>=0.5*TMath::Pi()-0.4 && (Phi_trig-Phi_asso)<=0.5*TMath::Pi()+0.2)
1132 fHistBgAll[Ptype]->Fill(TRK->Pt());
1134 fHistBgPion[Ptype]->Fill(TRK->Pt());
1136 fHistBgProton[Ptype]->Fill(TRK->Pt());
1142 if(TMath::Abs(Eta_trig-Eta_asso)>=1.0)
1144 fHistBulkAll[Ptype]->Fill(TRK->Pt());
1146 fHistBulkPion[Ptype]->Fill(TRK->Pt());
1148 fHistBulkProton[Ptype]->Fill(TRK->Pt());
1160 //_______________________________________________________________________
1161 Int_t AliAnalysisTaskPIDCORR::GetTOFPID(AliAODTrack *track)
1164 Double_t nsigmaTOFkProton=999.,nsigmaTOFkKaon=999.,nsigmaTOFkPion=999.;
1166 nsigmaTOFkProton = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kProton);
1167 nsigmaTOFkKaon = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kKaon);
1168 nsigmaTOFkPion = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kPion);
1170 //cout<<nsigmaTOFkProton<<" "<<nsigmaTOFkKaon<<" "<< nsigmaTOFkPion<<endl;
1172 if(TMath::Abs(nsigmaTOFkPion)<= 2.0) return 0;
1173 if(TMath::Abs(nsigmaTOFkKaon)<= 2.0) return 1;
1174 if(TMath::Abs(nsigmaTOFkProton)<= 2.0) return 2;
1179 //_______________________________________________________________________
1180 Int_t AliAnalysisTaskPIDCORR::GetTPCTOFPID(AliAODTrack *track)
1184 Double_t nsigmaTPCkProton = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kProton);
1185 Double_t nsigmaTPCkKaon = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kKaon);
1186 Double_t nsigmaTPCkPion = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion);
1189 Double_t nsigmaTOFkProton=999.,nsigmaTOFkKaon=999.,nsigmaTOFkPion=999.;
1191 nsigmaTOFkProton = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kProton);
1192 nsigmaTOFkKaon = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kKaon);
1193 nsigmaTOFkPion = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kPion);
1197 Double_t nsigmaTPCTOFkProton=999.,nsigmaTPCTOFkKaon=999.,nsigmaTPCTOFkPion=999.;
1198 nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton));
1199 nsigmaTPCTOFkKaon = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon));
1200 nsigmaTPCTOFkPion = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion));
1202 if(TMath::Abs(nsigmaTPCTOFkPion)<= 3.0) return 0;
1203 if(TMath::Abs(nsigmaTPCTOFkKaon)<= 3.0) return 1;
1204 if(TMath::Abs(nsigmaTPCTOFkProton)<= 3.0) return 2;
1211 //________________________________________________________________________
1212 void AliAnalysisTaskPIDCORR::Terminate(Option_t *)
1214 // Draw result to screen, or perform fitting, normalizations
1215 // Called once at the end of the query
1216 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
1217 if(!fOutputList) { Printf("ERROR: could not retrieve TList fOutput"); return; }