1#include "Trigger/IdealClusterBuilder.h"
10void ClusterGeometry::addTp(
int tid,
int cell_id,
int module_id,
float x,
12 id_map_[tid] = std::make_pair(cell_id, module_id);
13 reverse_id_map_[std::make_pair(cell_id, module_id)] = tid;
14 positions_[tid] = std::make_pair(x, y);
16void ClusterGeometry::addNeighbor(
int id1,
int id2) {
17 neighbors_[id1].push_back(id2);
18 neighbors_[id2].push_back(id1);
21bool ClusterGeometry::checkNeighbor(
int id1,
int id2) {
23 auto& ns = neighbors_[id1];
24 return std::find(ns.begin(), ns.end(), id2) != ns.end();
26void ClusterGeometry::initialize() {
29 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
30 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
31 if (pair1 == pair2)
continue;
32 auto& id1 = pair1->first;
33 auto& id2 = pair2->first;
34 auto& xy1 = positions_[id1];
35 auto& xy2 = positions_[id2];
37 sqrt(pow(xy1.first - xy2.first, 2) + pow(xy1.second - xy2.second, 2));
38 distances_[std::make_pair(id1, id2)] = d;
39 distances_[std::make_pair(id2, id1)] = d;
43 float n_dist = 1.8 * getDist(getId(0, 0), getId(1, 0));
44 for (
auto pair1 = id_map_.begin(); pair1 != id_map_.end(); pair1++) {
45 for (
auto pair2 = pair1; pair2 != id_map_.end(); pair2++) {
46 if (pair1 == pair2)
continue;
47 if (getDist(pair1->first, pair2->first) < n_dist)
48 addNeighbor(pair1->first, pair2->first);
51 is_initialized_ =
true;
54std::vector<Cluster> IdealClusterBuilder::build2dClustersLayer(
55 std::vector<Hit> hits) {
57 std::map<int, Hit> hits_by_id;
58 for (
auto& hit : hits) hits_by_id[hit.id_] = hit;
61 cout <<
"--------\nBuild2dClustersLayer Input Hits" << endl;
62 for (
auto& hitpair : hits_by_id) hitpair.second.print();
66 std::vector<Cluster> clusters;
67 for (
auto& hitpair : hits_by_id) {
68 auto& hit = hitpair.second;
69 bool is_local_max =
true;
70 for (
auto n : g_->neighbors_[hit.id_]) {
71 if (hits_by_id.count(n) && hits_by_id[n].e_ > hit.e_)
74 if (is_local_max && (hit.e_ > seed_thresh_)) {
77 c.hits_.push_back(hit);
83 c.module_ = g_->id_map_[hit.id_].second;
84 c.layer_ = hit.layer_;
85 clusters.push_back(c);
90 cout <<
"--------\nAfter seed-finding" << endl;
91 for (
auto& hitpair : hits_by_id) hitpair.second.print();
92 for (
auto& c : clusters) c.print();
97 while (i_neighbor < n_neighbors_) {
99 std::map<int, std::vector<int> > assoc_clus2hit_i_ds;
100 for (
int iclus = 0; iclus < clusters.size(); iclus++) {
101 auto& clus = clusters[iclus];
102 std::vector<int> neighbors;
103 for (
const auto& hit : clus.hits_) {
104 for (
auto n : g_->neighbors_[hit.id_]) {
105 if (hits_by_id.count(n) && !hits_by_id[n].used_ &&
106 hits_by_id[n].e_ > neighb_thresh_) {
107 neighbors.push_back(n);
111 assoc_clus2hit_i_ds[iclus] = neighbors;
115 std::map<int, std::vector<int> > assoc_hit_i_d2clusters;
116 for (
auto clus2hit_id : assoc_clus2hit_i_ds) {
117 auto iclus = clus2hit_id.first;
118 auto& hit_i_ds = clus2hit_id.second;
119 for (
const auto& hit_id : hit_i_ds) {
120 assoc_hit_i_d2clusters[hit_id].push_back(iclus);
126 for (
auto hit_i_d2clusters : assoc_hit_i_d2clusters) {
127 auto hit_id = hit_i_d2clusters.first;
128 auto iclusters = hit_i_d2clusters.second;
129 if (iclusters.size() == 1) {
131 auto& hit = hits_by_id[hit_id];
132 auto iclus = iclusters[0];
134 clusters[iclus].hits_.push_back(hit);
135 clusters[iclus].e_ += hit.e_;
137 auto& hit = hits_by_id[hit_id];
140 for (
auto iclus : iclusters) {
141 esum += clusters[iclus].e_;
143 for (
auto iclus : iclusters) {
145 if (split_energy_) new_hit.e_ = hit.e_ * clusters[iclus].e_ / esum;
146 clusters[iclus].hits_.push_back(new_hit);
147 clusters[iclus].e_ += new_hit.e_;
153 for (
auto& c : clusters) {
162 for (
auto hit : c.hits_) {
166 float w = std::max(0., log(hit.e_ / MIN_TP_ENERGY));
170 c.xx_ += hit.x_ * hit.x_ * w;
171 c.yy_ += hit.y_ * hit.y_ * w;
172 c.zz_ += hit.z_ * hit.z_ * w;
181 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
182 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
183 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
189 cout <<
"--------\nAfter " << i_neighbor <<
" neighbors" << endl;
190 for (
auto& hitpair : hits_by_id) hitpair.second.print();
191 for (
auto& c : clusters) c.print();
198void IdealClusterBuilder::build2dClusters() {
200 std::map<int, std::vector<Hit> > layer_hits;
201 for (
const auto hit : all_hits_) {
202 layer_hits[hit.layer_].push_back(hit);
206 for (
auto& pair : layer_hits) {
208 cout <<
"Found " << pair.second.size() <<
" hits in layer " << pair.first
211 auto clus = build2dClustersLayer(pair.second);
212 all_clusters_.insert(all_clusters_.end(), clus.begin(), clus.end());
216void IdealClusterBuilder::build3dClusters() {
218 cout <<
"--------\nBuilding 3d clusters" << endl;
222 std::vector<std::vector<Cluster> > layer_clusters;
223 layer_clusters.resize(LAYER_MAX);
224 for (
auto& clus : all_clusters_) {
225 layer_clusters[clus.layer_].push_back(clus);
229 for (
auto& clusters : layer_clusters) eSort(clusters);
232 cout <<
"--------\n3d: sorted 2d inputs" << endl;
233 for (
auto& clusters : layer_clusters)
234 for (
auto& c : clusters) c.print(g_);
239 bool building =
true;
240 std::vector<Cluster> clusters3d;
244 cluster3d.is_2d_ =
false;
245 cluster3d.first_layer_ = LAYER_SHOWERMAX;
246 cluster3d.last_layer_ = LAYER_SHOWERMAX;
248 for (
int ilayer = 0; ilayer < LAYER_MAX; ilayer++) {
249 if (LAYER_SHOWERMAX + ilayer < LAYER_MAX) {
251 test_layer = LAYER_SHOWERMAX + ilayer;
254 test_layer = LAYER_MAX - ilayer - 1;
257 auto& clusters2d = layer_clusters[test_layer];
260 if (cluster3d.depth_ == 0) {
262 if (test_layer > LAYER_SEEDMAX || test_layer < LAYER_SEEDMIN)
continue;
263 if (clusters2d.size()) {
265 cout <<
" 3d seed: ";
266 clusters2d[0].print(g_);
270 cluster3d.clusters2d_.clear();
271 cluster3d.clusters2d_.push_back(clusters2d[0]);
272 cluster3d.first_layer_ = test_layer;
273 cluster3d.last_layer_ = test_layer;
274 cluster3d.depth_ = 1;
276 clusters2d.erase(clusters2d.begin());
282 auto& last_seed2d = cluster3d.clusters2d_.back().seed_;
284 if (test_layer == LAYER_SHOWERMAX - 1)
285 last_seed2d = cluster3d.clusters2d_.front().seed_;
289 cout <<
" check 3d w/ seed id " << last_seed2d << endl;
292 for (
int iclus2d = 0; iclus2d < clusters2d.size(); iclus2d++) {
294 cout <<
" -- " << iclus2d << endl;
298 auto& seed2d = clusters2d[iclus2d].seed_;
299 if (last_seed2d == seed2d || g_->checkNeighbor(last_seed2d, seed2d)) {
305 cluster3d.clusters2d_.push_back(clusters2d[iclus2d]);
307 if (test_layer < cluster3d.first_layer_)
308 cluster3d.first_layer_ = test_layer;
309 if (test_layer > cluster3d.last_layer_)
310 cluster3d.last_layer_ = test_layer;
312 clusters2d.erase(clusters2d.begin() + iclus2d);
320 if (cluster3d.depth_ == 0) {
324 if (cluster3d.depth_ >= DEPTH_GOOD) clusters3d.push_back(cluster3d);
329 for (
auto& c : clusters3d) {
338 for (
auto& c2 : c.clusters2d_) {
341 float w = std::max(0., log(c2.e_ / MIN_TP_ENERGY));
345 c.xx_ += c2.x_ * c2.x_ * w;
346 c.yy_ += c2.y_ * c2.y_ * w;
347 c.zz_ += c2.z_ * c2.z_ * w;
359 c.xx_ = sqrt(c.xx_ - c.x_ * c.x_);
360 c.yy_ = sqrt(c.yy_ - c.y_ * c.y_);
361 c.zz_ = sqrt(c.zz_ - c.z_ * c.z_);
366 cout <<
"--------\nFound 3d clusters" << endl;
367 for (
auto& c : clusters3d) c.print3d();
394 all_clusters_.clear();
395 all_clusters_.insert(all_clusters_.begin(), clusters3d.begin(),
399void IdealClusterBuilder::buildClusters() {
401 cout <<
"--------\nAll hits" << endl;
402 for (
auto& hit : all_hits_) hit.print();
407 std::map<int, Hit> towers;
408 for (
const auto hit : all_hits_) {
409 if (towers.count(hit.id_)) {
410 towers[hit.id_].e_ += hit.e_;
411 towers[hit.id_].n_sub_hit_++;
413 towers[hit.id_] = hit;
414 towers[hit.id_].layer_ = 0;
415 towers[hit.id_].z_ = 0;
416 towers[hit.id_].n_sub_hit_ = 1;
420 for (
const auto t : towers) all_hits_.push_back(t.second);
423 cout <<
"--------\nHits after towers" << endl;
424 for (
auto& hit : all_hits_) hit.print();
434 eSort(all_clusters_);
437void IdealClusterBuilder::fit(
Cluster& c3) {
442 if (c3.clusters2d_.size() < 4)
return;
445 std::vector<float> x;
446 std::vector<float> y;
447 std::vector<float> z;
448 for (
const auto& c2 : c3.clusters2d_) {
454 TGraph gxz(z.size(), z.data(), x.data());
455 auto r_xz = gxz.Fit(
"pol1",
"SQ");
456 c3.dxdz_ = r_xz->Value(1);
457 c3.dxdze_ = r_xz->ParError(1);
459 TGraph gyz(z.size(), z.data(), y.data());
460 auto r_yz = gyz.Fit(
"pol1",
"SQ");
461 c3.dydz_ = r_yz->Value(1);
462 c3.dydze_ = r_yz->ParError(1);