Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // L1 scouting
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   // tokens for scouting data
0035   edm::EDGetTokenT<OrbitCollection<l1ScoutingRun3::Muon>> muonsTokenData_;
0036 
0037   // SELECTION THRESHOLDS
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 // ------------ method called for each ORBIT  ------------
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   // loop over valid bunch crossings
0074   for (const unsigned& bx : muonsCollection->getFilledBxs()) {
0075     const auto& muons = muonsCollection->bxIterator(bx);
0076 
0077     // we have at least a muon
0078     if (std::ssize(muons) < minNMu_)
0079       continue;
0080 
0081     // it must be in a certain eta region with an pT and quality threshold
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++;  // found muon meeting requirements
0090       if (nAccMus == minNMu_)
0091         break;  // found all requested muons
0092     }
0093 
0094     if (nAccMus < minNMu_)
0095       continue;
0096 
0097     muBx->push_back(bx);
0098 
0099   }  // end orbit loop
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);