File indexing completed on 2025-02-13 02:58:23
0001 #include "FWCore/Framework/interface/Event.h"
0002 #include "FWCore/Framework/interface/Frameworkfwd.h"
0003 #include "FWCore/Framework/interface/stream/EDProducer.h"
0004 #include "FWCore/Framework/interface/MakerMacros.h"
0005 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0008 #include "FWCore/Utilities/interface/EDGetToken.h"
0009 #include "FWCore/Utilities/interface/EDPutToken.h"
0010 #include "FWCore/Utilities/interface/Exception.h"
0011 #include "FWCore/Utilities/interface/InputTag.h"
0012 #include "FWCore/Utilities/interface/StreamID.h"
0013
0014
0015 #include "DataFormats/L1Scouting/interface/L1ScoutingMuon.h"
0016 #include "DataFormats/L1Scouting/interface/OrbitCollection.h"
0017 #include "L1TriggerScouting/Utilities/interface/conversion.h"
0018
0019 #include <memory>
0020 #include <utility>
0021 #include <vector>
0022
0023 using namespace l1ScoutingRun3;
0024
0025 class MuBxSelector : public edm::stream::EDProducer<> {
0026 public:
0027 explicit MuBxSelector(const edm::ParameterSet&);
0028 ~MuBxSelector() override {}
0029 static void fillDescriptions(edm::ConfigurationDescriptions&);
0030
0031 private:
0032 void produce(edm::Event&, const edm::EventSetup&) override;
0033
0034
0035 edm::EDGetTokenT<OrbitCollection<l1ScoutingRun3::Muon>> muonsTokenData_;
0036
0037
0038 int minNMu_;
0039 std::vector<double> minMuPt_;
0040 std::vector<double> maxMuEta_;
0041 std::vector<int> minMuTfIndex_;
0042 std::vector<int> maxMuTfIndex_;
0043 std::vector<int> minMuHwQual_;
0044 };
0045
0046 MuBxSelector::MuBxSelector(const edm::ParameterSet& iPSet)
0047 : muonsTokenData_(consumes(iPSet.getParameter<edm::InputTag>("muonsTag"))),
0048 minNMu_(iPSet.getParameter<int>("minNMu")),
0049 minMuPt_(iPSet.getParameter<std::vector<double>>("minMuPt")),
0050 maxMuEta_(iPSet.getParameter<std::vector<double>>("maxMuEta")),
0051 minMuTfIndex_(iPSet.getParameter<std::vector<int>>("minMuTfIndex")),
0052 maxMuTfIndex_(iPSet.getParameter<std::vector<int>>("maxMuTfIndex")),
0053 minMuHwQual_(iPSet.getParameter<std::vector<int>>("minMuHwQual"))
0054
0055 {
0056 if ((minMuPt_.size() != (size_t)(size_t)minNMu_) || (maxMuEta_.size() != (size_t)minNMu_) ||
0057 (minMuTfIndex_.size() != (size_t)minNMu_) || (maxMuTfIndex_.size() != (size_t)minNMu_) ||
0058 (minMuHwQual_.size() != (size_t)minNMu_))
0059 throw cms::Exception("MuBxSelector::MuBxSelector")
0060 << "size mismatch: size of minMuPt or maxMuEta or minMuTfIndex or maxMuTfIndex or minMuHwQual != minNMu.";
0061
0062 produces<std::vector<unsigned>>("SelBx").setBranchAlias("MuSelectedBx");
0063 }
0064
0065
0066 void MuBxSelector::produce(edm::Event& iEvent, const edm::EventSetup&) {
0067 edm::Handle<OrbitCollection<l1ScoutingRun3::Muon>> muonsCollection;
0068
0069 iEvent.getByToken(muonsTokenData_, muonsCollection);
0070
0071 std::unique_ptr<std::vector<unsigned>> muBx(new std::vector<unsigned>);
0072
0073
0074 for (const unsigned& bx : muonsCollection->getFilledBxs()) {
0075 const auto& muons = muonsCollection->bxIterator(bx);
0076
0077
0078 if (std::ssize(muons) < minNMu_)
0079 continue;
0080
0081
0082 bool muCond = false;
0083 int nAccMus = 0;
0084 for (const auto& muon : muons) {
0085 muCond = (std::abs(ugmt::fEta(muon.hwEta())) < maxMuEta_[nAccMus]) &&
0086 (muon.tfMuonIndex() <= maxMuTfIndex_[nAccMus]) && (muon.tfMuonIndex() >= minMuTfIndex_[nAccMus]) &&
0087 (ugmt::fPt(muon.hwPt()) >= minMuPt_[nAccMus]) && (muon.hwQual() >= minMuHwQual_[nAccMus]);
0088 if (muCond)
0089 nAccMus++;
0090 if (nAccMus == minNMu_)
0091 break;
0092 }
0093
0094 if (nAccMus < minNMu_)
0095 continue;
0096
0097 muBx->push_back(bx);
0098
0099 }
0100
0101 iEvent.put(std::move(muBx), "SelBx");
0102 }
0103
0104 void MuBxSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0105 edm::ParameterSetDescription desc;
0106 desc.setUnknown();
0107 descriptions.addDefault(desc);
0108 }
0109
0110 DEFINE_FWK_MODULE(MuBxSelector);