File indexing completed on 2025-04-15 22:41:36
0001
0002
0003
0004
0005
0006
0007
0008
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
0026 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0027 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0028 #include "Geometry/DTGeometry/interface/DTLayer.h"
0029
0030
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
0041 #include "L1Trigger/DTTriggerPhase2/interface/ShowerBuilder.h"
0042 #include "L1Trigger/DTTriggerPhase2/interface/ShowerCandidate.h"
0043
0044
0045 #include "DQM/DTMonitorModule/interface/DTTrigGeomUtils.h"
0046
0047
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
0058
0059
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
0066
0067
0068 DTTrigPhase2ShowerProd(const edm::ParameterSet& pset);
0069
0070
0071 ~DTTrigPhase2ShowerProd() override;
0072
0073
0074 void beginRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) override;
0075
0076
0077 void produce(edm::Event& iEvent, const edm::EventSetup& iEventSetup) override;
0078
0079
0080 void endRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) override;
0081
0082 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0083
0084
0085 const DTGeometry* dtGeo_;
0086 edm::ESGetToken<DTGeometry, MuonGeometryRecord> dtGeomH;
0087
0088 private:
0089
0090 bool debug_;
0091 int showerTaggingAlgo_;
0092 edm::InputTag digiTag_;
0093 edm::EDGetTokenT<DTDigiCollection> dtDigisToken_;
0094 std::unique_ptr<ShowerBuilder> showerBuilder;
0095 };
0096
0097
0098 DTTrigPhase2ShowerProd::DTTrigPhase2ShowerProd(const ParameterSet& pset) {
0099
0100 produces<L1Phase2MuDTShowerContainer>();
0101
0102 debug_ = pset.getUntrackedParameter<bool>("debug");
0103 digiTag_ = pset.getParameter<edm::InputTag>("digiTag");
0104 showerTaggingAlgo_ = pset.getParameter<int>("showerTaggingAlgo");
0105
0106
0107 dtDigisToken_ = consumes<DTDigiCollection>(digiTag_);
0108
0109
0110 edm::ConsumesCollector consumesColl(consumesCollector());
0111 showerBuilder = std::make_unique<ShowerBuilder>(pset, consumesColl);
0112
0113
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
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
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
0146 if (debug_)
0147 LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: produce Processing event" << std::endl;
0148
0149
0150 edm::Handle<DTDigiCollection> dtdigis;
0151 iEvent.getByToken(dtDigisToken_, dtdigis);
0152
0153
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;
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
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
0192 ShowerCandidates[sl1id]->rawId(sl1id.rawId());
0193 ShowerCandidates[sl3id]->rawId(sl3id.rawId());
0194 }
0195
0196
0197 if (debug_)
0198 LogDebug("DTTrigPhase2ShowerProd") << " Selecting shower candidates" << std::endl;
0199
0200 std::vector<L1Phase2MuDTShower> outShower;
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
0212 outShower.emplace_back(L1Phase2MuDTShower(slId.wheel(),
0213 slId.sector(),
0214 slId.station(),
0215 slId.superlayer(),
0216 showerCandIt->getNhits(),
0217 showerCandIt->getBX(),
0218 showerCandIt->getMinWire(),
0219 showerCandIt->getMaxWire(),
0220 showerCandIt->getAvgPos(),
0221 showerCandIt->getAvgTime(),
0222 showerCandIt->getWiresProfile()
0223 ));
0224 }
0225 }
0226 if (debug_)
0227 LogDebug("DTTrigPhase2ShowerProd") << " Storing results..." << std::endl;
0228
0229
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
0237 if (debug_)
0238 LogDebug("DTTrigPhase2ShowerProd") << "DTTrigPhase2ShowerProd: endRun" << std::endl;
0239 }
0240
0241 void DTTrigPhase2ShowerProd::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0242
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);