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 neighbors_[id1].push_back(id2);
13 neighbors_[id2].push_back(id1);
16bool ClusterGeometry::checkNeighbor(
int id1,
int id2) {
18 auto& ns = neighbors_[id1];
19 return std::find(ns.begin(), ns.end(), id2) != ns.end();
21void ClusterGeometry::initialize() {
24 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
25 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
26 if (pair1 == pair2)
continue;
27 auto& id1 = pair1->first;
28 auto& id2 = pair2->first;
29 auto& xy1 = positions_[id1];
30 auto& xy2 = positions_[id2];
32 sqrt(pow(xy1.first - xy2.first, 2) + pow(xy1.second - xy2.second, 2));
33 distances_[std::make_pair(id1, id2)] = d;
34 distances_[std::make_pair(id2, id1)] = d;
38 float n_dist = 1.8 * getDist(getId(0, 0), getId(1, 0));
39 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
40 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
41 if (pair1 == pair2)
continue;
42 if (getDist(pair1->first, pair2->first) < n_dist)
43 addNeighbor(pair1->first, pair2->first);
46 is_initialized_ =
true;
49std::vector<Cluster> IdealClusterBuilder::build2dClustersLayer(
50 std::vector<Hit> hits) {
52 std::map<int, Hit> hits_by_id;
53 for (
auto& hit : hits) hits_by_id[hit.id_] = hit;
56 cout <<
"--------\nBuild2dClustersLayer Input Hits" << endl;
57 for (
auto& hitpair : hits_by_id) hitpair.second.print();
61 std::vector<Cluster> clusters;
62 for (
auto& hitpair : hits_by_id) {
63 auto& hit = hitpair.second;
64 bool is_local_max =
true;
65 for (
auto n : g_->neighbors_[hit.id_]) {
66 if (hits_by_id.count(n) && hits_by_id[n].e_ > hit.e_)
69 if (is_local_max && (hit.e_ > seed_thresh_)) {
72 c.hits_.push_back(hit);
78 c.module_ = g_->id_map_[hit.id_].second;
79 c.layer_ = hit.layer_;
80 clusters.push_back(c);
85 cout <<
"--------\nAfter seed-finding" << endl;
86 for (
auto& hitpair : hits_by_id) hitpair.second.print();
87 for (
auto& c : clusters) c.print();
92 while (i_neighbor < n_neighbors_) {
94 std::map<int, std::vector<int> > assoc_clus2hit_i_ds;
95 for (
int iclus = 0; iclus < clusters.size(); iclus++) {
96 auto& clus = clusters[iclus];
97 std::vector<int> neighbors;
98 for (
const auto& hit : clus.hits_) {
99 for (
auto n : g_->neighbors_[hit.id_]) {
100 if (hits_by_id.count(n) && !hits_by_id[n].used_ &&
101 hits_by_id[n].e_ > neighb_thresh_) {
102 neighbors.push_back(n);
106 assoc_clus2hit_i_ds[iclus] = neighbors;
110 std::map<int, std::vector<int> > assoc_hit_i_d2clusters;
111 for (
auto clus2hit_id : assoc_clus2hit_i_ds) {
112 auto iclus = clus2hit_id.first;
113 auto& hit_i_ds = clus2hit_id.second;
114 for (
const auto& hit_id : hit_i_ds) {
115 assoc_hit_i_d2clusters[hit_id].push_back(iclus);
121 for (
auto hit_i_d2clusters : assoc_hit_i_d2clusters) {
122 auto hit_id = hit_i_d2clusters.first;
123 auto iclusters = hit_i_d2clusters.second;
124 if (iclusters.size() == 1) {
126 auto& hit = hits_by_id[hit_id];
127 auto iclus = iclusters[0];
129 clusters[iclus].hits_.push_back(hit);
130 clusters[iclus].e_ += hit.e_;
132 auto& hit = hits_by_id[hit_id];
135 for (
auto iclus : iclusters) {
136 esum += clusters[iclus].e_;
138 for (
auto iclus : iclusters) {
140 if (split_energy_) new_hit.e_ = hit.e_ * clusters[iclus].e_ / esum;
141 clusters[iclus].hits_.push_back(new_hit);
142 clusters[iclus].e_ += new_hit.e_;
148 for (
auto& c : clusters) {
157 for (
auto hit : c.hits_) {
161 float w = std::max(0., log(hit.e_ / MIN_TP_ENERGY));
165 c.xx_ += hit.x_ * hit.x_ * w;
166 c.yy_ += hit.y_ * hit.y_ * w;
167 c.zz_ += hit.z_ * hit.z_ * w;
176 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
177 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
178 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
184 cout <<
"--------\nAfter " << i_neighbor <<
" neighbors" << endl;
185 for (
auto& hitpair : hits_by_id) hitpair.second.print();
186 for (
auto& c : clusters) c.print();
193void IdealClusterBuilder::build2dClusters() {
195 std::map<int, std::vector<Hit> > layer_hits;
196 for (
const auto hit : all_hits_) {
197 layer_hits[hit.layer_].push_back(hit);
201 for (
auto& pair : layer_hits) {
203 cout <<
"Found " << pair.second.size() <<
" hits in layer " << pair.first
206 auto clus = build2dClustersLayer(pair.second);
207 all_clusters_.insert(all_clusters_.end(), clus.begin(), clus.end());
211void IdealClusterBuilder::build3dClusters() {
213 cout <<
"--------\nBuilding 3d clusters" << endl;
217 std::vector<std::vector<Cluster> > layer_clusters;
218 layer_clusters.resize(LAYER_MAX);
219 for (
auto& clus : all_clusters_) {
220 layer_clusters[clus.layer_].push_back(clus);
224 for (
auto& clusters : layer_clusters) eSort(clusters);
227 cout <<
"--------\n3d: sorted 2d inputs" << endl;
228 for (
auto& clusters : layer_clusters)
229 for (
auto& c : clusters) c.print(g_);
234 bool building =
true;
235 std::vector<Cluster> clusters3d;
239 cluster3d.is_2d_ =
false;
240 cluster3d.first_layer_ = LAYER_SHOWERMAX;
241 cluster3d.last_layer_ = LAYER_SHOWERMAX;
243 for (
int ilayer = 0; ilayer < LAYER_MAX; ilayer++) {
244 if (LAYER_SHOWERMAX + ilayer < LAYER_MAX) {
246 test_layer = LAYER_SHOWERMAX + ilayer;
249 test_layer = LAYER_MAX - ilayer - 1;
252 auto& clusters2d = layer_clusters[test_layer];
255 if (cluster3d.depth_ == 0) {
257 if (test_layer > LAYER_SEEDMAX || test_layer < LAYER_SEEDMIN)
continue;
258 if (clusters2d.size()) {
260 cout <<
" 3d seed: ";
261 clusters2d[0].print(g_);
265 cluster3d.clusters2d_.clear();
266 cluster3d.clusters2d_.push_back(clusters2d[0]);
267 cluster3d.first_layer_ = test_layer;
268 cluster3d.last_layer_ = test_layer;
269 cluster3d.depth_ = 1;
271 clusters2d.erase(clusters2d.begin());
277 auto& last_seed2d = cluster3d.clusters2d_.back().seed_;
279 if (test_layer == LAYER_SHOWERMAX - 1)
280 last_seed2d = cluster3d.clusters2d_.front().seed_;
284 cout <<
" check 3d w/ seed id " << last_seed2d << endl;
287 for (
int iclus2d = 0; iclus2d < clusters2d.size(); iclus2d++) {
289 cout <<
" -- " << iclus2d << endl;
293 auto& seed2d = clusters2d[iclus2d].seed_;
294 if (last_seed2d == seed2d || g_->checkNeighbor(last_seed2d, seed2d)) {
300 cluster3d.clusters2d_.push_back(clusters2d[iclus2d]);
302 if (test_layer < cluster3d.first_layer_)
303 cluster3d.first_layer_ = test_layer;
304 if (test_layer > cluster3d.last_layer_)
305 cluster3d.last_layer_ = test_layer;
307 clusters2d.erase(clusters2d.begin() + iclus2d);
315 if (cluster3d.depth_ == 0) {
319 if (cluster3d.depth_ >= DEPTH_GOOD) clusters3d.push_back(cluster3d);
324 for (
auto& c : clusters3d) {
333 for (
auto& c2 : c.clusters2d_) {
336 float w = std::max(0., log(c2.e_ / MIN_TP_ENERGY));
340 c.xx_ += c2.x_ * c2.x_ * w;
341 c.yy_ += c2.y_ * c2.y_ * w;
342 c.zz_ += c2.z_ * c2.z_ * w;
354 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
355 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
356 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
361 cout <<
"--------\nFound 3d clusters" << endl;
362 for (
auto& c : clusters3d) c.print3d();
389 all_clusters_.clear();
390 all_clusters_.insert(all_clusters_.begin(), clusters3d.begin(),
394void IdealClusterBuilder::buildClusters() {
396 cout <<
"--------\nAll hits" << endl;
397 for (
auto& hit : all_hits_) hit.print();
402 std::map<int, Hit> towers;
403 for (
const auto hit : all_hits_) {
404 if (towers.count(hit.id_)) {
405 towers[hit.id_].e_ += hit.e_;
406 towers[hit.id_].n_sub_hit_++;
408 towers[hit.id_] = hit;
409 towers[hit.id_].layer_ = 0;
410 towers[hit.id_].z_ = 0;
411 towers[hit.id_].n_sub_hit_ = 1;
415 for (
const auto t : towers) all_hits_.push_back(t.second);
418 cout <<
"--------\nHits after towers" << endl;
419 for (
auto& hit : all_hits_) hit.print();
429 eSort(all_clusters_);
432void IdealClusterBuilder::fit(
Cluster& c3) {
437 if (c3.clusters2d_.size() < 4)
return;
440 std::vector<float> x;
441 std::vector<float> y;
442 std::vector<float> z;
443 for (
const auto& c2 : c3.clusters2d_) {
449 TGraph gxz(z.size(), z.data(), x.data());
450 auto r_xz = gxz.Fit(
"pol1",
"SQ");
451 c3.dxdz_ = r_xz->Value(1);
452 c3.dxdze_ = r_xz->ParError(1);
454 TGraph gyz(z.size(), z.data(), y.data());
455 auto r_yz = gyz.Fit(
"pol1",
"SQ");
456 c3.dydz_ = r_yz->Value(1);
457 c3.dydze_ = r_yz->ParError(1);