Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-15 22:41:36

0001 /*
0002     EDProducer class for shower emulation in Phase2 DTs.
0003     Authors: 
0004         - Carlos Vico Villalba (U. Oviedo)
0005         - Daniel Estrada Acevedo (U. Oviedo)
0006 */
0007 
0008 // Include CMSSW plugins
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010 #include "FWCore/Framework/interface/stream/EDProducer.h"
0011 #include "FWCore/Framework/interface/ESHandle.h"
0012 #include "FWCore/Utilities/interface/ESGetToken.h"
0013 #include "FWCore/Framework/interface/ModuleFactory.h"
0014 #include "FWCore/Framework/interface/ESProducer.h"
0015 #include "FWCore/Framework/interface/ESHandle.h"
0016 #include "FWCore/Framework/interface/ESProducts.h"
0017 #include "FWCore/Framework/interface/ConsumesCollector.h"
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/Framework/interface/Frameworkfwd.h"
0020 #include "FWCore/Framework/interface/EventSetup.h"
0021 #include "FWCore/Framework/interface/Run.h"
0022 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0023 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0024 
0025 // Include Geometry plugins
0026 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0027 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0028 #include "Geometry/DTGeometry/interface/DTLayer.h"
0029 
0030 // Phase2 trigger dataformats
0031 #include "L1Trigger/DTTriggerPhase2/interface/constants.h"
0032 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0033 #include "DataFormats/MuonDetId/interface/DTSuperLayerId.h"
0034 #include "DataFormats/MuonDetId/interface/DTLayerId.h"
0035 #include "DataFormats/MuonDetId/interface/DTWireId.h"
0036 #include "DataFormats/DTDigi/interface/DTDigiCollection.h"
0037 #include "DataFormats/L1DTTrackFinder/interface/L1Phase2MuDTShower.h"
0038 #include "DataFormats/L1DTTrackFinder/interface/L1Phase2MuDTShowerContainer.h"
0039 
0040 // Functionalities
0041 #include "L1Trigger/DTTriggerPhase2/interface/ShowerBuilder.h"
0042 #include "L1Trigger/DTTriggerPhase2/interface/ShowerCandidate.h"
0043 
0044 // DT trigger GeomUtils
0045 #include "DQM/DTMonitorModule/interface/DTTrigGeomUtils.h"
0046 
0047 // C++ built-ins
0048 #include <fstream>
0049 #include <iostream>
0050 #include <queue>
0051 #include <cmath>
0052 
0053 using namespace edm;
0054 using namespace cmsdt;
0055 
0056 class DTTrigPhase2ShowerProd : public edm::stream::EDProducer<> {
0057   /* Declaration of the plugin */
0058 
0059   // Types
0060   typedef std::map<DTChamberId, DTDigiCollection, std::less<DTChamberId>> DTDigiMap;
0061   typedef DTDigiMap::iterator DTDigiMap_iterator;
0062   typedef DTDigiMap::const_iterator DTDigiMap_const_iterator;
0063 
0064 public:
0065   // Public methods/attributes
0066 
0067   //! Constructor
0068   DTTrigPhase2ShowerProd(const edm::ParameterSet& pset);
0069 
0070   //! Destructor
0071   ~DTTrigPhase2ShowerProd() override;
0072 
0073   //! Create Trigger Units before starting event processing
0074   void beginRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) override;
0075 
0076   //! Producer: process every event and generates trigger data
0077   void produce(edm::Event& iEvent, const edm::EventSetup& iEventSetup) override;
0078 
0079   //! endRun: finish things
0080   void endRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) override;
0081 
0082   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0083 
0084   // Members
0085   const DTGeometry* dtGeo_;
0086   edm::ESGetToken<DTGeometry, MuonGeometryRecord> dtGeomH;
0087 
0088 private:
0089   // Private methods/attributes
0090   bool debug_;                                       // Debug flag
0091   int showerTaggingAlgo_;                            // Shower tagging algorithm
0092   edm::InputTag digiTag_;                            // Digi collection label
0093   edm::EDGetTokenT<DTDigiCollection> dtDigisToken_;  // Digi container
0094   std::unique_ptr<ShowerBuilder> showerBuilder;      // Shower builder instance
0095 };
0096 
0097 /* Implementation of the plugin */
0098 DTTrigPhase2ShowerProd::DTTrigPhase2ShowerProd(const ParameterSet& pset) {
0099   // Constructor implementation
0100   produces<L1Phase2MuDTShowerContainer>();
0101   // Unpack information from pset
0102   debug_ = pset.getUntrackedParameter<bool>("debug");
0103   digiTag_ = pset.getParameter<edm::InputTag>("digiTag");
0104   showerTaggingAlgo_ = pset.getParameter<int>("showerTaggingAlgo");
0105 
0106   // Fetch consumes
0107   dtDigisToken_ = consumes<DTDigiCollection>(digiTag_);
0108 
0109   // Algorithm functionalities
0110   edm::ConsumesCollector consumesColl(consumesCollector());
0111   showerBuilder = std::make_unique<ShowerBuilder>(pset, consumesColl);
0112 
0113   // Load geometry
0114   dtGeomH = esConsumes<DTGeometry, MuonGeometryRecord, edm::Transition::BeginRun>();
0115 
0116   if (debug_) {
0117     LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: constructor" << std::endl;
0118     if (showerTaggingAlgo_ == 0) {
0119       LogDebug("DTTrigPhase2ShowerProd") << "Using standalone mode" << std::endl;
0120     } else if (showerTaggingAlgo_ == 1) {
0121       LogDebug("DTTrigPhase2ShowerProd") << "Using firmware emulation mode" << std::endl;
0122     } else
0123       LogError("DTTrigPhase2ShowerProd") << "Unrecognized shower tagging algorithm" << std::endl;
0124   }
0125 }
0126 
0127 DTTrigPhase2ShowerProd::~DTTrigPhase2ShowerProd() {
0128   // Destructor implementation
0129   if (debug_)
0130     LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: destructor" << std::endl;
0131 }
0132 
0133 void DTTrigPhase2ShowerProd::beginRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) {
0134   // beginRun implementation
0135   if (debug_)
0136     LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: beginRun started" << std::endl;
0137 
0138   showerBuilder->initialise(iEventSetup);
0139   if (auto geom = iEventSetup.getHandle(dtGeomH)) {
0140     dtGeo_ = &(*geom);
0141   }
0142 }
0143 
0144 void DTTrigPhase2ShowerProd::produce(edm::Event& iEvent, const edm::EventSetup& iEventSetup) {
0145   // produce implementation
0146   if (debug_)
0147     LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: produce Processing event" << std::endl;
0148 
0149   // Fetch the handle for hits
0150   edm::Handle<DTDigiCollection> dtdigis;
0151   iEvent.getByToken(dtDigisToken_, dtdigis);
0152 
0153   // 1. Preprocessing: store digi information by chamber
0154   DTDigiMap digiMap;
0155   DTDigiCollection::DigiRangeIterator detUnitIt;
0156   if (debug_)
0157     LogDebug("DTTrigPhase2ShowerProd") << "    Preprocessing hits..." << std::endl;
0158 
0159   for (const auto& detUnitIt : *dtdigis) {
0160     const DTLayerId& layId = detUnitIt.first;
0161     const DTChamberId chambId = layId.superlayerId().chamberId();
0162     const DTDigiCollection::Range& digi_range = detUnitIt.second;  // This is the digi collection
0163     digiMap[chambId].put(digi_range, layId);
0164   }
0165 
0166   if (debug_)
0167     LogDebug("DTTrigPhase2ShowerProd") << "    Hits preprocessed: " << digiMap.size() << " DT chambers to analyze"
0168                                        << std::endl;
0169 
0170   // 2. Look for showers in each chamber
0171   if (debug_)
0172     LogDebug("DTTrigPhase2ShowerProd") << "    Building shower candidates for:" << std::endl;
0173 
0174   std::map<DTSuperLayerId, ShowerCandidatePtr> ShowerCandidates;
0175   for (const auto& ich : dtGeo_->chambers()) {
0176     const DTChamber* chamb = ich;
0177     DTChamberId chid = chamb->id();
0178     DTDigiMap_iterator dmit = digiMap.find(chid);
0179 
0180     DTSuperLayerId sl1id = chamb->superLayer(1)->id();
0181     DTSuperLayerId sl3id = chamb->superLayer(3)->id();
0182 
0183     if (dmit == digiMap.end())
0184       continue;
0185 
0186     if (debug_)
0187       LogDebug("DTTrigPhase2ShowerProd") << "      " << chid << std::endl;
0188 
0189     showerBuilder->run(iEvent, iEventSetup, (*dmit).second, ShowerCandidates[sl1id], ShowerCandidates[sl3id]);
0190 
0191     // Save the rawId of these shower candidates
0192     ShowerCandidates[sl1id]->rawId(sl1id.rawId());
0193     ShowerCandidates[sl3id]->rawId(sl3id.rawId());
0194   }
0195 
0196   // 3. Check shower candidates and store them if flagged
0197   if (debug_)
0198     LogDebug("DTTrigPhase2ShowerProd") << "    Selecting shower candidates" << std::endl;
0199 
0200   std::vector<L1Phase2MuDTShower> outShower;  // prepare output container
0201   for (auto& sl_showerCand : ShowerCandidates) {
0202     auto showerCandIt = sl_showerCand.second;
0203 
0204     if (showerCandIt->isFlagged()) {
0205       DTSuperLayerId slId(showerCandIt->getRawId());
0206 
0207       if (debug_) {
0208         LogDebug("DTTrigPhase2ShowerProd")
0209             << "      Shower candidate tagged in chamber" << slId.chamberId() << ", SL" << slId.superlayer();
0210       }
0211       // 4. Storing results
0212       outShower.emplace_back(L1Phase2MuDTShower(slId.wheel(),                    // Wheel
0213                                                 slId.sector(),                   // Sector
0214                                                 slId.station(),                  // Station
0215                                                 slId.superlayer(),               // SuperLayer
0216                                                 showerCandIt->getNhits(),        // number of digis
0217                                                 showerCandIt->getBX(),           // BX
0218                                                 showerCandIt->getMinWire(),      // Min wire
0219                                                 showerCandIt->getMaxWire(),      // Max wire
0220                                                 showerCandIt->getAvgPos(),       // Average position
0221                                                 showerCandIt->getAvgTime(),      // Average time
0222                                                 showerCandIt->getWiresProfile()  // Wires profile
0223                                                 ));
0224     }
0225   }
0226   if (debug_)
0227     LogDebug("DTTrigPhase2ShowerProd") << "    Storing results..." << std::endl;
0228 
0229   // 4.1 Storing results
0230   std::unique_ptr<L1Phase2MuDTShowerContainer> resultShower(new L1Phase2MuDTShowerContainer);
0231   resultShower->setContainer(outShower);
0232   iEvent.put(std::move(resultShower));
0233 }
0234 
0235 void DTTrigPhase2ShowerProd::endRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) {
0236   // endRun implementation
0237   if (debug_)
0238     LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: endRun" << std::endl;
0239 }
0240 
0241 void DTTrigPhase2ShowerProd::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0242   // dtTriggerPhase2Shower
0243   edm::ParameterSetDescription desc;
0244   desc.add<edm::InputTag>("digiTag", edm::InputTag("CalibratedDigis"));
0245   desc.add<int>("showerTaggingAlgo", 1);
0246   desc.add<int>("threshold_for_shower", 6);
0247   desc.add<int>("nHits_per_bx", 8);
0248   desc.add<int>("obdt_hits_bxpersistence", 4);
0249   desc.add<int>("obdt_wire_relaxing_time", 2);
0250   desc.add<int>("bmtl1_hits_bxpersistence", 16);
0251   desc.add<int>("scenario", 0);
0252   desc.addUntracked<bool>("debug", false);
0253 
0254   descriptions.add("dtTriggerPhase2Shower", desc);
0255 }
0256 
0257 DEFINE_FWK_MODULE(DTTrigPhase2ShowerProd);