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"
47 Double_t PI =TMath::Pi();
49 ClassImp(AliLeadingV0Correlation)
50 ClassImp(V0Correlationparticle)
52 //---------------------------------------------------------------------------------------
53 AliLeadingV0Correlation::AliLeadingV0Correlation()
54 : AliAnalysisTaskSE(),
87 fUseChargeHadrons (kTRUE),
90 fHist_Mult_B4_Trg_Sel (0),
91 fHist_Mult_Af_Trg_Sel (0),
92 fHist_Mult_PVz_Cut (0),
93 fHist_Mult_SPD_PVz (0),
94 fHist_Mult_SPD_PVz_Pileup (0),
100 fHistPVzAnalysis (0),
101 fHistEventViceGen (0),
102 fHistEventViceReconst (0),
118 for(Int_t iBin = 0; iBin < 100; iBin++){
119 fZvtxBins[iBin] = 0.;
120 fCentBins[iBin] = 0.;
123 //---------------------------------------------------------------------------------------
124 AliLeadingV0Correlation::AliLeadingV0Correlation(const char *name)
125 : AliAnalysisTaskSE(name),
158 fUseChargeHadrons (kTRUE),
161 fHist_Mult_B4_Trg_Sel (0),
162 fHist_Mult_Af_Trg_Sel (0),
163 fHist_Mult_PVz_Cut (0),
164 fHist_Mult_SPD_PVz (0),
165 fHist_Mult_SPD_PVz_Pileup (0),
169 fHistPVxAnalysis (0),
170 fHistPVyAnalysis (0),
171 fHistPVzAnalysis (0),
172 fHistEventViceGen (0),
173 fHistEventViceReconst (0),
189 for(Int_t iBin = 0; iBin < 100; iBin++){
190 fZvtxBins[iBin] = 0.;
191 fCentBins[iBin] = 0.;
193 DefineOutput(1, TList::Class());
196 //---------------------------------------------------------------------------------------
197 AliLeadingV0Correlation::~AliLeadingV0Correlation()
199 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
203 //---------------------------------------------------------------------------------------
204 void AliLeadingV0Correlation::UserCreateOutputObjects()
206 fAnalyseUE =new AliAnalyseLeadingTrackUE();
209 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit,fUseChargeHadrons,fTrackEtaCut,fPtMin);
210 fAnalyseUE->DefineESDCuts(fFilterBit);
213 fOutputList = new TList();
214 fOutputList->SetOwner();
216 fHist_Mult_B4_Trg_Sel = new TH1F("fHist_Mult_B4_Trg_Sel","Tracks per event;Nbr of Tracks;Events", 1000, 0, 10000);
217 fOutputList->Add(fHist_Mult_B4_Trg_Sel);
219 fHist_Mult_Af_Trg_Sel = new TH1F("fHist_Mult_Af_Trg_Sel","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
220 fOutputList->Add(fHist_Mult_Af_Trg_Sel);
222 fHist_Mult_PVz_Cut = new TH1F("fHist_Mult_PVz_Cut","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
223 fOutputList->Add(fHist_Mult_PVz_Cut);
225 fHist_Mult_SPD_PVz = new TH1F("fHist_Mult_SPD_PVz","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
226 fOutputList->Add(fHist_Mult_SPD_PVz);
228 fHist_Mult_SPD_PVz_Pileup = new TH1F("fHist_Mult_SPD_PVz_Pileup","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);
229 fOutputList->Add(fHist_Mult_SPD_PVz_Pileup);
231 fHistPVx = new TH1F("fHistPVx","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);
232 fOutputList->Add(fHistPVx);
234 fHistPVy = new TH1F("fHistPVy","PV y position;Nbr of Evts;y",200, -0.5, 0.5);
235 fOutputList->Add(fHistPVy);
237 fHistPVz = new TH1F("fHistPVz","PV z position;Nbr of Evts;z",400, -20, 20);
238 fOutputList->Add(fHistPVz);
240 fHistPVxAnalysis = new TH1F("fHistPVxAnalysis","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);
241 fOutputList->Add(fHistPVxAnalysis);
243 fHistPVyAnalysis = new TH1F("fHistPVyAnalysis","PV y position;Nbr of Evts;y",200, -0.5, 0.5);
244 fOutputList->Add(fHistPVyAnalysis);
246 fHistPVzAnalysis = new TH1F("fHistPVzAnalysis","PV z position;Nbr of Evts;z",400, -20, 20);
247 fOutputList->Add(fHistPVzAnalysis);
249 //---------------------------------------------- Events histograms -----------------------------------------------------//
250 //0-PVx,1-PVy,2-PVz,3-MULT,4-CENT
251 const Int_t ndimsEV = 3;
252 Int_t binsEV[ndimsEV] = { 200, 100,100};
253 Double_t xminEV[ndimsEV] = {-20 , 0, 0};
254 Double_t xmaxEV[ndimsEV] = { 20 , 300,100};
256 fHistEventViceGen= new THnSparseD("fHistEventViceGen", "fHistEventViceGen", ndimsEV, binsEV, xminEV, xmaxEV);
257 fOutputList->Add(fHistEventViceGen);
259 fHistEventViceReconst= new THnSparseD("fHistEventViceReconst", "fHistEventViceReconst", ndimsEV, binsEV, xminEV, xmaxEV);
260 fOutputList->Add(fHistEventViceReconst);
263 const Int_t ndimsGenMC = 3;
264 Int_t binsGenMCLA[ndimsGenMC] = {120, 140,100};
265 Double_t xminGenMCLA[ndimsGenMC] = { 0,1.06, 0};
266 Double_t xmaxGenMCLA[ndimsGenMC] = { 6, 1.2,100};
268 Int_t binsGenMCK0[ndimsGenMC] = {120, 200,100};
269 Double_t xminGenMCK0[ndimsGenMC] = { 0, 0.4, 0};
270 Double_t xmaxGenMCK0[ndimsGenMC] = { 6, 0.6,100};
272 fHistMCGenLAM = new THnSparseD("fHistMCGenLAM" , "fHistMCGenLAM" , ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
273 fOutputList->Add(fHistMCGenLAM);
275 fHistMCGenALAM = new THnSparseD("fHistMCGenALAM", "fHistMCGenALAM", ndimsGenMC, binsGenMCLA, xminGenMCLA, xmaxGenMCLA);
276 fOutputList->Add(fHistMCGenALAM);
278 fHistMCGenK0 = new THnSparseD("fHistMCGenK0" , "fHistMCGenK0" , ndimsGenMC, binsGenMCK0, xminGenMCK0, xmaxGenMCK0);
279 fOutputList->Add(fHistMCGenK0);
281 const Int_t ndims=3; //MK0 mLA MALA PT cent
282 Int_t binsK0[ndims] = { 200, 120 ,100};
283 Double_t xminK0[ndims] = { 0.4, 0 , 0};
284 Double_t xmaxK0[ndims] = { 0.6, 6 ,100};
286 Int_t binsLA[ndims] = { 140, 120 ,100};
287 Double_t xminLA[ndims] = { 1.06, 0 , 0};
288 Double_t xmaxLA[ndims] = { 1.2, 6 ,100};
291 fHistReconstK0= new THnSparseD("fHistReconstK0" , "fHistReconstK0", ndims, binsK0, xminK0, xmaxK0);
292 fHistReconstK0->Sumw2();
293 fOutputList->Add(fHistReconstK0);
295 fHistReconstLA= new THnSparseD("fHistReconstLA" , "fHistReconstLA", ndims, binsLA, xminLA, xmaxLA);
296 fHistReconstLA->Sumw2();
297 fOutputList->Add(fHistReconstLA);
299 fHistReconstALA= new THnSparseD("fHistReconstALA", "fHistReconstALA", ndims, binsLA, xminLA, xmaxLA);
300 fHistReconstALA->Sumw2();
301 fOutputList->Add(fHistReconstALA);
303 fHistMCAssoK0= new THnSparseD("fHistMCAssoK0" , "fHistMCAssoK0" , ndims, binsK0, xminK0, xmaxK0);
304 fHistMCAssoK0->Sumw2();
305 fOutputList->Add(fHistMCAssoK0);
307 fHistMCAssoLA= new THnSparseD("fHistMCAssoLA" , "fHistMCAssoLA" , ndims, binsLA, xminLA, xmaxLA);
308 fHistMCAssoLA->Sumw2();
309 fOutputList->Add(fHistMCAssoLA);
311 fHistMCAssoALA= new THnSparseD("fHistMCAssoALA" , "fHistMCAssoALA" , ndims, binsLA, xminLA, xmaxLA);
312 fHistMCAssoALA->Sumw2();
313 fOutputList->Add(fHistMCAssoALA);
315 //--------------------------------------------Correlation Histos -----------------------------------------------------//
317 //0-pTK0,1-PhiK0,2-EtaK0,3-DPhiK0,4-DEtaK0,5-TYPE,6-CutSet
318 const Int_t ndimsv0CORR = 7;
319 Int_t binsv0CORR[ndimsv0CORR] = {120, 200, 200,CorrBinsX, CorrBinsY,4,100};
321 Double_t xminv0CORR[ndimsv0CORR] = { 0, 0,-fTrackEtaCut, -PI/2,-2*fTrackEtaCut,0,0};
323 Double_t xmaxv0CORR[ndimsv0CORR] = { 6,2*PI, fTrackEtaCut, 3*PI/2, 2*fTrackEtaCut,4,100};
325 fHistReconstSib= new THnSparseD("fHistReconstSib", "fHistReconstSib", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
326 fHistReconstSib->Sumw2();
327 fOutputList->Add(fHistReconstSib);
329 fHistReconstMix= new THnSparseD("fHistReconstMix", "fHistReconstMix", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
330 fHistReconstMix->Sumw2();
331 fOutputList->Add(fHistReconstMix);
334 const Int_t triggerdims =2;
335 Int_t binsTrig[triggerdims] ={ 100, 100};
336 Double_t xminTrig[triggerdims]={ fTriglow, 0};
337 Double_t xmaxTrig[triggerdims]={ fTrighigh, 100};
339 fHistTriggerSib= new THnSparseD("fHistTriggerSib", "fHistTriggerSib", triggerdims, binsTrig, xminTrig, xmaxTrig);
340 fHistTriggerSib->Sumw2();
341 fOutputList->Add(fHistTriggerSib);
343 fHistTriggerMix= new THnSparseD("fHistTriggerMix", "fHistTriggerMix", triggerdims, binsTrig, xminTrig, xmaxTrig);
344 fHistTriggerMix->Sumw2();
345 fOutputList->Add(fHistTriggerMix);
348 //----------------------------------------------Event Pool-----------------------------------------------------//
349 fPoolMgr = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
350 if(!fPoolMgr) return;
352 PostData(1, fOutputList);
354 //---------------------------------------------------------------------------------------
355 void AliLeadingV0Correlation::UserExec(Option_t *)
358 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
359 AliInputEventHandler *inEvMain = (AliInputEventHandler*)(mgr->GetInputEventHandler());
360 if (!inEvMain) return;
362 // Pointers to PID Response objects.
363 fPIDResponse = inEvMain->GetPIDResponse();
364 if(!fPIDResponse) return;
366 fAODEvent = dynamic_cast<AliAODEvent*>(inEvMain->GetEvent());
367 if(!fAODEvent) return;
369 Int_t multiplicity = -1;
370 Int_t multiplicityMC = -1;
371 Double_t MultipOrCent = -1;
372 Double_t CentPecentMC = -1;
373 Double_t CentPecentAfterPhySel = -1;
374 Int_t nTrackMultiplicity = -1;
375 Float_t lPrimaryTrackMultiplicity = 0;
377 nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
378 for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
379 AliAODTrack* track = fAODEvent->GetTrack(itrack);
380 if(!fAnalysisMC) if (track->TestFilterBit(fFilterBit)) lPrimaryTrackMultiplicity++;
381 lPrimaryTrackMultiplicity++;
384 fHist_Mult_B4_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
386 if(fcollidingSys=="PbPb"){
387 AliCentrality *centralityObjMC = fAODEvent->GetHeader()->GetCentralityP();
388 CentPecentMC = centralityObjMC->GetCentralityPercentileUnchecked("V0M");
389 if ((CentPecentMC < 0.)||(CentPecentMC > 90)) return;
392 Double_t * CentBins = fCentBins;
393 Double_t poolmin = CentBins[0];
394 Double_t poolmax = CentBins[fNCentBins];
396 //----------------------------------------------------------
397 // Efficency denomenator comes before the physics selection
398 //----------------------------------------------------------
400 Double_t dimEventviceMC[3];
401 if(fAnalysisMC) //Efficency denomenator comes before the physics selection
403 AliAODMCHeader *aodMCheader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
404 Float_t mcZv = aodMCheader->GetVtxZ();
406 if (TMath::Abs(mcZv) >= fpvzcut) return;
408 dimEventviceMC[0]=aodMCheader->GetVtxZ();
410 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
413 Int_t nMCTracks = mcArray->GetEntriesFast();
415 if(fcollidingSys=="PbPb") multiplicityMC=CentPecentMC;
416 if(fcollidingSys=="PP") multiplicityMC=nMCTracks;
418 dimEventviceMC[1]=nMCTracks;
419 dimEventviceMC[2]=CentPecentMC;
420 fHistEventViceGen->Fill(dimEventviceMC);
422 for (Int_t iMC = 0; iMC<nMCTracks; iMC++)
424 AliAODMCParticle *mcTrack = (AliAODMCParticle*)mcArray->At(iMC);
425 if (!mcTrack) continue;
426 // Charged track Generated level
427 Double_t mcTrackPt = mcTrack->Pt();
428 if ((mcTrackPt<fPtMin)||(mcTrackPt>6.0)) continue;
430 //Double_t mcTrackEta = mcTrack->Eta();
431 //Double_t mcTrackPhi = mcTrack->Phi();
432 Bool_t TrIsPrime = mcTrack->IsPhysicalPrimary();
433 Bool_t TrPtMin = mcTrackPt>fPtMin;
434 Bool_t TrCharge = (mcTrack->Charge())!=0;
436 if (!TrIsPrime && !TrPtMin && !TrCharge) continue; //Check Point 1
438 // V0 Generated level
439 Int_t mcPartPdg = mcTrack->GetPdgCode();
441 Double_t mcRapidity = mcTrack->Y();
442 Bool_t V0RapMax = TMath::Abs(mcRapidity)<fRapidityCut;
443 Double_t mcMass = mcTrack->M();
445 Double_t mcK0[3] = {mcTrackPt,mcMass,multiplicityMC};
446 Double_t mcLa[3] = {mcTrackPt,mcMass,multiplicityMC};
447 Double_t mcAl[3] = {mcTrackPt,mcMass,multiplicityMC};
450 Bool_t IsK0 = mcPartPdg==310;
451 if (IsK0 && V0RapMax && TrIsPrime)
453 fHistMCGenK0->Fill(mcK0);
456 Bool_t IsLambda = mcPartPdg==3122;
457 if (IsLambda && V0RapMax && TrIsPrime)
459 fHistMCGenLAM->Fill(mcLa);
462 Bool_t IsAntiLambda = mcPartPdg==-3122;
463 if (IsAntiLambda && V0RapMax && TrIsPrime)
465 fHistMCGenALAM->Fill(mcAl);
470 // End Loop over MC condition
472 //------------------------------------------------
474 //------------------------------------------------
475 UInt_t maskIsSelected = inEvMain->IsEventSelected();
476 Bool_t isSelected = ((maskIsSelected & AliVEvent::kMB)== AliVEvent::kMB
477 || (maskIsSelected & AliVEvent::kCentral)== AliVEvent::kCentral
478 || (maskIsSelected & AliVEvent::kSemiCentral)== AliVEvent::kSemiCentral);
479 if (!isSelected) return;
481 //------------------------------------------------
482 // After Trigger Selection
483 //------------------------------------------------
485 fHist_Mult_Af_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
487 //------------------------------------------------
488 // Getting: Primary Vertex + MagField Info
489 //------------------------------------------------
490 Double_t dimEventviceReal[3];
491 Double_t lBestPrimaryVtxPos[3];
492 Double_t tPrimaryVtxPosition[3];
493 Double_t lV0Position[3];
496 if(fcollidingSys=="PbPb"){ //
497 AliCentrality *centralityObj = fAODEvent->GetHeader()->GetCentralityP();
498 CentPecentAfterPhySel = centralityObj->GetCentralityPercentileUnchecked("V0M");
499 if ((CentPecentAfterPhySel < 0.)||(CentPecentAfterPhySel > 90)) return;
502 AliAODVertex *lPrimaryBestAODVtx = fAODEvent->GetPrimaryVertex();
503 if (!lPrimaryBestAODVtx) return;
504 // get the best primary vertex available for the event
505 // As done in AliCascadeVertexer, we keep the one which is the best one available.
506 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
507 // This one will be used for next calculations (DCA essentially)
508 lPrimaryBestAODVtx->GetXYZ(lBestPrimaryVtxPos);
510 const AliVVertex *primaryVtx = fAODEvent->GetPrimaryVertex();
511 tPrimaryVtxPosition[0] = primaryVtx->GetX();
512 tPrimaryVtxPosition[1] = primaryVtx->GetY();
513 tPrimaryVtxPosition[2] = primaryVtx->GetZ();
514 fHistPVx->Fill( tPrimaryVtxPosition[0] );
515 fHistPVy->Fill( tPrimaryVtxPosition[1] );
516 fHistPVz->Fill( tPrimaryVtxPosition[2] );
518 //------------------------------------------------
519 // Primary Vertex Z position: SKIP
520 //------------------------------------------------
522 Double_t lPVx = lBestPrimaryVtxPos[0];
523 Double_t lPVy = lBestPrimaryVtxPos[1];
524 Double_t lPVz = lBestPrimaryVtxPos[2];
526 if ((TMath::Abs(lPVz)) >= fpvzcut) return ;
527 if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return;
528 fHist_Mult_PVz_Cut->Fill(lPrimaryTrackMultiplicity);
530 //------------------------------------------------
531 // Only look at events with well-established PV
532 //------------------------------------------------
534 const AliAODVertex *lPrimaryTrackingAODVtxCheck = fAODEvent->GetPrimaryVertex();
535 const AliAODVertex *lPrimarySPDVtx = fAODEvent->GetPrimaryVertexSPD();
536 if (!lPrimarySPDVtx && !lPrimaryTrackingAODVtxCheck )return;
538 fHist_Mult_SPD_PVz->Fill(lPrimaryTrackMultiplicity);
541 //------------------------------------------------
543 //------------------------------------------------
545 // FIXME : quality selection regarding pile-up rejection
546 if(fAODEvent->IsPileupFromSPD()) return;
547 fHist_Mult_SPD_PVz_Pileup->Fill(lPrimaryTrackMultiplicity);
549 fHistPVxAnalysis->Fill(tPrimaryVtxPosition[0]);
550 fHistPVyAnalysis->Fill(tPrimaryVtxPosition[1]);
551 fHistPVzAnalysis->Fill(tPrimaryVtxPosition[2]);
553 dimEventviceReal[0]=tPrimaryVtxPosition[2];
554 multiplicity = fAODEvent->GetNTracks();
556 dimEventviceReal[1]=multiplicity;
557 dimEventviceReal[2]=CentPecentAfterPhySel;
559 fHistEventViceReconst->Fill(dimEventviceReal);
561 if(fcollidingSys=="PP")MultipOrCent=multiplicity;
562 if(fcollidingSys=="PbPb")MultipOrCent=CentPecentAfterPhySel;
564 //---------------------------------------------------------------------------------------------
566 Double_t lDcaPosToPrimVertex = 0;Double_t lDcaNegToPrimVertex = 0;Double_t lDcaV0Daughters = 0;
567 Double_t lV0cosPointAngle = 0;Double_t lV0DecayLength = 0;Double_t lV0Radius = 0;
568 Double_t lcTauLambda = 0;Double_t lcTauAntiLambda = 0;
569 Double_t lcTauK0s = 0;
571 Double_t lInvMassK0 = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
572 Double_t lPtV0s = 0; Double_t lPhiV0s = 0; Double_t lEtaV0s = 0;
573 Double_t lRapK0s = 0, lRapLambda = 0, lRapAntiLambda = 0;
574 Double_t lPzV0s = 0; Double_t lAlphaV0 = 0, lPtArmV0 = 0;
577 TObjArray *selectedTracksLeading=0;
578 selectedTracksLeading=fAnalyseUE->FindLeadingObjects(fAODEvent);
579 if(!selectedTracksLeading) return;
580 selectedTracksLeading->SetOwner(kTRUE);
582 TObjArray * selectedV0s = new TObjArray;
583 selectedV0s->SetOwner(kTRUE);
585 Int_t nV0s = fAODEvent->GetNumberOfV0s();
587 for (Int_t i = 0; i < nV0s; i++)
588 { // start of V0 slection loop
589 AliAODv0* aodV0 = dynamic_cast<AliAODv0 *>(fAODEvent->GetV0(i));
590 if (!aodV0) continue;
592 if (((aodV0->Pt())<fPtMin)||((aodV0->Pt())>6.0)) continue;
595 AliAODTrack *myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
596 AliAODTrack *myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
598 if (!myTrackPos || !myTrackNeg) {Printf("ERROR: Could not retreive one of the daughter track");continue;}
600 if (!IsAcseptedV0(aodV0,myTrackPos,myTrackNeg)) continue;
602 // VO's main characteristics to check the reconstruction cuts
603 lDcaV0Daughters = aodV0->DcaV0Daughters();
604 lV0cosPointAngle = aodV0->CosPointingAngle(lBestPrimaryVtxPos);
606 aodV0->GetXYZ(lV0Position);
608 lV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
609 lV0DecayLength = TMath::Sqrt(TMath::Power(lV0Position[0] - tPrimaryVtxPosition[0],2) +
610 TMath::Power(lV0Position[1] - tPrimaryVtxPosition[1],2) +
611 TMath::Power(lV0Position[2] - tPrimaryVtxPosition[2],2));
613 // DCA between daughter and Primary Vertex:
614 if (myTrackPos) lDcaPosToPrimVertex = aodV0->DcaPosToPrimVertex();
615 if (myTrackNeg) lDcaNegToPrimVertex = aodV0->DcaNegToPrimVertex();
617 // Quality tracks cuts:
618 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) { continue;}
620 // Armenteros variables:
621 lAlphaV0 = aodV0->AlphaV0();
622 lPtArmV0 = aodV0->PtArmV0();
625 lInvMassK0 = aodV0->MassK0Short();
626 lInvMassLambda = aodV0->MassLambda();
627 lInvMassAntiLambda = aodV0->MassAntiLambda();
629 lPtV0s = aodV0->Pt();
630 lPhiV0s= aodV0->Phi();
631 lEtaV0s= aodV0->Eta();
632 lPzV0s = aodV0->Pz();
635 lRapK0s = aodV0->RapK0Short();
636 lRapLambda = aodV0->RapLambda();
637 lRapAntiLambda = aodV0->Y(-3122);
639 if (lPtV0s==0) {continue;}
641 Float_t nSigmaPosPion = 0.;
642 Float_t nSigmaNegPion = 0.;
643 Float_t nSigmaPosProton = 0.;
644 Float_t nSigmaNegProton = 0.;
646 const AliAODPid *pPid = myTrackPos->GetDetPid();
647 const AliAODPid *nPid = myTrackNeg->GetDetPid();
651 Double_t pdMom = pPid->GetTPCmomentum();
652 if (pdMom<1.0 && (fcollidingSys=="PbPb"))
654 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
655 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
658 if (fcollidingSys=="PP")
660 nSigmaPosPion = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
661 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
667 Double_t ndMom = nPid->GetTPCmomentum();
668 if (ndMom<1.0 && (fcollidingSys=="PbPb"))
670 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
671 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
674 if (fcollidingSys=="PP")
676 nSigmaNegPion = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
677 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
680 Bool_t bpPion = TMath::Abs(nSigmaPosPion) <= fSigmaPID;
681 Bool_t bpProton = TMath::Abs(nSigmaPosProton) <= fSigmaPID;
682 Bool_t bnPion = TMath::Abs(nSigmaNegPion) <= fSigmaPID;
683 Bool_t bnProton = TMath::Abs(nSigmaNegProton) <= fSigmaPID;
685 Bool_t cutK0Pid = (bpPion && bnPion) ;
686 Bool_t cutLambdaPid = (bpProton && bnPion) ;
687 Bool_t cutAntiLambdaPid = (bpPion && bnProton);
688 //--------------------------------------------------
690 lPV0s = TMath::Sqrt(lPzV0s*lPzV0s + lPtV0s*lPtV0s);
692 if(lPV0s > 0) lcTauLambda = (lV0DecayLength*lInvMassLambda)/lPV0s;
693 if(lPV0s > 0) lcTauAntiLambda = (lV0DecayLength*lInvMassAntiLambda)/lPV0s;
694 if(lPV0s > 0) lcTauK0s = (lV0DecayLength*lInvMassK0)/lPV0s;
696 Bool_t k0ctcut = (lcTauK0s < fCutCTK0);
697 Bool_t lactcut = (lcTauLambda < fCutCTLa);
698 Bool_t alactcut= (lcTauAntiLambda < fCutCTLa);
700 Bool_t k0APcut = (lPtArmV0>(TMath::Abs(0.2*lAlphaV0)));
702 Bool_t k0Rapcut = (TMath::Abs(lRapK0s) < fRapidityCut);
703 Bool_t laRapcut = (TMath::Abs(lRapLambda) < fRapidityCut);
704 Bool_t alaRapcut= (TMath::Abs(lRapAntiLambda) < fRapidityCut);
706 if(fcollidingSys=="PbPb")if(lV0Radius>=100) continue;
708 Bool_t k0cutset = IsAcseptedK0(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassLambda,lInvMassAntiLambda);
709 Bool_t lacutset = IsAcseptedLA(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
710 Bool_t alacutset= IsAcseptedLA(lV0Radius,lDcaNegToPrimVertex,lDcaPosToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
712 Double_t spK0[3] = {lInvMassK0, lPtV0s,MultipOrCent};
713 Double_t spLa[3] = {lInvMassLambda,lPtV0s,MultipOrCent};
714 Double_t spAl[3] = {lInvMassAntiLambda,lPtV0s,MultipOrCent};
718 fHistReconstK0->Fill(spK0);
719 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
721 fHistReconstLA->Fill(spLa);
722 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
724 fHistReconstALA->Fill(spAl);
725 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
730 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid)
732 fHistReconstK0->Fill(spK0);
733 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
736 if (lactcut && laRapcut && lacutset && cutLambdaPid)
738 fHistReconstLA->Fill(spLa);
739 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
742 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
744 fHistReconstALA->Fill(spAl);
745 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
751 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid && k0APcut)
753 fHistReconstK0->Fill(spK0);
754 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1));
757 if (lactcut && laRapcut && lacutset && cutLambdaPid)
759 fHistReconstLA->Fill(spLa);
760 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2));
763 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
765 fHistReconstALA->Fill(spAl);
766 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3));
771 AliInfo(Form("No case selected"));
777 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
780 Int_t myTrackPosLabel = TMath::Abs(myTrackPos->GetLabel());
781 Int_t myTrackNegLabel = TMath::Abs(myTrackNeg->GetLabel());
783 AliAODMCParticle *mcPosTrack = (AliAODMCParticle*)mcArray->At(myTrackPosLabel);
784 AliAODMCParticle *mcNegTrack = (AliAODMCParticle*)mcArray->At(myTrackNegLabel);
786 Int_t PosDaughterPdg = mcPosTrack->GetPdgCode();
787 Int_t NegDaughterPdg = mcNegTrack->GetPdgCode();
789 Int_t myTrackPosMotherLabel = mcPosTrack->GetMother();
790 Int_t myTrackNegMotherLabel = mcNegTrack->GetMother();
792 if ((myTrackPosMotherLabel==-1)||(myTrackNegMotherLabel==-1)) continue;
793 if (myTrackPosMotherLabel!=myTrackNegMotherLabel) continue;
795 AliAODMCParticle *mcPosMother = (AliAODMCParticle*)mcArray->At(myTrackPosMotherLabel);
796 Int_t MotherPdg = mcPosMother->GetPdgCode();
797 Bool_t IsPrime = mcPosMother->IsPhysicalPrimary();
799 Double_t rcK0[3] = {lInvMassK0, lPtV0s,MultipOrCent};
800 Double_t rcLa[3] = {lInvMassLambda,lPtV0s,MultipOrCent};
801 Double_t rcAl[3] = {lInvMassAntiLambda,lPtV0s,MultipOrCent};
805 fHistMCAssoK0->Fill(rcK0);
806 fHistMCAssoLA->Fill(rcLa);
807 fHistMCAssoALA->Fill(rcAl);
812 if ((k0ctcut && k0Rapcut && k0cutset)&&(MotherPdg == 310 &&
813 PosDaughterPdg== 211 &&
814 NegDaughterPdg== -211 &&
817 fHistMCAssoK0->Fill(rcK0);
820 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
821 PosDaughterPdg== 2212 &&
822 NegDaughterPdg== -211 &&
825 fHistMCAssoLA->Fill(rcLa);
828 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
829 PosDaughterPdg== 211 &&
830 NegDaughterPdg== -2212 &&
833 fHistMCAssoALA->Fill(rcAl);
839 if ((k0ctcut && k0Rapcut && k0cutset && k0APcut)&&(MotherPdg == 310 &&
840 PosDaughterPdg== 211 &&
841 NegDaughterPdg== -211 &&
844 fHistMCAssoK0->Fill(rcK0);
847 if ((lactcut && laRapcut && lacutset)&&(MotherPdg == 3122 &&
848 PosDaughterPdg== 2212 &&
849 NegDaughterPdg== -211 &&
852 fHistMCAssoLA->Fill(rcLa);
855 if ((alactcut && alaRapcut && alacutset)&&(MotherPdg == -3122 &&
856 PosDaughterPdg== 211 &&
857 NegDaughterPdg== -2212 &&
860 fHistMCAssoALA->Fill(rcAl);
865 AliInfo(Form("No case selected"));
871 FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0s,fHistTriggerSib,fHistReconstSib);
872 FillCorrelationMixing(MultipOrCent,tPrimaryVtxPosition[2],poolmax,poolmin,selectedTracksLeading,selectedV0s,fHistTriggerMix,fHistReconstMix);
874 PostData(1,fOutputList);
876 //---------------------------------------------------------------------------------------
877 void AliLeadingV0Correlation::Terminate(Option_t *)
879 //No need in the grid
881 //---------------------------------------------------------------------------------------
882 Bool_t AliLeadingV0Correlation::IsAcseptedDaughterTrack(const AliAODTrack *itrack)
884 if(TMath::Abs(itrack->Eta())>fTrackEtaCut)return kFALSE;
886 if (!itrack->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
888 Float_t nCrossedRowsTPC = itrack->GetTPCClusterInfo(2,1);
889 if (nCrossedRowsTPC < 70) return kFALSE;
891 Int_t findable=itrack->GetTPCNclsF();
892 if (findable <= 0) return kFALSE;
894 if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
897 //---------------------------------------------------------------------------------------
898 Bool_t AliLeadingV0Correlation::IsAcseptedV0(const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg)
900 if (!aodV0) return kFALSE;
902 // Offline reconstructed V0 only
903 if (aodV0->GetOnFlyStatus()) return kFALSE;
905 // Get daughters and check them
906 myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
907 myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
909 if (!myTrackPos||!myTrackNeg) return kFALSE;
910 // Unlike signs of daughters
911 if (myTrackPos->Charge() == myTrackNeg->Charge()) return kFALSE;
913 // Track cuts for daughers
914 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) return kFALSE;
916 // Minimum pt of daughters
917 Double_t lPtPos = myTrackPos->Pt();
918 Double_t lPtNeg = myTrackNeg->Pt();
920 if (lPtPos<fPtMin || lPtNeg<fPtMin) return kFALSE;
924 //---------------------------------------------------------------------------------------
925 Bool_t AliLeadingV0Correlation::IsAcseptedK0(Double_t v0rad,
933 if(v0rad >=fV0radius &&
934 dcaptp >=fV0PostoPVz &&
935 dcantp >=fV0NegtoPVz &&
936 dcav0d <=fDCAV0Daughters &&
938 TMath::Abs(massLa - 1.115683) > fRejectLamK0 &&
939 TMath::Abs(massALa - 1.115683) > fRejectLamK0 )return kTRUE;
942 //---------------------------------------------------------------------------------------
943 Bool_t AliLeadingV0Correlation::IsAcseptedLA(Double_t v0rad,
950 if(v0rad >=fV0radius &&
951 dcaptp >=fV0PostoPVz &&
952 dcantp >=fV0NegtoPVz &&
953 dcav0d <=fDCAV0Daughters &&
955 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam &&
956 TMath::Abs(massK0 - 0.4976) > fRejectK0Lam )return kTRUE;
959 //---------------------------------------------------------------------------------------
960 Bool_t AliLeadingV0Correlation::IsK0InvMass(const Double_t mass) const
962 const Float_t massK0 = 0.497;
964 return ((massK0-fMassCutK0)<=mass && mass<=(massK0 + fMassCutK0))?1:0;
966 //---------------------------------------------------------------------------------------
967 Bool_t AliLeadingV0Correlation::IsLambdaInvMass(const Double_t mass) const
969 const Float_t massLambda = 1.116;
971 return ((massLambda-fMassCutLa)<=mass && mass<=(massLambda + fMassCutLa))?1:0;
973 //---------------------------------------------------------------------------------------
974 Double_t AliLeadingV0Correlation::RangePhi(Double_t DPhi)
976 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
977 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
980 //---------------------------------------------------------------------------------------
981 Bool_t AliLeadingV0Correlation::IsTrackFromV0(AliAODTrack* track)
983 Int_t atrID = track->GetID();
985 for(int i=0; i<fAODEvent->GetNumberOfV0s(); i++){ // loop over V0s
986 AliAODv0* aodV0 = fAODEvent->GetV0(i);
988 AliAODTrack *trackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
989 AliAODTrack *trackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
991 if ( !(IsAcseptedDaughterTrack(trackPos)) || !(IsAcseptedDaughterTrack(trackNeg)) ) continue;
992 //----------------------------------
993 Int_t negID = trackNeg->GetID();
994 Int_t posID = trackPos->GetID();
996 if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
997 if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
998 //----------------------------------
1002 //---------------------------------------------------------------------------------------
1003 void AliLeadingV0Correlation::FillCorrelationSibling(Double_t MultipOrCent,
1004 TObjArray*triggerArray,
1005 TObjArray*selectedV0Array,
1006 THnSparse*triggerHist,
1007 THnSparse*associateHist)
1009 Double_t binsv0CORR[7];
1010 Double_t binsTrigSib[2];
1011 Int_t counterSibMCA=0;
1013 for(Int_t i=0;i<triggerArray->GetEntriesFast();i++)
1015 AliAODTrack* trigger = (AliAODTrack*)triggerArray->At(0);
1016 if(!trigger)continue;
1019 if(IsTrackFromV0(trigger))continue;
1021 Double_t triggerPt = trigger->Pt();
1022 Double_t triggerPhi = trigger->Phi();
1023 Double_t triggerEta = trigger->Eta();
1025 if(triggerPt<fTriglow||triggerPt>fTrighigh)continue;
1028 if(counterSibMCA==triggerArray->GetEntriesFast()){
1030 binsTrigSib[0]=triggerPt;
1031 binsTrigSib[1]=MultipOrCent;
1033 if(triggerHist)triggerHist->Fill(binsTrigSib);
1035 for (Int_t j=0; j<selectedV0Array->GetEntriesFast(); j++){
1037 V0Correlationparticle* associate = (V0Correlationparticle*) selectedV0Array->At(j);
1038 if(!associate)continue;
1040 binsv0CORR[0]= associate->Pt();
1041 binsv0CORR[1]= associate->Phi();
1042 binsv0CORR[2]= associate->Eta();
1044 if(binsv0CORR[0]>triggerPt) continue;
1046 binsv0CORR[3]=RangePhi(triggerPhi-binsv0CORR[1]);
1047 binsv0CORR[4]=triggerEta-binsv0CORR[2];
1048 binsv0CORR[5]= associate->WhichCandidate();
1049 binsv0CORR[6]= MultipOrCent;
1051 associateHist->Fill(binsv0CORR);
1056 //---------------------------------------------------------------------------------------
1057 void AliLeadingV0Correlation::FillCorrelationMixing(Double_t MultipOrCentMix,
1061 TObjArray*triggerArray,
1062 TObjArray*selectedV0Array,
1063 THnSparse*triggerHist,
1064 THnSparse*associateHist)
1066 if(TMath::Abs(pvxMix)>=fpvzcut || MultipOrCentMix>poolmax || MultipOrCentMix < poolmin)
1068 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1069 if(fcollidingSys=="PbPb") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1073 Double_t binsv0CORRMix[7];
1074 Double_t binsTrigMix[2];
1075 Double_t counterMix=0;
1077 AliEventPool* pool = fPoolMgr->GetEventPool(MultipOrCentMix, pvxMix);
1078 if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", MultipOrCentMix, pvxMix));
1080 if (pool->IsReady() || pool->NTracksInPool() > fPoolMinNTracks || pool->GetCurrentNEvents() > fMinEventsToMix)
1082 Int_t nMix = pool->GetCurrentNEvents();
1083 for (Int_t jMix=0; jMix<nMix; jMix++){
1085 TObjArray* mixEvents = pool->GetEvent(jMix);
1086 for (Int_t i=0; i<triggerArray->GetEntriesFast(); i++){
1088 AliAODTrack* trig = (AliAODTrack*)triggerArray->At(0);
1092 if(IsTrackFromV0(trig))continue;
1094 Double_t trigPhi = trig->Phi();
1095 Double_t trigEta = trig->Eta();
1096 Double_t trigPt = trig->Pt();
1098 if(trigPt<fTriglow||trigPt>fTrighigh)continue;
1101 if(counterMix==triggerArray->GetEntriesFast()){
1103 binsTrigMix[0]=trigPt;
1104 binsTrigMix[1]=MultipOrCentMix;
1106 if(triggerHist)triggerHist->Fill(binsTrigMix);
1108 for (Int_t j=0; j<mixEvents->GetEntriesFast(); j++){
1110 V0Correlationparticle* associate = (V0Correlationparticle*) mixEvents->At(j);
1111 if(!associate)continue;
1113 binsv0CORRMix[0]= associate->Pt();
1114 binsv0CORRMix[1]= associate->Phi();
1115 binsv0CORRMix[2]= associate->Eta();
1117 if(binsv0CORRMix[0]>trigPt) continue;
1119 binsv0CORRMix[3]=RangePhi(trigPhi-binsv0CORRMix[1]);
1120 binsv0CORRMix[4]=trigEta-binsv0CORRMix[2];
1121 binsv0CORRMix[5]=associate->WhichCandidate();
1122 binsv0CORRMix[6]=MultipOrCentMix;
1124 associateHist->Fill(binsv0CORRMix);
1131 TObjArray* tracksClone = new TObjArray;
1132 tracksClone->SetOwner(kTRUE);
1134 for (Int_t i=0; i<selectedV0Array->GetEntriesFast(); i++)
1136 V0Correlationparticle* particle = (V0Correlationparticle*) selectedV0Array->At(i);
1137 tracksClone->Add(new V0Correlationparticle(particle->Eta(),
1140 particle->WhichCandidate()));
1142 pool->UpdatePool(tracksClone);
1144 //---------------------------------------------------------------------------------------