25 cutoff_ = ps.
get<
double>(
"cutoff");
26 seed_threshold_ = ps.
get<
double>(
"seed_threshold");
28 dc_ = ps.
get<
double>(
"dc");
29 rhoc_ = ps.
get<
double>(
"rhoc");
30 deltac_ = ps.
get<
double>(
"deltac");
31 deltao_ = ps.
get<
double>(
"deltao");
33 rec_hit_coll_name_ = ps.
get<std::string>(
"rec_hit_coll_name");
34 rec_hit_pass_name_ = ps.
get<std::string>(
"rec_hit_pass_name");
35 algo_coll_name_ = ps.
get<std::string>(
"algo_coll_name");
36 algo_name_ = ps.
get<std::string>(
"algo_name");
37 cluster_coll_name_ = ps.
get<std::string>(
"cluster_coll_name");
38 clue_ = ps.
get<
bool>(
"clue");
39 nbr_of_layers_ = ps.
get<
int>(
"nbr_of_layers");
40 reclustering_ = ps.
get<
bool>(
"reclustering");
41 algorithm_ = ps.
get<std::string>(
"algorithm",
"clue");
43 clue3d_.hit_ecut_ = ps.
get<
double>(
"clue3d_hit_ecut", clue3d_.hit_ecut_);
44 clue3d_.dc2d_ = ps.
get<
double>(
"clue3d_dc2d", clue3d_.dc2d_);
45 clue3d_.kernel2d_ = ps.
get<
double>(
"clue3d_kernel2d", clue3d_.kernel2d_);
46 clue3d_.deltas2d_ = ps.
get<
double>(
"clue3d_deltas2d", clue3d_.deltas2d_);
47 clue3d_.deltao2d_ = ps.
get<
double>(
"clue3d_deltao2d", clue3d_.deltao2d_);
48 clue3d_.rhoc2d_ = ps.
get<
double>(
"clue3d_rhoc2d", clue3d_.rhoc2d_);
49 clue3d_.sibling_layers_ =
50 ps.
get<
int>(
"clue3d_sibling_layers", clue3d_.sibling_layers_);
51 clue3d_.dens_xy3d_ = ps.
get<
double>(
"clue3d_dens_xy3d", clue3d_.dens_xy3d_);
52 clue3d_.kernel3d_ = ps.
get<
double>(
"clue3d_kernel3d", clue3d_.kernel3d_);
53 clue3d_.crit_xy3d_ = ps.
get<
double>(
"clue3d_crit_xy3d", clue3d_.crit_xy3d_);
55 ps.
get<
double>(
"clue3d_crit_rho3d", clue3d_.crit_rho3d_);
56 clue3d_.self_frac3d_ =
57 ps.
get<
double>(
"clue3d_self_frac3d", clue3d_.self_frac3d_);
58 clue3d_.outlier_mult3d_ =
59 ps.
get<
double>(
"clue3d_outlier_mult3d", clue3d_.outlier_mult3d_);
60 clue3d_.attach_radius_ =
61 ps.
get<
double>(
"clue3d_attach_radius", clue3d_.attach_radius_);
62 clue3d_.sc_ratio_ = ps.
get<
double>(
"clue3d_sc_ratio", clue3d_.sc_ratio_);
63 clue3d_.sc_radius_ = ps.
get<
double>(
"clue3d_sc_radius", clue3d_.sc_radius_);
64 clue3d_.sc_min_layers_ =
65 ps.
get<
int>(
"clue3d_sc_min_layers", clue3d_.sc_min_layers_);
66 clue3d_.coincide_dist_ =
67 ps.
get<
double>(
"clue3d_coincide_dist", clue3d_.coincide_dist_);
68 clue3d_.ghost_ratio_ =
69 ps.
get<
double>(
"clue3d_ghost_ratio", clue3d_.ghost_ratio_);
71 ps.
get<
double>(
"clue3d_ghost_dist", clue3d_.ghost_dist_);
72 clue3d_.min_cluster_energy_ =
73 ps.
get<
double>(
"clue3d_min_cluster_energy", clue3d_.min_cluster_energy_);
74 clue3d_.share_ = ps.
get<
bool>(
"clue3d_share", clue3d_.share_);
75 clue3d_.share_iters_ =
76 ps.
get<
int>(
"clue3d_share_iters", clue3d_.share_iters_);
77 clue3d_.share_min_energy_ =
78 ps.
get<
double>(
"clue3d_share_min_energy", clue3d_.share_min_energy_);
79 clue3d_.profile_lambda_ = ps.
get<std::vector<double>>(
80 "clue3d_profile_lambda", clue3d_.profile_lambda_);
81 clue3d_.w0_ = ps.
get<
double>(
"clue3d_w0", clue3d_.w0_);
83 ps.
get<
double>(
"clue3d_pos_window", clue3d_.pos_window_);
87 const auto& ecal_hits{
event.getCollection<
ldmx::EcalHit>(rec_hit_coll_name_,
89 if (ecal_hits.size() == 0) {
91 ldmx_log(debug) <<
"No ECal hits found";
92 std::vector<ldmx::EcalCluster> empty;
93 event.add(cluster_coll_name_, empty);
97 if (algorithm_ ==
"clue3d") {
99 auto clusters = algo.
cluster(ecal_hits);
100 std::vector<ldmx::EcalCluster> ecal_clusters;
101 for (
const auto& c : clusters) {
105 cluster.setDXDZ(c.dxdz_);
106 cluster.setDYDZ(c.dydz_);
107 cluster.setRMSXYZ(c.rms_x_, c.rms_y_, c.rms_z_);
108 cluster.setFirstLayerCentroidXYZ(c.x0_, c.y0_, c.z0_);
111 std::vector<unsigned int> ids;
112 std::vector<float> hx, hy, hz, he;
113 for (std::size_t i = 0; i < c.hits_.size(); i++) {
114 const auto& h = ecal_hits[c.hits_[i]];
115 ids.push_back(h.getID());
116 hx.push_back(h.getXPos());
117 hy.push_back(h.getYPos());
118 hz.push_back(h.getZPos());
120 he.push_back(c.frac_[i] * h.getEnergy());
124 cluster.setHitValsX(hx);
125 cluster.setHitValsY(hy);
126 cluster.setHitValsZ(hz);
127 cluster.setHitValsE(he);
128 ecal_clusters.push_back(cluster);
130 event.add(cluster_coll_name_, ecal_clusters);
132 ldmx_log(info) <<
"Using CLUE clustering algorithm";
134 cf.cluster(ecal_hits, dc_, rhoc_, deltac_, deltao_, nbr_of_layers_,
136 ldmx_log(debug) <<
"CLUE algorithm finished clustering";
137 std::vector<IntermediateCluster> interm_cluster = cf.getClusters();
138 std::vector<IntermediateCluster> f_interm_cluster =
139 cf.getFirstLayerCentroids();
140 ldmx_log(debug) <<
"Got " << interm_cluster.size() <<
" clusters with "
141 << f_interm_cluster.size() <<
" first layer centroids";
143 auto n_loops = cf.getNLoops();
144 ldmx_log(debug) <<
"Number of clustering loops: " << n_loops;
147 ldmx_log(debug) <<
"Reclustererd initial number of clusters: "
148 << cf.getInitialClusterNbr()
149 <<
", final number of clusters: "
150 << interm_cluster.size();
153 std::vector<ldmx::EcalCluster> ecal_clusters;
154 ldmx_log(debug) <<
"Filling " << interm_cluster.size()
155 <<
" clusters into ecal_clusters";
156 for (
size_t cluster_indx = 0; cluster_indx < interm_cluster.size();
160 cluster.
setEnergy(interm_cluster[cluster_indx].energy());
162 interm_cluster[cluster_indx].centroidY(),
163 interm_cluster[cluster_indx].centroidZ());
164 cluster.setFirstLayerCentroidXYZ(
165 f_interm_cluster[cluster_indx].centroidX(),
166 f_interm_cluster[cluster_indx].centroidY(),
167 f_interm_cluster[cluster_indx].centroidZ());
168 cluster.
setNHits(interm_cluster[cluster_indx].hits().size());
169 cluster.
addHits(interm_cluster[cluster_indx].hits());
170 cluster.addFirstLayerHits(f_interm_cluster[cluster_indx].hits());
172 float cl_x(0), cl_y(0), cl_z(0), cl_xx(0), cl_yy(0), cl_zz(0);
176 for (
auto hit : interm_cluster[cluster_indx].hits()) {
177 if (hit->getEnergy() < min_hit_energy_)
continue;
178 cl_w = log(hit->getEnergy()) - log(min_hit_energy_);
179 cl_x += cl_w * hit->getXPos();
180 cl_y += cl_w * hit->getYPos();
181 cl_z += cl_w * hit->getZPos();
182 cl_xx += cl_w * hit->getXPos() * hit->getXPos();
183 cl_yy += cl_w * hit->getYPos() * hit->getYPos();
184 cl_zz += cl_w * hit->getZPos() * hit->getZPos();
194 cl_xx = sqrt(cl_xx - cl_x * cl_x);
195 cl_yy = sqrt(cl_yy - cl_y * cl_y);
196 cl_zz = sqrt(cl_zz - cl_z * cl_z);
198 cluster.setRMSXYZ(cl_xx, cl_yy, cl_zz);
199 cluster.setLayer(interm_cluster[cluster_indx].layer());
200 ldmx_log(trace) <<
"Cluster " << cluster_indx
201 <<
" energy: " << cluster.getEnergy()
202 <<
", nHits: " << cluster.getNHits() <<
", centroid: ("
207 << cluster.
getRMSZ() <<
")" <<
", first layer centroid: ("
208 << cluster.getFirstLayerCentroidX() <<
", "
209 << cluster.getFirstLayerCentroidY() <<
", "
210 << cluster.getFirstLayerCentroidZ() <<
")";
212 ecal_clusters.push_back(cluster);
214 ldmx_log(debug) <<
"Filled " << ecal_clusters.size()
215 <<
" clusters into ecal_clusters";
216 event.add(cluster_coll_name_, ecal_clusters);
218 ldmx_log(info) <<
"Using simple clustering algorithm " << algo_name_;
223 if (hit.getEnergy() == 0) {
229 cf.
cluster(seed_threshold_, cutoff_);
231 std::map<int, double> c_weights = cf.
getWeights();
234 algo_result.
set(algo_name_, 3, c_weights.rbegin()->first);
239 std::map<int, double>::iterator it = c_weights.begin();
240 for (it = c_weights.begin(); it != c_weights.end(); it++) {
241 algo_result.
setWeight(it->first, it->second / 100);
244 std::vector<ldmx::EcalCluster> ecal_clusters;
245 for (
size_t cluster_indx = 0; cluster_indx < interm_cluster.size();
249 cluster.
setEnergy(interm_cluster[cluster_indx].energy());
251 interm_cluster[cluster_indx].centroidY(),
252 interm_cluster[cluster_indx].centroidZ());
253 cluster.
setNHits(interm_cluster[cluster_indx].hits().size());
254 cluster.
addHits(interm_cluster[cluster_indx].hits());
255 ecal_clusters.push_back(cluster);
258 event.add(cluster_coll_name_, ecal_clusters);
259 event.add(algo_coll_name_, algo_result);