20 std::vector<KDTree> hit_kdtree(2*(
maxlayer+1));
22 std::vector<std::array<float,2> > minpos(2*(
maxlayer+1),{ {0.0f,0.0f} }),maxpos(2*(
maxlayer+1),{ {0.0f,0.0f} });
30 std::cout <<
"-------------------------------------------------------------" << std::endl;
31 std::cout <<
"HGC Imaging algorithm invoked for " << std::endl;
38 for (
unsigned int i=0;
i<hits.
size();++
i) {
49 points[layer].emplace_back(
Hexel(hgrh,detid,isHalf,&
rhtools_),position.
x(),position.
y());
50 if(points[layer].
size()==0){
51 minpos[layer][0] = position.
x(); minpos[layer][1] = position.
y();
52 maxpos[layer][0] = position.
x(); maxpos[layer][1] = position.
y();
54 minpos[layer][0] =
std::min((
float)position.
x(),minpos[layer][0]);
55 minpos[layer][1] =
std::min((
float)position.
y(),minpos[layer][1]);
56 maxpos[layer][0] =
std::max((
float)position.
x(),maxpos[layer][0]);
57 maxpos[layer][1] =
std::max((
float)position.
y(),maxpos[layer][1]);
65 minpos[i][1],maxpos[i][1]);
67 hit_kdtree[
i].build(points[i],bounds);
82 std::vector< std::pair<DetId, float> > thisCluster;
92 std::vector<std::vector<double> > fractions;
100 for(
unsigned isub = 0; isub < fractions.size(); ++isub ) {
101 double effective_hits = 0.0;
106 for(
unsigned ihit = 0; ihit < fractions[isub].size(); ++ihit ) {
107 const double fraction = fractions[isub][ihit];
108 if( fraction > 1
e-7 ) {
111 thisCluster.emplace_back(
current_v[i][ihit].
data.detid,fraction);
118 std::cout <<
"\t******** NEW CLUSTER (SHARING) ********" << std::endl;
119 std::cout <<
"\tEff. No. of cells = " << effective_hits << std::endl;
120 std::cout <<
"\t Energy = " << energy << std::endl;
121 std::cout <<
"\t Phi = " << position.phi() << std::endl;
122 std::cout <<
"\t Eta = " << position.eta() << std::endl;
123 std::cout <<
"\t*****************************" << std::endl;
131 std::vector< KDNode >::iterator it;
134 energy += (*it).data.isHalo ? 0. : (*it).data.weight;
135 thisCluster.emplace_back(std::pair<DetId, float>((*it).data.detid,((*it).data.isHalo?0.:1.)));
139 std::cout <<
"******** NEW CLUSTER (HGCIA) ********" << std::endl;
142 std::cout <<
" Energy = " << energy << std::endl;
143 std::cout <<
" Phi = " << position.phi() << std::endl;
144 std::cout <<
" Eta = " << position.eta() << std::endl;
145 std::cout <<
"*****************************" << std::endl;
156 float total_weight = 0.;
160 for (
unsigned int i = 0;
i < v.size();
i++){
161 if(!v[
i].
data.isHalo){
162 total_weight += v[
i].data.weight;
163 x += v[
i].data.x*v[
i].data.weight;
164 y += v[
i].data.y*v[
i].data.weight;
165 z += v[
i].data.z*v[
i].data.weight;
175 const double dx = pt1.
x - pt2.
x;
176 const double dy = pt1.
y - pt2.
y;
182 double maxdensity = 0.;
183 for(
unsigned int i = 0;
i < nd.size(); ++
i){
186 std::vector<KDNode>
found;
187 lp.
search(search_box,found);
188 for(
unsigned int j = 0;
j < found.size();
j++){
190 nd[
i].data.rho += found[
j].data.weight;
191 if(nd[
i].data.rho > maxdensity) maxdensity = nd[
i].data.rho;
204 double maxdensity = 0.0;
205 int nearestHigher = -1;
209 maxdensity = nd[rs[0]].
data.rho;
216 for(
unsigned int j = 0;
j < nd.size();
j++){
218 dist = tmp > dist ? tmp : dist;
220 nd[rs[0]].data.delta = dist;
221 nd[rs[0]].data.nearestHigher = nearestHigher;
225 double max_dist = dist;
227 for(
unsigned int oi = 1; oi < nd.size(); ++oi){
229 unsigned int i = rs[oi];
234 for(
unsigned int oj = 0; oj < oi; oj++){
235 unsigned int j = rs[oj];
242 nd[
i].data.delta = dist;
243 nd[
i].data.nearestHigher = nearestHigher;
254 unsigned int clusterIndex = 0;
260 for(
unsigned int i =0;
i < nd.size(); ++
i){
264 if(nd[ds[
i]].
data.rho < maxdensity/
kappa )
continue;
267 nd[ds[
i]].data.clusterIndex = clusterIndex;
271 std::cout <<
"Cluster center is hit " << ds[
i] << std::endl;
278 if(clusterIndex==0)
return clusterIndex;
282 for(
unsigned int oi =1; oi < nd.size(); ++oi){
283 unsigned int i = rs[oi];
284 int ci = nd[
i].data.clusterIndex;
286 nd[
i].data.clusterIndex = nd[nd[
i].data.nearestHigher].data.clusterIndex;
294 std::cout <<
"resizing cluster vector by "<< clusterIndex << std::endl;
300 std::vector<double> rho_b(clusterIndex,0.);
304 for(
unsigned int i = 0;
i < nd.size(); ++
i){
305 int ci = nd[
i].data.clusterIndex;
306 bool flag_isolated =
true;
310 std::vector<KDNode>
found;
311 lp.
search(search_box,found);
313 for(
unsigned int j = 1;
j < found.size();
j++){
315 if(found[
j].
data.clusterIndex!=-1){
317 if(dist <
delta_c && found[
j].data.clusterIndex!=ci){
319 nd[
i].data.isBorder =
true;
324 if(dist <
delta_c && dist != 0. && found[
j].data.clusterIndex==ci){
326 flag_isolated =
false;
330 if(flag_isolated) nd[
i].data.isBorder =
true;
333 if(nd[
i].
data.isBorder && rho_b[ci] < nd[
i].data.rho)
334 rho_b[ci] = nd[
i].data.rho;
338 for(
unsigned int i = 0;
i < nd.size(); ++
i){
339 int ci = nd[
i].data.clusterIndex;
340 if(ci!=-1 && nd[
i].
data.rho < rho_b[ci])
341 nd[
i].data.isHalo =
true;
342 if(nd[
i].
data.clusterIndex!=-1){
355 std::cout <<
"moving cluster offset by " << clusterIndex << std::endl;
363 std::vector<unsigned>
result;
364 std::vector<bool>
seed(cluster.size(),
true);
366 for(
unsigned i = 0;
i < cluster.size(); ++
i ) {
367 for(
unsigned j = 0;
j < cluster.size(); ++
j ) {
370 if( cluster[
i].data.weight < cluster[
j].data.weight ) {
378 for(
unsigned i = 0 ;
i < cluster.size(); ++
i ) {
391 const std::vector<double>& fractions) {
392 double norm(0.0),
x(0.0),
y(0.0),
z(0.0);
393 for(
unsigned i = 0;
i < hits.size(); ++
i ) {
394 const double weight = fractions[
i]*hits[
i].data.weight;
396 x += weight*hits[
i].data.x;
397 y += weight*hits[
i].data.y;
398 z += weight*hits[
i].data.z;
401 double norm_inv = 1.0/norm;
407 const std::vector<double>& fractions) {
409 for(
unsigned i = 0 ;
i < hits.size(); ++
i ) {
410 result += fractions[
i]*hits[
i].data.weight;
416 const std::vector<unsigned>& seeds,
417 std::vector<std::vector<double> >& outclusters) {
418 std::vector<bool> isaseed(incluster.size(),
false);
420 outclusters.resize(seeds.size());
421 std::vector<Point> centroids(seeds.size());
422 std::vector<double> energies(seeds.size());
424 if( seeds.size() == 1 ) {
425 outclusters[0].clear();
426 outclusters[0].resize(incluster.size(),1.0);
433 for(
unsigned i = 0;
i < seeds.size(); ++
i ) {
434 isaseed[seeds[
i]] =
true;
443 for(
unsigned i = 0;
i < seeds.size(); ++
i ) {
444 outclusters[
i].resize(incluster.size(),0.0);
445 for(
unsigned j = 0;
j < incluster.size(); ++
j ) {
446 if(
j == seeds[
i] ) {
447 outclusters[
i][
j] = 1.0;
449 energies[
i] = incluster[
j].data.weight;
459 const double minFracTot = 1
e-20;
461 const unsigned iterMax = 50;
463 const double stoppingTolerance = 1
e-8;
464 const double toleranceScaling =
std::pow(
std::max(1.0,seeds.size()-1.0),2.0);
465 std::vector<Point> prevCentroids;
466 std::vector<double>
frac(seeds.size()), dist2(seeds.size());
467 while( iter++ < iterMax && diff > stoppingTolerance*toleranceScaling ) {
468 for(
unsigned i = 0;
i < incluster.size(); ++
i ) {
469 const Hexel& ihit = incluster[
i].data;
470 double fraction(0.0), fracTot(0.0), d2(0.0);
471 for(
unsigned j = 0;
j < seeds.size(); ++
j ) {
473 d2 = (
std::pow(ihit.
x - centroids[
j].x(),2.0) +
478 if(
i == seeds[
j] ) {
480 }
else if( isaseed[
i] ) {
490 for(
unsigned j = 0;
j < seeds.size(); ++
j ) {
491 if( fracTot > minFracTot ||
492 (
i == seeds[
j] && fracTot > 0.0 ) ) {
493 outclusters[
j][
i] =
frac[
j]/fracTot;
495 outclusters[
j][
i] = 0.0;
503 centroids.resize(seeds.size());
505 for(
unsigned i = 0;
i < seeds.size(); ++
i ) {
509 const double delta2 = (prevCentroids[
i]-centroids[
i]).
perp2();
510 if( delta2 > diff2 ) diff2 = delta2;
double calculateDistanceToHigher(std::vector< KDNode > &, KDTree &)
double calculateEnergyWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
hgcal::RecHitTools rhtools_
std::vector< std::vector< KDNode > > current_v
math::XYZPoint calculatePositionWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
double distance(const Hexel &pt1, const Hexel &pt2)
reco::CaloCluster::AlgoId algoId
static const unsigned int maxlayer
const DetId & detid() const
double calculateLocalDensity(std::vector< KDNode > &, KDTree &)
void build(std::vector< KDTreeNodeInfoT< DATA, DIM > > &eltList, const KDTreeBoxT< DIM > ®ion)
math::XYZPoint Point
point in the space
void search(const KDTreeBoxT< DIM > &searchBox, std::vector< KDTreeNodeInfoT< DATA, DIM > > &resRecHitList)
void makeClusters(const HGCRecHitCollection &hits)
std::vector< size_t > sort_by_delta(const std::vector< KDNode > &v)
void shareEnergy(const std::vector< KDNode > &, const std::vector< unsigned > &, std::vector< std::vector< double > > &)
unsigned int cluster_offset
std::vector< std::vector< Hexel > > points
std::vector< size_t > sorted_indices(const std::vector< T > &v)
std::vector< reco::BasicCluster > getClusters(bool)
std::vector< unsigned > findLocalMaximaInCluster(const std::vector< KDNode > &)
XYZPointD XYZPoint
point in space with cartesian internal representation
T perp2() const
Squared magnitude of transverse component.
math::XYZPoint calculatePosition(std::vector< KDNode > &)
std::vector< std::vector< double > > tmp
char data[epos_bytes_allocation]
static int position[264][3]
int findAndAssignClusters(std::vector< KDNode > &, KDTree &, double, KDTreeBox &)
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
std::vector< reco::BasicCluster > clusters_v