1#include "Trigger/IdealClusterBuilder.h"
5void ClusterGeometry::addTp(
int tid,
int cell_id,
int module_id,
float x,
7 id_map_[tid] = std::make_pair(cell_id, module_id);
8 reverse_id_map_[std::make_pair(cell_id, module_id)] = tid;
9 positions_[tid] = std::make_pair(x, y);
11void ClusterGeometry::addNeighbor(
int id1,
int id2) {
12 if (neighbors_.count(id1))
13 neighbors_[id1].push_back(id2);
15 neighbors_[id1] = {id2};
16 if (neighbors_.count(id2))
17 neighbors_[id2].push_back(id1);
19 neighbors_[id2] = {id1};
22bool ClusterGeometry::checkNeighbor(
int id1,
int id2) {
24 auto &ns = neighbors_[id1];
25 return std::find(ns.begin(), ns.end(), id2) != ns.end();
27void ClusterGeometry::initialize() {
30 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
31 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
32 if (pair1 == pair2)
continue;
33 auto &id1 = pair1->first;
34 auto &id2 = pair2->first;
35 auto &xy1 = positions_[id1];
36 auto &xy2 = positions_[id2];
38 sqrt(pow(xy1.first - xy2.first, 2) + pow(xy1.second - xy2.second, 2));
39 distances_[std::make_pair(id1, id2)] = d;
40 distances_[std::make_pair(id2, id1)] = d;
44 float n_dist = 1.8 * getDist(getId(0, 0), getId(1, 0));
45 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
46 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
47 if (pair1 == pair2)
continue;
48 if (getDist(pair1->first, pair2->first) < n_dist)
49 addNeighbor(pair1->first, pair2->first);
52 is_initialized_ =
true;
55std::vector<Cluster> IdealClusterBuilder::build2dClustersLayer(
56 std::vector<Hit> hits) {
58 std::map<int, Hit> hits_by_id;
59 for (
auto &hit : hits) hits_by_id[hit.id_] = hit;
62 cout <<
"--------\nBuild2dClustersLayer Input Hits" << endl;
63 for (
auto &hitpair : hits_by_id) hitpair.second.print();
67 std::vector<Cluster> clusters;
68 for (
auto &hitpair : hits_by_id) {
69 auto &hit = hitpair.second;
70 bool is_local_max =
true;
71 for (
auto n : g_->neighbors_[hit.id_]) {
72 if (hits_by_id.count(n) && hits_by_id[n].e_ > hit.e_)
75 if (is_local_max && (hit.e_ > seed_thresh_)) {
78 c.hits_.push_back(hit);
84 c.module_ = g_->id_map_[hit.id_].second;
85 c.layer_ = hit.layer_;
86 clusters.push_back(c);
91 cout <<
"--------\nAfter seed-finding" << endl;
92 for (
auto &hitpair : hits_by_id) hitpair.second.print();
93 for (
auto &c : clusters) c.print();
98 while (i_neighbor < n_neighbors_) {
100 std::map<int, std::vector<int> > assoc_clus2hit_i_ds;
101 for (
int iclus = 0; iclus < clusters.size(); iclus++) {
102 auto &clus = clusters[iclus];
103 std::vector<int> neighbors;
104 for (
const auto &hit : clus.hits_) {
105 for (
auto n : g_->neighbors_[hit.id_]) {
106 if (hits_by_id.count(n) && !hits_by_id[n].used_ &&
107 hits_by_id[n].e_ > neighb_thresh_) {
108 neighbors.push_back(n);
112 assoc_clus2hit_i_ds[iclus] = neighbors;
116 std::map<int, std::vector<int> > assoc_hit_i_d2clusters;
117 for (
auto clus2hit_id : assoc_clus2hit_i_ds) {
118 auto iclus = clus2hit_id.first;
119 auto &hit_i_ds = clus2hit_id.second;
120 for (
const auto &hit_id : hit_i_ds) {
121 if (assoc_hit_i_d2clusters.count(hit_id))
122 assoc_hit_i_d2clusters[hit_id].push_back(iclus);
124 assoc_hit_i_d2clusters[hit_id] = {iclus};
130 for (
auto hit_i_d2clusters : assoc_hit_i_d2clusters) {
131 auto hit_id = hit_i_d2clusters.first;
132 auto iclusters = hit_i_d2clusters.second;
133 if (iclusters.size() == 1) {
135 auto &hit = hits_by_id[hit_id];
136 auto iclus = iclusters[0];
138 clusters[iclus].hits_.push_back(hit);
139 clusters[iclus].e_ += hit.e_;
141 auto &hit = hits_by_id[hit_id];
144 for (
auto iclus : iclusters) {
145 esum += clusters[iclus].e_;
147 for (
auto iclus : iclusters) {
149 if (split_energy_) new_hit.e_ = hit.e_ * clusters[iclus].e_ / esum;
150 clusters[iclus].hits_.push_back(new_hit);
151 clusters[iclus].e_ += new_hit.e_;
157 for (
auto &c : clusters) {
166 for (
auto hit : c.hits_) {
170 float w = std::max(0., log(hit.e_ / MIN_TP_ENERGY));
174 c.xx_ += hit.x_ * hit.x_ * w;
175 c.yy_ += hit.y_ * hit.y_ * w;
176 c.zz_ += hit.z_ * hit.z_ * w;
185 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
186 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
187 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
193 cout <<
"--------\nAfter " << i_neighbor <<
" neighbors" << endl;
194 for (
auto &hitpair : hits_by_id) hitpair.second.print();
195 for (
auto &c : clusters) c.print();
202void IdealClusterBuilder::build2dClusters() {
204 std::map<int, std::vector<Hit> > layer_hits;
205 for (
const auto hit : all_hits_) {
206 layer_hits[hit.layer_].push_back(hit);
210 for (
auto &pair : layer_hits) {
212 cout <<
"Found " << pair.second.size() <<
" hits in layer " << pair.first
215 auto clus = build2dClustersLayer(pair.second);
216 all_clusters_.insert(all_clusters_.end(), clus.begin(), clus.end());
220void IdealClusterBuilder::build3dClusters() {
222 cout <<
"--------\nBuilding 3d clusters" << endl;
226 std::vector<std::vector<Cluster> > layer_clusters;
227 layer_clusters.resize(LAYER_MAX);
228 for (
auto &clus : all_clusters_) {
229 layer_clusters[clus.layer_].push_back(clus);
233 for (
auto &clusters : layer_clusters) eSort(clusters);
236 cout <<
"--------\n3d: sorted 2d inputs" << endl;
237 for (
auto &clusters : layer_clusters)
238 for (
auto &c : clusters) c.print(g_);
243 bool building =
true;
244 std::vector<Cluster> clusters3d;
248 cluster3d.is_2d_ =
false;
249 cluster3d.first_layer_ = LAYER_SHOWERMAX;
250 cluster3d.last_layer_ = LAYER_SHOWERMAX;
252 for (
int ilayer = 0; ilayer < LAYER_MAX; ilayer++) {
253 if (LAYER_SHOWERMAX + ilayer < LAYER_MAX) {
255 test_layer = LAYER_SHOWERMAX + ilayer;
258 test_layer = LAYER_MAX - ilayer - 1;
261 auto &clusters2d = layer_clusters[test_layer];
264 if (cluster3d.depth_ == 0) {
266 if (test_layer > LAYER_SEEDMAX || test_layer < LAYER_SEEDMIN)
continue;
267 if (clusters2d.size()) {
269 cout <<
" 3d seed: ";
270 clusters2d[0].print(g_);
274 cluster3d.clusters2d_ = {clusters2d[0]};
275 cluster3d.first_layer_ = test_layer;
276 cluster3d.last_layer_ = test_layer;
277 cluster3d.depth_ = 1;
279 clusters2d.erase(clusters2d.begin());
285 auto &last_seed2d = cluster3d.clusters2d_.back().seed_;
287 if (test_layer == LAYER_SHOWERMAX - 1)
288 last_seed2d = cluster3d.clusters2d_.front().seed_;
292 cout <<
" check 3d w/ seed id " << last_seed2d << endl;
295 for (
int iclus2d = 0; iclus2d < clusters2d.size(); iclus2d++) {
297 cout <<
" -- " << iclus2d << endl;
301 auto &seed2d = clusters2d[iclus2d].seed_;
302 if (last_seed2d == seed2d || g_->checkNeighbor(last_seed2d, seed2d)) {
308 cluster3d.clusters2d_.push_back(clusters2d[iclus2d]);
310 if (test_layer < cluster3d.first_layer_)
311 cluster3d.first_layer_ = test_layer;
312 if (test_layer > cluster3d.last_layer_)
313 cluster3d.last_layer_ = test_layer;
315 clusters2d.erase(clusters2d.begin() + iclus2d);
323 if (cluster3d.depth_ == 0) {
327 if (cluster3d.depth_ >= DEPTH_GOOD) clusters3d.push_back(cluster3d);
332 for (
auto &c : clusters3d) {
341 for (
auto &c2 : c.clusters2d_) {
344 float w = std::max(0., log(c2.e_ / MIN_TP_ENERGY));
348 c.xx_ += c2.x_ * c2.x_ * w;
349 c.yy_ += c2.y_ * c2.y_ * w;
350 c.zz_ += c2.z_ * c2.z_ * w;
362 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
363 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
364 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
369 cout <<
"--------\nFound 3d clusters" << endl;
370 for (
auto &c : clusters3d) c.print3d();
397 all_clusters_.clear();
398 all_clusters_.insert(all_clusters_.begin(), clusters3d.begin(),
402void IdealClusterBuilder::buildClusters() {
404 cout <<
"--------\nAll hits" << endl;
405 for (
auto &hit : all_hits_) hit.print();
410 std::map<int, Hit> towers;
411 for (
const auto hit : all_hits_) {
412 if (towers.count(hit.id_)) {
413 towers[hit.id_].e_ += hit.e_;
414 towers[hit.id_].n_sub_hit_++;
416 towers[hit.id_] = hit;
417 towers[hit.id_].layer_ = 0;
418 towers[hit.id_].z_ = 0;
419 towers[hit.id_].n_sub_hit_ = 1;
423 for (
const auto t : towers) all_hits_.push_back(t.second);
426 cout <<
"--------\nHits after towers" << endl;
427 for (
auto &hit : all_hits_) hit.print();
437 eSort(all_clusters_);
440void IdealClusterBuilder::fit(
Cluster &c3) {
445 if (c3.clusters2d_.size() < 4)
return;
448 std::vector<float> x;
449 std::vector<float> y;
450 std::vector<float> z;
451 for (
const auto &c2 : c3.clusters2d_) {
457 TGraph gxz(z.size(), z.data(), x.data());
458 auto r_xz = gxz.Fit(
"pol1",
"SQ");
459 c3.dxdz_ = r_xz->Value(1);
460 c3.dxdze_ = r_xz->ParError(1);
462 TGraph gyz(z.size(), z.data(), y.data());
463 auto r_yz = gyz.Fit(
"pol1",
"SQ");
464 c3.dydz_ = r_yz->Value(1);
465 c3.dydze_ = r_yz->ParError(1);