61 static std::unique_ptr<TrackstersCache> initializeGlobalCache(
const edm::ParameterSet &);
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;
129 std::unique_ptr<GeomDet> firstDisk_[2];
134 static constexpr
int eidNFeatures_ = 3;
145 tracks_time_token_(consumes<
edm::ValueMap<
float>>(ps.getParameter<
edm::
InputTag>(
"tracksTime"))),
146 tracks_time_quality_token_(consumes<
edm::ValueMap<
float>>(ps.getParameter<
edm::
InputTag>(
"tracksTimeQual"))),
147 tracks_time_err_token_(consumes<
edm::ValueMap<
float>>(ps.getParameter<
edm::
InputTag>(
"tracksTimeErr"))),
149 tfDnnLabel_(ps.getParameter<
std::
string>(
"tfDnnLabel")),
153 detector_(ps.getParameter<
std::
string>(
"detector")),
154 propName_(ps.getParameter<
std::
string>(
"propagator")),
158 optimiseAcrossTracksters_(ps.getParameter<
bool>(
"optimiseAcrossTracksters")),
159 eta_bin_window_(ps.getParameter<
int>(
"eta_bin_window")),
160 phi_bin_window_(ps.getParameter<
int>(
"phi_bin_window")),
161 pt_sigma_high_(ps.getParameter<double>(
"pt_sigma_high")),
162 pt_sigma_low_(ps.getParameter<double>(
"pt_sigma_low")),
163 halo_max_distance2_(ps.getParameter<double>(
"halo_max_distance2")),
164 track_min_pt_(ps.getParameter<double>(
"track_min_pt")),
165 track_min_eta_(ps.getParameter<double>(
"track_min_eta")),
166 track_max_eta_(ps.getParameter<double>(
"track_max_eta")),
167 track_max_missing_outerhits_(ps.getParameter<
int>(
"track_max_missing_outerhits")),
168 cosangle_align_(ps.getParameter<double>(
"cosangle_align")),
169 e_over_h_threshold_(ps.getParameter<double>(
"e_over_h_threshold")),
170 pt_neutral_threshold_(ps.getParameter<double>(
"pt_neutral_threshold")),
171 resol_calo_offset_had_(ps.getParameter<double>(
"resol_calo_offset_had")),
172 resol_calo_scale_had_(ps.getParameter<double>(
"resol_calo_scale_had")),
173 resol_calo_offset_em_(ps.getParameter<double>(
"resol_calo_offset_em")),
174 resol_calo_scale_em_(ps.getParameter<double>(
"resol_calo_scale_em")),
175 eidInputName_(ps.getParameter<
std::
string>(
"eid_input_name")),
176 eidOutputNameEnergy_(ps.getParameter<
std::
string>(
"eid_output_name_energy")),
177 eidOutputNameId_(ps.getParameter<
std::
string>(
"eid_output_name_id")),
178 eidMinClusterEnergy_(ps.getParameter<double>(
"eid_min_cluster_energy")),
179 eidNLayers_(ps.getParameter<
int>(
"eid_n_layers")),
180 eidNClusters_(ps.getParameter<
int>(
"eid_n_clusters")),
181 eidSession_(nullptr) {
182 produces<std::vector<Trackster>>();
183 produces<std::vector<TICLCandidate>>();
185 std::string detectorName_ = (
detector_ ==
"HFNose") ?
"HGCalHFNoseSensitive" :
"HGCalEESensitive";
187 esConsumes<HGCalDDDConstants, IdealGeometryRecord, edm::Transition::BeginRun>(
edm::ESInputTag(
"", detectorName_));
212 const std::vector<Trackster> &tracksters,
215 for (
auto const &
t : tracksters) {
216 tracksterTile.
fill(tracksterIteration,
t.barycenter().eta(),
t.barycenter().phi(), tracksterId);
217 LogDebug(
"TrackstersMergeProducer") <<
"Adding tracksterId: " << tracksterId <<
" into bin [eta,phi]: [ " 218 << tracksterTile[tracksterIteration].etaBin(
t.barycenter().eta()) <<
", " 219 << tracksterTile[tracksterIteration].
phiBin(
t.barycenter().phi())
220 <<
"] for iteration: " << tracksterIteration << std::endl;
227 auto e_over_h = (
t.raw_em_pt() / ((
t.raw_pt() -
t.raw_em_pt()) != 0. ? (
t.raw_pt() -
t.raw_em_pt()) : 1.));
229 <<
"\nTrackster raw_pt: " <<
t.raw_pt() <<
" raw_em_pt: " <<
t.raw_em_pt() <<
" eoh: " << e_over_h
230 <<
" barycenter: " <<
t.barycenter() <<
" eta,phi (baricenter): " <<
t.barycenter().eta() <<
", " 231 <<
t.barycenter().phi() <<
" eta,phi (eigen): " <<
t.eigenvectors(0).eta() <<
", " <<
t.eigenvectors(0).phi()
232 <<
" pt(eigen): " <<
std::sqrt(
t.eigenvectors(0).Unit().perp2()) *
t.raw_energy() <<
" seedID: " <<
t.seedID()
233 <<
" seedIndex: " <<
t.seedIndex() <<
" size: " <<
t.vertices().size() <<
" average usage: " 234 << (std::accumulate(std::begin(
t.vertex_multiplicity()), std::end(
t.vertex_multiplicity()), 0.) /
235 (
float)
t.vertex_multiplicity().size())
236 <<
" raw_energy: " <<
t.raw_energy() <<
" regressed energy: " <<
t.regressed_energy()
237 <<
" probs(ga/e/mu/np/cp/nh/am/unk): ";
238 for (
auto const &
p :
t.id_probabilities()) {
241 LogDebug(
"TrackstersMergeProducer") <<
" sigmas: ";
242 for (
auto const &
s :
t.sigmas()) {
243 LogDebug(
"TrackstersMergeProducer") <<
s <<
" ";
245 LogDebug(
"TrackstersMergeProducer") << std::endl;
249 auto resultTrackstersMerged = std::make_unique<std::vector<Trackster>>();
250 auto resultCandidates = std::make_unique<std::vector<TICLCandidate>>();
251 auto resultFromTracks = std::make_unique<std::vector<TICLCandidate>>();
259 const auto &
tracks = *track_h;
270 track_h, trackTime, trackTimeErr, trackTimeQual,
muons, trackstersclue3d_h, *resultCandidates, *resultFromTracks);
273 LogDebug(
"TrackstersMergeProducer") <<
"Results from the linking step : " << std::endl
274 <<
"No. of Tracks : " <<
tracks.size()
275 <<
" No. of Tracksters : " << (*trackstersclue3d_h).size() << std::endl
276 <<
"(neutral candidates have track id -1)" << std::endl;
278 std::vector<TICLCandidate> &
candidates = *resultCandidates;
280 auto track_ptr =
cand.trackPtr();
281 auto trackster_ptrs =
cand.tracksters();
285 track_idx = (track_ptr.isNull()) ? -1 : track_idx;
286 LogDebug(
"TrackstersMergeProducer") <<
"PDG ID " <<
cand.pdgId() <<
" charge " <<
cand.charge() <<
" p " <<
cand.p()
288 LogDebug(
"TrackstersMergeProducer") <<
"track id (p) : " << track_idx <<
" (" 289 << (track_ptr.isNull() ? -1 : track_ptr->p()) <<
") " 290 <<
" trackster ids (E) : ";
295 auto updated_size = 0;
296 for (
const auto &ts_ptr : trackster_ptrs) {
299 LogDebug(
"TrackstersMergeProducer") << ts_idx <<
" (" << ts_ptr->raw_energy() <<
") ";
302 auto &thisTrackster = *ts_ptr;
303 updated_size += thisTrackster.vertices().size();
304 outTrackster.vertices().reserve(updated_size);
305 outTrackster.vertex_multiplicity().reserve(updated_size);
306 std::copy(std::begin(thisTrackster.vertices()),
307 std::end(thisTrackster.vertices()),
308 std::back_inserter(outTrackster.vertices()));
309 std::copy(std::begin(thisTrackster.vertex_multiplicity()),
310 std::end(thisTrackster.vertex_multiplicity()),
311 std::back_inserter(outTrackster.vertex_multiplicity()));
314 LogDebug(
"TrackstersMergeProducer") << std::endl;
317 auto &orig_vtx = outTrackster.vertices();
318 auto vtx_sorted{orig_vtx};
319 std::sort(std::begin(vtx_sorted), std::end(vtx_sorted));
320 for (
unsigned int iLC = 1; iLC < vtx_sorted.size(); ++iLC) {
321 if (vtx_sorted[iLC] == vtx_sorted[iLC - 1]) {
323 const auto lcIdx = vtx_sorted[iLC];
324 const auto firstEl =
std::find(orig_vtx.begin(), orig_vtx.end(), lcIdx);
325 const auto firstPos =
std::distance(std::begin(orig_vtx), firstEl);
327 while (iDup != orig_vtx.end()) {
328 orig_vtx.erase(iDup);
329 outTrackster.vertex_multiplicity().erase(outTrackster.vertex_multiplicity().begin() +
331 outTrackster.vertex_multiplicity()[firstPos] -= 1;
337 outTrackster.zeroProbabilities();
338 if (!track_ptr.isNull())
340 if (!outTrackster.vertices().empty()) {
341 resultTrackstersMerged->push_back(outTrackster);
352 assert(resultTrackstersMerged->size() == resultCandidates->size());
354 auto isHad = [](
const Trackster &tracksterMerge) {
359 for (
size_t i = 0;
i < resultTrackstersMerged->size();
i++) {
360 auto const &tm = (*resultTrackstersMerged)[
i];
361 auto &
cand = (*resultCandidates)[
i];
363 cand.setIdProbabilities(tm.id_probabilities());
365 if (!
cand.trackPtr().isNull()) {
366 auto pdgId = isHad(tm) ? 211 : 11;
367 auto const &tk =
cand.trackPtr().get();
369 cand.setCharge(tk->charge());
370 cand.setRawEnergy(tm.raw_energy());
371 auto const ®rE = tm.regressed_energy();
373 regrE * tk->momentum().unit().y(),
374 regrE * tk->momentum().unit().z(),
378 auto pdgId = isHad(tm) ? 130 : 22;
381 cand.setRawEnergy(tm.raw_energy());
382 const float ®rE = tm.regressed_energy();
384 regrE * tm.barycenter().unit().y(),
385 regrE * tm.barycenter().unit().z(),
390 for (
auto &
cand : *resultFromTracks) {
391 auto const &tk =
cand.trackPtr().get();
392 cand.setPdgId(211 * tk->charge());
393 cand.setCharge(tk->charge());
400 resultCandidates->insert(resultCandidates->end(), resultFromTracks->begin(), resultFromTracks->end());
408 const tensorflow::Session *eidSession,
409 std::vector<Trackster> &tracksters)
const {
432 int batchSize = (
int)tracksters.size();
433 if (batchSize == 0) {
437 for (
auto &
t : tracksters) {
438 t.setRegressedEnergy(0.
f);
439 t.zeroProbabilities();
444 tensorflow::Tensor
input(tensorflow::DT_FLOAT,
shape);
446 static constexpr
int inputDimension = 4;
448 std::vector<tensorflow::Tensor>
outputs;
458 for (
int i = 0;
i < batchSize;
i++) {
465 std::vector<int> clusterIndices(trackster.
vertices().size());
467 clusterIndices[
k] =
k;
469 sort(clusterIndices.begin(), clusterIndices.end(), [&
layerClusters, &trackster](
const int &
a,
const int &
b) {
477 for (
const int &
k : clusterIndices) {
514 for (
int i = 0;
i < batchSize; ++
i) {
515 float regressedEnergy =
517 tracksters[
i].setRegressedEnergy(regressedEnergy);
525 float *probs =
outputs[probsIdx].flat<
float>().
data();
526 int probsNumber = tracksters[0].id_probabilities().size();
527 for (
int i = 0;
i < batchSize; ++
i) {
528 tracksters[
i].setProbabilities(&probs[
i * probsNumber]);
534 for (
auto &
cand : resultCandidates) {
535 if (
cand.tracksters().size() > 1) {
538 for (
const auto &tr :
cand.tracksters()) {
539 if (tr->timeError() > 0) {
540 auto invTimeESq =
pow(tr->timeError(), -2);
541 time += tr->time() * invTimeESq;
542 timeErr += invTimeESq;
546 timeErr = 1. / timeErr;
558 for (
auto const &
t : tracksters) {
560 <<
counter++ <<
" TrackstersMergeProducer (" <<
label <<
") obj barycenter: " <<
t.barycenter()
561 <<
" eta,phi (baricenter): " <<
t.barycenter().eta() <<
", " <<
t.barycenter().phi()
562 <<
" eta,phi (eigen): " <<
t.eigenvectors(0).eta() <<
", " <<
t.eigenvectors(0).phi()
563 <<
" pt(eigen): " <<
std::sqrt(
t.eigenvectors(0).Unit().perp2()) *
t.raw_energy() <<
" seedID: " <<
t.seedID()
564 <<
" seedIndex: " <<
t.seedIndex() <<
" size: " <<
t.vertices().size() <<
" average usage: " 565 << (std::accumulate(std::begin(
t.vertex_multiplicity()), std::end(
t.vertex_multiplicity()), 0.) /
566 (
float)
t.vertex_multiplicity().size())
567 <<
" raw_energy: " <<
t.raw_energy() <<
" regressed energy: " <<
t.regressed_energy()
568 <<
" probs(ga/e/mu/np/cp/nh/am/unk): ";
569 for (
auto const &
p :
t.id_probabilities()) {
572 LogDebug(
"TrackstersMergeProducer") <<
" sigmas: ";
573 for (
auto const &
s :
t.sigmas()) {
574 LogDebug(
"TrackstersMergeProducer") <<
s <<
" ";
576 LogDebug(
"TrackstersMergeProducer") << std::endl;
598 desc.add<
bool>(
"optimiseAcrossTracksters",
true);
599 desc.add<
int>(
"eta_bin_window", 1);
600 desc.add<
int>(
"phi_bin_window", 1);
601 desc.add<
double>(
"pt_sigma_high", 2.);
602 desc.add<
double>(
"pt_sigma_low", 2.);
603 desc.add<
double>(
"halo_max_distance2", 4.);
604 desc.add<
double>(
"track_min_pt", 1.);
605 desc.add<
double>(
"track_min_eta", 1.48);
606 desc.add<
double>(
"track_max_eta", 3.);
607 desc.add<
int>(
"track_max_missing_outerhits", 5);
608 desc.add<
double>(
"cosangle_align", 0.9945);
609 desc.add<
double>(
"e_over_h_threshold", 1.);
610 desc.add<
double>(
"pt_neutral_threshold", 2.);
611 desc.add<
double>(
"resol_calo_offset_had", 1.5);
612 desc.add<
double>(
"resol_calo_scale_had", 0.15);
613 desc.add<
double>(
"resol_calo_offset_em", 1.5);
614 desc.add<
double>(
"resol_calo_scale_em", 0.15);
617 desc.add<
std::string>(
"eid_output_name_energy",
"output/regressed_energy");
618 desc.add<
std::string>(
"eid_output_name_id",
"output/id_probabilities");
619 desc.add<
double>(
"eid_min_cluster_energy", 2.5);
620 desc.add<
int>(
"eid_n_layers", 50);
621 desc.add<
int>(
"eid_n_clusters", 10);
622 descriptions.
add(
"trackstersMergeProducer",
desc);
ticl::Trackster::IterationIndex TracksterIterIndex
std::vector< NamedTensor > NamedTensorList
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
void fillTile(TICLTracksterTiles &, const std::vector< Trackster > &, TracksterIterIndex)
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
const double cosangle_align_
bool get(ProductID const &oid, Handle< PROD > &result) const
const edm::EDGetTokenT< std::vector< Trackster > > tracksters_clue3d_token_
ProductID id() const
Accessor for product ID.
void assignTimeToCandidates(std::vector< TICLCandidate > &resultCandidates) const
tensorflow::Session * eidSession_
const double halo_max_distance2_
const tensorflow::Session * tfSession_
void produce(edm::Event &, const edm::EventSetup &) override
const std::string detector_
void printTrackstersDebug(const std::vector< Trackster > &, const char *label) const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
hgcal::RecHitTools rhtools_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const edm::EDGetTokenT< std::vector< reco::CaloCluster > > clusters_token_
const double track_min_eta_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometry_token_
double phi() const
azimuthal angle of cluster centroid
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_quality_token_
static std::string const input
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
void assignPCAtoTracksters(std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, const edm::ValueMap< std::pair< float, float >> &, double, bool energyWeight=true)
const float eidMinClusterEnergy_
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
const std::string eidOutputNameId_
const double pt_sigma_low_
static constexpr int eidNFeatures_
const double pt_neutral_threshold_
T const * product() const
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_err_token_
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)
const double e_over_h_threshold_
void beginRun(edm::Run const &iEvent, edm::EventSetup const &es) override
const double resol_calo_scale_had_
void energyRegressionAndID(const std::vector< reco::CaloCluster > &layerClusters, const tensorflow::Session *, std::vector< Trackster > &result) const
std::once_flag initializeGeometry_
const bool optimiseAcrossTracksters_
const int phi_bin_window_
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Abs< T >::type abs(const T &t)
const edm::EDGetTokenT< std::vector< reco::Muon > > muons_token_
#define DEFINE_FWK_MODULE(type)
const double resol_calo_offset_em_
~TrackstersMergeProducer() override
void dumpTrackster(const Trackster &) const
const edm::EDGetTokenT< edm::ValueMap< std::pair< float, float > > > clustersTime_token_
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
const int track_max_missing_outerhits_
const std::string propName_
const std::string tfDnnLabel_
double energy() const
cluster energy
const edm::EDGetTokenT< std::vector< reco::Track > > tracks_token_
std::vector< unsigned int > & vertices()
const std::string eidOutputNameEnergy_
std::unique_ptr< LinkingAlgoBase > linkingAlgo_
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > bfield_token_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const std::string eidInputName_
TrackstersMergeProducer(const edm::ParameterSet &ps)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
edm::ESGetToken< HGCalDDDConstants, IdealGeometryRecord > hdc_token_
std::vector< float > & vertex_multiplicity()
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const double pt_sigma_high_
const double track_max_eta_
const HGCalDDDConstants * hgcons_
const double resol_calo_offset_had_
char data[epos_bytes_allocation]
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagator_token_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void fill(int index, double eta, double phi, unsigned int objectId)
const double track_min_pt_
const edm::EDGetTokenT< edm::ValueMap< float > > tracks_time_token_
double eta() const
pseudorapidity of cluster centroid
const double resol_calo_scale_em_
Power< A, B >::type pow(const A &a, const B &b)
const edm::ESGetToken< TfGraphDefWrapper, TfGraphRecord > tfDnnToken_
const int eta_bin_window_