20 oneTracksterPerTrackSeed_(conf.getParameter<
bool>(
"oneTracksterPerTrackSeed")),
21 promoteEmptyRegionToTrackster_(conf.getParameter<
bool>(
"promoteEmptyRegionToTrackster")),
22 out_in_dfs_(conf.getParameter<
bool>(
"out_in_dfs")),
23 max_out_in_hops_(conf.getParameter<
int>(
"max_out_in_hops")),
24 min_cos_theta_(conf.getParameter<double>(
"min_cos_theta")),
25 min_cos_pointing_(conf.getParameter<double>(
"min_cos_pointing")),
26 etaLimitIncreaseWindow_(conf.getParameter<double>(
"etaLimitIncreaseWindow")),
27 missing_layers_(conf.getParameter<
int>(
"missing_layers")),
28 min_clusters_per_ntuplet_(conf.getParameter<
int>(
"min_clusters_per_ntuplet")),
29 max_delta_time_(conf.getParameter<double>(
"max_delta_time")),
30 eidInputName_(conf.getParameter<
std::
string>(
"eid_input_name")),
31 eidOutputNameEnergy_(conf.getParameter<
std::
string>(
"eid_output_name_energy")),
32 eidOutputNameId_(conf.getParameter<
std::
string>(
"eid_output_name_id")),
33 eidMinClusterEnergy_(conf.getParameter<double>(
"eid_min_cluster_energy")),
34 eidNLayers_(conf.getParameter<
int>(
"eid_n_layers")),
35 eidNClusters_(conf.getParameter<
int>(
"eid_n_clusters")),
36 eidSession_(nullptr) {
39 if (trackstersCache ==
nullptr || trackstersCache->
eidGraphDef ==
nullptr) {
41 <<
"PatternRecognitionbyCA received an empty graph definition from the global cache";
49 std::vector<Trackster> &
result,
50 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation) {
52 if (
input.regions.empty())
60 LogDebug(
"HGCPatternRecoByCA") <<
"Making Tracksters with CA" << std::endl;
63 bool isRegionalIter = (
input.regions[0].index != -1);
64 std::vector<HGCDoublet::HGCntuplet> foundNtuplets;
65 std::vector<int> seedIndices;
66 std::vector<uint8_t> layer_cluster_usage(
input.layerClusters.size(), 0);
73 input.layerClustersTime,
88 for (
auto const &ntuplet : foundNtuplets) {
89 std::set<unsigned int> effective_cluster_idx;
90 std::pair<std::set<unsigned int>::iterator,
bool> retVal;
92 std::vector<float> times;
93 std::vector<float> timeErrors;
95 for (
auto const &doublet : ntuplet) {
96 auto innerCluster =
doublets[doublet].innerClusterId();
97 auto outerCluster =
doublets[doublet].outerClusterId();
99 retVal = effective_cluster_idx.insert(innerCluster);
101 float time =
input.layerClustersTime.get(innerCluster).first;
103 times.push_back(
time);
104 timeErrors.push_back(1. /
pow(
input.layerClustersTime.get(innerCluster).second, 2));
108 retVal = effective_cluster_idx.insert(outerCluster);
110 float time =
input.layerClustersTime.get(outerCluster).first;
112 times.push_back(
time);
113 timeErrors.push_back(1. /
pow(
input.layerClustersTime.get(outerCluster).second, 2));
118 LogDebug(
"HGCPatternRecoByCA") <<
" New doublet " << doublet <<
" for trackster: " <<
result.size()
119 <<
" InnerCl " << innerCluster <<
" " <<
input.layerClusters[innerCluster].x()
120 <<
" " <<
input.layerClusters[innerCluster].y() <<
" "
121 <<
input.layerClusters[innerCluster].z() <<
" OuterCl " << outerCluster <<
" "
122 <<
input.layerClusters[outerCluster].x() <<
" "
123 <<
input.layerClusters[outerCluster].y() <<
" "
124 <<
input.layerClusters[outerCluster].z() <<
" " << tracksterId << std::endl;
127 for (
auto const i : effective_cluster_idx) {
128 layer_cluster_usage[
i]++;
130 LogDebug(
"HGCPatternRecoByCA") <<
"LayerID: " <<
i <<
" count: " << (
int)layer_cluster_usage[
i] << std::endl;
134 tmp.vertices().reserve(effective_cluster_idx.size());
135 tmp.vertex_multiplicity().resize(effective_cluster_idx.size(), 0);
138 tmp.setSeed(
input.regions[0].collectionID, seedIndices[tracksterId]);
139 if (isRegionalIter) {
140 seedToTracksterAssociation[
tmp.seedIndex()].push_back(tracksterId);
143 std::pair<float, float> timeTrackster(-99., -1.);
146 tmp.setTimeAndError(timeTrackster.first, timeTrackster.second);
152 for (
auto &trackster :
result) {
153 assert(trackster.vertices().size() <= trackster.vertex_multiplicity().size());
154 for (
size_t i = 0;
i < trackster.vertices().size(); ++
i) {
155 trackster.vertex_multiplicity()[
i] = layer_cluster_usage[trackster.vertices(
i)];
157 LogDebug(
"HGCPatternRecoByCA") <<
"LayerID: " << trackster.vertices(
i)
158 <<
" count: " << (
int)trackster.vertex_multiplicity(
i) << std::endl;
164 std::vector<Trackster>
tmp;
181 for (
auto &trackster :
result) {
182 LogDebug(
"HGCPatternRecoByCA") <<
"Trackster characteristics: " << std::endl;
183 LogDebug(
"HGCPatternRecoByCA") <<
"Size: " << trackster.vertices().size() << std::endl;
185 for (
auto const &
p : trackster.id_probabilities()) {
194 const std::vector<Trackster> &
input,
195 const std::vector<reco::CaloCluster> &layerClusters,
196 std::vector<Trackster> &
output,
197 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation)
const {
199 for (
auto &thisSeed : seedToTracksterAssociation) {
200 auto &tracksters = thisSeed.second;
201 if (!tracksters.empty()) {
202 auto numberOfTrackstersInSeed = tracksters.size();
204 auto &outTrackster =
output.back();
205 tracksters[0] =
output.size() - 1;
206 auto updated_size = outTrackster.vertices().size();
207 for (
unsigned int j = 1;
j < numberOfTrackstersInSeed; ++
j) {
208 auto &thisTrackster =
input[tracksters[
j]];
209 updated_size += thisTrackster.vertices().size();
211 LogDebug(
"HGCPatternRecoByCA") <<
"Updated size: " << updated_size << std::endl;
213 outTrackster.vertices().reserve(updated_size);
214 outTrackster.vertex_multiplicity().reserve(updated_size);
217 std::back_inserter(outTrackster.vertices()));
219 std::end(thisTrackster.vertex_multiplicity()),
220 std::back_inserter(outTrackster.vertex_multiplicity()));
222 tracksters.resize(1);
229 std::vector<Trackster> &tracksters,
230 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation,
232 for (
auto &thisSeed : seedToTracksterAssociation) {
233 if (thisSeed.second.empty()) {
235 t.setRegressedEnergy(0.
f);
236 t.zeroProbabilities();
238 t.setSeed(collectionID, thisSeed.first);
239 tracksters.emplace_back(
t);
240 thisSeed.second.emplace_back(tracksters.size() - 1);
246 std::vector<Trackster> &tracksters) {
270 std::vector<int> tracksterIndices;
271 for (
int i = 0;
i < (
int)tracksters.size();
i++) {
275 float sumClusterEnergy = 0.;
281 tracksters[
i].setRegressedEnergy(0.
f);
282 tracksters[
i].zeroProbabilities();
283 tracksterIndices.push_back(
i);
290 int batchSize = (
int)tracksterIndices.size();
291 if (batchSize == 0) {
297 tensorflow::Tensor
input(tensorflow::DT_FLOAT, shape);
300 std::vector<tensorflow::Tensor>
outputs;
310 for (
int i = 0;
i < batchSize;
i++) {
311 const Trackster &trackster = tracksters[tracksterIndices[
i]];
316 std::vector<int> clusterIndices(trackster.
vertices().size());
318 clusterIndices[
k] =
k;
320 sort(clusterIndices.begin(), clusterIndices.end(), [&layerClusters, &trackster](
const int &
a,
const int &
b) {
321 return layerClusters[trackster.
vertices(
a)].energy() > layerClusters[trackster.
vertices(
b)].energy();
328 for (
const int &
k : clusterIndices) {
365 for (
const int &
i : tracksterIndices) {
366 tracksters[
i].setRegressedEnergy(*(
energy++));
374 float *probs =
outputs[probsIdx].flat<
float>().
data();
376 for (
const int &
i : tracksterIndices) {
377 tracksters[
i].setProbabilities(probs);
378 probs += tracksters[
i].id_probabilities().size();