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 = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(iTrack));
452 if(!track) AliFatal("Not a standard AOD");
454 // I.e., if it does NOT pass the filtermask.
455 if (!(track->TestFilterMask(1<<7))) {
456 if (track->GetID()>-1) fGlobalTracks->AddAtAndExpand(track,track->GetID());
457 //cout<<"Track ID: "<<track->GetID()<<" Partner ID: "<<(-track->GetID()-1)<<endl;
462 //_______________________________________________________________________
464 AliAODTrack* AliAnalysisTaskPIDCORR::GetGlobalTrack(Int_t trackID) {
468 AliAODTrack* partner = 0x0;
470 partner = (AliAODTrack*)(fGlobalTracks->At(-trackID-1));
478 //________________________________________________________________________
479 void AliAnalysisTaskPIDCORR::UserExec(Option_t *)
482 // Called for each event
486 AliVEvent *event = InputEvent();
487 if (!event) { return; }
490 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
492 // printf("ERROR: fAOD not available\n");
499 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
500 if(!isSelected) return;
502 fAODVertex = fAOD->GetPrimaryVertex();
504 //if (fVerbose>0) cout << "AliAnalysisTaskDiHadronPID::UserExec -> ERROR: No AliAODVertex pointer could be created." << endl;
509 if(!SelectEvent(fAODVertex)) return;
511 /*fHistVx->Fill(fAODVertex->GetX());
512 fHistVy->Fill(fAODVertex->GetY());
513 fHistVz->Fill(fAODVertex->GetZ());*/
516 //Float_t bSign = (fAOD->GetMagneticField() > 0) ? 1 : -1;
518 /*fArrayMC = (TClonesArray*)fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
520 // AliFatal("Error: MC particles branch not found!\n");
524 /*AliAODMCHeader *mcHdr=NULL;
525 mcHdr=(AliAODMCHeader*)fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
527 //printf("MC header branch not found!\n");
531 // Fill the TObjArray which holds Global tracks.
532 FillGlobalTracksArray();
534 // Create object arrays for associateds.
535 TObjArray *associateds = new TObjArray();
538 Int_t TriggerIndx=-99999;
539 Double_t TriggerPtMin=4.00;
540 Double_t TriggerPtMax=8.00;
541 Double_t TriggerPhi=1e-10;
542 Double_t TriggerEta=1e-10;
543 Double_t TriggerPt=TriggerPtMin;
549 // Track loop to fill a pT spectrum
550 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++)
552 AliAODTrack* track = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(iTracks));
553 if(!track) AliFatal("Not a standard AOD");
555 //printf("ERROR: Could not receive track %d\n", iTracks);
559 Int_t tracktype=ClassifyTrack(track);
561 if(tracktype==0) continue;
566 AliAODTrack *globaltrack=GetGlobalTrack(track->GetID());
567 Double_t pT=globaltrack->Pt();
568 Double_t Eta=globaltrack->Eta();
571 Double_t dEdx=globaltrack->GetTPCsignal();
572 if(dEdx==0) continue;
575 fHistdEdx->Fill(globaltrack->P(),dEdx);
579 if(pT>TriggerPtMin && pT<=TriggerPtMax)
582 TriggerPhi=globaltrack->Phi();
583 TriggerEta=globaltrack->Eta();
584 TriggerIndx=track->GetID();
585 TriggerPtMin=TriggerPt;
588 if(pT>0.2 && TMath::Abs(Eta)<0.8)
589 associateds->AddLast(globaltrack);
598 Bool_t IsPion=kFALSE;
599 Bool_t IsKaonProton=kFALSE;
600 //cout<<"***************************************************************************"<<TriggerEta<<endl;
601 if(TMath::Abs(TriggerEta)>0.8) return;
603 if(TriggerIndx!=-99999)
606 //Float_t bSign = (fAOD->GetMagneticField() > 0) ? 1 : -1;
608 AliAODTrack *currentAssociateds=0x0;
610 AliAODTrack *TriggerTrck=GetGlobalTrack(TriggerIndx);
612 if(!TriggerTrck) return;
620 Int_t TrgrPtBin=GetTriggerPtBin(TriggerTrck);
622 if(TrgrPtBin> 7) return;
624 Bool_t CheckTrackPIDqa=GetTrackStatus(TriggerTrck);
625 if(!CheckTrackPIDqa) return;
627 Double_t nSigma_TPC=(fPIDResponse->NumberOfSigmasTPC(TriggerTrck, (AliPID ::EParticleType)2));
630 fHistNSigmaTPCPion[TrgrPtBin]->Fill(nSigma_TPC);
631 //if(nSigma_TPC >= 4.0 || nSigma_TPC< -7.5) return;
632 if(nSigma_TPC > 0.0 && nSigma_TPC< 4.0) IsPion=kTRUE;
633 if(nSigma_TPC > -6.0 && nSigma_TPC< -3.0) IsKaonProton=kTRUE;
634 //cout<<"NSigma_TPC********************************************************************************"<<nSigma_TPC<<" "<<TriggerTrck->GetTPCsignalN()<<endl;
636 EffEtaTrigAll=GetEtaCorrectionFactorTrigAll(TriggerEta) ;
637 fTriggerPhiAll->Fill(TriggerPhi);
638 fTriggerEtaAll->Fill(TriggerEta,1./(EffEtaTrigAll));
641 EffEtaTrigPi=GetEtaCorrectionFactorTrigPion(TriggerEta) ;
642 fTriggerPhiPion->Fill(TriggerPhi);
643 fTriggerEtaPion->Fill(TriggerEta,1./(EffEtaTrigPi));
647 EffEtaTrigPr=GetEtaCorrectionFactorTrigProton(TriggerEta) ;//Eff value of triggers
648 fTriggerPhiKaonProton->Fill(TriggerPhi);
649 fTriggerEtaKaonProton->Fill(TriggerEta,1./(EffEtaTrigPr));
651 //cout<<"PROTON TRIGGER***************************************************************"<<" "<<EffEtaTrigP<<endl;
656 for(Int_t iasso=0;iasso<associateds->GetEntriesFast();iasso++ )
658 currentAssociateds = (AliAODTrack*)(associateds->At(iasso));
659 Double_t assoPt=currentAssociateds->Pt();
661 Int_t AssoPtBin=(Int_t)(2*assoPt);
665 //Bool_t TwoTrackEff=TwoTrackEfficiency(TriggerTrck,currentAssociateds,0.02,bSign);
667 //if(!TwoTrackEff) continue;
669 //Identify Associated**********************************************************************
671 IdentifyAssociated(TriggerEta,TriggerPhi,IsPion,IsKaonProton,currentAssociateds);
673 //Identify Associated***********************************************************************
675 fAssoPhi->Fill(currentAssociateds->Phi());
676 fAssoEta->Fill(currentAssociateds->Eta());
678 Double_t delphi= PhiRange(TriggerPhi - currentAssociateds->Phi());
679 Double_t deleta=TriggerEta - currentAssociateds->Eta();
681 Float_t EffEtaAsso=GetEtaCorrectionFactorAsso(currentAssociateds->Eta());//Eff value of associateds
683 Float_t WeightSAll=(1./(EffEtaAsso*EffEtaTrigAll));
684 fDihadronCorrelation[AssoPtBin]->Fill(delphi,deleta,WeightSAll);
687 Float_t WeightSPi=(1./(EffEtaAsso*EffEtaTrigPi));
688 fDihadronCorrelationPion[AssoPtBin]->Fill(delphi,deleta,WeightSPi);
694 Float_t WeightSPr=(1./(EffEtaAsso*EffEtaTrigPr));
695 //cout<<WeightS<<endl;
696 fDihadronCorrelationProtonKaon[AssoPtBin]->Fill(delphi,deleta,WeightSPr);//Applied Efficiency Correction
705 //Mixing starts here----------------------------------------------------------------------------------------------------------------
707 Double_t multiplicity=fAOD->GetNumberOfTracks();
708 Double_t MultipORcent=multiplicity;
709 AliAODVertex *vtx =fAOD->GetPrimaryVertex();
710 Double_t zvertex =vtx->GetZ();
712 Double_t poolmax=150;
713 if(TMath:: Abs(zvertex)>=10 || MultipORcent>poolmax || MultipORcent<poolmin) return ;
714 AliEventPool* pool =NULL;
715 pool=fPoolMgr->GetEventPool(MultipORcent, zvertex);
718 //AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipORcent, zvertex));
721 if (pool->IsReady() || pool->NTracksInPool() > 50000/ 10 || pool->GetCurrentNEvents() >=5)
723 const Int_t nMix = pool->GetCurrentNEvents();
725 for (Int_t jMix=0; jMix<nMix; jMix++)
727 TObjArray* bgTracks = NULL;
728 bgTracks=pool->GetEvent(jMix);
729 if(!bgTracks) continue;
730 for(Int_t itrack=0;itrack<bgTracks->GetEntriesFast();++itrack)
732 AliPIDCorrParticle *PIDCorrParticle =NULL;
733 PIDCorrParticle=(AliPIDCorrParticle*)(bgTracks->At(itrack));
734 Double_t assoPt=PIDCorrParticle->Pt();
735 Int_t Ptbinbg=(Int_t)(assoPt*2);
739 Float_t EffEtaAssoMixed=GetEtaCorrectionFactorAsso(PIDCorrParticle->Eta());
741 Double_t mixedDelPhi=PhiRange(TriggerPhi-PIDCorrParticle->Phi());
742 Double_t mixedDelEta=TriggerEta-PIDCorrParticle->Eta();
745 if(TriggerIndx!=-99999)
747 Float_t WeightMAll=(1./(EffEtaAssoMixed*EffEtaTrigAll));
748 fMixedEvent[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMAll);
751 Float_t WeightMPi=(1./(EffEtaAssoMixed*EffEtaTrigPi));
752 fMixedPion[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMPi);
757 Float_t WeightMPr=(1./(EffEtaAssoMixed*EffEtaTrigPr));
758 //cout<<WeightM<<endl;
759 fMixedProtonKaon[Ptbinbg]->Fill(mixedDelPhi,mixedDelEta,WeightMPr);
770 TObjArray* objArray = NULL;
771 objArray = (TObjArray*)AcceptTracksforMixing(fAOD);
772 if(!objArray) return;
773 if(objArray->GetEntriesFast()>0) {
774 pool->UpdatePool(objArray);
779 PostData(1, fOutputList);
781 //_______________________________________________________________________________________
783 Double_t AliAnalysisTaskPIDCORR::PhiRange(Double_t DPhi)
787 // Puts the argument in the range [-pi/2,3 pi/2].
790 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
791 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
797 //________________________________________________________________________
798 Int_t AliAnalysisTaskPIDCORR:: GetTriggerPtBin(AliAODTrack *track)
801 Double_t Pt_Max=track->Pt();
802 if(Pt_Max<4.0) Bin=999;
803 if(Pt_Max>=4.0 && Pt_Max<4.5) Bin=0;
804 if(Pt_Max>=4.5 && Pt_Max<5.0) Bin=1;
805 if(Pt_Max>=5.0 && Pt_Max<5.5) Bin=2;
806 if(Pt_Max>=5.5 && Pt_Max<6.0) Bin=3;
807 if(Pt_Max>=6.0 && Pt_Max<6.5) Bin=4;
808 if(Pt_Max>=6.5 && Pt_Max<7.0) Bin=5;
809 if(Pt_Max>=7.0 && Pt_Max<7.5) Bin=6;
810 if(Pt_Max>=7.5 && Pt_Max<8.0) Bin=7;
811 if(Pt_Max>=8.0) Bin=999;
817 //______________________________________________________________________
818 Bool_t AliAnalysisTaskPIDCORR :: GetTrackStatus(AliAODTrack *track)
820 if ((track->GetStatus() & AliAODTrack::kTPCin ) == 0) return kFALSE;
821 if ((track->GetStatus() & AliAODTrack::kTPCrefit) == 0) return kFALSE;
822 if ((track->GetStatus() & AliAODTrack::kITSrefit) == 0) return kFALSE;
825 //______________________________________________________________________
827 void AliAnalysisTaskPIDCORR ::DefineEventPool()
829 const Int_t MaxNofEvents=1000;
830 const Int_t MinNofTracks=50000;
831 const Int_t NofCentBins=3;
832 Double_t CentralityBins[NofCentBins+1]={2,20,50,150};
833 const Int_t NofVrtxBins=10;
834 Double_t ZvrtxBins[NofVrtxBins+1]={-10,-8,-6,-4,-2,0,2,4,6,8,10};
837 fPoolMgr = new AliEventPoolManager(MaxNofEvents,MinNofTracks,NofCentBins,CentralityBins,NofVrtxBins,ZvrtxBins);
839 //_______________________________________________________________________
840 TObjArray *AliAnalysisTaskPIDCORR::AcceptTracksforMixing(AliAODEvent *inputEvent)
842 Int_t nTracks = inputEvent->GetNumberOfTracks();
846 TObjArray* tracksClone = new TObjArray;
847 tracksClone->SetOwner(kTRUE);
849 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
851 AliAODTrack* track = dynamic_cast<AliAODTrack*>(inputEvent->GetTrack(iTrack));
852 if(!track) AliFatal("Not a standard AOD");
854 Int_t trackclass=ClassifyTrack(track);
857 //AliAODTrack *globaltrack=GetGlobalTrack(track->GetID());
858 //Double_t MpT=globaltrack->Pt();
859 //Double_t MEta=globaltrack->Eta();
860 //if(MpT>0.2 && TMath::Abs(MEta)<=0.8)
861 tracksClone->Add(new AliPIDCorrParticle(track->Eta(), track->Phi(), track->Pt(),track->Charge()));
867 //_________________________________________________________________________________________________________________________
870 Bool_t AliAnalysisTaskPIDCORR::TwoTrackEfficiency(AliAODTrack *trig,AliAODTrack *asso,Float_t ftwoTrackEfficiencyCutValue,Float_t bSign)
872 if(!trig || !asso) return kFALSE;
873 //if (twoTrackEfficiencyCut)
875 // the variables & cuthave been developed by the HBT group
876 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
878 Float_t phi1 = trig->Phi();
879 Float_t pt1 = trig->Pt();
880 Float_t charge1 = trig->Charge();
881 Float_t eta1=trig->Eta();
883 Float_t phi2 = asso->Phi();
884 Float_t pt2 = asso->Pt();
885 Float_t charge2 = asso->Charge();
886 Float_t eta2=asso->Eta();
888 Float_t deta=eta1-eta2;
890 if (TMath::Abs(deta) < ftwoTrackEfficiencyCutValue * 2.5 * 3)
892 // check first boundaries to see if is worth to loop and find the minimum
893 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
894 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
896 const Float_t kLimit = ftwoTrackEfficiencyCutValue * 3;
898 Float_t dphistarminabs = 1e5;
899 //Float_t dphistarmin = 1e5;
900 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
902 for (Double_t rad=0.8; rad<2.51; rad+=0.01)
904 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
906 Float_t dphistarabs = TMath::Abs(dphistar);
908 if (dphistarabs < dphistarminabs)
910 //dphistarmin = dphistar;
911 dphistarminabs = dphistarabs;
915 //fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
917 if (dphistarminabs < ftwoTrackEfficiencyCutValue && TMath::Abs(deta) < ftwoTrackEfficiencyCutValue)
919 // 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);
923 //fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
929 //_________________________________________________________________________________________________________________________________________
931 Bool_t AliAnalysisTaskPIDCORR::TwoTrackEfficiencyBg(AliAODTrack *trig,AliPIDCorrParticle *asso,Float_t ftwoTrackEfficiencyCutValue,Float_t bSign)
933 if(!trig || !asso) return kFALSE;
934 //if (twoTrackEfficiencyCut)
936 // the variables & cuthave been developed by the HBT group
937 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
939 Float_t phi1 = trig->Phi();
940 Float_t pt1 = trig->Pt();
941 Float_t charge1 = trig->Charge();
942 Float_t eta1=trig->Eta();
944 Float_t phi2 = asso->Phi();
945 Float_t pt2 = asso->Pt();
946 Float_t charge2 = asso->Charge();
947 Float_t eta2=asso->Eta();
949 Float_t deta=eta1-eta2;
951 if (TMath::Abs(deta) < ftwoTrackEfficiencyCutValue * 2.5 * 3)
953 // check first boundaries to see if is worth to loop and find the minimum
954 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 0.8, bSign);
955 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
957 const Float_t kLimit = ftwoTrackEfficiencyCutValue * 3;
959 Float_t dphistarminabs = 1e5;
960 //Float_t dphistarmin = 1e5;
961 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
963 for (Double_t rad=0.8; rad<2.51; rad+=0.01)
965 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
967 Float_t dphistarabs = TMath::Abs(dphistar);
969 if (dphistarabs < dphistarminabs)
971 //dphistarmin = dphistar;
972 dphistarminabs = dphistarabs;
976 //fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
978 if (dphistarminabs < ftwoTrackEfficiencyCutValue && TMath::Abs(deta) < ftwoTrackEfficiencyCutValue)
980 // 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);
984 //fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
991 //__________________________________________________________________________________________________________________________________________
993 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)
996 // calculates dphistar
999 Float_t dphistar = phi1 - phi2 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1) + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
1001 static const Double_t kPi = TMath::Pi();
1004 // if (dphistar > 2 * kPi)
1005 // dphistar -= 2 * kPi;
1006 // if (dphistar < -2 * kPi)
1007 // dphistar += 2 * kPi;
1010 dphistar = kPi * 2 - dphistar;
1011 if (dphistar < -kPi)
1012 dphistar = -kPi * 2 - dphistar;
1013 if (dphistar > kPi) // might look funny but is needed
1014 dphistar = kPi * 2 - dphistar;
1018 //_______________________________________________________________________
1019 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorAsso(Double_t Eta)
1023 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1024 Int_t BIN=TMath::Abs(Etabin);
1026 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};
1033 //____________________________________________________________________________________
1034 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigAll(Double_t Eta)
1038 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1039 Int_t BIN=TMath::Abs(Etabin);
1043 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};
1049 //_____________________________________________________________________________________________
1050 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigPion(Double_t Eta)
1054 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1055 Int_t BIN=TMath::Abs(Etabin);
1058 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};
1060 return EffPion[BIN];
1065 //______________________________________________________________________________________________________
1066 Float_t AliAnalysisTaskPIDCORR::GetEtaCorrectionFactorTrigProton(Double_t Eta)
1070 Int_t Etabin=(16/1.6)*(-0.8-Eta);
1071 Int_t BIN=TMath::Abs(Etabin);
1073 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};
1074 return EffProton[BIN];
1080 //_______________________________________________________________________
1081 Bool_t AliAnalysisTaskPIDCORR::CheckTOF(AliVTrack * trk)
1083 //in addition to KTOFout and kTIME we look at the pt
1084 if(trk->Pt()<0.6)return kFALSE;
1086 //check if the particle has TOF Matching
1088 status=trk->GetStatus();
1089 if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)return kFALSE;
1095 //________________________________________________________________________
1096 void AliAnalysisTaskPIDCORR::IdentifyAssociated(Double_t Eta_trig,Double_t Phi_trig,Bool_t PION,Bool_t PROTON,AliAODTrack *TRK)
1098 Bool_t HasTOFPID=CheckTOF(TRK);
1099 //Bool_t HasTPCPID=GetTrackStatus(TRK);
1103 Double_t Eta_asso=TRK->Eta();
1104 Double_t Phi_asso=TRK->Phi();
1106 Int_t Ptype=GetTOFPID(TRK);
1109 //cout<<"TOFPID"<<HasTOFPID<<" "<<"ParticleType"<<Ptype<<endl;
1110 //Int_t Ptype=GetTPCTOFPID(TRK);
1112 if(TMath::Abs(Eta_trig-Eta_asso)<=0.5)
1115 if(TMath::Abs(Phi_trig-Phi_asso)<=0.5)
1117 fHistNSAll[Ptype]->Fill(TRK->Pt());
1119 fHistNSPion[Ptype]->Fill(TRK->Pt());
1121 fHistNSProton[Ptype]->Fill(TRK->Pt());
1124 if((Phi_trig-Phi_asso)>=TMath::Pi()-0.5 && (Phi_trig-Phi_asso)<=TMath::Pi()+0.5)
1126 fHistASAll[Ptype]->Fill(TRK->Pt());
1128 fHistASPion[Ptype]->Fill(TRK->Pt());
1130 fHistASProton[Ptype]->Fill(TRK->Pt());
1133 if((Phi_trig-Phi_asso)>=0.5*TMath::Pi()-0.4 && (Phi_trig-Phi_asso)<=0.5*TMath::Pi()+0.2)
1135 fHistBgAll[Ptype]->Fill(TRK->Pt());
1137 fHistBgPion[Ptype]->Fill(TRK->Pt());
1139 fHistBgProton[Ptype]->Fill(TRK->Pt());
1145 if(TMath::Abs(Eta_trig-Eta_asso)>=1.0)
1147 fHistBulkAll[Ptype]->Fill(TRK->Pt());
1149 fHistBulkPion[Ptype]->Fill(TRK->Pt());
1151 fHistBulkProton[Ptype]->Fill(TRK->Pt());
1163 //_______________________________________________________________________
1164 Int_t AliAnalysisTaskPIDCORR::GetTOFPID(AliAODTrack *track)
1167 Double_t nsigmaTOFkProton=999.,nsigmaTOFkKaon=999.,nsigmaTOFkPion=999.;
1169 nsigmaTOFkProton = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kProton);
1170 nsigmaTOFkKaon = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kKaon);
1171 nsigmaTOFkPion = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kPion);
1173 //cout<<nsigmaTOFkProton<<" "<<nsigmaTOFkKaon<<" "<< nsigmaTOFkPion<<endl;
1175 if(TMath::Abs(nsigmaTOFkPion)<= 2.0) return 0;
1176 if(TMath::Abs(nsigmaTOFkKaon)<= 2.0) return 1;
1177 if(TMath::Abs(nsigmaTOFkProton)<= 2.0) return 2;
1182 //_______________________________________________________________________
1183 Int_t AliAnalysisTaskPIDCORR::GetTPCTOFPID(AliAODTrack *track)
1187 Double_t nsigmaTPCkProton = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kProton);
1188 Double_t nsigmaTPCkKaon = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kKaon);
1189 Double_t nsigmaTPCkPion = fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion);
1192 Double_t nsigmaTOFkProton=999.,nsigmaTOFkKaon=999.,nsigmaTOFkPion=999.;
1194 nsigmaTOFkProton = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kProton);
1195 nsigmaTOFkKaon = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kKaon);
1196 nsigmaTOFkPion = fPIDResponse->NumberOfSigmasTOF(track, AliPID::kPion);
1200 Double_t nsigmaTPCTOFkProton=999.,nsigmaTPCTOFkKaon=999.,nsigmaTPCTOFkPion=999.;
1201 nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton));
1202 nsigmaTPCTOFkKaon = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon));
1203 nsigmaTPCTOFkPion = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion));
1205 if(TMath::Abs(nsigmaTPCTOFkPion)<= 3.0) return 0;
1206 if(TMath::Abs(nsigmaTPCTOFkKaon)<= 3.0) return 1;
1207 if(TMath::Abs(nsigmaTPCTOFkProton)<= 3.0) return 2;
1214 //________________________________________________________________________
1215 void AliAnalysisTaskPIDCORR::Terminate(Option_t *)
1217 // Draw result to screen, or perform fitting, normalizations
1218 // Called once at the end of the query
1219 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
1220 if(!fOutputList) { Printf("ERROR: could not retrieve TList fOutput"); return; }