RoptFit.cc
Go to the documentation of this file.
1 #include <TMinuit.h>
2 #include <utl/AugerUnits.h>
3 #include "RoptFit.h"
4 
5 using namespace LDFFinderOG;
6 using namespace std;
7 
8 
10 int RoptFit::fgN;
11 const double* RoptFit::fgS1000;
12 const double* RoptFit::fgBeta;
13 
14 
15 pair<double, double>
17  const int n, const double* const s1000, const double* const beta,
18  const bool verbose)
19 {
20  fgLDFType = type;
21  fgN = n;
22  fgS1000 = s1000;
23  fgBeta = beta;
24 
25  TMinuit minuit(1);
26  int errFlag = 0;
27  double argList[10];
28  argList[0] = -1;
29  if (!verbose) {
30  minuit.mnexcm("SET PRINTOUT", argList, 1, errFlag);
31  minuit.mnexcm("SET NOWARNINGS", argList, 0, errFlag);
32  minuit.SetPrintLevel(-1);
33  }
34 
35  minuit.SetFCN(RoptFit::FitFunction);
36  argList[0] = 1;
37  minuit.mnexcm("SET ERRORDEF", argList, 1, errFlag);
38 
39  minuit.mnparm(0, "ropt", 1400*meter, 50*meter, 0, 0, errFlag);
40 
41  argList[0] = 500;
42  minuit.mnexcm("MINIMIZE", argList, 1, errFlag);
43 
44  // Get results
45  pair<double, double> ropt;
46  minuit.GetParameter(0, ropt.first, ropt.second);
47 
48  return ropt;
49 }
50 
51 
52 void
53 RoptFit::FitFunction(int& /*nPar*/, double* const /*grad*/, double& value,
54  double* const par, const int /*flag*/)
55 {
56  const double& ropt = par[0];
57 
58  double sum = 0;
59  double sum2 = 0;
60  for (int i = 0; i < fgN; ++i) {
61  const double s = fgS1000[i] * LDFFunction(fgLDFType, ropt, fgBeta[i], 0);
62  sum += s;
63  sum2 += Sqr(s);
64  }
65  const double invN = 1./fgN;
66  const double avg = sum * invN;
67  const double var2 = sum2 * invN - Sqr(avg);
68 
69  value = (var2 > 0 ? sqrt(var2) : 0) / avg;
70 }
71 
72 
73 // Configure (x)emacs for this file ...
74 // Local Variables:
75 // mode: c++
76 // End:
constexpr T Sqr(const T &x)
double LDFFunction(const LDFFunctionType type, const double r, const double beta, const double gamma=0, const double mu=2660.*meter, const double tau=242.*meter)
Definition: LDFFunctions.h:66
const double meter
Definition: GalacticUnits.h:29
static int fgN
Definition: RoptFit.h:32
constexpr double s
Definition: AugerUnits.h:163
static const double * fgS1000
Definition: RoptFit.h:33
std::pair< double, double > Fit(const LDFFunctionType type, const int n, const double *const s1000, const double *const beta, const bool verbose=false)
Definition: RoptFit.cc:16
static LDFFunctionType fgLDFType
Definition: RoptFit.h:31
static const double * fgBeta
Definition: RoptFit.h:34
static void FitFunction(int &nPar, double *const grad, double &value, double *const par, const int flag)
Definition: RoptFit.cc:53

, generated on Tue Sep 26 2023.