Skip to content

Commit

Permalink
Merge pull request cms-sw#1109 from folguera/125Xp1_FlagToRestrictGMT…
Browse files Browse the repository at this point in the history
…outputToSAAtLowpT

Add flag to drop quality of low-pt TkMuons without an SA match
  • Loading branch information
epalencia committed May 31, 2023
2 parents 79a60e3 + b6a2d43 commit 59b9d0f
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 0 deletions.
6 changes: 6 additions & 0 deletions L1Trigger/Configuration/python/SimL1Emulator_cff.py
Expand Up @@ -144,6 +144,12 @@
_phase2_siml1emulator.add( l1tTkMuonsGmt )
_phase2_siml1emulator.add( l1tSAMuonsGmt )

## fix for low-pt muons, this collection is a copy of the l1tTkMuonsGmt collection
## in which we only keep those low pt muons with an SA muon associated to it. Threshold
## for this cutoff is configurable.
l1tTkMuonsGmtLowPtFix = l1tGMTFilteredMuons.clone()
_phase2_siml1emulator.add( l1tTkMuonsGmtLowPtFix )

# Tracker Objects
# ########################################################################
from L1Trigger.L1TTrackMatch.l1tTrackJets_cfi import *
Expand Down
104 changes: 104 additions & 0 deletions L1Trigger/Phase2L1GMT/plugins/Phase2L1TGMTFilter.cc
@@ -0,0 +1,104 @@
#include <memory>
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"

#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/StreamID.h"
#include "DataFormats/L1TMuonPhase2/interface/TrackerMuon.h"
#include "DataFormats/L1TMuonPhase2/interface/SAMuon.h"
#include "Node.h"

//
// class declaration
//
using namespace Phase2L1GMT;
using namespace l1t;

class Phase2L1TGMTFilter : public edm::stream::EDProducer<> {
public:
explicit Phase2L1TGMTFilter(const edm::ParameterSet&);
~Phase2L1TGMTFilter() override;

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

private:
void beginStream(edm::StreamID) override;
void produce(edm::Event&, const edm::EventSetup&) override;
void endStream() override;
edm::EDGetTokenT<std::vector<l1t::TrackerMuon> > srcMuons_;
bool applyLowPtFilter_;
int ptBarrelMin_;
int ptEndcapMin_;
double etaBE_;
};

Phase2L1TGMTFilter::Phase2L1TGMTFilter(const edm::ParameterSet& iConfig)
: srcMuons_(consumes<std::vector<l1t::TrackerMuon> >(iConfig.getParameter<edm::InputTag>("srcMuons"))),
applyLowPtFilter_(iConfig.getParameter<bool>("applyLowPtFilter")),
ptBarrelMin_(iConfig.getParameter<int>("ptBarrelMin")),
ptEndcapMin_(iConfig.getParameter<int>("ptEndcapMin")),
etaBE_(iConfig.getParameter<double>("etaBE")) {
produces<std::vector<l1t::TrackerMuon> >("l1tTkMuonsGmtLowPtFix").setBranchAlias("tkMuLowPtFix");
}

Phase2L1TGMTFilter::~Phase2L1TGMTFilter() {
// do anything here that needs to be done at destruction time
// (e.g. close files, deallocate resources etc.)
}

//
// member functions
//

// ------------ method called to produce the data ------------
void Phase2L1TGMTFilter::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
using namespace edm;
Handle<std::vector<l1t::TrackerMuon> > muonHandle;
iEvent.getByToken(srcMuons_, muonHandle);

std::vector<l1t::TrackerMuon> out;

for (uint i = 0; i < muonHandle->size(); ++i) {
auto mu = muonHandle->at(i);
bool noSAMatch = true;
if (applyLowPtFilter_) {
if ((fabs(mu.phEta()) < etaBE_ && mu.phPt() < ptBarrelMin_) ||
(fabs(mu.phEta()) > etaBE_ && mu.phPt() < ptEndcapMin_)) {
// if quality is already set to 0 don't continue the loop.
for (const auto& r : mu.muonRef()) {
if (r.isNonnull()) {
noSAMatch = false;
break;
}
}
if (noSAMatch)
mu.setHwQual(0);
}
}
out.push_back(mu); // store all muons otherwise
}

// store results
std::unique_ptr<std::vector<l1t::TrackerMuon> > out1 = std::make_unique<std::vector<l1t::TrackerMuon> >(out);
iEvent.put(std::move(out1));
}

// ------------ method called once each stream before processing any runs, lumis or events ------------
void Phase2L1TGMTFilter::beginStream(edm::StreamID) {}

// ------------ method called once each stream after processing all runs, lumis and events ------------
void Phase2L1TGMTFilter::endStream() {}

void Phase2L1TGMTFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
//The following says we do not know what parameters are allowed so do no validation
// Please change this to state exactly what you do use, even if it is no parameters
edm::ParameterSetDescription desc;
desc.setUnknown();
descriptions.addDefault(desc);
}

//define this as a plug-in
DEFINE_FWK_MODULE(Phase2L1TGMTFilter);
11 changes: 11 additions & 0 deletions L1Trigger/Phase2L1GMT/python/gmt_cfi.py
Expand Up @@ -76,6 +76,17 @@

)


l1tGMTFilteredMuons = cms.EDProducer('Phase2L1TGMTFilter',
srcMuons = cms.InputTag("l1tTkMuonsGmt",""),
applyLowPtFilter = cms.bool(True),
ptBarrelMin = cms.int32(8),
ptEndcapMin = cms.int32(8),
etaBE = cms.double(0.9)

)


l1tStandaloneMuons = cms.EDProducer('Phase2L1TGMTSAMuonProducer',
muonToken = cms.InputTag('simGmtStage2Digis'),
Nprompt = cms.uint32(12),
Expand Down

0 comments on commit 59b9d0f

Please sign in to comment.