14 double distanceThreshold)
19 for (
const auto &hit : hitArray) {
20 auto &pos = hit->GetPosition();
22 error = error * error;
23 if (error < (distanceThreshold * distanceThreshold)) {
28 model->
SetChi2(weight / nbInliers);
32 double distanceThreshold)
35 for (
const auto &hit : hitArray) {
36 auto &pos = hit->GetPosition();
38 error = error * error;
39 if (error < (distanceThreshold * distanceThreshold)) {
43 model->
SetChi2(1.0 / nbInliers);
48 double distanceThreshold)
51 assert(yModel !=
nullptr);
54 for (
const auto &hit : hitArray) {
55 auto &pos = hit->GetPosition();
56 if (yModel->GetPointAssignment(pos) >= 2)
59 error = error * error;
60 if (error < (distanceThreshold * distanceThreshold)) {
64 model->
SetChi2(1.0 / nbInliers);
69 double distanceThreshold)
71 double sigma = distanceThreshold / 1.96;
72 double dataSigma2 = sigma * sigma;
75 double minError = 1e5, maxError = -1e5;
76 for (
const auto &hit : hitArray) {
85 const double nu = maxError - minError;
87 for (
int iter = 0; iter < 5; iter++) {
88 double sumPosteriorProb = 0;
89 const double probOutlier = (1 - gamma) / nu;
90 const double probInlierCoeff = gamma / sqrt(2 * M_PI * dataSigma2);
92 for (
const auto &hit : hitArray) {
94 double probInlier = probInlierCoeff * exp(-0.5 * error * error / dataSigma2);
95 sumPosteriorProb += probInlier / (probInlier + probOutlier);
97 gamma = sumPosteriorProb / hitArray.size();
100 double sumLogLikelihood = 0;
104 const double probOutlier = (1 - gamma) / nu;
105 const double probInlierCoeff = gamma / sqrt(2 * M_PI * dataSigma2);
106 for (
const auto &hit : hitArray) {
108 double probInlier = probInlierCoeff * exp(-0.5 * error * error / dataSigma2);
111 if (error * error < dataSigma2) {
112 if ((probInlier + probOutlier) > 0)
113 sumLogLikelihood = sumLogLikelihood - log(probInlier + probOutlier);
117 double scale = sumLogLikelihood / nbInliers;
119 if (sumLogLikelihood < 0 || std::isinf(sumLogLikelihood))
127 double distanceThreshold)
129 std::vector<double> errorsVec;
131 for (
const auto &hit : hitArray) {
134 error = error * error;
135 if (error < (distanceThreshold * distanceThreshold))
136 errorsVec.push_back(error);
139 return errorsVec.size();
143 double distanceThreshold)
146 double totalCharge = 0;
149 for (
const auto &hit : hitArray) {
150 auto &pos = hit->GetPosition();
152 error = error * error;
153 if (error < (distanceThreshold * distanceThreshold)) {
155 totalCharge += hit->GetCharge();
156 weight += error * hit->GetCharge();
159 model->
SetChi2(weight / totalCharge);