From 2332c5fbdbbd663c2952c58cfe0ee3ccf7e9655a Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 8 Dec 2021 14:40:15 +0100 Subject: [PATCH 1/3] Sync regionizer and tkinput updates from correlator-common --- .../l1-converters/tracks/tkinput_ref.cpp | 150 +++++++++++++++++- .../l1-converters/tracks/tkinput_ref.h | 40 ++++- .../multififo_regionizer_elements_ref.h | 8 +- .../multififo_regionizer_elements_ref.icc | 20 ++- .../multififo/multififo_regionizer_ref.cpp | 23 +-- .../multififo/multififo_regionizer_ref.h | 3 +- 6 files changed, 221 insertions(+), 23 deletions(-) diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp index f39964279204a..59f4124496607 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp @@ -42,7 +42,7 @@ l1ct::TrackInputEmulator::TrackInputEmulator(const edm::ParameterSet &iConfig) : TrackInputEmulator(parseRegion(iConfig.getParameter("region")), parseEncoding(iConfig.getParameter("trackWordEncoding")), iConfig.getParameter("bitwiseAccurate")) { - if (region_ != Region::Endcap) { + if (region_ != Region::Endcap && region_ != Region::Barrel) { edm::LogError("TrackInputEmulator") << "region '" << iConfig.getParameter("region") << "' is not yet supported"; } @@ -52,9 +52,14 @@ l1ct::TrackInputEmulator::TrackInputEmulator(const edm::ParameterSet &iConfig) iConfig.getParameter("etaPreOffs"), iConfig.getParameter("etaShift"), iConfig.getParameter("etaPostOffs"), + iConfig.getParameter("etaSigned"), region_ == Region::Endcap); configPhi(iConfig.getParameter("phiBits")); configZ0(iConfig.getParameter("z0Bits")); + if (region_ == Region::Barrel) { + //using eta LUTs for deta, no config needed + //using DSP for dphi, no config needed + } if (region_ == Region::Endcap) { configDEtaHGCal(iConfig.getParameter("dEtaHGCalBits"), iConfig.getParameter("dEtaHGCalZ0PreShift"), @@ -81,6 +86,8 @@ l1ct::TrackInputEmulator::TrackInputEmulator(Region region, Encoding encoding, b rInvToPt_(31199.5), phiScale_(0.00038349520), z0Scale_(0.00999469), + dEtaBarrelParamZ0_(0.31735), + dPhiBarrelParamC_(0.0056535), dEtaHGCalParamZ0_(-0.00655), dEtaHGCalParamRInv2C_(+0.66), dEtaHGCalParamRInv2ITanl1_(-0.72), @@ -123,6 +130,11 @@ std::pair l1ct::TrackInputEmulator::decodeTrack(ap_uint<96 l1ct::phi_t vtxPhi = convPhi(phi); // track propagation + if (region_ == Region::Barrel) { + ret.hwDEta = calcDEtaBarrel(z0, Rinv, tanl); + ret.hwDPhi = calcDPhiBarrel(z0, Rinv, tanl); + } + if (region_ == Region::Endcap) { ret.hwDEta = calcDEtaHGCal(z0, Rinv, tanl); ret.hwDPhi = calcDPhiHGCal(z0, Rinv, tanl); @@ -139,6 +151,11 @@ std::pair l1ct::TrackInputEmulator::decodeTrack(ap_uint<96 // track propagation float fDEta = 0, fDPhi = 0; // already in layer-1 units + if (region_ == Region::Barrel) { + fDEta = floatDEtaBarrel(z0, Rinv, tanl); + fDPhi = floatDPhiBarrel(z0, Rinv, tanl); + } + if (region_ == Region::Endcap) { fDEta = floatDEtaHGCal(z0, Rinv, tanl); fDPhi = floatDPhiHGCal(z0, Rinv, tanl); @@ -210,13 +227,13 @@ l1ct::glbeta_t l1ct::TrackInputEmulator::convEta(ap_int<16> tanl) const { return ret; } -void l1ct::TrackInputEmulator::configEta(int lutBits, int preOffs, int shift, int postOffs, bool endcap) { - tanlLUTSigned_ = endcap; +void l1ct::TrackInputEmulator::configEta(int lutBits, int preOffs, int shift, int postOffs, bool lutSigned, bool endcap) { + tanlLUTSigned_ = lutSigned; tanlLUTPreOffs_ = preOffs; tanlLUTPostOffs_ = postOffs; tanlLUTShift_ = shift; tanlLUT_.resize(1 << lutBits); - int etaCenter = endcap ? l1ct::Scales::makeGlbEtaRoundEven(2.5).to_int() / 2 : 0; + int etaCenter = lutSigned ? l1ct::Scales::makeGlbEtaRoundEven(2.5).to_int() / 2 : 0; int etamin = 1, etamax = -1; for (unsigned int u = 0, n = tanlLUT_.size(), h = n / 2; u < n; ++u) { int i = (tanlLUTSigned_ || (u < h)) ? int(u) : int(u) - int(n); @@ -319,6 +336,131 @@ void l1ct::TrackInputEmulator::configZ0(int bits) { z0OffsNeg_); } +float l1ct::TrackInputEmulator::floatDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { + + float ret = floatEta(tanl)-floatEta(tanl+z0.to_float()*dEtaBarrelParamZ0_); + if (debug_) { + dbgPrintf( + "flt deta for z0 %+6d Rinv %+6d tanl %+6d: eta(calo) %+8.2f eta(vtx) %+8.3f ret " + "%+8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + floatEta(tanl+z0.to_float()*dEtaBarrelParamZ0_), + floatEta(tanl), + ret); + } + return ret/l1ct::Scales::ETAPHI_LSB; +} + +l1ct::tkdeta_t l1ct::TrackInputEmulator::calcDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { + + int vtxEta = convEta(tanl); + + ap_uint<14> absZ0 = z0 >= 0 ? ap_uint<14>(z0) : ap_uint<14>(-z0); + int preSum = ((absZ0 >> dEtaBarrelZ0PreShift_) * dEtaBarrelZ0_) >> dEtaBarrelZ0PostShift_; + + int caloEta = convEta(tanl+(z0 > 0 ? 1 : -1)*((preSum + dEtaBarrelOffs_) >> dEtaBarrelBits_)); + + int ret = vtxEta-caloEta; + if (debug_) { + dbgPrintf( + "int deta for z0 %+6d Rinv %+6d tanl %+6d: preSum %+8.2f eta(calo) %+8.2f eta(vtx) %+8.3f ret " + "%+8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + preSum, + caloEta, + vtxEta, + ret); + } + return ret; +} + +//use eta LUTs +void l1ct::TrackInputEmulator::configDEtaBarrel(int dEtaBarrelBits, + int dEtaBarrelZ0PreShift, + int dEtaBarrelZ0PostShift, + float offs) { + + + dEtaBarrelBits_ = dEtaBarrelBits; + + dEtaBarrelZ0PreShift_ = dEtaBarrelZ0PreShift; + dEtaBarrelZ0PostShift_ = dEtaBarrelZ0PostShift; + dEtaBarrelZ0_ = std::round(dEtaBarrelParamZ0_ * (1 << (dEtaBarrelZ0PreShift + dEtaBarrelZ0PostShift + dEtaBarrelBits))); + + int finalShift = dEtaBarrelBits_; + dEtaBarrelOffs_ = std::round((1 << finalShift) * (0.5 + offs)); + + if (debug_) + dbgPrintf( + "Configured deta with %d bits: preshift %8d postshift %8d, offset %8d\n", + dEtaBarrelBits, + dEtaBarrelZ0PreShift_, + dEtaBarrelZ0PostShift_, + offs); + + assert(finalShift >= 0); +} + +float l1ct::TrackInputEmulator::floatDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { + float ret = dPhiBarrelParamC_ * std::abs(Rinv.to_int()); + //ret = atan(ret / sqrt(1-ret*ret)); //use linear approx for now + if (debug_) { + dbgPrintf( + "flt dphi for z0 %+6d Rinv %+6d tanl %+6d: Rinv/1k %8.2f ret %8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + std::abs(Rinv.to_int()) / 1024.0, + ret); + } + return ret; +} + +l1ct::tkdphi_t l1ct::TrackInputEmulator::calcDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { + ap_uint<14> absRinv = Rinv >= 0 ? ap_uint<14>(Rinv) : ap_uint<14>(-Rinv); + int preSum = ((absRinv >> dPhiBarrelRInvPreShift_) * dPhiBarrelC_) >> dPhiBarrelRInvPostShift_; + + if (debug_) { + dbgPrintf( + "int dphi for z0 %+6d Rinv %+6d tanl %+6d: ret %8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + (preSum + dPhiBarrelOffs_) >> dPhiBarrelBits_); + } + + return (preSum + dPhiBarrelOffs_) >> dPhiBarrelBits_; +} + +//using DSPs +void l1ct::TrackInputEmulator::configDPhiBarrel(int dPhiBarrelBits, + int dPhiBarrelRInvPreShift, + int dPhiBarrelRInvPostShift, + float offs) { + dPhiBarrelBits_ = dPhiBarrelBits; + + dPhiBarrelRInvPreShift_ = dPhiBarrelRInvPreShift; + dPhiBarrelRInvPostShift_ = dPhiBarrelRInvPostShift; + dPhiBarrelC_ = std::round(dPhiBarrelParamC_ * (1 << (dPhiBarrelRInvPreShift + dPhiBarrelRInvPostShift + dPhiBarrelBits))); + + int finalShift = dPhiBarrelBits_; + dPhiBarrelOffs_ = std::round((1 << finalShift) * (0.5 + offs)); + + if (debug_) + dbgPrintf( + "Configured dphi with %d bits: preshift %8d postshift %8d, offset %8d\n", + dPhiBarrelBits, + dPhiBarrelRInvPreShift_, + dPhiBarrelRInvPostShift_, + offs); + + assert(finalShift >= 0); +} + float l1ct::TrackInputEmulator::floatDEtaHGCal(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { float RinvScaled = Rinv.to_float() / (16 * 1024.0), RinvScaled2 = RinvScaled * RinvScaled; float invtanlScaled = (32 * 1024.0) / std::abs(tanl.to_float()), invtanlScaled2 = invtanlScaled * invtanlScaled; diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h index 672434b9ca79e..da11699126be4 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h @@ -79,7 +79,7 @@ namespace l1ct { //=== Configuration for bitwise accurate conversions === void configPt(int lutBits); - void configEta(int lutBits, int preOffs, int shift, int postOffs, bool endcap); + void configEta(int lutBits, int preOffs, int shift, int postOffs, bool lutSigned, bool endcap); void configPhi(int bits); @@ -87,6 +87,32 @@ namespace l1ct { //=== Track propagation to calo (float parametrization, no rounding) === // + // barrel DEta propagation, in layer-1 units (float parameterization, no rounding) + float floatDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; + // barrel DPhi propagation, in layer-1 units (float parameterization, no rounding) + float floatDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; + + void setDEtaBarrelParams(float pZ0) { + dEtaBarrelParamZ0_ = pZ0; + } + void setDPhiBarrelParams(float pC) { + dPhiBarrelParamC_ = pC; + } + + //=== Track propagation to calo (bitwise accurate) === + l1ct::tkdeta_t calcDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; + l1ct::tkdphi_t calcDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; + + //=== Configuration of bitwise accurate propagation to calo === + void configDEtaBarrel(int dEtaBarrelBits, + int dEtaBarrelZ0PreShift, + int dEtaBarrelZ0PostShift, + float offs = 0); + void configDPhiBarrel(int dPhiBarrelBits, + int dPhiBarrelRInvPreShift, + int dPhiBarrelRInvPostShift, + float offs = 0); + // endcap DEta propagation, in layer-1 units (float parameterization, no rounding) float floatDEtaHGCal(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; // endcap DPhi propagation, in layer-1 units (float parameterization, no rounding) @@ -132,6 +158,8 @@ namespace l1ct { void setDebug(bool debug = true) { debug_ = debug; } // access to bare LUTs + //const std::vector &dEtaBarrelLUT() const { return dEtaBarrelLUT_; } + //const std::vector &dPhiBarrelTanlLUT() const { return dPhiBarrelTanlLUT_; } const std::vector &dEtaHGCalLUT() const { return dEtaHGCalLUT_; } const std::vector &dPhiHGCalTanlLUT() const { return dPhiHGCalTanlLUT_; } const std::vector &tanlLUT() const { return tanlLUT_; } @@ -164,6 +192,10 @@ namespace l1ct { /// Main constants float rInvToPt_, phiScale_, z0Scale_; + /// Parameters for track propagation in floating point + float dEtaBarrelParamZ0_; + float dPhiBarrelParamC_; + /// Parameters for track propagation in floating point float dEtaHGCalParamZ0_, dEtaHGCalParamRInv2C_, dEtaHGCalParamRInv2ITanl1_, dEtaHGCalParamRInv2ITanl2_; float dPhiHGCalParamZ0_, dPhiHGCalParamC_; @@ -174,6 +206,12 @@ namespace l1ct { // z0 conversion parameters int z0Mult_, z0OffsPos_, z0OffsNeg_, z0BitShift_; + // deta parameters in barrel region + int dEtaBarrelBits_, dEtaBarrelZ0PreShift_, dEtaBarrelZ0PostShift_, dEtaBarrelOffs_, dEtaBarrelZ0_; + + // dphi parameters in barrel region + int dPhiBarrelBits_, dPhiBarrelRInvPreShift_, dPhiBarrelRInvPostShift_, dPhiBarrelOffs_, dPhiBarrelC_; + // deta parameters in hgcal region int dEtaHGCalBits_, dEtaHGCalZ0PreShift_, dEtaHGCalZ0_, dEtaHGCalRInvPreShift_, dEtaHGCalTanlShift_, dEtaHGCalLUTShift_, dEtaHGCalTanlTermOffs_, dEtaHGCalTanlTermShift_, dEtaHGCalOffs_; diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h index f039d7a183e1b..a0a273dbf1bcd 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h @@ -97,11 +97,12 @@ namespace l1ct { class RegionMux { public: RegionMux() : nregions_(0) {} - RegionMux(unsigned int nregions, unsigned int nsort, unsigned int nout, bool streaming, unsigned int outii = 0) + RegionMux(unsigned int nregions, unsigned int nsort, unsigned int nout, bool streaming, unsigned int outii = 0, unsigned int pauseii = 0) : nregions_(nregions), nsort_(nsort), nout_(nout), outii_(outii), + pauseii_(pauseii), streaming_(streaming), buffer_(nregions * nsort), iter_(0), @@ -114,7 +115,7 @@ namespace l1ct { bool stream(bool newevt, std::vector& out); private: - unsigned int nregions_, nsort_, nout_, outii_; + unsigned int nregions_, nsort_, nout_, outii_, pauseii_; bool streaming_; std::vector buffer_; unsigned int iter_, ireg_; @@ -138,6 +139,7 @@ namespace l1ct { unsigned int nout, bool streaming, unsigned int outii = 0, + unsigned int pauseii = 0, bool useAlsoVtxCoords = false); void initSectors(const std::vector>& sectors); void initSectors(const DetectorSector& sector); @@ -158,7 +160,7 @@ namespace l1ct { void destream(int iclock, const std::vector& streams, std::vector& out); private: - unsigned int nsectors_, nregions_, nsorted_, nout_, outii_; + unsigned int nsectors_, nregions_, nsorted_, nout_, outii_, pauseii_; bool streaming_, useAlsoVtxCoords_; std::vector sectors_; std::vector> buffers_; diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc index d839319a6b322..e5a1d29503baf 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc @@ -217,7 +217,13 @@ bool l1ct::multififo_regionizer::RegionMux::stream(bool newevt, std::vector= outii_) { + assert(pauseii_ > 0); + for (unsigned int i = 0; i < nout_; ++i) { + out[i].clear(); + } + } + if (++iter_ >= (outii_+pauseii_)) { ireg_++; iter_ = 0; } @@ -232,12 +238,13 @@ bool l1ct::multififo_regionizer::RegionMux::stream(bool newevt, std::vector l1ct::multififo_regionizer::Regionizer::Regionizer( - unsigned int nsorted, unsigned int nout, bool streaming, unsigned int outii, bool useAlsoVtxCoords) + unsigned int nsorted, unsigned int nout, bool streaming, unsigned int outii, unsigned int pauseii, bool useAlsoVtxCoords) : nsectors_(0), nregions_(0), nsorted_(nsorted), nout_(nout), outii_(outii), + pauseii_(pauseii), streaming_(streaming), useAlsoVtxCoords_(useAlsoVtxCoords), nevt_(0) {} @@ -272,7 +279,7 @@ void l1ct::multififo_regionizer::Regionizer::initRegions(const std::vector(i, nsorted_); } // bigmux - bigmux_ = RegionMux(nregions, nsorted_, nout_, streaming_, outii_); + bigmux_ = RegionMux(nregions, nsorted_, nout_, streaming_, outii_, pauseii_); } template @@ -373,13 +380,16 @@ void l1ct::multififo_regionizer::Regionizer::destream(int iclock, std::vector& out) { assert(streaming_ && outii_ > 0); assert(streams.size() == nout_); - int local_clk = iclock % outii_; + unsigned int local_clk = iclock % (outii_ + pauseii_); if (local_clk == 0) { out.resize(nsorted_); for (auto& o : out) o.clear(); } for (unsigned int i = 0, j = local_clk; j < nsorted_; ++i, j += outii_) { - out[j] = streams[i]; + if (local_clk < outii_) + out[j] = streams[i]; + else + out[j].clear(); } } diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.cpp b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.cpp index b283a43b9e513..15c3a747aa93f 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.cpp +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.cpp @@ -54,13 +54,14 @@ l1ct::MultififoRegionizerEmulator::MultififoRegionizerEmulator(unsigned int nend nem_(nem), nmu_(nmu), outii_(outii), + pauseii_(0), streaming_(streaming), emInterceptMode_(noIntercept), init_(false), - tkRegionizer_(ntk, streaming ? (ntk + outii - 1) / outii : ntk, streaming, outii, useAlsoVtxCoords), - hadCaloRegionizer_(ncalo, streaming ? (ncalo + outii - 1) / outii : ncalo, streaming, outii), - emCaloRegionizer_(nem, streaming ? (nem + outii - 1) / outii : nem, streaming, outii), - muRegionizer_(nmu, streaming ? std::max(1u, (nmu + outii - 1) / outii) : nmu, streaming, outii) { + tkRegionizer_(ntk, streaming ? (ntk + outii - 1) / outii : ntk, streaming, outii, 0, useAlsoVtxCoords), + hadCaloRegionizer_(ncalo, streaming ? (ncalo + outii - 1) / outii : ncalo, streaming, outii, 0), + emCaloRegionizer_(nem, streaming ? (nem + outii - 1) / outii : nem, streaming, outii, 0), + muRegionizer_(nmu, streaming ? std::max(1u, (nmu + outii - 1) / outii) : nmu, streaming, outii, 0) { // now we initialize the routes: track finder for (unsigned int ie = 0; ie < nendcaps && ntk > 0; ++ie) { for (unsigned int is = 0; is < NTK_SECTORS; ++is) { // 9 tf sectors @@ -108,6 +109,7 @@ l1ct::MultififoRegionizerEmulator::MultififoRegionizerEmulator(BarrelSetup barre unsigned int nmu, bool streaming, unsigned int outii, + unsigned int pauseii, bool useAlsoVtxCoords) : RegionizerEmulator(useAlsoVtxCoords), NTK_SECTORS((barrelSetup == BarrelSetup::Phi18 || barrelSetup == BarrelSetup::Phi9) ? 5 : 9), @@ -124,13 +126,14 @@ l1ct::MultififoRegionizerEmulator::MultififoRegionizerEmulator(BarrelSetup barre nem_(nem), nmu_(nmu), outii_(outii), + pauseii_(pauseii), streaming_(streaming), emInterceptMode_(noIntercept), init_(false), - tkRegionizer_(ntk, streaming ? (ntk + outii - 1) / outii : ntk, streaming, outii, useAlsoVtxCoords), - hadCaloRegionizer_(ncalo, streaming ? (ncalo + outii - 1) / outii : ncalo, streaming, outii), - emCaloRegionizer_(nem, streaming ? (nem + outii - 1) / outii : nem, streaming, outii), - muRegionizer_(nmu, streaming ? std::max(1u, (nmu + outii - 1) / outii) : nmu, streaming, outii) { + tkRegionizer_(ntk, streaming ? (ntk + outii - 1) / outii : ntk, streaming, outii, pauseii, useAlsoVtxCoords), + hadCaloRegionizer_(ncalo, streaming ? (ncalo + outii - 1) / outii : ncalo, streaming, outii, pauseii), + emCaloRegionizer_(nem, streaming ? (nem + outii - 1) / outii : nem, streaming, outii, pauseii), + muRegionizer_(nmu, streaming ? std::max(1u, (nmu + outii - 1) / outii) : nmu, streaming, outii, pauseii) { unsigned int nendcaps = 2, etaslices = 0; switch (barrelSetup) { case BarrelSetup::Full54: @@ -531,7 +534,9 @@ void l1ct::MultififoRegionizerEmulator::run(const RegionizerDecodedInputs& in, s bool newevt = (iclock == 0), mux = true; step(newevt, tk_links_in, calo_links_in, em_links_in, mu_links_in, tk_out, calo_out, em_out, mu_out, mux); - unsigned int ireg = iclock / outii_; + unsigned int ireg = iclock / (outii_ + pauseii_); + if ((iclock % (outii_ + pauseii_)) >= outii_) + continue; if (ireg >= nregions_) break; diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.h b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.h index 1c95ec220f98a..599f081aca6f4 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.h +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_ref.h @@ -39,6 +39,7 @@ namespace l1ct { unsigned int nmu, bool streaming, unsigned int outii, + unsigned int pauseii, bool useAlsoVtxCoords); // note: this one will work only in CMSSW @@ -100,7 +101,7 @@ namespace l1ct { private: const unsigned int NTK_SECTORS, NCALO_SECTORS; // max objects per sector per clock cycle const unsigned int NTK_LINKS, NCALO_LINKS, HCAL_LINKS, ECAL_LINKS, NMU_LINKS; - unsigned int nendcaps_, nclocks_, ntk_, ncalo_, nem_, nmu_, outii_, nregions_; + unsigned int nendcaps_, nclocks_, ntk_, ncalo_, nem_, nmu_, outii_, pauseii_, nregions_; bool streaming_; enum EmInterceptMode { noIntercept = 0, interceptPreFifo, interceptPostFifo } emInterceptMode_; std::unique_ptr interceptor_; From 3a5d988cc6ccd8e8add2b766b3ad154e7be5b1a3 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 8 Dec 2021 14:40:30 +0100 Subject: [PATCH 2/3] Code-format --- .../l1-converters/tracks/tkinput_ref.cpp | 81 +++++++++---------- .../l1-converters/tracks/tkinput_ref.h | 18 +---- .../multififo_regionizer_elements_ref.h | 7 +- .../multififo_regionizer_elements_ref.icc | 10 ++- 4 files changed, 55 insertions(+), 61 deletions(-) diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp index 59f4124496607..a34296672cc54 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp @@ -227,7 +227,8 @@ l1ct::glbeta_t l1ct::TrackInputEmulator::convEta(ap_int<16> tanl) const { return ret; } -void l1ct::TrackInputEmulator::configEta(int lutBits, int preOffs, int shift, int postOffs, bool lutSigned, bool endcap) { +void l1ct::TrackInputEmulator::configEta( + int lutBits, int preOffs, int shift, int postOffs, bool lutSigned, bool endcap) { tanlLUTSigned_ = lutSigned; tanlLUTPreOffs_ = preOffs; tanlLUTPostOffs_ = postOffs; @@ -337,8 +338,7 @@ void l1ct::TrackInputEmulator::configZ0(int bits) { } float l1ct::TrackInputEmulator::floatDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { - - float ret = floatEta(tanl)-floatEta(tanl+z0.to_float()*dEtaBarrelParamZ0_); + float ret = floatEta(tanl) - floatEta(tanl + z0.to_float() * dEtaBarrelParamZ0_); if (debug_) { dbgPrintf( "flt deta for z0 %+6d Rinv %+6d tanl %+6d: eta(calo) %+8.2f eta(vtx) %+8.3f ret " @@ -346,23 +346,22 @@ float l1ct::TrackInputEmulator::floatDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, z0.to_int(), Rinv.to_int(), tanl.to_int(), - floatEta(tanl+z0.to_float()*dEtaBarrelParamZ0_), + floatEta(tanl + z0.to_float() * dEtaBarrelParamZ0_), floatEta(tanl), ret); } - return ret/l1ct::Scales::ETAPHI_LSB; + return ret / l1ct::Scales::ETAPHI_LSB; } l1ct::tkdeta_t l1ct::TrackInputEmulator::calcDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const { - int vtxEta = convEta(tanl); ap_uint<14> absZ0 = z0 >= 0 ? ap_uint<14>(z0) : ap_uint<14>(-z0); int preSum = ((absZ0 >> dEtaBarrelZ0PreShift_) * dEtaBarrelZ0_) >> dEtaBarrelZ0PostShift_; - int caloEta = convEta(tanl+(z0 > 0 ? 1 : -1)*((preSum + dEtaBarrelOffs_) >> dEtaBarrelBits_)); + int caloEta = convEta(tanl + (z0 > 0 ? 1 : -1) * ((preSum + dEtaBarrelOffs_) >> dEtaBarrelBits_)); - int ret = vtxEta-caloEta; + int ret = vtxEta - caloEta; if (debug_) { dbgPrintf( "int deta for z0 %+6d Rinv %+6d tanl %+6d: preSum %+8.2f eta(calo) %+8.2f eta(vtx) %+8.3f ret " @@ -380,27 +379,25 @@ l1ct::tkdeta_t l1ct::TrackInputEmulator::calcDEtaBarrel(ap_int<12> z0, ap_int<15 //use eta LUTs void l1ct::TrackInputEmulator::configDEtaBarrel(int dEtaBarrelBits, - int dEtaBarrelZ0PreShift, - int dEtaBarrelZ0PostShift, - float offs) { - - + int dEtaBarrelZ0PreShift, + int dEtaBarrelZ0PostShift, + float offs) { dEtaBarrelBits_ = dEtaBarrelBits; dEtaBarrelZ0PreShift_ = dEtaBarrelZ0PreShift; dEtaBarrelZ0PostShift_ = dEtaBarrelZ0PostShift; - dEtaBarrelZ0_ = std::round(dEtaBarrelParamZ0_ * (1 << (dEtaBarrelZ0PreShift + dEtaBarrelZ0PostShift + dEtaBarrelBits))); + dEtaBarrelZ0_ = + std::round(dEtaBarrelParamZ0_ * (1 << (dEtaBarrelZ0PreShift + dEtaBarrelZ0PostShift + dEtaBarrelBits))); int finalShift = dEtaBarrelBits_; dEtaBarrelOffs_ = std::round((1 << finalShift) * (0.5 + offs)); if (debug_) - dbgPrintf( - "Configured deta with %d bits: preshift %8d postshift %8d, offset %8d\n", - dEtaBarrelBits, - dEtaBarrelZ0PreShift_, - dEtaBarrelZ0PostShift_, - offs); + dbgPrintf("Configured deta with %d bits: preshift %8d postshift %8d, offset %8d\n", + dEtaBarrelBits, + dEtaBarrelZ0PreShift_, + dEtaBarrelZ0PostShift_, + offs); assert(finalShift >= 0); } @@ -409,13 +406,12 @@ float l1ct::TrackInputEmulator::floatDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, float ret = dPhiBarrelParamC_ * std::abs(Rinv.to_int()); //ret = atan(ret / sqrt(1-ret*ret)); //use linear approx for now if (debug_) { - dbgPrintf( - "flt dphi for z0 %+6d Rinv %+6d tanl %+6d: Rinv/1k %8.2f ret %8.2f\n", - z0.to_int(), - Rinv.to_int(), - tanl.to_int(), - std::abs(Rinv.to_int()) / 1024.0, - ret); + dbgPrintf("flt dphi for z0 %+6d Rinv %+6d tanl %+6d: Rinv/1k %8.2f ret %8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + std::abs(Rinv.to_int()) / 1024.0, + ret); } return ret; } @@ -425,12 +421,11 @@ l1ct::tkdphi_t l1ct::TrackInputEmulator::calcDPhiBarrel(ap_int<12> z0, ap_int<15 int preSum = ((absRinv >> dPhiBarrelRInvPreShift_) * dPhiBarrelC_) >> dPhiBarrelRInvPostShift_; if (debug_) { - dbgPrintf( - "int dphi for z0 %+6d Rinv %+6d tanl %+6d: ret %8.2f\n", - z0.to_int(), - Rinv.to_int(), - tanl.to_int(), - (preSum + dPhiBarrelOffs_) >> dPhiBarrelBits_); + dbgPrintf("int dphi for z0 %+6d Rinv %+6d tanl %+6d: ret %8.2f\n", + z0.to_int(), + Rinv.to_int(), + tanl.to_int(), + (preSum + dPhiBarrelOffs_) >> dPhiBarrelBits_); } return (preSum + dPhiBarrelOffs_) >> dPhiBarrelBits_; @@ -438,25 +433,25 @@ l1ct::tkdphi_t l1ct::TrackInputEmulator::calcDPhiBarrel(ap_int<12> z0, ap_int<15 //using DSPs void l1ct::TrackInputEmulator::configDPhiBarrel(int dPhiBarrelBits, - int dPhiBarrelRInvPreShift, - int dPhiBarrelRInvPostShift, - float offs) { + int dPhiBarrelRInvPreShift, + int dPhiBarrelRInvPostShift, + float offs) { dPhiBarrelBits_ = dPhiBarrelBits; dPhiBarrelRInvPreShift_ = dPhiBarrelRInvPreShift; dPhiBarrelRInvPostShift_ = dPhiBarrelRInvPostShift; - dPhiBarrelC_ = std::round(dPhiBarrelParamC_ * (1 << (dPhiBarrelRInvPreShift + dPhiBarrelRInvPostShift + dPhiBarrelBits))); + dPhiBarrelC_ = + std::round(dPhiBarrelParamC_ * (1 << (dPhiBarrelRInvPreShift + dPhiBarrelRInvPostShift + dPhiBarrelBits))); int finalShift = dPhiBarrelBits_; dPhiBarrelOffs_ = std::round((1 << finalShift) * (0.5 + offs)); if (debug_) - dbgPrintf( - "Configured dphi with %d bits: preshift %8d postshift %8d, offset %8d\n", - dPhiBarrelBits, - dPhiBarrelRInvPreShift_, - dPhiBarrelRInvPostShift_, - offs); + dbgPrintf("Configured dphi with %d bits: preshift %8d postshift %8d, offset %8d\n", + dPhiBarrelBits, + dPhiBarrelRInvPreShift_, + dPhiBarrelRInvPostShift_, + offs); assert(finalShift >= 0); } diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h index da11699126be4..0893d9e00bb7c 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.h @@ -92,26 +92,16 @@ namespace l1ct { // barrel DPhi propagation, in layer-1 units (float parameterization, no rounding) float floatDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; - void setDEtaBarrelParams(float pZ0) { - dEtaBarrelParamZ0_ = pZ0; - } - void setDPhiBarrelParams(float pC) { - dPhiBarrelParamC_ = pC; - } + void setDEtaBarrelParams(float pZ0) { dEtaBarrelParamZ0_ = pZ0; } + void setDPhiBarrelParams(float pC) { dPhiBarrelParamC_ = pC; } //=== Track propagation to calo (bitwise accurate) === l1ct::tkdeta_t calcDEtaBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; l1ct::tkdphi_t calcDPhiBarrel(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; //=== Configuration of bitwise accurate propagation to calo === - void configDEtaBarrel(int dEtaBarrelBits, - int dEtaBarrelZ0PreShift, - int dEtaBarrelZ0PostShift, - float offs = 0); - void configDPhiBarrel(int dPhiBarrelBits, - int dPhiBarrelRInvPreShift, - int dPhiBarrelRInvPostShift, - float offs = 0); + void configDEtaBarrel(int dEtaBarrelBits, int dEtaBarrelZ0PreShift, int dEtaBarrelZ0PostShift, float offs = 0); + void configDPhiBarrel(int dPhiBarrelBits, int dPhiBarrelRInvPreShift, int dPhiBarrelRInvPostShift, float offs = 0); // endcap DEta propagation, in layer-1 units (float parameterization, no rounding) float floatDEtaHGCal(ap_int<12> z0, ap_int<15> Rinv, ap_int<16> tanl) const; diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h index a0a273dbf1bcd..50980aae17f87 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.h @@ -97,7 +97,12 @@ namespace l1ct { class RegionMux { public: RegionMux() : nregions_(0) {} - RegionMux(unsigned int nregions, unsigned int nsort, unsigned int nout, bool streaming, unsigned int outii = 0, unsigned int pauseii = 0) + RegionMux(unsigned int nregions, + unsigned int nsort, + unsigned int nout, + bool streaming, + unsigned int outii = 0, + unsigned int pauseii = 0) : nregions_(nregions), nsort_(nsort), nout_(nout), diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc index e5a1d29503baf..ef93c3c0b5c3e 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/regionizer/multififo/multififo_regionizer_elements_ref.icc @@ -223,7 +223,7 @@ bool l1ct::multififo_regionizer::RegionMux::stream(bool newevt, std::vector= (outii_+pauseii_)) { + if (++iter_ >= (outii_ + pauseii_)) { ireg_++; iter_ = 0; } @@ -237,8 +237,12 @@ bool l1ct::multififo_regionizer::RegionMux::stream(bool newevt, std::vector -l1ct::multififo_regionizer::Regionizer::Regionizer( - unsigned int nsorted, unsigned int nout, bool streaming, unsigned int outii, unsigned int pauseii, bool useAlsoVtxCoords) +l1ct::multififo_regionizer::Regionizer::Regionizer(unsigned int nsorted, + unsigned int nout, + bool streaming, + unsigned int outii, + unsigned int pauseii, + bool useAlsoVtxCoords) : nsectors_(0), nregions_(0), nsorted_(nsorted), From 2fcaa6c0f61ca8508e75716bc80448bf6d8b020f Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 8 Dec 2021 15:07:47 +0100 Subject: [PATCH 3/3] Fix reading CMSSW parameters for track converter module --- L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py | 1 + .../src/newfirmware/l1-converters/tracks/tkinput_ref.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py b/L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py index 0298b7778cbae..e18bd2b4b5fc6 100644 --- a/L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py +++ b/L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py @@ -135,6 +135,7 @@ etaPreOffs = cms.int32(0), etaShift = cms.uint32(15-11), etaPostOffs = cms.int32(150), + etaSigned = cms.bool(True), phiBits = cms.uint32(10), z0Bits = cms.uint32(12), dEtaHGCalBits = cms.uint32(10), diff --git a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp index a34296672cc54..465be2f851652 100644 --- a/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp +++ b/L1Trigger/Phase2L1ParticleFlow/src/newfirmware/l1-converters/tracks/tkinput_ref.cpp @@ -52,7 +52,7 @@ l1ct::TrackInputEmulator::TrackInputEmulator(const edm::ParameterSet &iConfig) iConfig.getParameter("etaPreOffs"), iConfig.getParameter("etaShift"), iConfig.getParameter("etaPostOffs"), - iConfig.getParameter("etaSigned"), + iConfig.getParameter("etaSigned"), region_ == Region::Endcap); configPhi(iConfig.getParameter("phiBits")); configZ0(iConfig.getParameter("z0Bits"));