@@ -67,12 +67,14 @@ struct HfTaskElectronWeakBoson {
6767
6868 Configurable<float > vtxZ{" vtxZ" , 10 .f , " " };
6969
70- Configurable<float > etaTrMim{ " etaTrMim " , -1 .0f , " minimun track eta" };
70+ Configurable<float > etaTrMin{ " etaTrMin " , -1 .0f , " minimun track eta" };
7171 Configurable<float > etaTrMax{" etaTrMax" , 1 .0f , " maximum track eta" };
7272 Configurable<float > etaEmcMax{" etaEmcMax" , 0 .6f , " maximum track eta" };
7373 Configurable<float > dcaxyMax{" dcaxyMax" , 2 .0f , " mximum DCA xy" };
7474 Configurable<float > chi2ItsMax{" chi2ItsMax" , 15 .0f , " its chi2 cut" };
7575 Configurable<float > ptMin{" ptMin" , 3 .0f , " minimum pT cut" };
76+ Configurable<float > ptAssMin{" ptAssMin" , 0.15 , " minimum pT cut for associated hadrons" };
77+ Configurable<float > ptMatch{" ptMatch" , 0.001 , " pT match in Z->ee and associated tracks" };
7678 Configurable<float > ptZeeMin{" ptZeeMin" , 20 .0f , " minimum pT cut for Zee" };
7779 Configurable<float > chi2TpcMax{" chi2TpcMax" , 4 .0f , " tpc chi2 cut" };
7880 Configurable<float > nclItsMin{" nclItsMin" , 2 .0f , " its # of cluster cut" };
@@ -97,6 +99,10 @@ struct HfTaskElectronWeakBoson {
9799 Configurable<float > energyIsolationMax{" energyIsolationMax" , 0.1 , " isolation cut on energy" };
98100 Configurable<int > trackIsolationMax{" trackIsolationMax" , 3 , " Maximum number of tracks in isolation cone" };
99101
102+ Configurable<float > zMassMin{" zMassMin" , 60.0 , " Minimum Z mass (GeV/c^2)" };
103+ Configurable<float > zMassMax{" zMassMax" , 120.0 , " Maximum Z mass (GeV/c^2)" };
104+ Configurable<float > hadronPtMin{" hadronPtMin" , 0.5 , " Minimum hadron pT for correlation" };
105+
100106 // flag for THn
101107 Configurable<bool > isTHnElectron{" isTHnElectron" , true , " Enables THn for electrons" };
102108 Configurable<float > ptTHnThresh{" ptTHnThresh" , 5.0 , " Threshold for THn make" };
@@ -126,7 +132,14 @@ struct HfTaskElectronWeakBoson {
126132 };
127133 std::vector<HfElectronCandidate> selectedElectronsIso;
128134 std::vector<HfElectronCandidate> selectedElectronsAss;
129- std::vector<HfElectronCandidate> reconstructedZ;
135+
136+ struct ZeeCandidate {
137+ float pt, eta, phi, mass, ptchild0, ptchild1;
138+ int charge;
139+ ZeeCandidate (float ptr, float e, float ph, float m, int ch, float ptzee0, float ptzee1)
140+ : pt(ptr), eta(e), phi(ph), mass(m), ptchild0(ptzee0), ptchild1(ptzee1), charge(ch) {}
141+ };
142+ std::vector<ZeeCandidate> reconstructedZ;
130143
131144 using SelectedClusters = o2::aod::EMCALClusters;
132145 // PbPb
@@ -140,7 +153,7 @@ struct HfTaskElectronWeakBoson {
140153 Filter eventFilter = (o2::aod::evsel::sel8 == true );
141154 Filter posZFilter = (nabs(o2::aod::collision::posZ) < vtxZ);
142155
143- Filter etafilter = (aod::track::eta < etaTrMax) && (aod::track::eta > etaTrMim );
156+ Filter etafilter = (aod::track::eta < etaTrMax) && (aod::track::eta > etaTrMin );
144157 Filter dcaxyfilter = (nabs(aod::track::dcaXY) < dcaxyMax);
145158 Filter filterGlobalTr = requireGlobalTrackInFilter();
146159
@@ -197,6 +210,9 @@ struct HfTaskElectronWeakBoson {
197210 const AxisSpec axisIsoTrack{15 , -0.5 , 14.5 , " Isolation Track" };
198211 const AxisSpec axisInvMassZ{150 , 0 , 150 , " M_{ee} (GeV/c^{2})" };
199212 const AxisSpec axisTrigger{3 , -0.5 , 2.5 , " Trigger status of zorro" };
213+ const AxisSpec axisDPhiZh{64 , -TMath::Pi () / 2 , 3 * TMath::Pi () / 2 , " #Delta#phi(Z-h)" };
214+ const AxisSpec axisPtHadron{50 , 0 , 50 , " p_{T,hadron} (GeV/c)" };
215+ const AxisSpec axisZpt{50 , 0 , 100 , " p_{T,Z} (GeV/c)" };
200216
201217 // create registrygrams
202218 registry.add (" hZvtx" , " Z vertex" , kTH1F , {axisZvtx});
@@ -230,6 +246,11 @@ struct HfTaskElectronWeakBoson {
230246 registry.add (" hTHnElectrons" , " electron info" , HistType::kTHnSparseF , {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack});
231247 registry.add (" hTHnTrMatch" , " Track EMC Match" , HistType::kTHnSparseF , {axisPt, axisdPhi, axisdEta});
232248
249+ // Z-hadron correlation histograms
250+ registry.add (" hZHadronDphi" , " Z-hadron #Delta#phi correlation" , kTH2F , {{axisDPhiZh}, {axisPtHadron}});
251+ registry.add (" hZHadronDphiVsZpt" , " Z-hadron #Delta#phi vs Z p_{T}" , kTH2F , {{axisDPhiZh}, {axisZpt}});
252+ registry.add (" hZptSpectrum" , " Z boson p_{T} spectrum" , kTH1F , {axisZpt});
253+
233254 // hisotgram for EMCal trigger
234255 registry.add (" hEMCalTrigger" , " EMCal trigger" , kTH1F , {axisTrigger});
235256 }
@@ -313,6 +334,12 @@ struct HfTaskElectronWeakBoson {
313334
314335 KFPTrack kfpTrackAssEle = createKFPTrackFromTrack (track);
315336 KFParticle kfpAssEle (kfpTrackAssEle, pdgAss);
337+ // reco by RecoDecay
338+ auto arr1 = RecoDecayPtEtaPhi::pVector (kfpIsoEle.GetPt (), kfpIsoEle.GetEta (), kfpIsoEle.GetPhi ());
339+ auto arr2 = RecoDecayPtEtaPhi::pVector (kfpAssEle.GetPt (), kfpAssEle.GetEta (), kfpAssEle.GetPhi ());
340+ double massZeeRecoDecay = RecoDecay::m (std::array{arr1, arr2}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron});
341+
342+ // reco by KFparticle
316343 const KFParticle* electronPairs[2 ] = {&kfpIsoEle, &kfpAssEle};
317344 KFParticle zeeKF;
318345 zeeKF.SetConstructMethod (kfConstructMethod);
@@ -326,19 +353,24 @@ struct HfTaskElectronWeakBoson {
326353 float massZee, massZeeErr;
327354 zeeKF.GetMass (massZee, massZeeErr);
328355 // LOG(info) << "Invarimass cal by KF particle mass = " << massZee;
356+ // LOG(info) << "Invarimass cal by RecoDecay = " << massZeeRecoDecay;
329357
330358 if (track.sign () * charge > 0 ) {
331359 registry.fill (HIST (" hKfInvMassZeeLs" ), kfpIsoEle.GetPt (), massZee);
360+ registry.fill (HIST (" hInvMassZeeLs" ), kfpIsoEle.GetPt (), massZeeRecoDecay);
332361 } else {
333362 registry.fill (HIST (" hKfInvMassZeeUls" ), kfpIsoEle.GetPt (), massZee);
363+ registry.fill (HIST (" hInvMassZeeUls" ), kfpIsoEle.GetPt (), massZeeRecoDecay);
334364 }
335365
336366 reconstructedZ.emplace_back (
337367 zeeKF.GetPt (),
338368 zeeKF.GetEta (),
339369 zeeKF.GetPhi (),
340370 massZee,
341- track.sign () * charge);
371+ track.sign () * charge,
372+ kfpIsoEle.GetPt (),
373+ kfpAssEle.GetPt ());
342374 }
343375 }
344376
@@ -420,8 +452,6 @@ struct HfTaskElectronWeakBoson {
420452 continue ;
421453 if (track.itsNCls () < nclItsMin)
422454 continue ;
423- if (track.pt () < ptMin)
424- continue ;
425455
426456 registry.fill (HIST (" hEta" ), track.eta ());
427457 registry.fill (HIST (" hITSchi2" ), track.itsChi2NCl ());
@@ -434,7 +464,7 @@ struct HfTaskElectronWeakBoson {
434464
435465 float energyTrk = 0.0 ;
436466
437- if (track.tpcNSigmaEl () > nsigTpcMinLose && track. tpcNSigmaEl () < nsigTpcMax && track. pt () > ptZeeMin ) {
467+ if (track.pt () > ptAssMin ) {
438468 selectedElectronsAss.emplace_back (
439469 track.pt (),
440470 track.eta (),
@@ -443,6 +473,9 @@ struct HfTaskElectronWeakBoson {
443473 track.sign ());
444474 }
445475
476+ if (track.pt () < ptMin)
477+ continue ;
478+
446479 // track - match
447480
448481 // continue;
@@ -547,7 +580,6 @@ struct HfTaskElectronWeakBoson {
547580 }
548581 }
549582 }
550-
551583 nMatch++;
552584 }
553585 }
@@ -558,14 +590,17 @@ struct HfTaskElectronWeakBoson {
558590 }
559591
560592 } // end of track loop
561-
593+ /*
562594 // calculate inv. mass
563595 if (selectedElectronsIso.size() > 0) {
564596 for (size_t i = 0; i < selectedElectronsIso.size(); i++) {
565597 const auto& e1 = selectedElectronsIso[i];
566598 for (size_t j = 0; j < selectedElectronsAss.size(); j++) {
567599 const auto& e2 = selectedElectronsAss[j];
568-
600+ if (std::abs(e2.nSigEl) > nsigTpcMax)
601+ continue;
602+ if (e2.pt < ptZeeMin)
603+ continue;
569604 float ptIso = e1.pt;
570605 float ptAss = e2.pt;
571606 if (ptIso == ptAss)
@@ -582,6 +617,30 @@ struct HfTaskElectronWeakBoson {
582617 }
583618 }
584619 } // end of inv. mass calculation
620+ */
621+ // Z-hadron
622+ if (reconstructedZ.size () > 0 ) {
623+ for (const auto & zBoson : reconstructedZ) {
624+ // Z boson selection
625+ if (zBoson.mass < zMassMin || zBoson.mass > zMassMax)
626+ continue ;
627+ registry.fill (HIST (" hZptSpectrum" ), zBoson.pt );
628+ for (const auto & trackAss : selectedElectronsAss) {
629+ if (std::abs (trackAss.pt - zBoson.ptchild0 ) < ptMatch)
630+ continue ;
631+ if (std::abs (trackAss.pt - zBoson.ptchild1 ) < ptMatch)
632+ continue ;
633+ // calculate Z-h correlation
634+ double deltaPhi = trackAss.phi - zBoson.phi ;
635+ while (deltaPhi < -TMath::Pi () / 2 )
636+ deltaPhi += 2 * TMath::Pi ();
637+ while (deltaPhi > 3 * TMath::Pi () / 2 )
638+ deltaPhi -= 2 * TMath::Pi ();
639+ registry.fill (HIST (" hZHadronDphi" ), deltaPhi, trackAss.pt );
640+ registry.fill (HIST (" hZHadronDphiVsZpt" ), deltaPhi, zBoson.pt );
641+ }
642+ }
643+ } // end of Z-hadron correlation
585644 }
586645};
587646
0 commit comments