8 #include <boost/math/special_functions/fpclassify.hpp>
10 #include <utl/ErrorLogger.h>
15 #include <Minuit2/MnMinimize.h>
16 #include <Minuit2/MnHesse.h>
17 #include <Minuit2/FCNBase.h>
18 #include <Minuit2/FunctionMinimum.h>
20 #include <Minuit2/MnUserCovariance.h>
21 #include <Minuit2/MnPrint.h>
22 #include <Minuit2/MnMigrad.h>
28 namespace MdLDFFinderAG {
40 std::vector<unsigned int> k0;
47 std::sort(k0.begin(), k0.end());
50 std::vector<unsigned int> kuniq(k0);
51 std::vector<unsigned int>::iterator it = std::unique(kuniq.begin(), kuniq.end());
52 kuniq.resize(std::distance(kuniq.begin(), it));
55 for (std::vector<unsigned int>::iterator it = kuniq.begin(); it != kuniq.end(); ++it) {
57 const unsigned int count = std::count(k0.begin(), k0.end(), *it);
89 const double k = it1->first;
90 const double m = it1->second;
102 ROOT::Minuit2::MnUserParameters
106 std::vector<double> vseed;
108 unsigned int ksum = 0;
111 ksum += it->first * it->second;
117 vseed.push_back((it->first) * mu/ksum);
132 ROOT::Minuit2::MnUserParameters
137 ROOT::Minuit2::MnUserParameters upar;
138 std::stringstream ss;
140 for (std::vector<double>::const_iterator it = vseed.begin(); it != vseed.end(); ++it) {
144 upar.SetLowerLimit(ss.str(), 0);
177 const double k = double(it->first);
178 const double m = double(it->second);
190 const double mu2 =
std::max(mu, DBL_EPSILON);
194 rvalue = (mu2 - k) - k*log(mu2 / k);
200 double like1 = multiplicity*
Like1(mu/multiplicity, segmentsOn);
208 }
else if (mub > mulimit) {
224 double nLogLikeMin = 0;
232 nLogLikeMin = - k*log(k/n) - (n-k)*log(1-k/n);
246 ROOT::Minuit2::MnUserParameters upar =
SetSeed(mu);
250 ROOT::Minuit2::MnMigrad migrad(fullLike, upar);
253 gErrorIgnoreLevel = 1001;
255 ROOT::Minuit2::FunctionMinimum min = migrad();
263 assert(min.IsValid());
264 assert(min.IsValid());
265 assert(min.HasValidCovariance());
266 assert(!min.HesseFailed());
267 assert(!min.HasReachedCallLimit());
269 rvalue = min.UserState().Fval() -
GlobalMin();
274 assert(boost::math::isfinite(rvalue));
291 nlnLike = (!k ? 0 : 1e6);
310 double estimatedMuons = 0;
315 const unsigned int k = it1->first;
316 const unsigned int m = it1->second;
321 estimatedMuons += windowMuons;
324 return estimatedMuons;
332 TF1 f1(
"f1", *
this, xmin, xmax, 0);
333 const double x = f1.GetX(y, xmin, xmax);
342 const double muhat =
GetMLE();
345 const double up = 0.5;
348 double xmax = muhat + 1;
349 while (this->
operator()(xmax) < up)
352 const double xup =
Inverse(up, muhat, xmax);
353 const double xerror = xup - muhat;
363 const double muhat =
GetMLE();
365 const double xerror = muhat - xlow;
374 const double muhat =
GetMLE();
377 const double up = 0.5;
384 double xmin = muhat / 2;
385 while (this->
operator()(xmin) < up)
388 const double xup =
Inverse(up, xmin, muhat);
398 unsigned int totalSegmentsOn = 0;
403 const unsigned int k = it1->first;
404 const unsigned int m = it1->second;
406 totalSegmentsOn += k*
m;
409 return totalSegmentsOn;
428 const double up = 0.5;
429 const double xmin = 0.1;
430 const double xmaxSeed = 1;
433 double xmax = xmaxSeed;
434 while (this->
operator()(xmax) > up)
437 const double limit =
Inverse(up, xmin, xmax);
static const double kInitError
ROOT::Minuit2::MnUserParameters SetSeed(const double mu) const
double GetErrorLow() const
double GetLowLimit() const
static const double kMuPoissonApprox
static const double satLikeLimit
ProfLike(const unsigned int, const utl::TraceUI &)
std::vector< T >::const_iterator ConstIterator
double GetErrorHigh() const
unsigned int fMaxSegments
unsigned int fNumberSegments
double Like1(const double mu, const unsigned int k) const
double operator()(const double mu) const
ROOT::Minuit2::MnUserParameters SetMnUserParameters(const std::vector< double > &) const
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
unsigned int GetTotalSegmentsOn() const
unsigned int fMaxMultiplicity
double GetLowLimitUnsaturated() const
SegmentsOnMulti fSegmentsOnMulti
double Inverse(const double y, const double xmin, const double xmax) const