File indexing completed on 2024-05-15 22:44:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include "DataFormats/L1TCorrelator/interface/TkTriplet.h"
0014 #include "DataFormats/L1TCorrelator/interface/TkTripletFwd.h"
0015 #include "DataFormats/L1Trigger/interface/TkTripletWord.h"
0016 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0017 #include "DataFormats/L1TrackTrigger/interface/TTTrack.h"
0018 #include "DataFormats/L1TrackTrigger/interface/TTTrack_TrackWord.h"
0019 #include "DataFormats/L1Trigger/interface/VertexWord.h"
0020 #include "DataFormats/Math/interface/LorentzVector.h"
0021
0022
0023 #include "DataFormats/Common/interface/Handle.h"
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/stream/EDProducer.h"
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/EventSetup.h"
0028 #include "FWCore/Framework/interface/MakerMacros.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "FWCore/Utilities/interface/StreamID.h"
0031 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0032 #include "DataFormats/Common/interface/Ref.h"
0033 #include "DataFormats/Common/interface/RefVector.h"
0034
0035
0036 #include "L1TrackUnpacker.h"
0037
0038
0039 #include <ap_int.h>
0040
0041 using namespace std;
0042 using namespace edm;
0043 using namespace l1t;
0044 using namespace l1trackunpacker;
0045
0046 class L1TrackTripletEmulatorProducer : public stream::EDProducer<> {
0047 public:
0048 explicit L1TrackTripletEmulatorProducer(const ParameterSet &);
0049 ~L1TrackTripletEmulatorProducer() override = default;
0050 typedef TTTrack<Ref_Phase2TrackerDigi_> L1TTTrackType;
0051 typedef vector<L1TTTrackType> L1TTTrackCollectionType;
0052 typedef edm::RefVector<L1TTTrackCollectionType> L1TTTrackRefCollectionType;
0053 static void fillDescriptions(ConfigurationDescriptions &descriptions);
0054
0055 private:
0056 void produce(Event &, const EventSetup &) override;
0057
0058
0059
0060 std::vector<edm::Ptr<L1TTTrackType>> L1TrkPtrs_;
0061 vector<int> tdtrk_;
0062 const double trk1_pt_;
0063 const double trk1_eta_;
0064 const double trk1_mva_;
0065 const double trk1_nstub_;
0066 const double trk1_dz_;
0067 const double trk1_mass_;
0068 const double trk2_pt_;
0069 const double trk2_eta_;
0070 const double trk2_mva_;
0071 const double trk2_nstub_;
0072 const double trk2_dz_;
0073 const double trk2_mass_;
0074 const double trk3_pt_;
0075 const double trk3_eta_;
0076 const double trk3_mva_;
0077 const double trk3_nstub_;
0078 const double trk3_dz_;
0079 const double trk3_mass_;
0080 const bool displaced_;
0081 const double triplet_massMin_;
0082 const double triplet_massMax_;
0083 const double triplet_ptMin_;
0084 const double triplet_ptMax_;
0085 const double triplet_etaMin_;
0086 const double triplet_etaMax_;
0087 const int triplet_abscharge_;
0088 const double triplet_massOver_;
0089 const double pair1_massMin_;
0090 const double pair1_massMax_;
0091 const double pair2_massMin_;
0092 const double pair2_massMax_;
0093 const double pair1_dzMin_;
0094 const double pair1_dzMax_;
0095 const double pair2_dzMin_;
0096 const double pair2_dzMax_;
0097 const bool use_float_track_precision_;
0098
0099 struct L1track {
0100 double Pt;
0101 double Eta;
0102 double Phi;
0103 int Charge;
0104 double MVA;
0105 int Nstubs;
0106 double Z0;
0107 unsigned int Index;
0108 };
0109
0110 bool TrackSelector(L1track &, double, double, double, double, double, int);
0111 double FloatPtFromBits(const L1TTTrackType &);
0112 double FloatEtaFromBits(const L1TTTrackType &);
0113 double FloatPhiFromBits(const L1TTTrackType &);
0114 double FloatZ0FromBits(const L1TTTrackType &);
0115
0116 const EDGetTokenT<L1TTTrackRefCollectionType> trackToken_;
0117 const EDGetTokenT<l1t::VertexWordCollection> PVtxToken_;
0118 };
0119
0120
0121 L1TrackTripletEmulatorProducer::L1TrackTripletEmulatorProducer(const ParameterSet &iConfig)
0122 : trk1_pt_(iConfig.getParameter<double>("trk1_ptMin")),
0123 trk1_eta_(iConfig.getParameter<double>("trk1_absEtaMax")),
0124 trk1_mva_(iConfig.getParameter<double>("trk1_mvaMin")),
0125 trk1_nstub_(iConfig.getParameter<int>("trk1_nstubMin")),
0126 trk1_dz_(iConfig.getParameter<double>("trk1_dzMax")),
0127 trk1_mass_(iConfig.getParameter<double>("trk1_mass")),
0128 trk2_pt_(iConfig.getParameter<double>("trk2_ptMin")),
0129 trk2_eta_(iConfig.getParameter<double>("trk2_absEtaMax")),
0130 trk2_mva_(iConfig.getParameter<double>("trk2_mvaMin")),
0131 trk2_nstub_(iConfig.getParameter<int>("trk2_nstubMin")),
0132 trk2_dz_(iConfig.getParameter<double>("trk2_dzMax")),
0133 trk2_mass_(iConfig.getParameter<double>("trk2_mass")),
0134 trk3_pt_(iConfig.getParameter<double>("trk3_ptMin")),
0135 trk3_eta_(iConfig.getParameter<double>("trk3_absEtaMax")),
0136 trk3_mva_(iConfig.getParameter<double>("trk3_mvaMin")),
0137 trk3_nstub_(iConfig.getParameter<int>("trk3_nstubMin")),
0138 trk3_dz_(iConfig.getParameter<double>("trk3_dzMax")),
0139 trk3_mass_(iConfig.getParameter<double>("trk3_mass")),
0140 displaced_(iConfig.getParameter<bool>("displaced")),
0141 triplet_massMin_(iConfig.getParameter<double>("triplet_massMin")),
0142 triplet_massMax_(iConfig.getParameter<double>("triplet_massMax")),
0143 triplet_ptMin_(iConfig.getParameter<double>("triplet_ptMin")),
0144 triplet_ptMax_(iConfig.getParameter<double>("triplet_ptMax")),
0145 triplet_etaMin_(iConfig.getParameter<double>("triplet_absEtaMin")),
0146 triplet_etaMax_(iConfig.getParameter<double>("triplet_absEtaMax")),
0147 triplet_abscharge_(iConfig.getParameter<int>("triplet_absCharge")),
0148 triplet_massOver_(iConfig.getParameter<double>("triplet_massOverflow")),
0149 pair1_massMin_(iConfig.getParameter<double>("pair1_massMin")),
0150 pair1_massMax_(iConfig.getParameter<double>("pair1_massMax")),
0151 pair2_massMin_(iConfig.getParameter<double>("pair2_massMin")),
0152 pair2_massMax_(iConfig.getParameter<double>("pair2_massMax")),
0153 pair1_dzMin_(iConfig.getParameter<double>("pair1_dzMin")),
0154 pair1_dzMax_(iConfig.getParameter<double>("pair1_dzMax")),
0155 pair2_dzMin_(iConfig.getParameter<double>("pair2_dzMin")),
0156 pair2_dzMax_(iConfig.getParameter<double>("pair2_dzMax")),
0157 use_float_track_precision_(iConfig.getParameter<bool>("float_precision")),
0158 trackToken_(consumes<L1TTTrackRefCollectionType>(iConfig.getParameter<InputTag>("L1TrackInputTag"))),
0159 PVtxToken_(consumes<l1t::VertexWordCollection>(iConfig.getParameter<InputTag>("L1PVertexInputTag"))) {
0160 if (displaced_) {
0161 produces<l1t::TkTripletCollection>("L1TrackTripletExtended");
0162 produces<l1t::TkTripletWordCollection>("L1TrackTripletWordExtended");
0163 } else {
0164 produces<l1t::TkTripletCollection>("L1TrackTriplet");
0165 produces<l1t::TkTripletWordCollection>("L1TrackTripletWord");
0166 }
0167 }
0168
0169 void L1TrackTripletEmulatorProducer::produce(Event &iEvent, const EventSetup &iSetup) {
0170 unique_ptr<l1t::TkTripletCollection> L1TrackTripletContainer(new l1t::TkTripletCollection);
0171 unique_ptr<l1t::TkTripletWordCollection> L1TrackTripletWordContainer(new l1t::TkTripletWordCollection);
0172
0173
0174 edm::Handle<L1TTTrackRefCollectionType> TTTrackHandle;
0175 iEvent.getByToken(trackToken_, TTTrackHandle);
0176
0177 edm::Handle<l1t::VertexWordCollection> PVtx;
0178 iEvent.getByToken(PVtxToken_, PVtx);
0179 double PVz = (PVtx->at(0)).z0();
0180
0181 std::string OutputDigisName = "L1TrackTriplet";
0182 std::string OutputWordName = "L1TrackTripletWord";
0183
0184 if (displaced_)
0185 OutputDigisName += "Extended";
0186
0187 if (TTTrackHandle->size() < 3) {
0188 iEvent.put(std::move(L1TrackTripletContainer), OutputDigisName);
0189 iEvent.put(std::move(L1TrackTripletWordContainer), OutputWordName);
0190 return;
0191 }
0192
0193
0194 L1track trk1{-99, -99, -99, -99, -99, -99, -99, 0};
0195 L1track trk2{-99, -99, -99, -99, -99, -99, -99, 0};
0196 L1track trk3{-99, -99, -99, -99, -99, -99, -99, 0};
0197
0198 int current_track_idx = -1;
0199 for (auto current_track : *TTTrackHandle) {
0200 current_track_idx += 1;
0201 double current_track_pt = 0;
0202 if (use_float_track_precision_)
0203 current_track_pt = current_track->momentum().perp();
0204 else
0205 current_track_pt = FloatPtFromBits(*current_track);
0206 if (current_track_pt < trk1.Pt)
0207 continue;
0208 trk3 = trk2;
0209 trk2 = trk1;
0210 if (use_float_track_precision_) {
0211 trk1.Pt = current_track->momentum().perp();
0212 trk1.Eta = current_track->eta();
0213 trk1.Phi = current_track->phi();
0214 trk1.Charge = (int)(current_track->rInv() / fabs(current_track->rInv()));
0215 trk1.MVA = current_track->trkMVA1();
0216 trk1.Nstubs = current_track->getStubRefs().size();
0217 trk1.Z0 = current_track->z0();
0218 trk1.Index = current_track_idx;
0219 } else {
0220 trk1.Pt = FloatPtFromBits(*current_track);
0221 trk1.Eta = FloatEtaFromBits(*current_track);
0222 trk1.Phi = FloatPhiFromBits(*current_track);
0223 trk1.Charge = (int)(current_track->rInv() / fabs(current_track->rInv()));
0224 trk1.MVA = current_track->trkMVA1();
0225 trk1.Nstubs = current_track->getStubRefs().size();
0226 trk1.Z0 = FloatZ0FromBits(*current_track);
0227 trk1.Index = current_track_idx;
0228 }
0229 }
0230
0231
0232 bool track1_pass = TrackSelector(trk1, PVz, trk1_pt_, trk1_eta_, trk1_mva_, trk1_dz_, trk1_nstub_);
0233 bool track2_pass = TrackSelector(trk2, PVz, trk2_pt_, trk2_eta_, trk2_mva_, trk2_dz_, trk2_nstub_);
0234 bool track3_pass = TrackSelector(trk3, PVz, trk3_pt_, trk3_eta_, trk3_mva_, trk3_dz_, trk3_nstub_);
0235 if (!track1_pass || !track2_pass || !track3_pass) {
0236 iEvent.put(std::move(L1TrackTripletContainer), OutputDigisName);
0237 iEvent.put(std::move(L1TrackTripletWordContainer), OutputWordName);
0238 return;
0239 }
0240
0241
0242 math::PtEtaPhiMLorentzVectorD pion1(trk1.Pt, trk1.Eta, trk1.Phi, trk1_mass_);
0243 math::PtEtaPhiMLorentzVectorD pion2(trk2.Pt, trk2.Eta, trk2.Phi, trk2_mass_);
0244 math::PtEtaPhiMLorentzVectorD pion3(trk3.Pt, trk3.Eta, trk3.Phi, trk3_mass_);
0245
0246 bool event_pass = true;
0247
0248
0249 double triplet_mass = (pion1 + pion2 + pion3).M();
0250 if (triplet_mass > triplet_massOver_)
0251 triplet_mass = triplet_massOver_;
0252 double triplet_eta = (pion1 + pion2 + pion3).Eta();
0253 double triplet_pt = (pion1 + pion2 + pion3).Pt();
0254 int triplet_charge = trk1.Charge + trk2.Charge + trk3.Charge;
0255 std::vector<double> pair_masses{(pion1 + pion2).M(), (pion2 + pion3).M(), (pion1 + pion3).M()};
0256 std::sort(pair_masses.begin(), pair_masses.end(), [](auto &a, auto &b) { return a > b; });
0257 std::vector<double> pair_dzs{fabs(trk1.Z0 - trk2.Z0), fabs(trk2.Z0 - trk3.Z0), fabs(trk1.Z0 - trk3.Z0)};
0258 std::sort(pair_dzs.begin(), pair_dzs.end(), [](auto &a, auto &b) { return a > b; });
0259
0260
0261 if (triplet_mass < triplet_massMin_ || triplet_mass > triplet_massMax_)
0262 event_pass = false;
0263 if (fabs(triplet_eta) < triplet_etaMin_ || fabs(triplet_eta) > triplet_etaMax_)
0264 event_pass = false;
0265 if (triplet_pt < triplet_ptMin_ || triplet_pt > triplet_ptMax_)
0266 event_pass = false;
0267 if (fabs(triplet_charge) != triplet_abscharge_ && triplet_abscharge_ > -1)
0268 event_pass = false;
0269 if (pair_masses[2] < pair2_massMin_ || pair_masses[2] > pair2_massMax_)
0270 event_pass = false;
0271 if (pair_masses[0] < pair1_massMin_ || pair_masses[0] > pair1_massMax_)
0272 event_pass = false;
0273 if (pair_dzs[2] < pair2_dzMin_ || pair_dzs[2] > pair2_dzMax_)
0274 event_pass = false;
0275 if (pair_dzs[0] < pair1_dzMin_ || pair_dzs[0] > pair1_dzMax_)
0276 event_pass = false;
0277
0278 if (!event_pass) {
0279 iEvent.put(std::move(L1TrackTripletContainer), OutputDigisName);
0280 iEvent.put(std::move(L1TrackTripletWordContainer), OutputWordName);
0281 return;
0282 }
0283 float tripletPx = (pion1 + pion2 + pion3).Pt() * cos((pion1 + pion2 + pion3).Phi());
0284 float tripletPy = (pion1 + pion2 + pion3).Pt() * sin((pion1 + pion2 + pion3).Phi());
0285 float tripletPz = (pion1 + pion2 + pion3).Pt() * sinh((pion1 + pion2 + pion3).Eta());
0286 float tripletE =
0287 sqrt(tripletPx * tripletPx + tripletPy * tripletPy + tripletPz * tripletPz + triplet_mass * triplet_mass);
0288 TkTriplet trkTriplet(math::XYZTLorentzVector(tripletPx, tripletPy, tripletPz, tripletE),
0289 triplet_charge,
0290 pair_masses[0],
0291 pair_masses[2],
0292 pair_dzs[0],
0293 pair_dzs[2],
0294 {edm::Ptr<L1TTTrackType>(TTTrackHandle, trk1.Index),
0295 edm::Ptr<L1TTTrackType>(TTTrackHandle, trk2.Index),
0296 edm::Ptr<L1TTTrackType>(TTTrackHandle, trk3.Index)});
0297 L1TrackTripletContainer->push_back(trkTriplet);
0298
0299 iEvent.put(std::move(L1TrackTripletContainer), OutputDigisName);
0300
0301
0302 l1t::TkTripletWord::valid_t val = 1;
0303 l1t::TkTripletWord::pt_t bitPt = pt_intern((pion1 + pion2 + pion3).Pt());
0304 l1t::TkTripletWord::glbeta_t bitEta =
0305 DoubleToBit((pion1 + pion2 + pion3).Eta(),
0306 TkTripletWord::TkTripletBitWidths::kGlbEtaSize,
0307 TkTripletWord::MAX_ETA / (1 << TkTripletWord::TkTripletBitWidths::kGlbEtaSize));
0308 l1t::TkTripletWord::glbphi_t bitPhi =
0309 DoubleToBit((pion1 + pion2 + pion3).Phi(),
0310 TkTripletWord::TkTripletBitWidths::kGlbPhiSize,
0311 (2. * std::abs(M_PI)) / (1 << TkTripletWord::TkTripletBitWidths::kGlbPhiSize));
0312 l1t::TkTripletWord::charge_t bitCharge =
0313 DoubleToBit(double(triplet_charge),
0314 TkTripletWord::TkTripletBitWidths::kChargeSize,
0315 TkTripletWord::MAX_CHARGE / (1 << TkTripletWord::TkTripletBitWidths::kChargeSize));
0316 l1t::TkTripletWord::mass_t bitMass =
0317 DoubleToBit((pion1 + pion2 + pion3).M(),
0318 TkTripletWord::TkTripletBitWidths::kMassSize,
0319 TkTripletWord::MAX_MASS / (1 << TkTripletWord::TkTripletBitWidths::kMassSize));
0320 l1t::TkTripletWord::ditrack_minmass_t bitDiTrackMinMass =
0321 DoubleToBit(pair_masses[2],
0322 TkTripletWord::TkTripletBitWidths::kDiTrackMinMassSize,
0323 TkTripletWord::MAX_MASS / (1 << TkTripletWord::TkTripletBitWidths::kDiTrackMinMassSize));
0324 l1t::TkTripletWord::ditrack_maxmass_t bitDiTrackMaxMass =
0325 DoubleToBit(pair_masses[0],
0326 TkTripletWord::TkTripletBitWidths::kDiTrackMaxMassSize,
0327 TkTripletWord::MAX_MASS / (1 << TkTripletWord::TkTripletBitWidths::kDiTrackMaxMassSize));
0328
0329 l1t::TkTripletWord::ditrack_minz0_t bitDiTrackMinZ0 =
0330 DoubleToBit(pair_dzs[2],
0331 TkTripletWord::TkTripletBitWidths::kDiTrackMinZ0Size,
0332 TkTripletWord::MAX_Z0 / (1 << TkTripletWord::TkTripletBitWidths::kDiTrackMinZ0Size));
0333 l1t::TkTripletWord::ditrack_maxz0_t bitDiTrackMaxZ0 =
0334 DoubleToBit(pair_dzs[0],
0335 TkTripletWord::TkTripletBitWidths::kDiTrackMaxZ0Size,
0336 TkTripletWord::MAX_Z0 / (1 << TkTripletWord::TkTripletBitWidths::kDiTrackMaxZ0Size));
0337
0338 l1t::TkTripletWord::unassigned_t unassigned = 0;
0339 l1t::TkTripletWord bitTriplet(val,
0340 bitPt,
0341 bitEta,
0342 bitPhi,
0343 bitMass,
0344 bitCharge,
0345 bitDiTrackMinZ0,
0346 bitDiTrackMaxMass,
0347 bitDiTrackMinZ0,
0348 bitDiTrackMaxZ0,
0349 unassigned);
0350
0351 L1TrackTripletWordContainer->push_back(bitTriplet);
0352
0353 iEvent.put(std::move(L1TrackTripletWordContainer), OutputWordName);
0354 }
0355
0356 bool L1TrackTripletEmulatorProducer::TrackSelector(L1TrackTripletEmulatorProducer::L1track &track,
0357 double PVz,
0358 double pt_min_cut,
0359 double eta_max_cut,
0360 double mva_min_cut,
0361 double dz_max_cut,
0362 int nstub_min_cut) {
0363 return (track.Pt >= pt_min_cut) && (fabs(track.Eta) <= eta_max_cut) && (track.MVA >= mva_min_cut) &&
0364 (fabs(track.Z0 - PVz) <= dz_max_cut) && (track.Nstubs >= nstub_min_cut);
0365 }
0366
0367 double L1TrackTripletEmulatorProducer::FloatPtFromBits(const L1TTTrackType &track) {
0368 ap_uint<TTTrack_TrackWord::TrackBitWidths::kRinvSize - 1> ptBits = track.getRinvWord();
0369 pt_intern digipt;
0370 digipt.V = ptBits.range();
0371 return (double)digipt;
0372 }
0373
0374 double L1TrackTripletEmulatorProducer::FloatEtaFromBits(const L1TTTrackType &track) {
0375 TTTrack_TrackWord::tanl_t etaBits = track.getTanlWord();
0376 glbeta_intern digieta;
0377 digieta.V = etaBits.range();
0378 return (double)digieta;
0379 }
0380
0381 double L1TrackTripletEmulatorProducer::FloatPhiFromBits(const L1TTTrackType &track) {
0382 int Sector = track.phiSector();
0383 double sector_phi_value = 0;
0384 if (Sector < 5) {
0385 sector_phi_value = 2.0 * M_PI * Sector / 9.0;
0386 } else {
0387 sector_phi_value = (-1.0 * M_PI + M_PI / 9.0 + (Sector - 5) * 2.0 * M_PI / 9.0);
0388 }
0389 glbphi_intern trkphiSector = DoubleToBit(
0390 sector_phi_value, TTTrack_TrackWord::TrackBitWidths::kPhiSize + kExtraGlobalPhiBit, TTTrack_TrackWord::stepPhi0);
0391 glbphi_intern local_phiBits = 0;
0392 local_phiBits.V = track.getPhiWord();
0393
0394 glbphi_intern local_phi =
0395 DoubleToBit(BitToDouble(local_phiBits, TTTrack_TrackWord::TrackBitWidths::kPhiSize, TTTrack_TrackWord::stepPhi0),
0396 TTTrack_TrackWord::TrackBitWidths::kPhiSize + kExtraGlobalPhiBit,
0397 TTTrack_TrackWord::stepPhi0);
0398 glbphi_intern digiphi = local_phi + trkphiSector;
0399 return BitToDouble(
0400 digiphi, TTTrack_TrackWord::TrackBitWidths::kPhiSize + kExtraGlobalPhiBit, TTTrack_TrackWord::stepPhi0);
0401 }
0402
0403 double L1TrackTripletEmulatorProducer::FloatZ0FromBits(const L1TTTrackType &track) {
0404 z0_intern trkZ = track.getZ0Word();
0405 return BitToDouble(trkZ, TTTrack_TrackWord::TrackBitWidths::kZ0Size, TTTrack_TrackWord::stepZ0);
0406 }
0407
0408 void L1TrackTripletEmulatorProducer::fillDescriptions(ConfigurationDescriptions &descriptions) {
0409
0410
0411 ParameterSetDescription desc;
0412 desc.add<edm::InputTag>("L1TrackInputTag", edm::InputTag("l1tTTTracksFromTrackletEmulation", "Level1TTTracks"));
0413 desc.add<edm::InputTag>("L1PVertexInputTag", edm::InputTag("l1tVertexFinderEmulator", "L1VerticesEmulation"));
0414 desc.add<double>("trk1_ptMin", -1.0);
0415 desc.add<double>("trk1_absEtaMax", 10e7);
0416 desc.add<double>("trk1_mvaMin", -1.0);
0417 desc.add<int>("trk1_nstubMin", -1);
0418 desc.add<double>("trk1_dzMax", 10e7);
0419 desc.add<double>("trk1_mass", 0.139);
0420 desc.add<double>("trk2_ptMin", -1.0);
0421 desc.add<double>("trk2_absEtaMax", 10e7);
0422 desc.add<double>("trk2_mvaMin", -1.0);
0423 desc.add<int>("trk2_nstubMin", -1);
0424 desc.add<double>("trk2_dzMax", 10e7);
0425 desc.add<double>("trk2_mass", 0.139);
0426 desc.add<double>("trk3_ptMin", -1.0);
0427 desc.add<double>("trk3_absEtaMax", 10e7);
0428 desc.add<double>("trk3_mvaMin", -1.0);
0429 desc.add<int>("trk3_nstubMin", 0);
0430 desc.add<double>("trk3_dzMax", 10e7);
0431 desc.add<double>("trk3_mass", 0.139);
0432 desc.add<bool>("displaced", false);
0433 desc.add<double>("triplet_massMin", -1.0);
0434 desc.add<double>("triplet_massMax", 10e7);
0435 desc.add<double>("triplet_absEtaMin", -1.0);
0436 desc.add<double>("triplet_absEtaMax", 10e7);
0437 desc.add<double>("triplet_ptMin", -1.0);
0438 desc.add<double>("triplet_ptMax", 10e7);
0439 desc.add<int>("triplet_absCharge", -1);
0440 desc.add<double>("triplet_massOverflow", 1000);
0441 desc.add<double>("pair1_massMin", -1);
0442 desc.add<double>("pair1_massMax", 10e7);
0443 desc.add<double>("pair2_massMin", -1);
0444 desc.add<double>("pair2_massMax", 10e7);
0445 desc.add<double>("pair1_dzMin", -1);
0446 desc.add<double>("pair1_dzMax", 10e7);
0447 desc.add<double>("pair2_dzMin", -1);
0448 desc.add<double>("pair2_dzMax", 10e7);
0449 desc.add<bool>("float_precision", false);
0450 descriptions.add("l1tTrackTripletEmulator", desc);
0451 }
0452
0453
0454 DEFINE_FWK_MODULE(L1TrackTripletEmulatorProducer);