15#ifndef CLUSTERINGHELPER_H
16#define CLUSTERINGHELPER_H
35 Cluster(
const std::vector<double> &v,
const std::vector<double> &v_sigma);
37 Cluster(
const std::vector<double> &v,
const std::vector<double> &v_sigma,
73 const std::vector<double> &v_sigma);
83 const std::vector<double>&
getSigmas()
const;
147 const std::vector<Cluster<T>>&
getClusters()
const;
177 const std::vector<double> &v,
const std::vector<double> &v_sigma)
180 for (
const auto &s : v_sigma) {
189 const std::vector<double> &v,
const std::vector<double> &v_sigma,
195 for (
const auto &s : v_sigma) {
216 if (not entry_vector.empty()) {
223 const std::vector<double> &v_sigma) {
233 <<
"Cluster::getTime: ATTENTION, combi values are not initialized!"
281 std::vector<double> a_values =
a.getValues();
282 std::vector<double> b_values = b.getValues();
283 std::vector<double> a_sigmas =
a.getSigmas();
284 std::vector<double> b_sigmas = b.getSigmas();
286 std::vector<double> distances(a_values.size());
287 for (
size_t i = 0; i < a_values.size(); i++) {
288 double distance_i = 0;
289 if (a_sigmas.at(i) >= 0.0 && b_sigmas.at(i) >= 0.0) {
290 distance_i = std::abs(a_values.at(i) - b_values.at(i)) /
291 std::hypot(a_sigmas.at(i), b_sigmas.at(i));
293 distances.at(i) = distance_i;
295 double distance2 = 0.;
296 for (
double d : distances) {
299 return std::sqrt(distance2);
309 std::vector<double> a_values =
a.getValues();
310 std::vector<double> b_values = b.getValues();
311 std::vector<double> a_sigmas =
a.getSigmas();
312 std::vector<double> b_sigmas = b.getSigmas();
314 std::vector<double> new_cluster_values(a_values.size());
315 std::vector<double> new_cluster_sigmas(a_values.size());
317 for (
size_t i = 0; i < a_values.size(); i++) {
318 double value1 = a_values.at(i);
319 double value2 = b_values.at(i);
320 double var1 = std::pow(a_sigmas.at(i), 2.0);
321 double var2 = std::pow(b_sigmas.at(i), 2.0);
322 double new_cluster_value =
323 (value1 / var1 + value2 / var2) / (1.0 / var1 + 1.0 / var2);
324 double new_cluster_sigma = std::sqrt(var1 * var2 / (var1 + var2));
325 new_cluster_values.at(i) = new_cluster_value;
326 new_cluster_sigmas.at(i) = new_cluster_sigma;
328 int new_merge_iteration =
a.getMergeIteration() + b.getMergeIteration() + 1;
329 merged_cluster.
setClusterValue(new_cluster_values, new_cluster_sigmas);
332 return merged_cluster;
342 std::vector<double> a_values =
a.getValues();
343 std::vector<double> b_values = b.getValues();
344 std::vector<double> a_sigmas =
a.getSigmas();
345 std::vector<double> b_sigmas = b.getSigmas();
347 std::vector<double> new_cluster_values(a_values.size());
348 std::vector<double> new_cluster_sigmas(a_values.size());
350 for (
size_t i = 0; i < a_values.size(); i++) {
351 double value1 = a_values.at(i);
352 double value2 = b_values.at(i);
353 double sigma1 = a_sigmas.at(i);
354 double sigma2 = b_sigmas.at(i);
355 double new_cluster_value = (value1 + value2) / 2.;
356 double new_cluster_sigma = std::hypot(sigma1, sigma2);
357 new_cluster_values.at(i) = new_cluster_value;
358 new_cluster_sigmas.at(i) = new_cluster_sigma;
360 int new_merge_iteration =
a.getMergeIteration() + b.getMergeIteration() + 1;
361 merged_cluster.
setClusterValue(new_cluster_values, new_cluster_sigmas);
364 return merged_cluster;
371 if (clust.containsUnknowns()) {
372 throw std::invalid_argument(
373 "[ClusterCollection::doClustering] ERROR "
374 "- eager clustering does not allow for unknown values");
381 std::cout <<
"ClusterCollection::doTimeClustering" << std::endl;
383 double distance = 1.e30;
389 std::cout <<
"using " <<
m_clusters.size() <<
" vertices" << std::endl;
393 for (
size_t i = 0; i <
m_clusters.size(); i++) {
394 for (
size_t j = i + 1; j <
m_clusters.size(); j++) {
404 double current_distance =
406 if (current_distance <= distance) {
407 distance = current_distance;
414 std::cout <<
"using vertex " << i0 <<
" and " << j0 << std::endl;
428 std::cout <<
"starting to erase" << std::endl;
437 std::cout <<
"erase done" << std::endl;
441 std::cout <<
"new cluster stored" << std::endl;
449 [](
const Cluster<T> &c) { return c.mergeStatus(); }) !=
453 c.setMergeStatus(false);
471 int current_n = vx.getNEntries();
473 if (current_n > max_n_hits) {
474 max_n_hits = current_n;
478 else if (current_n == max_n_hits) {
483 return std::make_pair(max_n_vertex,
count);
491 if (nMaxClusters > 1) {
502 return max_cluster.getNEntries();
Cluster< T > mergeClustersMean(const Cluster< T > &a, const Cluster< T > &b)
double getDistanceBetweenClusters(const Cluster< T > &a, const Cluster< T > &b)
std::vector< Cluster< T > > m_clusters
std::pair< Cluster< T >, int > largestClusterInfo()
void setDebugLevel(int debug_level)
Cluster< T > getMaxEntriesCluster()
void doClustering(ClusterAlgo algo)
void updateDistanceCut(double cut_value)
Set the distance cut.
Cluster< T > mergeClusters(const Cluster< T > &a, const Cluster< T > &b)
Creates a new Cluster object that is a fusion of the two clusters given in the arguments.
void addCluster(const Cluster< T > &vx)
const std::vector< Cluster< T > > & getClusters() const
int getMaxClusterSize_Info()
std::vector< T > m_entries
void setMergeIteration(int iteration)
void addEntry(const T &entry)
Add an object of type T to the Cluster.
int getMergeIteration() const
void setClusterValue(const std::vector< double > &v, const std::vector< double > &v_sigma)
The value of a vertex has to be set manually.
std::vector< double > m_combined_sigma_vector
void addEntryVector(const std::vector< T > &entry_vector)
This can be used to combine the subsets stored in two vertices all in once while merging.
const std::vector< T > & getEntries() const
Return the objects that are part of the Cluster.
bool mergeStatus() const
Return true if the Cluster is the result of a merge.
void setMergeStatus(bool status)
std::vector< double > getValues() const
Return the N-dimensional value of the Cluster.
int getNEntries() const
Return the number of objects stored in the Cluster.
void setUnknownStatus(bool status)
bool containsUnknowns() const
const std::vector< double > & getSigmas() const
Return the N-dimensional resolution of the Cluster.
std::vector< double > m_combined_value_vector
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.