56 void init(
bool run2Config);
63 const std::vector<Cluster>&
getClusters()
const {
return mClusters; }
71 static constexpr double SDistancePrecision = 1.e-3;
72 static constexpr int SNFitClustersMax = 3;
73 static constexpr int SNFitParamMax = 3 * SNFitClustersMax - 1;
74 static constexpr double SLowestCoupling = 1.e-2;
76 void resetPreCluster(gsl::span<const Digit>&
digits);
77 void simplifyPreCluster(std::vector<int>& removedDigits);
78 void processPreCluster();
81 void ProjectPadOverPixels(
const PadOriginal& pad, TH2D& hCharges, TH2I& hEntries)
const;
83 void findLocalMaxima(std::unique_ptr<TH2D>& histAnode, std::multimap<
double, std::pair<int, int>, std::greater<>>& localMaxima);
84 void flagLocalMaxima(
const TH2D& histAnode,
int i0,
int j0, std::vector<std::vector<int>>& isLocalMax)
const;
85 void restrictPreCluster(
const TH2D& histAnode,
int i0,
int j0);
90 void computeCoefficients(std::vector<double>& coef, std::vector<double>& prob)
const;
91 double mlem(
const std::vector<double>& coef,
const std::vector<double>& prob,
int nIter);
92 void findCOG(
const TH2D& histMLEM,
double xy[2])
const;
93 void refinePixelArray(
const double xyCOG[2],
size_t nPixMax,
double& xMin,
double& xMax,
double& yMin,
double&
yMax);
94 void cleanPixelArray(
double threshold, std::vector<double>& prob);
96 int fit(
const std::vector<
const std::vector<int>*>& clustersOfPixels,
const double fitRange[2][2],
double fitParam[SNFitParamMax + 1]);
97 double fit(
double currentParam[SNFitParamMax + 2],
const double parmin[SNFitParamMax],
const double parmax[SNFitParamMax],
98 int nParamUsed,
int& nTrials)
const;
99 double computeChi2(
const double param[SNFitParamMax + 2],
int nParamUsed)
const;
100 void param2ChargeFraction(
const double param[SNFitParamMax],
int nParamUsed,
double fraction[SNFitClustersMax])
const;
101 float chargeIntegration(
double x,
double y,
const PadOriginal& pad)
const;
103 void split(
const TH2D& histMLEM,
const std::vector<double>& coef);
104 void addPixel(
const TH2D& histMLEM,
int i0,
int j0, std::vector<int>&
pixels, std::vector<std::vector<bool>>& isUsed);
105 void addCluster(
int iCluster, std::vector<int>& coupledClusters, std::vector<bool>& isClUsed,
106 const std::vector<std::vector<double>>& couplingClCl)
const;
107 void extractLeastCoupledClusters(std::vector<int>& coupledClusters, std::vector<int>& clustersForFit,
108 const std::vector<std::vector<double>>& couplingClCl)
const;
109 int selectPads(
const std::vector<int>& coupledClusters,
const std::vector<int>& clustersForFit,
110 const std::vector<std::vector<double>>& couplingClPad);
111 void merge(
const std::vector<int>& clustersForFit,
const std::vector<int>& coupledClusters, std::vector<std::vector<int>>& clustersOfPixels,
112 std::vector<std::vector<double>>& couplingClCl, std::vector<std::vector<double>>& couplingClPad)
const;
113 void updatePads(
const double fitParam[SNFitParamMax + 1],
int nParamUsed);
115 void setClusterResolution(
Cluster& cluster)
const;
118 std::function<double(uint32_t)> mADCToCharge = [](uint32_t
adc) {
return static_cast<double>(
adc); };
120 double mLowestPadCharge = 0.;
121 double mLowestPixelCharge = 0.;
122 double mLowestClusterCharge = 0.;
124 std::unique_ptr<MathiesonOriginal[]> mMathiesons;
125 MathiesonOriginal* mMathieson =
nullptr;
127 std::unique_ptr<ClusterOriginal> mPreCluster;
128 std::vector<PadOriginal> mPixels;
130 const mapping::Segmentation* mSegmentation =
nullptr;
132 std::vector<Cluster> mClusters{};
133 std::vector<Digit> mUsedDigits{};
135 ErrorMap mErrorMap{};
137 PreClusterFinder mPreClusterFinder{};