Skip to content

Commit

Permalink
Merge pull request cms-sw#80 from gpetruc/sync_regionizer_and_tkinput
Browse files Browse the repository at this point in the history
Sync regionizer and tkinput between CMSSW and gitlab
  • Loading branch information
gpetruc committed Dec 8, 2021
2 parents b739036 + 2fcaa6c commit 4c21907
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 24 deletions.
1 change: 1 addition & 0 deletions L1Trigger/Phase2L1ParticleFlow/python/l1ctLayer1_cff.py
Expand Up @@ -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),
Expand Down
Expand Up @@ -42,7 +42,7 @@ l1ct::TrackInputEmulator::TrackInputEmulator(const edm::ParameterSet &iConfig)
: TrackInputEmulator(parseRegion(iConfig.getParameter<std::string>("region")),
parseEncoding(iConfig.getParameter<std::string>("trackWordEncoding")),
iConfig.getParameter<bool>("bitwiseAccurate")) {
if (region_ != Region::Endcap) {
if (region_ != Region::Endcap && region_ != Region::Barrel) {
edm::LogError("TrackInputEmulator") << "region '" << iConfig.getParameter<std::string>("region")
<< "' is not yet supported";
}
Expand All @@ -52,9 +52,14 @@ l1ct::TrackInputEmulator::TrackInputEmulator(const edm::ParameterSet &iConfig)
iConfig.getParameter<int32_t>("etaPreOffs"),
iConfig.getParameter<uint32_t>("etaShift"),
iConfig.getParameter<int32_t>("etaPostOffs"),
iConfig.getParameter<bool>("etaSigned"),
region_ == Region::Endcap);
configPhi(iConfig.getParameter<uint32_t>("phiBits"));
configZ0(iConfig.getParameter<uint32_t>("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<uint32_t>("dEtaHGCalBits"),
iConfig.getParameter<uint32_t>("dEtaHGCalZ0PreShift"),
Expand All @@ -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),
Expand Down Expand Up @@ -123,6 +130,11 @@ std::pair<l1ct::TkObjEmu, bool> 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);
Expand All @@ -139,6 +151,11 @@ std::pair<l1ct::TkObjEmu, bool> 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);
Expand Down Expand Up @@ -210,13 +227,14 @@ 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);
Expand Down Expand Up @@ -319,6 +337,125 @@ 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;
Expand Down
Expand Up @@ -79,14 +79,30 @@ 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);

void configZ0(int bits);

//=== 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)
Expand Down Expand Up @@ -132,6 +148,8 @@ namespace l1ct {
void setDebug(bool debug = true) { debug_ = debug; }

// access to bare LUTs
//const std::vector<int> &dEtaBarrelLUT() const { return dEtaBarrelLUT_; }
//const std::vector<int> &dPhiBarrelTanlLUT() const { return dPhiBarrelTanlLUT_; }
const std::vector<int> &dEtaHGCalLUT() const { return dEtaHGCalLUT_; }
const std::vector<int> &dPhiHGCalTanlLUT() const { return dPhiHGCalTanlLUT_; }
const std::vector<int> &tanlLUT() const { return tanlLUT_; }
Expand Down Expand Up @@ -164,6 +182,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_;
Expand All @@ -174,6 +196,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_;
Expand Down
Expand Up @@ -97,11 +97,17 @@ 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),
Expand All @@ -114,7 +120,7 @@ namespace l1ct {
bool stream(bool newevt, std::vector<T>& out);

private:
unsigned int nregions_, nsort_, nout_, outii_;
unsigned int nregions_, nsort_, nout_, outii_, pauseii_;
bool streaming_;
std::vector<T> buffer_;
unsigned int iter_, ireg_;
Expand All @@ -138,6 +144,7 @@ namespace l1ct {
unsigned int nout,
bool streaming,
unsigned int outii = 0,
unsigned int pauseii = 0,
bool useAlsoVtxCoords = false);
void initSectors(const std::vector<DetectorSector<T>>& sectors);
void initSectors(const DetectorSector<T>& sector);
Expand All @@ -158,7 +165,7 @@ namespace l1ct {
void destream(int iclock, const std::vector<T>& streams, std::vector<T>& out);

private:
unsigned int nsectors_, nregions_, nsorted_, nout_, outii_;
unsigned int nsectors_, nregions_, nsorted_, nout_, outii_, pauseii_;
bool streaming_, useAlsoVtxCoords_;
std::vector<l1ct::PFRegionEmu> sectors_;
std::vector<RegionBuffer<T>> buffers_;
Expand Down
Expand Up @@ -217,7 +217,13 @@ bool l1ct::multififo_regionizer::RegionMux<T>::stream(bool newevt, std::vector<T
shift(buffer_[ireg_ * nsort_ + i], buffer_[ireg_ * nsort_ + i - 1]);
}
}
if (++iter_ == outii_) {
if (iter_ >= outii_) {
assert(pauseii_ > 0);
for (unsigned int i = 0; i < nout_; ++i) {
out[i].clear();
}
}
if (++iter_ >= (outii_ + pauseii_)) {
ireg_++;
iter_ = 0;
}
Expand All @@ -231,13 +237,18 @@ bool l1ct::multififo_regionizer::RegionMux<T>::stream(bool newevt, std::vector<T
}

template <typename T>
l1ct::multififo_regionizer::Regionizer<T>::Regionizer(
unsigned int nsorted, unsigned int nout, bool streaming, unsigned int outii, bool useAlsoVtxCoords)
l1ct::multififo_regionizer::Regionizer<T>::Regionizer(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) {}
Expand Down Expand Up @@ -272,7 +283,7 @@ void l1ct::multififo_regionizer::Regionizer<T>::initRegions(const std::vector<PF
builders_[i] = RegionBuilder<T>(i, nsorted_);
}
// bigmux
bigmux_ = RegionMux<T>(nregions, nsorted_, nout_, streaming_, outii_);
bigmux_ = RegionMux<T>(nregions, nsorted_, nout_, streaming_, outii_, pauseii_);
}

template <typename T>
Expand Down Expand Up @@ -373,13 +384,16 @@ void l1ct::multififo_regionizer::Regionizer<T>::destream(int iclock,
std::vector<T>& 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();
}
}

0 comments on commit 4c21907

Please sign in to comment.