18#ifndef O2_MCH_CLUSTER_H_
19#define O2_MCH_CLUSTER_H_
21#include <gsl/gsl_blas.h>
22#include <gsl/gsl_linalg.h>
42 ClusterPEM(
const double*
x,
const double*
y,
const double* dx,
const double* dy,
43 const double* q,
const short* cathodes,
const short* saturated,
72 return (pads[
c] ==
nullptr ?
nullptr : pads[
c]->
getCharges());
83 return (projectedPads ==
nullptr ? -1 : projectedPads->
getNbrOfPads());
93 return mapCathPadIdxToPadIdx[
c];
117 int singleCathPlaneID = -1;
118 int nbrOfCathodePlanes = 0;
119 Pads* pads[2] = {
nullptr,
nullptr};
120 int nbrSaturated = 0;
122 PadIdx_t* mapCathPadIdxToPadIdx[2] = {
126 Pads* projectedPads =
nullptr;
129 int nbrOfProjGroups = 0;
131 Groups_t* cathGroup[2] = {
nullptr,
nullptr};
132 int nbrOfCathGroups = 0;
138 MapKToIJ_t* mapKToIJ =
146 void computeProjectedPads(
const Pads& pad0InfSup,
const Pads& pad1InfSup,
147 int maxNbrOfProjPads,
PadIdx_t* aloneIPads,
149 int includeAlonePads);
151 int getConnectedComponentsOfProjPadsWOSinglePads();
156 int assignPadsToGroupFromProj(
int nGrp);
159 int assignGroupToCathPads();
160 void updateProjectionGroups();
162 int renumberGroupsFromMap(
Groups_t* grpToGrp,
int nGrp);
164 int renumberGroups(
Groups_t* grpToGrp,
int nGrp);
166 void removeLowChargedGroups(
int nGroups);
168 int filterFitModelOnSmallChargedSeeds(Pads& pads,
double* theta,
int K,
169 Mask_t* maskFilteredTheta);
172 int filterFitModelOnClusterRegion(Pads& pads,
double* theta,
int K,
173 Mask_t* maskFilteredTheta);
175 int filterFitModelOnSpaceVariations(
const double* theta0,
int K0,
176 double* theta,
int K,
177 Mask_t* maskFilteredTheta);
178 Pads* findLocalMaxWithRefinement(
double* thetaL,
int nbrOfPadsInTheGroupCath);
179 Pads* findLocalMaxWithoutRefinement(
double* thetaL,
int nbrOfPadsInTheGroupCath);
185 int checkConsistencyMapKToIJ(
const char* intersectionMatrix,
186 const MapKToIJ_t* mapKToIJ,
189 const PadIdx_t* aloneJPads,
int N0,
int N1,
194 int laplacian2D(
const Pads& pads_,
PadIdx_t* neigh,
int chId,
195 PadIdx_t* sortedLocalMax,
int kMax,
double* smoothQ);
std::pair< int, int > getNxNy(int c)
const double * getCharges(int c)
int findLocalMaxWithBothCathodes(double *thetaOut, int kMax)
int findLocalMaxWithPEMFullRefinement(double *thetaL, int nbrOfPadsInTheGroupCath)
int getNbrOfProjectedPads()
const Pads * getProjectedPads()
int buildProjectedGeometry(int includeAlonePads)
double * projectChargeOnProjGeometry(int includeAlonePads)
const PadIdx_t * getMapCathPadToPad(int c)
int getNbrOfPadsInGroup(int g)
int findLocalMaxWithPEM2Lev(double *thetaL, int nbrOfPadsInTheGroupCath)
const Groups_t * getCathGroup(int c)
std::pair< double, double > computeChargeBarycenter(int plane)
Groups_t * getProjPadGroup()
int findLocalMaxWithPEM(double *thetaL, int nbrOfPadsInTheGroupCath)
int getNbrOfObsPads(int c)
double getTotalCharge(int c)
const Pads * getPads(int c)
static int getNbrOfPads(const Pads *pads)
const double * getCharges() const
int getNbrOfObsPads() const
double getTotalCharge() const
std::pair< int, double * > DataBlock_t
gsl_matrix * moore_penrose_pinv(gsl_matrix *A, double rcond)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...