1 /* Leading Charged Track+V0 Correlation.(Works for Real,Monte Carlo Data)
3 * University of Houston
4 * sandun.pahula.hewage@cern.ch
5 *****************************************************************************************/
13 #include <THnSparse.h>
15 #include <TDatabasePDG.h>
18 #include "AliAnalysisManager.h"
19 #include "AliAODTrack.h"
20 #include "AliAODEvent.h"
22 #include "AliAODVertex.h"
23 #include "AliAODPid.h"
24 #include "AliPIDResponse.h"
25 #include "AliEventPoolManager.h"
26 #include "AliCentrality.h"
27 #include "AliAODHandler.h"
28 #include "AliAODInputHandler.h"
29 #include "AliAODMCParticle.h"
30 #include "AliInputEventHandler.h"
31 #include "AliVParticle.h"
32 #include "AliMultiplicity.h"
33 #include "AliAODMCHeader.h"
35 #include "AliExternalTrackParam.h"
36 #include "AliAnalyseLeadingTrackUE.h"
38 #include "AliLeadingV0Correlation.h"
43 Double_t PI =TMath::Pi();
45 ClassImp(AliLeadingV0Correlation)
46 ClassImp(V0Correlationparticle)
48 //---------------------------------------------------------------------------------------
49 AliLeadingV0Correlation::AliLeadingV0Correlation()
50 : AliAnalysisTaskSE(),
82 fUseChargeHadrons(kTRUE),
86 fHistEventViceReconst(0),
100 fHistReconstSibMCAssoc(0),
101 fHistReconstMixMCAssoc(0),
104 fHistTriggerSibMC(0),
108 for(Int_t iBin = 0; iBin < 100; iBin++){
109 fZvtxBins[iBin] = 0.;
110 fCentBins[iBin] = 0.;
113 //---------------------------------------------------------------------------------------
114 AliLeadingV0Correlation::AliLeadingV0Correlation(const char *name)
115 : AliAnalysisTaskSE(name),
147 fUseChargeHadrons(kTRUE),
150 fHistEventViceGen(0),
151 fHistEventViceReconst(0),
163 fHistReconstSibMC(0),
164 fHistReconstMixMC(0),
165 fHistReconstSibMCAssoc(0),
166 fHistReconstMixMCAssoc(0),
169 fHistTriggerSibMC(0),
173 for(Int_t iBin = 0; iBin < 100; iBin++){
174 fZvtxBins[iBin] = 0.;
175 fCentBins[iBin] = 0.;
177 DefineOutput(1, TList::Class());
180 //---------------------------------------------------------------------------------------
181 AliLeadingV0Correlation::~AliLeadingV0Correlation()
183 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
187 //---------------------------------------------------------------------------------------
188 void AliLeadingV0Correlation::UserCreateOutputObjects()
190 fAnalyseUE =new AliAnalyseLeadingTrackUE();
191 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit,fUseChargeHadrons,fTrackEtaCut,fPtMin);
192 fAnalyseUE->DefineESDCuts(fFilterBit);
194 fOutputList = new TList();
195 fOutputList->SetOwner();
197 //---------------------------------------------- Events histograms -----------------------------------------------------//
198 //0-PVx,1-PVy,2-PVz,3-MULT,4-CENT
199 const Int_t ndimsEV = 5;
200 Int_t binsEV[ndimsEV] = { 100, 100, 200, 1000,100};
201 Double_t xminEV[ndimsEV] = {-0.5, -0.5,-20 , 0, 0};
202 Double_t xmaxEV[ndimsEV] = { 0.5, 0.5, 20 ,20000,100};
204 fHistEventViceGen= new THnSparseD("fHistEventViceGen", "fHistEventViceGen", ndimsEV, binsEV, xminEV, xmaxEV);
205 fOutputList->Add(fHistEventViceGen);
207 fHistEventViceReconst= new THnSparseD("fHistEventViceReconst", "fHistEventViceReconst", ndimsEV, binsEV, xminEV, xmaxEV);
208 fOutputList->Add(fHistEventViceReconst);
211 const Int_t ndimsGenMC = 4;
212 Int_t binsGenMCLA[ndimsGenMC] = {160,240, 140,100};
213 Double_t xminGenMCLA[ndimsGenMC] = { -4, 0,1.06, 0};
214 Double_t xmaxGenMCLA[ndimsGenMC] = { 4, 12, 1.2,100};
216 Int_t binsGenMCK0[ndimsGenMC] = {160,240, 200,100};
217 Double_t xminGenMCK0[ndimsGenMC] = { -4, 0, 0.4, 0};
218 Double_t xmaxGenMCK0[ndimsGenMC] = { 4, 12, 0.6,100};
220 fHistMCGenLAM = new THnSparseD("fHistMCGenLAM" , "fHistMCGenLAM" , ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
221 fOutputList->Add(fHistMCGenLAM);
223 fHistMCGenALAM = new THnSparseD("fHistMCGenALAM", "fHistMCGenALAM", ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
224 fOutputList->Add(fHistMCGenALAM);
226 fHistMCGenK0 = new THnSparseD("fHistMCGenK0" , "fHistMCGenK0" , ndimsGenMC, binsGenMCK0, xminGenMCK0, xmaxGenMCK0);
227 fOutputList->Add(fHistMCGenK0);
229 const Int_t ndims=10; //MK0 mLA MALA DCAP DCAN RV0 DVD CPA PT cent
230 Int_t bins[ndims] = { 200, 140, 140, 500, 500, 110,110, 200,240 ,100};
231 Double_t xmin[ndims] = { 0.4, 1.06, 1.06, 0, 0, 0, 0, 0.997, 0 , 0};
232 Double_t xmax[ndims] = { 0.6, 1.2, 1.2, 10, 10, 110,1.1, 1.007, 12 ,100};
235 fHistReconstK0= new THnSparseD("fHistReconstK0" , "fHistReconstK0", ndims, bins, xmin, xmax);
236 fHistReconstK0->Sumw2();
237 fOutputList->Add(fHistReconstK0);
239 fHistReconstLA= new THnSparseD("fHistReconstLA" , "fHistReconstLA", ndims, bins, xmin, xmax);
240 fHistReconstLA->Sumw2();
241 fOutputList->Add(fHistReconstLA);
243 fHistReconstALA= new THnSparseD("fHistReconstALA", "fHistReconstALA", ndims, bins, xmin, xmax);
244 fHistReconstALA->Sumw2();
245 fOutputList->Add(fHistReconstALA);
247 fHistMCAssoK0= new THnSparseD("fHistMCAssoK0" , "fHistMCAssoK0" , ndims, bins, xmin, xmax);
248 fHistMCAssoK0->Sumw2();
249 fOutputList->Add(fHistMCAssoK0);
251 fHistMCAssoLA= new THnSparseD("fHistMCAssoLA" , "fHistMCAssoLA" , ndims, bins, xmin, xmax);
252 fHistMCAssoLA->Sumw2();
253 fOutputList->Add(fHistMCAssoLA);
255 fHistMCAssoALA= new THnSparseD("fHistMCAssoALA" , "fHistMCAssoALA" , ndims, bins, xmin, xmax);
256 fHistMCAssoALA->Sumw2();
257 fOutputList->Add(fHistMCAssoALA);
259 //--------------------------------------------Correlation Histos -----------------------------------------------------//
261 //0-pTK0,1-PhiK0,2-EtaK0,3-DPhiK0,4-DEtaK0,5-TYPE,6-CutSet
262 const Int_t ndimsv0CORR = 7;
263 Int_t binsv0CORR[ndimsv0CORR] = {240, 200, 200,CorrBinsX, CorrBinsY,4,100};
265 Double_t xminv0CORR[ndimsv0CORR] = { 0, 0,-fTrackEtaCut, -PI/2,-2*fTrackEtaCut,0,0};
267 Double_t xmaxv0CORR[ndimsv0CORR] = { 12,2*PI, fTrackEtaCut, 3*PI/2, 2*fTrackEtaCut,4,100};
269 fHistReconstSib= new THnSparseD("fHistReconstSib", "fHistReconstSib", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
270 fHistReconstSib->Sumw2();
271 fOutputList->Add(fHistReconstSib);
273 fHistReconstMix= new THnSparseD("fHistReconstMix", "fHistReconstMix", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
274 fHistReconstMix->Sumw2();
275 fOutputList->Add(fHistReconstMix);
277 fHistReconstSibMC= new THnSparseD("fHistReconstSibMC", "fHistReconstSibMC", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
278 fHistReconstSibMC->Sumw2();
279 fOutputList->Add(fHistReconstSibMC);
281 fHistReconstMixMC= new THnSparseD("fHistReconstMixMC", "fHistReconstMixMC", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
282 fHistReconstMixMC->Sumw2();
283 fOutputList->Add(fHistReconstMixMC);
285 fHistReconstSibMCAssoc= new THnSparseD("fHistReconstSibMCAssoc", "fHistReconstSibMCAssoc", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
286 fHistReconstSibMCAssoc->Sumw2();
287 fOutputList->Add(fHistReconstSibMCAssoc);
289 fHistReconstMixMCAssoc= new THnSparseD("fHistReconstMixMCAssoc", "fHistReconstMixMCAssoc", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
290 fHistReconstMixMCAssoc->Sumw2();
291 fOutputList->Add(fHistReconstMixMCAssoc);
294 const Int_t triggerdims =4;
295 Int_t binsTrig[triggerdims] ={240, 200, 200,100};
296 Double_t xminTrig[triggerdims]={ 6, 0,-fTrackEtaCut, 0};
297 Double_t xmaxTrig[triggerdims]={ 12,2*PI, fTrackEtaCut,100};
299 fHistTriggerSib= new THnSparseD("fHistTriggerSib", "fHistTriggerSib", triggerdims, binsTrig, xminTrig, xmaxTrig);
300 fHistTriggerSib->Sumw2();
301 fOutputList->Add(fHistTriggerSib);
303 fHistTriggerMix= new THnSparseD("fHistTriggerMix", "fHistTriggerMix", triggerdims, binsTrig, xminTrig, xmaxTrig);
304 fHistTriggerMix->Sumw2();
305 fOutputList->Add(fHistTriggerMix);
307 fHistTriggerSibMC= new THnSparseD("fHistTriggerSibMC", "fHistTriggerSibMC", triggerdims, binsTrig, xminTrig, xmaxTrig);
308 fHistTriggerSibMC->Sumw2();
309 fOutputList->Add(fHistTriggerSibMC);
311 fHistTriggerMixMC= new THnSparseD("fHistTriggerMixMC", "fHistTriggerMixMC", triggerdims, binsTrig, xminTrig, xmaxTrig);
312 fHistTriggerMixMC->Sumw2();
313 fOutputList->Add(fHistTriggerMixMC);
315 //----------------------------------------------Event Pool-----------------------------------------------------//
316 fPoolMgr = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
317 if(!fPoolMgr) return;
319 PostData(1, fOutputList);
321 //---------------------------------------------------------------------------------------
322 void AliLeadingV0Correlation::UserExec(Option_t *)
325 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
326 AliInputEventHandler *inEvMain = (AliInputEventHandler*)(mgr->GetInputEventHandler());
327 if (!inEvMain) return;
329 // Pointers to PID Response objects.
330 fPIDResponse = inEvMain->GetPIDResponse();
331 if(!fPIDResponse) return;
333 fAODEvent = dynamic_cast<AliAODEvent*>(inEvMain->GetEvent());
334 if(!fAODEvent) return;
336 Int_t multiplicity = -1;
337 Int_t multiplicityMC = -1;
338 Double_t MultipOrCent = -1;
339 Double_t CentPecentMC = -1;
340 Double_t CentPecentAfterPhySel = -1;
342 if(fcollidingSys=="PbPb2010" || fcollidingSys=="PbPb2011"){
343 AliCentrality *centralityObjMC = fAODEvent->GetHeader()->GetCentralityP();
344 CentPecentMC = centralityObjMC->GetCentralityPercentileUnchecked("V0M");
345 if ((CentPecentMC < 0.)||(CentPecentMC > 90)) return;
348 Double_t * CentBins = fCentBins;
349 Double_t poolmin = CentBins[0];
350 Double_t poolmax = CentBins[fNCentBins];
353 Double_t dimEventviceMC[5];
354 if(fAnalysisMC) //Efficency denomenator comes before the physics selection
356 AliAODMCHeader *aodMCheader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
357 Float_t mcZv = aodMCheader->GetVtxZ();
359 if (TMath::Abs(mcZv) >= fpvzcut) return;
361 dimEventviceMC[0]=aodMCheader->GetVtxX();;
362 dimEventviceMC[1]=aodMCheader->GetVtxY();;
363 dimEventviceMC[2]=aodMCheader->GetVtxZ();;
365 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
368 TObjArray *selectedTracksLeadingMC=fAnalyseUE->FindLeadingObjects(mcArray);
369 if(!selectedTracksLeadingMC) return;
370 selectedTracksLeadingMC->SetOwner(kTRUE);
372 TObjArray * selectedV0sMC =new TObjArray;
373 selectedV0sMC->SetOwner(kTRUE);
375 Int_t nMCTracks = mcArray->GetEntriesFast();
377 if(fcollidingSys=="PbPb2010" || fcollidingSys=="PbPb2011") multiplicityMC=CentPecentMC;
378 if(fcollidingSys=="PP") multiplicityMC=nMCTracks;
380 dimEventviceMC[3]=nMCTracks;
381 dimEventviceMC[4]=CentPecentMC;
382 fHistEventViceGen->Fill(dimEventviceMC);
384 for (Int_t iMC = 0; iMC<nMCTracks; iMC++)
386 AliAODMCParticle *mcTrack = (AliAODMCParticle*)mcArray->At(iMC);
387 if (!mcTrack) continue;
388 // Charged track Generated level
389 Double_t mcTrackPt = mcTrack->Pt();
390 if ((mcTrackPt<fPtMin)||(mcTrackPt>6.0)) continue;
392 Double_t mcTrackEta = mcTrack->Eta();
393 Double_t mcTrackPhi = mcTrack->Phi();
394 Bool_t TrIsPrime = mcTrack->IsPhysicalPrimary();
395 Bool_t TrPtMin = mcTrackPt>fPtMin;
396 Bool_t TrCharge = (mcTrack->Charge())!=0;
398 if (!TrIsPrime && !TrPtMin && !TrCharge) continue; //Check Point 1
400 // V0 Generated level
401 Int_t mcPartPdg = mcTrack->GetPdgCode();
403 Double_t mcRapidity = mcTrack->Y();
404 Bool_t V0RapMax = TMath::Abs(mcRapidity)<fRapidityCut;
405 Double_t mcMass = mcTrack->M();
407 Double_t mcK0[4] = {mcRapidity,mcTrackPt,mcMass,multiplicityMC};
408 Double_t mcLa[4] = {mcRapidity,mcTrackPt,mcMass,multiplicityMC};
409 Double_t mcAl[4] = {mcRapidity,mcTrackPt,mcMass,multiplicityMC};
412 Bool_t IsK0 = mcPartPdg==310;
413 if (IsK0 && V0RapMax && TrIsPrime)
415 fHistMCGenK0->Fill(mcK0);
416 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,1));
419 Bool_t IsLambda = mcPartPdg==3122;
420 if (IsLambda && V0RapMax && TrIsPrime)
422 fHistMCGenLAM->Fill(mcLa);
423 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,2));
426 Bool_t IsAntiLambda = mcPartPdg==-3122;
427 if (IsAntiLambda && V0RapMax && TrIsPrime)
429 fHistMCGenALAM->Fill(mcAl);
430 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,3));
433 FillCorrelationSibling(multiplicityMC,selectedTracksLeadingMC,selectedV0sMC,fHistTriggerSibMC,fHistReconstSibMC);
434 FillCorrelationMixing(multiplicityMC,mcZv,poolmax,poolmin,selectedTracksLeadingMC,selectedV0sMC,fHistTriggerMixMC,fHistReconstMixMC);
438 UInt_t maskIsSelected = inEvMain->IsEventSelected();
439 Bool_t isSelected = ((maskIsSelected & AliVEvent::kMB)== AliVEvent::kMB
440 || (maskIsSelected & AliVEvent::kCentral)== AliVEvent::kCentral
441 || (maskIsSelected & AliVEvent::kSemiCentral)== AliVEvent::kSemiCentral);
442 if (!isSelected) return;
446 if(fAODEvent->IsPileupFromSPD()) return;
448 Double_t dimEventviceReal[5];
449 Double_t lPrimaryVtxPosition[3];
450 Double_t lV0Position[3];
453 if(fcollidingSys=="PbPb2010" || fcollidingSys=="PbPb2011"){ //
454 AliCentrality *centralityObj = fAODEvent->GetHeader()->GetCentralityP();
455 CentPecentAfterPhySel = centralityObj->GetCentralityPercentileUnchecked("V0M");
456 if ((CentPecentAfterPhySel < 0.)||(CentPecentAfterPhySel > 90)) return;
459 AliAODVertex *myPrimVertex = fAODEvent->GetPrimaryVertex();
460 if (!myPrimVertex) return;
461 myPrimVertex->GetXYZ(lPrimaryVtxPosition);
463 Double_t lPVx = lPrimaryVtxPosition[0];
464 Double_t lPVy = lPrimaryVtxPosition[1];
465 Double_t lPVz = lPrimaryVtxPosition[2];
467 if ((TMath::Abs(lPVz)) >= fpvzcut) return ;
468 if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return;
470 dimEventviceReal[0]=lPVx;
471 dimEventviceReal[1]=lPVy;
472 dimEventviceReal[2]=lPVz;
474 multiplicity = fAODEvent->GetNTracks();
476 dimEventviceReal[3]=multiplicity;
477 dimEventviceReal[4]=CentPecentAfterPhySel;
479 fHistEventViceReconst->Fill(dimEventviceReal);
481 if(fcollidingSys=="PP")MultipOrCent=multiplicity;
482 if(fcollidingSys=="PbPb2010" || fcollidingSys=="PbPb2011")MultipOrCent=CentPecentAfterPhySel;
484 //---------------------------------------------------------------------------------------------
486 Double_t lDcaPosToPrimVertex = 0;Double_t lDcaNegToPrimVertex = 0;Double_t lDcaV0Daughters = 0;
487 Double_t lV0cosPointAngle = 0;Double_t lV0DecayLength = 0;Double_t lV0Radius = 0;
488 Double_t lcTauLambda = 0;Double_t lcTauAntiLambda = 0;
489 Double_t lcTauK0s = 0;
491 Double_t lInvMassK0 = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
492 Double_t lPtV0s = 0; Double_t lPhiV0s = 0; Double_t lEtaV0s = 0;
493 Double_t lRapK0s = 0, lRapLambda = 0, lRapAntiLambda = 0;
494 Double_t lPzV0s = 0; Double_t lAlphaV0 = 0, lPtArmV0 = 0;
497 TObjArray *selectedTracksLeading=fAnalyseUE->FindLeadingObjects(fAODEvent);
498 if(!selectedTracksLeading) return;
499 selectedTracksLeading->SetOwner(kTRUE);
501 TObjArray * selectedV0s = new TObjArray;
502 selectedV0s->SetOwner(kTRUE);
504 TObjArray * selectedV0sAssoc = new TObjArray;
505 selectedV0sAssoc->SetOwner(kTRUE);
507 Int_t nV0s = fAODEvent->GetNumberOfV0s();
509 for (Int_t i = 0; i < nV0s; i++)
510 { // start of V0 slection loop
511 AliAODv0* aodV0 = dynamic_cast<AliAODv0 *>(fAODEvent->GetV0(i));
512 if (!aodV0) continue;
514 if (((aodV0->Pt())<fPtMin)||((aodV0->Pt())>6.0)) continue;
517 AliAODTrack *myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
518 AliAODTrack *myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
520 if (!myTrackPos || !myTrackNeg) {Printf("ERROR: Could not retreive one of the daughter track");continue;}
522 if (!IsAcseptedV0(aodV0,myTrackPos,myTrackNeg)) continue;
524 // VO's main characteristics to check the reconstruction cuts
525 lDcaV0Daughters = aodV0->DcaV0Daughters();
526 lV0cosPointAngle = aodV0->CosPointingAngle(lPrimaryVtxPosition);
528 aodV0->GetXYZ(lV0Position);
530 lV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
531 lV0DecayLength = TMath::Sqrt(TMath::Power(lV0Position[0] - lPrimaryVtxPosition[0],2) +
532 TMath::Power(lV0Position[1] - lPrimaryVtxPosition[1],2) +
533 TMath::Power(lV0Position[2] - lPrimaryVtxPosition[2],2));
535 // DCA between daughter and Primary Vertex:
536 if (myTrackPos) lDcaPosToPrimVertex = aodV0->DcaPosToPrimVertex();
537 if (myTrackNeg) lDcaNegToPrimVertex = aodV0->DcaNegToPrimVertex();
539 // Quality tracks cuts:
540 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) { continue;}
542 // Armenteros variables:
543 lAlphaV0 = aodV0->AlphaV0();
544 lPtArmV0 = aodV0->PtArmV0();
547 lInvMassK0 = aodV0->MassK0Short();
548 lInvMassLambda = aodV0->MassLambda();
549 lInvMassAntiLambda = aodV0->MassAntiLambda();
551 lPtV0s = aodV0->Pt();
552 lPhiV0s= aodV0->Phi();
553 lEtaV0s= aodV0->Eta();
554 lPzV0s = aodV0->Pz();
557 lRapK0s = aodV0->RapK0Short();
558 lRapLambda = aodV0->RapLambda();
559 lRapAntiLambda = aodV0->Y(-3122);
561 if (lPtV0s==0) {continue;}
563 Float_t nSigmaPosPion = 0.;
564 Float_t nSigmaNegPion = 0.;
565 Float_t nSigmaPosProton = 0.;
566 Float_t nSigmaNegProton = 0.;
568 const AliAODPid *pPid = myTrackPos->GetDetPid();
569 const AliAODPid *nPid = myTrackNeg->GetDetPid();
573 Double_t pdMom = pPid->GetTPCmomentum();
574 if (pdMom<1.0 && (fcollidingSys=="PbPb2010"||fcollidingSys=="PbPb2011"))
576 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
577 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
580 if (fcollidingSys=="PP")
582 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
583 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
589 Double_t ndMom = nPid->GetTPCmomentum();
590 if (ndMom<1.0 && (fcollidingSys=="PbPb2010"||fcollidingSys=="PbPb2011"))
592 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
593 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
596 if (fcollidingSys=="PP")
598 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
599 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
602 Bool_t bpPion = TMath::Abs(nSigmaPosPion) <= fSigmaPID;
603 Bool_t bpProton = TMath::Abs(nSigmaPosProton) <= fSigmaPID;
604 Bool_t bnPion = TMath::Abs(nSigmaNegPion) <= fSigmaPID;
605 Bool_t bnProton = TMath::Abs(nSigmaNegProton) <= fSigmaPID;
607 Bool_t cutK0Pid = (bpPion && bnPion) ;
608 Bool_t cutLambdaPid = (bpProton && bnPion) ;
609 Bool_t cutAntiLambdaPid = (bpPion && bnProton);
610 //--------------------------------------------------
612 lPV0s = TMath::Sqrt(lPzV0s*lPzV0s + lPtV0s*lPtV0s);
614 if(lPV0s > 0) lcTauLambda = (lV0DecayLength*lInvMassLambda)/lPV0s;
615 if(lPV0s > 0) lcTauAntiLambda = (lV0DecayLength*lInvMassAntiLambda)/lPV0s;
616 if(lPV0s > 0) lcTauK0s = (lV0DecayLength*lInvMassK0)/lPV0s;
618 Bool_t k0ctcut = (lcTauK0s < fCutCTK0);
619 Bool_t lactcut = (lcTauLambda < fCutCTLa);
620 Bool_t alactcut= (lcTauAntiLambda < fCutCTLa);
622 Bool_t k0APcut = (lPtArmV0>(TMath::Abs(0.2*lAlphaV0)));
624 Bool_t k0Rapcut = (TMath::Abs(lRapK0s) < fRapidityCut);
625 Bool_t laRapcut = (TMath::Abs(lRapLambda) < fRapidityCut);
626 Bool_t alaRapcut= (TMath::Abs(lRapAntiLambda) < fRapidityCut);
629 Bool_t k0cutset = IsAcseptedK0(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassLambda,lInvMassAntiLambda);
630 Bool_t lacutset = IsAcseptedLA(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
631 Bool_t alacutset= IsAcseptedLA(lV0Radius,lDcaNegToPrimVertex,lDcaPosToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
633 Double_t spK0[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
634 Double_t spLa[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
635 Double_t spAl[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
639 fHistReconstK0->Fill(spK0);
640 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
642 fHistReconstLA->Fill(spLa);
643 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
645 fHistReconstALA->Fill(spAl);
646 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
651 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid)
653 fHistReconstK0->Fill(spK0);
654 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
657 if (lactcut && laRapcut && lacutset && cutLambdaPid)
659 fHistReconstLA->Fill(spLa);
660 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
663 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
665 fHistReconstALA->Fill(spAl);
666 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
672 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid && k0APcut)
674 fHistReconstK0->Fill(spK0);
675 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
678 if (lactcut && laRapcut && lacutset && cutLambdaPid)
680 fHistReconstLA->Fill(spLa);
681 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
684 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
686 fHistReconstALA->Fill(spAl);
687 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
692 cout << "No case selected "<<endl;
698 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
701 Int_t myTrackPosLabel = TMath::Abs(myTrackPos->GetLabel());
702 Int_t myTrackNegLabel = TMath::Abs(myTrackNeg->GetLabel());
704 AliAODMCParticle *mcPosTrack = (AliAODMCParticle*)mcArray->At(myTrackPosLabel);
705 AliAODMCParticle *mcNegTrack = (AliAODMCParticle*)mcArray->At(myTrackNegLabel);
707 Int_t PosDaughterPdg = mcPosTrack->GetPdgCode();
708 Int_t NegDaughterPdg = mcNegTrack->GetPdgCode();
710 Int_t myTrackPosMotherLabel = mcPosTrack->GetMother();
711 Int_t myTrackNegMotherLabel = mcNegTrack->GetMother();
713 if ((myTrackPosMotherLabel==-1)||(myTrackNegMotherLabel==-1)) continue;
714 if (myTrackPosMotherLabel!=myTrackNegMotherLabel) continue;
716 AliAODMCParticle *mcPosMother = (AliAODMCParticle*)mcArray->At(myTrackPosMotherLabel);
717 Int_t MotherPdg = mcPosMother->GetPdgCode();
718 Bool_t IsPrime = mcPosMother->IsPhysicalPrimary();
720 Double_t rcK0[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
721 Double_t rcLa[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
722 Double_t rcAl[10] = {lInvMassK0, lInvMassLambda,lInvMassAntiLambda,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lV0Radius,lDcaV0Daughters,lV0cosPointAngle,lPtV0s,MultipOrCent};
726 fHistMCAssoK0->Fill(rcK0);
727 if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
729 fHistMCAssoLA->Fill(rcLa);
730 if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
732 fHistMCAssoALA->Fill(rcAl);
733 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
738 if ((k0ctcut && k0Rapcut && k0cutset)&&(MotherPdg == 310 &&
739 PosDaughterPdg== 211 &&
740 NegDaughterPdg== -211 &&
743 fHistMCAssoK0->Fill(rcK0);
744 if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
747 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
748 PosDaughterPdg== 2212 &&
749 NegDaughterPdg== -211 &&
752 fHistMCAssoLA->Fill(rcLa);
753 if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
756 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
757 PosDaughterPdg== 211 &&
758 NegDaughterPdg== -2212 &&
761 fHistMCAssoALA->Fill(rcAl);
762 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
768 if ((k0ctcut && k0Rapcut && k0cutset && k0APcut)&&(MotherPdg == 310 &&
769 PosDaughterPdg== 211 &&
770 NegDaughterPdg== -211 &&
773 fHistMCAssoK0->Fill(rcK0);
774 if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
777 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
778 PosDaughterPdg== 2212 &&
779 NegDaughterPdg== -211 &&
782 fHistMCAssoLA->Fill(rcLa);
783 if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
786 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
787 PosDaughterPdg== 211 &&
788 NegDaughterPdg== -2212 &&
791 fHistMCAssoALA->Fill(rcAl);
792 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
797 cout << "No case selected "<<endl;
803 FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0s,fHistTriggerSib,fHistReconstSib);
804 FillCorrelationMixing(MultipOrCent,lPVz,poolmax,poolmin,selectedTracksLeading,selectedV0s,fHistTriggerMix,fHistReconstMix);
806 FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0sAssoc,0,fHistReconstSibMCAssoc);
807 FillCorrelationMixing(MultipOrCent,lPVz,poolmax,poolmin,selectedTracksLeading,selectedV0sAssoc,0,fHistReconstMixMCAssoc);
809 PostData(1,fOutputList);
811 //---------------------------------------------------------------------------------------
812 void AliLeadingV0Correlation::Terminate(Option_t *)
814 //No need in the grid
816 //---------------------------------------------------------------------------------------
817 Bool_t AliLeadingV0Correlation::IsAcseptedDaughterTrack(const AliAODTrack *itrack)
819 if(TMath::Abs(itrack->Eta())>fTrackEtaCut)return kFALSE;
821 if (!itrack->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
823 Float_t nCrossedRowsTPC = itrack->GetTPCClusterInfo(2,1);
824 if (nCrossedRowsTPC < 70) return kFALSE;
826 Int_t findable=itrack->GetTPCNclsF();
827 if (findable <= 0) return kFALSE;
829 if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
832 //---------------------------------------------------------------------------------------
833 Bool_t AliLeadingV0Correlation::IsAcseptedV0(const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg)
835 if (!aodV0) return kFALSE;
837 // Offline reconstructed V0 only
838 if (aodV0->GetOnFlyStatus()) return kFALSE;
840 // Get daughters and check them
841 myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
842 myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
844 if (!myTrackPos||!myTrackNeg) return kFALSE;
845 // Unlike signs of daughters
846 if (myTrackPos->Charge() == myTrackNeg->Charge()) return kFALSE;
848 // Track cuts for daughers
849 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) return kFALSE;
851 // Minimum pt of daughters
852 Double_t lPtPos = myTrackPos->Pt();
853 Double_t lPtNeg = myTrackNeg->Pt();
855 if (lPtPos<fPtMin || lPtNeg<fPtMin) return kFALSE;
859 //---------------------------------------------------------------------------------------
860 Bool_t AliLeadingV0Correlation::IsAcseptedK0(Double_t v0rad,
868 if(v0rad >=fV0radius &&
869 dcaptp >=fV0PostoPVz &&
870 dcantp >=fV0NegtoPVz &&
871 dcav0d <=fDCAV0Daughters &&
873 TMath::Abs(massLa - 1.115683) > fRejectLamK0 &&
874 TMath::Abs(massALa - 1.115683) > fRejectLamK0 )return kTRUE;
877 //---------------------------------------------------------------------------------------
878 Bool_t AliLeadingV0Correlation::IsAcseptedLA(Double_t v0rad,
885 if(v0rad >=fV0radius &&
886 dcaptp >=fV0PostoPVz &&
887 dcantp >=fV0NegtoPVz &&
888 dcav0d <=fDCAV0Daughters &&
890 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam &&
891 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam )return kTRUE;
894 //---------------------------------------------------------------------------------------
895 Bool_t AliLeadingV0Correlation::IsK0InvMass(const Double_t mass) const
897 const Float_t massK0 = 0.497;
899 return ((massK0-fMassCutK0)<=mass && mass<=(massK0 + fMassCutK0))?1:0;
901 //---------------------------------------------------------------------------------------
902 Bool_t AliLeadingV0Correlation::IsLambdaInvMass(const Double_t mass) const
904 const Float_t massLambda = 1.116;
906 return ((massLambda-fMassCutLa)<=mass && mass<=(massLambda + fMassCutLa))?1:0;
908 //---------------------------------------------------------------------------------------
909 Double_t AliLeadingV0Correlation::RangePhi(Double_t DPhi)
911 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
912 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
915 //---------------------------------------------------------------------------------------
916 Bool_t AliLeadingV0Correlation::IsTrackFromV0(AliAODTrack* track)
918 Int_t atrID = track->GetID();
920 for(int i=0; i<fAODEvent->GetNumberOfV0s(); i++){ // loop over V0s
921 AliAODv0* aodV0 = fAODEvent->GetV0(i);
923 AliAODTrack *trackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
924 AliAODTrack *trackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
926 if ( !(IsAcseptedDaughterTrack(trackPos)) || !(IsAcseptedDaughterTrack(trackNeg)) ) continue;
927 //----------------------------------
928 Int_t negID = trackNeg->GetID();
929 Int_t posID = trackPos->GetID();
931 if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
932 if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
933 //----------------------------------
937 //---------------------------------------------------------------------------------------
938 void AliLeadingV0Correlation::FillCorrelationSibling(Double_t MultipOrCent,
939 TObjArray*triggerArray,
940 TObjArray*selectedV0Array,
941 THnSparse*triggerHist,
942 THnSparse*associateHist)
944 Double_t binsv0CORR[7];
945 Double_t binsTrigSib[4];
946 Int_t counterSibMCA=0;
948 for(Int_t i=0;i<triggerArray->GetEntriesFast();i++)
950 AliAODTrack* trigger = (AliAODTrack*)triggerArray->At(0);
951 if(!trigger)continue;
954 if(IsTrackFromV0(trigger))continue;
956 Double_t triggerPt = trigger->Pt();
957 Double_t triggerPhi = trigger->Phi();
958 Double_t triggerEta = trigger->Eta();
960 if(triggerPt<6.0||triggerPt>12.0)continue;
962 if(counterSibMCA==triggerArray->GetEntriesFast()){
964 binsTrigSib[0]=triggerPt;
965 binsTrigSib[1]=triggerPhi;
966 binsTrigSib[2]=triggerEta;
967 binsTrigSib[3]=MultipOrCent;
969 if(triggerHist)triggerHist->Fill(binsTrigSib);
971 for (Int_t j=0; j<selectedV0Array->GetEntriesFast(); j++){
973 V0Correlationparticle* associate = (V0Correlationparticle*) selectedV0Array->At(j);
974 if(!associate)continue;
976 binsv0CORR[0]= associate->Pt();
977 binsv0CORR[1]= associate->Phi();
978 binsv0CORR[2]= associate->Eta();
980 if(binsv0CORR[0]>triggerPt) continue;
982 binsv0CORR[3]=RangePhi(triggerPhi-binsv0CORR[1]);
983 binsv0CORR[4]=triggerEta-binsv0CORR[2];
984 binsv0CORR[5]= associate->WhichCandidate();
985 binsv0CORR[6]= MultipOrCent;
987 associateHist->Fill(binsv0CORR);
992 //---------------------------------------------------------------------------------------
993 void AliLeadingV0Correlation::FillCorrelationMixing(Double_t MultipOrCentMix,
997 TObjArray*triggerArray,
998 TObjArray*selectedV0Array,
999 THnSparse*triggerHist,
1000 THnSparse*associateHist)
1002 if(TMath::Abs(pvxMix)>=fpvzcut || MultipOrCentMix>poolmax || MultipOrCentMix < poolmin)
1004 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1005 if(fcollidingSys=="PbPb2010" || fcollidingSys=="PbPb2011") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1009 Double_t binsv0CORRMix[7];
1010 Double_t binsTrigMix[4];
1011 Double_t counterMix=0;
1013 AliEventPool* pool = fPoolMgr->GetEventPool(MultipOrCentMix, pvxMix);
1014 if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", MultipOrCentMix, pvxMix));
1016 if (pool->IsReady() || pool->NTracksInPool() > fPoolMinNTracks || pool->GetCurrentNEvents() > fMinEventsToMix)
1018 Int_t nMix = pool->GetCurrentNEvents();
1019 for (Int_t jMix=0; jMix<nMix; jMix++){
1021 TObjArray* mixEvents = pool->GetEvent(jMix);
1022 for (Int_t i=0; i<triggerArray->GetEntriesFast(); i++){
1024 AliAODTrack* trig = (AliAODTrack*)triggerArray->At(0);
1028 if(IsTrackFromV0(trig))continue;
1030 Double_t trigPhi = trig->Phi();
1031 Double_t trigEta = trig->Eta();
1032 Double_t trigPt = trig->Pt();
1034 if(trigPt<6.0||trigPt>12.0)continue;
1037 if(counterMix==triggerArray->GetEntriesFast()){
1039 binsTrigMix[0]=trigPt;
1040 binsTrigMix[1]=trigPhi;
1041 binsTrigMix[2]=trigEta;
1042 binsTrigMix[3]=MultipOrCentMix;
1044 if(triggerHist)triggerHist->Fill(binsTrigMix);
1046 for (Int_t j=0; j<mixEvents->GetEntriesFast(); j++){
1048 V0Correlationparticle* associate = (V0Correlationparticle*) mixEvents->At(j);
1049 if(!associate)continue;
1051 binsv0CORRMix[0]= associate->Pt();
1052 binsv0CORRMix[1]= associate->Phi();
1053 binsv0CORRMix[2]= associate->Eta();
1055 if(binsv0CORRMix[0]>trigPt) continue;
1057 binsv0CORRMix[3]=RangePhi(trigPhi-binsv0CORRMix[1]);
1058 binsv0CORRMix[4]=trigEta-binsv0CORRMix[2];
1059 binsv0CORRMix[5]=associate->WhichCandidate();
1060 binsv0CORRMix[6]=MultipOrCentMix;
1062 associateHist->Fill(binsv0CORRMix);
1069 TObjArray* tracksClone = new TObjArray;
1070 tracksClone->SetOwner(kTRUE);
1072 for (Int_t i=0; i<selectedV0Array->GetEntriesFast(); i++)
1074 V0Correlationparticle* particle = (V0Correlationparticle*) selectedV0Array->At(i);
1075 tracksClone->Add(new V0Correlationparticle(particle->Eta(),
1078 particle->WhichCandidate()));
1080 pool->UpdatePool(tracksClone);
1082 //---------------------------------------------------------------------------------------