@@ -104,6 +104,7 @@ struct HfTaskElectronWeakBoson {
104104
105105 Configurable<float > rIsolation{" rIsolation" , 0.3 , " cone radius for isolation cut" };
106106 Configurable<float > energyIsolationMax{" energyIsolationMax" , 0.1 , " isolation cut on energy" };
107+ Configurable<float > momentumIsolationMax{" momentumIsolationMax" , 0.1 , " isolation cut on momentum" };
107108 Configurable<int > trackIsolationMax{" trackIsolationMax" , 3 , " Maximum number of tracks in isolation cone" };
108109
109110 Configurable<float > massZMin{" massZMin" , 60.0 , " Minimum Z mass (GeV/c^2)" };
@@ -236,18 +237,18 @@ struct HfTaskElectronWeakBoson {
236237 const AxisSpec axisNcell{50 , 0.0 , 50.0 , " Ncell" };
237238 const AxisSpec axisPhi{350 , 0 , 7 , " Phi" };
238239 const AxisSpec axisEop{200 , 0 , 2 , " E/p" };
239- const AxisSpec axisEopZneg{200 , 0 , 2 , " E/p neg" };
240- const AxisSpec axisEopZpos{200 , 0 , 2 , " E/p pos" };
240+ const AxisSpec axisEopZneg{300 , - 0.01 , 1.49 , " E/p neg" };
241+ const AxisSpec axisEopZpos{300 , - 0.01 , 1.49 , " E/p pos" };
241242 const AxisSpec axisChi2{250 , 0.0 , 25.0 , " #chi^{2}" };
242243 const AxisSpec axisCluster{100 , 0.0 , 200.0 , " counts" };
243244 const AxisSpec axisITSNCls{10 , 0.0 , 10 , " counts" };
244245 const AxisSpec axisEMCtime{100 , -50.0 , 50 , " EMC time" };
245246 const AxisSpec axisIsoEnergy{100 , 0 , 1.0 , " E_{iso}" };
246- const AxisSpec axisIsoEnergyZneg{100 , 0 , 1.0 , " E_{iso,neg}" };
247- const AxisSpec axisIsoEnergyZpos{100 , 0 , 1.0 , " E_{iso,pos}" };
247+ const AxisSpec axisIsoEnergyZneg{255 , 0 , 1.5 , " E_{iso,neg}" };
248+ const AxisSpec axisIsoEnergyZpos{255 , 0 , 1.5 , " E_{iso,pos}" };
248249 const AxisSpec axisIsoMomentum{100 , 0 , 10.0 , " Isolation momentum(GeV/C)" };
249- const AxisSpec axisIsoMomentumZneg{100 , 0 , 10 .0 , " p_{iso,neg}" };
250- const AxisSpec axisIsoMomentumZpos{100 , 0 , 10 .0 , " p_{iso,pos}" };
250+ const AxisSpec axisIsoMomentumZneg{255 , 0 , 2 .0 , " p_{iso,neg}" };
251+ const AxisSpec axisIsoMomentumZpos{255 , 0 , 2 .0 , " p_{iso,pos}" };
251252 const AxisSpec axisIsoTrack{25 , -0.5 , 24.5 , " Isolation Track" };
252253 const AxisSpec axisIsoTrackZneg{25 , -0.5 , 24.5 , " N_{isotrk,neg}" };
253254 const AxisSpec axisIsoTrackZpos{25 , -0.5 , 24.5 , " N_{isotrk,pos}" };
@@ -289,7 +290,8 @@ struct HfTaskElectronWeakBoson {
289290 registry.add (" hInvMassZee" , " invariant mass for Z ULS pair" , HistType::kTHnSparseF , {axisCentrality, axisSign, axisPt, axisInvMassZgamma});
290291 registry.add (" hKfInvMassZee" , " invariant mass for Z ULS pair KFp" , HistType::kTHnSparseF , {axisCentrality, axisSign, axisPt, axisInvMassZgamma});
291292 registry.add (" hInvMassZeeQA" , " QA for invariant mass for Z" , HistType::kTHnSparseF , {axisInvMassZ, axisPtZneg, axisPtZpos, axisDCAxyneg, axisDCAxypos, axisDCAzpos, axisNclsTPCneg, axisNclsTPCpos, axisNclsITSneg, axisNclsITSpos, axisSectorTPCneg, axisSectorTPCneg, axisEopZneg, axisEopZpos, axisIsoEnergyZneg, axisIsoEnergyZpos, axisIsoMomentumZneg, axisIsoMomentumZpos, axisIsoTrackZneg, axisIsoTrackZpos});
292- registry.add (" hTHnElectrons" , " electron info" , HistType::kTHnSparseF , {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack, axisEta, axisDedx});
293+ registry.add (" hInvMassZeeQAbg" , " QA for invariant mass for Z" , HistType::kTHnSparseF , {axisInvMassZ, axisPtZneg, axisPtZpos, axisDCAxyneg, axisDCAxypos, axisDCAzpos, axisNclsTPCneg, axisNclsTPCpos, axisNclsITSneg, axisNclsITSpos, axisSectorTPCneg, axisSectorTPCneg, axisEopZneg, axisEopZpos, axisIsoEnergyZneg, axisIsoEnergyZpos, axisIsoMomentumZneg, axisIsoMomentumZpos, axisIsoTrackZneg, axisIsoTrackZpos});
294+ registry.add (" hTHnElectrons" , " electron info" , HistType::kTHnSparseF , {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoMomentum, axisIsoTrack, axisEta, axisDedx});
293295 registry.add (" hTHnTrMatch" , " Track EMC Match" , HistType::kTHnSparseF , {axisPt, axisdPhi, axisdEta});
294296
295297 // Z-hadron correlation histograms
@@ -390,6 +392,10 @@ struct HfTaskElectronWeakBoson {
390392 if (track.sign () > 0 ) {
391393 pdgAss = kPositron ;
392394 }
395+ auto [trackCount, isoMomentum] = getIsolatedTrack (track.eta (), track.phi (), track.p (), tracks);
396+ if (isoMomentum > momentumIsolationMax) {
397+ continue ;
398+ }
393399
394400 KFPTrack kfpTrackAssEle = createKFPTrackFromTrack (track);
395401 KFParticle kfpAssEle (kfpTrackAssEle, pdgAss);
@@ -540,7 +546,7 @@ struct HfTaskElectronWeakBoson {
540546 registry.fill (HIST (" hPt" ), track.pt ());
541547 registry.fill (HIST (" hTPCNsigma" ), track.p (), track.tpcNSigmaEl ());
542548
543- float eop = 0.0 ;
549+ float eop = - 0.01 ;
544550 float isoEnergy = 1.0 ;
545551 // track isolation
546552 auto [trackCount, isoMomentum] = getIsolatedTrack (track.eta (), track.phi (), track.p (), tracks);
@@ -631,7 +637,7 @@ struct HfTaskElectronWeakBoson {
631637 isoEnergy = getIsolatedCluster (cluster, emcClusters);
632638
633639 if (match.track_as <TrackEle>().pt () > ptTHnThresh && isTHnElectron) {
634- registry.fill (HIST (" hTHnElectrons" ), match.track_as <TrackEle>().pt (), match.track_as <TrackEle>().tpcNSigmaEl (), m02Emc, eop, isoEnergy, trackCount, track.eta (), track.tpcSignal ());
640+ registry.fill (HIST (" hTHnElectrons" ), match.track_as <TrackEle>().pt (), match.track_as <TrackEle>().tpcNSigmaEl (), m02Emc, eop, isoEnergy, isoMomentum, trackCount, track.eta (), track.tpcSignal ());
635641 }
636642 // LOG(info) << "E/p" << eop;
637643 registry.fill (HIST (" hEopNsigTPC" ), match.track_as <TrackEle>().tpcNSigmaEl (), eop);
@@ -643,7 +649,7 @@ struct HfTaskElectronWeakBoson {
643649 registry.fill (HIST (" hEop" ), match.track_as <TrackEle>().pt (), eop);
644650 if (eop > eopMin && eop < eopMax && isoEnergy < energyIsolationMax)
645651 isIsolated = true ;
646- if (eop > eopMin && eop < eopMax && trackCount < trackIsolationMax)
652+ if (eop > eopMin && eop < eopMax && trackCount < trackIsolationMax && isoMomentum < momentumIsolationMax )
647653 isIsolatedTr = true ;
648654
649655 if (isIsolated && isIsolatedTr) {
@@ -729,6 +735,7 @@ struct HfTaskElectronWeakBoson {
729735 // Z->ee QA
730736 if (enableZeeRecoQA) {
731737 if (selectedElectronsIso.size () > 0 && selectedPositronsIso.size () > 0 ) {
738+ // signal
732739 for (const auto & trackEle : selectedElectronsIso) {
733740 for (const auto & trackPos : selectedPositronsIso) {
734741 auto child1 = RecoDecayPtEtaPhi::pVector (trackEle.pt , trackEle.eta , trackEle.phi );
@@ -737,12 +744,43 @@ struct HfTaskElectronWeakBoson {
737744 if (invMass > massZMinQA) {
738745 float sectorneg = trackEle.phi / o2::constants::math::SectorSpanRad;
739746 float sectorpos = trackPos.phi / o2::constants::math::SectorSpanRad;
740- // LOG(info) << "TPC sector= " << sectorneg << " ; " << sectorpos;
741747 registry.fill (HIST (" hInvMassZeeQA" ), invMass, trackEle.pt , trackPos.pt , trackEle.dcaxyTrk , trackPos.dcaxyTrk , trackPos.dcazTrk , trackEle.nclusterTPC , trackPos.nclusterTPC , trackEle.nclusterITS , trackPos.nclusterITS , sectorneg, sectorpos, trackEle.eop , trackPos.eop , trackEle.energyIso , trackPos.energyIso , trackEle.momIso , trackPos.momIso , trackEle.ntrackIso , trackPos.ntrackIso );
742748 }
743749 }
744750 }
745- }
751+ // bg e-e-
752+ for (const auto & trackEle : selectedElectronsIso) {
753+ for (const auto & trackEle2 : selectedElectronsIso) {
754+ if (trackEle.pt == trackEle2.pt ) {
755+ continue ;
756+ }
757+ auto child1 = RecoDecayPtEtaPhi::pVector (trackEle.pt , trackEle.eta , trackEle.phi );
758+ auto child2 = RecoDecayPtEtaPhi::pVector (trackEle2.pt , trackEle2.eta , trackEle2.phi );
759+ double invMass = RecoDecay::m (std::array{child1, child2}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron});
760+ if (invMass > massZMinQA) {
761+ float sectorneg = trackEle.phi / o2::constants::math::SectorSpanRad;
762+ float sectorpos = trackEle2.phi / o2::constants::math::SectorSpanRad;
763+ registry.fill (HIST (" hInvMassZeeQAbg" ), invMass, trackEle.pt , trackEle2.pt , trackEle.dcaxyTrk , trackEle2.dcaxyTrk , trackEle2.dcazTrk , trackEle.nclusterTPC , trackEle2.nclusterTPC , trackEle.nclusterITS , trackEle2.nclusterITS , sectorneg, sectorpos, trackEle.eop , trackEle2.eop , trackEle.energyIso , trackEle2.energyIso , trackEle.momIso , trackEle2.momIso , trackEle.ntrackIso , trackEle2.ntrackIso );
764+ }
765+ }
766+ }
767+ // bg e+e+
768+ for (const auto & trackPos : selectedPositronsIso) {
769+ for (const auto & trackPos2 : selectedPositronsIso) {
770+ if (trackPos.pt == trackPos2.pt ) {
771+ continue ;
772+ }
773+ auto child1 = RecoDecayPtEtaPhi::pVector (trackPos.pt , trackPos.eta , trackPos.phi );
774+ auto child2 = RecoDecayPtEtaPhi::pVector (trackPos2.pt , trackPos2.eta , trackPos2.phi );
775+ double invMass = RecoDecay::m (std::array{child1, child2}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron});
776+ if (invMass > massZMinQA) {
777+ float sectorneg = trackPos.phi / o2::constants::math::SectorSpanRad;
778+ float sectorpos = trackPos2.phi / o2::constants::math::SectorSpanRad;
779+ registry.fill (HIST (" hInvMassZeeQAbg" ), invMass, trackPos.pt , trackPos2.pt , trackPos.dcaxyTrk , trackPos2.dcaxyTrk , trackPos2.dcazTrk , trackPos.nclusterTPC , trackPos2.nclusterTPC , trackPos.nclusterITS , trackPos2.nclusterITS , sectorneg, sectorpos, trackPos.eop , trackPos2.eop , trackPos.energyIso , trackPos2.energyIso , trackPos.momIso , trackPos2.momIso , trackPos.ntrackIso , trackPos2.ntrackIso );
780+ }
781+ }
782+ }
783+ } // check arrays aren't empty
746784 } // end of Z->ee QA
747785 } // process
748786}; // struct HfTaskElectronWeakBoson
0 commit comments