1 /* Leading Charged Track+V0 Correlation.(Works for Real,Monte Carlo Data)
3 * University of Houston
4 * sandun.pahula.hewage@cern.ch
5 *****************************************************************************************/
14 #include <THnSparse.h>
16 #include <TDatabasePDG.h>
19 #include "AliAnalysisManager.h"
20 #include "AliAODTrack.h"
21 #include "AliAODEvent.h"
23 #include "AliAODVertex.h"
24 #include "AliAODPid.h"
25 #include "AliPIDResponse.h"
26 #include "AliEventPoolManager.h"
27 #include "AliCentrality.h"
28 #include "AliAODHandler.h"
29 #include "AliAODInputHandler.h"
30 #include "AliAODMCParticle.h"
31 #include "AliInputEventHandler.h"
32 #include "AliVParticle.h"
33 #include "AliMultiplicity.h"
34 #include "AliAODMCHeader.h"
36 #include "AliExternalTrackParam.h"
37 #include "AliAnalyseLeadingTrackUE.h"
39 #include "AliLeadingV0Correlation.h"
45 Double_t PI =TMath::Pi();
47 ClassImp(AliLeadingV0Correlation)
48 ClassImp(V0Correlationparticle)
50 //---------------------------------------------------------------------------------------
51 AliLeadingV0Correlation::AliLeadingV0Correlation()
52 : AliAnalysisTaskSE(),
85 fUseChargeHadrons (kTRUE),
88 fHist_Mult_B4_Trg_Sel (0),
89 fHist_Mult_Af_Trg_Sel (0),
90 fHist_Mult_PVz_Cut (0),
91 fHist_Mult_SPD_PVz (0),
92 fHist_Mult_SPD_PVz_Pileup (0),
99 fHistEventViceGen (0),
100 fHistEventViceReconst (0),
116 for(Int_t iBin = 0; iBin < 100; iBin++){
117 fZvtxBins[iBin] = 0.;
118 fCentBins[iBin] = 0.;
121 //---------------------------------------------------------------------------------------
122 AliLeadingV0Correlation::AliLeadingV0Correlation(const char *name)
123 : AliAnalysisTaskSE(name),
156 fUseChargeHadrons (kTRUE),
159 fHist_Mult_B4_Trg_Sel (0),
160 fHist_Mult_Af_Trg_Sel (0),
161 fHist_Mult_PVz_Cut (0),
162 fHist_Mult_SPD_PVz (0),
163 fHist_Mult_SPD_PVz_Pileup (0),
167 fHistPVxAnalysis (0),
168 fHistPVyAnalysis (0),
169 fHistPVzAnalysis (0),
170 fHistEventViceGen (0),
171 fHistEventViceReconst (0),
187 for(Int_t iBin = 0; iBin < 100; iBin++){
188 fZvtxBins[iBin] = 0.;
189 fCentBins[iBin] = 0.;
191 DefineOutput(1, TList::Class());
194 //---------------------------------------------------------------------------------------
195 AliLeadingV0Correlation::~AliLeadingV0Correlation()
197 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
201 //---------------------------------------------------------------------------------------
202 void AliLeadingV0Correlation::UserCreateOutputObjects()
204 fAnalyseUE =new AliAnalyseLeadingTrackUE();
207 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit,fUseChargeHadrons,fTrackEtaCut,fPtMin);
208 fAnalyseUE->DefineESDCuts(fFilterBit);
211 fOutputList = new TList();
212 fOutputList->SetOwner();
214 fHist_Mult_B4_Trg_Sel = new TH1F("fHist_Mult_B4_Trg_Sel","Tracks per event;Nbr of Tracks;Events", 1000, 0, 10000);
215 fOutputList->Add(fHist_Mult_B4_Trg_Sel);
217 fHist_Mult_Af_Trg_Sel = new TH1F("fHist_Mult_Af_Trg_Sel","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
218 fOutputList->Add(fHist_Mult_Af_Trg_Sel);
220 fHist_Mult_PVz_Cut = new TH1F("fHist_Mult_PVz_Cut","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
221 fOutputList->Add(fHist_Mult_PVz_Cut);
223 fHist_Mult_SPD_PVz = new TH1F("fHist_Mult_SPD_PVz","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
224 fOutputList->Add(fHist_Mult_SPD_PVz);
226 fHist_Mult_SPD_PVz_Pileup = new TH1F("fHist_Mult_SPD_PVz_Pileup","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
227 fOutputList->Add(fHist_Mult_SPD_PVz_Pileup);
229 fHistPVx = new TH1F("fHistPVx","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);
230 fOutputList->Add(fHistPVx);
232 fHistPVy = new TH1F("fHistPVy","PV y position;Nbr of Evts;y",200, -0.5, 0.5);
233 fOutputList->Add(fHistPVy);
235 fHistPVz = new TH1F("fHistPVz","PV z position;Nbr of Evts;z",400, -20, 20);
236 fOutputList->Add(fHistPVz);
238 fHistPVxAnalysis = new TH1F("fHistPVxAnalysis","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);
239 fOutputList->Add(fHistPVxAnalysis);
241 fHistPVyAnalysis = new TH1F("fHistPVyAnalysis","PV y position;Nbr of Evts;y",200, -0.5, 0.5);
242 fOutputList->Add(fHistPVyAnalysis);
244 fHistPVzAnalysis = new TH1F("fHistPVzAnalysis","PV z position;Nbr of Evts;z",400, -20, 20);
245 fOutputList->Add(fHistPVzAnalysis);
247 //---------------------------------------------- Events histograms -----------------------------------------------------//
248 //0-PVx,1-PVy,2-PVz,3-MULT,4-CENT
249 const Int_t ndimsEV = 3;
250 Int_t binsEV[ndimsEV] = { 200, 100,100};
251 Double_t xminEV[ndimsEV] = {-20 , 0, 0};
252 Double_t xmaxEV[ndimsEV] = { 20 , 300,100};
254 fHistEventViceGen= new THnSparseD("fHistEventViceGen", "fHistEventViceGen", ndimsEV, binsEV, xminEV, xmaxEV);
255 fOutputList->Add(fHistEventViceGen);
257 fHistEventViceReconst= new THnSparseD("fHistEventViceReconst", "fHistEventViceReconst", ndimsEV, binsEV, xminEV, xmaxEV);
258 fOutputList->Add(fHistEventViceReconst);
261 const Int_t ndimsGenMC = 3;
262 Int_t binsGenMCLA[ndimsGenMC] = {120, 140,100};
263 Double_t xminGenMCLA[ndimsGenMC] = { 0,1.06, 0};
264 Double_t xmaxGenMCLA[ndimsGenMC] = { 6, 1.2,100};
266 Int_t binsGenMCK0[ndimsGenMC] = {120, 200,100};
267 Double_t xminGenMCK0[ndimsGenMC] = { 0, 0.4, 0};
268 Double_t xmaxGenMCK0[ndimsGenMC] = { 6, 0.6,100};
270 fHistMCGenLAM = new THnSparseD("fHistMCGenLAM" , "fHistMCGenLAM" , ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
271 fOutputList->Add(fHistMCGenLAM);
273 fHistMCGenALAM = new THnSparseD("fHistMCGenALAM", "fHistMCGenALAM", ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
274 fOutputList->Add(fHistMCGenALAM);
276 fHistMCGenK0 = new THnSparseD("fHistMCGenK0" , "fHistMCGenK0" , ndimsGenMC, binsGenMCK0, xminGenMCK0, xmaxGenMCK0);
277 fOutputList->Add(fHistMCGenK0);
279 const Int_t ndims=3; //MK0 mLA MALA PT cent
280 Int_t binsK0[ndims] = { 200, 120 ,100};
281 Double_t xminK0[ndims] = { 0.4, 0 , 0};
282 Double_t xmaxK0[ndims] = { 0.6, 6 ,100};
284 Int_t binsLA[ndims] = { 140, 120 ,100};
285 Double_t xminLA[ndims] = { 1.06, 0 , 0};
286 Double_t xmaxLA[ndims] = { 1.2, 6 ,100};
289 fHistReconstK0= new THnSparseD("fHistReconstK0" , "fHistReconstK0", ndims, binsK0, xminK0, xmaxK0);
290 fHistReconstK0->Sumw2();
291 fOutputList->Add(fHistReconstK0);
293 fHistReconstLA= new THnSparseD("fHistReconstLA" , "fHistReconstLA", ndims, binsLA, xminLA, xmaxLA);
294 fHistReconstLA->Sumw2();
295 fOutputList->Add(fHistReconstLA);
297 fHistReconstALA= new THnSparseD("fHistReconstALA", "fHistReconstALA", ndims, binsLA, xminLA, xmaxLA);
298 fHistReconstALA->Sumw2();
299 fOutputList->Add(fHistReconstALA);
301 fHistMCAssoK0= new THnSparseD("fHistMCAssoK0" , "fHistMCAssoK0" , ndims, binsK0, xminK0, xmaxK0);
302 fHistMCAssoK0->Sumw2();
303 fOutputList->Add(fHistMCAssoK0);
305 fHistMCAssoLA= new THnSparseD("fHistMCAssoLA" , "fHistMCAssoLA" , ndims, binsLA, xminLA, xmaxLA);
306 fHistMCAssoLA->Sumw2();
307 fOutputList->Add(fHistMCAssoLA);
309 fHistMCAssoALA= new THnSparseD("fHistMCAssoALA" , "fHistMCAssoALA" , ndims, binsLA, xminLA, xmaxLA);
310 fHistMCAssoALA->Sumw2();
311 fOutputList->Add(fHistMCAssoALA);
313 //--------------------------------------------Correlation Histos -----------------------------------------------------//
315 //0-pTK0,1-PhiK0,2-EtaK0,3-DPhiK0,4-DEtaK0,5-TYPE,6-CutSet
316 const Int_t ndimsv0CORR = 7;
317 Int_t binsv0CORR[ndimsv0CORR] = {120, 200, 200,CorrBinsX, CorrBinsY,4,100};
319 Double_t xminv0CORR[ndimsv0CORR] = { 0, 0,-fTrackEtaCut, -PI/2,-2*fTrackEtaCut,0,0};
321 Double_t xmaxv0CORR[ndimsv0CORR] = { 6,2*PI, fTrackEtaCut, 3*PI/2, 2*fTrackEtaCut,4,100};
323 fHistReconstSib= new THnSparseD("fHistReconstSib", "fHistReconstSib", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
324 fHistReconstSib->Sumw2();
325 fOutputList->Add(fHistReconstSib);
327 fHistReconstMix= new THnSparseD("fHistReconstMix", "fHistReconstMix", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
328 fHistReconstMix->Sumw2();
329 fOutputList->Add(fHistReconstMix);
332 const Int_t triggerdims =2;
333 Int_t binsTrig[triggerdims] ={ 100, 100};
334 Double_t xminTrig[triggerdims]={ fTriglow, 0};
335 Double_t xmaxTrig[triggerdims]={ fTrighigh, 100};
337 fHistTriggerSib= new THnSparseD("fHistTriggerSib", "fHistTriggerSib", triggerdims, binsTrig, xminTrig, xmaxTrig);
338 fHistTriggerSib->Sumw2();
339 fOutputList->Add(fHistTriggerSib);
341 fHistTriggerMix= new THnSparseD("fHistTriggerMix", "fHistTriggerMix", triggerdims, binsTrig, xminTrig, xmaxTrig);
342 fHistTriggerMix->Sumw2();
343 fOutputList->Add(fHistTriggerMix);
346 //----------------------------------------------Event Pool-----------------------------------------------------//
347 fPoolMgr = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
348 if(!fPoolMgr) return;
350 PostData(1, fOutputList);
352 //---------------------------------------------------------------------------------------
353 void AliLeadingV0Correlation::UserExec(Option_t *)
356 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
357 AliInputEventHandler *inEvMain = (AliInputEventHandler*)(mgr->GetInputEventHandler());
358 if (!inEvMain) return;
360 // Pointers to PID Response objects.
361 fPIDResponse = inEvMain->GetPIDResponse();
362 if(!fPIDResponse) return;
364 fAODEvent = dynamic_cast<AliAODEvent*>(inEvMain->GetEvent());
365 if(!fAODEvent) return;
367 Int_t multiplicity = -1;
368 Int_t multiplicityMC = -1;
369 Double_t MultipOrCent = -1;
370 Double_t CentPecentMC = -1;
371 Double_t CentPecentAfterPhySel = -1;
372 Int_t nTrackMultiplicity = -1;
373 Float_t lPrimaryTrackMultiplicity = 0;
375 nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
376 for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
377 AliAODTrack* track = fAODEvent->GetTrack(itrack);
378 if(!fAnalysisMC) if (track->TestFilterBit(fFilterBit)) lPrimaryTrackMultiplicity++;
379 lPrimaryTrackMultiplicity++;
382 fHist_Mult_B4_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
384 if(fcollidingSys=="PbPb"){
385 AliCentrality *centralityObjMC = fAODEvent->GetHeader()->GetCentralityP();
386 CentPecentMC = centralityObjMC->GetCentralityPercentileUnchecked("V0M");
387 if ((CentPecentMC < 0.)||(CentPecentMC > 90)) return;
390 Double_t * CentBins = fCentBins;
391 Double_t poolmin = CentBins[0];
392 Double_t poolmax = CentBins[fNCentBins];
394 //----------------------------------------------------------
395 // Efficency denomenator comes before the physics selection
396 //----------------------------------------------------------
398 Double_t dimEventviceMC[3];
399 if(fAnalysisMC) //Efficency denomenator comes before the physics selection
401 AliAODMCHeader *aodMCheader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
402 Float_t mcZv = aodMCheader->GetVtxZ();
404 if (TMath::Abs(mcZv) >= fpvzcut) return;
406 dimEventviceMC[0]=aodMCheader->GetVtxZ();
408 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
411 Int_t nMCTracks = mcArray->GetEntriesFast();
413 if(fcollidingSys=="PbPb") multiplicityMC=CentPecentMC;
414 if(fcollidingSys=="PP") multiplicityMC=nMCTracks;
416 dimEventviceMC[1]=nMCTracks;
417 dimEventviceMC[2]=CentPecentMC;
418 fHistEventViceGen->Fill(dimEventviceMC);
420 for (Int_t iMC = 0; iMC<nMCTracks; iMC++)
422 AliAODMCParticle *mcTrack = (AliAODMCParticle*)mcArray->At(iMC);
423 if (!mcTrack) continue;
424 // Charged track Generated level
425 Double_t mcTrackPt = mcTrack->Pt();
426 if ((mcTrackPt<fPtMin)||(mcTrackPt>6.0)) continue;
428 //Double_t mcTrackEta = mcTrack->Eta();
429 //Double_t mcTrackPhi = mcTrack->Phi();
430 Bool_t TrIsPrime = mcTrack->IsPhysicalPrimary();
431 Bool_t TrPtMin = mcTrackPt>fPtMin;
432 Bool_t TrCharge = (mcTrack->Charge())!=0;
434 if (!TrIsPrime && !TrPtMin && !TrCharge) continue; //Check Point 1
436 // V0 Generated level
437 Int_t mcPartPdg = mcTrack->GetPdgCode();
439 Double_t mcRapidity = mcTrack->Y();
440 Bool_t V0RapMax = TMath::Abs(mcRapidity)<fRapidityCut;
441 Double_t mcMass = mcTrack->M();
443 Double_t mcK0[3] = {mcTrackPt,mcMass,multiplicityMC};
444 Double_t mcLa[3] = {mcTrackPt,mcMass,multiplicityMC};
445 Double_t mcAl[3] = {mcTrackPt,mcMass,multiplicityMC};
448 Bool_t IsK0 = mcPartPdg==310;
449 if (IsK0 && V0RapMax && TrIsPrime)
451 fHistMCGenK0->Fill(mcK0);
454 Bool_t IsLambda = mcPartPdg==3122;
455 if (IsLambda && V0RapMax && TrIsPrime)
457 fHistMCGenLAM->Fill(mcLa);
460 Bool_t IsAntiLambda = mcPartPdg==-3122;
461 if (IsAntiLambda && V0RapMax && TrIsPrime)
463 fHistMCGenALAM->Fill(mcAl);
468 // End Loop over MC condition
470 //------------------------------------------------
472 //------------------------------------------------
473 UInt_t maskIsSelected = inEvMain->IsEventSelected();
474 Bool_t isSelected = ((maskIsSelected & AliVEvent::kMB)== AliVEvent::kMB
475 || (maskIsSelected & AliVEvent::kCentral)== AliVEvent::kCentral
476 || (maskIsSelected & AliVEvent::kSemiCentral)== AliVEvent::kSemiCentral);
477 if (!isSelected) return;
479 //------------------------------------------------
480 // After Trigger Selection
481 //------------------------------------------------
483 fHist_Mult_Af_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
485 //------------------------------------------------
486 // Getting: Primary Vertex + MagField Info
487 //------------------------------------------------
488 Double_t dimEventviceReal[3];
489 Double_t lBestPrimaryVtxPos[3];
490 Double_t tPrimaryVtxPosition[3];
491 Double_t lV0Position[3];
494 if(fcollidingSys=="PbPb"){ //
495 AliCentrality *centralityObj = fAODEvent->GetHeader()->GetCentralityP();
496 CentPecentAfterPhySel = centralityObj->GetCentralityPercentileUnchecked("V0M");
497 if ((CentPecentAfterPhySel < 0.)||(CentPecentAfterPhySel > 90)) return;
500 AliAODVertex *lPrimaryBestAODVtx = fAODEvent->GetPrimaryVertex();
501 if (!lPrimaryBestAODVtx) return;
502 // get the best primary vertex available for the event
503 // As done in AliCascadeVertexer, we keep the one which is the best one available.
504 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
505 // This one will be used for next calculations (DCA essentially)
506 lPrimaryBestAODVtx->GetXYZ(lBestPrimaryVtxPos);
508 const AliVVertex *primaryVtx = fAODEvent->GetPrimaryVertex();
509 tPrimaryVtxPosition[0] = primaryVtx->GetX();
510 tPrimaryVtxPosition[1] = primaryVtx->GetY();
511 tPrimaryVtxPosition[2] = primaryVtx->GetZ();
512 fHistPVx->Fill( tPrimaryVtxPosition[0] );
513 fHistPVy->Fill( tPrimaryVtxPosition[1] );
514 fHistPVz->Fill( tPrimaryVtxPosition[2] );
516 //------------------------------------------------
517 // Primary Vertex Z position: SKIP
518 //------------------------------------------------
520 Double_t lPVx = lBestPrimaryVtxPos[0];
521 Double_t lPVy = lBestPrimaryVtxPos[1];
522 Double_t lPVz = lBestPrimaryVtxPos[2];
524 if ((TMath::Abs(lPVz)) >= fpvzcut) return ;
525 if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return;
526 fHist_Mult_PVz_Cut->Fill(lPrimaryTrackMultiplicity);
528 //------------------------------------------------
529 // Only look at events with well-established PV
530 //------------------------------------------------
532 const AliAODVertex *lPrimaryTrackingAODVtxCheck = fAODEvent->GetPrimaryVertex();
533 const AliAODVertex *lPrimarySPDVtx = fAODEvent->GetPrimaryVertexSPD();
534 if (!lPrimarySPDVtx && !lPrimaryTrackingAODVtxCheck )return;
536 fHist_Mult_SPD_PVz->Fill(lPrimaryTrackMultiplicity);
539 //------------------------------------------------
541 //------------------------------------------------
543 // FIXME : quality selection regarding pile-up rejection
544 if(fAODEvent->IsPileupFromSPD()) return;
545 fHist_Mult_SPD_PVz_Pileup->Fill(lPrimaryTrackMultiplicity);
547 fHistPVxAnalysis->Fill(tPrimaryVtxPosition[0]);
548 fHistPVyAnalysis->Fill(tPrimaryVtxPosition[1]);
549 fHistPVzAnalysis->Fill(tPrimaryVtxPosition[2]);
551 dimEventviceReal[0]=tPrimaryVtxPosition[2];
552 multiplicity = fAODEvent->GetNTracks();
554 dimEventviceReal[1]=multiplicity;
555 dimEventviceReal[2]=CentPecentAfterPhySel;
557 fHistEventViceReconst->Fill(dimEventviceReal);
559 if(fcollidingSys=="PP")MultipOrCent=multiplicity;
560 if(fcollidingSys=="PbPb")MultipOrCent=CentPecentAfterPhySel;
562 //---------------------------------------------------------------------------------------------
564 Double_t lDcaPosToPrimVertex = 0;Double_t lDcaNegToPrimVertex = 0;Double_t lDcaV0Daughters = 0;
565 Double_t lV0cosPointAngle = 0;Double_t lV0DecayLength = 0;Double_t lV0Radius = 0;
566 Double_t lcTauLambda = 0;Double_t lcTauAntiLambda = 0;
567 Double_t lcTauK0s = 0;
569 Double_t lInvMassK0 = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
570 Double_t lPtV0s = 0; Double_t lPhiV0s = 0; Double_t lEtaV0s = 0;
571 Double_t lRapK0s = 0, lRapLambda = 0, lRapAntiLambda = 0;
572 Double_t lPzV0s = 0; Double_t lAlphaV0 = 0, lPtArmV0 = 0;
575 TObjArray *selectedTracksLeading=0;
576 selectedTracksLeading=fAnalyseUE->FindLeadingObjects(fAODEvent);
577 if(!selectedTracksLeading) return;
578 selectedTracksLeading->SetOwner(kTRUE);
580 TObjArray * selectedV0s = new TObjArray;
581 selectedV0s->SetOwner(kTRUE);
583 Int_t nV0s = fAODEvent->GetNumberOfV0s();
585 for (Int_t i = 0; i < nV0s; i++)
586 { // start of V0 slection loop
587 AliAODv0* aodV0 = dynamic_cast<AliAODv0 *>(fAODEvent->GetV0(i));
588 if (!aodV0) continue;
590 if (((aodV0->Pt())<fPtMin)||((aodV0->Pt())>6.0)) continue;
593 AliAODTrack *myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
594 AliAODTrack *myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
596 if (!myTrackPos || !myTrackNeg) {Printf("ERROR: Could not retreive one of the daughter track");continue;}
598 if (!IsAcseptedV0(aodV0,myTrackPos,myTrackNeg)) continue;
600 // VO's main characteristics to check the reconstruction cuts
601 lDcaV0Daughters = aodV0->DcaV0Daughters();
602 lV0cosPointAngle = aodV0->CosPointingAngle(lBestPrimaryVtxPos);
604 aodV0->GetXYZ(lV0Position);
606 lV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
607 lV0DecayLength = TMath::Sqrt(TMath::Power(lV0Position[0] - tPrimaryVtxPosition[0],2) +
608 TMath::Power(lV0Position[1] - tPrimaryVtxPosition[1],2) +
609 TMath::Power(lV0Position[2] - tPrimaryVtxPosition[2],2));
611 // DCA between daughter and Primary Vertex:
612 if (myTrackPos) lDcaPosToPrimVertex = aodV0->DcaPosToPrimVertex();
613 if (myTrackNeg) lDcaNegToPrimVertex = aodV0->DcaNegToPrimVertex();
615 // Quality tracks cuts:
616 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) { continue;}
618 // Armenteros variables:
619 lAlphaV0 = aodV0->AlphaV0();
620 lPtArmV0 = aodV0->PtArmV0();
623 lInvMassK0 = aodV0->MassK0Short();
624 lInvMassLambda = aodV0->MassLambda();
625 lInvMassAntiLambda = aodV0->MassAntiLambda();
627 lPtV0s = aodV0->Pt();
628 lPhiV0s= aodV0->Phi();
629 lEtaV0s= aodV0->Eta();
630 lPzV0s = aodV0->Pz();
633 lRapK0s = aodV0->RapK0Short();
634 lRapLambda = aodV0->RapLambda();
635 lRapAntiLambda = aodV0->Y(-3122);
637 if (lPtV0s==0) {continue;}
639 Float_t nSigmaPosPion = 0.;
640 Float_t nSigmaNegPion = 0.;
641 Float_t nSigmaPosProton = 0.;
642 Float_t nSigmaNegProton = 0.;
644 const AliAODPid *pPid = myTrackPos->GetDetPid();
645 const AliAODPid *nPid = myTrackNeg->GetDetPid();
649 Double_t pdMom = pPid->GetTPCmomentum();
650 if (pdMom<1.0 && (fcollidingSys=="PbPb"))
652 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
653 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
656 if (fcollidingSys=="PP")
658 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
659 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
665 Double_t ndMom = nPid->GetTPCmomentum();
666 if (ndMom<1.0 && (fcollidingSys=="PbPb"))
668 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
669 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
672 if (fcollidingSys=="PP")
674 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
675 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
678 Bool_t bpPion = TMath::Abs(nSigmaPosPion) <= fSigmaPID;
679 Bool_t bpProton = TMath::Abs(nSigmaPosProton) <= fSigmaPID;
680 Bool_t bnPion = TMath::Abs(nSigmaNegPion) <= fSigmaPID;
681 Bool_t bnProton = TMath::Abs(nSigmaNegProton) <= fSigmaPID;
683 Bool_t cutK0Pid = (bpPion && bnPion) ;
684 Bool_t cutLambdaPid = (bpProton && bnPion) ;
685 Bool_t cutAntiLambdaPid = (bpPion && bnProton);
686 //--------------------------------------------------
688 lPV0s = TMath::Sqrt(lPzV0s*lPzV0s + lPtV0s*lPtV0s);
690 if(lPV0s > 0) lcTauLambda = (lV0DecayLength*lInvMassLambda)/lPV0s;
691 if(lPV0s > 0) lcTauAntiLambda = (lV0DecayLength*lInvMassAntiLambda)/lPV0s;
692 if(lPV0s > 0) lcTauK0s = (lV0DecayLength*lInvMassK0)/lPV0s;
694 Bool_t k0ctcut = (lcTauK0s < fCutCTK0);
695 Bool_t lactcut = (lcTauLambda < fCutCTLa);
696 Bool_t alactcut= (lcTauAntiLambda < fCutCTLa);
698 Bool_t k0APcut = (lPtArmV0>(TMath::Abs(0.2*lAlphaV0)));
700 Bool_t k0Rapcut = (TMath::Abs(lRapK0s) < fRapidityCut);
701 Bool_t laRapcut = (TMath::Abs(lRapLambda) < fRapidityCut);
702 Bool_t alaRapcut= (TMath::Abs(lRapAntiLambda) < fRapidityCut);
704 if(fcollidingSys=="PbPb")if(lV0Radius>=100) continue;
706 Bool_t k0cutset = IsAcseptedK0(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassLambda,lInvMassAntiLambda);
707 Bool_t lacutset = IsAcseptedLA(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
708 Bool_t alacutset= IsAcseptedLA(lV0Radius,lDcaNegToPrimVertex,lDcaPosToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
710 Double_t spK0[3] = {lInvMassK0, lPtV0s,MultipOrCent};
711 Double_t spLa[3] = {lInvMassLambda,lPtV0s,MultipOrCent};
712 Double_t spAl[3] = {lInvMassAntiLambda,lPtV0s,MultipOrCent};
716 fHistReconstK0->Fill(spK0);
717 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
719 fHistReconstLA->Fill(spLa);
720 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
722 fHistReconstALA->Fill(spAl);
723 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
728 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid)
730 fHistReconstK0->Fill(spK0);
731 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
734 if (lactcut && laRapcut && lacutset && cutLambdaPid)
736 fHistReconstLA->Fill(spLa);
737 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
740 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
742 fHistReconstALA->Fill(spAl);
743 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
749 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid && k0APcut)
751 fHistReconstK0->Fill(spK0);
752 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
755 if (lactcut && laRapcut && lacutset && cutLambdaPid)
757 fHistReconstLA->Fill(spLa);
758 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
761 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
763 fHistReconstALA->Fill(spAl);
764 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
769 AliInfo(Form("No case selected"));
775 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
778 Int_t myTrackPosLabel = TMath::Abs(myTrackPos->GetLabel());
779 Int_t myTrackNegLabel = TMath::Abs(myTrackNeg->GetLabel());
781 AliAODMCParticle *mcPosTrack = (AliAODMCParticle*)mcArray->At(myTrackPosLabel);
782 AliAODMCParticle *mcNegTrack = (AliAODMCParticle*)mcArray->At(myTrackNegLabel);
784 Int_t PosDaughterPdg = mcPosTrack->GetPdgCode();
785 Int_t NegDaughterPdg = mcNegTrack->GetPdgCode();
787 Int_t myTrackPosMotherLabel = mcPosTrack->GetMother();
788 Int_t myTrackNegMotherLabel = mcNegTrack->GetMother();
790 if ((myTrackPosMotherLabel==-1)||(myTrackNegMotherLabel==-1)) continue;
791 if (myTrackPosMotherLabel!=myTrackNegMotherLabel) continue;
793 AliAODMCParticle *mcPosMother = (AliAODMCParticle*)mcArray->At(myTrackPosMotherLabel);
794 Int_t MotherPdg = mcPosMother->GetPdgCode();
795 Bool_t IsPrime = mcPosMother->IsPhysicalPrimary();
797 Double_t rcK0[3] = {lInvMassK0, lPtV0s,MultipOrCent};
798 Double_t rcLa[3] = {lInvMassLambda,lPtV0s,MultipOrCent};
799 Double_t rcAl[3] = {lInvMassAntiLambda,lPtV0s,MultipOrCent};
803 fHistMCAssoK0->Fill(rcK0);
804 fHistMCAssoLA->Fill(rcLa);
805 fHistMCAssoALA->Fill(rcAl);
810 if ((k0ctcut && k0Rapcut && k0cutset)&&(MotherPdg == 310 &&
811 PosDaughterPdg== 211 &&
812 NegDaughterPdg== -211 &&
815 fHistMCAssoK0->Fill(rcK0);
818 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
819 PosDaughterPdg== 2212 &&
820 NegDaughterPdg== -211 &&
823 fHistMCAssoLA->Fill(rcLa);
826 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
827 PosDaughterPdg== 211 &&
828 NegDaughterPdg== -2212 &&
831 fHistMCAssoALA->Fill(rcAl);
837 if ((k0ctcut && k0Rapcut && k0cutset && k0APcut)&&(MotherPdg == 310 &&
838 PosDaughterPdg== 211 &&
839 NegDaughterPdg== -211 &&
842 fHistMCAssoK0->Fill(rcK0);
845 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
846 PosDaughterPdg== 2212 &&
847 NegDaughterPdg== -211 &&
850 fHistMCAssoLA->Fill(rcLa);
853 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
854 PosDaughterPdg== 211 &&
855 NegDaughterPdg== -2212 &&
858 fHistMCAssoALA->Fill(rcAl);
863 AliInfo(Form("No case selected"));
869 FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0s,fHistTriggerSib,fHistReconstSib);
870 FillCorrelationMixing(MultipOrCent,tPrimaryVtxPosition[2],poolmax,poolmin,selectedTracksLeading,selectedV0s,fHistTriggerMix,fHistReconstMix);
872 PostData(1,fOutputList);
874 //---------------------------------------------------------------------------------------
875 void AliLeadingV0Correlation::Terminate(Option_t *)
877 //No need in the grid
879 //---------------------------------------------------------------------------------------
880 Bool_t AliLeadingV0Correlation::IsAcseptedDaughterTrack(const AliAODTrack *itrack)
882 if(TMath::Abs(itrack->Eta())>fTrackEtaCut)return kFALSE;
884 if (!itrack->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
886 Float_t nCrossedRowsTPC = itrack->GetTPCClusterInfo(2,1);
887 if (nCrossedRowsTPC < 70) return kFALSE;
889 Int_t findable=itrack->GetTPCNclsF();
890 if (findable <= 0) return kFALSE;
892 if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
895 //---------------------------------------------------------------------------------------
896 Bool_t AliLeadingV0Correlation::IsAcseptedV0(const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg)
898 if (!aodV0) return kFALSE;
900 // Offline reconstructed V0 only
901 if (aodV0->GetOnFlyStatus()) return kFALSE;
903 // Get daughters and check them
904 myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
905 myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
907 if (!myTrackPos||!myTrackNeg) return kFALSE;
908 // Unlike signs of daughters
909 if (myTrackPos->Charge() == myTrackNeg->Charge()) return kFALSE;
911 // Track cuts for daughers
912 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) return kFALSE;
914 // Minimum pt of daughters
915 Double_t lPtPos = myTrackPos->Pt();
916 Double_t lPtNeg = myTrackNeg->Pt();
918 if (lPtPos<fPtMin || lPtNeg<fPtMin) return kFALSE;
922 //---------------------------------------------------------------------------------------
923 Bool_t AliLeadingV0Correlation::IsAcseptedK0(Double_t v0rad,
931 if(v0rad >=fV0radius &&
932 dcaptp >=fV0PostoPVz &&
933 dcantp >=fV0NegtoPVz &&
934 dcav0d <=fDCAV0Daughters &&
936 TMath::Abs(massLa - 1.115683) > fRejectLamK0 &&
937 TMath::Abs(massALa - 1.115683) > fRejectLamK0 )return kTRUE;
940 //---------------------------------------------------------------------------------------
941 Bool_t AliLeadingV0Correlation::IsAcseptedLA(Double_t v0rad,
948 if(v0rad >=fV0radius &&
949 dcaptp >=fV0PostoPVz &&
950 dcantp >=fV0NegtoPVz &&
951 dcav0d <=fDCAV0Daughters &&
953 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam &&
954 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam )return kTRUE;
957 //---------------------------------------------------------------------------------------
958 Bool_t AliLeadingV0Correlation::IsK0InvMass(const Double_t mass) const
960 const Float_t massK0 = 0.497;
962 return ((massK0-fMassCutK0)<=mass && mass<=(massK0 + fMassCutK0))?1:0;
964 //---------------------------------------------------------------------------------------
965 Bool_t AliLeadingV0Correlation::IsLambdaInvMass(const Double_t mass) const
967 const Float_t massLambda = 1.116;
969 return ((massLambda-fMassCutLa)<=mass && mass<=(massLambda + fMassCutLa))?1:0;
971 //---------------------------------------------------------------------------------------
972 Double_t AliLeadingV0Correlation::RangePhi(Double_t DPhi)
974 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
975 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
978 //---------------------------------------------------------------------------------------
979 Bool_t AliLeadingV0Correlation::IsTrackFromV0(AliAODTrack* track)
981 Int_t atrID = track->GetID();
983 for(int i=0; i<fAODEvent->GetNumberOfV0s(); i++){ // loop over V0s
984 AliAODv0* aodV0 = fAODEvent->GetV0(i);
986 AliAODTrack *trackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
987 AliAODTrack *trackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
989 if ( !(IsAcseptedDaughterTrack(trackPos)) || !(IsAcseptedDaughterTrack(trackNeg)) ) continue;
990 //----------------------------------
991 Int_t negID = trackNeg->GetID();
992 Int_t posID = trackPos->GetID();
994 if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
995 if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
996 //----------------------------------
1000 //---------------------------------------------------------------------------------------
1001 void AliLeadingV0Correlation::FillCorrelationSibling(Double_t MultipOrCent,
1002 TObjArray*triggerArray,
1003 TObjArray*selectedV0Array,
1004 THnSparse*triggerHist,
1005 THnSparse*associateHist)
1007 Double_t binsv0CORR[7];
1008 Double_t binsTrigSib[2];
1009 Int_t counterSibMCA=0;
1011 for(Int_t i=0;i<triggerArray->GetEntriesFast();i++)
1013 AliAODTrack* trigger = (AliAODTrack*)triggerArray->At(0);
1014 if(!trigger)continue;
1017 if(IsTrackFromV0(trigger))continue;
1019 Double_t triggerPt = trigger->Pt();
1020 Double_t triggerPhi = trigger->Phi();
1021 Double_t triggerEta = trigger->Eta();
1023 if(triggerPt<fTriglow||triggerPt>fTrighigh)continue;
1026 if(counterSibMCA==triggerArray->GetEntriesFast()){
1028 binsTrigSib[0]=triggerPt;
1029 binsTrigSib[1]=MultipOrCent;
1031 if(triggerHist)triggerHist->Fill(binsTrigSib);
1033 for (Int_t j=0; j<selectedV0Array->GetEntriesFast(); j++){
1035 V0Correlationparticle* associate = (V0Correlationparticle*) selectedV0Array->At(j);
1036 if(!associate)continue;
1038 binsv0CORR[0]= associate->Pt();
1039 binsv0CORR[1]= associate->Phi();
1040 binsv0CORR[2]= associate->Eta();
1042 if(binsv0CORR[0]>triggerPt) continue;
1044 binsv0CORR[3]=RangePhi(triggerPhi-binsv0CORR[1]);
1045 binsv0CORR[4]=triggerEta-binsv0CORR[2];
1046 binsv0CORR[5]= associate->WhichCandidate();
1047 binsv0CORR[6]= MultipOrCent;
1049 associateHist->Fill(binsv0CORR);
1054 //---------------------------------------------------------------------------------------
1055 void AliLeadingV0Correlation::FillCorrelationMixing(Double_t MultipOrCentMix,
1059 TObjArray*triggerArray,
1060 TObjArray*selectedV0Array,
1061 THnSparse*triggerHist,
1062 THnSparse*associateHist)
1064 if(TMath::Abs(pvxMix)>=fpvzcut || MultipOrCentMix>poolmax || MultipOrCentMix < poolmin)
1066 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1067 if(fcollidingSys=="PbPb") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1071 Double_t binsv0CORRMix[7];
1072 Double_t binsTrigMix[2];
1073 Double_t counterMix=0;
1075 AliEventPool* pool = fPoolMgr->GetEventPool(MultipOrCentMix, pvxMix);
1076 if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", MultipOrCentMix, pvxMix));
1078 if (pool->IsReady() || pool->NTracksInPool() > fPoolMinNTracks || pool->GetCurrentNEvents() > fMinEventsToMix)
1080 Int_t nMix = pool->GetCurrentNEvents();
1081 for (Int_t jMix=0; jMix<nMix; jMix++){
1083 TObjArray* mixEvents = pool->GetEvent(jMix);
1084 for (Int_t i=0; i<triggerArray->GetEntriesFast(); i++){
1086 AliAODTrack* trig = (AliAODTrack*)triggerArray->At(0);
1090 if(IsTrackFromV0(trig))continue;
1092 Double_t trigPhi = trig->Phi();
1093 Double_t trigEta = trig->Eta();
1094 Double_t trigPt = trig->Pt();
1096 if(trigPt<fTriglow||trigPt>fTrighigh)continue;
1099 if(counterMix==triggerArray->GetEntriesFast()){
1101 binsTrigMix[0]=trigPt;
1102 binsTrigMix[1]=MultipOrCentMix;
1104 if(triggerHist)triggerHist->Fill(binsTrigMix);
1106 for (Int_t j=0; j<mixEvents->GetEntriesFast(); j++){
1108 V0Correlationparticle* associate = (V0Correlationparticle*) mixEvents->At(j);
1109 if(!associate)continue;
1111 binsv0CORRMix[0]= associate->Pt();
1112 binsv0CORRMix[1]= associate->Phi();
1113 binsv0CORRMix[2]= associate->Eta();
1115 if(binsv0CORRMix[0]>trigPt) continue;
1117 binsv0CORRMix[3]=RangePhi(trigPhi-binsv0CORRMix[1]);
1118 binsv0CORRMix[4]=trigEta-binsv0CORRMix[2];
1119 binsv0CORRMix[5]=associate->WhichCandidate();
1120 binsv0CORRMix[6]=MultipOrCentMix;
1122 associateHist->Fill(binsv0CORRMix);
1129 TObjArray* tracksClone = new TObjArray;
1130 tracksClone->SetOwner(kTRUE);
1132 for (Int_t i=0; i<selectedV0Array->GetEntriesFast(); i++)
1134 V0Correlationparticle* particle = (V0Correlationparticle*) selectedV0Array->At(i);
1135 tracksClone->Add(new V0Correlationparticle(particle->Eta(),
1138 particle->WhichCandidate()));
1140 pool->UpdatePool(tracksClone);
1142 //---------------------------------------------------------------------------------------