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/ProcessBase.h b/L1Trigger/TrackFindingTracklet/interface/ProcessBase.h index 35fe4015c5e92..c6568d93eb8db 100644 --- a/L1Trigger/TrackFindingTracklet/interface/ProcessBase.h +++ b/L1Trigger/TrackFindingTracklet/interface/ProcessBase.h @@ -31,6 +31,10 @@ namespace trklet { //This function processes the name of a TE module to determine the layerdisks and iseed void initLayerDisksandISeed(unsigned int& layerdisk1, unsigned int& layerdisk2, unsigned int& iSeed); + void initLayerDisksandISeedDisp(unsigned int& layerdisk1, + unsigned int& layerdisk2, + unsigned int& layerdisk3, + unsigned int& iSeed); unsigned int getISeed(const std::string& name); diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 774e595ae62b0..6d4abf30d37a7 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_; } + const std::array& layersDisksDuplicatedEqualProjBalance() const { + return layersDisksDuplicatedEqualProjBalance_; + } + const std::array& layersDisksDuplicatedWeightedProjBalance() const { + return layersDisksDuplicatedWeightedProjBalance_; + } bool combined() const { return combined_; } void setCombined(bool combined) { combined_ = combined; } bool reduced() const { return reduced_; } @@ -890,6 +897,7 @@ namespace trklet { {"TB", 108}, {"MP", 108}, {"TP", 108}, + {"TPD", 108}, {"TRE", 108}, {"DR", 108}}; //Specifies how many tracks allowed per bin in DR @@ -1028,11 +1036,33 @@ 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_{ + {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}}; + + // 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/interface/TrackletLUT.h b/L1Trigger/TrackFindingTracklet/interface/TrackletLUT.h index ca15854a527a9..0ea493d067f67 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletLUT.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletLUT.h @@ -102,7 +102,7 @@ namespace trklet { //In the VMR we used the position of the stub (r, z) to calculate the bin and fine rz position the stub has //region only used for name - should be removed - void initVMRTable(unsigned int layerdisk, VMRTableType type, int region = -1); + void initVMRTable(unsigned int layerdisk, VMRTableType type, int region = -1, bool combined = true); //Used in barrel to calculate the phi position of a stub at the nominal radis of the layer based on the stub radial //psotion and bend @@ -116,6 +116,8 @@ namespace trklet { unsigned int size() const { return table_.size(); } + unsigned int nbits() const { return nbits_; } + private: const Settings& settings_; const tt::Setup* setup_; diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessorDisplaced.h b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessorDisplaced.h index 9313f030b1b5b..6cf8abd6e714a 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessorDisplaced.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessorDisplaced.h @@ -40,17 +40,10 @@ namespace trklet { private: int iTC_; - int iAllStub_; - unsigned int maxStep_; - int count_; - unsigned int layerdisk_; - - int layer1_; - int layer2_; - int layer3_; - int disk1_; - int disk2_; - int disk3_; + + unsigned int layerdisk1_; + unsigned int layerdisk2_; + unsigned int layerdisk3_; int firstphibits_; int secondphibits_; @@ -59,20 +52,11 @@ namespace trklet { int nbitszfinebintable_; int nbitsrfinebintable_; - TrackletLUT innerTable_; //projection to next layer/disk - TrackletLUT innerOverlapTable_; //projection to disk from layer - TrackletLUT innerThirdTable_; //projection to disk1 for extended - iseed=10 + TrackletLUT innerTable_; //projection to next layer/disk + TrackletLUT innerThirdTable_; //projection to third disk/layer - std::vector stubpairs_; - /* std::vector stubtriplets_; */ std::vector innervmstubs_; std::vector outervmstubs_; - - StubTripletsMemory* stubtriplets_; - - std::map > > tmpSPTable_; - std::map > > spTable_; - std::vector table_; }; }; // namespace trklet diff --git a/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h b/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h index 09b6664e934f2..38c3286b4c286 100644 --- a/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h +++ b/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h @@ -22,11 +22,18 @@ namespace trklet { class VMStubsTEMemory; struct VMStubsTEPHICM { - VMStubsTEPHICM(unsigned int seednumber_, std::vector vmstubmem_) - : seednumber(seednumber_), vmstubmem(vmstubmem_) {} - - unsigned int seednumber; //seed number [0,11] - std::vector vmstubmem; // m_vmstubmem[n] is the VMStubsTEMemory for the nth copy + VMStubsTEPHICM(unsigned int seednumber_, + unsigned int stubposition_, + const std::vector >& vmstubmem_) + : seednumber(seednumber_), stubposition(stubposition_), vmstubmem(vmstubmem_) {}; + + unsigned int seednumber; //seed number [0,11] + unsigned int stubposition; //stub position in the seed (only used by triplet seeds) + + // The first index in the following 2D vector is only used in the case of + // the triplet seeds. + std::vector > + vmstubmem; // m_vmstubmem[iVM][n] is the VMStubsTEMemory for iVM and the nth copy }; class VMRouterCM : public ProcessBase { @@ -57,6 +64,14 @@ namespace trklet { TrackletLUT meTable_; //used for ME and outer TE barrel TrackletLUT diskTable_; //outer disk used by D1, D2, and D4 + // The following tables are only used to replicate the behavior of the old + // VMRouter in the case of the triplet seeds. + TrackletLUT meTableOld_; //used for ME and outer TE barrel + TrackletLUT diskTableOld_; //outer disk used by D1, D2, and D4 + TrackletLUT innerTable_; //projection to next layer/disk + TrackletLUT innerOverlapTable_; //projection to disk from layer + TrackletLUT innerThirdTable_; //projection to disk1 for extended - iseed=10 + //The input stub memories std::vector stubinputs_; diff --git a/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h b/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h index f8bb8c7f54545..34e168308d116 100644 --- a/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h +++ b/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h @@ -23,7 +23,7 @@ namespace trklet { void resize(int nbins) { stubsbinnedvm_.resize(nbins); } - bool addVMStub(VMStubTE vmstub, int bin); + bool addVMStub(VMStubTE vmstub, int bin, int ivmte = 0, bool combined = true); bool addVMStub(VMStubTE vmstub); diff --git a/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc b/L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc index b05594a956da6..6bc9104b41764 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"); @@ -282,7 +283,10 @@ L1FPGATrackProducer::L1FPGATrackProducer(edm::ParameterSet const& iConfig) settings_.setReduced(reduced_); settings_.setNHelixPar(nHelixPar_); +#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 +312,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 +756,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..f7001add46306 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::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..7515a7c089c62 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_hourglassExtendedAllCombined.dat'), + processingModulesFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/processingmodules_hourglassExtendedAllCombined.dat'), + wiresFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/wires_hourglassExtendedAllCombined.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/ProcessBase.cc b/L1Trigger/TrackFindingTracklet/src/ProcessBase.cc index 9194bffc91544..bbddcf67d5d9a 100644 --- a/L1Trigger/TrackFindingTracklet/src/ProcessBase.cc +++ b/L1Trigger/TrackFindingTracklet/src/ProcessBase.cc @@ -116,6 +116,43 @@ void ProcessBase::initLayerDisksandISeed(unsigned int& layerdisk1, unsigned int& } } +void ProcessBase::initLayerDisksandISeedDisp(unsigned int& layerdisk1, + unsigned int& layerdisk2, + unsigned int& layerdisk3, + unsigned int& iSeed) { + layerdisk1 = 99; + layerdisk2 = 99; + layerdisk3 = 99; + + if (name_.substr(0, 4) == "TPD_") { + if (name_[4] == 'L') + layerdisk1 = name_[5] - '1'; + else if (name_[4] == 'D') + layerdisk1 = N_LAYER + name_[5] - '1'; + if (name_[6] == 'L') + layerdisk2 = name_[7] - '1'; + else if (name_[6] == 'D') + layerdisk2 = N_LAYER + name_[7] - '1'; + if (name_[8] == 'L') + layerdisk3 = name_[9] - '1'; + else if (name_[8] == 'D') + layerdisk3 = N_LAYER + name_[9] - '1'; + } + + if (layerdisk1 == LayerDisk::L3 && layerdisk2 == LayerDisk::L4 && layerdisk3 == LayerDisk::L2) + iSeed = Seed::L2L3L4; + else if (layerdisk1 == LayerDisk::L5 && layerdisk2 == LayerDisk::L6 && layerdisk3 == LayerDisk::L4) + iSeed = Seed::L4L5L6; + else if (layerdisk1 == LayerDisk::L2 && layerdisk2 == LayerDisk::L3 && layerdisk3 == LayerDisk::D1) + iSeed = Seed::L2L3D1; + else if (layerdisk1 == LayerDisk::D1 && layerdisk2 == LayerDisk::D2 && layerdisk3 == LayerDisk::L2) + iSeed = Seed::D1D2L2; + else { + throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " layerdisk1 " << layerdisk1 << " layerdisk2 " + << layerdisk2 << " layerdisk3 " << layerdisk3; + } +} + unsigned int ProcessBase::getISeed(const std::string& name) { std::size_t pos = name.find('_'); std::string name1 = name.substr(pos + 1); 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/TrackletLUT.cc b/L1Trigger/TrackFindingTracklet/src/TrackletLUT.cc index acb66ddf68382..91dec76731c1b 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletLUT.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletLUT.cc @@ -995,7 +995,7 @@ void TrackletLUT::initBendMatch(unsigned int layerdisk) { writeTable(); } -void TrackletLUT::initVMRTable(unsigned int layerdisk, VMRTableType type, int region) { +void TrackletLUT::initVMRTable(unsigned int layerdisk, VMRTableType type, int region, bool combined) { unsigned int zbits = settings_.vmrlutzbits(layerdisk); unsigned int rbits = settings_.vmrlutrbits(layerdisk); @@ -1026,7 +1026,12 @@ void TrackletLUT::initVMRTable(unsigned int layerdisk, VMRTableType type, int re double r = rmin + (irbin + 0.5) * dr; double z = zmin + (izbin + 0.5) * dz; - if (settings_.combined()) { + // The extra "combined" flag is used to disable the flag from settings_ + // in special cases. In particular, in the case of the triplet seeds, the + // VMRouterCM and TrackletProcessorDisplaced currently use the older LUTs + // that were used with the non-combined modules. Once these modules are + // updated, this extra flag can be removed. + if (settings_.combined() && combined) { int iznew = izbin - (1 << (zbits - 1)); if (iznew < 0) iznew += (1 << zbits); @@ -1114,7 +1119,12 @@ void TrackletLUT::initVMRTable(unsigned int layerdisk, VMRTableType type, int re } } - if (settings_.combined()) { + // The extra "combined" flag is used to disable the flag from settings_ in + // special cases. In particular, in the case of the triplet seeds, the + // VMRouterCM and TrackletProcessorDisplaced currently use the older LUTs + // that were used with the non-combined modules. Once these modules are + // updated, this extra flag can be removed. + if (settings_.combined() && combined) { if (type == VMRTableType::me) { nbits_ = 2 * settings_.NLONGVMBITS(); positive_ = false; diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletProcessorDisplaced.cc b/L1Trigger/TrackFindingTracklet/src/TrackletProcessorDisplaced.cc index 37dd2a5a3f20f..903c62cf0a124 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletProcessorDisplaced.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletProcessorDisplaced.cc @@ -18,45 +18,33 @@ using namespace std; using namespace trklet; +// TrackletProcessorDisplaced +// +// This module takes in collections of stubs within a phi region and a +// displaced seed name and tries to create that displaced seed out of the stubs +// +// Update: Claire Savard, Oct. 2024 + TrackletProcessorDisplaced::TrackletProcessorDisplaced(string name, Settings const& settings, Globals* globals) - : TrackletCalculatorDisplaced(name, settings, globals), - innerTable_(settings), - innerOverlapTable_(settings), - innerThirdTable_(settings) { + : TrackletCalculatorDisplaced(name, settings, globals), innerTable_(settings), innerThirdTable_(settings) { innerallstubs_.clear(); middleallstubs_.clear(); outerallstubs_.clear(); - stubpairs_.clear(); innervmstubs_.clear(); outervmstubs_.clear(); - const unsigned layerdiskPosInName = 4; - const unsigned regionPosInName1 = 9; - - // iAllStub_ = -1; - layerdisk_ = initLayerDisk(layerdiskPosInName); - - unsigned int region = name.substr(1)[regionPosInName1] - 'A'; - // assert(region < settings_.nallstubs(layerdisk_)); + // set layer/disk types based on input seed name + initLayerDisksandISeedDisp(layerdisk1_, layerdisk2_, layerdisk3_, iSeed_); - if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 || - layerdisk_ == LayerDisk::L5 || layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D3) { - innerTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::inner, region); //projection to next layer/disk - } + // get projection tables + unsigned int region = name.back() - 'A'; + innerTable_.initVMRTable( + layerdisk1_, TrackletLUT::VMRTableType::inner, region, false); //projection to next layer/disk + innerThirdTable_.initVMRTable( + layerdisk1_, TrackletLUT::VMRTableType::innerthird, region, false); //projection to third layer/disk - if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2) { - innerOverlapTable_.initVMRTable( - layerdisk_, TrackletLUT::VMRTableType::inneroverlap, region); //projection to disk from layer - } - - if (layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 || layerdisk_ == LayerDisk::L5 || - layerdisk_ == LayerDisk::D1) { - innerThirdTable_.initVMRTable( - layerdisk_, TrackletLUT::VMRTableType::innerthird, region); //projection to third layer/disk - } - - nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk_); - nbitsrfinebintable_ = settings_.vmrlutrbits(layerdisk_); + nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk1_); + nbitsrfinebintable_ = settings_.vmrlutrbits(layerdisk1_); for (unsigned int ilayer = 0; ilayer < N_LAYER; ilayer++) { vector tmp(settings_.nallstubs(ilayer), nullptr); @@ -68,66 +56,12 @@ TrackletProcessorDisplaced::TrackletProcessorDisplaced(string name, Settings con trackletprojdisks_.push_back(tmp); } - // initLayerDisksandISeed(layerdisk1_, layerdisk2_, iSeed_); - - layer_ = 0; - disk_ = 0; - layer1_ = 0; - layer2_ = 0; - layer3_ = 0; - disk1_ = 0; - disk2_ = 0; - disk3_ = 0; - - constexpr unsigned layerPosInName1 = 4; - constexpr unsigned diskPosInName1 = 4; - constexpr unsigned layer1PosInName1 = 4; - constexpr unsigned disk1PosInName1 = 4; - constexpr unsigned layer2PosInName1 = 6; - constexpr unsigned disk2PosInName1 = 6; - - string name1 = name.substr(1); //this is to correct for "TPD" having one more letter then "TP" - if (name1[3] == 'L') - layer_ = name1[layerPosInName1] - '0'; - if (name1[3] == 'D') - disk_ = name1[diskPosInName1] - '0'; - - if (name1[3] == 'L') - layer1_ = name1[layer1PosInName1] - '0'; - if (name1[3] == 'D') - disk1_ = name1[disk1PosInName1] - '0'; - if (name1[5] == 'L') - layer2_ = name1[layer2PosInName1] - '0'; - if (name1[5] == 'D') - disk2_ = name1[disk2PosInName1] - '0'; - // set TC index - iSeed_ = 0; - - int iTC = name1[regionPosInName1] - 'A'; - - if (name1.substr(3, 6) == "L3L4L2") { - iSeed_ = 8; - layer3_ = 2; - } else if (name1.substr(3, 6) == "L5L6L4") { - iSeed_ = 9; - layer3_ = 4; - } else if (name1.substr(3, 6) == "L2L3D1") { - iSeed_ = 10; - disk3_ = 1; - } else if (name1.substr(3, 6) == "D1D2L2") { - iSeed_ = 11; - layer3_ = 2; - } - assert(iSeed_ != 0); - + iTC_ = region; constexpr int TCIndexMin = 128; constexpr int TCIndexMax = 191; - - TCIndex_ = (iSeed_ << 4) + iTC; + TCIndex_ = (iSeed_ << 4) + iTC_; assert(TCIndex_ >= TCIndexMin && TCIndex_ < TCIndexMax); - - assert((layer_ != 0) || (disk_ != 0)); } void TrackletProcessorDisplaced::addOutputProjection(TrackletProjectionsMemory*& outputProj, MemoryBase* memory) { @@ -205,13 +139,6 @@ void TrackletProcessorDisplaced::addInput(MemoryBase* memory, string input) { outerallstubs_.push_back(tmp); return; } - if (input.substr(0, 8) == "stubpair") { - auto* tmp = dynamic_cast(memory); - assert(tmp != nullptr); - stubpairs_.push_back(tmp); - return; - } - if (input == "thirdvmstubin") { auto* tmp = dynamic_cast(memory); assert(tmp != nullptr); @@ -221,7 +148,6 @@ void TrackletProcessorDisplaced::addInput(MemoryBase* memory, string input) { if (input == "secondvmstubin") { auto* tmp = dynamic_cast(memory); assert(tmp != nullptr); - // outervmstubs_ = tmp; outervmstubs_.push_back(tmp); return; } @@ -232,47 +158,35 @@ void TrackletProcessorDisplaced::addInput(MemoryBase* memory, string input) { void TrackletProcessorDisplaced::execute(unsigned int iSector, double phimin, double phimax) { unsigned int countall = 0; unsigned int countsel = 0; - // unsigned int nThirdStubs = 0; - // unsigned int nOuterStubs = 0; - count_ = 0; phimin_ = phimin; phimax_ = phimax; iSector_ = iSector; - assert(!innerallstubs_.empty()); - assert(!middleallstubs_.empty()); - assert(!outerallstubs_.empty()); - assert(!innervmstubs_.empty()); - assert(!outervmstubs_.empty()); - assert(stubpairs_.empty()); - - for (auto& iInnerMem : middleallstubs_) { - assert(iInnerMem->nStubs() == iInnerMem->nStubs()); - for (unsigned int j = 0; j < iInnerMem->nStubs(); j++) { - const Stub* firstallstub = iInnerMem->getStub(j); + // loop over the middle stubs in the potential seed + for (unsigned int midmem = 0; midmem < middleallstubs_.size(); midmem++) { + for (unsigned int i = 0; i < middleallstubs_[midmem]->nStubs(); i++) { + const Stub* midallstub = middleallstubs_[midmem]->getStub(i); if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have first stub\n"; + edm::LogVerbatim("Tracklet") << "In " << getName() << " have middle stub"; } - int inner = 0; - bool negdisk = (firstallstub->disk().value() < 0); - int indexz = (((1 << (firstallstub->z().nbits() - 1)) + firstallstub->z().value()) >> - (firstallstub->z().nbits() - nbitszfinebintable_)); + // get r/z index of the middle stub + int indexz = (((1 << (midallstub->z().nbits() - 1)) + midallstub->z().value()) >> + (midallstub->z().nbits() - nbitszfinebintable_)); int indexr = -1; - if (layerdisk_ > (N_LAYER - 1)) { - if (negdisk) { + bool negdisk = (midallstub->disk().value() < 0); // check if disk in negative z region + if (layerdisk1_ >= LayerDisk::D1) { // if a disk + if (negdisk) indexz = (1 << nbitszfinebintable_) - indexz; + indexr = midallstub->r().value(); + if (midallstub->isPSmodule()) { + indexr = midallstub->r().value() >> (midallstub->r().nbits() - nbitsrfinebintable_); } - indexr = firstallstub->r().value(); - if (firstallstub->isPSmodule()) { - indexr = firstallstub->r().value() >> (firstallstub->r().nbits() - nbitsrfinebintable_); - } - } else { - //Take the top nbitsfinebintable_ bits of the z coordinate. The & is to handle the negative z values. - indexr = (((1 << (firstallstub->r().nbits() - 1)) + firstallstub->r().value()) >> - (firstallstub->r().nbits() - nbitsrfinebintable_)); + } else { // else a layer + indexr = (((1 << (midallstub->r().nbits() - 1)) + midallstub->r().value()) >> + (midallstub->r().nbits() - nbitsrfinebintable_)); } assert(indexz >= 0); @@ -280,389 +194,136 @@ void TrackletProcessorDisplaced::execute(unsigned int iSector, double phimin, do assert(indexz < (1 << nbitszfinebintable_)); assert(indexr < (1 << nbitsrfinebintable_)); - // int melut = meTable_.lookup((indexz << nbitsrfinebintable_) + indexr); - // assert(melut >= 0); - - unsigned int lutwidth = settings_.lutwidthtab(inner, iSeed_); - if (settings_.extended()) { - lutwidth = settings_.lutwidthtabextended(inner, iSeed_); - } - - int lutval = -999; - - if (iSeed_ < Seed::L1D1 || iSeed_ > Seed::L2D1) { - lutval = innerTable_.lookup((indexz << nbitsrfinebintable_) + indexr); - } else { - lutval = innerOverlapTable_.lookup((indexz << nbitsrfinebintable_) + indexr); - } - + // create lookupbits that define projections from middle stub + unsigned int lutwidth = settings_.lutwidthtabextended(0, iSeed_); + int lutval = -1; + const auto& lutshift = innerTable_.nbits(); + lutval = innerTable_.lookup((indexz << nbitsrfinebintable_) + indexr); + int lutval2 = innerThirdTable_.lookup((indexz << nbitsrfinebintable_) + indexr); + if (lutval != -1 && lutval2 != -1) + lutval += (lutval2 << lutshift); if (lutval == -1) continue; - if (settings_.extended() && - (iSeed_ == Seed::L2L3L4 || iSeed_ == Seed::L4L5L6 || iSeed_ == Seed::D1D2L2 || iSeed_ == Seed::L2L3D1)) { - int lutval2 = innerThirdTable_.lookup((indexz << nbitsrfinebintable_) + indexr); - if (lutval2 != -1) - lutval += (lutval2 << 10); - } - - assert(lutval >= 0); - // assert(lutwidth > 0); - - FPGAWord binlookup(lutval, lutwidth, true, __LINE__, __FILE__); - - if ((layer1_ == 3 && layer2_ == 4) || (layer1_ == 5 && layer2_ == 6)) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " Layer-layer pair\n"; - } - - constexpr int andlookupbits = 1023; - constexpr int shiftzdiffmax = 7; - constexpr int andnewbin = 127; - constexpr int divbin = 8; - constexpr int andzbinfirst = 7; - constexpr int shiftstart = 1; - constexpr int andlast = 1; - constexpr int maxlast = 8; - - int lookupbits = binlookup.value() & andlookupbits; - int zdiffmax = (lookupbits >> shiftzdiffmax); - int newbin = (lookupbits & andnewbin); - int bin = newbin / divbin; - - int zbinfirst = newbin & andzbinfirst; - - int start = (bin >> shiftstart); - int last = start + (bin & andlast); - - assert(last < maxlast); - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Will look in zbins " << start << " to " << last << endl; - } - - for (int ibin = start; ibin <= last; ibin++) { - for (unsigned int m = 0; m < outervmstubs_.size(); m++) { - for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "In " << getName() << " have second stub(1) " << ibin << " " << j << endl; - } - - const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j); - - int zbin = (secondvmstub.vmbits().value() & 7); - if (start != ibin) - zbin += 8; - if (zbin < zbinfirst || zbin - zbinfirst > zdiffmax) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stubpair rejected because of wrong zbin"; - } - continue; - } - - if ((layer2_ == 4 && layer3_ == 2) || (layer2_ == 6 && layer3_ == 4)) { - constexpr int vmbitshift = 10; - constexpr int andlookupbits_ = 1023; - constexpr int andnewbin_ = 127; - constexpr int divbin_ = 8; - constexpr int shiftstart_ = 1; - constexpr int andlast_ = 1; - - int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_); - int newbin_ = (lookupbits_ & andnewbin_); - int bin_ = newbin_ / divbin_; - - int start_ = (bin_ >> shiftstart_); - int last_ = start_ + (bin_ & andlast_); - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "Will look in zbins for third stub" << start_ << " to " << last_ << endl; - } - - for (int ibin_ = start_; ibin_ <= last_; ibin_++) { - for (unsigned int k = 0; k < innervmstubs_.size(); k++) { - for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub\n"; - } - - countall++; - - const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l); - - const Stub* innerFPGAStub = firstallstub; - const Stub* middleFPGAStub = secondvmstub.stub(); - const Stub* outerFPGAStub = thirdvmstub.stub(); - - const L1TStub* innerStub = innerFPGAStub->l1tstub(); - const L1TStub* middleStub = middleFPGAStub->l1tstub(); - const L1TStub* outerStub = outerFPGAStub->l1tstub(); - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "LLL seeding\n" - << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare() - << innerStub->stubword() << middleStub->stubword() << outerStub->stubword() - << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk(); - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]"; - } - - if (innerFPGAStub->layerdisk() < N_LAYER && middleFPGAStub->layerdisk() < N_LAYER && - outerFPGAStub->layerdisk() < N_LAYER) { - bool accept = - LLLSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub); - - if (accept) - countsel++; - } else if (innerFPGAStub->layerdisk() >= N_LAYER && middleFPGAStub->layerdisk() >= N_LAYER && - outerFPGAStub->layerdisk() >= N_LAYER) { - throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " Invalid seeding!"; - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done"; - } - } - } - } - } - } - } - } - - } else if (layer1_ == 2 && layer2_ == 3) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " Layer-layer pair"; - } - - constexpr int andlookupbits = 1023; - constexpr int shiftzdiffmax = 7; - constexpr int andnewbin = 127; - constexpr int divbin = 8; - constexpr int andzbinfirst = 7; - constexpr int shiftstart = 1; - constexpr int andlast = 1; - constexpr int maxlast = 8; + FPGAWord lookupbits(lutval, lutwidth, true, __LINE__, __FILE__); - int lookupbits = binlookup.value() & andlookupbits; - int zdiffmax = (lookupbits >> shiftzdiffmax); - int newbin = (lookupbits & andnewbin); - int bin = newbin / divbin; + // get r/z bins for projection into outer layer/disk + int nbitsrzbin = N_RZBITS; + if (iSeed_ == Seed::D1D2L2) + nbitsrzbin--; + int rzbinfirst = lookupbits.bits(0, NFINERZBITS); + int next = lookupbits.bits(NFINERZBITS, 1); + int rzdiffmax = lookupbits.bits(NFINERZBITS + 1 + nbitsrzbin, NFINERZBITS); - int zbinfirst = newbin & andzbinfirst; + int start = lookupbits.bits(NFINERZBITS + 1, nbitsrzbin); // first rz bin projection + if (iSeed_ == Seed::D1D2L2 && negdisk) // if projecting into disk + start += (1 << nbitsrzbin); + int last = start + next; // last rz bin projection - int start = (bin >> shiftstart); - int last = start + (bin & andlast); + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << "Will look in r/z bins for outer stub " << start << " to " << last << endl; + } - assert(last < maxlast); + // loop over outer stubs that the middle stub can project to + for (int ibin = start; ibin <= last; ibin++) { + for (unsigned int outmem = 0; outmem < outervmstubs_.size(); outmem++) { + for (unsigned int j = 0; j < outervmstubs_[outmem]->nVMStubsBinned(ibin); j++) { + if (settings_.debugTracklet()) + edm::LogVerbatim("Tracklet") << "In " << getName() << " have outer stub" << endl; - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Will look in zbins " << start << " to " << last; - } + const VMStubTE& outvmstub = outervmstubs_[outmem]->getVMStubTEBinned(ibin, j); - for (int ibin = start; ibin <= last; ibin++) { - for (unsigned int m = 0; m < outervmstubs_.size(); m++) { - for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) { + // check if r/z of outer stub is within projection range + int rzbin = (outvmstub.vmbits().value() & (settings_.NLONGVMBINS() - 1)); + if (start != ibin) + rzbin += 8; + if (rzbin < rzbinfirst || rzbin - rzbinfirst > rzdiffmax) { if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have second stub(1) " << ibin << " " << j; - } - - const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j); - - int zbin = (secondvmstub.vmbits().value() & 7); - if (start != ibin) - zbin += 8; - if (zbin < zbinfirst || zbin - zbinfirst > zdiffmax) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stubpair rejected because of wrong zbin"; - } - continue; - } - - if (layer2_ == 3 && disk3_ == 1) { - constexpr int vmbitshift = 10; - constexpr int andlookupbits_ = 1023; - constexpr int andnewbin_ = 127; - constexpr int divbin_ = 8; - constexpr int shiftstart_ = 1; - constexpr int andlast_ = 1; - - int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_); - int newbin_ = (lookupbits_ & andnewbin_); - int bin_ = newbin_ / divbin_; - - int start_ = (bin_ >> shiftstart_); - int last_ = start_ + (bin_ & andlast_); - - for (int ibin_ = start_; ibin_ <= last_; ibin_++) { - for (unsigned int k = 0; k < innervmstubs_.size(); k++) { - for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub"; - } - - countall++; - - const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l); - - const Stub* innerFPGAStub = firstallstub; - const Stub* middleFPGAStub = secondvmstub.stub(); - const Stub* outerFPGAStub = thirdvmstub.stub(); - - const L1TStub* innerStub = innerFPGAStub->l1tstub(); - const L1TStub* middleStub = middleFPGAStub->l1tstub(); - const L1TStub* outerStub = outerFPGAStub->l1tstub(); - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "LLD seeding\n" - << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare() - << innerStub->stubword() << middleStub->stubword() << outerStub->stubword() - << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk(); - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]"; - } - - bool accept = - LLDSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub); - - if (accept) - countsel++; - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done"; - } - } - } - } + edm::LogVerbatim("Tracklet") << "Outer stub rejected because of wrong r/z bin"; } + continue; } - } - } - - } else if (disk1_ == 1 && disk2_ == 2) { - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << getName() << " Disk-disk pair"; - constexpr int andlookupbits = 511; - constexpr int shiftrdiffmax = 6; - constexpr int andnewbin = 63; - constexpr int divbin = 8; - constexpr int andrbinfirst = 7; - constexpr int shiftstart = 1; - constexpr int andlast = 1; - constexpr int maxlast = 8; + // get r/z bins for projection into third layer/disk + int nbitsrzbin_ = N_RZBITS; + int next_ = lookupbits.bits(lutshift + NFINERZBITS, 1); - int lookupbits = binlookup.value() & andlookupbits; - bool negdisk = firstallstub->disk().value() < 0; - int rdiffmax = (lookupbits >> shiftrdiffmax); - int newbin = (lookupbits & andnewbin); - int bin = newbin / divbin; + int start_ = lookupbits.bits(lutshift + NFINERZBITS + 1, nbitsrzbin_); // first rz bin projection + if (iSeed_ == Seed::D1D2L2 && negdisk) // if projecting from disk into layer + start_ = settings_.NLONGVMBINS() - 1 - start_ - next_; + int last_ = start_ + next_; // last rz bin projection - int rbinfirst = newbin & andrbinfirst; - - int start = (bin >> shiftstart); - if (negdisk) - start += 4; - int last = start + (bin & andlast); - assert(last < maxlast); - - for (int ibin = start; ibin <= last; ibin++) { - for (unsigned int m = 0; m < outervmstubs_.size(); m++) { if (settings_.debugTracklet()) { edm::LogVerbatim("Tracklet") - << getName() << " looking for matching stub in " << outervmstubs_.at(m)->getName() - << " in bin = " << ibin << " with " << outervmstubs_.at(m)->nVMStubsBinned(ibin) << " stubs"; + << "Will look in rz bins for inner stub " << start_ << " to " << last_ << endl; } - for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) { - const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j); - int rbin = (secondvmstub.vmbits().value() & 7); - if (start != ibin) - rbin += 8; - if (rbin < rbinfirst) - continue; - if (rbin - rbinfirst > rdiffmax) - continue; - - if (disk2_ == 2 && layer3_ == 2) { - constexpr int vmbitshift = 10; - constexpr int andlookupbits_ = 1023; - constexpr int andnewbin_ = 127; - constexpr int divbin_ = 8; - constexpr int shiftstart_ = 1; - constexpr int andlast_ = 1; - - int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_); - int newbin_ = (lookupbits_ & andnewbin_); - int bin_ = newbin_ / divbin_; - - int start_ = (bin_ >> shiftstart_); - int last_ = start_ + (bin_ & andlast_); - - if (firstallstub->disk().value() < 0) { //TODO - negative disk should come from memory - start_ = settings_.NLONGVMBINS() - last_ - 1; - last_ = settings_.NLONGVMBINS() - start_ - 1; - } - - for (int ibin_ = start_; ibin_ <= last_; ibin_++) { - for (unsigned int k = 0; k < innervmstubs_.size(); k++) { - for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub"; - } - - countall++; - - const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l); - - const Stub* innerFPGAStub = firstallstub; - const Stub* middleFPGAStub = secondvmstub.stub(); - const Stub* outerFPGAStub = thirdvmstub.stub(); - - const L1TStub* innerStub = innerFPGAStub->l1tstub(); - const L1TStub* middleStub = middleFPGAStub->l1tstub(); - const L1TStub* outerStub = outerFPGAStub->l1tstub(); - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "DDL seeding\n" - << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare() - << innerStub->stubword() << middleStub->stubword() << outerStub->stubword() - << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk(); - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]"; - } + // loop over inner stubs that the middle stub can project to + for (int ibin_ = start_; ibin_ <= last_; ibin_++) { + for (unsigned int inmem = 0; inmem < innervmstubs_.size(); inmem++) { + for (unsigned int k = 0; k < innervmstubs_[inmem]->nVMStubsBinned(ibin_); k++) { + if (settings_.debugTracklet()) + edm::LogVerbatim("Tracklet") << "In " << getName() << " have inner stub" << endl; + + const VMStubTE& invmstub = innervmstubs_[inmem]->getVMStubTEBinned(ibin_, k); + + countall++; + + const Stub* innerFPGAStub = invmstub.stub(); + const Stub* middleFPGAStub = midallstub; + const Stub* outerFPGAStub = outvmstub.stub(); + + const L1TStub* innerStub = innerFPGAStub->l1tstub(); + const L1TStub* middleStub = middleFPGAStub->l1tstub(); + const L1TStub* outerStub = outerFPGAStub->l1tstub(); + + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") + << "triplet seeding\n" + << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare() + << innerStub->stubword() << middleStub->stubword() << outerStub->stubword() + << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk(); + edm::LogVerbatim("Tracklet") + << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]"; + } - bool accept = - DDLSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub); + // check if the seed made from the 3 stubs is valid + bool accept = false; + if (iSeed_ == Seed::L2L3L4 || iSeed_ == Seed::L4L5L6) + accept = LLLSeeding(innerFPGAStub, innerStub, middleFPGAStub, middleStub, outerFPGAStub, outerStub); + else if (iSeed_ == Seed::L2L3D1) + accept = LLDSeeding(innerFPGAStub, innerStub, middleFPGAStub, middleStub, outerFPGAStub, outerStub); + else if (iSeed_ == Seed::D1D2L2) + accept = DDLSeeding(innerFPGAStub, innerStub, middleFPGAStub, middleStub, outerFPGAStub, outerStub); - if (accept) - countsel++; + if (accept) + countsel++; - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done"; - } - } + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done"; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } + if (countall >= settings_.maxStep("TPD")) + break; } if (settings_.writeMonitorData("TPD")) { diff --git a/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc index 371e9725612ad..b46554a4d0f1f 100644 --- a/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc +++ b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc @@ -15,21 +15,52 @@ using namespace std; using namespace trklet; VMRouterCM::VMRouterCM(string name, Settings const& settings, Globals* global) - : ProcessBase(name, settings, global), meTable_(settings), diskTable_(settings) { + : ProcessBase(name, settings, global), + meTable_(settings), + diskTable_(settings), + meTableOld_(settings), + diskTableOld_(settings), + innerTable_(settings), + innerOverlapTable_(settings), + innerThirdTable_(settings) { layerdisk_ = initLayerDisk(4); 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_)); - meTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::me, region); //used for ME and outer TE barrel + // The TrackletProcessorDisplaced currently uses the older LUTs that were + // used with the non-combined modules. To maintain compatibility, we + // initialize these older LUTs below, which are used for the triplet seeds in + // the "execute" method. Once the TrackletProcessorDisplaced is updated, + // these can be removed. + + meTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::me, region); //used for ME and outer TE barrel + meTableOld_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::me, region, false); //used for ME and outer TE barrel if (layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D2 || layerdisk_ == LayerDisk::D4) { diskTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::disk, region); //outer disk used by D1, D2, and D4 + diskTableOld_.initVMRTable( + layerdisk_, TrackletLUT::VMRTableType::disk, region, false); //outer disk used by D1, D2, and D4 + } + + if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 || + layerdisk_ == LayerDisk::L5 || layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D3) { + innerTable_.initVMRTable( + layerdisk_, TrackletLUT::VMRTableType::inner, region, false); //projection to next layer/disk + } + + if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2) { + innerOverlapTable_.initVMRTable( + layerdisk_, TrackletLUT::VMRTableType::inneroverlap, region, false); //projection to disk from layer + } + + if (layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 || layerdisk_ == LayerDisk::L5 || + layerdisk_ == LayerDisk::D1) { + innerThirdTable_.initVMRTable( + layerdisk_, TrackletLUT::VMRTableType::innerthird, region, false); //projection to third layer/disk } nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk_); @@ -61,8 +92,45 @@ void VMRouterCM::addOutput(MemoryBase* memory, string output) { if (output.substr(0, 9) == "vmstubout") { if (memory->getName().substr(3, 2) == "TE") { VMStubsTEMemory* tmp = dynamic_cast(memory); - unsigned int iseed = output[output.size() - 1] - '0'; - assert(iseed < N_SEED_PROMPT); + int i = output.find_last_of('_'); + unsigned int iseed = std::stoi(output.substr(i + 1)); + assert(iseed < N_SEED); + + // This flag is used to replicate the behavior of the old VMRouter for + // the case of the triplet seeds. + const bool isTripletSeed = (iseed >= L2L3L4); + + // seedtype, vmbin, and inner are only used in the case of the triplet + // seeds. + char seedtype = memory->getName().substr(11, 1)[0]; + unsigned int pos = 12; + int vmbin = memory->getName().substr(pos, 1)[0] - '0'; + pos++; + if (pos < memory->getName().size()) { + if (memory->getName().substr(pos, 1)[0] != 'n') { + vmbin = vmbin * 10 + memory->getName().substr(pos, 1)[0] - '0'; + pos++; + } + } + unsigned int inner = 1; + if (seedtype < 'I') { + if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L3 || layerdisk_ == LayerDisk::L5 || + layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D3) + inner = 0; + } else if (seedtype < 'M') { + if (layerdisk_ == LayerDisk::L2) + inner = 0; + } else if (seedtype <= 'Z') { + if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2) + inner = 0; + } else if (seedtype < 'o' && seedtype >= 'a') { + if (layerdisk_ == LayerDisk::L2) + inner = 0; + } else if (seedtype > 'o' && seedtype <= 'z') { + inner = 2; + } else { + throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " Invalid seeding!"; + } int seedindex = -1; for (unsigned int k = 0; k < vmstubsTEPHI_.size(); k++) { @@ -72,19 +140,23 @@ void VMRouterCM::addOutput(MemoryBase* memory, string output) { } if (seedindex == -1) { seedindex = vmstubsTEPHI_.size(); - vector vectmp; - VMStubsTEPHICM atmp(iseed, vectmp); + vector avectmp; + vector > vectmp(!isTripletSeed ? 1 : settings_.nvmte(inner, iseed), avectmp); + VMStubsTEPHICM atmp(iseed, inner, vectmp); vmstubsTEPHI_.push_back(atmp); } - tmp->resize(settings_.NLONGVMBINS() * settings_.nvmte(1, iseed)); - vmstubsTEPHI_[seedindex].vmstubmem.push_back(tmp); + if (!isTripletSeed) { + tmp->resize(settings_.NLONGVMBINS() * settings_.nvmte(1, iseed)); + vmstubsTEPHI_[seedindex].vmstubmem[0].push_back(tmp); + } else { + vmstubsTEPHI_[seedindex].vmstubmem[(vmbin - 1) & (settings_.nvmte(inner, iseed) - 1)].push_back(tmp); + } } else if (memory->getName().substr(3, 2) == "ME") { 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!"; @@ -241,6 +313,33 @@ void VMRouterCM::execute(unsigned int) { assert(melut >= 0); + // The following indices are calculated in the same way as in the old + // VMRouter and are only used for the triplet seeds. + int indexzOld = + (((1 << (stub->z().nbits() - 1)) + stub->z().value()) >> (stub->z().nbits() - nbitszfinebintable_)); + int indexrOld = -1; + if (layerdisk_ > (N_LAYER - 1)) { + if (negdisk) { + indexzOld = (1 << nbitszfinebintable_) - indexzOld; + } + indexrOld = stub->r().value(); + if (stub->isPSmodule()) { + indexrOld = stub->r().value() >> (stub->r().nbits() - nbitsrfinebintable_); + } + } else { + //Take the top nbitsfinebintable_ bits of the z coordinate. The & is to handle the negative z values. + indexrOld = (((1 << (stub->r().nbits() - 1)) + stub->r().value()) >> (stub->r().nbits() - nbitsrfinebintable_)); + } + + assert(indexzOld >= 0); + assert(indexrOld >= 0); + assert(indexzOld < (1 << nbitszfinebintable_)); + assert(indexrOld < (1 << nbitsrfinebintable_)); + + int melutOld = meTableOld_.lookup((indexzOld << nbitsrfinebintable_) + indexrOld); + + assert(melutOld >= 0); + int vmbin = melut >> NFINERZBITS; if (negdisk) vmbin += (1 << NFINERZBITS); @@ -258,26 +357,67 @@ 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(); - //Fill the TE VM memories - if (layerdisk_ >= N_LAYER && (!stub->isPSmodule())) - continue; + 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); + } for (auto& ivmstubTEPHI : vmstubsTEPHI_) { unsigned int iseed = ivmstubTEPHI.seednumber; - unsigned int lutwidth = settings_.lutwidthtab(1, iseed); + + // This flag is used to replicate the behavior of the old VMRouter for + // the case of the triplet seeds. + const bool isTripletSeed = (iseed >= L2L3L4); + + if (!isTripletSeed && layerdisk_ >= N_LAYER && (!stub->isPSmodule())) + continue; + unsigned int inner = (!isTripletSeed ? 1 : ivmstubTEPHI.stubposition); + unsigned int lutwidth = settings_.lutwidthtab(inner, iseed); + if (settings_.extended()) { + lutwidth = settings_.lutwidthtabextended(inner, iseed); + } int lutval = -999; - if (layerdisk_ < N_LAYER) { - lutval = melut; + if (inner > 0) { + if (layerdisk_ < N_LAYER) { + lutval = (!isTripletSeed ? melut : melutOld); + } else { + if (inner == 2 && iseed == Seed::L2L3D1) { + lutval = 0; + if (stub->r().value() < 10) { + lutval = 8 * (1 + (stub->r().value() >> 2)); + } else { + if (stub->r().value() < settings_.rmindiskl3overlapvm() / settings_.kr()) { + lutval = -1; + } + } + } else { + lutval = (!isTripletSeed ? diskTable_.lookup((indexz << nbitsrfinebintable_) + indexr) + : diskTableOld_.lookup((indexzOld << nbitsrfinebintable_) + indexrOld)); + if (lutval == 0) + continue; + } + } + if (lutval == -1) + continue; } else { - lutval = diskTable_.lookup((indexz << nbitsrfinebintable_) + indexr); - if (lutval == 0) { + if (iseed < Seed::L1D1 || iseed > Seed::L2D1) { + lutval = innerTable_.lookup((indexzOld << nbitsrfinebintable_) + indexrOld); + } else { + lutval = innerOverlapTable_.lookup((indexzOld << nbitsrfinebintable_) + indexrOld); + } + if (lutval == -1) continue; + if (settings_.extended() && + (iseed == Seed::L3L4 || iseed == Seed::L5L6 || iseed == Seed::D1D2 || iseed == Seed::L2L3D1)) { + int lutval2 = innerThirdTable_.lookup((indexzOld << nbitsrfinebintable_) + indexrOld); + if (lutval2 != -1) { + const auto& lutshift = innerTable_.nbits(); // should be same for all inner tables + lutval += (lutval2 << lutshift); + } } } @@ -289,28 +429,40 @@ void VMRouterCM::execute(unsigned int) { continue; unsigned int ivmte = - iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmte(1, iseed)), - settings_.nbitsvmte(1, iseed)); - - int bin = binlookup.value() / 8; - unsigned int tmp = binlookup.value() & 7; //three bits in outer layers - this could be coded cleaner... - binlookup.set(tmp, 3, true, __LINE__, __FILE__); + iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmte(inner, iseed)), + settings_.nbitsvmte(inner, iseed)); + + int bin = -1; + if (inner != 0) { + bin = binlookup.value() >> settings_.NLONGVMBITS(); + unsigned int tmp = binlookup.value() & (settings_.NLONGVMBINS() - 1); //three bits in outer layers + binlookup.set(tmp, settings_.NLONGVMBITS(), true, __LINE__, __FILE__); + } - FPGAWord finephi = stub->iphivmFineBins(settings_.nphireg(1, iseed), settings_.nfinephi(1, iseed)); + FPGAWord finephi = stub->iphivmFineBins(settings_.nphireg(inner, iseed), settings_.nfinephi(inner, iseed)); VMStubTE tmpstub(stub, finephi, stub->bend(), binlookup, allStubIndex); - unsigned int nmem = ivmstubTEPHI.vmstubmem.size(); + unsigned int nmem = ivmstubTEPHI.vmstubmem[!isTripletSeed ? 0 : ivmte].size(); assert(nmem > 0); for (unsigned int l = 0; l < nmem; l++) { if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " try adding stub to " << ivmstubTEPHI.vmstubmem[l]->getName() + edm::LogVerbatim("Tracklet") << getName() << " try adding stub to " + << ivmstubTEPHI.vmstubmem[!isTripletSeed ? 0 : ivmte][l]->getName() << " bin=" << bin << " ivmte " << ivmte << " finephi " << finephi.value() << " regions bits " << settings_.nphireg(1, iseed) << " finephibits " << settings_.nfinephi(1, iseed); } - ivmstubTEPHI.vmstubmem[l]->addVMStub(tmpstub, ivmte * settings_.NLONGVMBINS() + bin); + if (!isTripletSeed) + ivmstubTEPHI.vmstubmem[0][l]->addVMStub(tmpstub, bin, ivmte); + else { + if (inner == 0) { + ivmstubTEPHI.vmstubmem[ivmte][l]->addVMStub(tmpstub); + } else { + ivmstubTEPHI.vmstubmem[ivmte][l]->addVMStub(tmpstub, bin, 0, false); + } + } } } } diff --git a/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc b/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc index 77f0a9437840b..8de1d3c01d225 100644 --- a/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc +++ b/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc @@ -52,20 +52,20 @@ VMStubsTEMemory::VMStubsTEMemory(string name, Settings const& settings) stubsbinnedvm_.resize(settings_.NLONGVMBINS()); } -bool VMStubsTEMemory::addVMStub(VMStubTE vmstub, int bin) { +bool VMStubsTEMemory::addVMStub(VMStubTE vmstub, int bin, int ivmte, bool combined) { //If the pt of the stub is consistent with the allowed pt of tracklets //in that can be formed in this VM and the other VM used in the TE. - if (settings_.combined()) { + if (settings_.combined() && combined) { if (disk_ > 0) { assert(vmstub.stub()->isPSmodule()); } bool negdisk = vmstub.stub()->disk().value() < 0.0; if (negdisk) bin += 4; - assert(bin < (int)stubsbinnedvm_.size()); - if (stubsbinnedvm_[bin].size() < N_VMSTUBSMAX) { - stubsbinnedvm_[bin].push_back(vmstub); + assert(ivmte * settings_.NLONGVMBINS() + bin < stubsbinnedvm_.size()); + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() < N_VMSTUBSMAX) { + stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].push_back(vmstub); stubsvm_.push_back(vmstub); } return true; @@ -92,22 +92,22 @@ bool VMStubsTEMemory::addVMStub(VMStubTE vmstub, int bin) { assert(bin < 4); if (negdisk) bin += 4; - if (stubsbinnedvm_[bin].size() >= settings_.maxStubsPerBin()) + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() >= settings_.maxStubsPerBin()) return false; - stubsbinnedvm_[bin].push_back(vmstub); + stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].push_back(vmstub); if (settings_.debugTracklet()) edm::LogVerbatim("Tracklet") << getName() << " Stub in disk = " << disk_ << " in bin = " << bin; } else if (layer_ == 2) { - if (stubsbinnedvm_[bin].size() >= settings_.maxStubsPerBin()) + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() >= settings_.maxStubsPerBin()) return false; - stubsbinnedvm_[bin].push_back(vmstub); + stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].push_back(vmstub); } } else { if (vmstub.stub()->layerdisk() < N_LAYER) { if (!isinner_) { - if (stubsbinnedvm_[bin].size() >= settings_.maxStubsPerBin()) + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() >= settings_.maxStubsPerBin()) return false; - stubsbinnedvm_[bin].push_back(vmstub); + stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].push_back(vmstub); } } else { @@ -115,15 +115,15 @@ bool VMStubsTEMemory::addVMStub(VMStubTE vmstub, int bin) { assert(bin < 4); if (negdisk) bin += 4; - if (stubsbinnedvm_[bin].size() >= settings_.maxStubsPerBin()) + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() >= settings_.maxStubsPerBin()) return false; - stubsbinnedvm_[bin].push_back(vmstub); + stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].push_back(vmstub); } } } if (settings_.debugTracklet()) edm::LogVerbatim("Tracklet") << "Adding stubs to " << getName(); - if (stubsbinnedvm_[bin].size() >= settings_.maxStubsPerBin()) + if (stubsbinnedvm_[ivmte * settings_.NLONGVMBINS() + bin].size() >= settings_.maxStubsPerBin()) return false; stubsvm_.push_back(vmstub); return true; 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.cc b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc index 899455516b5d9..789a10020b25b 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc @@ -1022,7 +1022,7 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup v_jets_vhighpt.push_back(0); } // end loop over genjets - } // end isValid + } // end isValid } // end TrackingInJets diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py index 4bfcac8f57fa4..232ae8009f88f 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py @@ -51,7 +51,9 @@ process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') from Configuration.AlCa.GlobalTag import GlobalTag -process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +# Change needed to run with D98 geometry in recent CMSSW versions. +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') +process.GlobalTag = GlobalTag(process.GlobalTag, '133X_mcRun4_realistic_v1', '') ############################################################ @@ -171,11 +173,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 +198,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_;