File indexing completed on 2024-09-07 04:37:06
0001 #include "L1Trigger/TrackFindingTMTT/plugins/TMTrackProducer.h"
0002 #include "L1Trigger/TrackFindingTMTT/interface/InputData.h"
0003 #include "L1Trigger/TrackFindingTMTT/interface/Sector.h"
0004 #include "L1Trigger/TrackFindingTMTT/interface/HTrphi.h"
0005 #include "L1Trigger/TrackFindingTMTT/interface/Make3Dtracks.h"
0006 #include "L1Trigger/TrackFindingTMTT/interface/DupFitTrkKiller.h"
0007 #include "L1Trigger/TrackFindingTMTT/interface/TrackFitFactory.h"
0008 #include "L1Trigger/TrackFindingTMTT/interface/L1fittedTrack.h"
0009 #include "L1Trigger/TrackFindingTMTT/interface/ConverterToTTTrack.h"
0010 #include "L1Trigger/TrackFindingTMTT/interface/HTcell.h"
0011 #include "L1Trigger/TrackFindingTMTT/interface/MuxHToutputs.h"
0012 #include "L1Trigger/TrackFindingTMTT/interface/MiniHTstage.h"
0013 #include "L1Trigger/TrackFindingTMTT/interface/Array2D.h"
0014 #include "L1Trigger/TrackFindingTMTT/interface/PrintL1trk.h"
0015
0016 #include "FWCore/Framework/interface/ESHandle.h"
0017
0018 #include <iostream>
0019 #include <vector>
0020 #include <list>
0021 #include <set>
0022 #include <sstream>
0023 #include <mutex>
0024
0025 using namespace std;
0026
0027 namespace tmtt {
0028
0029 namespace {
0030 std::once_flag printOnce;
0031 }
0032
0033 std::unique_ptr<GlobalCacheTMTT> TMTrackProducer::initializeGlobalCache(edm::ParameterSet const& iConfig) {
0034 return std::make_unique<GlobalCacheTMTT>(iConfig);
0035 }
0036
0037 TMTrackProducer::TMTrackProducer(const edm::ParameterSet& iConfig, GlobalCacheTMTT const* globalCacheTMTT)
0038 : settings_(iConfig),
0039 stubWindowSuggest_(globalCacheTMTT->stubWindowSuggest()),
0040 hists_(globalCacheTMTT->hists()),
0041 htRphiErrMon_(globalCacheTMTT->htRphiErrMon()),
0042 debug_(true)
0043 {
0044 using namespace edm;
0045
0046
0047 magneticFieldToken_ =
0048 esConsumes<MagneticField, IdealMagneticFieldRecord, Transition::BeginRun>(settings_.magneticFieldInputTag());
0049 trackerGeometryToken_ = esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, Transition::BeginRun>(
0050 settings_.trackerGeometryInputTag());
0051 trackerTopologyToken_ =
0052 esConsumes<TrackerTopology, TrackerTopologyRcd, Transition::BeginRun>(settings_.trackerTopologyInputTag());
0053 ttStubAlgoToken_ =
0054 esConsumes<StubAlgorithm, TTStubAlgorithmRecord, Transition::BeginRun>(settings_.ttStubAlgoInputTag());
0055
0056
0057 stubToken_ = consumes<TTStubDetSetVec>(settings_.stubInputTag());
0058 if (settings_.enableMCtruth()) {
0059
0060 tpToken_ = consumes<TrackingParticleCollection>(settings_.tpInputTag());
0061 stubTruthToken_ = consumes<TTStubAssMap>(settings_.stubTruthInputTag());
0062 clusterTruthToken_ = consumes<TTClusterAssMap>(settings_.clusterTruthInputTag());
0063 genJetToken_ = consumes<reco::GenJetCollection>(settings_.genJetInputTag());
0064 }
0065
0066 trackFitters_ = settings_.trackFitters();
0067 useRZfilter_ = settings_.useRZfilter();
0068 runRZfilter_ = (not useRZfilter_.empty());
0069
0070
0071
0072
0073
0074 for (const string& fitterName : trackFitters_) {
0075 fitterWorkerMap_[fitterName] = trackFitFactory::create(fitterName, &settings_);
0076 }
0077
0078
0079
0080 if (settings_.enableOutputIntermediateTTTracks()) {
0081
0082 produces<TTTrackCollection>("TML1TracksHT").setBranchAlias("TML1TracksHT");
0083
0084 if (runRZfilter_)
0085 produces<TTTrackCollection>("TML1TracksRZ").setBranchAlias("TML1TracksRZ");
0086 }
0087
0088 for (const string& fitterName : trackFitters_) {
0089 string edmName = string("TML1Tracks") + fitterName;
0090 produces<TTTrackCollection>(edmName).setBranchAlias(edmName);
0091 }
0092 }
0093
0094
0095
0096 void TMTrackProducer::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0097
0098 const MagneticField* theMagneticField = &(iSetup.getData(magneticFieldToken_));
0099 float bField = theMagneticField->inTesla(GlobalPoint(0, 0, 0)).z();
0100 settings_.setMagneticField(bField);
0101
0102
0103 globalCache()->settings().setMagneticField(bField);
0104
0105 std::stringstream text;
0106 text << "\n--- B field = " << bField << " Tesla ---\n";
0107 std::call_once(printOnce, [](string t) { PrintL1trk() << t; }, text.str());
0108
0109
0110 trackerGeometry_ = &(iSetup.getData(trackerGeometryToken_));
0111 trackerTopology_ = &(iSetup.getData(trackerTopologyToken_));
0112
0113
0114
0115
0116 TrackerModule::ModuleTypeCfg moduleTypeCfg;
0117 moduleTypeCfg.pitchVsType = settings_.pitchVsType();
0118 moduleTypeCfg.spaceVsType = settings_.spaceVsType();
0119 moduleTypeCfg.barrelVsType = settings_.barrelVsType();
0120 moduleTypeCfg.psVsType = settings_.psVsType();
0121 moduleTypeCfg.tiltedVsType = settings_.tiltedVsType();
0122
0123 listTrackerModule_.clear();
0124 for (const GeomDet* gd : trackerGeometry_->dets()) {
0125 DetId detId = gd->geographicalId();
0126
0127 if (detId.subdetId() != StripSubdetector::TOB && detId.subdetId() != StripSubdetector::TID)
0128 continue;
0129 if (trackerTopology_->isLower(detId)) {
0130
0131 listTrackerModule_.emplace_back(trackerGeometry_, trackerTopology_, moduleTypeCfg, detId);
0132 }
0133 }
0134
0135
0136 globalCache()->setListTrackerModule(listTrackerModule_);
0137
0138
0139 stubAlgo_ = dynamic_cast<const StubAlgorithmOfficial*>(&iSetup.getData(ttStubAlgoToken_));
0140
0141 const edm::ESHandle<StubAlgorithm> stubAlgoHandle = iSetup.getHandle(ttStubAlgoToken_);
0142 const edm::ParameterSet& pSetStubAlgo = getParameterSet(stubAlgoHandle.description()->pid_);
0143 stubFEWindows_ = std::make_unique<StubFEWindows>(pSetStubAlgo);
0144
0145 stubWindowSuggest_.setFEWindows(stubFEWindows_.get());
0146 degradeBend_ = std::make_unique<DegradeBend>(trackerTopology_, stubFEWindows_.get(), stubAlgo_);
0147 }
0148
0149
0150
0151 void TMTrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0152
0153 InputData inputData(iEvent,
0154 iSetup,
0155 &settings_,
0156 &stubWindowSuggest_,
0157 degradeBend_.get(),
0158 trackerGeometry_,
0159 trackerTopology_,
0160 listTrackerModule_,
0161 tpToken_,
0162 stubToken_,
0163 stubTruthToken_,
0164 clusterTruthToken_,
0165 genJetToken_);
0166
0167 const list<TP>& vTPs = inputData.getTPs();
0168 const list<Stub*>& vStubs = inputData.stubs();
0169
0170
0171 Array2D<unique_ptr<Sector>> mSectors(settings_.numPhiSectors(), settings_.numEtaRegions());
0172
0173 Array2D<unique_ptr<HTrphi>> mHtRphis(settings_.numPhiSectors(), settings_.numEtaRegions());
0174
0175 Array2D<unique_ptr<Make3Dtracks>> mMake3Dtrks(settings_.numPhiSectors(), settings_.numEtaRegions());
0176
0177 Array2D<map<string, std::list<L1fittedTrack>>> mapmFitTrks(settings_.numPhiSectors(), settings_.numEtaRegions());
0178
0179 map<string, list<const L1fittedTrack*>> mapFinalTracks;
0180
0181
0182
0183 const ConverterToTTTrack converter(&settings_);
0184
0185
0186 auto htTTTracksForOutput = std::make_unique<TTTrackCollection>();
0187 auto rzTTTracksForOutput = std::make_unique<TTTrackCollection>();
0188 map<string, unique_ptr<TTTrackCollection>> allFitTTTracksForOutput;
0189 for (const string& fitterName : trackFitters_) {
0190 auto fitTTTracksForOutput = std::make_unique<TTTrackCollection>();
0191 allFitTTTracksForOutput[fitterName] = std::move(fitTTTracksForOutput);
0192 }
0193
0194
0195
0196
0197 for (unsigned int iPhiSec = 0; iPhiSec < settings_.numPhiSectors(); iPhiSec++) {
0198 for (unsigned int iEtaReg = 0; iEtaReg < settings_.numEtaRegions(); iEtaReg++) {
0199
0200 mSectors(iPhiSec, iEtaReg) = std::make_unique<Sector>(&settings_, iPhiSec, iEtaReg);
0201 Sector* sector = mSectors(iPhiSec, iEtaReg).get();
0202
0203 mHtRphis(iPhiSec, iEtaReg) = std::make_unique<HTrphi>(
0204 &settings_, iPhiSec, iEtaReg, sector->etaMin(), sector->etaMax(), sector->phiCentre(), &htRphiErrMon_);
0205 HTrphi* htRphi = mHtRphis(iPhiSec, iEtaReg).get();
0206
0207
0208 if (settings_.isHTRPhiEtaRegWhitelisted(iEtaReg)) {
0209 for (Stub* stub : vStubs) {
0210
0211
0212
0213 if (settings_.enableDigitize())
0214 stub->digitize(iPhiSec, Stub::DigiStage::GP);
0215
0216
0217 bool inside = sector->inside(stub);
0218
0219 if (inside) {
0220
0221 const vector<bool> inEtaSubSecs = sector->insideEtaSubSecs(stub);
0222
0223
0224 if (settings_.enableDigitize())
0225 stub->digitize(iPhiSec, Stub::DigiStage::HT);
0226
0227
0228 htRphi->store(stub, inEtaSubSecs);
0229 }
0230 }
0231 }
0232
0233
0234 htRphi->end();
0235 }
0236 }
0237
0238 if (settings_.muxOutputsHT() > 0) {
0239
0240
0241
0242 MuxHToutputs muxHT(&settings_);
0243 muxHT.exec(mHtRphis);
0244 }
0245
0246
0247 if (settings_.miniHTstage()) {
0248 MiniHTstage miniHTstage(&settings_);
0249 miniHTstage.exec(mHtRphis);
0250 }
0251
0252
0253
0254 for (unsigned int iPhiSec = 0; iPhiSec < settings_.numPhiSectors(); iPhiSec++) {
0255 for (unsigned int iEtaReg = 0; iEtaReg < settings_.numEtaRegions(); iEtaReg++) {
0256 const Sector* sector = mSectors(iPhiSec, iEtaReg).get();
0257
0258
0259 const HTrphi* htRphi = mHtRphis(iPhiSec, iEtaReg).get();
0260 const list<L1track2D>& vecTracksRphi = htRphi->trackCands2D();
0261
0262
0263 mMake3Dtrks(iPhiSec, iEtaReg) = std::make_unique<Make3Dtracks>(
0264 &settings_, iPhiSec, iEtaReg, sector->etaMin(), sector->etaMax(), sector->phiCentre());
0265 Make3Dtracks* make3Dtrk = mMake3Dtrks(iPhiSec, iEtaReg).get();
0266
0267
0268 make3Dtrk->run(vecTracksRphi);
0269
0270 if (settings_.enableOutputIntermediateTTTracks()) {
0271
0272
0273 const list<L1track3D>& vecTrk3D_ht = make3Dtrk->trackCands3D(false);
0274 for (const L1track3D& trk : vecTrk3D_ht) {
0275 TTTrack<Ref_Phase2TrackerDigi_> htTTTrack = converter.makeTTTrack(&trk, iPhiSec, iEtaReg);
0276 htTTTracksForOutput->push_back(htTTTrack);
0277 }
0278
0279 if (runRZfilter_) {
0280 const list<L1track3D>& vecTrk3D_rz = make3Dtrk->trackCands3D(true);
0281 for (const L1track3D& trk : vecTrk3D_rz) {
0282 TTTrack<Ref_Phase2TrackerDigi_> rzTTTrack = converter.makeTTTrack(&trk, iPhiSec, iEtaReg);
0283 rzTTTracksForOutput->push_back(rzTTTrack);
0284 }
0285 }
0286 }
0287 }
0288 }
0289
0290
0291
0292
0293 for (const string& fitterName : trackFitters_) {
0294 for (unsigned int iPhiSec = 0; iPhiSec < settings_.numPhiSectors(); iPhiSec++) {
0295 for (unsigned int iEtaReg = 0; iEtaReg < settings_.numEtaRegions(); iEtaReg++) {
0296 const Make3Dtracks* make3Dtrk = mMake3Dtrks(iPhiSec, iEtaReg).get();
0297
0298
0299 bool useRZfilt = (std::count(useRZfilter_.begin(), useRZfilter_.end(), fitterName) > 0);
0300
0301
0302 const list<L1track3D>& vecTrk3D = make3Dtrk->trackCands3D(useRZfilt);
0303
0304
0305 list<L1fittedTrack>& fitTrksInSec = mapmFitTrks(iPhiSec, iEtaReg)[fitterName];
0306
0307
0308 for (const L1track3D& trk : vecTrk3D) {
0309
0310 if (settings_.enableDigitize()) {
0311 const vector<Stub*>& stubsOnTrk = trk.stubs();
0312 for (Stub* s : stubsOnTrk) {
0313
0314 s->digitize(iPhiSec, Stub::DigiStage::TF);
0315 }
0316 }
0317
0318 L1fittedTrack fitTrk = fitterWorkerMap_[fitterName]->fit(trk);
0319
0320 if (fitTrk.accepted()) {
0321
0322 if (settings_.enableDigitize())
0323 fitTrk.digitizeTrack(fitterName);
0324
0325 fitTrksInSec.push_back(fitTrk);
0326 }
0327 }
0328 }
0329 }
0330 }
0331
0332
0333
0334
0335 DupFitTrkKiller killDupFitTrks(&settings_);
0336
0337
0338 for (const string& fitterName : trackFitters_) {
0339 for (unsigned int iPhiSec = 0; iPhiSec < settings_.numPhiSectors(); iPhiSec++) {
0340 for (unsigned int iEtaReg = 0; iEtaReg < settings_.numEtaRegions(); iEtaReg++) {
0341
0342 const list<L1fittedTrack>& fitTrksInSec = mapmFitTrks(iPhiSec, iEtaReg)[fitterName];
0343
0344
0345 list<const L1fittedTrack*> filteredFitTrksInSec = killDupFitTrks.filter(fitTrksInSec);
0346
0347
0348 for (const L1fittedTrack* fitTrk : filteredFitTrksInSec) {
0349
0350 TTTrack<Ref_Phase2TrackerDigi_> fitTTTrack = converter.makeTTTrack(fitTrk, iPhiSec, iEtaReg);
0351 allFitTTTracksForOutput[fitterName]->push_back(fitTTTrack);
0352 }
0353
0354
0355 mapFinalTracks[fitterName].insert(
0356 mapFinalTracks[fitterName].end(), filteredFitTrksInSec.begin(), filteredFitTrksInSec.end());
0357 }
0358 }
0359 }
0360
0361
0362 if (debug_) {
0363 PrintL1trk() << "INPUT #TPs = " << vTPs.size() << " #STUBs = " << vStubs.size();
0364 unsigned int numHTtracks = 0;
0365 for (unsigned int iPhiSec = 0; iPhiSec < settings_.numPhiSectors(); iPhiSec++) {
0366 for (unsigned int iEtaReg = 0; iEtaReg < settings_.numEtaRegions(); iEtaReg++) {
0367 const Make3Dtracks* make3Dtrk = mMake3Dtrks(iPhiSec, iEtaReg).get();
0368 numHTtracks += make3Dtrk->trackCands3D(false).size();
0369 }
0370 }
0371 PrintL1trk() << "Number of tracks after HT = " << numHTtracks;
0372 for (const auto& p : mapFinalTracks) {
0373 const string& fitName = p.first;
0374 const list<const L1fittedTrack*> fittedTracks = p.second;
0375 PrintL1trk() << "Number of tracks after " << fitName << " track helix fit = " << fittedTracks.size();
0376 }
0377 }
0378
0379
0380 for (Stub* stub : vStubs) {
0381 if (settings_.enableDigitize())
0382 stub->setDigitizeWarningsOn(false);
0383 }
0384
0385
0386 hists_.fill(inputData, mSectors, mHtRphis, mMake3Dtrks, mapFinalTracks);
0387
0388
0389 if (settings_.enableOutputIntermediateTTTracks()) {
0390 iEvent.put(std::move(htTTTracksForOutput), "TML1TracksHT");
0391 if (runRZfilter_)
0392 iEvent.put(std::move(rzTTTracksForOutput), "TML1TracksRZ");
0393 }
0394 for (const string& fitterName : trackFitters_) {
0395 string edmName = string("TML1Tracks") + fitterName;
0396 iEvent.put(std::move(allFitTTTracksForOutput[fitterName]), edmName);
0397 }
0398 }
0399
0400 void TMTrackProducer::globalEndJob(GlobalCacheTMTT* globalCacheTMTT) {
0401 const Settings& settings = globalCacheTMTT->settings();
0402
0403
0404 if (settings.printStubWindows())
0405 globalCacheTMTT->stubWindowSuggest().printResults();
0406
0407
0408 globalCacheTMTT->hists().trackerGeometryAnalysis(globalCacheTMTT->listTrackerModule());
0409
0410 PrintL1trk() << "\n Number of (eta,phi) sectors used = (" << settings.numEtaRegions() << ","
0411 << settings.numPhiSectors() << ")";
0412
0413
0414 globalCacheTMTT->hists().endJobAnalysis(&(globalCacheTMTT->htRphiErrMon()));
0415 }
0416
0417 }
0418
0419 DEFINE_FWK_MODULE(tmtt::TMTrackProducer);