Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions L1Trigger/Configuration/python/SimL1Emulator_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@
_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.
l1tTkMuonsGmtLowPtFix = l1tGMTFilteredMuons.clone()
_phase2_siml1emulator.add( l1tTkMuonsGmtLowPtFix )

# Tracker Objects
# ########################################################################
from L1Trigger.L1TTrackMatch.l1tTrackJets_cfi import *
Expand Down
102 changes: 102 additions & 0 deletions L1Trigger/Phase2L1GMT/plugins/Phase2L1TGMTFilter.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#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_;
};

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")) {
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()) < 0.9 && mu.phPt() < ptBarrelMin_) ||
(fabs(mu.phEta()) > 0.9 && mu.phPt() < ptEndcapMin_)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This 0.9 should be a configurable parameter.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rappoccio Do you want this to be in the cfg file? Or should we define it somewhere in the code? the limit between barrel and endcap is a fixed value. Thanks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@folguera provided the requested update.

// 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), "l1tTkMuonsGmtLowPtFix");
}

// ------------ 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);
9 changes: 9 additions & 0 deletions L1Trigger/Phase2L1GMT/python/gmt_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@

)


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


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