diff --git a/DataFormats/L1Trigger/interface/TkJetWord.h b/DataFormats/L1Trigger/interface/TkJetWord.h index 25a6f87528071..0ccc974552dc9 100644 --- a/DataFormats/L1Trigger/interface/TkJetWord.h +++ b/DataFormats/L1Trigger/interface/TkJetWord.h @@ -20,9 +20,10 @@ namespace l1t { public: // ----------constants, enums and typedefs --------- static constexpr double MAX_Z0 = 30.; - static constexpr double MAX_ETA = 8.; + static constexpr double MAX_ETA = 2 * M_PI; enum TkJetBitWidths { + kValidSize = 1, kPtSize = 16, kPtMagSize = 11, kGlbEtaSize = 14, @@ -31,13 +32,15 @@ namespace l1t { kNtSize = 5, kXtSize = 4, kDispFlagSize = 1, - kUnassignedSize = 65, - kTkJetWordSize = - kPtSize + kGlbEtaSize + kGlbPhiSize + kZ0Size + kNtSize + kXtSize + kDispFlagSize + kUnassignedSize, + kUnassignedSize = 64, + kTkJetWordSize = kValidSize + kPtSize + kGlbEtaSize + kGlbPhiSize + kZ0Size + kNtSize + kXtSize + kDispFlagSize + + kUnassignedSize, }; enum TkJetBitLocations { - kPtLSB = 0, + kValidLSB = 0, + kValidMSB = kValidLSB + TkJetBitWidths::kValidSize - 1, + kPtLSB = kValidMSB + 1, kPtMSB = kPtLSB + TkJetBitWidths::kPtSize - 1, kGlbPhiLSB = kPtMSB + 1, kGlbPhiMSB = kGlbPhiLSB + TkJetBitWidths::kGlbPhiSize - 1, @@ -55,6 +58,7 @@ namespace l1t { kUnassignedMSB = kUnassignedLSB + TkJetBitWidths::kUnassignedSize - 1, }; + typedef ap_uint tkjetvalid_t; typedef ap_ufixed pt_t; typedef ap_int glbeta_t; typedef ap_int glbphi_t; @@ -69,7 +73,8 @@ namespace l1t { public: // ----------Constructors -------------------------- TkJetWord() {} - TkJetWord(pt_t pt, + TkJetWord(tkjetvalid_t valid, + pt_t pt, glbeta_t eta, glbphi_t phi, z0_t z0, @@ -91,6 +96,11 @@ namespace l1t { // ----------member functions (getters) ------------ // These functions return arbitarary precision words (lists of bits) for each quantity + tkjetvalid_t validWord() const { + tkjetvalid_t ret; + ret.V = tkJetWord()(TkJetBitLocations::kValidMSB, TkJetBitLocations::kValidLSB); + return ret; + } pt_t ptWord() const { pt_t ret; ret.V = tkJetWord()(TkJetBitLocations::kPtMSB, TkJetBitLocations::kPtLSB); @@ -134,6 +144,7 @@ namespace l1t { // These functions return the packed bits in integer format for each quantity // Signed quantities have the sign enconded in the left-most bit. + unsigned int validBits() const { return validWord().to_uint(); } unsigned int ptBits() const { return ptWord().range().to_uint(); } unsigned int glbEtaBits() const { return glbEtaWord().to_uint(); } unsigned int glbPhiBits() const { return glbPhiWord().to_uint(); } @@ -145,10 +156,11 @@ namespace l1t { // These functions return the unpacked and converted values // These functions return real numbers converted from the digitized quantities by unpacking the 64-bit vertex word + bool valid() const { return validWord().to_bool(); } float pt() const { return ptWord().to_float(); } float glbeta() const { return unpackSignedValue( - glbEtaWord(), TkJetBitWidths::kGlbEtaSize, (MAX_ETA) / (1 << TkJetBitWidths::kGlbEtaSize)); + glbEtaWord(), TkJetBitWidths::kGlbEtaSize, (2 * MAX_ETA) / (1 << TkJetBitWidths::kGlbEtaSize)); } float glbphi() const { return unpackSignedValue( @@ -163,7 +175,8 @@ namespace l1t { unsigned int unassigned() const { return unassignedWord().to_uint(); } // ----------member functions (setters) ------------ - void setTkJetWord(pt_t pt, + void setTkJetWord(tkjetvalid_t valid, + pt_t pt, glbeta_t eta, glbphi_t phi, z0_t z0, diff --git a/DataFormats/L1Trigger/src/TkJetWord.cc b/DataFormats/L1Trigger/src/TkJetWord.cc index 87897de7b07b0..b9b45c0a80e69 100644 --- a/DataFormats/L1Trigger/src/TkJetWord.cc +++ b/DataFormats/L1Trigger/src/TkJetWord.cc @@ -4,7 +4,8 @@ #include "DataFormats/L1Trigger/interface/TkJetWord.h" namespace l1t { - TkJetWord::TkJetWord(pt_t pt, + TkJetWord::TkJetWord(tkjetvalid_t valid, + pt_t pt, glbeta_t eta, glbphi_t phi, z0_t z0, @@ -12,10 +13,11 @@ namespace l1t { nx_t nx, dispflag_t dispflag, tkjetunassigned_t unassigned) { - setTkJetWord(pt, eta, phi, z0, nt, nx, dispflag, unassigned); + setTkJetWord(valid, pt, eta, phi, z0, nt, nx, dispflag, unassigned); } - void TkJetWord::setTkJetWord(pt_t pt, + void TkJetWord::setTkJetWord(tkjetvalid_t valid, + pt_t pt, glbeta_t eta, glbphi_t phi, z0_t z0, @@ -25,6 +27,10 @@ namespace l1t { tkjetunassigned_t unassigned) { // pack the TkJet word unsigned int offset = 0; + for (unsigned int b = offset; b < (offset + TkJetBitWidths::kValidSize); b++) { + tkJetWord_.set(b, valid[b - offset]); + } + offset += TkJetBitWidths::kValidSize; for (unsigned int b = offset; b < (offset + TkJetBitWidths::kPtSize); b++) { tkJetWord_.set(b, pt[b - offset]); } @@ -50,7 +56,7 @@ namespace l1t { } offset += TkJetBitWidths::kXtSize; for (unsigned int b = offset; b < (offset + TkJetBitWidths::kDispFlagSize); b++) { - tkJetWord_.set(b, nx[b - offset]); + tkJetWord_.set(b, dispflag[b - offset]); } offset += TkJetBitWidths::kDispFlagSize; for (unsigned int b = offset; b < (offset + TkJetBitWidths::kUnassignedSize); b++) { diff --git a/L1Trigger/DemonstratorTools/src/codecs_tkjets.cc b/L1Trigger/DemonstratorTools/src/codecs_tkjets.cc index 069f23f5107da..89a8030990757 100644 --- a/L1Trigger/DemonstratorTools/src/codecs_tkjets.cc +++ b/L1Trigger/DemonstratorTools/src/codecs_tkjets.cc @@ -29,12 +29,9 @@ namespace l1t::demo::codecs { std::vector tkJets; for (size_t f = 0; f < frames.size(); f += 2) { - // There is no valid bit in the definition right now. - // Uncomment the next two lines when this is available. - //if (not x.test(TkJetWord::kValidLSB)) - // break; - TkJetWord j( + TkJetWord::tkjetvalid_t( + frames[f](TkJetWord::TkJetBitLocations::kValidMSB, TkJetWord::TkJetBitLocations::kValidLSB)), TkJetWord::pt_t(frames[f](TkJetWord::TkJetBitLocations::kPtMSB, TkJetWord::TkJetBitLocations::kPtLSB)), TkJetWord::glbphi_t( frames[f](TkJetWord::TkJetBitLocations::kGlbPhiMSB, TkJetWord::TkJetBitLocations::kGlbPhiLSB)), @@ -47,6 +44,12 @@ namespace l1t::demo::codecs { frames[f](TkJetWord::TkJetBitLocations::kDispFlagMSB, TkJetWord::TkJetBitLocations::kDispFlagLSB)), TkJetWord::tkjetunassigned_t( frames[f](TkJetWord::TkJetBitLocations::kUnassignedMSB, TkJetWord::TkJetBitLocations::kUnassignedLSB))); + + // There is no valid bit in the definition right now. + // Uncomment the next two lines when this is available. + if (not j.valid()) + break; + tkJets.push_back(j); } diff --git a/L1Trigger/DemonstratorTools/test/gtt/FirmwareGeometryFile.vh b/L1Trigger/DemonstratorTools/test/gtt/FirmwareGeometryFile.vh new file mode 100644 index 0000000000000..f1b4ad35f36c4 --- /dev/null +++ b/L1Trigger/DemonstratorTools/test/gtt/FirmwareGeometryFile.vh @@ -0,0 +1,30 @@ +parameter eta_bin_0 = 14'b11010001001010; +parameter eta_bin_1 = 14'b11010101001110; +parameter eta_bin_2 = 14'b11011001010011; +parameter eta_bin_3 = 14'b11011101011000; +parameter eta_bin_4 = 14'b11100001011100; +parameter eta_bin_5 = 14'b11100101100001; +parameter eta_bin_6 = 14'b11101001100110; +parameter eta_bin_7 = 14'b11101101101011; +parameter eta_bin_8 = 14'b11110001101111; +parameter eta_bin_9 = 14'b11110101110100; +parameter eta_bin_10 = 14'b11111001111001; +parameter eta_bin_11 = 14'b11111101111101; +parameter eta_bin_12 = 14'b00000010000001; +parameter eta_bin_13 = 14'b00000110000110; +parameter eta_bin_14 = 14'b00001010001010; +parameter eta_bin_15 = 14'b00001110001111; +parameter eta_bin_16 = 14'b00010010010100; +parameter eta_bin_17 = 14'b00010110011001; +parameter eta_bin_18 = 14'b00011010011101; +parameter eta_bin_19 = 14'b00011110100010; +parameter eta_bin_20 = 14'b00100010100111; +parameter eta_bin_21 = 14'b00100110101011; +parameter eta_bin_22 = 14'b00101010110000; +parameter eta_bin_23 = 14'b00101110110101; +parameter LowJetTracks_FakeReduction = 4'b0010; +parameter LowJetpT_FakeReduction = 16'b0000011001000000; +parameter HighJetTracks_FakeReduction = 4'b0011; +parameter HighJetpT_FakeReduction = 16'b0000110010000000; +parameter MinJetTracks = 4'b0001; +parameter MinJetpT = 16'b0000000101000000; diff --git a/L1Trigger/DemonstratorTools/test/gtt/createFirmwareInputFiles_cfg.py b/L1Trigger/DemonstratorTools/test/gtt/createFirmwareInputFiles_cfg.py index 0d8b242cfca9a..5a2378e71bddb 100644 --- a/L1Trigger/DemonstratorTools/test/gtt/createFirmwareInputFiles_cfg.py +++ b/L1Trigger/DemonstratorTools/test/gtt/createFirmwareInputFiles_cfg.py @@ -67,8 +67,8 @@ process = cms.Process("GTTFileWriter") -process.load('Configuration.Geometry.GeometryExtendedRun4D88Reco_cff') -process.load('Configuration.Geometry.GeometryExtendedRun4D88_cff') +process.load('Configuration.Geometry.GeometryExtendedRun4D110Reco_cff') +process.load('Configuration.Geometry.GeometryExtendedRun4D110_cff') process.load('Configuration.StandardSequences.MagneticField_cff') process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') from Configuration.AlCa.GlobalTag import GlobalTag @@ -141,6 +141,7 @@ #Disable internal track selection process.l1tTrackJetsEmulation.trk_zMax = cms.double(20.46912512) # maximum track z from TrackWord +process.l1tTrackJetsEmulation.export_binmap = cms.bool(True) # creates Jet Finding firmware geometry file if options.debug: process.MessageLogger.cerr.INFO.limit = cms.untracked.int32(1000000000) diff --git a/L1Trigger/L1TTrackMatch/plugins/L1TrackJetClustering.h b/L1Trigger/L1TTrackMatch/plugins/L1TrackJetClustering.h index d917656740575..fdb3d81a66e5d 100644 --- a/L1Trigger/L1TTrackMatch/plugins/L1TrackJetClustering.h +++ b/L1Trigger/L1TTrackMatch/plugins/L1TrackJetClustering.h @@ -200,6 +200,60 @@ namespace l1ttrackjet { return phi_bin_; } + //Geometry writeout for firmware + inline void FirmwareGeometryWriteOut(std::vector eta_bin_centers, + std::vector phi_bin_centers, + int etaBins_, + int lowpTJetMinTrackMultiplicity_, + float lowpTJetThreshold_, + int highpTJetMinTrackMultiplicity_, + float highpTJetThreshold_, + int minTrkJetTrackMultiplicity_, + float minTrkJetpT_) { + ofstream FirmwareGeometryFile; + FirmwareGeometryFile.open("./FirmwareGeometryFile.vh"); + + //This loop converts eta bin centers of type glbeta_intern into unsigned ints that can be read + //out as bit words to the geometry file + for (int i = 0; i < etaBins_; i++) { + unsigned int EtaBitInt = DoubleToBit( + eta_bin_centers[i], l1t::TkJetWord::TkJetBitWidths::kGlbEtaSize, l1t::TkJetWord::MAX_ETA * pow(2, -13)); + std::bitset EtaBitWord(EtaBitInt); + FirmwareGeometryFile << "parameter eta_bin_" << i << " = 14'b" << EtaBitWord << ";" << std::endl; + } + + //This code converts the int type track multiplicity values into bitset type to read out + std::bitset<4> lowpTJetMinTrackMultiplicity_bit(lowpTJetMinTrackMultiplicity_); + std::bitset<4> highpTJetMinTrackMultiplicity_bit(highpTJetMinTrackMultiplicity_); + std::bitset<4> minTrkJetTrackMultiplicity_bit(minTrkJetTrackMultiplicity_); + + //Here we convert the float type pT cuts into pt_intern type for conversion into bitset type + pt_intern lowpTJetThreshold_converted(lowpTJetThreshold_); + pt_intern highpTJetThreshold_converted(highpTJetThreshold_); + pt_intern minTrkJetpT_converted(minTrkJetpT_); + + //Here we turn the converted pT cut values into bitset type + std::bitset lowpTJetThreshold_bit( + lowpTJetThreshold_converted.range().to_uint()); + std::bitset highpTJetThreshold_bit( + highpTJetThreshold_converted.range().to_uint()); + std::bitset minTrkJetpT_bit(minTrkJetpT_converted.range().to_uint()); + + //Export the bit words to the geometry file + FirmwareGeometryFile << "parameter LowJetTracks_FakeReduction = 4'b" << lowpTJetMinTrackMultiplicity_bit << ";" + << std::endl; + FirmwareGeometryFile << "parameter LowJetpT_FakeReduction = 16'b" << lowpTJetThreshold_bit << ";" << std::endl; + + FirmwareGeometryFile << "parameter HighJetTracks_FakeReduction = 4'b" << highpTJetMinTrackMultiplicity_bit << ";" + << std::endl; + FirmwareGeometryFile << "parameter HighJetpT_FakeReduction = 16'b" << highpTJetThreshold_bit << ";" << std::endl; + + FirmwareGeometryFile << "parameter MinJetTracks = 4'b" << minTrkJetTrackMultiplicity_bit << ";" << std::endl; + FirmwareGeometryFile << "parameter MinJetpT = 16'b" << minTrkJetpT_bit << ";" << std::endl; + + FirmwareGeometryFile.close(); + } + // L1 clustering (in eta) template inline std::vector L1_clustering(T *phislice, int etaBins_, Eta etaStep_) { diff --git a/L1Trigger/L1TTrackMatch/plugins/L1TrackJetEmulatorProducer.cc b/L1Trigger/L1TTrackMatch/plugins/L1TrackJetEmulatorProducer.cc index e4194de7a8090..3a06fb6ea9762 100644 --- a/L1Trigger/L1TTrackMatch/plugins/L1TrackJetEmulatorProducer.cc +++ b/L1Trigger/L1TTrackMatch/plugins/L1TrackJetEmulatorProducer.cc @@ -4,6 +4,7 @@ // Rewritting/Improvements: George Karathanasis, // georgios.karathanasis@cern.ch, CU Boulder // Claire Savard (claire.savard@colorado.edu) +// Connor Houghton (cch109@physics.rutgers.edu) // // Created: Wed, 01 Aug 2018 14:01:41 GMT // Latest update: Nov 2023 (by CS) @@ -75,10 +76,12 @@ class L1TrackJetEmulatorProducer : public stream::EDProducer<> { const int etaBins_; const int phiBins_; const double minTrkJetpT_; + const int minTrkJetTrackMultiplicity_; const bool displaced_; const float d0CutNStubs4_; const float d0CutNStubs5_; const int nDisplacedTracks_; + bool export_binmap_; float zStep_; glbeta_intern etaStep_; @@ -102,10 +105,12 @@ L1TrackJetEmulatorProducer::L1TrackJetEmulatorProducer(const ParameterSet &iConf etaBins_(iConfig.getParameter("etaBins")), phiBins_(iConfig.getParameter("phiBins")), minTrkJetpT_(iConfig.getParameter("minTrkJetpT")), + minTrkJetTrackMultiplicity_(iConfig.getParameter("minTrkJetTrackMultiplicity")), displaced_(iConfig.getParameter("displaced")), d0CutNStubs4_(iConfig.getParameter("d0_cutNStubs4")), d0CutNStubs5_(iConfig.getParameter("d0_cutNStubs5")), nDisplacedTracks_(iConfig.getParameter("nDisplacedTracks")), + export_binmap_(iConfig.getParameter("export_binmap")), trackToken_(consumes(iConfig.getParameter("L1TrackInputTag"))) { zStep_ = 2.0 * trkZMax_ / (zBins_ + 1); // added +1 in denom etaStep_ = glbeta_intern(2.0 * trkEtaMax_ / etaBins_); //etaStep is the width of an etabin @@ -186,6 +191,34 @@ void L1TrackJetEmulatorProducer::produce(Event &iEvent, const EventSetup &iSetup } } + // Extract geometry information for firmware if flag in python config file set to True + if (export_binmap_) { + // Fill vectors with bin centers + std::vector eta_bin_centers; + std::vector phi_bin_centers; + phi_bin_centers.reserve(phiBins_); + for (int i = 0; i < phiBins_; ++i) { + phi_bin_centers.push_back(epbins_default[i][0].phi); + } + eta_bin_centers.reserve(etaBins_); + for (int i = 0; i < etaBins_; ++i) { + eta_bin_centers.push_back(epbins_default[0][i].eta); + } + + // Call writeout function defined in L1TrackJetClustering.h + l1ttrackjet::FirmwareGeometryWriteOut(eta_bin_centers, + phi_bin_centers, + etaBins_, + lowpTJetMinTrackMultiplicity_, + lowpTJetThreshold_, + highpTJetMinTrackMultiplicity_, + highpTJetThreshold_, + minTrkJetTrackMultiplicity_, + minTrkJetpT_); + + export_binmap_ = false; //Setting to false so that geometry file is written once + } + //Begin Firmware-style clustering // logic: loop over z bins find tracks in this bin and arrange them in a 2D eta-phi matrix for (unsigned int zbin = 0; zbin < zmins.size(); ++zbin) { @@ -227,10 +260,10 @@ void L1TrackJetEmulatorProducer::produce(Event &iEvent, const EventSetup &iSetup // Eta bin int j = eta_bin_firmwareStyle(L1TrkPtrs_[k]->getTanlWord()); //Function defined in L1TrackJetClustering.h - //This is a quick fix to eta going outside of scope - also including protection against phi going outside - //of scope as well. The eta index, j, cannot be less than zero or greater than 23 (the number of eta bins - //minus one). The phi index, i, cannot be less than zero or greater than 26 (the number of phi bins - //minus one). + //This prevents eta or phi from going outside of scope The eta index, j, cannot be less than zero + //or greater than 23 (the number of eta bins minus one). The phi index, i, cannot be less than + //zero or greater than 26 (the number of phi bins minus one). + if ((j < 0) || (j > (etaBins_ - 1)) || (i < 0) || (i > (phiBins_ - 1))) continue; @@ -285,9 +318,12 @@ void L1TrackJetEmulatorProducer::produce(Event &iEvent, const EventSetup &iSetup vector> L1TrackAssocJet; for (unsigned int j = 0; j < mzb.clusters.size(); ++j) { - l1t::TkJetWord::glbeta_t jetEta = DoubleToBit(double(mzb.clusters[j].eta), - TkJetWord::TkJetBitWidths::kGlbEtaSize, - TkJetWord::MAX_ETA / (1 << TkJetWord::TkJetBitWidths::kGlbEtaSize)); + l1t::TkJetWord::tkjetvalid_t valid = 1; + l1t::TkJetWord::glbeta_t jetEta = + DoubleToBit(double(mzb.clusters[j].eta), + TkJetWord::TkJetBitWidths::kGlbEtaSize, + 2 * TkJetWord::MAX_ETA / (1 << TkJetWord::TkJetBitWidths::kGlbEtaSize)); + // TkJetWord::MAX_ETA / (1 << TkJetWord::TkJetBitWidths::kGlbEtaSize)); l1t::TkJetWord::glbphi_t jetPhi = DoubleToBit( BitToDouble(mzb.clusters[j].phi, TTTrack_TrackWord::TrackBitWidths::kPhiSize + 4, TTTrack_TrackWord::stepPhi0), TkJetWord::TkJetBitWidths::kGlbPhiSize, @@ -305,12 +341,21 @@ void L1TrackJetEmulatorProducer::produce(Event &iEvent, const EventSetup &iSetup for (unsigned int itrk = 0; itrk < mzb.clusters[j].trackidx.size(); itrk++) L1TrackAssocJet.push_back(L1TrkPtrs_[mzb.clusters[j].trackidx[itrk]]); - l1t::TkJetWord trkJet(jetPt, jetEta, jetPhi, jetZ0, total_ntracks, total_disptracks, dispflag, unassigned); + l1t::TkJetWord trkJet(valid, jetPt, jetEta, jetPhi, jetZ0, total_ntracks, total_disptracks, dispflag, unassigned); - L1TrackJetContainer->push_back(trkJet); + if ((jetPt > minTrkJetpT_) && (total_ntracks >= minTrkJetTrackMultiplicity_)) { + L1TrackJetContainer->push_back(trkJet); + } } - std::sort(L1TrackJetContainer->begin(), L1TrackJetContainer->end(), [](auto &a, auto &b) { return a.pt() > b.pt(); }); + // Sort by eta because this is how its done in FW + std::sort(L1TrackJetContainer->begin(), L1TrackJetContainer->end(), [](auto &a, auto &b) { + return a.glbphi() < b.glbphi(); + }); + std::sort(L1TrackJetContainer->begin(), L1TrackJetContainer->end(), [](auto &a, auto &b) { + return a.glbeta() < b.glbeta(); + }); + if (displaced_) iEvent.put(std::move(L1TrackJetContainer), "L1TrackJetsExtended"); else @@ -326,6 +371,7 @@ void L1TrackJetEmulatorProducer::fillDescriptions(ConfigurationDescriptions &des desc.add("trk_ptMax", 200.0); desc.add("trk_etaMax", 2.4); desc.add("minTrkJetpT", -1.0); + desc.add("minTrkJetTrackMultiplicity", 1); desc.add("etaBins", 24); desc.add("phiBins", 27); desc.add("zBins", 1); @@ -337,6 +383,7 @@ void L1TrackJetEmulatorProducer::fillDescriptions(ConfigurationDescriptions &des desc.add("highpTJetThreshold", 100.0); desc.add("displaced", false); desc.add("nDisplacedTracks", 2); + desc.add("export_binmap", false); descriptions.add("l1tTrackJetsEmulator", desc); } diff --git a/L1Trigger/L1TTrackMatch/python/l1tTrackJetsEmulation_cfi.py b/L1Trigger/L1TTrackMatch/python/l1tTrackJetsEmulation_cfi.py index f48ff4faaa28a..9d6551531180d 100644 --- a/L1Trigger/L1TTrackMatch/python/l1tTrackJetsEmulation_cfi.py +++ b/L1Trigger/L1TTrackMatch/python/l1tTrackJetsEmulation_cfi.py @@ -5,7 +5,8 @@ trk_zMax = cms.double (15.) , # maximum track z trk_ptMax = cms.double(200.), # maximumum track pT before saturation [GeV] trk_etaMax = cms.double(2.4), # maximum track eta - minTrkJetpT=cms.double(-1.), # minimum track pt to be considered for track jet + minTrkJetpT=cms.double(10.0), # minimum track pt to be considered for track jet (set to 10 for congruence with FW) + minTrkJetTrackMultiplicity=cms.int32(1), # minimum number of tracks in a jet etaBins=cms.int32(24), phiBins=cms.int32(27), zBins=cms.int32(1), @@ -16,7 +17,8 @@ highpTJetMinTrackMultiplicity=cms.int32(3), highpTJetThreshold=cms.double(100.), displaced=cms.bool(False), #Flag for displaced tracks - nDisplacedTracks=cms.int32(2) #Number of displaced tracks required per jet + nDisplacedTracks=cms.int32(2), #Number of displaced tracks required per jet + export_binmap=cms.bool(False) #Flag to create geometry file containing bin centers and jet cuts to FW ) l1tTrackJetsExtendedEmulation = l1tTrackJetsEmulation.clone(