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)
185 const std::vector<double> &v,
const std::vector<double> &v_sigma,
const T &entry)
205 if (not entry_vector.empty()) {
212 const std::vector<double> &v_sigma) {
222 <<
"Cluster::getTime: ATTENTION, combi values are not initialized!"
270 std::vector<double> a_values =
a.getValues();
271 std::vector<double> b_values = b.getValues();
272 std::vector<double> a_sigmas =
a.getSigmas();
273 std::vector<double> b_sigmas = b.getSigmas();
275 std::vector<double> distances(a_values.size());
276 for (
size_t i = 0; i < a_values.size(); i++) {
277 double distance_i = 0;
278 if (a_sigmas.at(i) >= 0.0 && b_sigmas.at(i) >= 0.0) {
279 distance_i = std::abs(a_values.at(i) - b_values.at(i)) /
280 std::hypot(a_sigmas.at(i), b_sigmas.at(i));
282 distances.at(i) = distance_i;
284 double distance2 = 0.;
285 for (
double d : distances) {
288 return std::sqrt(distance2);
298 std::vector<double> a_values =
a.getValues();
299 std::vector<double> b_values = b.getValues();
300 std::vector<double> a_sigmas =
a.getSigmas();
301 std::vector<double> b_sigmas = b.getSigmas();
303 std::vector<double> new_cluster_values(a_values.size());
304 std::vector<double> new_cluster_sigmas(a_values.size());
306 for (
size_t i = 0; i < a_values.size(); i++) {
307 double value1 = a_values.at(i);
308 double value2 = b_values.at(i);
309 double var1 = std::pow(a_sigmas.at(i), 2.0);
310 double var2 = std::pow(b_sigmas.at(i), 2.0);
311 double new_cluster_value =
312 (value1 / var1 + value2 / var2) / (1.0 / var1 + 1.0 / var2);
313 double new_cluster_sigma = std::sqrt(var1 * var2 / (var1 + var2));
314 new_cluster_values.at(i) = new_cluster_value;
315 new_cluster_sigmas.at(i) = new_cluster_sigma;
317 int new_merge_iteration =
a.getMergeIteration() + b.getMergeIteration() + 1;
318 merged_cluster.
setClusterValue(new_cluster_values, new_cluster_sigmas);
321 return merged_cluster;
331 std::vector<double> a_values =
a.getValues();
332 std::vector<double> b_values = b.getValues();
333 std::vector<double> a_sigmas =
a.getSigmas();
334 std::vector<double> b_sigmas = b.getSigmas();
336 std::vector<double> new_cluster_values(a_values.size());
337 std::vector<double> new_cluster_sigmas(a_values.size());
339 for (
size_t i = 0; i < a_values.size(); i++) {
340 double value1 = a_values.at(i);
341 double value2 = b_values.at(i);
342 double sigma1 = a_sigmas.at(i);
343 double sigma2 = b_sigmas.at(i);
344 double new_cluster_value = (value1 + value2) / 2.;
345 double new_cluster_sigma = std::hypot(sigma1, sigma2);
346 new_cluster_values.at(i) = new_cluster_value;
347 new_cluster_sigmas.at(i) = new_cluster_sigma;
349 int new_merge_iteration =
a.getMergeIteration() + b.getMergeIteration() + 1;
350 merged_cluster.
setClusterValue(new_cluster_values, new_cluster_sigmas);
353 return merged_cluster;
360 if (clust.containsUnknowns()) {
361 throw std::invalid_argument(
362 "[ClusterCollection::doClustering] ERROR "
363 "- eager clustering does not allow for unknown values");
370 std::cout <<
"ClusterCollection::doTimeClustering" << std::endl;
372 double distance = 1.e30;
378 std::cout <<
"using " <<
m_clusters.size() <<
" vertices" << std::endl;
382 for (
size_t i = 0; i <
m_clusters.size(); i++) {
383 for (
size_t j = i + 1; j <
m_clusters.size(); j++) {
393 double current_distance =
395 if (current_distance <= distance) {
396 distance = current_distance;
403 std::cout <<
"using vertex " << i0 <<
" and " << j0 << std::endl;
417 std::cout <<
"starting to erase" << std::endl;
426 std::cout <<
"erase done" << std::endl;
430 std::cout <<
"new cluster stored" << std::endl;
438 [](
const Cluster<T> &c) { return c.mergeStatus(); }) !=
442 c.setMergeStatus(false);
460 int current_n = vx.getNEntries();
462 if (current_n > max_n_hits) {
463 max_n_hits = current_n;
467 else if (current_n == max_n_hits) {
472 return std::make_pair(max_n_vertex,
count);
480 if (nMaxClusters > 1) {
491 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
int getNEntries() const
Return the number of objects stored in the Cluster.
void setClusterValue(const std::vector< double > &v, const std::vector< double > &v_sigma)
The value of a vertex has to be set manually.
void setMergeStatus(bool status)
std::vector< double > m_combined_sigma_vector
bool containsUnknowns() const
bool mergeStatus() const
Return true if the Cluster is the result of a merge.
void setUnknownStatus(bool status)
void setMergeIteration(int iteration)
std::vector< double > getValues() const
Return the N-dimensional value of the Cluster.
int getMergeIteration() const
const std::vector< double > & getSigmas() const
Return the N-dimensional resolution of the Cluster.
const std::vector< T > & getEntries() const
Return the objects that are part of the Cluster.
void addEntry(const T &entry)
Add an object of type T to the Cluster.
std::vector< double > m_combined_value_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.
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration.