CMS 3D CMS Logo

TrackstersMergeProducer.cc
Go to the documentation of this file.
1 #include <memory> // unique_ptr
13 
24 
26 
30 
34 
37 
41 
44 
48 
49 #include "TrackstersPCA.h"
50 
51 using namespace ticl;
52 
54 public:
55  explicit TrackstersMergeProducer(const edm::ParameterSet &ps);
57  void produce(edm::Event &, const edm::EventSetup &) override;
58  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
59 
60  // static methods for handling the global cache
61  static std::unique_ptr<TrackstersCache> initializeGlobalCache(const edm::ParameterSet &);
62  static void globalEndJob(TrackstersCache *);
63 
64  void beginJob();
65  void endJob();
66 
67  void beginRun(edm::Run const &iEvent, edm::EventSetup const &es) override;
68 
69 private:
72 
73  void fillTile(TICLTracksterTiles &, const std::vector<Trackster> &, TracksterIterIndex);
74 
75  void energyRegressionAndID(const std::vector<reco::CaloCluster> &layerClusters,
76  const tensorflow::Session *,
77  std::vector<Trackster> &result) const;
78  void printTrackstersDebug(const std::vector<Trackster> &, const char *label) const;
79  void assignTimeToCandidates(std::vector<TICLCandidate> &resultCandidates) const;
80  void dumpTrackster(const Trackster &) const;
81 
82  std::unique_ptr<LinkingAlgoBase> linkingAlgo_;
83 
94  const tensorflow::Session *tfSession_;
95 
99 
103  const bool useMTDTiming_;
104  const int eta_bin_window_;
105  const int phi_bin_window_;
106  const double pt_sigma_high_;
107  const double pt_sigma_low_;
108  const double halo_max_distance2_;
109  const double track_min_pt_;
110  const double track_min_eta_;
111  const double track_max_eta_;
113  const double cosangle_align_;
114  const double e_over_h_threshold_;
115  const double pt_neutral_threshold_;
117  const double resol_calo_scale_had_;
118  const double resol_calo_offset_em_;
119  const double resol_calo_scale_em_;
123  const float eidMinClusterEnergy_;
124  const int eidNLayers_;
125  const int eidNClusters_;
126  std::once_flag initializeGeometry_;
127 
129 
130  std::unique_ptr<GeomDet> firstDisk_[2];
131 
132  tensorflow::Session *eidSession_;
134 
135  static constexpr int eidNFeatures_ = 3;
136 
138 };
139 
141  : tracksters_clue3d_token_(consumes<std::vector<Trackster>>(ps.getParameter<edm::InputTag>("trackstersclue3d"))),
142  clusters_token_(consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("layer_clusters"))),
143  clustersTime_token_(
144  consumes<edm::ValueMap<std::pair<float, float>>>(ps.getParameter<edm::InputTag>("layer_clustersTime"))),
145  tracks_token_(consumes<std::vector<reco::Track>>(ps.getParameter<edm::InputTag>("tracks"))),
146  tracks_time_token_(consumes<edm::ValueMap<float>>(ps.getParameter<edm::InputTag>("tracksTime"))),
147  tracks_time_quality_token_(consumes<edm::ValueMap<float>>(ps.getParameter<edm::InputTag>("tracksTimeQual"))),
148  tracks_time_err_token_(consumes<edm::ValueMap<float>>(ps.getParameter<edm::InputTag>("tracksTimeErr"))),
149  muons_token_(consumes<std::vector<reco::Muon>>(ps.getParameter<edm::InputTag>("muons"))),
150  tfDnnLabel_(ps.getParameter<std::string>("tfDnnLabel")),
151  tfDnnToken_(esConsumes(edm::ESInputTag("", tfDnnLabel_))),
152  tfSession_(nullptr),
153  geometry_token_(esConsumes<CaloGeometry, CaloGeometryRecord, edm::Transition::BeginRun>()),
154  detector_(ps.getParameter<std::string>("detector")),
155  propName_(ps.getParameter<std::string>("propagator")),
156  bfield_token_(esConsumes<MagneticField, IdealMagneticFieldRecord, edm::Transition::BeginRun>()),
157  propagator_token_(
159  optimiseAcrossTracksters_(ps.getParameter<bool>("optimiseAcrossTracksters")),
160  useMTDTiming_(ps.getParameter<bool>("useMTDTiming")),
161  eta_bin_window_(ps.getParameter<int>("eta_bin_window")),
162  phi_bin_window_(ps.getParameter<int>("phi_bin_window")),
163  pt_sigma_high_(ps.getParameter<double>("pt_sigma_high")),
164  pt_sigma_low_(ps.getParameter<double>("pt_sigma_low")),
165  halo_max_distance2_(ps.getParameter<double>("halo_max_distance2")),
166  track_min_pt_(ps.getParameter<double>("track_min_pt")),
167  track_min_eta_(ps.getParameter<double>("track_min_eta")),
168  track_max_eta_(ps.getParameter<double>("track_max_eta")),
169  track_max_missing_outerhits_(ps.getParameter<int>("track_max_missing_outerhits")),
170  cosangle_align_(ps.getParameter<double>("cosangle_align")),
171  e_over_h_threshold_(ps.getParameter<double>("e_over_h_threshold")),
172  pt_neutral_threshold_(ps.getParameter<double>("pt_neutral_threshold")),
173  resol_calo_offset_had_(ps.getParameter<double>("resol_calo_offset_had")),
174  resol_calo_scale_had_(ps.getParameter<double>("resol_calo_scale_had")),
175  resol_calo_offset_em_(ps.getParameter<double>("resol_calo_offset_em")),
176  resol_calo_scale_em_(ps.getParameter<double>("resol_calo_scale_em")),
177  eidInputName_(ps.getParameter<std::string>("eid_input_name")),
178  eidOutputNameEnergy_(ps.getParameter<std::string>("eid_output_name_energy")),
179  eidOutputNameId_(ps.getParameter<std::string>("eid_output_name_id")),
180  eidMinClusterEnergy_(ps.getParameter<double>("eid_min_cluster_energy")),
181  eidNLayers_(ps.getParameter<int>("eid_n_layers")),
182  eidNClusters_(ps.getParameter<int>("eid_n_clusters")),
183  eidSession_(nullptr) {
184  produces<std::vector<Trackster>>();
185  produces<std::vector<TICLCandidate>>();
186 
187  std::string detectorName_ = (detector_ == "HFNose") ? "HGCalHFNoseSensitive" : "HGCalEESensitive";
188  hdc_token_ =
189  esConsumes<HGCalDDDConstants, IdealGeometryRecord, edm::Transition::BeginRun>(edm::ESInputTag("", detectorName_));
190 
191  auto linkingPSet = ps.getParameter<edm::ParameterSet>("linkingPSet");
192  auto algoType = linkingPSet.getParameter<std::string>("type");
193  linkingAlgo_ = LinkingAlgoFactory::get()->create(algoType, linkingPSet);
194 }
195 
197 
199 
202  hgcons_ = hdc.product();
203 
206 
209 
210  linkingAlgo_->initialize(hgcons_, rhtools_, bfield, propagator);
211 };
212 
214  const std::vector<Trackster> &tracksters,
215  TracksterIterIndex tracksterIteration) {
216  int tracksterId = 0;
217  for (auto const &t : tracksters) {
218  tracksterTile.fill(tracksterIteration, t.barycenter().eta(), t.barycenter().phi(), tracksterId);
219  LogDebug("TrackstersMergeProducer") << "Adding tracksterId: " << tracksterId << " into bin [eta,phi]: [ "
220  << tracksterTile[tracksterIteration].etaBin(t.barycenter().eta()) << ", "
221  << tracksterTile[tracksterIteration].phiBin(t.barycenter().phi())
222  << "] for iteration: " << tracksterIteration << std::endl;
223 
224  tracksterId++;
225  }
226 }
227 
229  auto e_over_h = (t.raw_em_pt() / ((t.raw_pt() - t.raw_em_pt()) != 0. ? (t.raw_pt() - t.raw_em_pt()) : 1.));
230  LogDebug("TrackstersMergeProducer")
231  << "\nTrackster raw_pt: " << t.raw_pt() << " raw_em_pt: " << t.raw_em_pt() << " eoh: " << e_over_h
232  << " barycenter: " << t.barycenter() << " eta,phi (baricenter): " << t.barycenter().eta() << ", "
233  << t.barycenter().phi() << " eta,phi (eigen): " << t.eigenvectors(0).eta() << ", " << t.eigenvectors(0).phi()
234  << " pt(eigen): " << std::sqrt(t.eigenvectors(0).Unit().perp2()) * t.raw_energy() << " seedID: " << t.seedID()
235  << " seedIndex: " << t.seedIndex() << " size: " << t.vertices().size() << " average usage: "
236  << (std::accumulate(std::begin(t.vertex_multiplicity()), std::end(t.vertex_multiplicity()), 0.) /
237  (float)t.vertex_multiplicity().size())
238  << " raw_energy: " << t.raw_energy() << " regressed energy: " << t.regressed_energy()
239  << " probs(ga/e/mu/np/cp/nh/am/unk): ";
240  for (auto const &p : t.id_probabilities()) {
241  LogDebug("TrackstersMergeProducer") << std::fixed << p << " ";
242  }
243  LogDebug("TrackstersMergeProducer") << " sigmas: ";
244  for (auto const &s : t.sigmas()) {
245  LogDebug("TrackstersMergeProducer") << s << " ";
246  }
247  LogDebug("TrackstersMergeProducer") << std::endl;
248 }
249 
251  auto resultTrackstersMerged = std::make_unique<std::vector<Trackster>>();
252  auto resultCandidates = std::make_unique<std::vector<TICLCandidate>>();
253  auto resultFromTracks = std::make_unique<std::vector<TICLCandidate>>();
254  tfSession_ = es.getData(tfDnnToken_).getSession();
255 
256  edm::Handle<std::vector<Trackster>> trackstersclue3d_h;
257  evt.getByToken(tracksters_clue3d_token_, trackstersclue3d_h);
258 
260  evt.getByToken(tracks_token_, track_h);
261  const auto &tracks = *track_h;
262 
263  const auto &layerClusters = evt.get(clusters_token_);
264  const auto &layerClustersTimes = evt.get(clustersTime_token_);
265  const auto &muons = evt.get(muons_token_);
267  edm::Handle<edm::ValueMap<float>> trackTimeErr_h;
268  edm::Handle<edm::ValueMap<float>> trackTimeQual_h;
269  if (useMTDTiming_) {
270  evt.getByToken(tracks_time_token_, trackTime_h);
271  evt.getByToken(tracks_time_err_token_, trackTimeErr_h);
272  evt.getByToken(tracks_time_quality_token_, trackTimeQual_h);
273  }
274 
275  // Linking
276  linkingAlgo_->linkTracksters(track_h,
277  trackTime_h,
278  trackTimeErr_h,
279  trackTimeQual_h,
280  muons,
281  trackstersclue3d_h,
283  *resultCandidates,
284  *resultFromTracks);
285 
286  // Print debug info
287  LogDebug("TrackstersMergeProducer") << "Results from the linking step : " << std::endl
288  << "No. of Tracks : " << tracks.size()
289  << " No. of Tracksters : " << (*trackstersclue3d_h).size() << std::endl
290  << "(neutral candidates have track id -1)" << std::endl;
291 
292  std::vector<TICLCandidate> &candidates = *resultCandidates;
293  for (const auto &cand : candidates) {
294  auto track_ptr = cand.trackPtr();
295  auto trackster_ptrs = cand.tracksters();
296 
297  auto track_idx = track_ptr.get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
298  track_idx = (track_ptr.isNull()) ? -1 : track_idx;
299 #ifdef EDM_ML_DEBUG
300  LogDebug("TrackstersMergeProducer") << "PDG ID " << cand.pdgId() << " charge " << cand.charge() << " p " << cand.p()
301  << std::endl;
302  LogDebug("TrackstersMergeProducer") << "track id (p) : " << track_idx << " ("
303  << (track_ptr.isNull() ? -1 : track_ptr->p()) << ") "
304  << " trackster ids (E) : ";
305 #endif
306 
307  // Merge included tracksters
308  ticl::Trackster outTrackster;
309  outTrackster.setTrackIdx(track_idx);
310  auto updated_size = 0;
311  for (const auto &ts_ptr : trackster_ptrs) {
312 #ifdef EDM_ML_DEBUG
313  auto ts_idx = ts_ptr.get() - (edm::Ptr<ticl::Trackster>(trackstersclue3d_h, 0)).get();
314  LogDebug("TrackstersMergeProducer") << ts_idx << " (" << ts_ptr->raw_energy() << ") ";
315 #endif
316 
317  auto &thisTrackster = *ts_ptr;
318  updated_size += thisTrackster.vertices().size();
319  outTrackster.vertices().reserve(updated_size);
320  outTrackster.vertex_multiplicity().reserve(updated_size);
321  std::copy(std::begin(thisTrackster.vertices()),
322  std::end(thisTrackster.vertices()),
323  std::back_inserter(outTrackster.vertices()));
324  std::copy(std::begin(thisTrackster.vertex_multiplicity()),
325  std::end(thisTrackster.vertex_multiplicity()),
326  std::back_inserter(outTrackster.vertex_multiplicity()));
327  }
328 
329  LogDebug("TrackstersMergeProducer") << std::endl;
330 
331  // Find duplicate LCs
332  auto &orig_vtx = outTrackster.vertices();
333  auto vtx_sorted{orig_vtx};
334  std::sort(std::begin(vtx_sorted), std::end(vtx_sorted));
335  for (unsigned int iLC = 1; iLC < vtx_sorted.size(); ++iLC) {
336  if (vtx_sorted[iLC] == vtx_sorted[iLC - 1]) {
337  // Clean up duplicate LCs
338  const auto lcIdx = vtx_sorted[iLC];
339  const auto firstEl = std::find(orig_vtx.begin(), orig_vtx.end(), lcIdx);
340  const auto firstPos = std::distance(std::begin(orig_vtx), firstEl);
341  auto iDup = std::find(std::next(firstEl), orig_vtx.end(), lcIdx);
342  while (iDup != orig_vtx.end()) {
343  orig_vtx.erase(iDup);
344  outTrackster.vertex_multiplicity().erase(outTrackster.vertex_multiplicity().begin() +
345  std::distance(std::begin(orig_vtx), iDup));
346  outTrackster.vertex_multiplicity()[firstPos] -= 1;
347  iDup = std::find(std::next(firstEl), orig_vtx.end(), lcIdx);
348  };
349  }
350  }
351 
352  outTrackster.zeroProbabilities();
353  if (!outTrackster.vertices().empty()) {
354  resultTrackstersMerged->push_back(outTrackster);
355  }
356  }
357 
358  assignPCAtoTracksters(*resultTrackstersMerged,
360  layerClustersTimes,
362  energyRegressionAndID(layerClusters, tfSession_, *resultTrackstersMerged);
363 
364  //filling the TICLCandidates information
365  assert(resultTrackstersMerged->size() == resultCandidates->size());
366 
367  auto isHad = [](const Trackster &tracksterMerge) {
368  return tracksterMerge.id_probability(Trackster::ParticleType::photon) +
369  tracksterMerge.id_probability(Trackster::ParticleType::electron) <
370  0.5;
371  };
372  for (size_t i = 0; i < resultTrackstersMerged->size(); i++) {
373  auto const &tm = (*resultTrackstersMerged)[i];
374  auto &cand = (*resultCandidates)[i];
375  //common properties
376  cand.setIdProbabilities(tm.id_probabilities());
377  //charged candidates
378  if (!cand.trackPtr().isNull()) {
379  auto pdgId = isHad(tm) ? 211 : 11;
380  auto const &tk = cand.trackPtr().get();
381  cand.setPdgId(pdgId * tk->charge());
382  cand.setCharge(tk->charge());
383  cand.setRawEnergy(tm.raw_energy());
384  auto const &regrE = tm.regressed_energy();
385  math::XYZTLorentzVector p4(regrE * tk->momentum().unit().x(),
386  regrE * tk->momentum().unit().y(),
387  regrE * tk->momentum().unit().z(),
388  regrE);
389  cand.setP4(p4);
390  } else { // neutral candidates
391  auto pdgId = isHad(tm) ? 130 : 22;
392  cand.setPdgId(pdgId);
393  cand.setCharge(0);
394  cand.setRawEnergy(tm.raw_energy());
395  const float &regrE = tm.regressed_energy();
396  math::XYZTLorentzVector p4(regrE * tm.barycenter().unit().x(),
397  regrE * tm.barycenter().unit().y(),
398  regrE * tm.barycenter().unit().z(),
399  regrE);
400  cand.setP4(p4);
401  }
402  }
403  for (auto &cand : *resultFromTracks) { //Tracks with no linked tracksters are promoted to charged hadron candidates
404  auto const &tk = cand.trackPtr().get();
405  cand.setPdgId(211 * tk->charge());
406  cand.setCharge(tk->charge());
407  const float energy = std::sqrt(tk->p() * tk->p() + ticl::mpion2);
408  cand.setRawEnergy(energy);
409  math::PtEtaPhiMLorentzVector p4Polar(tk->pt(), tk->eta(), tk->phi(), ticl::mpion);
410  cand.setP4(p4Polar);
411  }
412  // Compute timing
413  resultCandidates->insert(resultCandidates->end(), resultFromTracks->begin(), resultFromTracks->end());
414  assignTimeToCandidates(*resultCandidates);
415 
416  evt.put(std::move(resultTrackstersMerged));
417  evt.put(std::move(resultCandidates));
418 }
419 
420 void TrackstersMergeProducer::energyRegressionAndID(const std::vector<reco::CaloCluster> &layerClusters,
421  const tensorflow::Session *eidSession,
422  std::vector<Trackster> &tracksters) const {
423  // Energy regression and particle identification strategy:
424  //
425  // 1. Set default values for regressed energy and particle id for each trackster.
426  // 2. Store indices of tracksters whose total sum of cluster energies is above the
427  // eidMinClusterEnergy_ (GeV) threshold. Inference is not applied for soft tracksters.
428  // 3. When no trackster passes the selection, return.
429  // 4. Create input and output tensors. The batch dimension is determined by the number of
430  // selected tracksters.
431  // 5. Fill input tensors with layer cluster features. Per layer, clusters are ordered descending
432  // by energy. Given that tensor data is contiguous in memory, we can use pointer arithmetic to
433  // fill values, even with batching.
434  // 6. Zero-fill features for empty clusters in each layer.
435  // 7. Batched inference.
436  // 8. Assign the regressed energy and id probabilities to each trackster.
437  //
438  // Indices used throughout this method:
439  // i -> batch element / trackster
440  // j -> layer
441  // k -> cluster
442  // l -> feature
443 
444  // do nothing when no trackster passes the selection (3)
445  int batchSize = (int)tracksters.size();
446  if (batchSize == 0) {
447  return;
448  }
449 
450  for (auto &t : tracksters) {
451  t.setRegressedEnergy(0.f);
452  t.zeroProbabilities();
453  }
454 
455  // create input and output tensors (4)
456  tensorflow::TensorShape shape({batchSize, eidNLayers_, eidNClusters_, eidNFeatures_});
457  tensorflow::Tensor input(tensorflow::DT_FLOAT, shape);
459  static constexpr int inputDimension = 4;
460 
461  std::vector<tensorflow::Tensor> outputs;
462  std::vector<std::string> outputNames;
463  if (!eidOutputNameEnergy_.empty()) {
465  }
466  if (!eidOutputNameId_.empty()) {
467  outputNames.push_back(eidOutputNameId_);
468  }
469 
470  // fill input tensor (5)
471  for (int i = 0; i < batchSize; i++) {
472  const Trackster &trackster = tracksters[i];
473 
474  // per layer, we only consider the first eidNClusters_ clusters in terms of
475  // energy, so in order to avoid creating large / nested structures to do
476  // the sorting for an unknown number of total clusters, create a sorted
477  // list of layer cluster indices to keep track of the filled clusters
478  std::vector<int> clusterIndices(trackster.vertices().size());
479  for (int k = 0; k < (int)trackster.vertices().size(); k++) {
480  clusterIndices[k] = k;
481  }
482  sort(clusterIndices.begin(), clusterIndices.end(), [&layerClusters, &trackster](const int &a, const int &b) {
483  return layerClusters[trackster.vertices(a)].energy() > layerClusters[trackster.vertices(b)].energy();
484  });
485 
486  // keep track of the number of seen clusters per layer
487  std::vector<int> seenClusters(eidNLayers_);
488 
489  // loop through clusters by descending energy
490  for (const int &k : clusterIndices) {
491  // get features per layer and cluster and store the values directly in the input tensor
492  const reco::CaloCluster &cluster = layerClusters[trackster.vertices(k)];
493  int j = rhtools_.getLayerWithOffset(cluster.hitsAndFractions()[0].first) - 1;
494  if (j < eidNLayers_ && seenClusters[j] < eidNClusters_) {
495  // get the pointer to the first feature value for the current batch, layer and cluster
496  float *features = &input.tensor<float, inputDimension>()(i, j, seenClusters[j], 0);
497 
498  // fill features
499  *(features++) = float(cluster.energy() / float(trackster.vertex_multiplicity(k)));
500  *(features++) = float(std::abs(cluster.eta()));
501  *(features) = float(cluster.phi());
502 
503  // increment seen clusters
504  seenClusters[j]++;
505  }
506  }
507 
508  // zero-fill features of empty clusters in each layer (6)
509  for (int j = 0; j < eidNLayers_; j++) {
510  for (int k = seenClusters[j]; k < eidNClusters_; k++) {
511  float *features = &input.tensor<float, inputDimension>()(i, j, k, 0);
512  for (int l = 0; l < eidNFeatures_; l++) {
513  *(features++) = 0.f;
514  }
515  }
516  }
517  }
518 
519  // run the inference (7)
521 
522  // store regressed energy per trackster (8)
523  if (!eidOutputNameEnergy_.empty()) {
524  // get the pointer to the energy tensor, dimension is batch x 1
525  float *energy = outputs[0].flat<float>().data();
526 
527  for (int i = 0; i < batchSize; ++i) {
528  float regressedEnergy =
529  tracksters[i].raw_energy() > eidMinClusterEnergy_ ? energy[i] : tracksters[i].raw_energy();
530  tracksters[i].setRegressedEnergy(regressedEnergy);
531  }
532  }
533 
534  // store id probabilities per trackster (8)
535  if (!eidOutputNameId_.empty()) {
536  // get the pointer to the id probability tensor, dimension is batch x id_probabilities.size()
537  int probsIdx = !eidOutputNameEnergy_.empty();
538  float *probs = outputs[probsIdx].flat<float>().data();
539  int probsNumber = tracksters[0].id_probabilities().size();
540  for (int i = 0; i < batchSize; ++i) {
541  tracksters[i].setProbabilities(&probs[i * probsNumber]);
542  }
543  }
544 }
545 
546 void TrackstersMergeProducer::assignTimeToCandidates(std::vector<TICLCandidate> &resultCandidates) const {
547  for (auto &cand : resultCandidates) {
548  if (cand.tracksters().size() > 1) { // For single-trackster candidates the timing is already set
549  float time = 0.f;
550  float invTimeErr = 0.f;
551  for (const auto &tr : cand.tracksters()) {
552  if (tr->timeError() > 0) {
553  auto invTimeESq = pow(tr->timeError(), -2);
554  time += tr->time() * invTimeESq;
555  invTimeErr += invTimeESq;
556  }
557  }
558  if (invTimeErr > 0) {
559  cand.setTime(time / invTimeErr);
560  cand.setTimeError(sqrt(1.f / invTimeErr));
561  }
562  }
563  }
564 }
565 
566 void TrackstersMergeProducer::printTrackstersDebug(const std::vector<Trackster> &tracksters, const char *label) const {
567 #ifdef EDM_ML_DEBUG
568  int counter = 0;
569  for (auto const &t : tracksters) {
570  LogDebug("TrackstersMergeProducer")
571  << counter++ << " TrackstersMergeProducer (" << label << ") obj barycenter: " << t.barycenter()
572  << " eta,phi (baricenter): " << t.barycenter().eta() << ", " << t.barycenter().phi()
573  << " eta,phi (eigen): " << t.eigenvectors(0).eta() << ", " << t.eigenvectors(0).phi()
574  << " pt(eigen): " << std::sqrt(t.eigenvectors(0).Unit().perp2()) * t.raw_energy() << " seedID: " << t.seedID()
575  << " seedIndex: " << t.seedIndex() << " size: " << t.vertices().size() << " average usage: "
576  << (std::accumulate(std::begin(t.vertex_multiplicity()), std::end(t.vertex_multiplicity()), 0.) /
577  (float)t.vertex_multiplicity().size())
578  << " raw_energy: " << t.raw_energy() << " regressed energy: " << t.regressed_energy()
579  << " probs(ga/e/mu/np/cp/nh/am/unk): ";
580  for (auto const &p : t.id_probabilities()) {
581  LogDebug("TrackstersMergeProducer") << std::fixed << p << " ";
582  }
583  LogDebug("TrackstersMergeProducer") << " sigmas: ";
584  for (auto const &s : t.sigmas()) {
585  LogDebug("TrackstersMergeProducer") << s << " ";
586  }
587  LogDebug("TrackstersMergeProducer") << std::endl;
588  }
589 #endif
590 }
591 
594 
595  edm::ParameterSetDescription linkingDesc;
596  linkingDesc.addNode(edm::PluginDescription<LinkingAlgoFactory>("type", "LinkingAlgoByDirectionGeometric", true));
597  desc.add<edm::ParameterSetDescription>("linkingPSet", linkingDesc);
598 
599  desc.add<edm::InputTag>("trackstersclue3d", edm::InputTag("ticlTrackstersCLUE3DHigh"));
600  desc.add<edm::InputTag>("layer_clusters", edm::InputTag("hgcalMergeLayerClusters"));
601  desc.add<edm::InputTag>("layer_clustersTime", edm::InputTag("hgcalMergeLayerClusters", "timeLayerCluster"));
602  desc.add<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
603  desc.add<edm::InputTag>("tracksTime", edm::InputTag("tofPID:t0"));
604  desc.add<edm::InputTag>("tracksTimeQual", edm::InputTag("mtdTrackQualityMVA:mtdQualMVA"));
605  desc.add<edm::InputTag>("tracksTimeErr", edm::InputTag("tofPID:sigmat0"));
606  desc.add<edm::InputTag>("muons", edm::InputTag("muons1stStep"));
607  desc.add<std::string>("detector", "HGCAL");
608  desc.add<std::string>("propagator", "PropagatorWithMaterial");
609  desc.add<bool>("optimiseAcrossTracksters", true);
610  desc.add<bool>("useMTDTiming", true);
611  desc.add<int>("eta_bin_window", 1);
612  desc.add<int>("phi_bin_window", 1);
613  desc.add<double>("pt_sigma_high", 2.);
614  desc.add<double>("pt_sigma_low", 2.);
615  desc.add<double>("halo_max_distance2", 4.);
616  desc.add<double>("track_min_pt", 1.);
617  desc.add<double>("track_min_eta", 1.48);
618  desc.add<double>("track_max_eta", 3.);
619  desc.add<int>("track_max_missing_outerhits", 5);
620  desc.add<double>("cosangle_align", 0.9945);
621  desc.add<double>("e_over_h_threshold", 1.);
622  desc.add<double>("pt_neutral_threshold", 2.);
623  desc.add<double>("resol_calo_offset_had", 1.5);
624  desc.add<double>("resol_calo_scale_had", 0.15);
625  desc.add<double>("resol_calo_offset_em", 1.5);
626  desc.add<double>("resol_calo_scale_em", 0.15);
627  desc.add<std::string>("tfDnnLabel", "tracksterSelectionTf");
628  desc.add<std::string>("eid_input_name", "input");
629  desc.add<std::string>("eid_output_name_energy", "output/regressed_energy");
630  desc.add<std::string>("eid_output_name_id", "output/id_probabilities");
631  desc.add<double>("eid_min_cluster_energy", 2.5);
632  desc.add<int>("eid_n_layers", 50);
633  desc.add<int>("eid_n_clusters", 10);
634  descriptions.add("trackstersMergeProducer", desc);
635 }
636 
ticl::Trackster::IterationIndex TracksterIterIndex
constexpr double mpion
Definition: commons.h:12
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
std::vector< NamedTensor > NamedTensorList
Definition: TensorFlow.h:31
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
void fillTile(TICLTracksterTiles &, const std::vector< Trackster > &, TracksterIterIndex)
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:209
void setTrackIdx(int index)
Definition: Trackster.h:75
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:344
const edm::EDGetTokenT< std::vector< Trackster > > tracksters_clue3d_token_
void assignTimeToCandidates(std::vector< TICLCandidate > &resultCandidates) const
tensorflow::Session * eidSession_
const tensorflow::Session * tfSession_
void produce(edm::Event &, const edm::EventSetup &) override
void printTrackstersDebug(const std::vector< Trackster > &, const char *label) const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:528
const edm::EDGetTokenT< std::vector< reco::CaloCluster > > clusters_token_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometry_token_
muons
the two sets of parameters below are mutually exclusive, depending if RECO or ALCARECO is used the us...
Definition: DiMuonV_cfg.py:214
assert(be >=bs)
double phi() const
azimuthal angle of cluster centroid
Definition: CaloCluster.h:183
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_quality_token_
void beginJob()
Definition: Breakpoints.cc:14
static std::string const input
Definition: EdmProvDump.cc:50
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
void assignPCAtoTracksters(std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, const edm::ValueMap< std::pair< float, float >> &, double, bool energyWeight=true)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
char const * label
static constexpr int eidNFeatures_
int iEvent
Definition: GenABIO.cc:224
T const * product() const
Definition: ESHandle.h:86
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_err_token_
Definition: Muon.py:1
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)
T sqrt(T t)
Definition: SSEVec.h:19
void beginRun(edm::Run const &iEvent, edm::EventSetup const &es) override
void energyRegressionAndID(const std::vector< reco::CaloCluster > &layerClusters, const tensorflow::Session *, std::vector< Trackster > &result) const
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:281
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Transition
Definition: Transition.h:12
const edm::EDGetTokenT< std::vector< reco::Muon > > muons_token_
double f[11][100]
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void dumpTrackster(const Trackster &) const
string inputList
Definition: crabTemplate.py:6
const edm::EDGetTokenT< edm::ValueMap< std::pair< float, float > > > clustersTime_token_
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
double energy() const
cluster energy
Definition: CaloCluster.h:148
const edm::EDGetTokenT< std::vector< reco::Track > > tracks_token_
std::vector< unsigned int > & vertices()
Definition: Trackster.h:56
const std::string eidOutputNameEnergy_
std::unique_ptr< LinkingAlgoBase > linkingAlgo_
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > bfield_token_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
TrackstersMergeProducer(const edm::ParameterSet &ps)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
edm::ESGetToken< HGCalDDDConstants, IdealGeometryRecord > hdc_token_
std::vector< float > & vertex_multiplicity()
Definition: Trackster.h:57
double b
Definition: hdecay.h:120
void add(std::string const &label, ParameterSetDescription const &psetDescription)
GlobalPoint getPositionLayer(int layer, bool nose=false) const
Definition: RecHitTools.cc:152
const HGCalDDDConstants * hgcons_
void setGeometry(CaloGeometry const &)
Definition: RecHitTools.cc:79
fixed size matrix
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:80
constexpr float mpion2
Definition: commons.h:13
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagator_token_
double a
Definition: hdecay.h:121
Definition: Common.h:8
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void fill(int index, double eta, double phi, unsigned int objectId)
Definition: TICLLayerTile.h:99
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_token_
double eta() const
pseudorapidity of cluster centroid
Definition: CaloCluster.h:180
#define get
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
def move(src, dest)
Definition: eostools.py:511
unsigned int lastLayerEE(bool nose=false) const
Definition: RecHitTools.h:76
const edm::ESGetToken< TfGraphDefWrapper, TfGraphRecord > tfDnnToken_
Definition: Run.h:45
#define LogDebug(id)
unsigned int getLayerWithOffset(const DetId &) const
Definition: RecHitTools.cc:376