From 2126db845f378d229fc1816d361b6ecfd6ee113c Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Tue, 10 Sep 2024 17:18:22 +0100 Subject: [PATCH 1/3] squashed commits since last PR to central CMSSW --- L1Trigger/TrackFindingTracklet/README.md | 2 +- .../TrackFindingTracklet/interface/Settings.h | 37 +++- .../interface/TrackletConfigBuilder.h | 1 + .../plugins/L1FPGATrackProducer.cc | 23 +- .../plugins/ProducerAS.cc | 97 --------- .../plugins/ProducerKFout.cc | 200 ++++++++---------- .../plugins/ProducerTT.cc | 131 ------------ .../python/Analyzer_cff.py | 1 - .../python/Customize_cff.py | 4 + .../python/Producer_cff.py | 2 - .../python/Producer_cfi.py | 3 +- .../l1tTTTracksFromTrackletEmulation_cfi.py | 9 +- .../TrackFindingTracklet/src/FitTrack.cc | 5 +- .../src/TrackletCalculatorDisplaced.cc | 3 + .../src/TrackletConfigBuilder.cc | 188 +++++++++++++--- .../TrackFindingTracklet/src/VMRouterCM.cc | 14 +- .../TrackFindingTracklet/test/AnalyzerTT.cc | 129 ----------- .../test/HybridTracksNewKF_cfg.py | 9 +- .../test/L1TrackNtupleMaker_cfg.py | 8 +- .../test/L1TrackNtuplePlot.C | 29 ++- .../TrackFindingTracklet/test/makeHists.csh | 2 +- .../TrackerDTC/python/AnalyzerDAQ_cff.py | 1 + L1Trigger/TrackerDTC/python/Analyzer_cff.py | 1 + L1Trigger/TrackerDTC/test/testDAQ_cfg.py | 34 ++- L1Trigger/TrackerDTC/test/test_cfg.py | 26 +-- L1Trigger/TrackerTFP/interface/DataFormats.h | 6 +- 26 files changed, 384 insertions(+), 581 deletions(-) delete mode 100644 L1Trigger/TrackFindingTracklet/plugins/ProducerAS.cc delete mode 100644 L1Trigger/TrackFindingTracklet/plugins/ProducerTT.cc delete mode 100644 L1Trigger/TrackFindingTracklet/test/AnalyzerTT.cc diff --git a/L1Trigger/TrackFindingTracklet/README.md b/L1Trigger/TrackFindingTracklet/README.md index d898e51d03857..f0ce377f62a95 100644 --- a/L1Trigger/TrackFindingTracklet/README.md +++ b/L1Trigger/TrackFindingTracklet/README.md @@ -1,4 +1,4 @@ -To run the L1 tracking & create a TTree of tracking performance: +To run the L1 tracking & create a TTree of tracking performance: cmsRun L1TrackNtupleMaker_cfg.py diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 774e595ae62b0..08d884410e582 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -267,6 +267,13 @@ namespace trklet { bool extended() const { return extended_; } void setExtended(bool extended) { extended_ = extended; } + bool duplicateMPs() const { return duplicateMPs_; } + std::array layersDisksDuplicatedEqualProjBalance() const { + return layersDisksDuplicatedEqualProjBalance_; + } + std::array layersDisksDuplicatedWeightedProjBalance() const { + return layersDisksDuplicatedWeightedProjBalance_; + } bool combined() const { return combined_; } void setCombined(bool combined) { combined_ = combined; } bool reduced() const { return reduced_; } @@ -1028,11 +1035,31 @@ namespace trklet { bool reduced_{false}; // use reduced (Summer Chain) config bool inventStubs_{false}; // invent seeding stub coordinates based on tracklet traj - // Use combined TP (TE+TC) and MP (PR+ME+MC) configuration (with prompt tracking) - bool combined_{false}; - // N.B. To use combined modules with extended tracking, edit - // Tracklet_cfi.py to refer to *_hourglassExtendedCombined.dat, - // but leave combined_=false. + // Use combined TP (TE+TC) & MP (PR+ME+MC) config (with prompt tracking) + bool combined_{true}; + // N.B. For extended tracking, this combined_ is overridden by python cfg + // to false, but combined modules are nonetheless used by default. + // If you don't want them, edit l1tTTTracksFromTrackletEmulation_cfi.py + // to refer to *_hourglassExtended.dat . + + // Use chain with duplicated MPs for L3,L4 to reduce truncation issue + // Balances load from projections roughly in half for each of the two MPs + bool duplicateMPs_{false}; + + // Determines which layers, disks the MatchProcessor is duplicated for + // (note: in TCB by default always duplicated for phi B, C as truncation is significantly worse than A, D) + // All layers, disks disabled by default, also is overwritten by above duplicateMPs bool + + // EqualProjBalancing is for layers for which the projections to each duplicated MP are split in half sequentially + std::array layersDisksDuplicatedEqualProjBalance_{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + // Weighted proj balancing is for specifically L4, L5 where the split of the projections is weighted to account for + // Higher occupancy in the L1L2 seed to minimize truncation + std::array layersDisksDuplicatedWeightedProjBalance_{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + // Example use where for L3, L4, L5, D2, D3, the layers/disks where truncation is worst + //std::array layersDisksDuplicatedEqualProjBalance_{{0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0}}; + //std::array layersDisksDuplicatedWeightedProjBalance_{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}}; std::string skimfile_{""}; //if not empty events will be written out in ascii format to this file diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletConfigBuilder.h b/L1Trigger/TrackFindingTracklet/interface/TrackletConfigBuilder.h index 49403db972260..f451c05ad95a7 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletConfigBuilder.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletConfigBuilder.h @@ -232,6 +232,7 @@ namespace trklet { unsigned int NSector_; //Number of sectors double rcrit_; //critical radius that defines the sector + bool duplicateMPs_; //if true write configuration with MPs duplicated for L3,L4 bool combinedmodules_; //if true write configuration for combined modules bool extended_; //if true write configuration for extended configuration diff --git a/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc b/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc index b05594a956da6..8a3055c3173ee 100644 --- a/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc +++ b/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc @@ -153,7 +153,9 @@ class L1FPGATrackProducer : public edm::one::EDProducer { bool readMoreMcTruth_; /// File path for configuration files +#ifndef USEHYBRID edm::FileInPath fitPatternFile; +#endif edm::FileInPath memoryModulesFile; edm::FileInPath processingModulesFile; edm::FileInPath wiresFile; @@ -254,7 +256,6 @@ L1FPGATrackProducer::L1FPGATrackProducer(edm::ParameterSet const& iConfig) asciiEventOutName_ = iConfig.getUntrackedParameter("asciiFileName", ""); - fitPatternFile = iConfig.getParameter("fitPatternFile"); processingModulesFile = iConfig.getParameter("processingModulesFile"); memoryModulesFile = iConfig.getParameter("memoryModulesFile"); wiresFile = iConfig.getParameter("wiresFile"); @@ -281,8 +282,15 @@ L1FPGATrackProducer::L1FPGATrackProducer(edm::ParameterSet const& iConfig) settings_.setExtended(extended_); settings_.setReduced(reduced_); settings_.setNHelixPar(nHelixPar_); + // combined_ must be false for extended tracking, regardless of whether + // combined modules are used or not. + if (extended_) + settings_.setCombined(false); +#ifndef USEHYBRID + fitPatternFile = iConfig.getParameter("fitPatternFile"); settings_.setFitPatternFile(fitPatternFile.fullPath()); +#endif settings_.setProcessingModulesFile(processingModulesFile.fullPath()); settings_.setMemoryModulesFile(memoryModulesFile.fullPath()); settings_.setWiresFile(wiresFile.fullPath()); @@ -308,10 +316,12 @@ L1FPGATrackProducer::L1FPGATrackProducer(edm::ParameterSet const& iConfig) } if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "fit pattern : " << fitPatternFile.fullPath() - << "\n process modules : " << processingModulesFile.fullPath() - << "\n memory modules : " << memoryModulesFile.fullPath() - << "\n wires : " << wiresFile.fullPath(); + edm::LogVerbatim("Tracklet") +#ifndef USEHYBRID + << "fit pattern : " << fitPatternFile.fullPath() +#endif + << "\n process modules : " << processingModulesFile.fullPath() + << "\n memory modules : " << memoryModulesFile.fullPath() << "\n wires : " << wiresFile.fullPath(); if (extended_) { edm::LogVerbatim("Tracklet") << "table_TED : " << tableTEDFile.fullPath() << "\n table_TRE : " << tableTREFile.fullPath(); @@ -750,9 +760,6 @@ void L1FPGATrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe // trackQualityModel_->setBonusFeatures(hph.bonusFeatures()); // } - // test track word - //aTrack.testTrackWordBits(); - // set track word again to set MVA variable from TTTrack into track word aTrack.setTrackWordBits(); // test track word diff --git a/L1Trigger/TrackFindingTracklet/plugins/ProducerAS.cc b/L1Trigger/TrackFindingTracklet/plugins/ProducerAS.cc deleted file mode 100644 index 57950993746b3..0000000000000 --- a/L1Trigger/TrackFindingTracklet/plugins/ProducerAS.cc +++ /dev/null @@ -1,97 +0,0 @@ -#include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/Framework/interface/Run.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Utilities/interface/EDPutToken.h" -#include "FWCore/Utilities/interface/ESGetToken.h" -#include "FWCore/Utilities/interface/InputTag.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "DataFormats/Common/interface/Handle.h" - -#include "DataFormats/L1TrackTrigger/interface/TTTypes.h" -#include "L1Trigger/TrackTrigger/interface/Setup.h" - -#include - -using namespace std; -using namespace edm; -using namespace tt; - -namespace trklet { - - /*! \class trklet::ProducerAS - * \brief Associate the TTTracks output by KF fitter with the tracks input to KF fitter. - * \author Thomas Schuh - * \date 2020, Oct - */ - class ProducerAS : public stream::EDProducer<> { - public: - explicit ProducerAS(const ParameterSet&); - ~ProducerAS() override {} - - private: - void beginRun(const Run&, const EventSetup&) override; - void produce(Event&, const EventSetup&) override; - void endJob() {} - - // ED input token of kf tracks - EDGetTokenT edGetTokenKF_; - // ED input token of kf TTtracks - EDGetTokenT edGetTokenTT_; - // ED output token for TTTrackRefMap - EDPutTokenT edPutToken_; - // Setup token - ESGetToken esGetTokenSetup_; - // configuration - ParameterSet iConfig_; - // helper class to store configurations - const Setup* setup_ = nullptr; - }; - - ProducerAS::ProducerAS(const ParameterSet& iConfig) : iConfig_(iConfig) { - const string& labelKF = iConfig.getParameter("LabelKF"); - const string& labelTT = iConfig.getParameter("LabelTT"); - const string& branch = iConfig.getParameter("BranchAcceptedTracks"); - // book in- and output ED products - edGetTokenKF_ = consumes(InputTag(labelKF, branch)); - edGetTokenTT_ = consumes(InputTag(labelTT, branch)); - edPutToken_ = produces(branch); - // book ES products - esGetTokenSetup_ = esConsumes(); - } - - void ProducerAS::beginRun(const Run& iRun, const EventSetup& iSetup) { - // helper class to store configurations - setup_ = &iSetup.getData(esGetTokenSetup_); - if (!setup_->configurationSupported()) - return; - // check process history if desired - if (iConfig_.getParameter("CheckHistory")) - setup_->checkHistory(iRun.processHistory()); - } - - void ProducerAS::produce(Event& iEvent, const EventSetup& iSetup) { - // empty KFTTTrack product - TTTrackRefMap ttTrackMap; - // read in KF Product and produce AssociatorKF product - if (setup_->configurationSupported()) { - Handle handleKF; - iEvent.getByToken(edGetTokenKF_, handleKF); - const StreamsTrack& streams = *handleKF.product(); - Handle handleTT; - iEvent.getByToken(edGetTokenTT_, handleTT); - int i(0); - for (const StreamTrack& stream : streams) - for (const FrameTrack& frame : stream) - if (frame.first.isNonnull()) - ttTrackMap.emplace(TTTrackRef(handleTT, i++), frame.first); - } - // store products - iEvent.emplace(edPutToken_, std::move(ttTrackMap)); - } - -} // namespace trklet - -DEFINE_FWK_MODULE(trklet::ProducerAS); diff --git a/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc b/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc index 3c6554e16c3cd..3e5157dbe830d 100644 --- a/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc +++ b/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc @@ -25,13 +25,14 @@ using namespace tt; namespace trklet { /*! \class trklet::ProducerKFout - * \brief Converts KF output into TFP output + * \brief Converts KF output into tttrack collection and TFP output * A bit accurate emulation of the track transformation, the * eta routing and splitting of the 96-bit track words into 64-bit * packets. Also run is a bit accurate emulation of the track quality * BDT, whose output is also added to the track word. * \author Christopher Brown * \date 2021, Aug + * \update 2024, June by Claire Savard */ class ProducerKFout : public stream::EDProducer<> { public: @@ -47,10 +48,10 @@ namespace trklet { EDGetTokenT edGetTokenStubs_; // ED input token of kf tracks EDGetTokenT edGetTokenTracks_; - // ED input token of kf input to kf output TTTrack map - EDGetTokenT edGetTokenTTTrackRefMap_; // ED output token for accepted kfout tracks EDPutTokenT edPutTokenAccepted_; + // ED output token for TTTracks + EDPutTokenT edPutTokenTTTracks_; // ED output token for truncated kfout tracks EDPutTokenT edPutTokenLost_; // Setup token @@ -68,14 +69,12 @@ namespace trklet { vector dZBins_; std::unique_ptr trackQualityModel_; - vector tqBins_; double tqTanlScale_; double tqZ0Scale_; static constexpr double ap_fixed_rescale = 32.0; // For convenience and keeping readable code, accessed many times int numWorkers_; - int partialTrackWordBits_; // Helper function to convert floating value to bin @@ -93,15 +92,15 @@ namespace trklet { ProducerKFout::ProducerKFout(const ParameterSet& iConfig) : iConfig_(iConfig) { const string& labelKF = iConfig.getParameter("LabelKF"); - const string& labelAS = iConfig.getParameter("LabelAS"); const string& branchStubs = iConfig.getParameter("BranchAcceptedStubs"); const string& branchTracks = iConfig.getParameter("BranchAcceptedTracks"); + const string& branchTTTracks = iConfig.getParameter("BranchAcceptedTTTracks"); const string& branchLost = iConfig.getParameter("BranchLostTracks"); // book in- and output ED products edGetTokenStubs_ = consumes(InputTag(labelKF, branchStubs)); edGetTokenTracks_ = consumes(InputTag(labelKF, branchTracks)); - edGetTokenTTTrackRefMap_ = consumes(InputTag(labelAS, branchTracks)); edPutTokenAccepted_ = produces(branchTracks); + edPutTokenTTTracks_ = produces(branchTTTracks); edPutTokenLost_ = produces(branchLost); // book ES products esGetTokenSetup_ = esConsumes(); @@ -112,7 +111,6 @@ namespace trklet { trackQualityModel_ = std::make_unique(iConfig.getParameter("TrackQualityPSet")); edm::ParameterSet trackQualityPSset = iConfig.getParameter("TrackQualityPSet"); - tqBins_ = trackQualityPSset.getParameter>("tqemu_bins"); tqTanlScale_ = trackQualityPSset.getParameter("tqemu_TanlScale"); tqZ0Scale_ = trackQualityPSset.getParameter("tqemu_Z0Scale"); } @@ -129,7 +127,6 @@ namespace trklet { dataFormats_ = &iSetup.getData(esGetTokenDataFormats_); // Calculate 1/dz**2 and 1/dphi**2 bins for v0 and v1 weightings - float temp_dphi = 0.0; float temp_dz = 0.0; for (int i = 0; @@ -165,72 +162,48 @@ namespace trklet { Handle handleTracks; iEvent.getByToken(edGetTokenTracks_, handleTracks); const StreamsTrack& streamsTracks = *handleTracks.product(); - Handle handleTTTrackRefMap; - iEvent.getByToken(edGetTokenTTTrackRefMap_, handleTTTrackRefMap); - const TTTrackRefMap& ttTrackRefMap = *handleTTTrackRefMap.product(); - // 18 Output Links (First Vector) each has a vector of tracks per event (second vector) each track is 3 32 bit TTBV partial tracks - vector> sortedPartialTracks(setup_->numRegions() * setup_->tfpNumChannel(), vector(0)); - - TrackKFOutSAPtrCollectionss inTrackStreams; - TrackKFOutSAPtrCollectionss outTrackStreams; - - // Setup empty collections for input tracks to be routed - for (int iRegion = 0; iRegion < setup_->numRegions(); iRegion++) { - TrackKFOutSAPtrCollections temp_collection; - for (int iLink = 0; iLink < setup_->tfpNumChannel(); iLink++) { - TrackKFOutSAPtrCollection temp; - for (int iTrack = 0; iTrack < setup_->numFramesIO(); iTrack++) - temp.emplace_back(std::make_shared()); - temp_collection.push_back(temp); - } - outTrackStreams.push_back(temp_collection); - } - - // Setup empty collections for output tracks from routing - for (int iRegion = 0; iRegion < setup_->numRegions(); iRegion++) { - TrackKFOutSAPtrCollections temp_collection; - for (int iLink = 0; iLink < numWorkers_; iLink++) { - TrackKFOutSAPtrCollection temp; - for (int iTrack = 0; iTrack < setup_->numFramesIO(); iTrack++) - temp.emplace_back(std::make_shared()); - temp_collection.push_back(temp); - } - inTrackStreams.push_back(temp_collection); - } - StreamsTrack outputStreamsTracks(setup_->numRegions() * setup_->tfpNumChannel()); + // Setup KFout track collection + TrackKFOutSAPtrCollection KFoutTracks; // Setup containers for track quality float tempTQMVAPreSig = 0.0; // Due to ap_fixed implementation in CMSSW this 10,5 must be specified at compile time, TODO make this a changeable parameter std::vector> trackQuality_inputs = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + // calculate track quality and fill TTTracks + TTTracks ttTracks; + int nTracks(0); + for (const StreamTrack& stream : streamsTracks) + nTracks += accumulate(stream.begin(), stream.end(), 0, [](int sum, const FrameTrack& frame) { + return sum + (frame.first.isNonnull() ? 1 : 0); + }); + ttTracks.reserve(nTracks); for (int iLink = 0; iLink < (int)streamsTracks.size(); iLink++) { for (int iTrack = 0; iTrack < (int)streamsTracks[iLink].size(); iTrack++) { const auto& track = streamsTracks[iLink].at(iTrack); TrackKF inTrack(track, dataFormats_); double temp_z0 = inTrack.zT() - ((inTrack.cot() * setup_->chosenRofZ())); - // Correction to Phi calcuation depending if +ve/-ve phi sector const double baseSectorCorr = inTrack.sectorPhi() ? -setup_->baseSector() : setup_->baseSector(); - double temp_phi0 = inTrack.phiT() - ((inTrack.inv2R()) * setup_->hybridChosenRofPhi()) + baseSectorCorr; - double temp_tanL = inTrack.cotGlobal(); TTBV hitPattern(0, setup_->numLayers()); - double tempchi2rphi = 0; double tempchi2rz = 0; - int temp_nstub = 0; int temp_ninterior = 0; bool counter = false; - for (int iStub = 0; iStub < setup_->numLayers() - 1; iStub++) { + vector stubs; + stubs.reserve(setup_->numLayers()); + for (int iStub = 0; iStub < setup_->numLayers(); iStub++) { const auto& stub = streamsStubs[setup_->numLayers() * iLink + iStub].at(iTrack); StubKF inStub(stub, dataFormats_, iStub); + if (stub.first.isNonnull()) + stubs.emplace_back(stub, dataFormats_, iStub); if (!stub.first.isNonnull()) { if (counter) @@ -257,7 +230,7 @@ namespace trklet { tempchi2rz += tempRz; } // Iterate over track stubs - // Create bit vectors for eacch output, including digitisation of chi2 + // Create bit vectors for each output, including digitisation of chi2 // TODO implement extraMVA, bendChi2, d0 TTBV trackValid(1, TTTrack_TrackWord::TrackBitWidths::kValidSize, false); TTBV extraMVA(0, TTTrack_TrackWord::TrackBitWidths::kMVAOtherSize, false); @@ -285,11 +258,16 @@ namespace trklet { true); invR.resize(TTTrack_TrackWord::TrackBitWidths::kRinvSize); + // conversion to tttrack to calculate bendchi2 + // temporary fix for MVA1 while bendchi2 not implemented + TTTrack temp_tttrack = inTrack.ttTrack(stubs); + double tempbendchi2 = temp_tttrack.chi2BendRed(); + // Create input vector for BDT trackQuality_inputs = { (std::trunc(tanL.val() / tqTanlScale_)) / ap_fixed_rescale, (std::trunc(z0.val() / tqZ0Scale_)) / ap_fixed_rescale, - 0, + digitise(TTTrack_TrackWord::bendChi2Bins, tempbendchi2, 1.), temp_nstub, temp_ninterior, digitise(TTTrack_TrackWord::chi2RPhiBins, tempchi2rphi, (double)setup_->kfoutchi2rphiConv()), @@ -311,87 +289,89 @@ namespace trklet { TTBV partialTrack1((trackValid + invR + phi0 + chi2rphi), partialTrackWordBits_, false); int sortKey = (inTrack.sectorEta() < (int)(setup_->numSectorsEta() / 2)) ? 0 : 1; + int nonantId = iLink / setup_->kfNumWorker(); // Set correct bit to valid for track valid TrackKFOut temp_track(partialTrack1.set((partialTrackWordBits_ - 1)), partialTrack2, partialTrack3, sortKey, + nonantId, track, iTrack, iLink, true); + KFoutTracks.push_back(std::make_shared(temp_track)); - inTrackStreams[iLink / setup_->kfNumWorker()][iLink % setup_->kfNumWorker()][iTrack] = - (std::make_shared(temp_track)); + // add MVA to tttrack and add tttrack to collection + temp_tttrack.settrkMVA1(1. / (1. + exp(tempTQMVAPreSig))); + temp_tttrack.setTrackWordBits(); + ttTracks.emplace_back(temp_tttrack); } // Iterate over Tracks } // Iterate over Links - // Route Tracks in eta based on their sort key - for (int iRegion = 0; iRegion < setup_->numRegions(); iRegion++) { - int buffered_tracks[] = {0, 0}; - for (int iTrack = 0; iTrack < setup_->numFramesIO() * ((double)TTBV::S_ / TTTrack_TrackWord::kTrackWordSize); - iTrack++) { - for (int iWorker = 0; iWorker < setup_->kfNumWorker(); iWorker++) { - for (int iLink = 0; iLink < setup_->tfpNumChannel(); iLink++) { - if ((inTrackStreams[iRegion][iWorker][iTrack]->sortKey() == iLink) && - (inTrackStreams[iRegion][iWorker][iTrack]->dataValid() == true)) { - outTrackStreams[iRegion][iLink][buffered_tracks[iLink]] = inTrackStreams[iRegion][iWorker][iTrack]; - buffered_tracks[iLink] = buffered_tracks[iLink] + 1; - } - } - } + const OrphanHandle orphanHandleTTTracks = iEvent.emplace(edPutTokenTTTracks_, std::move(ttTracks)); + + // sort partial KFout tracks into 18 separate links (nonant idx * eta idx) with tttrack ref info + // 0th index order: [nonant 0 + negative eta, nonant 0 + positive eta, nonant 1 + negative eta, ...] + struct kfoTrack_info { + TTBV partialBits; + TTTrackRef trackRef; + }; + vector> sortedPartialTracks(setup_->numRegions() * setup_->tfpNumChannel(), + vector(0)); + for (int i = 0; i < (int)KFoutTracks.size(); i++) { + auto& kfoTrack = KFoutTracks.at(i); + if (kfoTrack->dataValid()) { + sortedPartialTracks[kfoTrack->nonantId() * setup_->tfpNumChannel() + kfoTrack->sortKey()].push_back( + {kfoTrack->PartialTrack1(), TTTrackRef(orphanHandleTTTracks, i)}); + sortedPartialTracks[kfoTrack->nonantId() * setup_->tfpNumChannel() + kfoTrack->sortKey()].push_back( + {kfoTrack->PartialTrack2(), TTTrackRef(orphanHandleTTTracks, i)}); + sortedPartialTracks[kfoTrack->nonantId() * setup_->tfpNumChannel() + kfoTrack->sortKey()].push_back( + {kfoTrack->PartialTrack3(), TTTrackRef(orphanHandleTTTracks, i)}); } } - - // Pack output of router onto each link, with correct partial tracks in correct places - for (int iRegion = 0; iRegion < setup_->numRegions(); iRegion++) { - for (int iLink = 0; iLink < setup_->tfpNumChannel(); iLink++) { - for (int iTrack = 0; iTrack < (int)outTrackStreams[iRegion][iLink].size(); iTrack++) { - sortedPartialTracks[2 * iRegion + iLink].push_back( - outTrackStreams[iRegion][iLink][iTrack]->PartialTrack1()); - sortedPartialTracks[2 * iRegion + iLink].push_back( - outTrackStreams[iRegion][iLink][iTrack]->PartialTrack2()); - sortedPartialTracks[2 * iRegion + iLink].push_back( - outTrackStreams[iRegion][iLink][iTrack]->PartialTrack3()); - outputStreamsTracks[2 * iRegion + iLink].emplace_back(outTrackStreams[iRegion][iLink][iTrack]->track()); - } - } + // fill remaining tracks allowed on each link (setup_->numFramesIO()) with null info + kfoTrack_info nullTrack_info; + for (int i = 0; i < (int)sortedPartialTracks.size(); i++) { + // will not fill if any additional tracks if already above limit + while ((int)sortedPartialTracks.at(i).size() < setup_->numFramesIO() * 2) + sortedPartialTracks.at(i).push_back(nullTrack_info); } - // Fill products and match up tracks - // store products - const TTBV nullBitTrack(0, partialTrackWordBits_, false); - for (int iLink = 0; iLink < (int)outputStreamsTracks.size(); iLink++) { - // Iterate through partial tracks - int numLinkTracks = (int)outputStreamsTracks[iLink].size(); - if (numLinkTracks == 0) - continue; // Don't fill links if no tracks - if ((numLinkTracks % 2 != 0)) { - sortedPartialTracks[iLink].push_back(nullBitTrack); //Pad out final set of bits - outputStreamsTracks[iLink].emplace_back( - outputStreamsTracks[iLink][numLinkTracks++]); //Pad out with final repeated track - } //If there is an odd number of tracks - for (int iTrack = 0; iTrack < (int)(sortedPartialTracks[iLink].size()); iTrack++) { - if (iTrack % 2 != 1) // Write to links every other partial track, 3 partial tracks per full TTTrack - continue; - TTTrackRef trackRef; - for (auto& it : ttTrackRefMap) { //Iterate through ttTrackRefMap to find TTTrackRef Key by a TTTrack Value - if (it.second == outputStreamsTracks[iLink][(int)(iTrack - 1) / 3].first) - trackRef = it.first; - } - if ((int)iTrack / 3 <= setup_->numFramesIO() * ((double)TTBV::S_ / TTTrack_TrackWord::kTrackWordSize)) + + // combine sorted partial tracks into proper format: + // < TTTrackRef A, first 64 A bits > + // < TTTrackRef B, last 32 A bits + first 32 B bits > + // < TTTrackRef null, last 64 B bits > + // ... repeat for next tracks + const TTBV nullPartialBits(0, partialTrackWordBits_, false); + const TTTrackRef nullTrackRef; + int partialFactor = TTBV::S_ / partialTrackWordBits_; //how many partial track words to combine in an output + for (int iLink = 0; iLink < (int)sortedPartialTracks.size(); iLink++) { + for (int iTrack = 0; iTrack < (int)sortedPartialTracks[iLink].size(); iTrack += partialFactor) { + // if a partial track has no pair, pair it with null partial track + if (iTrack + 1 == (int)sortedPartialTracks[iLink].size()) + sortedPartialTracks[iLink].push_back({nullPartialBits, nullTrackRef}); + // keep TTTrackRef null every third (96 bits / 32 partial bits) output packet + TTTrackRef fillTrackRef; + if ((iTrack / partialFactor + 1) % (TTTrack_TrackWord::TrackBitWidths::kTrackWordSize / partialTrackWordBits_) != 0) + fillTrackRef = sortedPartialTracks[iLink][iTrack + 1].trackRef; + + // if there are too many output packets, truncate and put remaining outputs in lost collection + if (iTrack / partialFactor < setup_->numFramesIO()) accepted[iLink].emplace_back( - std::make_pair(trackRef, - (sortedPartialTracks[iLink][iTrack - 1].slice(partialTrackWordBits_) + - sortedPartialTracks[iLink][iTrack].slice(partialTrackWordBits_)) + std::make_pair(fillTrackRef, + (sortedPartialTracks[iLink][iTrack].partialBits.slice(partialTrackWordBits_) + + sortedPartialTracks[iLink][iTrack + 1].partialBits.slice(partialTrackWordBits_)) .bs())); else lost[iLink].emplace_back( - std::make_pair(trackRef, - (sortedPartialTracks[iLink][iTrack - 1].slice(partialTrackWordBits_) + - sortedPartialTracks[iLink][iTrack].slice(partialTrackWordBits_)) + std::make_pair(fillTrackRef, + (sortedPartialTracks[iLink][iTrack].partialBits.slice(partialTrackWordBits_) + + sortedPartialTracks[iLink][iTrack + 1].partialBits.slice(partialTrackWordBits_)) .bs())); - } //Iterate through sorted partial tracks - } // Iterate through links + } + } } // Config Supported + // store products iEvent.emplace(edPutTokenAccepted_, std::move(accepted)); iEvent.emplace(edPutTokenLost_, std::move(lost)); diff --git a/L1Trigger/TrackFindingTracklet/plugins/ProducerTT.cc b/L1Trigger/TrackFindingTracklet/plugins/ProducerTT.cc deleted file mode 100644 index 1e1d94514c8df..0000000000000 --- a/L1Trigger/TrackFindingTracklet/plugins/ProducerTT.cc +++ /dev/null @@ -1,131 +0,0 @@ -#include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/Framework/interface/Run.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Utilities/interface/EDPutToken.h" -#include "FWCore/Utilities/interface/ESGetToken.h" -#include "FWCore/Utilities/interface/InputTag.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "DataFormats/Common/interface/Handle.h" - -#include "L1Trigger/TrackTrigger/interface/Setup.h" -#include "L1Trigger/TrackerTFP/interface/DataFormats.h" - -#include -#include - -using namespace std; -using namespace edm; -using namespace trackerTFP; -using namespace tt; - -namespace trklet { - - /*! \class trklet::ProducerTT - * \brief Converts KF output into TTTracks - * \author Thomas Schuh - * \date 2021, Aug - */ - class ProducerTT : public stream::EDProducer<> { - public: - explicit ProducerTT(const ParameterSet&); - ~ProducerTT() override {} - - private: - void beginRun(const Run&, const EventSetup&) override; - void produce(Event&, const EventSetup&) override; - void endJob() {} - - // ED input token of kf stubs - EDGetTokenT edGetTokenStubs_; - // ED input token of kf tracks - EDGetTokenT edGetTokenTracks_; - // ED output token for TTTracks - EDPutTokenT edPutToken_; - // Setup token - ESGetToken esGetTokenSetup_; - // DataFormats token - ESGetToken esGetTokenDataFormats_; - // configuration - ParameterSet iConfig_; - // helper class to store configurations - const Setup* setup_ = nullptr; - // helper class to extract structured data from tt::Frames - const DataFormats* dataFormats_ = nullptr; - }; - - ProducerTT::ProducerTT(const ParameterSet& iConfig) : iConfig_(iConfig) { - const string& label = iConfig.getParameter("LabelKF"); - const string& branchStubs = iConfig.getParameter("BranchAcceptedStubs"); - const string& branchTracks = iConfig.getParameter("BranchAcceptedTracks"); - // book in- and output ED products - edGetTokenStubs_ = consumes(InputTag(label, branchStubs)); - edGetTokenTracks_ = consumes(InputTag(label, branchTracks)); - edPutToken_ = produces(branchTracks); - // book ES products - esGetTokenSetup_ = esConsumes(); - esGetTokenDataFormats_ = esConsumes(); - } - - void ProducerTT::beginRun(const Run& iRun, const EventSetup& iSetup) { - // helper class to store configurations - setup_ = &iSetup.getData(esGetTokenSetup_); - if (!setup_->configurationSupported()) - return; - // check process history if desired - if (iConfig_.getParameter("CheckHistory")) - setup_->checkHistory(iRun.processHistory()); - // helper class to extract structured data from tt::Frames - dataFormats_ = &iSetup.getData(esGetTokenDataFormats_); - } - - void ProducerTT::produce(Event& iEvent, const EventSetup& iSetup) { - // empty KFout product - TTTracks ttTracks; - // read in KF Product and produce KFout product - if (setup_->configurationSupported()) { - Handle handleStubs; - iEvent.getByToken(edGetTokenStubs_, handleStubs); - const StreamsStub& streamsStubs = *handleStubs.product(); - Handle handleTracks; - iEvent.getByToken(edGetTokenTracks_, handleTracks); - const StreamsTrack& streamsTracks = *handleTracks.product(); - // count number of kf tracks - int nTracks(0); - for (const StreamTrack& stream : streamsTracks) - nTracks += accumulate(stream.begin(), stream.end(), 0, [](int sum, const FrameTrack& frame) { - return sum + (frame.first.isNonnull() ? 1 : 0); - }); - ttTracks.reserve(nTracks); - // convert kf track frames per channel and stub frames per channel and layer to TTTracks - for (int channel = 0; channel < (int)streamsTracks.size(); channel++) { - const int offset = channel * setup_->numLayers(); - int iTrk(0); - for (const FrameTrack& frameTrack : streamsTracks[channel]) { - if (frameTrack.first.isNull()) - continue; - // convert stub frames to kf stubs - vector stubs; - stubs.reserve(setup_->numLayers()); - for (int layer = 0; layer < setup_->numLayers(); layer++) { - const FrameStub& frameStub = streamsStubs[offset + layer][iTrk]; - if (frameStub.first.isNonnull()) - stubs.emplace_back(frameStub, dataFormats_, layer); - } - // convert track frame to kf track - TrackKF track(frameTrack, dataFormats_); - // convert kf track and kf stubs to TTTrack - ttTracks.emplace_back(track.ttTrack(stubs)); - iTrk++; - } - } - } - // store products - iEvent.emplace(edPutToken_, std::move(ttTracks)); - } - -} // namespace trklet - -DEFINE_FWK_MODULE(trklet::ProducerTT); diff --git a/L1Trigger/TrackFindingTracklet/python/Analyzer_cff.py b/L1Trigger/TrackFindingTracklet/python/Analyzer_cff.py index 13635fe458ca2..ddc1b5377044a 100644 --- a/L1Trigger/TrackFindingTracklet/python/Analyzer_cff.py +++ b/L1Trigger/TrackFindingTracklet/python/Analyzer_cff.py @@ -10,4 +10,3 @@ TrackFindingTrackletAnalyzerKFin = cms.EDAnalyzer( 'trklet::AnalyzerKFin', TrackFindingTrackletAnalyzer_params, TrackFindingTrackletProducer_params ) TrackFindingTrackletAnalyzerKF = cms.EDAnalyzer( 'trackerTFP::AnalyzerKF', TrackFindingTrackletAnalyzer_params, TrackFindingTrackletProducer_params ) TrackFindingTrackletAnalyzerKFout = cms.EDAnalyzer( 'trklet::AnalyzerKFout', TrackFindingTrackletAnalyzer_params, TrackFindingTrackletProducer_params ) -TrackFindingTrackletAnalyzerTT = cms.EDAnalyzer( 'trklet::AnalyzerTT', TrackFindingTrackletAnalyzer_params, TrackFindingTrackletProducer_params ) diff --git a/L1Trigger/TrackFindingTracklet/python/Customize_cff.py b/L1Trigger/TrackFindingTracklet/python/Customize_cff.py index bf714fb8c26c4..6124b40f047e8 100644 --- a/L1Trigger/TrackFindingTracklet/python/Customize_cff.py +++ b/L1Trigger/TrackFindingTracklet/python/Customize_cff.py @@ -27,3 +27,7 @@ def reducedConfig(process): process.l1tTTTracksFromTrackletEmulation.memoryModulesFile = 'L1Trigger/TrackFindingTracklet/data/reduced_memorymodules.dat' process.l1tTTTracksFromTrackletEmulation.processingModulesFile = 'L1Trigger/TrackFindingTracklet/data/reduced_processingmodules.dat' process.l1tTTTracksFromTrackletEmulation.wiresFile = 'L1Trigger/TrackFindingTracklet/data/reduced_wires.dat' + +# configures pure tracklet algorithm (as opposed to Hybrid algorithm) +def trackletConfig(process): + process.l1tTTTracksFromTrackletEmulation.fitPatternFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/fitpattern.txt') diff --git a/L1Trigger/TrackFindingTracklet/python/Producer_cff.py b/L1Trigger/TrackFindingTracklet/python/Producer_cff.py index 4f71d916f22ac..c295baa0e2dd9 100644 --- a/L1Trigger/TrackFindingTracklet/python/Producer_cff.py +++ b/L1Trigger/TrackFindingTracklet/python/Producer_cff.py @@ -14,6 +14,4 @@ TrackFindingTrackletProducerDR = cms.EDProducer( 'trklet::ProducerDR', TrackFindingTrackletProducer_params ) TrackFindingTrackletProducerKFin = cms.EDProducer( 'trklet::ProducerKFin', TrackFindingTrackletProducer_params ) TrackFindingTrackletProducerKF = cms.EDProducer( 'trackerTFP::ProducerKF', TrackFindingTrackletProducer_params ) -TrackFindingTrackletProducerTT = cms.EDProducer( 'trklet::ProducerTT', TrackFindingTrackletProducer_params ) -TrackFindingTrackletProducerAS = cms.EDProducer( 'trklet::ProducerAS', TrackFindingTrackletProducer_params ) TrackFindingTrackletProducerKFout = cms.EDProducer( 'trklet::ProducerKFout', TrackFindingTrackletProducer_params ) diff --git a/L1Trigger/TrackFindingTracklet/python/Producer_cfi.py b/L1Trigger/TrackFindingTracklet/python/Producer_cfi.py index 5e2128b2ac70a..3ca33e23bd4e0 100644 --- a/L1Trigger/TrackFindingTracklet/python/Producer_cfi.py +++ b/L1Trigger/TrackFindingTracklet/python/Producer_cfi.py @@ -10,11 +10,10 @@ LabelDR = cms.string ( "TrackFindingTrackletProducerDR" ), # LabelKFin = cms.string ( "TrackFindingTrackletProducerKFin" ), # LabelKF = cms.string ( "TrackFindingTrackletProducerKF" ), # - LabelTT = cms.string ( "TrackFindingTrackletProducerTT" ), # - LabelAS = cms.string ( "TrackFindingTrackletProducerAS" ), # LabelKFout = cms.string ( "TrackFindingTrackletProducerKFout" ), # BranchAcceptedStubs = cms.string ( "StubAccepted" ), # BranchAcceptedTracks = cms.string ( "TrackAccepted" ), # + BranchAcceptedTTTracks = cms.string ( "TTTrackAccepted" ), # BranchLostStubs = cms.string ( "StubLost" ), # BranchLostTracks = cms.string ( "TrackLost" ), # CheckHistory = cms.bool ( False ), # checks if input sample production is configured as current process diff --git a/L1Trigger/TrackFindingTracklet/python/l1tTTTracksFromTrackletEmulation_cfi.py b/L1Trigger/TrackFindingTracklet/python/l1tTTTracksFromTrackletEmulation_cfi.py index b870494441670..5e7ad9e715951 100644 --- a/L1Trigger/TrackFindingTracklet/python/l1tTTTracksFromTrackletEmulation_cfi.py +++ b/L1Trigger/TrackFindingTracklet/python/l1tTTTracksFromTrackletEmulation_cfi.py @@ -15,11 +15,10 @@ Extended = cms.bool(False), Reduced = cms.bool(False), Hnpar = cms.uint32(4), - # (if running on CRAB use "../../fitpattern.txt" etc instead) - fitPatternFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/fitpattern.txt'), - memoryModulesFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/memorymodules_hourglassExtended.dat'), - processingModulesFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/processingmodules_hourglassExtended.dat'), - wiresFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/wires_hourglassExtended.dat'), + # These 3 files only used for extended or reduced mode. + memoryModulesFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/memorymodules_hourglassExtendedCombined.dat'), + processingModulesFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/processingmodules_hourglassExtendedCombined.dat'), + wiresFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/wires_hourglassExtendedCombined.dat'), # Quality Flag and Quality params TrackQuality = cms.bool(True), TrackQualityPSet = cms.PSet(TrackQualityParams), diff --git a/L1Trigger/TrackFindingTracklet/src/FitTrack.cc b/L1Trigger/TrackFindingTracklet/src/FitTrack.cc index 5050aa8585ee8..04c5f565f335f 100644 --- a/L1Trigger/TrackFindingTracklet/src/FitTrack.cc +++ b/L1Trigger/TrackFindingTracklet/src/FitTrack.cc @@ -136,7 +136,8 @@ void FitTrack::trackFitKF(Tracklet* tracklet, } } } -#endif + +#else // Code for pure Tracklet algo. void FitTrack::trackFitChisq(Tracklet* tracklet, std::vector&, std::vector>&) { if (globals_->trackDerTable() == nullptr) { @@ -788,6 +789,8 @@ void FitTrack::trackFitChisq(Tracklet* tracklet, std::vector&, std: 0); } +#endif + void FitTrack::trackFitFake(Tracklet* tracklet, std::vector&, std::vector>&) { tracklet->setFitPars(tracklet->rinvapprox(), tracklet->phi0approx(), diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorDisplaced.cc b/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorDisplaced.cc index 74b8dc36a6e07..9138bf16a9145 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorDisplaced.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorDisplaced.cc @@ -1211,6 +1211,9 @@ bool TrackletCalculatorDisplaced::LLDSeeding(const Stub* innerFPGAStub, int take3 = 0; //L2L3D1 unsigned ndisks = 1; + // N.B. The names r1, r2, r3 reflect the fact that confusingly, + // innerStub is actually the one furthest from the beamline ... + double r3 = innerStub->r(); double z3 = innerStub->z(); double phi3 = innerStub->phi(); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletConfigBuilder.cc b/L1Trigger/TrackFindingTracklet/src/TrackletConfigBuilder.cc index 58739f957fe57..196747ab9e415 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletConfigBuilder.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletConfigBuilder.cc @@ -23,6 +23,7 @@ TrackletConfigBuilder::TrackletConfigBuilder(const Settings& settings, const tt: NSector_ = N_SECTOR; rcrit_ = settings.rcrit(); + duplicateMPs_ = settings.duplicateMPs(); combinedmodules_ = settings.combined(); extended_ = settings.extended(); @@ -516,12 +517,52 @@ void TrackletConfigBuilder::writeProjectionMemories(std::ostream& os, std::ostre for (unsigned int imem = 0; imem < projections_[ilayer][ireg].size(); imem++) { unsigned int iSeed = projections_[ilayer][ireg][imem].first; unsigned int iTC = projections_[ilayer][ireg][imem].second; - - memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; - - os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" - << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" - << std::endl; + if (combinedmodules_) { + if (duplicateMPs_) { + if ((settings_.layersDisksDuplicatedEqualProjBalance()[ilayer]) && (ireg == 1 || ireg == 2)) { + memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; + if (imem < projections_[ilayer][ireg].size() / 2) { + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" + << std::endl; + } else { + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) + "_E" + << ".projin" // duplicate MPs denoted by extra _E + << std::endl; + } + } else if ((settings_.layersDisksDuplicatedWeightedProjBalance()[ilayer]) && (ireg == 1 || ireg == 2)) { + memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; + if (imem < 4 || + imem > + 9) { // FIXME need to replace magic numbers, corresponds to allowing MP1 4 L1L2 TCs, 3 L5L6 TCs, MP2 3 L1L2 3 L3L4 TCs + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" + << std::endl; + } else { + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) + "_E" + << ".projin" // duplicate MPs + << std::endl; + } + } else { + memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" + << std::endl; + } + } else { // non-duplicate MPs configuration + memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" + << std::endl; + } + } else { // non-combined modules + memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl; + os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout" + << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin" + << std::endl; + } } } } @@ -868,15 +909,51 @@ void TrackletConfigBuilder::writeFMMemories(std::ostream& os, std::ostream& memo if (combinedmodules_) { for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) { for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) { - modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; - for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) { - if (matchport_[iSeed][ilayer] == -1) - continue; - memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) - << " [36]" << std::endl; - os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MP_" - << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed) - << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl; + if (duplicateMPs_) { + if ((settings_.layersDisksDuplicatedEqualProjBalance()[ilayer] || + settings_.layersDisksDuplicatedWeightedProjBalance()[ilayer]) && + (iReg == 1 || iReg == 2)) { // regions with worst truncation + modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + "_E" << std::endl; + for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) { + if (matchport_[iSeed][ilayer] == -1) + continue; + memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + << " [36]" << std::endl; + memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" + << iTCStr(iReg) + "_E" + << " [36]" << std::endl; + os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed) + << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl; + os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + "_E" + << " input=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + "_E" + << ".matchout1 output=> FT_" << iSeedStr(iSeed) << ".fullmatch" << matchport_[iSeed][ilayer] << "in" + << iReg + 1 << std::endl; + } + } else { + modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) { + if (matchport_[iSeed][ilayer] == -1) + continue; + memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + << " [36]" << std::endl; + os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed) + << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl; + } + } + } else { // non-duplicate MPs configuration + modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) { + if (matchport_[iSeed][ilayer] == -1) + continue; + memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + << " [36]" << std::endl; + os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed) + << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl; + } } } } @@ -910,16 +987,50 @@ void TrackletConfigBuilder::writeASMemories(std::ostream& os, std::ostream& memo //First write AS memories used by MatchProcessor for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) { for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) { - memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" - << " [42]" << std::endl; - if (combinedmodules_) { - modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; - } else { - modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + if (duplicateMPs_) { + if ((settings_.layersDisksDuplicatedEqualProjBalance()[ilayer] || + settings_.layersDisksDuplicatedWeightedProjBalance()[ilayer]) && + (iReg == 1 || iReg == 2)) { + memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " [42]" << std::endl; + memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n2" + << " [42]" << std::endl; + if (combinedmodules_) { + modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } else { + modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } + os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl; + os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n2" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) + "_E" + << ".allstubin" << std::endl; + } else { + memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " [42]" << std::endl; + if (combinedmodules_) { + modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } else { + modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } + os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl; + } + } else { // non duplicate MPs configuration + memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " [42]" << std::endl; + if (combinedmodules_) { + modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } else { + modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl; + } + os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_" + << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl; } - os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" - << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_" - << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl; } } @@ -1110,10 +1221,31 @@ void TrackletConfigBuilder::writeVMSMemories(std::ostream& os, std::ostream& mem //First write VMS memories used by MatchProcessor for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) { for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) { - memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1 [18]" << std::endl; - os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" - << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg) - << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubin" << std::endl; + if (duplicateMPs_) { + if ((settings_.layersDisksDuplicatedEqualProjBalance()[ilayer] || + settings_.layersDisksDuplicatedWeightedProjBalance()[ilayer]) && + (iReg == 1 || iReg == 2)) { + memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1 [18]" << std::endl; + memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n2 [18]" << std::endl; + os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg) + << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubin" << std::endl; + os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n2" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg) + << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) + "_E" + << ".vmstubin" << std::endl; + } else { + memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1 [18]" << std::endl; + os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg) + << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubin" << std::endl; + } + } else { // non duplicate MPs configuration + memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1 [18]" << std::endl; + os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1" + << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg) + << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubin" << std::endl; + } } } diff --git a/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc index 371e9725612ad..b3c78342e9888 100644 --- a/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc +++ b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc @@ -21,8 +21,6 @@ VMRouterCM::VMRouterCM(string name, Settings const& settings, Globals* global) unsigned int region = name[9] - 'A'; assert(region < settings_.nallstubs(layerdisk_)); - vmstubsMEPHI_.resize(1, nullptr); - overlapbits_ = 7; nextrabits_ = overlapbits_ - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_)); @@ -83,8 +81,7 @@ void VMRouterCM::addOutput(MemoryBase* memory, string output) { VMStubsMEMemory* tmp = dynamic_cast(memory); assert(tmp != nullptr); tmp->resize(nvmmebins_ * settings_.nvmme(layerdisk_)); - assert(vmstubsMEPHI_[0] == nullptr); - vmstubsMEPHI_[0] = tmp; + vmstubsMEPHI_.push_back(tmp); } else { throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " memory: " << memory->getName() << " => should never get here!"; @@ -258,8 +255,11 @@ void VMRouterCM::execute(unsigned int) { FPGAWord(stub->bend().value(), nbendbits, true, __LINE__, __FILE__), allStubIndex); - if (vmstubsMEPHI_[0] != nullptr) { - vmstubsMEPHI_[0]->addStub(vmstub, ivm * nvmmebins_ + vmbin); + unsigned int nmems = vmstubsMEPHI_.size(); + + for (unsigned int i = 0; i < nmems; i++) { // allows multiple VMStubs to be written for duplicated MPs + if (vmstubsMEPHI_[i] != nullptr) + vmstubsMEPHI_[i]->addStub(vmstub, ivm * nvmmebins_ + vmbin); } //Fill the TE VM memories @@ -315,4 +315,4 @@ void VMRouterCM::execute(unsigned int) { } } } -} +} \ No newline at end of file diff --git a/L1Trigger/TrackFindingTracklet/test/AnalyzerTT.cc b/L1Trigger/TrackFindingTracklet/test/AnalyzerTT.cc deleted file mode 100644 index 10f939f93b077..0000000000000 --- a/L1Trigger/TrackFindingTracklet/test/AnalyzerTT.cc +++ /dev/null @@ -1,129 +0,0 @@ -#include "FWCore/Framework/interface/one/EDAnalyzer.h" -#include "FWCore/Framework/interface/Run.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "CommonTools/UtilAlgos/interface/TFileService.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Utilities/interface/InputTag.h" -#include "FWCore/Utilities/interface/Exception.h" -#include "DataFormats/Common/interface/Handle.h" - -#include "SimTracker/TrackTriggerAssociation/interface/StubAssociation.h" -#include "L1Trigger/TrackTrigger/interface/Setup.h" - -#include -#include - -using namespace std; -using namespace edm; -using namespace tt; - -namespace trklet { - - /*! \class trklet::AnalyzerTT - * \brief Class to analyze TTTracks - * \author Thomas Schuh - * \date 2020, Oct - */ - class AnalyzerTT : public one::EDAnalyzer { - public: - AnalyzerTT(const ParameterSet& iConfig); - void beginJob() override {} - void beginRun(const Run& iEvent, const EventSetup& iSetup) override; - void analyze(const Event& iEvent, const EventSetup& iSetup) override; - void endRun(const Run& iEvent, const EventSetup& iSetup) override {} - void endJob() override {} - - private: - // ED input token of TTTrackRefMap - EDGetTokenT edGetTokenTTTrackMap_; - // ED input token of TTStubRef to TPPtr association for tracking efficiency - EDGetTokenT edGetTokenStubAssociation_; - // Setup token - ESGetToken esGetTokenSetup_; - // stores, calculates and provides run-time constants - const Setup* setup_ = nullptr; - - // histos - - TH1F* hisQoverPt_; - TH1F* hisPhi0_; - TH1F* hisEta_; - TH1F* hisZ0_; - TProfile* profResQoverPtOverEta_; - TProfile* profResPhi0OverEta_; - TProfile* profResEtaOverEta_; - TProfile* profResZ0OverEta_; - }; - - AnalyzerTT::AnalyzerTT(const ParameterSet& iConfig) { - usesResource("TFileService"); - // book in- and output ED products - const auto& label = iConfig.getParameter("LabelAS"); - const auto& branch = iConfig.getParameter("BranchAcceptedTracks"); - const auto& inputTag = iConfig.getParameter("InputTagSelection"); - edGetTokenTTTrackMap_ = consumes(InputTag(label, branch)); - edGetTokenStubAssociation_ = consumes(inputTag); - // book ES products - esGetTokenSetup_ = esConsumes(); - } - - void AnalyzerTT::beginRun(const Run& iEvent, const EventSetup& iSetup) { - // helper class to store configurations - setup_ = &iSetup.getData(esGetTokenSetup_); - // book histograms - Service fs; - TFileDirectory dir; - dir = fs->mkdir("TT"); - hisQoverPt_ = dir.make("His qOverPt", ";", 100, -1., 1.); - hisPhi0_ = dir.make("His phi0", ";", 100, -M_PI, M_PI); - hisEta_ = dir.make("His eta", ";", 100, -2.5, 2.5); - hisZ0_ = dir.make("His z0", ";", 100, -20., 20.); - profResQoverPtOverEta_ = dir.make("Prof Res qOverPt over |eta|", ";", 100, 0., 2.5); - profResPhi0OverEta_ = dir.make("Prof Res phi0 over |eta|", ";", 100, 0., 2.5); - profResEtaOverEta_ = dir.make("Prof Res eta over |eta|", ";", 100, 0., 2.5); - profResZ0OverEta_ = dir.make("Prof Res z0 over |eta|", ";", 100, 0., 2.5); - } - - void AnalyzerTT::analyze(const Event& iEvent, const EventSetup& iSetup) { - Handle handleTTTrackMap; - iEvent.getByToken(edGetTokenTTTrackMap_, handleTTTrackMap); - Handle handleStubAssociation; - iEvent.getByToken(edGetTokenStubAssociation_, handleStubAssociation); - for (const auto& p : *handleTTTrackMap) { - const TTTrackRef& ttTrackRef = p.first; - const vector& ttStubRefs = ttTrackRef->getStubRefs(); - const vector& tpPtrs = handleStubAssociation->associate(ttStubRefs); - if (tpPtrs.empty()) - continue; - const TPPtr& tpPtr = tpPtrs.front(); - const math::XYZPointD& v = tpPtr->vertex(); - const double qOverPtTT = ttTrackRef->rInv() / setup_->invPtToDphi() / 2.0; - const double qOverPtTP = tpPtr->charge() / tpPtr->pt(); - const double qOverPtDiff = qOverPtTP - qOverPtTT; - const double phi0TT = deltaPhi(ttTrackRef->phi() + ttTrackRef->phiSector() * setup_->baseRegion()); - const double phi0TP = tpPtr->phi(); - const double phi0Diff = phi0TP - phi0TT; - const double etaTT = asinh(ttTrackRef->tanL()); - const double etaTP = tpPtr->eta(); - const double etaDiff = etaTP - etaTT; - const double z0TT = ttTrackRef->z0(); - const double z0TP = v.z() - sinh(tpPtr->eta()) * (v.x() * cos(tpPtr->phi()) + v.y() * sin(tpPtr->phi())); - const double z0Diff = z0TP - z0TT; - hisQoverPt_->Fill(qOverPtTT); - hisPhi0_->Fill(phi0TT); - hisEta_->Fill(etaTT); - hisZ0_->Fill(z0TT); - profResQoverPtOverEta_->Fill(abs(etaTP), abs(qOverPtDiff)); - profResPhi0OverEta_->Fill(abs(etaTP), abs(phi0Diff)); - profResEtaOverEta_->Fill(abs(etaTP), abs(etaDiff)); - profResZ0OverEta_->Fill(abs(etaTP), abs(z0Diff)); - } - } - -} // namespace trklet - -DEFINE_FWK_MODULE(trklet::AnalyzerTT); diff --git a/L1Trigger/TrackFindingTracklet/test/HybridTracksNewKF_cfg.py b/L1Trigger/TrackFindingTracklet/test/HybridTracksNewKF_cfg.py index 5ef7ea33154b3..5e93612552e19 100644 --- a/L1Trigger/TrackFindingTracklet/test/HybridTracksNewKF_cfg.py +++ b/L1Trigger/TrackFindingTracklet/test/HybridTracksNewKF_cfg.py @@ -39,8 +39,8 @@ # load and configure TrackTriggerAssociation process.load( 'SimTracker.TrackTriggerAssociation.TrackTriggerAssociator_cff' ) process.TTTrackAssociatorFromPixelDigis.TTTracks = cms.VInputTag( cms.InputTag( - process.TrackFindingTrackletProducer_params.LabelTT.value(), - process.TrackFindingTrackletProducer_params.BranchAcceptedTracks.value() + process.TrackFindingTrackletProducer_params.LabelKFout.value(), + process.TrackFindingTrackletProducer_params.BranchAcceptedTTTracks.value() ) ) # build schedule @@ -52,9 +52,8 @@ process.dr = cms.Sequence( process.TrackFindingTrackletProducerDR + process.TrackFindingTrackletAnalyzerDR ) process.kfin = cms.Sequence( process.TrackFindingTrackletProducerKFin + process.TrackFindingTrackletAnalyzerKFin ) process.kf = cms.Sequence( process.TrackFindingTrackletProducerKF + process.TrackFindingTrackletAnalyzerKF ) -#process.TTTracks = cms.Sequence( process.TrackFindingTrackletProducerTT + process.TrackFindingTrackletProducerAS + process.TrackTriggerAssociatorTracks ) -#process.interOut = cms.Sequence( process.TrackFindingTrackletProducerKFout + process.TrackFindingTrackletAnalyzerKFout ) -process.tt = cms.Path( process.mc + process.dtc + process.tracklet + process.TBout + process.drin + process.dr + process.kfin + process.kf )#+ process.TTTracks + process.interOut ) +process.kfout = cms.Sequence( process.TrackFindingTrackletProducerKFout + process.TrackFindingTrackletAnalyzerKFout ) +process.tt = cms.Path( process.mc + process.dtc + process.tracklet + process.TBout + process.drin + process.dr + process.kfin + process.kf + process.kfout) process.schedule = cms.Schedule( process.tt ) # create options diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py index 4bfcac8f57fa4..12a66ace03146 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py @@ -171,11 +171,11 @@ elif (L1TRKALGO == 'HYBRID_NEWKF' or L1TRKALGO == 'HYBRID_REDUCED'): process.load( 'L1Trigger.TrackFindingTracklet.Producer_cff' ) NHELIXPAR = 4 - L1TRK_NAME = process.TrackFindingTrackletProducer_params.LabelTT.value() - L1TRK_LABEL = process.TrackFindingTrackletProducer_params.BranchAcceptedTracks.value() + L1TRK_NAME = process.TrackFindingTrackletProducer_params.LabelKFout.value() + L1TRK_LABEL = process.TrackFindingTrackletProducer_params.BranchAcceptedTTTracks.value() L1TRUTH_NAME = "TTTrackAssociatorFromPixelDigis" process.TTTrackAssociatorFromPixelDigis.TTTracks = cms.VInputTag( cms.InputTag(L1TRK_NAME, L1TRK_LABEL) ) - process.HybridNewKF = cms.Sequence(process.L1THybridTracks + process.TrackFindingTrackletProducerTBout + process.TrackFindingTrackletProducerDRin + process.TrackFindingTrackletProducerDR + process.TrackFindingTrackletProducerKFin + process.TrackFindingTrackletProducerKF + process.TrackFindingTrackletProducerTT + process.TrackFindingTrackletProducerAS + process.TrackFindingTrackletProducerKFout) + process.HybridNewKF = cms.Sequence(process.L1THybridTracks + process.TrackFindingTrackletProducerTBout + process.TrackFindingTrackletProducerDRin + process.TrackFindingTrackletProducerDR + process.TrackFindingTrackletProducerKFin + process.TrackFindingTrackletProducerKF + process.TrackFindingTrackletProducerKFout) process.TTTracksEmulation = cms.Path(process.HybridNewKF) #process.TTTracksEmulationWithTruth = cms.Path(process.HybridNewKF + process.TrackTriggerAssociatorTracks) # Optionally include code producing performance plots & end-of-job summary. @@ -196,6 +196,8 @@ print("\n To run the Tracklet-only algorithm, ensure you have commented out 'CXXFLAGS=-DUSEHYBRID' in BuildFile.xml & recompiled! \n") process.TTTracksEmulation = cms.Path(process.L1THybridTracks) process.TTTracksEmulationWithTruth = cms.Path(process.L1THybridTracksWithAssociators) + from L1Trigger.TrackFindingTracklet.Customize_cff import * + trackletConfig( process ) NHELIXPAR = 4 L1TRK_NAME = "l1tTTTracksFromTrackletEmulation" L1TRK_LABEL = "Level1TTTracks" diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtuplePlot.C b/L1Trigger/TrackFindingTracklet/test/L1TrackNtuplePlot.C index 5bbfa4dd4c15e..383c896baa7db 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtuplePlot.C +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtuplePlot.C @@ -1,10 +1,10 @@ -// ---------------------------------------------------------------------------------------------------------------- -// Basic example ROOT script for making tracking performance plots using the ntuples produced by L1TrackNtupleMaker.cc +// -------------------------------------------------------------------------------------------------------- +// ROOT script for making tracking performance plots using the ntuples produced by L1TrackNtupleMaker.cc // // e.g. in ROOT do: .L L1TrackNtuplePlot.C++, L1TrackNtuplePlot("L1TrkNtuple") // // By Louise Skinnari, June 2013 -// ---------------------------------------------------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------- #include "TROOT.h" #include "TStyle.h" @@ -128,7 +128,8 @@ void L1TrackNtuplePlot(TString type, int ntp_pt2 = 0; int ntp_pt3 = 0; int ntp_pt10 = 0; - + int ntrk_genuine_pt2 = 0; + int ntp_nmatch = 0; // ---------------------------------------------------------------------------------------------------------------- // read ntuples TChain* tree = new TChain("L1TrackNtuple" + treeName + "/eventTree"); @@ -1070,7 +1071,7 @@ void L1TrackNtuplePlot(TString type, vector nTrksPerSector_pt3(9, 0); vector nTrksPerSector_pt4(9, 0); - for (int it = 0; it < (int)trk_pt->size(); it++) { + for (int it = 0; it < (int)trk_pt->size(); it++) { // Loop reco tracks // ---------------------------------------------------------------------------------------------------------------- // track properties @@ -1157,6 +1158,7 @@ void L1TrackNtuplePlot(TString type, ntrkevt_pt2++; h_trk_all_vspt->Fill(trk_pt->at(it)); if (trk_genuine->at(it) == 1) { + ntrk_genuine_pt2++; ntrkevt_genuine_pt2++; h_trk_genuine_vspt->Fill(trk_pt->at(it)); } else @@ -1203,7 +1205,7 @@ void L1TrackNtuplePlot(TString type, h_trk_tracklet_hits->Fill(std::abs(trk_eta->at(it)), layer); // ...fill this bin with the layer of the track. } } - } + } // End loop reco tracks h_ntrk_pt2->Fill(ntrkevt_pt2); h_ntrk_pt3->Fill(ntrkevt_pt3); @@ -1219,7 +1221,7 @@ void L1TrackNtuplePlot(TString type, h_ntrkPerSector_pt4->Fill(*std::max_element(nTrksPerSector_pt4.begin(), nTrksPerSector_pt4.end())); // ---------------------------------------------------------------------------------------------------------------- - // tracking particle loop + // Loop tracking particles for (int it = 0; it < (int)tp_pt->size(); it++) { // only look at TPs in (ttbar) jets ? if (TP_select_injet > 0) { @@ -1256,8 +1258,10 @@ void L1TrackNtuplePlot(TString type, h_tp_vspt->Fill(tp_pt->at(it)); // duplicate rate if (tp_nmatch->at(it) > 1) { - for (int inm = 1; inm < tp_nmatch->at(it); inm++) + for (int inm = 1; inm < tp_nmatch->at(it); inm++) { // N.B. Loop doesn't start at zero. + ntp_nmatch++; h_trk_duplicate_vspt->Fill(matchtrk_pt->at(it)); + } } } if (tp_pt->at(it) > 3.0) @@ -3703,6 +3707,15 @@ void L1TrackNtuplePlot(TString type, cout << "# tracks/event (pt > 3.0) = " << (float)ntrk_pt3 / nevt << endl; cout << "# tracks/event (pt > 10.0) = " << (float)ntrk_pt10 / nevt << endl << endl; + // fake track rate + if (ntrk_genuine_pt2 > 0) { + cout << "Percentage fake tracks (pt > " << std::max(TP_minPt, 2.0f) + << ") = " << 100. * (1. - float(ntrk_genuine_pt2) / float(ntrk_pt2)) << "%" << endl; + cout << "Percentage duplicate tracks (pt > " << std::max(TP_minPt, 2.0f) + << ")= " << 100. * float(ntp_nmatch) / float(ntrk_pt2) << "%" << endl + << endl; + } + // z0 resolution cout << "z0 resolution = " << z0ResSample1 << "cm at |eta| = " << etaSample1 << endl; cout << "z0 resolution = " << z0ResSample2 << "cm at |eta| = " << etaSample2 << endl; diff --git a/L1Trigger/TrackFindingTracklet/test/makeHists.csh b/L1Trigger/TrackFindingTracklet/test/makeHists.csh index 69a5355341e0f..1936171ae6ff2 100755 --- a/L1Trigger/TrackFindingTracklet/test/makeHists.csh +++ b/L1Trigger/TrackFindingTracklet/test/makeHists.csh @@ -43,7 +43,7 @@ echo "MVA track quality Histograms written to MVA_plots/" # Run track performance plotting macro set plotMacro = $CMSSW_BASE/src/L1Trigger/TrackFindingTracklet/test/L1TrackNtuplePlot.C if (-e TrkPlots) rm -r TrkPlots -\root -b -q ${plotMacro}'("'${inputFileStem}'","'${dirName}'")' | tail -n 24 >! results.out +\root -b -q ${plotMacro}'("'${inputFileStem}'","'${dirName}'")' | tail -n 26 >! results.out cat results.out echo "Tracking performance summary written to results.out" echo "Track performance histograms written to TrkPlots/" diff --git a/L1Trigger/TrackerDTC/python/AnalyzerDAQ_cff.py b/L1Trigger/TrackerDTC/python/AnalyzerDAQ_cff.py index c6bbac27f75f7..7c015b9333806 100644 --- a/L1Trigger/TrackerDTC/python/AnalyzerDAQ_cff.py +++ b/L1Trigger/TrackerDTC/python/AnalyzerDAQ_cff.py @@ -1,5 +1,6 @@ import FWCore.ParameterSet.Config as cms from L1Trigger.TrackerDTC.AnalyzerDAQ_cfi import TrackerDTCAnalyzerDAQ_params +from L1Trigger.TrackTrigger.ProducerSetup_cff import TrackTriggerSetup TrackerDTCAnalyzerDAQ = cms.EDAnalyzer('trackerDTC::AnalyzerDAQ', TrackerDTCAnalyzerDAQ_params) diff --git a/L1Trigger/TrackerDTC/python/Analyzer_cff.py b/L1Trigger/TrackerDTC/python/Analyzer_cff.py index 4e171eeea73c1..aaf563eac18ef 100644 --- a/L1Trigger/TrackerDTC/python/Analyzer_cff.py +++ b/L1Trigger/TrackerDTC/python/Analyzer_cff.py @@ -2,5 +2,6 @@ from L1Trigger.TrackerDTC.Analyzer_cfi import TrackerDTCAnalyzer_params from L1Trigger.TrackerDTC.ProducerED_cfi import TrackerDTCProducer_params +from L1Trigger.TrackTrigger.ProducerSetup_cff import TrackTriggerSetup TrackerDTCAnalyzer = cms.EDAnalyzer('trackerDTC::Analyzer', TrackerDTCAnalyzer_params, TrackerDTCProducer_params) diff --git a/L1Trigger/TrackerDTC/test/testDAQ_cfg.py b/L1Trigger/TrackerDTC/test/testDAQ_cfg.py index acb05e7251f52..e3c3e48262f73 100644 --- a/L1Trigger/TrackerDTC/test/testDAQ_cfg.py +++ b/L1Trigger/TrackerDTC/test/testDAQ_cfg.py @@ -9,40 +9,36 @@ process = cms.Process( "Demo" ) process.load( 'FWCore.MessageService.MessageLogger_cfi' ) -process.load( 'Configuration.Geometry.GeometryExtended2026D76Reco_cff' ) -process.load( 'Configuration.Geometry.GeometryExtended2026D76_cff' ) +process.load( 'Configuration.Geometry.GeometryExtended2026D98Reco_cff' ) +process.load( 'Configuration.Geometry.GeometryExtended2026D98_cff' ) process.load( 'Configuration.StandardSequences.MagneticField_cff' ) process.load( 'Configuration.StandardSequences.FrontierConditions_GlobalTag_cff' ) process.load( 'L1Trigger.TrackTrigger.TrackTrigger_cff' ) from Configuration.AlCa.GlobalTag import GlobalTag -process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +# Temporary change until we switch to D110 geometry. +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +process.GlobalTag = GlobalTag(process.GlobalTag, '140X_mcRun4_realistic_v3', '') +# load code that produces DTCStubs +process.load( 'L1Trigger.TrackerDTC.ProducerED_cff' ) # load code that analyzes TTCluster process.load( 'L1Trigger.TrackerDTC.AnalyzerDAQ_cff' ) -# build schedule -process.path = cms.Path( process.TrackerDTCAnalyzerDAQ ) -process.schedule = cms.Schedule( process.path ) +# build schedule (not essential to rerun producer). +process.produce = cms.Path( process.TrackerDTCProducer ) +process.analyzeDAQ = cms.Path( process.TrackerDTCAnalyzerDAQ ) +process.schedule = cms.Schedule( process.produce, process.analyzeDAQ ) # create options import FWCore.ParameterSet.VarParsing as VarParsing options = VarParsing.VarParsing( 'analysis' ) # specify input MC Samples = [ - #'/store/relval/CMSSW_11_3_0_pre6/RelValSingleMuFlatPt2To100/GEN-SIM-DIGI-RAW/113X_mcRun4_realistic_v6_2026D76noPU-v1/10000/05f802b7-b0b3-4cca-8b70-754682c3bb4c.root' - #'/store/relval/CMSSW_11_3_0_pre6/RelValDisplacedMuPt2To100Dxy100/GEN-SIM-DIGI-RAW/113X_mcRun4_realistic_v6_2026D76noPU-v1/00000/011da61a-9524-4a96-b91f-03e8690af3bd.root' - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/00026541-6200-4eed-b6f8-d3a1fd720e9c.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/013d0125-8f6e-496b-8335-614398c9210d.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/058bd134-86de-47e1-bcde-379ed9b79e1b.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0915d66c-cbd4-4ef6-9971-7dd59e198b56.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/09823c8d-e443-4066-8347-8c704929cb2b.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0c39a1aa-93ee-41c1-8543-6d90c09114a7.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0fcdcc53-fb9f-4f0b-8529-a4d60d914c14.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/16760a5c-9cd2-41c3-82e5-399bb962d537.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/1752640f-2001-4d14-9276-063ec07cea92.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/180712c9-31a5-4f2a-bf92-a7fbee4dabad.root' -] +'/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0b2b0b0b-f312-48a8-9d46-ccbadc69bbfd.root', '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0c3cb20d-8556-450d-b4f0-e5c754818f74.root', '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0eafa2b4-711a-43ec-be1c-7e564c294a9a.root', +'/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/1450b1bb-171e-495e-a767-68e2796d95c2.root,' '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/15498564-9cf0-4219-aab7-f97b3484b122.root', +'/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/1838a806-316b-4f53-9d22-5b3856019623.root' + ] options.register( 'inputMC', Samples, VarParsing.VarParsing.multiplicity.singleton, VarParsing.VarParsing.varType.string, "Files to be processed" ) # specify number of events to process. options.register( 'Events',100,VarParsing.VarParsing.multiplicity.singleton, VarParsing.VarParsing.varType.int, "Number of Events to analyze" ) diff --git a/L1Trigger/TrackerDTC/test/test_cfg.py b/L1Trigger/TrackerDTC/test/test_cfg.py index 69af16a2a5854..8196b0508dc7b 100644 --- a/L1Trigger/TrackerDTC/test/test_cfg.py +++ b/L1Trigger/TrackerDTC/test/test_cfg.py @@ -9,14 +9,16 @@ process = cms.Process( "Demo" ) process.load( 'FWCore.MessageService.MessageLogger_cfi' ) -process.load( 'Configuration.Geometry.GeometryExtended2026D76Reco_cff' ) -process.load( 'Configuration.Geometry.GeometryExtended2026D76_cff' ) +process.load( 'Configuration.Geometry.GeometryExtended2026D98Reco_cff' ) +process.load( 'Configuration.Geometry.GeometryExtended2026D98_cff' ) process.load( 'Configuration.StandardSequences.MagneticField_cff' ) process.load( 'Configuration.StandardSequences.FrontierConditions_GlobalTag_cff' ) process.load( 'L1Trigger.TrackTrigger.TrackTrigger_cff' ) from Configuration.AlCa.GlobalTag import GlobalTag -process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +# Temporary change until we switch to D110 geometry. +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +process.GlobalTag = GlobalTag(process.GlobalTag, '140X_mcRun4_realistic_v3', '') # load code that produces DTCStubs process.load( 'L1Trigger.TrackerDTC.ProducerED_cff' ) @@ -27,7 +29,7 @@ #producerUseTMTT(process) #analyzerUseTMTT(process) -# build schedule +# build schedule (not essential to rerun producer) process.produce = cms.Path( process.TrackerDTCProducer ) process.analyze = cms.Path( process.TrackerDTCAnalyzer ) process.schedule = cms.Schedule( process.produce, process.analyze ) @@ -36,19 +38,9 @@ import FWCore.ParameterSet.VarParsing as VarParsing options = VarParsing.VarParsing( 'analysis' ) # specify input MC -Samples = [ - #'/store/relval/CMSSW_11_3_0_pre6/RelValSingleMuFlatPt2To100/GEN-SIM-DIGI-RAW/113X_mcRun4_realistic_v6_2026D76noPU-v1/10000/05f802b7-b0b3-4cca-8b70-754682c3bb4c.root' - #'/store/relval/CMSSW_11_3_0_pre6/RelValDisplacedMuPt2To100Dxy100/GEN-SIM-DIGI-RAW/113X_mcRun4_realistic_v6_2026D76noPU-v1/00000/011da61a-9524-4a96-b91f-03e8690af3bd.root' - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/00026541-6200-4eed-b6f8-d3a1fd720e9c.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/013d0125-8f6e-496b-8335-614398c9210d.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/058bd134-86de-47e1-bcde-379ed9b79e1b.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0915d66c-cbd4-4ef6-9971-7dd59e198b56.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/09823c8d-e443-4066-8347-8c704929cb2b.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0c39a1aa-93ee-41c1-8543-6d90c09114a7.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/0fcdcc53-fb9f-4f0b-8529-a4d60d914c14.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/16760a5c-9cd2-41c3-82e5-399bb962d537.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/1752640f-2001-4d14-9276-063ec07cea92.root', - '/store/relval/CMSSW_11_3_0_pre6/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_113X_mcRun4_realistic_v6_2026D76PU200-v1/00000/180712c9-31a5-4f2a-bf92-a7fbee4dabad.root' +Samples = [ '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0b2b0b0b-f312-48a8-9d46-ccbadc69bbfd.root', '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0c3cb20d-8556-450d-b4f0-e5c754818f74.root', '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/0eafa2b4-711a-43ec-be1c-7e564c294a9a.root', +'/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/1450b1bb-171e-495e-a767-68e2796d95c2.root,' '/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/15498564-9cf0-4219-aab7-f97b3484b122.root', +'/store/relval/CMSSW_14_0_0_pre2/RelValTTbar_14TeV/GEN-SIM-DIGI-RAW/PU_133X_mcRun4_realistic_v1_STD_2026D98_PU200_RV229-v1/2580000/1838a806-316b-4f53-9d22-5b3856019623.root' ] options.register( 'inputMC', Samples, VarParsing.VarParsing.multiplicity.singleton, VarParsing.VarParsing.varType.string, "Files to be processed" ) # specify number of events to process. diff --git a/L1Trigger/TrackerTFP/interface/DataFormats.h b/L1Trigger/TrackerTFP/interface/DataFormats.h index 62ffa8952d885..054f97807e20f 100644 --- a/L1Trigger/TrackerTFP/interface/DataFormats.h +++ b/L1Trigger/TrackerTFP/interface/DataFormats.h @@ -979,12 +979,13 @@ namespace trackerTFP { //Class to represent KFout 96-bit track for use in distribution server class TrackKFOut { public: - TrackKFOut() : TrackKFOut(0, 0, 0, 0, tt::FrameTrack(), 0, 0, false) {} + TrackKFOut() : TrackKFOut(0, 0, 0, 0, 0, tt::FrameTrack(), 0, 0, false) {} // construct TrackKF from Partial Tracks TrackKFOut(TTBV PartialTrack1, TTBV PartialTrack2, TTBV PartialTrack3, int sortKey, + int nonantId, const tt::FrameTrack& track, int trackID, int linkID, @@ -993,6 +994,7 @@ namespace trackerTFP { PartialTrack2_(PartialTrack2), PartialTrack3_(PartialTrack3), sortKey_(sortKey), + nonantId_(nonantId), track_(track), trackID_(trackID), linkID_(linkID), @@ -1001,6 +1003,7 @@ namespace trackerTFP { ~TrackKFOut() {} int sortKey() const { return sortKey_; } + int nonantId() const { return nonantId_; } bool dataValid() const { return valid_; } @@ -1018,6 +1021,7 @@ namespace trackerTFP { TTBV PartialTrack2_; TTBV PartialTrack3_; int sortKey_; + int nonantId_; tt::FrameTrack track_; int trackID_; int linkID_; From b42a40c5782adf34bf3f0a259dab9884e47a5a9f Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Tue, 10 Sep 2024 19:55:26 +0100 Subject: [PATCH 2/3] auto format --- L1Trigger/TrackFindingTracklet/interface/Settings.h | 4 ++-- L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 08d884410e582..b696f37846cb2 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -1051,11 +1051,11 @@ namespace trklet { // All layers, disks disabled by default, also is overwritten by above duplicateMPs bool // EqualProjBalancing is for layers for which the projections to each duplicated MP are split in half sequentially - std::array layersDisksDuplicatedEqualProjBalance_{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + std::array layersDisksDuplicatedEqualProjBalance_{{false, false, false, false, false, false, false, false, false, false, false}}; // Weighted proj balancing is for specifically L4, L5 where the split of the projections is weighted to account for // Higher occupancy in the L1L2 seed to minimize truncation - std::array layersDisksDuplicatedWeightedProjBalance_{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + std::array layersDisksDuplicatedWeightedProjBalance_{{false, false, false, false, false, false, false, false, false, false, false}}; // Example use where for L3, L4, L5, D2, D3, the layers/disks where truncation is worst //std::array layersDisksDuplicatedEqualProjBalance_{{0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0}}; diff --git a/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc b/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc index 3e5157dbe830d..f7001add46306 100644 --- a/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc +++ b/L1Trigger/TrackFindingTracklet/plugins/ProducerKFout.cc @@ -352,7 +352,7 @@ namespace trklet { sortedPartialTracks[iLink].push_back({nullPartialBits, nullTrackRef}); // keep TTTrackRef null every third (96 bits / 32 partial bits) output packet TTTrackRef fillTrackRef; - if ((iTrack / partialFactor + 1) % (TTTrack_TrackWord::TrackBitWidths::kTrackWordSize / partialTrackWordBits_) != 0) + if ((iTrack / partialFactor + 1) % (TTTrack_TrackWord::kTrackWordSize / partialTrackWordBits_) != 0) fillTrackRef = sortedPartialTracks[iLink][iTrack + 1].trackRef; // if there are too many output packets, truncate and put remaining outputs in lost collection From 044a068dc91a545c0ac3d7ea0c9ede510fc5c45b Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Wed, 11 Sep 2024 17:08:15 +0100 Subject: [PATCH 3/3] auto code format --- L1Trigger/TrackFindingTracklet/interface/Settings.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index b696f37846cb2..77be4324041f9 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -1051,11 +1051,13 @@ namespace trklet { // All layers, disks disabled by default, also is overwritten by above duplicateMPs bool // EqualProjBalancing is for layers for which the projections to each duplicated MP are split in half sequentially - std::array layersDisksDuplicatedEqualProjBalance_{{false, false, false, false, false, false, false, false, false, false, false}}; + std::array layersDisksDuplicatedEqualProjBalance_{ + {false, false, false, false, false, false, false, false, false, false, false}}; // Weighted proj balancing is for specifically L4, L5 where the split of the projections is weighted to account for // Higher occupancy in the L1L2 seed to minimize truncation - std::array layersDisksDuplicatedWeightedProjBalance_{{false, false, false, false, false, false, false, false, false, false, false}}; + std::array layersDisksDuplicatedWeightedProjBalance_{ + {false, false, false, false, false, false, false, false, false, false, false}}; // Example use where for L3, L4, L5, D2, D3, the layers/disks where truncation is worst //std::array layersDisksDuplicatedEqualProjBalance_{{0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0}};