ICRC2019/UnfoldSpectrum.cc
Go to the documentation of this file.
1 /* Authors: I. ValiƱo, G. Rodriguez, Alan Coleman, Alex Schulz, F. Fenu
2  based on an original code of H. Dembinski */
3 #include <iostream>
4 #include <iomanip>
5 #include <fstream>
6 #include <cmath>
7 #include <vector>
8 #include <cstring>
9 #include <sstream>
10 #include <TFile.h>
11 #include <TCanvas.h>
12 #include <TMath.h>
13 #include <TF1.h>
14 #include "Math/WrappedTF1.h"
15 #include "Math/Integrator.h"
16 #include <TH1D.h>
17 #include <TNtupleD.h>
18 #include <TMath.h>
19 #include <TMinuit.h>
20 #include <TGraphAsymmErrors.h>
21 #include <TGraphErrors.h>
22 #include <TGraph.h>
23 #include <TAxis.h>
24 #include <TMatrixD.h>
25 #include <TVectorD.h>
26 #include <TApplication.h>
27 #include <TMinuit.h>
28 #include <TImage.h>
29 #include <TROOT.h>
30 #include <TStyle.h>
31 #include <TLegend.h>
32 
33 using namespace std;
36 TAxis* thLgE;
37 TVectorD vecLgE;
38 TMatrixD kmatrix;
39 TAxis* rawAxis_lgE;
41 double InverseSdCalibration(const double, TVectorD );
42 double ScaledErrorFunction(const double, const std::vector<double>&);
43 void TestFormat(string, int);
44 
45 #include "BiasFunctions.hh"
46 #include "ResolutionFunctions.hh"
47 #include "TriggerFunctions.hh"
48 #include "UnfoldUtilities.hh"
49 #include "FittingFunctions.hh"
50 #include "Statistics.hh"
51 
53 double IntXmin;
54 double IntXmax;
56 double exposure;
61 TVectorD parsFit;
62 TVectorD parsErrorsFit;
63 TVectorD MinuitMinimization(double*, Int_t, bool);
64 void FitFCN(Int_t& npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag);
65 double Likelihood(double* pars);
66 void PrintResults(TVectorD, TVectorD);
67 
68 int main(int argc, char* argv[]) {
69  if (2 != argc) {
70  PrintUsage(argc);
71  return 0;
72  }
73  LoadParam(argv[1]);
74  string DataFileName = SDFile;
76  Double_t SpectrumMin = mapParameters["SpectrumMin"];
77  Double_t SpectrumMax = mapParameters["SpectrumMax"];
78  Double_t SpectrumBinSize = mapParameters["SpectrumBinSize"];
79  const Int_t BinNum = mapParameters["NumBins"];
80  double SpectrumBins[BinNum + 1];
81  const int Npar = mapParameters["NumParam"];
82  double fParFitInit[Npar];
83  parsFit.ResizeTo(Npar);
84  parsErrorsFit.ResizeTo(Npar);
85  IntXmin = mapParameters["MinIntegration"];
86  IntXmax = mapParameters["MaxIntegration"];
87  IntegrationSteps = mapParameters["IntegrationSteps"];
88 
89  if (CodeUsed == "Offline")
90  HeraldAnalysis = false;
91  else
92  HeraldAnalysis = true;
93 
94  for (Int_t i = 0; i < BinNum + 1; i++) {
95  ostringstream convert;
96  convert << i + 1;
97  string nameParameter = "r";
98  nameParameter += convert.str();
99  SpectrumBins[i] = mapParameters[nameParameter.c_str()];
100  }
101 
102  cout << "Input File: " << DataFileName << endl;
103  cout << "Output File: " << OutPutFileName << endl;
104  cout << "Output File Rebinned: " << OutPutFileNameRebinned << endl;
105 
106  int hnbins = round((SpectrumMax - SpectrumMin) / SpectrumBinSize);
107  TH1D* thEnergySpectrum = new TH1D("thEnergySpectrum", "", hnbins, SpectrumMin, SpectrumMax);
108  TH1D* thEnergySpectrum_rebinned = new TH1D("thEnergySpectrum_rebinned", "", BinNum, SpectrumBins); //Check! index of SpectrumBins
109  if (DeclinationDepentMatrix == "no")
110  exposure = mapParameters["Exposure"];
111  if (DeclinationDepentMatrix == "yes")
112  exposure = DirectionalExposure(mapParameters["AugerLatitude"]*TMath::DegToRad(), mapParameters["MinDeclination"] * TMath::DegToRad(), mapParameters["MaxDeclination"] * TMath::DegToRad());
113  rawAxis_lgE = thEnergySpectrum->GetXaxis();
114 
115  // Open file with Rec. events
116  if (VersionInput == "ICRC2019")
117  ReadEventListICRC2019(thEnergySpectrum, thEnergySpectrum_rebinned, DataFileName);
118  else
119  ReadEventList(thEnergySpectrum, thEnergySpectrum_rebinned, DataFileName);
120 
121  if ("no" != Verbose)
122  cerr << "\nRead in " << thEnergySpectrum->GetEntries() << " events\n" << endl;
123 
124  // *****************************************************
125  // RAW SPECTRUM
126  // *****************************************************
127  int Nbins = thEnergySpectrum->GetNbinsX();
128  raw_lgEs.ResizeTo(Nbins), raw_nevents.ResizeTo(Nbins), raw_flux.ResizeTo(Nbins), raw_staterrlow.ResizeTo(Nbins), raw_staterrup.ResizeTo(Nbins);
129 
130  TGraphAsymmErrors* tgEnergySpectrum = new TGraphAsymmErrors();
131  for (int i = 1; i <= Nbins; ++i) {
132  double binW = thEnergySpectrum->GetBinWidth(i);
133  double we = pow(10, thEnergySpectrum->GetBinCenter(i) + binW / 2) - pow(10, thEnergySpectrum->GetBinCenter(i) - binW / 2);
134  double factor = exposure * we;
135  double lgE = thEnergySpectrum->GetBinCenter(i);
136  double content = thEnergySpectrum->GetBinContent(i) / factor;
137  tgEnergySpectrum->SetPoint(i - 1, lgE, content);
138  double plow, pup;
139  poisson_uncertainty(thEnergySpectrum->GetBinContent(i), plow, pup);
140  tgEnergySpectrum->SetPointError(i - 1, 0., 0., plow / factor, pup / factor);
141  raw_lgEs[i - 1] = lgE;
142  raw_nevents[i - 1] = thEnergySpectrum->GetBinContent(i);
143  raw_flux[i - 1] = content;
144  raw_staterrlow[i - 1] = plow / factor;
145  raw_staterrup[i - 1] = pup / factor;
146  }
147 
148  // *****************************************************************
149  // Rebinned raw spectrum
150  // *****************************************************************
151  int Nbins_rebinned = thEnergySpectrum_rebinned->GetNbinsX();
152  raw_lgEs_rebinned.ResizeTo(Nbins_rebinned), raw_nevents_rebinned.ResizeTo(Nbins_rebinned), raw_flux_rebinned.ResizeTo(Nbins_rebinned), raw_staterrlow_rebinned.ResizeTo(Nbins_rebinned), raw_staterrup_rebinned.ResizeTo(Nbins_rebinned);
153 
154  for (int i = 1; i <= Nbins_rebinned; ++i) {
155 
156  double binW_rebinned = thEnergySpectrum_rebinned->GetBinWidth(i);
157  double we_rebinned = pow(10, thEnergySpectrum_rebinned->GetBinCenter(i) + binW_rebinned / 2) - pow(10, thEnergySpectrum_rebinned->GetBinCenter(i) - binW_rebinned / 2);
158  double factor_rebinned = exposure * we_rebinned;
159  double lgE_rebinned = thEnergySpectrum_rebinned->GetBinCenter(i);
160  double content_rebinned = thEnergySpectrum_rebinned->GetBinContent(i) / factor_rebinned;
161 
162  double plow_rebinned, pup_rebinned;
163  poisson_uncertainty(thEnergySpectrum_rebinned->GetBinContent(i), plow_rebinned, pup_rebinned);
164  raw_lgEs_rebinned[i - 1] = lgE_rebinned;
165  raw_nevents_rebinned[i - 1] = thEnergySpectrum_rebinned->GetBinContent(i);
166  raw_flux_rebinned[i - 1] = content_rebinned;
167  raw_staterrlow_rebinned[i - 1] = plow_rebinned / factor_rebinned;
168  raw_staterrup_rebinned[i - 1] = pup_rebinned / factor_rebinned;
169  }
170 
171  /* Model parameters: */
172  /* 0: normalization; 1: log10(energy) at ankle position; 2: spectral index before ankle; 3 spectra index after ankle;
173  4: log10(energy) at the 1/2 suppression; 5: increment of the spectral index beyond suppression */
174 
175  TF1* FitFunction;
176  FitFunction = new TF1("FittingFunction", FluxModels(modelfunctions.c_str()), SpectrumMin, SpectrumMax, Npar);
177 
178 
179  if (modelfunctions == "StandardMultiSmooth") {
180  if ("no" != Verbose)
181  cerr << "Performing initial fit to StandardMultiSmooth\n";
182  FitFunction->SetParameter(0, mapParameters["par0"]);
183  FitFunction->SetParameter(1, mapParameters["par1"]);
184  FitFunction->SetParameter(2, mapParameters["par2"]);
185  FitFunction->SetParameter(3, mapParameters["par3"]);
186  FitFunction->SetParameter(4, mapParameters["par4"]);
187  FitFunction->SetParameter(5, mapParameters["par5"]);
188  FitFunction->SetParameter(6, mapParameters["par6"]);
189  FitFunction->SetParameter(7, mapParameters["par7"]);
190  }
191  if (modelfunctions == "StandardICRC2015") {
192  if ("no" != Verbose)
193  cerr << "Performing initial fit to StandardICRC2015\n";
194  FitFunction->SetParameter(0, mapParameters["par0"]);
195  FitFunction->SetParameter(1, mapParameters["par1"]);
196  FitFunction->SetParameter(2, mapParameters["par2"]);
197  FitFunction->SetParameter(3, mapParameters["par3"]);
198  FitFunction->SetParameter(4, mapParameters["par4"]);
199  FitFunction->SetParameter(5, mapParameters["par5"]);
200  }
201  if (modelfunctions == "Spectrum2015_2017SmoothAnkle") {
202  if ("no" != Verbose)
203  cerr << "Performing initial fit to Spectrum2015_2017SmoothAnkle\n";
204  FitFunction->SetParameter(0, mapParameters["par0"]);
205  FitFunction->SetParameter(1, mapParameters["par1"]);
206  FitFunction->SetParameter(2, mapParameters["par2"]);
207  FitFunction->SetParameter(3, mapParameters["par3"]);
208  FitFunction->SetParameter(4, mapParameters["par4"]);
209  FitFunction->SetParameter(5, mapParameters["par5"]);
210  }
211  if (modelfunctions == "InfillHard") {
212  if ("no" != Verbose)
213  cerr << "Performing initial fit to InfillHard\n";
214  FitFunction->SetParameter(0, mapParameters["par0"]);
215  FitFunction->SetParameter(1, mapParameters["par1"]);
216  FitFunction->SetParameter(2, mapParameters["par2"]);
217  FitFunction->SetParameter(3, mapParameters["par3"]);
218  }
219  if (modelfunctions == "SpectrumInfillICRC2019") {
220  if ("no" != Verbose)
221  cerr << "Performing initial fit to SpectrumInfillICRC2019\n";
222  FitFunction->SetParameter(0, mapParameters["par0"]);
223  FitFunction->SetParameter(1, mapParameters["par1"]);
224  FitFunction->SetParameter(2, mapParameters["par2"]);
225  FitFunction->SetParameter(3, mapParameters["par3"]);
226  FitFunction->SetParameter(4, mapParameters["par4"]);
227  FitFunction->SetParameter(5, mapParameters["par5"]);
228  FitFunction->SetParameter(6, mapParameters["par6"]);
229 
230  if (mapParameters["MaxZenith"] > 40) {
231  FitFunction->FixParameter(1, mapParameters["par1"]); //lgEbreak
232  FitFunction->FixParameter(3, mapParameters["par3"]); //g0
233  FitFunction->FixParameter(6, mapParameters["par6"]); //dg
234  }
235  }
236 
237  if ("no" == Verbose)
238  tgEnergySpectrum->Fit(FitFunction, "q");
239  else
240  tgEnergySpectrum->Fit(FitFunction);
241 
242  for (int i = 0; i < Npar; i++) {
243  fParFitInit[i] = FitFunction->GetParameter(i);
244  }
245 
246  // ***************************************************
247  // UNFOLDING starts ....
248  // ***************************************************
249  /* Numerical integration made using a Rienmann sum */
250  //do unfolding, x = lgE, y = count
251 
252  int nbins = round((IntXmax - IntXmin) / thEnergySpectrum->GetBinWidth(1));
253  int N = nbins * IntegrationSteps;
254 
255  thLgE = new TAxis(N, IntXmin, IntXmax);
256  vecLgE.ResizeTo(N);
257  for (int i = 1; i <= N; ++i)
258  vecLgE[i - 1] = thLgE->GetBinCenter(i);
259 
260  TVectorD pCal = GetSDCalPars();
261 
262  double resolutionOffset[2] = {0, 0};
263  kmatrix.ResizeTo(N, N);
264  if (DeclinationDepentMatrix == "no")
265  kmatrix = kResolutionMatrix(pCal, vecLgE, resolutionOffset);
266  if (DeclinationDepentMatrix == "yes")
267  kmatrix = kResolutionMatrixDD(pCal, vecLgE, mapParameters["AugerLatitude"] * TMath::DegToRad(), mapParameters["MinDeclination"] * TMath::DegToRad(), mapParameters["MaxDeclination"] * TMath::DegToRad());
268 
269  double lgExp = log10(exposure);
270 
271  // Set Initial guess parameters from fit
272  double start[Npar];
273  start[0] = fParFitInit[0] + lgExp; // Special treatment for norm
274 
275  for (int ipar = 1; ipar < Npar; ipar++)
276  start[ipar] = fParFitInit[ipar];
277 
278  UnfoldCorrectionFactor.ResizeTo(N);
279  UnfoldCorrectionFactor = MinuitMinimization(start, Npar, true);
280 
281 
282  // statistics errors due to unfolding.
283  TVectorD unfoldstat(N);
284  TVectorD dlgE(N);
285 
286  for (int i = 0; i < N; ++i) {
287 
288  unfoldstat[i] = sqrt(UnfoldCorrectionFactorCoV[i][i]);
289  dlgE[i] = thLgE->GetBinCenter(1) / 2.;
290  }
291  TGraph* tgUnfoldStatValue = new TGraph(N, &vecLgE[0], &unfoldstat[0]);
292 
293  TCanvas* c1 = new TCanvas();
294  c1->SetGridx(1);
295  c1->SetGridy(1);
296 
297  TGraph* tgUnfold = new TGraph(N, &vecLgE[0], &UnfoldCorrectionFactor[0]);
298  TGraphAsymmErrors* tgUnfoldSpectrum = new TGraphAsymmErrors();
299 
300  /* Writing the resulting spectrum in an output file */
301 
302  ofstream fOut(OutPutFileName.c_str(), ios::out);
303  fOut << "# lg(E/eV) lgE_hw raw_counts exposure[km2 sr yr] J [km-2 sr-1 yr-1 eV-1] lower_sigma[J]_stat upper_sigma[J]_stat unfolding_correction sigma[unfolding_correction]_stat" << endl;
304 
305  for (int i = 0; i < raw_lgEs.GetNoElements(); ++i) {
306 
307  double factorunfold = tgUnfold->Eval(raw_lgEs[i]);
308  double statunc_factorunfold = tgUnfoldStatValue->Eval(raw_lgEs[i]);
309  double nmod = raw_flux[i] * factorunfold;
310  double lowerror = raw_staterrlow[i] * factorunfold;
311  double uperror = raw_staterrup[i] * factorunfold;
312 
313  fOut << raw_lgEs[i] << " " << thEnergySpectrum->GetBinWidth(i) / 2. << " " << raw_nevents[i] << " " << exposure << " " << nmod << " " << lowerror << " " << uperror << " " << factorunfold << " " << statunc_factorunfold << endl;
314 
315  tgUnfoldSpectrum->SetPoint(i, raw_lgEs[i], nmod);
316  tgUnfoldSpectrum->SetPointError(i, 0., 0., lowerror, uperror);
317  }
318 
319  ofstream fOutRebinned(OutPutFileNameRebinned.c_str(), ios::out);
320  fOutRebinned << "# lg(E/eV) lgE_hw raw_counts exposure[km2 sr yr] J [km-2 sr-1 yr-1 eV-1] lower_sigma[J]_stat upper_sigma[J]_stat unfolding_correction" << endl;
321  for (int i = 0; i < raw_lgEs_rebinned.GetNoElements(); ++i) {
322  double factorunfold_rebinned = tgUnfold->Eval(raw_lgEs_rebinned[i]);// factor is calculated on constant binning! This affects only raw.
323  double statunc_factorunfold_rebinned = tgUnfoldStatValue->Eval(raw_lgEs_rebinned[i]);
324  double nmod_rebinned = raw_flux_rebinned[i] * factorunfold_rebinned;
325  double lowerror_rebinned = raw_staterrlow_rebinned[i] * factorunfold_rebinned;
326  double uperror_rebinned = raw_staterrup_rebinned[i] * factorunfold_rebinned;
327  fOutRebinned << raw_lgEs_rebinned[i] << " " << thEnergySpectrum_rebinned->GetBinWidth(i + 1) / 2. << " " << raw_nevents_rebinned[i] << " " << exposure << " " << nmod_rebinned << " " << lowerror_rebinned << " " << uperror_rebinned << " " << factorunfold_rebinned << " " << statunc_factorunfold_rebinned << endl;
328  }
329  fOutRebinned.close();
330  fOut.close();
332  return 0;
333 } //close main function
334 
335 
336 TVectorD MinuitMinimization(double* start, Int_t Npar_Minim, bool computeCovStat = true) {
337  const int N = Npar_Minim;
338  TMinuit gMinuit(N);
339  double arglist[10];
340  int ierflg = 0;
341  arglist[0] = -1; // Minuit not verbose
342  gMinuit.SetPrintLevel(-1);
343 
344  arglist[0] = 0.5; // Set error param for negative-log-likelihood
345  gMinuit.mnexcm("SET ERR", arglist, 1, ierflg);
346 
347  double step = 0.001;
348 
349  if (modelfunctions == "StandardICRC2015") {
350  gMinuit.mnparm(0, "Norm", start[0], step, 0, 0, ierflg);
351  gMinuit.mnparm(1, "lgEa", start[1], step, 0, 0, ierflg);
352  gMinuit.mnparm(2, "g1", start[2], step, 0, 0, ierflg);
353  gMinuit.mnparm(3, "g2", start[3], step, 0, 0, ierflg);
354  gMinuit.mnparm(4, "lgEs", start[4], step, 0, 0, ierflg);
355  gMinuit.mnparm(5, "Dgamma", start[5], step, 0, 0, ierflg);
356  } else if (modelfunctions == "StandardMultiSmooth") {
357  gMinuit.mnparm(0, "Norm", start[0], step, 0, 0, ierflg);
358  gMinuit.mnparm(1, "lgEa", start[1], step, 0, 0, ierflg);
359  gMinuit.mnparm(2, "lgEx", start[2], step, 0, 0, ierflg);
360  gMinuit.mnparm(3, "lgEs", start[3], step, 0, 0, ierflg);
361  gMinuit.mnparm(4, "g1", start[4], step, 0, 0, ierflg);
362  gMinuit.mnparm(5, "g2", start[5], step, 0, 0, ierflg);
363  gMinuit.mnparm(6, "g3", start[6], step, 0, 0, ierflg);
364  gMinuit.mnparm(7, "g4", start[7], step, 0, 0, ierflg);
365  } else if (modelfunctions == "InfillHard") {
366  gMinuit.mnparm(0, "Norm", start[0], step, 0, 0, ierflg);
367  gMinuit.mnparm(1, "lgEa", start[1], step, 0, 0, ierflg);
368  gMinuit.mnparm(2, "g1", start[2], step, 0, 0, ierflg);
369  gMinuit.mnparm(3, "g2", start[3], step, 0, 0, ierflg);
370  } else if (modelfunctions == "Spectrum2015_2017SmoothAnkle") {
371  gMinuit.mnparm(0, "Norm", start[0], step, 0, 0, ierflg);
372  gMinuit.mnparm(1, "lgEa", start[1], step, 0, 0, ierflg);
373  gMinuit.mnparm(2, "g1", start[2], step, 0, 0, ierflg);
374  gMinuit.mnparm(3, "g2", start[3], step, 0, 0, ierflg);
375  gMinuit.mnparm(4, "lgEs", start[4], step, 0, 0, ierflg);
376  gMinuit.mnparm(5, "Dgamma", start[5], step, 0, 0, ierflg);
377  } else if (modelfunctions == "SpectrumInfillICRC2019") {
378  const bool is55 = (mapParameters["MaxZenith"] > 40);
379  gMinuit.mnparm(0, "Norm", start[0], step, 0, 0, ierflg);
380  gMinuit.mnparm(1, "lgEbreak", start[1], is55 ? 0 : step, 0, 0, ierflg);
381  gMinuit.mnparm(2, "lgEankle", start[2], step, 0, 0, ierflg);
382  gMinuit.mnparm(3, "g0", start[3], is55 ? 0 : step, 0, 0, ierflg);
383  gMinuit.mnparm(4, "g1", start[4], step, 0, 0, ierflg);
384  gMinuit.mnparm(5, "g2", start[5], step, 0, 0, ierflg);
385  gMinuit.mnparm(6, "Dgamma", start[6], is55 ? 0 : step, 0, 0, ierflg);
386  }
387 
388  gMinuit.SetFCN(FitFCN);
389  // Now ready for minimization step
390  arglist[0] = 1000;
391  arglist[1] = 1.;
392 
393  gMinuit.mnexcm("MINIMIZE", arglist, 2, ierflg);
394  if ("no" != Verbose)
395  cout << "Minuit error flag: " << ierflg << endl;
396  if (ierflg) {
397  cout << "\t Spectrum fit failed during Minuit." << endl;
398  cout << "\t Change initial conditions or change unfolding function" << endl;
399  throw std::exception();
400  }
401 
402  double fitParameters[N];
403  double fitParErrors[N];
404  for (int i = 0; i < N; i++)
405  gMinuit.GetParameter(i, fitParameters[i], fitParErrors[i]);
406 
407  parsFit.ResizeTo(N);
408 
409  for (int i = 0; i < N; i++) {
410  parsFit[i] = fitParameters[i];
411  parsErrorsFit[i] = fitParErrors[i];
412  }
413 
414  int ncol = vecLgE.GetNoElements();
415  TVectorD CorrFactor(ncol);
416  CorrFactor = GetCorrectionFactor(vecLgE, kmatrix, &fitParameters[0], modelfunctions.c_str());
417 
418 
419  if (computeCovStat) {
420  TMatrixD cov(N, N);
421  gMinuit.mnemat(&cov[0][0], N);
422  UnfoldCorrectionFactorCoV.ResizeTo(ncol, ncol);
424  }
425 
426  return CorrFactor;
427 }
428 
429 void FitFCN(Int_t& npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag) {
430  f = Likelihood(par);
431 }
432 
433 
434 double Likelihood(double* pars) {
435 
436  int ncol = vecLgE.GetNoElements();
437  TVectorD mwraws0 = FluxModel(modelfunctions.c_str(), vecLgE, pars); // dN/dE
438 
439  for (int i = 0; i < ncol; ++i)
440  mwraws0[i] = mwraws0[i] * pow(10., vecLgE[i]) * log(10);// dN/dlogE
441 
442  TVectorD mwraws = kmatrix * mwraws0;
443  mwraws *= thLgE->GetBinWidth(1);
444 
445  int N = raw_nevents.GetNoElements();
446  TVectorD mws(N);
447  mws.Zero();
448 
449  for (int i = 0; i < ncol; ++i) {
450 
451  double ilgE = vecLgE[i];
452 
453  int bin = rawAxis_lgE->FindBin(ilgE);
454 
455  if (bin < 1)
456  continue;
457 
458  if (bin > N)
459  break;
460 
461  mws[bin - 1] += mwraws[i] * thLgE->GetBinWidth(1); // expected number of events (delta in poisson distrib.)
462  }
463 
464  TVectorD like(N);
465  for (int i = 0; i < N; ++i)
466  like[i] = mws[i] - raw_nevents[i] * log(mws[i]);
467 
468  // neg-log-likelihood fit assuming Poisson fluctuations
469  return like.Sum();
470 
471 }
472 
473 void PrintResults(TVectorD parsFit, TVectorD parsErrorsFit) {
474  cout << setprecision(5) << endl;
475 
476  double J0 = pow(10., parsFit[0]) / exposure;
477  double errorJ0 = J0 * log(10) * parsErrorsFit[0];
478 
479  if (modelfunctions == "StandardICRC2015") {
480  cout << endl;
481  cout << "\t Resulting parameters fitting the regular array flux model (broken PL + smooth suppression): \n" << endl;
482  cout << "\t Flux normalization: " << J0 << " +- " << errorJ0 << endl;
483  cout << "\t Eankle: " << pow(10., parsFit[1]) << " +- " << pow(10., parsFit[1])*log(10)*parsErrorsFit[1] << " eV " << endl;
484  cout << "\t Esuppression: " << pow(10., parsFit[4]) << " +- " << pow(10., parsFit[4])*log(10)*parsErrorsFit[4] << " eV " << endl;
485  cout << "\t gamma1 " << parsFit[2] << " +- " << parsErrorsFit[2] << endl;
486  cout << "\t gamma2 " << parsFit[3] << " +- " << parsErrorsFit[3] << endl;
487  cout << "\t Delta_gamma " << parsFit[5] << " +- " << parsErrorsFit[5] << endl;
488  cout << "\n" << endl;
489  } else if (modelfunctions == "StandardMultiSmooth") {
490  cout << endl;
491  cout << "\t Resulting parameters fitting the ICRC 2017 folding model (3 breaks PL): \n" << endl;
492  cout << "\t Flux normalization: " << J0 << " +- " << errorJ0 << endl;
493  cout << "\t Eankle: " << pow(10., parsFit[1]) << " +- " << pow(10., parsFit[1])*log(10)*parsErrorsFit[1] << " eV " << endl;
494  cout << "\t Ex: " << pow(10., parsFit[2]) << " +- " << pow(10., parsFit[2])*log(10)*parsErrorsFit[2] << " eV " << endl;
495  cout << "\t Esuppression: " << pow(10., parsFit[3]) << " +- " << pow(10., parsFit[3])*log(10)*parsErrorsFit[3] << " eV " << endl;
496  cout << "\t gamma1 " << parsFit[4] << " +- " << parsErrorsFit[4] << endl;
497  cout << "\t gamma2 " << parsFit[5] << " +- " << parsErrorsFit[5] << endl;
498  cout << "\t gamma3 " << parsFit[6] << " +- " << parsErrorsFit[6] << endl;
499  cout << "\t gamma4 " << parsFit[7] << " +- " << parsErrorsFit[7] << endl;
500  cout << "\n" << endl;
501  } else if (modelfunctions == "InfillHard") {
502  cout << endl;
503  cout << "\t Resulting parameters fitting the Infill array flux model: \n" << endl;
504  cout << "\t Flux normalization: " << J0 << " +- " << errorJ0 << endl;
505  cout << "\t Eankle: " << pow(10., parsFit[1]) << " +- " << pow(10., parsFit[1])*log(10)*parsErrorsFit[1] << " eV " << endl;
506  cout << "\t gamma1 " << parsFit[2] << " +- " << parsErrorsFit[2] << endl;
507  cout << "\t gamma2 " << parsFit[3] << " +- " << parsErrorsFit[3] << endl;
508  cout << "\n" << endl;
509  } else if (modelfunctions == "Spectrum2015_2017SmoothAnkle") {
510  cout << endl;
511  cout << "\t Resulting parameters fitting the regular array flux model (Smooth ankle + smooth suppression): \n" << endl;
512  cout << "\t Flux normalization: " << J0 << " +- " << errorJ0 << endl;
513  cout << "\t Eankle: " << pow(10., parsFit[1]) << " +- " << pow(10., parsFit[1])*log(10)*parsErrorsFit[1] << " eV " << endl;
514  cout << "\t Esuppression: " << pow(10., parsFit[4]) << " +- " << pow(10., parsFit[4])*log(10)*parsErrorsFit[4] << " eV " << endl;
515  cout << "\t gamma1 " << parsFit[2] << " +- " << parsErrorsFit[2] << endl;
516  cout << "\t gamma2 " << parsFit[3] << " +- " << parsErrorsFit[3] << endl;
517  cout << "\t Delta_gamma " << parsFit[5] << " +- " << parsErrorsFit[5] << endl;
518  cout << "\n" << endl;
519  } else if (modelfunctions == "SpectrumInfillICRC2019") {
520  cout << endl;
521  cout << "\t Resulting parameters fitting the ICRC 2019 infill function: \n" << endl;
522  cout << "\t Flux normalization: " << J0 << " +- " << errorJ0 << endl;
523  cout << "\t Ebreak: " << pow(10., parsFit[1]) << " +- " << pow(10., parsFit[1])*log(10)*parsErrorsFit[1] << " eV " << endl;
524  cout << "\t Eankle: " << pow(10., parsFit[2]) << " +- " << pow(10., parsFit[2])*log(10)*parsErrorsFit[2] << " eV " << endl;
525  cout << "\t gamma0 " << parsFit[3] << " +- " << parsErrorsFit[3] << endl;
526  cout << "\t gamma1 " << parsFit[4] << " +- " << parsErrorsFit[4] << endl;
527  cout << "\t gamma2 " << parsFit[5] << " +- " << parsErrorsFit[5] << endl;
528  cout << "\t dGamma " << parsFit[6] << " +- " << parsErrorsFit[6] << endl;
529  cout << "\n" << endl;
530  }
531 
532 }
const int Npar
TVectorD raw_staterrup_rebinned
double FluxModel(const modeltype mtype, double *x, double *par)
void PrintUsage(int nArgs)
string OutPutFileNameRebinned
TVectorD raw_lgEs
const bool HeraldAnalysis
TMatrixD kResolutionMatrixDD(TVectorD pCal, TVectorD xos, Double_t lat, Double_t deltaMin, Double_t deltaMax)
string Verbose
TVectorD parsErrorsFit
const double SpectrumBinSize[2]
TVectorD GetSDCalPars(bool infill=false)
void poisson_uncertainty(double x, double &plow, double &pup)
Definition: Statistics.icc:1
void TestFormat(string, int)
const unsigned int npar
Definition: UnivRec.h:75
vector< t2list > out
output of the algorithm: a list of clusters
Definition: XbAlgo.cc:32
double Likelihood(double *pars)
TVectorD raw_staterrlow_rebinned
const double SpectrumBins[15][15]
double pow(const double x, const unsigned int i)
double exposure
void LoadParam(string paramFileName)
const double IntXmax[2]
const modeltype modelfunctions[2]
map< string, Double_t > mapParameters
string VersionInput
const double IntXmin[2]
TAxis * rawAxis_lgE
TMatrixD UnfoldCorrectionFactorCoV
int main(int argc, char *argv[])
Definition: DBSync.cc:58
TVectorD MinuitMinimization(double *start, bool computeCovStat)
TVectorD raw_flux_rebinned
TVectorD raw_staterrup
double InverseSdCalibration(const double lgE, TVectorD pCal)
TVectorD UnfoldCorrectionFactorMax
string SDFile
double ScaledErrorFunction(const double x, const std::vector< double > &pars)
string OutPutFileName
const double SpectrumMin[2]
TVectorD raw_flux
TVectorD parsFit
TAxis * thLgE
TMatrixD propagate_covariance(TVectorD(*f)(TVectorD, const modeltype), TVectorD x, TMatrixD xcov, const modeltype mtype)
Definition: Statistics.icc:50
void PrintResults()
const int IntegrationSteps
TVectorD UnfoldCorrectionFactorMin
void ReadEventListICRC2019(TH1D *th1, TH1D *th2, string FileName)
string DeclinationDepentMatrix
double(*)(double *, double *) FluxModels(const modeltype mtype)
void ReadEventList(TH1D *th1, TH1D *th2, string FileName)
TMatrixD kResolutionMatrix(TVectorD pCal, TVectorD xos, double *resolutionOffset, const bool useResFromData, const bool infill)
Double_t DirectionalExposure(Double_t lat, Double_t deltaMin, Double_t deltaMax)
TMatrixD kmatrix
TVectorD raw_staterrlow
const int BinNum[2]
void FitFCN(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
string CodeUsed
string Model
TVectorD vecLgE
TVectorD raw_lgEs_rebinned
TVectorD UnfoldCorrectionFactor
TVectorD raw_nevents_rebinned
const double SpectrumMax[2]
TVectorD raw_nevents
double fParFitInit[Npar]
TVectorD GetCorrectionFactor(const TVectorD x, const TMatrixD m, double *par, const modeltype mtype)

, generated on Tue Sep 26 2023.