@@ -30,46 +30,44 @@ namespace l1t {
3030 minInvMassSqrDiv2_(getOptionalParam<int64_t , double >(" minInvMass" ,
3131 config,
3232 [&](double value) {
33- return std::round (scales.to_hw_InvMassSqrDiv2 (value) *
34- cosPhiLUT_.output_scale ());
35- })),
36- maxInvMassSqrDiv2_ (getOptionalParam<int64_t , double >(" maxInvMass" ,
37- config,
38- [&](double value) {
39- return std::round (scales.to_hw_InvMassSqrDiv2 (value) *
33+ return std::floor (scales.to_hw_InvMassSqrDiv2 (value) *
4034 cosPhiLUT_.output_scale ());
4135 })),
36+ maxInvMassSqrDiv2_ (getOptionalParam<int64_t , double >(
37+ " maxInvMass" ,
38+ config,
39+ [&](double value) { return std::ceil (scales.to_hw_InvMassSqrDiv2 (value) * cosPhiLUT_.output_scale ()); })),
4240 minTransMassSqrDiv2_ (getOptionalParam<int64_t , double >(
4341 " minTransMass" ,
4442 config,
4543 [&](double value) {
46- return std::round (scales.to_hw_TransMassSqrDiv2 (value) * cosPhiLUT_.output_scale ());
44+ return std::floor (scales.to_hw_TransMassSqrDiv2 (value) * cosPhiLUT_.output_scale ());
4745 })),
4846 maxTransMassSqrDiv2_ (getOptionalParam<int64_t , double >(
4947 " maxTransMass" ,
5048 config,
5149 [&](double value) {
52- return std::round (scales.to_hw_TransMassSqrDiv2 (value) * cosPhiLUT_.output_scale ());
50+ return std::ceil (scales.to_hw_TransMassSqrDiv2 (value) * cosPhiLUT_.output_scale ());
5351 })),
5452 scaleNormalShift_ (std::round(std::log2(std::ceil(coshEtaLUT_.output_scale() / coshEtaLUT2_.output_scale())))),
5553 invMassResolutionReduceShift_([&]() {
54+ // Computation of the dynamic input two-body mass resolution w.r.t. the cut value.
55+ // The result is a resolution of inputs between 2^-15 to 2^-16 of the cut value.
5656 if (minInvMassSqrDiv2_) {
57- return std::max<int >(
58- std::ceil (std::log2 (minInvMassSqrDiv2_.value () * cosPhiLUT_.output_scale () + 1.0 )) - 16 , 0 );
57+ return std::max<int >(std::floor (std::log2 (minInvMassSqrDiv2_.value ())) + 1 - CALC_BITS, 0 );
5958 } else if (maxInvMassSqrDiv2_) {
60- return std::max<int >(std::ceil (std::log2 (maxInvMassSqrDiv2_.value () * cosPhiLUT_.output_scale ())) - 16 ,
61- 0 );
59+ return std::max<int >(std::floor (std::log2 (maxInvMassSqrDiv2_.value ())) + 1 - CALC_BITS, 0 );
6260 } else {
6361 return 0 ;
6462 }
6563 }()),
6664 transMassResolutionReduceShift_ ([&]() {
65+ // Computation of the dynamic input two-body mass resolution w.r.t. the cut value.
66+ // The result is a resolution of inputs between 2^-15 to 2^-16 of the cut value.
6767 if (minTransMassSqrDiv2_) {
68- return std::max<int >(
69- std::ceil (std::log2 (minTransMassSqrDiv2_.value () * cosPhiLUT_.output_scale () + 1.0 )) - 16 , 0 );
68+ return std::max<int >(std::floor (std::log2 (minTransMassSqrDiv2_.value ())) + 1 - CALC_BITS, 0 );
7069 } else if (maxTransMassSqrDiv2_) {
71- return std::max<int >(std::ceil (std::log2 (maxTransMassSqrDiv2_.value () * cosPhiLUT_.output_scale ())) - 16 ,
72- 0 );
70+ return std::max<int >(std::floor (std::log2 (maxTransMassSqrDiv2_.value ())) + 1 - CALC_BITS, 0 );
7371 } else {
7472 return 0 ;
7573 }
@@ -114,6 +112,7 @@ namespace l1t {
114112
115113 private:
116114 static constexpr int HW_PI = 1 << (P2GTCandidate::hwPhi_t::width - 1 ); // assumes phi in [-pi, pi)
115+ static constexpr int CALC_BITS = 16 ; // Allocate 16 bits to the calculation
117116
118117 int64_t calc2BodyInvMass (const P2GTCandidate& obj1,
119118 const P2GTCandidate& obj2,
0 commit comments