74 static bool compareMuons(
const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu1,
75 const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu2);
97 std::unique_ptr<MuonBxCollection>&
out,
147 : m_debugOut(
"test/debug/iso_debug.dat"),
177 m_microGMTParamsToken = esConsumes<L1TMuonGlobalParams, L1TMuonGlobalParamsRcd, edm::Transition::BeginRun>();
178 m_o2oProtoToken = esConsumes<L1TMuonGlobalParams, L1TMuonGlobalParamsO2ORcd, edm::Transition::BeginRun>();
181 produces<MuonBxCollection>();
182 produces<MuonBxCollection>(
"imdMuonsBMTF");
183 produces<MuonBxCollection>(
"imdMuonsEMTFPos");
184 produces<MuonBxCollection>(
"imdMuonsEMTFNeg");
185 produces<MuonBxCollection>(
"imdMuonsOMTFPos");
186 produces<MuonBxCollection>(
"imdMuonsOMTFNeg");
280 splitAndConvertMuons(emtfMuons, internMuonsEmtfPos, internMuonsEmtfNeg, emtfPosWedges, emtfNegWedges,
bx);
281 splitAndConvertMuons(omtfMuons, internMuonsOmtfPos, internMuonsOmtfNeg, omtfPosWedges, omtfNegWedges,
bx);
330 for (
const auto&
mu : internalMuons) {
331 if (
mu->hwPt() > 0) {
333 (
mu->hwPt() - 1) * 0.5,
mu->hwEta() * 0.010875,
mu->hwGlobalPhi() * 0.010908, 0.0};
334 int iso =
mu->hwAbsIso() + (
mu->hwRelIso() << 1);
335 int outMuQual = MicroGMTConfiguration::setOutputMuonQuality(
mu->hwQual(),
mu->trackFinderType(),
mu->hwHF());
353 outMu.setHwEtaAtVtx(MicroGMTConfiguration::calcMuonHwEtaExtra(outMu));
354 outMu.setHwPhiAtVtx(MicroGMTConfiguration::calcMuonHwPhiExtra(outMu));
355 outMu.setEtaAtVtx(MicroGMTConfiguration::calcMuonEtaExtra(outMu));
356 outMu.setPhiAtVtx(MicroGMTConfiguration::calcMuonPhiExtra(outMu));
359 int hwPtUnconstrained{
mu->hwPtUnconstrained()};
360 outMu.setPtUnconstrained(
361 hwPtUnconstrained == 0
363 : (hwPtUnconstrained - 1));
364 outMu.setHwPtUnconstrained(hwPtUnconstrained);
365 outMu.setHwDXY(
mu->hwDXY());
367 if (
mu->hwSignValid()) {
368 outMu.setCharge(1 - 2 *
mu->hwSign());
372 m_debugOut <<
mu->hwCaloPhi() <<
" " <<
mu->hwCaloEta() << std::endl;
373 outMuons->push_back(
bx, outMu);
387 const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu2) {
388 return (mu1->hwWins() >= mu2->hwWins());
392 MicroGMTConfiguration::InterMuonList::iterator mu1;
394 for (mu1 =
muons.begin(); mu1 !=
muons.end(); ++mu1) {
395 (*mu1)->setHwWins(0);
399 for (mu1 =
muons.begin(); mu1 !=
muons.end(); ++mu1) {
400 int mu1CancelBit = (*mu1)->hwCancelBit();
401 nCancelled += mu1CancelBit;
404 for (; mu2 !=
muons.end(); ++mu2) {
405 if (mu1CancelBit != 1 && (*mu2)->hwCancelBit() != 1) {
406 if ((*mu1)->hwRank() >= (*mu2)->hwRank()) {
407 (*mu1)->increaseWins();
409 (*mu2)->increaseWins();
411 }
else if (mu1CancelBit != 1) {
412 (*mu1)->increaseWins();
413 }
else if ((*mu2)->hwCancelBit() != 1) {
414 (*mu2)->increaseWins();
419 size_t nMuonsBefore =
muons.size();
420 int minWins = nMuonsBefore - nSurvivors;
424 muons.remove_if([&minWins](
auto muon) {
return ((
muon->hwWins() < minWins) || (
muon->hwCancelBit() == 1)); });
429 for (
auto& mu1 :
muons) {
431 mu1->setHwRank(rank);
437 std::unique_ptr<MuonBxCollection>&
out,
439 for (
auto&
mu : coll) {
440 interout.push_back(
mu);
442 int outMuQual = MicroGMTConfiguration::setOutputMuonQuality(
mu->hwQual(),
mu->trackFinderType(),
mu->hwHF());
460 int hwPtUnconstrained{
mu->hwPtUnconstrained()};
461 outMu.setPtUnconstrained(hwPtUnconstrained == 0
463 : (hwPtUnconstrained - 1));
464 outMu.setHwPtUnconstrained(hwPtUnconstrained);
465 outMu.setHwDXY(
mu->hwDXY());
467 if (
mu->hwSignValid()) {
468 outMu.setCharge(1 - 2 *
mu->hwSign());
473 out->push_back(
bx, outMu);
484 for (
int i = 0;
i < 6; ++
i) {
485 wedges_pos[
i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
486 wedges_pos[
i].reserve(3);
487 wedges_neg[
i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
488 wedges_neg[
i].reserve(3);
490 if (bx < in->getFirstBX() ||
bx >
in->getLastBX())
494 for (
size_t i = 0;
i <
in->size(
bx); ++
i, ++muIdxAuto) {
495 if (
in->at(
bx,
i).hwPt() > 0) {
496 int link =
in->at(
bx,
i).link();
500 if (currentLink != link) {
504 int gPhi = MicroGMTConfiguration::calcGlobalPhi(
505 in->at(
bx,
i).hwPhi(),
in->at(
bx,
i).trackFinderType(),
in->at(
bx,
i).processor());
507 std::shared_ptr<GMTInternalMuon>
out = std::make_shared<GMTInternalMuon>(
in->at(
bx,
i), gPhi, tfMuonIdx);
508 if (
in->at(
bx,
i).hwEta() > 0) {
509 out_pos.push_back(
out);
510 wedges_pos[
in->at(
bx,
i).processor()].push_back(
out);
512 out_neg.emplace_back(
out);
513 wedges_neg[
in->at(
bx,
i).processor()].push_back(
out);
517 for (
int i = 0;
i < 6; ++
i) {
518 if (wedges_pos[
i].
size() > 3)
519 edm::LogWarning(
"Input Mismatch") <<
" too many inputs per processor for emtf+ / omtf+. Wedge " <<
i <<
": Size " 520 << wedges_pos[
i].size() << std::endl;
521 if (wedges_neg[
i].
size() > 3)
522 edm::LogWarning(
"Input Mismatch") <<
" too many inputs per processor for emtf- / omtf-. Wedge " <<
i <<
": Size " 523 << wedges_neg[
i].size() << std::endl;
532 for (
int i = 0;
i < 12; ++
i) {
533 wedges[
i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
534 wedges[
i].reserve(3);
536 if (bx < in->getFirstBX() ||
bx >
in->getLastBX()) {
541 for (
size_t i = 0;
i <
in->size(
bx); ++
i, ++muIdxAuto) {
542 if (
in->at(
bx,
i).hwPt() > 0) {
543 int link =
in->at(
bx,
i).link();
547 if (currentLink != link) {
551 int gPhi = MicroGMTConfiguration::calcGlobalPhi(
552 in->at(
bx,
i).hwPhi(),
in->at(
bx,
i).trackFinderType(),
in->at(
bx,
i).processor());
554 std::shared_ptr<GMTInternalMuon> outMu = std::make_shared<GMTInternalMuon>(
in->at(
bx,
i), gPhi, tfMuonIdx);
555 out.emplace_back(outMu);
556 wedges[
in->at(
bx,
i).processor()].push_back(outMu);
559 for (
int i = 0;
i < 12; ++
i) {
560 if (wedges[
i].
size() > 3) {
561 edm::LogWarning(
"Input Mismatch") <<
" too many inputs per processor for barrel. Wedge " <<
i <<
": Size " 562 << wedges[
i].size() << std::endl;
569 if (
mu.muIdx() != -1) {
570 return 3 * (currentLink - 36) +
mu.muIdx();
572 return 3 * (currentLink - 36) + muIdxAuto;
580 std::unique_ptr<L1TMuonGlobalParams_PUBLIC> microGMTParams(
582 if (microGMTParams->pnodes_.empty()) {
593 <<
"\n EMTF-|OMTF-| BMTF |OMTF+|EMTF+| CALO | res 0";
601 <<
"\n EMTF-|OMTF-| BMTF |OMTF+|EMTF+| CALO | res 0";
const L1TMuonGlobalParams & cast_to_L1TMuonGlobalParams(const L1TMuonGlobalParams_PUBLIC &x)
Log< level::Info, true > LogVerbatim
void beginRun(edm::Run const &, edm::EventSetup const &) override
void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
void setCancelOutBitsOverlapEndcap(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and endcap track finders.
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T getParameter(std::string const &) const
void extrapolateMuons(MicroGMTConfiguration::InterMuonList &) const
void initialise(L1TMuonGlobalParamsHelper *)
Initialisation from ES record.
void setCancelOutBitsOverlapBarrel(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and barrel track finders.
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_endcapTfInputToken
std::unique_ptr< L1TMuonGlobalParamsHelper > microGMTParamsHelper
std::bitset< 12 > m_bmtfInputsToDisable
void convertMuons(edm::Handle< MicroGMTConfiguration::InputCollection > const &in, MicroGMTConfiguration::InterMuonList &out, GMTInternalWedges &wedges, int bx) const
void setTowerSums(const MicroGMTConfiguration::CaloInputCollection &inputs, int bx)
int computeMuonIdx(const RegionalMuonCand &mu, int currentLink, int muIdxAuto) const
#define DEFINE_FWK_MODULE(type)
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_overlapTfInputToken
edm::EDGetTokenT< MicroGMTConfiguration::CaloInputCollection > m_caloTowerInputToken
MicroGMTIsolationUnit m_isolationUnit
l1t::cancelmode m_emtfCancelMode
edm::ESGetToken< L1TMuonGlobalParams, L1TMuonGlobalParamsO2ORcd > m_o2oProtoToken
void calculateRank(MicroGMTConfiguration::InterMuonList &muons) const
std::shared_ptr< MicroGMTRankPtQualLUT > m_rankPtQualityLUT
void isolatePreSummed(MicroGMTConfiguration::InterMuonList &muons) const
void sortMuons(MicroGMTConfiguration::InterMuonList &, unsigned) const
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
static ReturnType create(const std::string &filename, const int fwVersion, const unsigned ptFactor, const unsigned qualFactor)
edm::InputTag m_overlapTfInputTag
std::bitset< 12 > m_emtfInputsToDisable
T const * product() const
void addDefault(ParameterSetDescription const &psetDescription)
void addMuonsToCollections(MicroGMTConfiguration::InterMuonList &coll, MicroGMTConfiguration::InterMuonList &interout, std::unique_ptr< MuonBxCollection > &out, int bx) const
void endRun(edm::Run const &, edm::EventSetup const &) override
void splitAndConvertMuons(edm::Handle< MicroGMTConfiguration::InputCollection > const &in, MicroGMTConfiguration::InterMuonList &out_pos, MicroGMTConfiguration::InterMuonList &out_neg, GMTInternalWedges &wedges_pos, GMTInternalWedges &wedges_neg, int bx) const
GMTInternalMuonList InterMuonList
edm::InputTag m_barrelTfInputTag
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
edm::InputTag m_endcapTfInputTag
void produce(edm::Event &, const edm::EventSetup &) override
std::bitset< 12 > m_maskedBmtfInputs
BXVector< Muon > MuonBxCollection
void setCancelOutBits(GMTInternalWedges &, tftype, cancelmode)
Cancel out between sectors/wedges in one track finder.
auto const & tracks
cannot be loose
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
~L1TMuonProducer() override
edm::ESGetToken< L1TMuonGlobalParams, L1TMuonGlobalParamsRcd > m_microGMTParamsToken
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_barrelTfInputToken
void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
std::bitset< 12 > m_maskedEmtfInputs
const L1TMuonGlobalParams_PUBLIC & cast_to_L1TMuonGlobalParams_PUBLIC(const L1TMuonGlobalParams &x)
l1t::cancelmode m_bmtfCancelMode
static bool compareMuons(const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu1, const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu2)
std::map< int, std::vector< std::shared_ptr< GMTInternalMuon > > > GMTInternalWedges
std::bitset< 72 > m_maskedInputs
std::bitset< 12 > m_maskedOmtfInputs
std::bitset< 72 > m_inputsToDisable
std::bitset< 28 > m_caloInputsToDisable
L1TMuonProducer(const edm::ParameterSet &)
std::bitset< 12 > m_omtfInputsToDisable
Log< level::Warning, false > LogWarning
MicroGMTCancelOutUnit m_cancelOutUnit
void initialise(L1TMuonGlobalParamsHelper *)
Initialisation from ES record.
edm::InputTag m_trigTowerTag
std::bitset< 28 > m_maskedCaloInputs