Newer
Older
#ifndef GLOBALCLUSTERING_ALG_C
#define GLOBALCLUSTERING_ALG_C
#include "Algorithm/GlobalClusteringAlg.h"
StatusCode GlobalClusteringAlg::ReadSettings(Cyber::Settings& m_settings){
settings = m_settings;
if(settings.map_floatPars.find("unit_threshold")==settings.map_floatPars.end()) settings.map_floatPars["unit_threshold"] = 0.001;
if(settings.map_stringPars.find("InputECALBars")==settings.map_stringPars.end()) settings.map_stringPars["InputECALBars"] = "BarCol";
if(settings.map_stringPars.find("OutputECAL1DClusters")==settings.map_stringPars.end()) settings.map_stringPars["OutputECAL1DClusters"] = "Cluster1DCol";
if(settings.map_stringPars.find("OutputECALHalfClusters")==settings.map_stringPars.end()) settings.map_stringPars["OutputECALHalfClusters"] = "HalfClusterCol";
return StatusCode::SUCCESS;
};
StatusCode GlobalClusteringAlg::Initialize( CyberDataCol& m_datacol ){
m_bars.clear();
m_processbars.clear();
m_restbars.clear();
m_1dclusters.clear();
m_halfclusters.clear();
//Readin data from DataCol:
m_bars = m_datacol.map_BarCol[settings.map_stringPars["InputECALBars"]];
return StatusCode::SUCCESS;
};
StatusCode GlobalClusteringAlg::RunAlgorithm( CyberDataCol& m_datacol ){
//system("/cefs/higgs/songwz/winter22/CEPCSW/workarea/memory/memory_test.sh cluster_begin");
//time_t time_cb;
//time(&time_cb);
//cout<<" When begin clustering: "<<ctime(&time_cb)<<endl;
//Threshold and scale factor (Todo) for bars.

guofangyi@ihep.ac.cn
committed
//double totE = 0.;
//double totE_rest = 0.;
for(int ibar=0; ibar<m_bars.size(); ibar++)
{
m_processbars.push_back(m_bars.at(ibar));
// if(m_bars.at(ibar)->getEnergy()>settings.map_floatPars["unit_threshold"])
// {
// m_processbars.push_back(m_bars.at(ibar));
// //totE += m_bars.at(ibar)->getEnergy();
// }
// else
// {
// m_restbars.push_back(m_bars.at(ibar));
// //totE_rest += m_bars.at(ibar)->getEnergy();
// }

guofangyi@ihep.ac.cn
committed
//cout<<"Input bar after threshold: "<<m_processbars.size()<<", totE "<<totE<<", rest E "<<totE_rest<<endl;
//Clustering
Clustering(m_processbars, m_1dclusters);
Clustering(m_1dclusters, m_halfclusters);
//Store created objects to backup col.
m_datacol.map_1DCluster["bk1DCluster"].insert(m_datacol.map_1DCluster["bk1DCluster"].end(), m_1dclusters.begin(), m_1dclusters.end());
m_datacol.map_HalfCluster["bkHalfCluster"].insert(m_datacol.map_HalfCluster["bkHalfCluster"].end(), m_halfclusters.begin(), m_halfclusters.end());
std::vector<std::shared_ptr<Cyber::CaloHalfCluster>> m_HalfClusterV; m_HalfClusterV.clear();
std::vector<std::shared_ptr<Cyber::CaloHalfCluster>> m_HalfClusterU; m_HalfClusterU.clear();
for(int i=0; i<m_halfclusters.size() && m_halfclusters[i]; i++){
m_halfclusters[i]->setType(0);
if(m_halfclusters[i]->getSlayer()==0 && m_halfclusters[i]->getCluster().size()>0)
m_HalfClusterU.push_back(m_halfclusters[i]);
else if(m_halfclusters[i]->getSlayer()==1 && m_halfclusters[i]->getCluster().size()>0)
m_HalfClusterV.push_back(m_halfclusters[i]);
}

guofangyi@ihep.ac.cn
committed
//printf(" GlobalClustering: RestBarCol size %d, 1DCluster size %d, HalfCluster size (%d, %d) \n", m_restbars.size(), m_1dclusters.size(), m_HalfClusterU.size(), m_HalfClusterV.size());
//for(int ic=0; ic<m_HalfClusterU.size(); ic++) cout<<m_HalfClusterU[ic]->getEnergy()<<'\t';
//cout<<endl;
//for(int ic=0; ic<m_HalfClusterV.size(); ic++) cout<<m_HalfClusterV[ic]->getEnergy()<<'\t';
//cout<<endl;
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//Write results into DataCol.
//m_datacol.map_BarCol["RestBarCol"] = m_restbars;
m_datacol.map_1DCluster[settings.map_stringPars["OutputECAL1DClusters"]] = m_1dclusters;
m_datacol.map_HalfCluster[settings.map_stringPars["OutputECALHalfClusters"]+"U"] = m_HalfClusterU;
m_datacol.map_HalfCluster[settings.map_stringPars["OutputECALHalfClusters"]+"V"] = m_HalfClusterV;
//time_t time_ce;
//time(&time_ce);
//cout<<" When end clustering: "<<ctime(&time_ce)<<endl;
//system("/cefs/higgs/songwz/winter22/CEPCSW/workarea/memory/memory_test.sh cluster_end");
return StatusCode::SUCCESS;
};
StatusCode GlobalClusteringAlg::ClearAlgorithm(){
//Clear local memory
m_bars.clear();
m_processbars.clear();
m_restbars.clear();
m_1dclusters.clear();
m_halfclusters.clear();
return StatusCode::SUCCESS;
};
template<typename T1, typename T2> StatusCode GlobalClusteringAlg::Clustering(std::vector<std::shared_ptr<T1>> &m_input, std::vector<std::shared_ptr<T2>> &m_output)
{
std::vector<std::shared_ptr<T2>> record;
record.clear();
for(int i=0; i<m_input.size(); i++)
{
T1* lowlevelcluster = m_input.at(i).get();
for(int j=0; j<m_output.size(); j++)
{
if(m_output.at(j).get()->isNeighbor(lowlevelcluster)) // //m_output.at(j).isNeighbor(lowlevelcluster)
record.push_back(m_output.at(j));
}
if(record.size()>0)
{
record.at(0).get()->addUnit(lowlevelcluster);
for(int k=1; k<record.size(); k++)
{
for(int l=0; l<record.at(k).get()->getCluster().size(); l++)
{
record.at(0).get()->addUnit(record.at(k).get()->getCluster().at(l));
}
}
for(int m=1; m<record.size(); m++)
{
m_output.erase(find(m_output.begin(),m_output.end(),record.at(m)));
//delete record.at(m);
record.at(m) = nullptr;
}
record.clear();
lowlevelcluster = nullptr;
continue;
}
//T2* highlevelcluster = new T2(); //first new
std::shared_ptr<T2> highlevelcluster = std::make_shared<T2>();
highlevelcluster.get()->addUnit(lowlevelcluster);
m_output.push_back(highlevelcluster);
}
return StatusCode::SUCCESS;
//cout<<"how many neighbors: "<<number<<endl;
}
#endif