CMS 3D CMS Logo

TSGForOIDNN.cc
Go to the documentation of this file.
1 
34 #include <boost/property_tree/ptree.hpp>
35 #include <boost/property_tree/json_parser.hpp>
36 #include <boost/range/adaptor/reversed.hpp>
37 #include <memory>
38 namespace pt = boost::property_tree;
39 
41 public:
42  explicit TSGForOIDNN(const edm::ParameterSet& iConfig);
43  ~TSGForOIDNN() override;
44  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
45  void produce(edm::StreamID sid, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
46  void beginJob() override;
47 
48 private:
60  const std::unique_ptr<TrajectoryStateUpdator> updator_;
63 
65  const unsigned int maxSeeds_;
67  const unsigned int maxHitSeeds_;
69  const unsigned int maxHitlessSeeds_;
71  const unsigned int numOfLayersToTry_;
73  const unsigned int numOfHitsToTry_;
79  const double minEtaForTEC_;
81  const double maxEtaForTOB_;
82 
85  const unsigned int maxHitlessSeedsIP_;
86  const unsigned int maxHitlessSeedsMuS_;
87  const unsigned int maxHitDoubletSeeds_;
88 
90  const bool getStrategyFromDNN_;
92  const bool useRegressor_;
93 
96  std::unique_ptr<tensorflow::GraphDef> graphDef_;
97  tensorflow::Session* tf_session_;
98 
103  std::unique_ptr<tensorflow::GraphDef> graphDef_HB_;
104  tensorflow::Session* tf_session_HB_;
105  std::unique_ptr<tensorflow::GraphDef> graphDef_HLIP_;
106  tensorflow::Session* tf_session_HLIP_;
107  std::unique_ptr<tensorflow::GraphDef> graphDef_HLMuS_;
108  tensorflow::Session* tf_session_HLMuS_;
109 
112  pt::ptree metadata_;
113 
116  const TrajectoryStateOnSurface& tsos,
119  double errorSF,
120  unsigned int& hitlessSeedsMade,
121  unsigned int& numSeedsMade,
122  std::vector<TrajectorySeed>& out) const;
123 
126  const TrajectoryStateOnSurface& tsos,
130  unsigned int& hitSeedsMade,
131  unsigned int& numSeedsMade,
132  const unsigned int& maxHitSeeds,
133  unsigned int& layerCount,
134  std::vector<TrajectorySeed>& out) const;
135 
138  const TrajectoryStateOnSurface& tsos,
143  unsigned int& hitDoubletSeedsMade,
144  unsigned int& numSeedsMade,
145  const unsigned int& maxHitDoubletSeeds,
146  unsigned int& layerCount,
147  std::vector<TrajectorySeed>& out) const;
148 
150  void updateFeatureMap(std::unordered_map<std::string, float>& the_map,
151  const reco::Track& l2,
152  const TrajectoryStateOnSurface& tsos_IP,
153  const TrajectoryStateOnSurface& tsos_MuS) const;
154 
155  void initializeTensorflow() const;
156 
159  int nHBd, nHLIP, nHLMuS, sf;
160  };
161 
163  void evaluateClassifier(const std::unordered_map<std::string, float>& feature_map,
164  tensorflow::Session* session,
165  const pt::ptree& metadata,
167  bool& dnnSuccess) const;
168 
170  void evaluateRegressor(const std::unordered_map<std::string, float>& feature_map,
171  tensorflow::Session* session_HB,
172  const pt::ptree& metadata_HB,
173  tensorflow::Session* session_HLIP,
174  const pt::ptree& metadata_HLIP,
175  tensorflow::Session* session_HLMuS,
176  const pt::ptree& metadata_HLMuS,
178  bool& dnnSuccess) const;
179 };
180 
182  : src_(consumes(iConfig.getParameter<edm::InputTag>("src"))),
183  t_estimatorH_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("estimator")))),
184  t_magfieldH_(esConsumes()),
185  t_propagatorAlongH_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("propagatorName")))),
186  t_propagatorOppositeH_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("propagatorName")))),
187  t_tmpTkGeometryH_(esConsumes()),
188  t_geometryH_(esConsumes()),
189  t_navSchool_(esConsumes(edm::ESInputTag("", "SimpleNavigationSchool"))),
190  t_SHPOpposite_(esConsumes(edm::ESInputTag("", "hltESPSteppingHelixPropagatorOpposite"))),
191  updator_(new KFUpdator()),
192  measurementTrackerTag_(consumes(iConfig.getParameter<edm::InputTag>("MeasurementTrackerEvent"))),
193  theCategory_(std::string("Muon|RecoMuon|TSGForOIDNN")),
194  maxSeeds_(iConfig.getParameter<uint32_t>("maxSeeds")),
195  maxHitSeeds_(iConfig.getParameter<uint32_t>("maxHitSeeds")),
196  maxHitlessSeeds_(iConfig.getParameter<uint32_t>("maxHitlessSeeds")),
197  numOfLayersToTry_(iConfig.getParameter<int32_t>("layersToTry")),
198  numOfHitsToTry_(iConfig.getParameter<int32_t>("hitsToTry")),
199  fixedErrorRescalingForHitless_(iConfig.getParameter<double>("fixedErrorRescaleFactorForHitless")),
200  minEtaForTEC_(iConfig.getParameter<double>("minEtaForTEC")),
201  maxEtaForTOB_(iConfig.getParameter<double>("maxEtaForTOB")),
202  maxHitlessSeedsIP_(iConfig.getParameter<uint32_t>("maxHitlessSeedsIP")),
203  maxHitlessSeedsMuS_(iConfig.getParameter<uint32_t>("maxHitlessSeedsMuS")),
204  maxHitDoubletSeeds_(iConfig.getParameter<uint32_t>("maxHitDoubletSeeds")),
205  getStrategyFromDNN_(iConfig.getParameter<bool>("getStrategyFromDNN")),
206  useRegressor_(iConfig.getParameter<bool>("useRegressor")),
207  dnnMetadataPath_(iConfig.getParameter<std::string>("dnnMetadataPath")) {
208  if (getStrategyFromDNN_) {
210  pt::read_json(dnnMetadataPath.fullPath(), metadata_);
211 
212  if (useRegressor_) {
213  // use regressor
214  dnnModelPath_HB_ = metadata_.get<std::string>("HB.dnnmodel_path");
215  edm::FileInPath dnnPath_HB(dnnModelPath_HB_);
216  graphDef_HB_ = std::unique_ptr<tensorflow::GraphDef>(tensorflow::loadGraphDef(dnnPath_HB.fullPath()));
218 
219  dnnModelPath_HLIP_ = metadata_.get<std::string>("HLIP.dnnmodel_path");
220  edm::FileInPath dnnPath_HLIP(dnnModelPath_HLIP_);
221  graphDef_HLIP_ = std::unique_ptr<tensorflow::GraphDef>(tensorflow::loadGraphDef(dnnPath_HLIP.fullPath()));
223 
224  dnnModelPath_HLMuS_ = metadata_.get<std::string>("HLMuS.dnnmodel_path");
225  edm::FileInPath dnnPath_HLMuS(dnnModelPath_HLMuS_);
226  graphDef_HLMuS_ = std::unique_ptr<tensorflow::GraphDef>(tensorflow::loadGraphDef(dnnPath_HLMuS.fullPath()));
228  } else {
229  // use classifier (default)
230  dnnModelPath_ = metadata_.get<std::string>("dnnmodel_path");
232  graphDef_ = std::unique_ptr<tensorflow::GraphDef>(tensorflow::loadGraphDef(dnnPath.fullPath()));
234  }
235  }
236  produces<std::vector<TrajectorySeed> >();
237 }
238 
240  if (getStrategyFromDNN_) {
241  if (useRegressor_) {
245  } else {
247  }
248  }
249 }
250 
252 
253 namespace {
254  std::unordered_map<std::string, float> dummyFeatureMap() {
255  std::unordered_map<std::string, float> the_map;
256  the_map["pt"] = 2.0;
257  the_map["eta"] = 0.5;
258  the_map["phi"] = 1.0;
259  the_map["validHits"] = 0.;
260  the_map["tsos_IP_eta"] = -999;
261  the_map["tsos_IP_phi"] = -999;
262  the_map["tsos_IP_pt"] = -999;
263  the_map["tsos_IP_pt_eta"] = -999;
264  the_map["tsos_IP_pt_phi"] = -999;
265  the_map["err0_IP"] = -999;
266  the_map["err1_IP"] = -999;
267  the_map["err2_IP"] = -999;
268  the_map["err3_IP"] = -999;
269  the_map["err4_IP"] = -999;
270  the_map["tsos_IP_valid"] = 0.0;
271  the_map["tsos_MuS_eta"] = -999;
272  the_map["tsos_MuS_phi"] = -999;
273  the_map["tsos_MuS_pt"] = -999;
274  the_map["tsos_MuS_pt_eta"] = -999;
275  the_map["tsos_MuS_pt_phi"] = -999;
276  the_map["err0_MuS"] = -999;
277  the_map["err1_MuS"] = -999;
278  the_map["err2_MuS"] = -999;
279  the_map["err3_MuS"] = -999;
280  the_map["err4_MuS"] = -999;
281  the_map["tsos_MuS_valid"] = 0.0;
282  return the_map;
283  }
284 } // namespace
285 
287  if (getStrategyFromDNN_ and not useRegressor_) {
288  // Container for DNN outputs
289  StrategyParameters strPars;
290  bool dnnSuccess = false;
291  evaluateClassifier(dummyFeatureMap(), tf_session_, metadata_, strPars, dnnSuccess);
292  }
293 }
294 
295 //
296 // Produce seeds
297 //
298 void TSGForOIDNN::produce(edm::StreamID sid, edm::Event& iEvent, edm::EventSetup const& iEventSetup) const {
299  // Initialize variables
300  unsigned int numSeedsMade = 0;
301  unsigned int layerCount = 0;
302  unsigned int hitlessSeedsMadeIP = 0;
303  unsigned int hitlessSeedsMadeMuS = 0;
304  unsigned int hitSeedsMade = 0;
305  unsigned int hitDoubletSeedsMade = 0;
306 
307  // Container for DNN inputs
308  std::unordered_map<std::string, float> feature_map;
309 
310  // Container for DNN outputs
311  StrategyParameters strPars;
312 
313  // Surface used to make a TSOS at the PCA to the beamline
315 
316  // Get setup objects
317  const MagneticField& magfield = iEventSetup.getData(t_magfieldH_);
319  const Propagator& tmpPropagatorAlong = iEventSetup.getData(t_propagatorAlongH_);
320  const Propagator& tmpPropagatorOpposite = iEventSetup.getData(t_propagatorOppositeH_);
321  const TrackerGeometry& tmpTkGeometry = iEventSetup.getData(t_tmpTkGeometryH_);
322  const GlobalTrackingGeometry& geometry = iEventSetup.getData(t_geometryH_);
323  const NavigationSchool& navSchool = iEventSetup.getData(t_navSchool_);
325 
326  // Read L2 track collection
327  auto const& l2TrackCol = iEvent.get(src_);
328 
329  // The product
330  std::unique_ptr<std::vector<TrajectorySeed> > result(new std::vector<TrajectorySeed>());
331 
332  // Get vector of Detector layers
333  auto const* gsTracker = measurementTracker.geometricSearchTracker();
334  std::vector<BarrelDetLayer const*> const& tob = gsTracker->tobLayers();
335  std::vector<ForwardDetLayer const*> const& tecPositive =
336  tmpTkGeometry.isThere(GeomDetEnumerators::P2OTEC) ? gsTracker->posTidLayers() : gsTracker->posTecLayers();
337  std::vector<ForwardDetLayer const*> const& tecNegative =
338  tmpTkGeometry.isThere(GeomDetEnumerators::P2OTEC) ? gsTracker->negTidLayers() : gsTracker->negTecLayers();
339 
340  // Get suitable propagators
341  std::unique_ptr<Propagator> propagatorAlong = SetPropagationDirection(tmpPropagatorAlong, alongMomentum);
342  std::unique_ptr<Propagator> propagatorOpposite = SetPropagationDirection(tmpPropagatorOpposite, oppositeToMomentum);
343 
344  // Stepping Helix Propagator for propogation from muon system to tracker
345  edm::ESHandle<Propagator> shpOpposite = iEventSetup.getHandle(t_SHPOpposite_);
346 
347  // Loop over the L2's and make seeds for all of them
348  LogTrace(theCategory_) << "TSGForOIDNN::produce: Number of L2's: " << l2TrackCol.size();
349 
350  for (auto const& l2 : l2TrackCol) {
351  // Container of Seeds
352  std::vector<TrajectorySeed> out;
353  LogTrace("TSGForOIDNN") << "TSGForOIDNN::produce: L2 muon pT, eta, phi --> " << l2.pt() << " , " << l2.eta()
354  << " , " << l2.phi();
355 
357 
358  dummyPlane->move(fts.position() - dummyPlane->position());
359  TrajectoryStateOnSurface tsosAtIP = TrajectoryStateOnSurface(fts, *dummyPlane);
360  LogTrace("TSGForOIDNN") << "TSGForOIDNN::produce: Created TSOSatIP: " << tsosAtIP;
361 
362  // Get the TSOS on the innermost layer of the L2
364  LogTrace("TSGForOIDNN") << "TSGForOIDNN::produce: Created TSOSatMuonSystem: " << tsosAtMuonSystem;
365 
366  LogTrace("TSGForOIDNN")
367  << "TSGForOIDNN::produce: Check the error of the L2 parameter and use hit seeds if big errors";
368 
369  StateOnTrackerBound fromInside(propagatorAlong.get());
370  TrajectoryStateOnSurface outerTkStateInside = fromInside(fts);
371 
372  StateOnTrackerBound fromOutside(&*shpOpposite);
373  TrajectoryStateOnSurface outerTkStateOutside = fromOutside(tsosAtMuonSystem);
374 
375  // Check if the two positions (using updated and not-updated TSOS) agree withing certain extent.
376  // If both TSOSs agree, use only the one at vertex, as it uses more information. If they do not agree, search for seeds based on both.
377  double l2muonEta = l2.eta();
378  double absL2muonEta = std::abs(l2muonEta);
379 
380  // make non-const copies of parameters, so they can be overriden for individual L2 muons
381  unsigned int maxHitSeeds = maxHitSeeds_;
383  unsigned int maxHitlessSeedsIP = maxHitlessSeedsIP_;
385 
386  float errorSFHitless = fixedErrorRescalingForHitless_;
387 
388  // update strategy parameters by evaluating DNN
389  if (getStrategyFromDNN_) {
390  bool dnnSuccess = false;
391 
392  // Update feature map with parameters of the current muon
393  updateFeatureMap(feature_map, l2, tsosAtIP, outerTkStateOutside);
394 
395  if (useRegressor_) {
396  // Use regressor
397  evaluateRegressor(feature_map,
399  metadata_.get_child("HB"),
401  metadata_.get_child("HLIP"),
403  metadata_.get_child("HLMuS"),
404  strPars,
405  dnnSuccess);
406  } else {
407  // Use classifier
408  evaluateClassifier(feature_map, tf_session_, metadata_, strPars, dnnSuccess);
409  }
410  if (!dnnSuccess)
411  break;
412 
413  maxHitSeeds = 0;
414  maxHitDoubletSeeds = strPars.nHBd;
415  maxHitlessSeedsIP = strPars.nHLIP;
416  maxHitlessSeedsMuS = strPars.nHLMuS;
417  errorSFHitless = strPars.sf;
418  }
419 
420  numSeedsMade = 0;
421  hitlessSeedsMadeIP = 0;
422  hitlessSeedsMadeMuS = 0;
423  hitSeedsMade = 0;
424  hitDoubletSeedsMade = 0;
425 
426  auto createSeeds = [&](auto const& layers) {
427  for (auto const& layer : boost::adaptors::reverse(layers)) {
428  if (hitlessSeedsMadeIP < maxHitlessSeedsIP && numSeedsMade < maxSeeds_)
430  tsosAtIP,
431  *(propagatorAlong.get()),
432  estimator,
433  errorSFHitless,
434  hitlessSeedsMadeIP,
435  numSeedsMade,
436  out);
437 
438  if (outerTkStateInside.isValid() && outerTkStateOutside.isValid() && hitlessSeedsMadeMuS < maxHitlessSeedsMuS &&
439  numSeedsMade < maxSeeds_)
441  outerTkStateOutside,
442  *(propagatorOpposite.get()),
443  estimator,
444  errorSFHitless,
445  hitlessSeedsMadeMuS,
446  numSeedsMade,
447  out);
448 
449  if (hitSeedsMade < maxHitSeeds && numSeedsMade < maxSeeds_)
451  tsosAtIP,
452  *(propagatorAlong.get()),
453  estimator,
455  hitSeedsMade,
456  numSeedsMade,
457  maxHitSeeds,
458  layerCount,
459  out);
460 
461  if (hitDoubletSeedsMade < maxHitDoubletSeeds && numSeedsMade < maxSeeds_)
463  tsosAtIP,
464  *(propagatorAlong.get()),
465  estimator,
467  navSchool,
468  hitDoubletSeedsMade,
469  numSeedsMade,
471  layerCount,
472  out);
473  };
474  };
475 
476  // BARREL
477  if (absL2muonEta < maxEtaForTOB_) {
478  layerCount = 0;
479  createSeeds(tob);
480  LogTrace("TSGForOIDNN") << "TSGForOIDNN:::produce: NumSeedsMade = " << numSeedsMade
481  << " , layerCount = " << layerCount;
482  }
483 
484  // Reset number of seeds if in overlap region
485  if (absL2muonEta > minEtaForTEC_ && absL2muonEta < maxEtaForTOB_) {
486  numSeedsMade = 0;
487  hitlessSeedsMadeIP = 0;
488  hitlessSeedsMadeMuS = 0;
489  hitSeedsMade = 0;
490  hitDoubletSeedsMade = 0;
491  }
492 
493  // ENDCAP+
494  if (l2muonEta > minEtaForTEC_) {
495  layerCount = 0;
496  createSeeds(tecPositive);
497  LogTrace("TSGForOIDNN") << "TSGForOIDNN:::produce: NumSeedsMade = " << numSeedsMade
498  << " , layerCount = " << layerCount;
499  }
500 
501  // ENDCAP-
502  if (l2muonEta < -minEtaForTEC_) {
503  layerCount = 0;
504  createSeeds(tecNegative);
505  LogTrace("TSGForOIDNN") << "TSGForOIDNN:::produce: NumSeedsMade = " << numSeedsMade
506  << " , layerCount = " << layerCount;
507  }
508 
509  for (std::vector<TrajectorySeed>::iterator it = out.begin(); it != out.end(); ++it) {
510  result->push_back(*it);
511  }
512 
513  } // L2Collection
514 
515  edm::LogInfo(theCategory_) << "TSGForOIDNN::produce: number of seeds made: " << result->size();
516 
517  iEvent.put(std::move(result));
518 }
519 
520 //
521 // Create seeds without hits on a given layer (TOB or TEC)
522 //
524  const TrajectoryStateOnSurface& tsos,
527  double errorSF,
528  unsigned int& hitlessSeedsMade,
529  unsigned int& numSeedsMade,
530  std::vector<TrajectorySeed>& out) const {
531  // create hitless seeds
532  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsWithoutHits: Start hitless";
533  std::vector<GeometricSearchDet::DetWithState> dets;
534  layer.compatibleDetsV(tsos, propagatorAlong, estimator, dets);
535  if (!dets.empty()) {
536  auto const& detOnLayer = dets.front().first;
537  auto& tsosOnLayer = dets.front().second;
538  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsWithoutHits: tsosOnLayer " << tsosOnLayer;
539  if (!tsosOnLayer.isValid()) {
540  edm::LogInfo(theCategory_) << "ERROR!: Hitless TSOS is not valid!";
541  } else {
542  tsosOnLayer.rescaleError(errorSF);
543  PTrajectoryStateOnDet const& ptsod =
544  trajectoryStateTransform::persistentState(tsosOnLayer, detOnLayer->geographicalId().rawId());
546  out.push_back(TrajectorySeed(ptsod, rHC, oppositeToMomentum));
547  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsWithoutHits: TSOS (Hitless) done ";
548  hitlessSeedsMade++;
549  numSeedsMade++;
550  }
551  }
552 }
553 
554 //
555 // Find hits on a given layer (TOB or TEC) and create seeds from updated TSOS with hit
556 //
558  const TrajectoryStateOnSurface& tsos,
562  unsigned int& hitSeedsMade,
563  unsigned int& numSeedsMade,
564  const unsigned int& maxHitSeeds,
565  unsigned int& layerCount,
566  std::vector<TrajectorySeed>& out) const {
567  if (layerCount > numOfLayersToTry_)
568  return;
569 
570  const TrajectoryStateOnSurface& onLayer(tsos);
571 
572  std::vector<GeometricSearchDet::DetWithState> dets;
573  layer.compatibleDetsV(onLayer, propagatorAlong, estimator, dets);
574 
575  // Find Measurements on each DetWithState
576  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHits: Find measurements on each detWithState " << dets.size();
577  std::vector<TrajectoryMeasurement> meas;
578  for (auto const& detI : dets) {
579  MeasurementDetWithData det = measurementTracker.idToDet(detI.first->geographicalId());
580  if (det.isNull())
581  continue;
582  if (!detI.second.isValid())
583  continue; // Skip if TSOS is not valid
584 
585  std::vector<TrajectoryMeasurement> mymeas =
586  det.fastMeasurements(detI.second, onLayer, propagatorAlong, estimator); // Second TSOS is not used
587  for (auto const& measurement : mymeas) {
588  if (measurement.recHit()->isValid())
589  meas.push_back(measurement); // Only save those which are valid
590  }
591  }
592 
593  // Update TSOS using TMs after sorting, then create Trajectory Seed and put into vector
594  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHits: Update TSOS using TMs after sorting, then create "
595  "Trajectory Seed, number of TM = "
596  << meas.size();
597  std::sort(meas.begin(), meas.end(), TrajMeasLessEstim());
598 
599  unsigned int found = 0;
600  for (auto const& measurement : meas) {
601  if (hitSeedsMade >= maxHitSeeds)
602  return;
603  TrajectoryStateOnSurface updatedTSOS = updator_->update(measurement.forwardPredictedState(), *measurement.recHit());
604  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHits: TSOS for TM " << found;
605  if (not updatedTSOS.isValid())
606  continue;
607 
609  seedHits.push_back(*measurement.recHit()->hit());
610  PTrajectoryStateOnDet const& pstate =
611  trajectoryStateTransform::persistentState(updatedTSOS, measurement.recHit()->geographicalId().rawId());
612  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHits: Number of seedHits: " << seedHits.size();
613  TrajectorySeed seed(pstate, std::move(seedHits), oppositeToMomentum);
614  out.push_back(seed);
615  found++;
616  numSeedsMade++;
617  hitSeedsMade++;
618  if (found == numOfHitsToTry_)
619  break;
620  }
621 
622  if (found)
623  layerCount++;
624 }
625 
626 //
627 // Find hits compatible with L2 trajectory on two adjacent layers; if found, create a seed using both hits
628 //
630  const TrajectoryStateOnSurface& tsos,
635  unsigned int& hitDoubletSeedsMade,
636  unsigned int& numSeedsMade,
637  const unsigned int& maxHitDoubletSeeds,
638  unsigned int& layerCount,
639  std::vector<TrajectorySeed>& out) const {
640  // This method is similar to makeSeedsFromHits, but the seed is created
641  // only when in addition to a hit on a given layer, there are more compatible hits
642  // on next layers (going from outside inwards), compatible with updated TSOS.
643  // If that's the case, multiple compatible hits are used to create a single seed.
644 
645  // Configured to only check the immideately adjacent layer and add one more hit
646  int max_addtnl_layers = 1; // max number of additional layers to scan
647  int max_meas = 1; // number of measurements to consider on each additional layer
648 
649  // // // First, regular procedure to find a compatible hit - like in makeSeedsFromHits // // //
650 
651  const TrajectoryStateOnSurface& onLayer(tsos);
652 
653  // Find dets compatible with original TSOS
654  std::vector<GeometricSearchDet::DetWithState> dets;
655  layer.compatibleDetsV(onLayer, propagatorAlong, estimator, dets);
656 
657  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHitDoublets: Find measurements on each detWithState "
658  << dets.size();
659  std::vector<TrajectoryMeasurement> meas;
660 
661  // Loop over dets
662  for (auto const& detI : dets) {
663  MeasurementDetWithData det = measurementTracker.idToDet(detI.first->geographicalId());
664 
665  if (det.isNull())
666  continue; // skip if det does not exist
667  if (!detI.second.isValid())
668  continue; // skip if TSOS is invalid
669 
670  // Find measurements on this det
671  std::vector<TrajectoryMeasurement> mymeas = det.fastMeasurements(detI.second, onLayer, propagatorAlong, estimator);
672 
673  // Save valid measurements
674  for (auto const& measurement : mymeas) {
675  if (measurement.recHit()->isValid())
676  meas.push_back(measurement);
677  } // end loop over meas
678  } // end loop over dets
679 
680  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHitDoublets: Update TSOS using TMs after sorting, then create "
681  "Trajectory Seed, number of TM = "
682  << meas.size();
683 
684  // sort valid measurements found on the first layer
685  std::sort(meas.begin(), meas.end(), TrajMeasLessEstim());
686 
687  unsigned int found = 0;
688 
689  // Loop over all valid measurements compatible with original TSOS
690  //for (std::vector<TrajectoryMeasurement>::const_iterator mea = meas.begin(); mea != meas.end(); ++mea) {
691  for (auto const& measurement : meas) {
692  if (hitDoubletSeedsMade >= maxHitDoubletSeeds)
693  return; // abort if enough seeds created
694 
695  // Update TSOS with measurement on first considered layer
696  TrajectoryStateOnSurface updatedTSOS = updator_->update(measurement.forwardPredictedState(), *measurement.recHit());
697 
698  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHitDoublets: TSOS for TM " << found;
699  if (not updatedTSOS.isValid())
700  continue; // Skip if updated TSOS is invalid
701 
703 
704  // Save hit on first layer
705  seedHits.push_back(*measurement.recHit()->hit());
706  const DetLayer* detLayer = dynamic_cast<const DetLayer*>(&layer);
707 
708  // // // Now for this measurement we will loop over additional layers and try to update the TSOS again // // //
709 
710  // find layers compatible with updated TSOS
711  auto const& compLayers = navSchool.nextLayers(*detLayer, *updatedTSOS.freeState(), alongMomentum);
712 
713  int addtnl_layers_scanned = 0;
714  int found_compatible_on_next_layer = 0;
715  int det_id = 0;
716 
717  // Copy updated TSOS - we will update it again with a measurement from the next layer, if we find it
718  TrajectoryStateOnSurface updatedTSOS_next(updatedTSOS);
719 
720  // loop over layers compatible with updated TSOS
721  for (auto compLayer : compLayers) {
722  int nmeas = 0;
723 
724  if (addtnl_layers_scanned >= max_addtnl_layers)
725  break; // break if we already looped over enough layers
726  if (found_compatible_on_next_layer > 0)
727  break; // break if we already found additional hit
728 
729  // find dets compatible with updated TSOS
730  std::vector<GeometricSearchDet::DetWithState> dets_next;
731  TrajectoryStateOnSurface onLayer_next(updatedTSOS);
732 
733  compLayer->compatibleDetsV(onLayer_next, propagatorAlong, estimator, dets_next);
734 
735  //if (!detWithState.size()) continue;
736  std::vector<TrajectoryMeasurement> meas_next;
737 
738  // find measurements on dets_next and save the valid ones
739  for (auto const& detI_next : dets_next) {
740  MeasurementDetWithData det = measurementTracker.idToDet(detI_next.first->geographicalId());
741 
742  if (det.isNull())
743  continue; // skip if det does not exist
744  if (!detI_next.second.isValid())
745  continue; // skip if TSOS is invalid
746 
747  // Find measurements on this det
748  std::vector<TrajectoryMeasurement> mymeas_next =
749  det.fastMeasurements(detI_next.second, onLayer_next, propagatorAlong, estimator);
750 
751  for (auto const& mea_next : mymeas_next) {
752  // save valid measurements
753  if (mea_next.recHit()->isValid())
754  meas_next.push_back(mea_next);
755 
756  } // end loop over mymeas_next
757  } // end loop over dets_next
758 
759  // sort valid measurements found on this layer
760  std::sort(meas_next.begin(), meas_next.end(), TrajMeasLessEstim());
761 
762  // loop over valid measurements compatible with updated TSOS (TSOS updated with a hit on the first layer)
763  for (auto const& mea_next : meas_next) {
764  if (nmeas >= max_meas)
765  break; // skip if we already found enough hits
766 
767  // try to update TSOS again, with an additional hit
768  updatedTSOS_next = updator_->update(mea_next.forwardPredictedState(), *mea_next.recHit());
769 
770  if (not updatedTSOS_next.isValid())
771  continue; // skip if TSOS updated with additional hit is not valid
772 
773  // If there was a compatible hit on this layer, we end up here.
774  // An additional compatible hit is saved.
775  seedHits.push_back(*mea_next.recHit()->hit());
776  det_id = mea_next.recHit()->geographicalId().rawId();
777  nmeas++;
778  found_compatible_on_next_layer++;
779 
780  } // end loop over meas_next
781 
782  addtnl_layers_scanned++;
783 
784  } // end loop over compLayers (additional layers scanned after the original layer)
785 
786  if (found_compatible_on_next_layer == 0)
787  continue;
788  // only consider the hit if there was a compatible hit on one of the additional scanned layers
789 
790  // Create a seed from two saved hits
791  PTrajectoryStateOnDet const& pstate = trajectoryStateTransform::persistentState(updatedTSOS_next, det_id);
792  TrajectorySeed seed(pstate, std::move(seedHits), oppositeToMomentum);
793 
794  LogTrace("TSGForOIDNN") << "TSGForOIDNN::makeSeedsFromHitDoublets: Number of seedHits: " << seedHits.size();
795  out.push_back(seed);
796 
797  found++;
798  numSeedsMade++;
799  hitDoubletSeedsMade++;
800 
801  if (found == numOfHitsToTry_)
802  break; // break if enough measurements scanned
803 
804  } // end loop over measurements compatible with original TSOS
805 
806  if (found)
807  layerCount++;
808 }
809 
810 //
811 // Update the dictionary of variables to use as input features for DNN
812 //
813 void TSGForOIDNN::updateFeatureMap(std::unordered_map<std::string, float>& the_map,
814  const reco::Track& l2,
815  const TrajectoryStateOnSurface& tsos_IP,
816  const TrajectoryStateOnSurface& tsos_MuS) const {
817  the_map["pt"] = l2.pt();
818  the_map["eta"] = l2.eta();
819  the_map["phi"] = l2.phi();
820  the_map["validHits"] = l2.found();
821  if (tsos_IP.isValid()) {
822  the_map["tsos_IP_eta"] = tsos_IP.globalPosition().eta();
823  the_map["tsos_IP_phi"] = tsos_IP.globalPosition().phi();
824  the_map["tsos_IP_pt"] = tsos_IP.globalMomentum().perp();
825  the_map["tsos_IP_pt_eta"] = tsos_IP.globalMomentum().eta();
826  the_map["tsos_IP_pt_phi"] = tsos_IP.globalMomentum().phi();
827  const AlgebraicSymMatrix55& matrix_IP = tsos_IP.curvilinearError().matrix();
828  the_map["err0_IP"] = sqrt(matrix_IP[0][0]);
829  the_map["err1_IP"] = sqrt(matrix_IP[1][1]);
830  the_map["err2_IP"] = sqrt(matrix_IP[2][2]);
831  the_map["err3_IP"] = sqrt(matrix_IP[3][3]);
832  the_map["err4_IP"] = sqrt(matrix_IP[4][4]);
833  the_map["tsos_IP_valid"] = 1.0;
834  } else {
835  the_map["tsos_IP_eta"] = -999;
836  the_map["tsos_IP_phi"] = -999;
837  the_map["tsos_IP_pt"] = -999;
838  the_map["tsos_IP_pt_eta"] = -999;
839  the_map["tsos_IP_pt_phi"] = -999;
840  the_map["err0_IP"] = -999;
841  the_map["err1_IP"] = -999;
842  the_map["err2_IP"] = -999;
843  the_map["err3_IP"] = -999;
844  the_map["err4_IP"] = -999;
845  the_map["tsos_IP_valid"] = 0.0;
846  }
847  if (tsos_MuS.isValid()) {
848  the_map["tsos_MuS_eta"] = tsos_MuS.globalPosition().eta();
849  the_map["tsos_MuS_phi"] = tsos_MuS.globalPosition().phi();
850  the_map["tsos_MuS_pt"] = tsos_MuS.globalMomentum().perp();
851  the_map["tsos_MuS_pt_eta"] = tsos_MuS.globalMomentum().eta();
852  the_map["tsos_MuS_pt_phi"] = tsos_MuS.globalMomentum().phi();
853  const AlgebraicSymMatrix55& matrix_MuS = tsos_MuS.curvilinearError().matrix();
854  the_map["err0_MuS"] = sqrt(matrix_MuS[0][0]);
855  the_map["err1_MuS"] = sqrt(matrix_MuS[1][1]);
856  the_map["err2_MuS"] = sqrt(matrix_MuS[2][2]);
857  the_map["err3_MuS"] = sqrt(matrix_MuS[3][3]);
858  the_map["err4_MuS"] = sqrt(matrix_MuS[4][4]);
859  the_map["tsos_MuS_valid"] = 1.0;
860  } else {
861  the_map["tsos_MuS_eta"] = -999;
862  the_map["tsos_MuS_phi"] = -999;
863  the_map["tsos_MuS_pt"] = -999;
864  the_map["tsos_MuS_pt_eta"] = -999;
865  the_map["tsos_MuS_pt_phi"] = -999;
866  the_map["err0_MuS"] = -999;
867  the_map["err1_MuS"] = -999;
868  the_map["err2_MuS"] = -999;
869  the_map["err3_MuS"] = -999;
870  the_map["err4_MuS"] = -999;
871  the_map["tsos_MuS_valid"] = 0.0;
872  }
873 }
874 
875 //
876 // Obtain seeding strategy parameters by evaluating DNN classifier for a given muon
877 //
878 void TSGForOIDNN::evaluateClassifier(const std::unordered_map<std::string, float>& feature_map,
879  tensorflow::Session* session,
880  const pt::ptree& metadata,
882  bool& dnnSuccess) const {
883  int n_features = metadata.get<int>("n_features", 0);
884 
885  // Prepare tensor for DNN inputs
886  tensorflow::Tensor input(tensorflow::DT_FLOAT, {1, n_features});
888  int i_feature = 0;
889  for (const pt::ptree::value_type& feature : metadata.get_child("feature_names")) {
890  fname = feature.second.data();
891  if (feature_map.find(fname) == feature_map.end()) {
892  // don't evaluate DNN if any input feature is missing
893  dnnSuccess = false;
894  } else {
895  input.matrix<float>()(0, i_feature) = float(feature_map.at(fname));
896  i_feature++;
897  }
898  }
899 
900  // Prepare tensor for DNN outputs
901  std::vector<tensorflow::Tensor> outputs;
902 
903  // Evaluate DNN and put results in output tensor
904  std::string inputLayer = metadata.get<std::string>("input_layer");
905  std::string outputLayer = metadata.get<std::string>("output_layer");
906 
907  tensorflow::run(session, {{inputLayer, input}}, {outputLayer}, &outputs);
908  tensorflow::Tensor out_tensor = outputs[0];
909  tensorflow::TTypes<float, 1>::Matrix dnn_outputs = out_tensor.matrix<float>();
910 
911  // Find output with largest prediction
912  int imax = 0;
913  float out_max = 0;
914  for (long long int i = 0; i < out_tensor.dim_size(1); i++) {
915  float ith_output = dnn_outputs(0, i);
916  if (ith_output > out_max) {
917  imax = i;
918  out_max = ith_output;
919  }
920  }
921 
922  // Decode output
923  const std::string label = "output_labels.label_" + std::to_string(imax);
924  out.nHBd = metadata.get<int>(label + ".nHBd");
925  out.nHLIP = metadata.get<int>(label + ".nHLIP");
926  out.nHLMuS = metadata.get<int>(label + ".nHLMuS");
927  out.sf = metadata.get<int>(label + ".SF");
928 
929  dnnSuccess = true;
930 }
931 
932 //
933 // Obtain seeding strategy parameters by evaluating DNN regressor for a given muon
934 //
935 void TSGForOIDNN::evaluateRegressor(const std::unordered_map<std::string, float>& feature_map,
936  tensorflow::Session* session_HB,
937  const pt::ptree& metadata_HB,
938  tensorflow::Session* session_HLIP,
939  const pt::ptree& metadata_HLIP,
940  tensorflow::Session* session_HLMuS,
941  const pt::ptree& metadata_HLMuS,
943  bool& dnnSuccess) const {
944  int n_features = metadata_HB.get<int>("n_features", 0);
945 
946  // Prepare tensor for DNN inputs
947  tensorflow::Tensor input(tensorflow::DT_FLOAT, {1, n_features});
949  int i_feature = 0;
950  for (const pt::ptree::value_type& feature : metadata_HB.get_child("feature_names")) {
951  fname = feature.second.data();
952  if (feature_map.find(fname) == feature_map.end()) {
953  // don't evaluate DNN if any input feature is missing
954  dnnSuccess = false;
955  } else {
956  input.matrix<float>()(0, i_feature) = float(feature_map.at(fname));
957  i_feature++;
958  }
959  }
960 
961  // Prepare tensor for DNN outputs
962  std::vector<tensorflow::Tensor> outputs_HB;
963  // Evaluate DNN and put results in output tensor
964  std::string inputLayer_HB = metadata_HB.get<std::string>("input_layer");
965  std::string outputLayer_HB = metadata_HB.get<std::string>("output_layer");
966  tensorflow::run(session_HB, {{inputLayer_HB, input}}, {outputLayer_HB}, &outputs_HB);
967  tensorflow::Tensor out_tensor_HB = outputs_HB[0];
968  tensorflow::TTypes<float, 1>::Matrix dnn_outputs_HB = out_tensor_HB.matrix<float>();
969 
970  // Prepare tensor for DNN outputs
971  std::vector<tensorflow::Tensor> outputs_HLIP;
972  // Evaluate DNN and put results in output tensor
973  std::string inputLayer_HLIP = metadata_HLIP.get<std::string>("input_layer");
974  std::string outputLayer_HLIP = metadata_HLIP.get<std::string>("output_layer");
975  tensorflow::run(session_HLIP, {{inputLayer_HLIP, input}}, {outputLayer_HLIP}, &outputs_HLIP);
976  tensorflow::Tensor out_tensor_HLIP = outputs_HLIP[0];
977  tensorflow::TTypes<float, 1>::Matrix dnn_outputs_HLIP = out_tensor_HLIP.matrix<float>();
978 
979  // Prepare tensor for DNN outputs
980  std::vector<tensorflow::Tensor> outputs_HLMuS;
981  // Evaluate DNN and put results in output tensor
982  std::string inputLayer_HLMuS = metadata_HLMuS.get<std::string>("input_layer");
983  std::string outputLayer_HLMuS = metadata_HLMuS.get<std::string>("output_layer");
984  tensorflow::run(session_HLMuS, {{inputLayer_HLMuS, input}}, {outputLayer_HLMuS}, &outputs_HLMuS);
985  tensorflow::Tensor out_tensor_HLMuS = outputs_HLMuS[0];
986  tensorflow::TTypes<float, 1>::Matrix dnn_outputs_HLMuS = out_tensor_HLMuS.matrix<float>();
987 
988  // Decode output
989  out.nHBd = round(dnn_outputs_HB(0, 0));
990  out.nHLIP = round(dnn_outputs_HLIP(0, 0));
991  out.sf = round(dnn_outputs_HLIP(0, 1));
992  out.nHLMuS = round(dnn_outputs_HLMuS(0, 0));
993 
994  // Prevent prediction of negative number of seeds or too many seeds
995  out.nHBd = std::clamp(out.nHBd, 0, 10);
996  out.nHLIP = std::clamp(out.nHLIP, 0, 10);
997  out.nHLMuS = std::clamp(out.nHLMuS, 0, 10);
998 
999  // Prevent prediction of 0 seeds in total
1000  if (out.nHBd == 0 && out.nHLIP == 0 && out.nHLMuS == 0) {
1001  // default strategy, similar to Run 2
1002  out.nHBd = 1;
1003  out.nHLIP = 5;
1004  }
1005 
1006  // Prevent extreme predictions for scale factors
1007  // (on average SF=2 was found to be optimal)
1008  if (out.sf <= 0)
1009  out.sf = 2;
1010  if (out.sf > 10)
1011  out.sf = 10;
1012 
1013  dnnSuccess = true;
1014 }
1015 
1016 //
1017 // Default values of configuration parameters
1018 //
1021  desc.add<edm::InputTag>("src", edm::InputTag("hltL2Muons", "UpdatedAtVtx"));
1022  desc.add<int>("layersToTry", 2);
1023  desc.add<double>("fixedErrorRescaleFactorForHitless", 2.0);
1024  desc.add<int>("hitsToTry", 1);
1025  desc.add<edm::InputTag>("MeasurementTrackerEvent", edm::InputTag("hltSiStripClusters"));
1026  desc.add<std::string>("estimator", "hltESPChi2MeasurementEstimator100");
1027  desc.add<double>("maxEtaForTOB", 1.8);
1028  desc.add<double>("minEtaForTEC", 0.7);
1029  desc.addUntracked<bool>("debug", false);
1030  desc.add<unsigned int>("maxSeeds", 20);
1031  desc.add<unsigned int>("maxHitlessSeeds", 5);
1032  desc.add<unsigned int>("maxHitSeeds", 1);
1033  desc.add<std::string>("propagatorName", "PropagatorWithMaterialParabolicMf");
1034  desc.add<unsigned int>("maxHitlessSeedsIP", 5);
1035  desc.add<unsigned int>("maxHitlessSeedsMuS", 0);
1036  desc.add<unsigned int>("maxHitDoubletSeeds", 0);
1037  desc.add<bool>("getStrategyFromDNN", false);
1038  desc.add<bool>("useRegressor", false);
1039  desc.add<std::string>("dnnMetadataPath", "");
1040  descriptions.add("tsgForOIDNN", desc);
1041 }
1042 
const unsigned int numOfHitsToTry_
How many hits to try per layer.
Definition: TSGForOIDNN.cc:73
std::string dnnModelPath_HLIP_
Definition: TSGForOIDNN.cc:101
const unsigned int maxSeeds_
Maximum number of seeds for each L2.
Definition: TSGForOIDNN.cc:65
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
void evaluateRegressor(const std::unordered_map< std::string, float > &feature_map, tensorflow::Session *session_HB, const pt::ptree &metadata_HB, tensorflow::Session *session_HLIP, const pt::ptree &metadata_HLIP, tensorflow::Session *session_HLMuS, const pt::ptree &metadata_HLMuS, StrategyParameters &out, bool &dnnSuccess) const
Evaluate DNN regressor.
Definition: TSGForOIDNN.cc:935
T perp() const
Definition: PV3DBase.h:69
void updateFeatureMap(std::unordered_map< std::string, float > &the_map, const reco::Track &l2, const TrajectoryStateOnSurface &tsos_IP, const TrajectoryStateOnSurface &tsos_MuS) const
Update dictionary of inputs for DNN.
Definition: TSGForOIDNN.cc:813
std::string dnnModelPath_HLMuS_
Definition: TSGForOIDNN.cc:102
void beginJob() override
Definition: TSGForOIDNN.cc:251
tensorflow::Session * tf_session_HLMuS_
Definition: TSGForOIDNN.cc:108
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
const edm::ESGetToken< NavigationSchool, NavigationSchoolRecord > t_navSchool_
Definition: TSGForOIDNN.cc:58
const edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > t_geometryH_
Definition: TSGForOIDNN.cc:57
const edm::EDGetTokenT< MeasurementTrackerEvent > measurementTrackerTag_
Definition: TSGForOIDNN.cc:61
std::vector< TrajectoryMeasurement > fastMeasurements(const TrajectoryStateOnSurface &stateOnThisDet, const TrajectoryStateOnSurface &tsos2, const Propagator &prop, const MeasurementEstimator &est) const
GraphDef * loadGraphDef(const std::string &pbFile)
Definition: TensorFlow.cc:119
void makeSeedsFromHitDoublets(const GeometricSearchDet &layer, const TrajectoryStateOnSurface &tsos, const Propagator &propagatorAlong, const Chi2MeasurementEstimatorBase &estimator, const MeasurementTrackerEvent &measurementTracker, const NavigationSchool &navSchool, unsigned int &hitDoubletSeedsMade, unsigned int &numSeedsMade, const unsigned int &maxHitDoubletSeeds, unsigned int &layerCount, std::vector< TrajectorySeed > &out) const
Similar to makeSeedsFromHits, but seed is created only if there are compatible hits on two adjacent l...
Definition: TSGForOIDNN.cc:629
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
tensorflow::Session * tf_session_HB_
Definition: TSGForOIDNN.cc:104
const unsigned int maxHitlessSeedsMuS_
Definition: TSGForOIDNN.cc:86
T eta() const
Definition: PV3DBase.h:73
const edm::EDGetTokenT< reco::TrackCollection > src_
Labels for input collections.
Definition: TSGForOIDNN.cc:50
const unsigned int maxHitlessSeedsIP_
Definition: TSGForOIDNN.cc:85
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
std::unique_ptr< tensorflow::GraphDef > graphDef_HLIP_
Definition: TSGForOIDNN.cc:105
const edm::ESGetToken< Chi2MeasurementEstimatorBase, TrackingComponentsRecord > t_estimatorH_
Tokens for ESHandle.
Definition: TSGForOIDNN.cc:52
const double minEtaForTEC_
Minimum eta value to activate searching in the TEC.
Definition: TSGForOIDNN.cc:79
Container for DNN outupts.
Definition: TSGForOIDNN.cc:158
static std::string to_string(const XMLCh *ch)
#define LogTrace(id)
static std::string const input
Definition: EdmProvDump.cc:50
unsigned short found() const
Number of valid hits on track.
Definition: Track.h:142
static PlanePointer build(Args &&... args)
Definition: Plane.h:33
GlobalPoint position() const
double pt() const
track transverse momentum
Definition: TrackBase.h:637
char const * label
std::unique_ptr< Propagator > SetPropagationDirection(Propagator const &iprop, PropagationDirection dir)
void push_back(D *&d)
Definition: OwnVector.h:326
int iEvent
Definition: GenABIO.cc:224
const double fixedErrorRescalingForHitless_
Rescale L2 parameter uncertainties (fixed error vs pT, eta)
Definition: TSGForOIDNN.cc:75
GlobalPoint globalPosition() const
const std::string dnnMetadataPath_
DNN metadata.
Definition: TSGForOIDNN.cc:111
bool isThere(GeomDetEnumerators::SubDetector subdet) const
const std::string theCategory_
Definition: TSGForOIDNN.cc:62
T sqrt(T t)
Definition: SSEVec.h:23
const edm::ESGetToken< Propagator, TrackingComponentsRecord > t_propagatorOppositeH_
Definition: TSGForOIDNN.cc:55
const std::string estimatorName_
Estimator used to find dets and TrajectoryMeasurements.
Definition: TSGForOIDNN.cc:77
size_type size() const
Definition: OwnVector.h:300
const unsigned int maxHitSeeds_
Maximum number of hitbased seeds for each L2.
Definition: TSGForOIDNN.cc:67
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:271
bool closeSession(Session *&session)
Definition: TensorFlow.cc:233
const unsigned int maxHitDoubletSeeds_
Definition: TSGForOIDNN.cc:87
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::string dnnModelPath_
Settings for classifier.
Definition: TSGForOIDNN.cc:95
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
TSGForOIDNN(const edm::ParameterSet &iConfig)
Definition: TSGForOIDNN.cc:181
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
void initializeTensorflow() const
Definition: TSGForOIDNN.cc:286
const bool useRegressor_
Whether to use DNN regressor (if false, will use classifier)
Definition: TSGForOIDNN.cc:92
Session * createSession()
Definition: TensorFlow.cc:136
void makeSeedsWithoutHits(const GeometricSearchDet &layer, const TrajectoryStateOnSurface &tsos, const Propagator &propagatorAlong, const Chi2MeasurementEstimatorBase &estimator, double errorSF, unsigned int &hitlessSeedsMade, unsigned int &numSeedsMade, std::vector< TrajectorySeed > &out) const
Create seeds without hits on a given layer (TOB or TEC)
Definition: TSGForOIDNN.cc:523
Log< level::Info, false > LogInfo
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
const CurvilinearTrajectoryError & curvilinearError() const
const edm::ESGetToken< Propagator, TrackingComponentsRecord > t_SHPOpposite_
Definition: TSGForOIDNN.cc:59
const double maxEtaForTOB_
Maximum eta value to activate searching in the TOB.
Definition: TSGForOIDNN.cc:81
const AlgebraicSymMatrix55 & matrix() const
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
std::string dnnModelPath_HB_
Settings for regressor.
Definition: TSGForOIDNN.cc:100
void add(std::string const &label, ParameterSetDescription const &psetDescription)
GlobalVector globalMomentum() const
std::unique_ptr< tensorflow::GraphDef > graphDef_
Definition: TSGForOIDNN.cc:96
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > t_magfieldH_
Definition: TSGForOIDNN.cc:53
string fname
main script
std::unique_ptr< tensorflow::GraphDef > graphDef_HB_
Definition: TSGForOIDNN.cc:103
tensorflow::Session * tf_session_
Definition: TSGForOIDNN.cc:97
HLT enums.
FreeTrajectoryState const * freeState(bool withErrors=true) const
const edm::ESGetToken< Propagator, TrackingComponentsRecord > t_propagatorAlongH_
Definition: TSGForOIDNN.cc:54
const unsigned int numOfLayersToTry_
How many layers to try.
Definition: TSGForOIDNN.cc:71
const bool getStrategyFromDNN_
Get number of seeds to use from DNN output instead of "max..Seeds" parameters.
Definition: TSGForOIDNN.cc:90
std::unique_ptr< tensorflow::GraphDef > graphDef_HLMuS_
Definition: TSGForOIDNN.cc:107
pt::ptree metadata_
Definition: TSGForOIDNN.cc:112
const std::unique_ptr< TrajectoryStateUpdator > updator_
Definition: TSGForOIDNN.cc:60
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > t_tmpTkGeometryH_
Definition: TSGForOIDNN.cc:56
portabletest::Matrix Matrix
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
~TSGForOIDNN() override
Definition: TSGForOIDNN.cc:239
Create L3MuonTrajectorySeeds from L2 Muons in an outside-in manner.
Definition: TSGForOIDNN.cc:40
void evaluateClassifier(const std::unordered_map< std::string, float > &feature_map, tensorflow::Session *session, const pt::ptree &metadata, StrategyParameters &out, bool &dnnSuccess) const
Evaluate DNN classifier.
Definition: TSGForOIDNN.cc:878
void produce(edm::StreamID sid, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
Definition: TSGForOIDNN.cc:298
def move(src, dest)
Definition: eostools.py:511
void makeSeedsFromHits(const GeometricSearchDet &layer, const TrajectoryStateOnSurface &tsos, const Propagator &propagatorAlong, const Chi2MeasurementEstimatorBase &estimator, const MeasurementTrackerEvent &measurementTracker, unsigned int &hitSeedsMade, unsigned int &numSeedsMade, const unsigned int &maxHitSeeds, unsigned int &layerCount, std::vector< TrajectorySeed > &out) const
Find hits on a given layer (TOB or TEC) and create seeds from updated TSOS with hit.
Definition: TSGForOIDNN.cc:557
const unsigned int maxHitlessSeeds_
Maximum number of hitless seeds for each L2.
Definition: TSGForOIDNN.cc:69
TrajectoryStateOnSurface innerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
tensorflow::Session * tf_session_HLIP_
Definition: TSGForOIDNN.cc:106