12 fDenseStart(false), fDenseEnd(false), fIsEM(false)
14 fHits.reserve(hits.size());
15 for (
size_t h = 0;
h < hits.size(); ++
h)
fHits.push_back(hits[
h]);
22 if (idx <
fHits.size())
33 for (
size_t h = 0;
h <
fHits.size(); ++
h)
44 if (!
fHits.size())
return 0;
48 for (
size_t h = 1;
h <
fHits.size(); ++
h)
51 if (d < dmin) { dmin =
d; hout =
fHits[
h]; idx =
h; }
60 if (!
fHits.size())
return 0;
62 TVector2
mean(0., 0.);
63 for (
size_t h = 0;
h <
fHits.size(); ++
h)
65 mean +=
fHits[
h]->Point2D();
67 mean *= 1.0 /
fHits.size();
71 for (
size_t h = 1;
h <
fHits.size(); ++
h)
74 if (d > dmax) { dmax =
d; hout =
fHits[
h]; idx =
h; }
85 for (
size_t i = 1; i <
size(); ++i)
87 const TVector2
h =
fHits[i]->Point2D();
89 if (h.X() < minimum.X()) minimum.Set(h.X(), h.Y());
90 if (h.Y() < minimum.Y()) minimum.Set(minimum.X(), h.Y());
103 for (
size_t i = 1; i <
size(); ++i)
105 const TVector2
h =
fHits[i]->Point2D();
107 if (h.X() > maximum.X()) maximum.Set(h.X(), h.Y());
108 if (h.Y() > maximum.Y()) maximum.Set(maximum.X(), h.Y());
118 for (
size_t i = 0; i <
fHits.size(); ++i)
119 if (
fHits[i] == hit)
return true;
129 for (
size_t i = 1; i <
fHits.size(); ++i)
132 if (d2 < min_d2) { min_d2 = d2; }
146 for (
size_t i = 1; i <
fHits.size(); ++i)
149 if (d2 < min_d2) { min_d2 = d2; hIdx = i; }
161 double d2, min_d2 = clu.
dist2(
fHits.front()->Point2D());
162 for (
size_t i = 1; i <
fHits.size(); ++i)
165 if (d2 < min_d2) { min_d2 = d2; }
183 bool touches =
false;
200 for (
size_t i = 0; i < c1.
size(); i++)
202 if (hitsTouching(c1[i], h2))
return true;
210 for (
unsigned int i = 0; i < c1.
size(); i++)
212 if (hitsTouching(c2, c1[i]))
return true;
226 while (i < clusters.size() - 1)
229 while (j < clusters.size())
231 if (hitsTouching(clusters[i], clusters[j]))
233 clusters[i].hits().reserve(clusters[i].
size() + clusters[i].
size());
234 for (
size_t h = 0;
h < clusters[j].size(); ++
h)
235 clusters[i].
hits().push_back(clusters[j].
hits()[
h]);
236 clusters.erase(clusters.begin() + j);
249 std::vector< tss::Cluster2D >
result;
250 for (
size_t h = 0;
h < inp.size(); ++
h)
253 for (
size_t r = 0;
r < result.size(); ++
r)
254 if (hitsTouching(result[
r], inp[
h]))
256 result[
r].hits().push_back(&(inp[h])); found =
true;
break;
261 result.back().hits().push_back(&(inp[h]));
272 std::vector< tss::Cluster2D >
result;
273 for (
size_t h = 0;
h < inp.
size(); ++
h)
276 for (
size_t r = 0;
r < result.size(); ++
r)
277 if (hitsTouching(result[
r], inp[
h]))
279 result[
r].hits().push_back(inp.
hits()[
h]); found =
true;
break;
284 result.back().hits().push_back(inp.
hits()[
h]);
TVector2 const & Point2D() const
Trivial, collect hits "touching" each other (next wire or consecutive ticks), plus Cluster2D class to...
double Dist2(const TVector2 &v1, const TVector2 &v2)
unsigned int Wire() const
std::vector< const tss::Hit2D * > fHits
const Hit2D * outermost(size_t &idx) const
double dist2(const TVector2 &p2d) const
const Hit2D * closest(const TVector2 &p2d, size_t &idx) const
const std::vector< const tss::Hit2D * > & hits(void) const
std::vector< tss::Cluster2D > run(const std::vector< tss::Hit2D > &inp) const
void merge(std::vector< tss::Cluster2D > &clusters) const
const Hit2D * release_at(size_t idx)
Detector simulation of raw signals on wires.
bool hitsTouching(const tss::Hit2D &h1, const tss::Hit2D &h2) const
bool release(const tss::Hit2D *hit)
const TVector2 max(void) const
void merge(tss::Cluster2D &clu)
const TVector2 min(void) const
bool has(const tss::Hit2D *hit) const
double mean(sqlite3 *db, std::string const &table_name, std::string const &column_name)