Actually write out the variables into the map.
< number of clusters with Elab > m_EminLab outside of high background endcap region
< number of clusters with Elab > m_EminLab4Cluster outside of high background endcap region
< number of clusters with Elab > m_EminLab3Cluster outside of high background endcap region
< number of clusters with Ecms > m_Ehigh outside of high background endcap region
86 calculationResult[
"nTrkLoose"] = 0;
87 calculationResult[
"nTrkTight"] = 0;
88 calculationResult[
"ee2leg"] = 0;
89 calculationResult[
"nEmedium"] = 0;
90 calculationResult[
"nElow"] = 0;
91 calculationResult[
"nEhigh"] = 0;
92 calculationResult[
"nE180Lab"] = 0;
93 calculationResult[
"nE300Lab"] = 0;
94 calculationResult[
"nE500Lab"] = 0;
95 calculationResult[
"nE2000CMS"] = 0;
96 calculationResult[
"nE4000CMS"] = 0;
97 calculationResult[
"nE250Lab"] = 0;
98 calculationResult[
"nMaxEPhotonAcc"] = 0;
99 calculationResult[
"dphiCmsClust"] = NAN;
101 calculationResult[
"netChargeLoose"] = 0;
102 calculationResult[
"maximumPCMS"] = NAN;
103 calculationResult[
"maximumPLab"] = NAN;
104 calculationResult[
"eexx"] = 0;
105 calculationResult[
"ee1leg1trk"] = 0;
106 calculationResult[
"nEhighLowAng"] = 0;
107 calculationResult[
"nEsingleClust"] = 0;
108 calculationResult[
"nEsinglePhotonBarrel"] = 0;
109 calculationResult[
"nEsinglePhotonExtendedBarrel"] = 0;
110 calculationResult[
"nEsinglePhotonEndcap"] = 0;
111 calculationResult[
"nEsingleElectronBarrel"] = 0;
112 calculationResult[
"nEsingleElectronExtendedBarrel"] = 0;
113 calculationResult[
"nReducedEsinglePhotonReducedBarrel"] = 0;
114 calculationResult[
"nVetoClust"] = 0;
115 calculationResult[
"chrgClust2GeV"] = 0;
116 calculationResult[
"neutClust045GeVAcc"] = 0;
117 calculationResult[
"neutClust045GeVBarrel"] = 0;
118 calculationResult[
"singleTagLowMass"] = 0;
119 calculationResult[
"singleTagHighMass"] = 0;
120 calculationResult[
"n2GeVNeutBarrel"] = 0;
121 calculationResult[
"n2GeVNeutEndcap"] = 0;
122 calculationResult[
"n2GeVChrg"] = 0;
123 calculationResult[
"n2GeVPhotonBarrel"] = 0;
124 calculationResult[
"n2GeVPhotonEndcap"] = 0;
125 calculationResult[
"ee1leg"] = 0;
126 calculationResult[
"ee1leg1clst"] = 0;
127 calculationResult[
"ee1leg1e"] = 0;
128 calculationResult[
"ee2clst"] = 0;
129 calculationResult[
"gg2clst"] = 0;
130 calculationResult[
"eeee"] = 0;
131 calculationResult[
"eemm"] = 0;
132 calculationResult[
"eexxSelect"] = 0;
133 calculationResult[
"radBhabha"] = 0;
134 calculationResult[
"eeBrem"] = 0;
135 calculationResult[
"isrRadBhabha"] = 0;
136 calculationResult[
"muonPairECL"] = 0;
137 calculationResult[
"selectee1leg1trk"] = 0;
138 calculationResult[
"selectee1leg1clst"] = 0;
139 calculationResult[
"selectee"] = 0;
140 calculationResult[
"ggBarrelVL"] = 0;
141 calculationResult[
"ggBarrelLoose"] = 0;
142 calculationResult[
"ggBarrelTight"] = 0;
143 calculationResult[
"ggEndcapVL"] = 0;
144 calculationResult[
"ggEndcapLoose"] = 0;
145 calculationResult[
"ggEndcapTight"] = 0;
146 calculationResult[
"muonPairV"] = 0;
147 calculationResult[
"selectmumu"] = 0;
148 calculationResult[
"singleMuon"] = 0;
149 calculationResult[
"cosmic"] = 0;
150 calculationResult[
"displacedVertex"] = 0;
151 calculationResult[
"eeFlat0"] = 0;
152 calculationResult[
"eeFlat1"] = 0;
153 calculationResult[
"eeFlat2"] = 0;
154 calculationResult[
"eeFlat3"] = 0;
155 calculationResult[
"eeFlat4"] = 0;
156 calculationResult[
"eeFlat5"] = 0;
157 calculationResult[
"eeFlat6"] = 0;
158 calculationResult[
"eeFlat7"] = 0;
159 calculationResult[
"eeFlat8"] = 0;
160 calculationResult[
"eeOneClust"] = 0;
163 calculationResult[
"nTrkLooseB"] = 0;
164 calculationResult[
"nTrkTightB"] = 0;
165 calculationResult[
"maximumPCMSB"] = NAN;
166 calculationResult[
"netChargeLooseB"] = 0;
167 calculationResult[
"muonPairVB"] = 0;
168 calculationResult[
"eeBremB"] = 0;
169 calculationResult[
"singleTagLowMassB"] = 0;
170 calculationResult[
"singleTagHighMassB"] = 0;
171 calculationResult[
"radBhabhaB"] = 0;
176 calculationResult[
"l1_trigger_random"] =
m_l1Trigger->getTimType() == TRGSummary::ETimingType::TTYP_RAND;
177 calculationResult[
"l1_trigger_delayed_bhabha"] =
m_l1Trigger->getTimType() == TRGSummary::ETimingType::TTYP_DPHY;
178 calculationResult[
"l1_trigger_poisson"] =
m_l1Trigger->getTimType() == TRGSummary::ETimingType::TTYP_POIS;
182 }
catch (
const std::exception&) {
188 }
catch (
const std::exception&) {
194 }
catch (
const std::exception&) {
200 }
catch (
const std::exception&) {
203 calculationResult[
"bha3d"] = bha3d;
204 calculationResult[
"bhapur"] = bhapurPsnm;
205 calculationResult[
"bhapur_lml1"] = lml1 and bhapurFtdl;
207 calculationResult[
"l1_trigger_random"] = 1;
208 calculationResult[
"l1_trigger_delayed_bhabha"] = 0;
209 calculationResult[
"l1_trigger_poisson"] = 0;
210 calculationResult[
"bha3d"] = 0;
211 calculationResult[
"bhapur"] = 0;
212 calculationResult[
"bhapur_lml1"] = 0;
216 calculationResult[
"l1_trg_NN_info"] = 0;
217 if (
m_bitsNN.isValid() and
m_bitsNN.getEntries() > 0) {calculationResult[
"l1_trg_NN_info"] = 1;}
219 calculationResult[
"true"] = 1;
220 calculationResult[
"false"] = 0;
225 const ROOT::Math::XYZVector clustervertex = cUtil.
GetIPPosition();
227 ROOT::Math::PxPyPzEVector p4ofCOM;
228 p4ofCOM.SetPxPyPzE(0, 0, 0, boostrotate.
getCMSEnergy());
231 std::map<short, std::optional<MaximumPtTrack>> maximumPtTracks = {
236 std::map<short, std::optional<MaximumPtTrack>> maximumPtTracksWithoutZCut = {
243 if (not trackFitResult) {
249 if (trackFitResult->getHitPatternCDC().getNHits() == 0) {
254 const double z0 = trackFitResult->getZ0();
256 calculationResult[
"nTrkTight"] += 1;
260 const short charge = trackFitResult->getChargeSign();
265 const ROOT::Math::PxPyPzEVector& momentumLab = trackFitResult->get4Momentum();
266 const ROOT::Math::PxPyPzEVector momentumCMS = boostrotate.
rotateLabToCms() * momentumLab;
267 double pCMS = momentumCMS.P();
268 double pLab = momentumLab.P();
271 const double pT = trackFitResult->getTransverseMomentum();
272 const auto& currentMaximum = maximumPtTracksWithoutZCut.at(charge);
273 if (not currentMaximum or pT > currentMaximum->pT) {
276 newMaximum.
track = &track;
277 newMaximum.
pCMS = pCMS;
278 newMaximum.
pLab = pLab;
279 newMaximum.
p4CMS = momentumCMS;
280 newMaximum.
p4Lab = momentumLab;
281 maximumPtTracksWithoutZCut[
charge] = newMaximum;
286 calculationResult[
"nTrkLoose"] += 1;
287 calculationResult[
"netChargeLoose"] +=
charge;
289 if (std::isnan(calculationResult[
"maximumPCMS"]) or pCMS > calculationResult[
"maximumPCMS"]) {
290 calculationResult[
"maximumPCMS"] = pCMS;
293 if (std::isnan(calculationResult[
"maximumPLab"]) or pLab > calculationResult[
"maximumPLab"]) {
294 calculationResult[
"maximumPLab"] = pLab;
298 const double pTLoose = trackFitResult->getTransverseMomentum();
299 const auto& currentMaximumLoose = maximumPtTracks.at(charge);
300 if (not currentMaximumLoose or pTLoose > currentMaximumLoose->pT) {
302 newMaximum.
pT = pTLoose;
303 newMaximum.
track = &track;
304 newMaximum.
pCMS = pCMS;
305 newMaximum.
pLab = momentumLab.P();
306 newMaximum.
p4CMS = momentumCMS;
307 newMaximum.
p4Lab = momentumLab;
308 maximumPtTracks[
charge] = newMaximum;
314 if (trackFitResult->getHitPatternCDC().getNHits() >= 5) {
315 if (std::abs(z0) < 1.) {calculationResult[
"nTrkTightB"] += 1;}
316 if (std::abs(z0) < 5.) {
317 calculationResult[
"nTrkLooseB"] += 1;
318 calculationResult[
"netChargeLooseB"] +=
charge;
319 if (std::isnan(calculationResult[
"maximumPCMSB"]) or pCMS > calculationResult[
"maximumPCMSB"]) {
320 calculationResult[
"maximumPCMSB"] = pCMS;
330 std::vector<SelectedECLCluster> selectedClusters;
333 const double time = cluster.getTime();
335 std::abs(time) > 200 or
340 const double dt99 = cluster.getDeltaTime99();
347 selectedCluster.
cluster = &cluster;
351 selectedCluster.
isTrack = cluster.isTrack();
353 selectedClusters.push_back(selectedCluster);
356 calculationResult[
"nElow"] += 1;
359 calculationResult[
"nEmedium"] += 1;
362 calculationResult[
"nEhigh"] += 1;
366 calculationResult[
"nVetoClust"] += 1;
371 const double thetaLab = selectedCluster.
p4Lab.Theta() * TMath::RadToDeg();
372 const double zmva = cluster.getZernikeMVA();
373 const bool photon = zmva > 0.5 and not selectedCluster.
isTrack;
374 const bool electron = zmva > 0.5 and selectedCluster.
isTrack;
378 calculationResult[
"chrgClust2GeV"] += 1;
381 const bool isInAcceptance = 17. < thetaLab and thetaLab < 150.;
382 if (isInAcceptance) {calculationResult[
"neutClust045GeVAcc"] += 1;}
383 const bool isInBarrel = 30. < thetaLab and thetaLab < 130.;
384 if (isInBarrel) {calculationResult[
"neutClust045GeVBarrel"] += 1;}
389 const bool notInHighBackgroundEndcapRegion = 18.5 < thetaLab and thetaLab < 139.3;
391 calculationResult[
"nE180Lab"] += 1;
395 calculationResult[
"nE300Lab"] += 1;
399 calculationResult[
"nE500Lab"] += 1;
402 if (selectedCluster.
energyCMS >
m_Ehigh and notInHighBackgroundEndcapRegion) {
403 calculationResult[
"nE2000CMS"] += 1;
408 calculationResult[
"nE250Lab"] += 1;
411 calculationResult[
"nE4000CMS"] += 1;
416 calculationResult[
"nEsingleClust"] += 1;
418 const bool barrelRegion = thetaLab > 45 and thetaLab < 115;
419 const bool extendedBarrelRegion = thetaLab > 30 and thetaLab < 130;
420 const bool endcapRegion = (thetaLab > 22 and thetaLab < 45) or (thetaLab > 115 and thetaLab < 145);
422 if (photon and barrelRegion) {
423 calculationResult[
"nEsinglePhotonBarrel"] += 1;
426 if (photon and extendedBarrelRegion) {
427 calculationResult[
"nEsinglePhotonExtendedBarrel"] += 1;
430 if (electron and barrelRegion) {
431 calculationResult[
"nEsingleElectronBarrel"] += 1;
434 if (electron and extendedBarrelRegion) {
435 calculationResult[
"nEsingleElectronExtendedBarrel"] += 1;
438 if (photon and endcapRegion) {
439 calculationResult[
"nEsinglePhotonEndcap"] += 1;
444 const bool reducedBarrelRegion = thetaLab > 44 and thetaLab < 98;
446 if (photon and reducedBarrelRegion) {
447 calculationResult[
"nReducedEsinglePhotonReducedBarrel"] += 1;
453 const bool barrelRegion = thetaLab > 32 and thetaLab < 130;
454 const bool endcapRegion = (thetaLab > 22 and thetaLab < 32) or (thetaLab > 130 and thetaLab < 145);
455 const bool lowAngleRegion = thetaLab < 22 or thetaLab > 145;
457 if (not selectedCluster.
isTrack and barrelRegion) {
458 calculationResult[
"n2GeVNeutBarrel"] += 1;
460 if (not selectedCluster.
isTrack and endcapRegion) {
461 calculationResult[
"n2GeVNeutEndcap"] += 1;
463 if (selectedCluster.
isTrack and not lowAngleRegion) {
464 calculationResult[
"n2GeVChrg"] += 1;
466 if (lowAngleRegion) {
467 calculationResult[
"nEhighLowAng"] += 1;
469 if (photon and barrelRegion) {
470 calculationResult[
"n2GeVPhotonBarrel"] += 1;
472 if (photon and endcapRegion) {
473 calculationResult[
"n2GeVPhotonEndcap"] += 1;
477 std::sort(selectedClusters.begin(), selectedClusters.end(), [](
const auto & lhs,
const auto & rhs) {
478 return lhs.energyCMS > rhs.energyCMS;
482 for (
short charge : { -1, 1}) {
483 auto& maximumPtTrack = maximumPtTracks.at(charge);
484 if (not maximumPtTrack) {
490 for (
auto& cluster : maximumPtTrack->track->getRelationsTo<
ECLCluster>()) {
495 maximumPtTrack->clusterEnergySumCMS =
496 maximumPtTrack->clusterEnergySumLab * maximumPtTrack->pCMS / maximumPtTrack->pLab;
499 if (maximumPtTrack->clusterEnergySumCMS > 4.5) {
500 calculationResult[
"ee1leg"] = 1;
504 if (maximumPtTrack->pCMS > 3 and maximumPtTrack->clusterEnergySumLab > 0. and maximumPtTrack->clusterEnergySumLab < 1.) {
505 calculationResult[
"singleMuon"] = 1;
510 if (maximumPtTracks.at(-1) and maximumPtTracks.at(1)) {
514 double dphi = std::abs(negativeTrack.
p4CMS.Phi() - positiveTrack.
p4CMS.Phi()) * TMath::RadToDeg();
521 const double negativeP = negativeTrack.
pCMS;
524 const double positiveP = positiveTrack.
pCMS;
527 const double thetaSum = (negativeTrack.
p4CMS.Theta() + positiveTrack.
p4CMS.Theta()) * TMath::RadToDeg();
528 const double dthetaSum = std::abs(thetaSum - 180);
529 const auto back2back = dphi > 175 and dthetaSum < 15;
530 if (back2back and negativeClusterSum > 3 and positiveClusterSum > 3 and
531 (negativeClusterSum > 4.5 or positiveClusterSum > 4.5)) {
532 calculationResult[
"ee2leg"] = 1;
536 if (back2back and ((negativeClusterSum > 4.5 and positiveP > 3) or (positiveClusterSum > 4.5 and negativeP > 3))) {
537 calculationResult[
"ee1leg1trk"] = 1;
542 if ((negativeClusterSum > 4.5 and positiveClusterSum > 0.8 * positiveP) or
543 (positiveClusterSum > 4.5 and negativeClusterSum > 0.8 * negativeP)) {
544 calculationResult[
"ee1leg1e"] = 1;
548 const ROOT::Math::PxPyPzEVector p4Miss = p4ofCOM - negativeTrack.
p4CMS - positiveTrack.
p4CMS;
549 const double pmissTheta = p4Miss.Theta() * TMath::RadToDeg();
550 const double pmissp = p4Miss.P();
554 const bool electronEP = positiveClusterSum > 0.8 * positiveP or negativeClusterSum > 0.8 * negativeP;
555 const bool notMuonPair = negativeClusterSumLab > 1 or positiveClusterSumLab > 1;
556 const double highp = std::max(negativeP, positiveP);
557 const double lowp = std::min(negativeP, positiveP);
558 const bool lowEdep = negativeClusterSumLab < 0.5 and positiveClusterSumLab < 0.5;
561 if (calculationResult[
"maximumPCMS"] < 2 and dphi > 160 and (pmissTheta < 25. or pmissTheta > 155.)) {
562 calculationResult[
"eexxSelect"] = 1;
564 calculationResult[
"eeee"] = 1;
566 calculationResult[
"eemm"] = 1;
571 if ((pmissTheta < 20. or pmissTheta > 160.) and
572 ((calculationResult[
"maximumPCMS"] < 1.2 and dphi > 150.) or
573 (calculationResult[
"maximumPCMS"] < 2. and 175. < dphi))) {
574 calculationResult[
"eexx"] = 1;
578 if (negativeP > 1. and pmissTheta > 10. and pmissTheta < 170. and positiveP > 1. and dphi < 170. and pmissp > 1. and electronEP) {
579 if (calculationResult[
"nTrkLoose"] == 2 and calculationResult[
"nTrkTight"] >= 1) {
580 calculationResult[
"radBhabha"] = 1;
582 if (calculationResult[
"nTrkLooseB"] == 2 and calculationResult[
"nTrkTightB"] >= 1) {
583 calculationResult[
"radBhabhaB"] = 1;
588 if (negativeP > 2. and positiveP > 2. and 2 == calculationResult[
"nTrkLoose"] and
589 calculationResult[
"nTrkTight"] >= 1 and dphi > 175. and
590 (pmissTheta < 5. or pmissTheta > 175.) and electronEP) {
591 calculationResult[
"isrRadBhabha"] = 1;
595 if (highp > 4.5 and notMuonPair and pmissp > 1. and (relMissAngle0 < 5. or relMissAngle1 < 5.)) {
596 if (calculationResult[
"nTrkLoose"] == 2) { calculationResult[
"eeBrem"] = 1;}
597 if (calculationResult[
"nTrkLooseB"] >= 1) { calculationResult[
"eeBremB"] = 1;}
601 if (highp > 4.5 and lowEdep and thetaSum > 175. and thetaSum < 185. and dphi > 175.) {
602 if (calculationResult[
"nTrkLoose"] == 2) {calculationResult[
"muonPairV"] = 1;}
603 if (calculationResult[
"nTrkLooseB"] == 2) {calculationResult[
"muonPairVB"] = 1;}
607 if (highp > 3. and lowp > 2.5 and dphi > 165. and
608 ((negativeClusterSumLab > 0. and negativeClusterSumLab < 1.) or
609 (positiveClusterSumLab > 0. and positiveClusterSumLab < 1.))) {
610 calculationResult[
"selectmumu"] = 1;
615 if (selectedClusters.size() >= 2) {
619 double dphi = std::abs(firstCluster.
p4CMS.Phi() - secondCluster.
p4CMS.Phi()) * TMath::RadToDeg();
623 double thetaSum = (firstCluster.
p4CMS.Theta() + secondCluster.
p4CMS.Theta()) * TMath::RadToDeg();
624 double dthetaSum = std::abs(thetaSum - 180);
627 calculationResult[
"dphiCmsClust"] = dphi;
628 for (
int ic = 0; ic < 2; ic++) {
629 const double thetaLab = selectedClusters[ic].p4Lab.Theta() * TMath::RadToDeg();
630 const bool isInAcceptance = 17. < thetaLab and thetaLab < 150.;
631 const ECLCluster* cluster = selectedClusters[ic].cluster;
632 const double zmva = cluster->getZernikeMVA();
633 const bool photon = zmva > 0.5 and not selectedClusters[ic].isTrack;
634 if (isInAcceptance and photon) {calculationResult[
"nMaxEPhotonAcc"] += 1;}
637 const double firstEnergy = firstCluster.
p4CMS.E();
638 const double secondEnergy = secondCluster.
p4CMS.E();
640 const bool highEnergetic = firstEnergy > 3 and secondEnergy > 3 and (firstEnergy > 4.5 or secondEnergy > 4.5);
642 if (dphi > 160 and dphi < 178 and dthetaSum < 15 and highEnergetic) {
643 calculationResult[
"ee2clst"] = 1;
646 if (dphi > 178 and dthetaSum < 15 and highEnergetic) {
647 calculationResult[
"gg2clst"] = 1;
650 if ((calculationResult[
"ee2clst"] == 1 or calculationResult[
"gg2clst"] == 1) and
651 calculationResult[
"ee1leg"] == 1) {
652 calculationResult[
"ee1leg1clst"] = 1;
655 const double Elab0 = firstCluster.
p4Lab.E();
656 const double Elab1 = secondCluster.
p4Lab.E();
659 if (firstEnergy > 2 and secondEnergy > 2) {
660 const double thetaLab0 = firstCluster.
p4Lab.Theta() * TMath::RadToDeg();
661 const double thetaLab1 = secondCluster.
p4Lab.Theta() * TMath::RadToDeg();
663 const bool barrel0 = 32. < thetaLab0 and thetaLab0 < 130.;
664 const bool barrel1 = 32. < thetaLab1 and thetaLab1 < 130.;
665 const bool oneClustersAbove4 = firstEnergy > 4 or secondEnergy > 4;
666 const bool oneIsNeutral = not firstCluster.
isTrack or not secondCluster.
isTrack;
667 const bool bothAreNeutral = not firstCluster.
isTrack and not secondCluster.
isTrack;
668 const bool oneIsBarrel = barrel0 or barrel1;
669 const bool dphiCutExtraLoose = dphi > 175;
670 const bool dphiCutLoose = dphi > 177;
671 const bool dphiCutTight = dphi > 177.5;
673 if (dphiCutExtraLoose and oneIsNeutral and oneIsBarrel) {
674 calculationResult[
"ggBarrelVL"] = 1;
676 if (oneClustersAbove4 and dphiCutLoose and oneIsNeutral and oneIsBarrel) {
677 calculationResult[
"ggBarrelLoose"] = 1;
679 if (oneClustersAbove4 and dphiCutTight and bothAreNeutral and oneIsBarrel) {
680 calculationResult[
"ggBarrelTight"] = 1;
682 if (dphiCutExtraLoose and oneIsNeutral and not oneIsBarrel) {
683 calculationResult[
"ggEndcapVL"] = 1;
685 if (oneClustersAbove4 and dphiCutLoose and oneIsNeutral and not oneIsBarrel) {
686 calculationResult[
"ggEndcapLoose"] = 1;
688 if (oneClustersAbove4 and dphiCutTight and bothAreNeutral and not oneIsBarrel) {
689 calculationResult[
"ggEndcapTight"] = 1;
693 const double minEnergy = std::min(Elab0, Elab1);
694 const double maxEnergy = std::max(Elab0, Elab1);
695 if (dphi > 155 and thetaSum > 165 and thetaSum < 195 and minEnergy > 0.15 and minEnergy < 0.5 and
696 maxEnergy > 0.15 and maxEnergy < 0.5) {
697 calculationResult[
"muonPairECL"] = 1;
704 double thetaFlatten = 0;
707 for (
short charge : { -1, 1}) {
708 const auto& maximumPtTrack = maximumPtTracks.at(charge);
709 if (not maximumPtTrack) {
713 if (maximumPtTrack->clusterEnergySumCMS > 1.5) {
715 double tempFlatten = 0.;
717 double tempInvMass = (maximumPtTrack->p4Lab + cluster.p4Lab).M();
718 if (tempInvMass > invMass) {
719 invMass = tempInvMass;
721 tempFlatten = cluster.p4Lab.Theta() * TMath::RadToDeg();
726 tempFlatten = maximumPtTrack->p4Lab.Theta() * TMath::RadToDeg();
728 if (invMass > 5.29) {
729 calculationResult[
"selectee1leg1clst"] = 1;
730 thetaFlatten = tempFlatten;
736 if (maximumPtTracks.at(-1) and maximumPtTracks.at(1)) {
739 const double invMass = (negativeTrack.
p4Lab + positiveTrack.
p4Lab).M();
741 calculationResult[
"selectee1leg1trk"] = 1;
744 thetaFlatten = negativeTrack.
p4Lab.Theta() * TMath::RadToDeg();
749 if ((invMass > 9.) and (missNegClust or missPosClust)) {
750 calculationResult[
"eeOneClust"] = 1;
754 if (calculationResult[
"selectee1leg1trk"] == 1 or calculationResult[
"selectee1leg1clst"] == 1) {
755 for (
int iflat = 0; iflat < 9; iflat++) {
756 const std::string& eeFlatName =
"eeFlat" + std::to_string(iflat);
757 calculationResult[eeFlatName] =
758 thetaFlatten > flatBoundaries[iflat] and thetaFlatten < flatBoundaries[iflat + 1];
759 if (calculationResult[eeFlatName]) {
760 calculationResult[
"selectee"] = 1;
766 if (calculationResult[
"nTrkLoose"] == 1 and calculationResult[
"maximumPCMS"] > 0.8 and selectedClusters.size() >= 2) {
768 decltype(selectedClusters) selectedSingleTagClusters(selectedClusters.size());
769 auto lastItem = std::copy_if(selectedClusters.begin(), selectedClusters.end(), selectedSingleTagClusters.begin(),
771 const bool isNeutralCluster = not cluster.isTrack;
772 const bool hasEnoughEnergy = cluster.energyLab > 0.1;
773 const double clusterThetaLab = cluster.p4Lab.Theta() * TMath::RadToDeg();
774 const bool isInAcceptance = 17 < clusterThetaLab and clusterThetaLab < 150.;
775 return isNeutralCluster and hasEnoughEnergy and isInAcceptance;
777 selectedSingleTagClusters.resize(std::distance(selectedSingleTagClusters.begin(), lastItem));
779 if (selectedSingleTagClusters.size() >= 2) {
781 const auto& track = maximumPtTracks.at(-1) ? *maximumPtTracks.at(-1) : *maximumPtTracks.at(1);
783 const auto& firstCluster = selectedSingleTagClusters[0];
784 const auto& secondCluster = selectedSingleTagClusters[1];
786 const ROOT::Math::PxPyPzEVector trackP4CMS = track.p4CMS;
787 const ROOT::Math::PxPyPzEVector pi0P4CMS = firstCluster.
p4CMS + secondCluster.
p4CMS;
789 const bool passPi0ECMS = pi0P4CMS.E() > 1. and pi0P4CMS.E() < 0.525 * p4ofCOM.M();
790 const double thetaSumCMS = (pi0P4CMS.Theta() + trackP4CMS.Theta()) * TMath::RadToDeg();
791 const bool passThetaSum = thetaSumCMS < 170. or thetaSumCMS > 190.;
793 double dphiCMS = std::abs(trackP4CMS.Phi() - pi0P4CMS.Phi()) * TMath::RadToDeg();
795 dphiCMS = 360 - dphiCMS;
797 const bool passdPhi = dphiCMS > 160.;
799 if (passPi0ECMS and passThetaSum and passdPhi and pi0P4CMS.M() < 0.7) {
800 calculationResult[
"singleTagLowMass"] = 1;
801 }
else if (passPi0ECMS and passThetaSum and passdPhi and pi0P4CMS.M() > 0.7) {
802 calculationResult[
"singleTagHighMass"] = 1;
808 if (calculationResult[
"nTrkLooseB"] == 1 and calculationResult[
"maximumPCMSB"] > 0.8 and selectedClusters.size() >= 2) {
810 decltype(selectedClusters) selectedSingleTagClusters(selectedClusters.size());
811 auto lastItem = std::copy_if(selectedClusters.begin(), selectedClusters.end(), selectedSingleTagClusters.begin(),
813 const bool isNeutralCluster = not cluster.isTrack;
814 const bool hasEnoughEnergy = cluster.energyLab > 0.1;
815 const double clusterThetaLab = cluster.p4Lab.Theta() * TMath::RadToDeg();
816 const bool isInAcceptance = 17 < clusterThetaLab and clusterThetaLab < 150.;
817 return isNeutralCluster and hasEnoughEnergy and isInAcceptance;
819 selectedSingleTagClusters.resize(std::distance(selectedSingleTagClusters.begin(), lastItem));
821 if (selectedSingleTagClusters.size() >= 2) {
823 const auto& track = maximumPtTracks.at(-1) ? *maximumPtTracks.at(-1) : *maximumPtTracks.at(1);
825 const auto& firstCluster = selectedSingleTagClusters[0];
826 const auto& secondCluster = selectedSingleTagClusters[1];
828 const ROOT::Math::PxPyPzEVector trackP4CMS = track.p4CMS;
829 const ROOT::Math::PxPyPzEVector pi0P4CMS = firstCluster.
p4CMS + secondCluster.
p4CMS;
831 const bool passPi0ECMS = pi0P4CMS.E() > 1. and pi0P4CMS.E() < 0.525 * p4ofCOM.M();
832 const double thetaSumCMS = (pi0P4CMS.Theta() + trackP4CMS.Theta()) * TMath::RadToDeg();
833 const bool passThetaSum = thetaSumCMS < 170. or thetaSumCMS > 190.;
835 double dphiCMS = std::abs(trackP4CMS.Phi() - pi0P4CMS.Phi()) * TMath::RadToDeg();
837 dphiCMS = 360 - dphiCMS;
839 const bool passdPhi = dphiCMS > 160.;
841 if (passPi0ECMS and passThetaSum and passdPhi and pi0P4CMS.M() < 0.7) {
842 calculationResult[
"singleTagLowMassB"] = 1;
843 }
else if (passPi0ECMS and passThetaSum and passdPhi and pi0P4CMS.M() > 0.7) {
844 calculationResult[
"singleTagHighMassB"] = 1;
852 const auto negTrack = maximumPtTracksWithoutZCut.at(-1);
853 const auto posTrack = maximumPtTracksWithoutZCut.at(1);
855 if (negTrack and posTrack) {
857 const double maxNegpT = negTrack->pT;
858 const double maxPospT = posTrack->pT;
860 auto accumulatePhotonEnergy = [](
double result,
const auto & cluster) {
865 const auto& clustersOfNegTrack = negTrack->track->getRelationsTo<
ECLCluster>();
868 const double maxClusterENeg = std::accumulate(clustersOfNegTrack.begin(), clustersOfNegTrack.end(), 0.0, accumulatePhotonEnergy);
869 const double maxClusterEPos = std::accumulate(clustersOfPosTrack.begin(), clustersOfPosTrack.end(), 0.0, accumulatePhotonEnergy);
871 const ROOT::Math::PxPyPzEVector& momentumLabNeg(negTrack->p4Lab);
872 const ROOT::Math::PxPyPzEVector& momentumLabPos(posTrack->p4Lab);
874 const double& z0Neg = negTrack->track->getTrackFitResultWithClosestMass(
Const::pion)->getZ0();
875 const double& d0Neg = negTrack->track->getTrackFitResultWithClosestMass(
Const::pion)->getD0();
876 const double& z0Pos = posTrack->track->getTrackFitResultWithClosestMass(
Const::pion)->getZ0();
877 const double& d0Pos = posTrack->track->getTrackFitResultWithClosestMass(
Const::pion)->getD0();
884 double dphiLab = std::abs(momentumLabNeg.Phi() - momentumLabPos.Phi()) * TMath::RadToDeg();
886 dphiLab = 360 - dphiLab;
889 const double thetaSumLab = (momentumLabNeg.Theta() + momentumLabPos.Theta()) * TMath::RadToDeg();
891 constexpr
double phiBackToBackTolerance = 2.;
892 constexpr
double thetaBackToBackTolerance = 2.;
893 if ((180 - dphiLab) < phiBackToBackTolerance and std::abs(180 - thetaSumLab) < thetaBackToBackTolerance) {
894 calculationResult[
"cosmic"] = 1;
902 if (maximumPtTracksWithoutZCut.at(-1) and maximumPtTracksWithoutZCut.at(1)) {
905 const auto nTrack = maximumPtTracksWithoutZCut.at(-1)->track;
908 const auto pTrack = maximumPtTracksWithoutZCut.at(1)->track;
918 const double chisq = vertexFit->
getCHIsq();
919 const int ndf = vertexFit->
getNDF();
920 const double vertexProb = TMath::Prob(chisq, ndf);
921 const auto vertexLocation = vertexFit->
getVertex();
922 const double vertexXY = vertexLocation.perp();
923 const double vertexTheta = vertexLocation.theta() * TMath::RadToDeg();
929 const ROOT::Math::PxPyPzEVector& momentumLabNeg(maximumPtTracksWithoutZCut.at(-1)->p4Lab);
930 const ROOT::Math::PxPyPzEVector& momentumLabPos(maximumPtTracksWithoutZCut.at(1)->p4Lab);
931 const double thetaSumLab = (momentumLabNeg.Theta() + momentumLabPos.Theta()) * TMath::RadToDeg();
932 double dPhiLab = std::abs(momentumLabNeg.Phi() - momentumLabPos.Phi()) * TMath::RadToDeg();
934 dPhiLab = 360 - dPhiLab;
936 const double backToBackTolerance = 10.;
937 const bool backToBackLab = std::abs(thetaSumLab - 180.) < backToBackTolerance and std::abs(dPhiLab - 180.) < backToBackTolerance;
940 const double minProbChiVertex = 0.005;
941 const double minXYVertex = 3.;
942 const double maxXYVertex = 60.;
943 const double minThetaVertex = 30.;
944 const double maxThetaVertex = 120.;
945 if (vertexProb > minProbChiVertex and vertexXY > minXYVertex and vertexXY < maxXYVertex and vertexTheta > minThetaVertex
946 and vertexTheta < maxThetaVertex
947 and not backToBackLab) {calculationResult[
"displacedVertex"] = 1;}
DataType Angle(const B2Vector3< DataType > &q) const
The angle w.r.t.
Class to provide momentum-related information from ECLClusters.
const ROOT::Math::PxPyPzEVector Get4MomentumFromCluster(const ECLCluster *cluster, ECLCluster::EHypothesisBit hypo)
Returns four momentum vector.
const ROOT::Math::XYZVector GetIPPosition()
Returns default IP position from beam parameters.
static const ChargedStable pion
charged pion particle
@ c_nPhotons
CR is split into n photons (N1)
Class to store reconstructed particles.
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
double m_EminLab
which lab energy defines nE180Lab
double m_reducedEsinglePhoton
which CMS energy defines nReducedEsingle clusters
StoreObjPtr< TRGSummary > m_l1Trigger
Store Object with the trigger result.
double m_E0min
which CMS energy defines nEmedium
double m_goodMagneticRegionZ0
maximum z0 for well understood magnetic field (cm)
double m_cosmicMinPt
which LAB pt defines a cosmic
double m_EsinglePhoton
which CMS energy defines nEsingleClust
double m_E2min
which CMS energy defines nElow
double m_tightTrkZ0
which Z0 defines a tight track
StoreArray< Track > m_tracks
Store Array of the tracks to be used.
double m_EminLab3Cluster
which lab energy defines nE500Lab
double m_Ehigh
which CMS energy defines nEhigh
StoreArray< ECLCluster > m_eclClusters
Store Array of the ecl clusters to be used.
double m_EminLab4Cluster
which lab energy defines nE300Lab
StoreArray< CDCTriggerUnpacker::NNBitStream > m_bitsNN
Store Object with the trigger NN bits.
double m_cosmicMaxClusterEnergy
which LAB cluster energy vetoes a cosmic candidate
double m_goodMagneticRegionD0
minimum d0 for well understood magnetic field, if z0 is large (cm)
double m_looseTrkZ0
which Z0 defines a loose track
Values of the result of a track fit with a given particle hypothesis.
Class that bundles various TrackFitResults.
virtual int getNDF(void) const
Get an NDF of the fit.
enum KFitError::ECode addParticle(const Particle *particle)
Add a particle to the fitter.
VertexFitKFit is a derived class from KFitBase to perform vertex-constraint kinematical fit.
double getCHIsq(void) const override
Get a chi-square of the fit.
enum KFitError::ECode doFit(void)
Perform a vertex-constraint fit.
const HepPoint3D getVertex(const int flag=KFitConst::kAfterFit) const
Get a vertex position.
B2Vector3< double > B2Vector3D
typedef for common usage with double
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Temporary data structure holding the track(s) with the maximum pT.
double pLab
the momentum magnitude in lab system
double pT
the pT of the track
ROOT::Math::PxPyPzEVector p4CMS
the 4 momentum in CMS system
double clusterEnergySumLab
the sum of related cluster energies in lab system
ROOT::Math::PxPyPzEVector p4Lab
the 4 momentum in lab system
double clusterEnergySumCMS
the sum of related cluster energies in CMS system
double pCMS
the momentum magnitude in CMS system
const Track * track
the track
Temporary data structure holding the ECL clusters used for this analysis.
double energyLab
the energy in Lab system
double clusterTime
the time of the cluster
ROOT::Math::PxPyPzEVector p4CMS
the 4 momentum in CMS system
ROOT::Math::PxPyPzEVector p4Lab
the 4 momentum in lab system
const ECLCluster * cluster
The ECL cluster.
bool isTrack
is this ECL cluster likely from a track (or a photon) = is it charged?
double energyCMS
the energy in CMS system