File indexing completed on 2024-04-06 12:18:21
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "HLTElectronMuonInvMassFilter.h"
0010 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
0011 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
0012 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
0013
0014 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0015 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0016
0017
0018
0019 HLTElectronMuonInvMassFilter::HLTElectronMuonInvMassFilter(const edm::ParameterSet& iConfig) : HLTFilter(iConfig) {
0020 eleCandTag_ = iConfig.getParameter<edm::InputTag>("elePrevCandTag");
0021 muonCandTag_ = iConfig.getParameter<edm::InputTag>("muonPrevCandTag");
0022 lowerMassCut_ = iConfig.getParameter<double>("lowerMassCut");
0023 upperMassCut_ = iConfig.getParameter<double>("upperMassCut");
0024 ncandcut_ = iConfig.getParameter<int>("ncandcut");
0025 relaxed_ = iConfig.getUntrackedParameter<bool>("electronRelaxed", true);
0026 L1IsoCollTag_ = iConfig.getParameter<edm::InputTag>("ElectronL1IsoCand");
0027 L1NonIsoCollTag_ = iConfig.getParameter<edm::InputTag>("ElectronL1NonIsoCand");
0028 MuonCollTag_ = iConfig.getParameter<edm::InputTag>("MuonCand");
0029 eleCandToken_ = consumes<trigger::TriggerFilterObjectWithRefs>(eleCandTag_);
0030 muonCandToken_ = consumes<trigger::TriggerFilterObjectWithRefs>(muonCandTag_);
0031 }
0032
0033 HLTElectronMuonInvMassFilter::~HLTElectronMuonInvMassFilter() = default;
0034
0035 void HLTElectronMuonInvMassFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0036 edm::ParameterSetDescription desc;
0037 makeHLTFilterDescription(desc);
0038 desc.add<edm::InputTag>("elePrevCandTag",
0039 edm::InputTag("hltL1NonIsoHLTCaloIdTTrkIdVLSingleElectronEt8NoCandDphiFilter"));
0040 desc.add<edm::InputTag>("muonPrevCandTag", edm::InputTag("hltL1Mu0HTT50L3Filtered3"));
0041 desc.add<double>("lowerMassCut", 4.0);
0042 desc.add<double>("upperMassCut", 999999.0);
0043 desc.add<int>("ncandcut", 1);
0044 desc.addUntracked<bool>("electronRelaxed", true);
0045 desc.add<edm::InputTag>("ElectronL1IsoCand", edm::InputTag("hltPixelMatchElectronsActivity"));
0046 desc.add<edm::InputTag>("ElectronL1NonIsoCand", edm::InputTag("hltPixelMatchElectronsActivity"));
0047 desc.add<edm::InputTag>("MuonCand", edm::InputTag("hltL3MuonCandidates"));
0048 descriptions.add("hltElectronMuonInvMassFilter", desc);
0049 }
0050
0051
0052 bool HLTElectronMuonInvMassFilter::hltFilter(edm::Event& iEvent,
0053 const edm::EventSetup& iSetup,
0054 trigger::TriggerFilterObjectWithRefs& filterproduct) const {
0055 using namespace std;
0056 using namespace math;
0057 using namespace edm;
0058 using namespace reco;
0059
0060 using namespace trigger;
0061
0062 if (saveTags()) {
0063 filterproduct.addCollectionTag(L1IsoCollTag_);
0064 if (relaxed_)
0065 filterproduct.addCollectionTag(L1NonIsoCollTag_);
0066 filterproduct.addCollectionTag(MuonCollTag_);
0067 }
0068
0069 edm::Handle<trigger::TriggerFilterObjectWithRefs> EleFromPrevFilter;
0070 iEvent.getByToken(eleCandToken_, EleFromPrevFilter);
0071
0072 edm::Handle<trigger::TriggerFilterObjectWithRefs> MuonFromPrevFilter;
0073 iEvent.getByToken(muonCandToken_, MuonFromPrevFilter);
0074
0075 vector<Ref<ElectronCollection>> electrons;
0076 EleFromPrevFilter->getObjects(TriggerElectron, electrons);
0077
0078 vector<RecoChargedCandidateRef> l3muons;
0079 MuonFromPrevFilter->getObjects(TriggerMuon, l3muons);
0080
0081 std::vector<edm::Ref<reco::RecoEcalCandidateCollection>> clusCands;
0082 if (electrons.empty()) {
0083 EleFromPrevFilter->getObjects(TriggerCluster, clusCands);
0084 }
0085
0086 if (clusCands.empty()) {
0087 EleFromPrevFilter->getObjects(TriggerPhoton, clusCands);
0088 }
0089
0090 int nEleMuPairs = 0;
0091
0092 for (auto& electron : electrons) {
0093 for (auto& l3muon : l3muons) {
0094 double mass = (electron->p4() + l3muon->p4()).mass();
0095 if (mass >= lowerMassCut_ && mass <= upperMassCut_) {
0096 nEleMuPairs++;
0097 filterproduct.addObject(TriggerElectron, electron);
0098 filterproduct.addObject(TriggerMuon, l3muon);
0099 }
0100 }
0101 }
0102
0103 for (auto& clusCand : clusCands) {
0104 for (auto& l3muon : l3muons) {
0105 double mass = (clusCand->p4() + l3muon->p4()).mass();
0106 if (mass >= lowerMassCut_ && mass <= upperMassCut_) {
0107 nEleMuPairs++;
0108 filterproduct.addObject(TriggerElectron, clusCand);
0109 filterproduct.addObject(TriggerMuon, l3muon);
0110 }
0111 }
0112 }
0113
0114
0115 bool accept(nEleMuPairs >= ncandcut_);
0116 return accept;
0117 }
0118
0119
0120 #include "FWCore/Framework/interface/MakerMacros.h"
0121 DEFINE_FWK_MODULE(HLTElectronMuonInvMassFilter);