14 #include "Math/WrappedTF1.h"
20 #include <TGraphAsymmErrors.h>
21 #include <TGraphErrors.h>
26 #include <TApplication.h>
64 void FitFCN(Int_t&
npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag);
68 int main(
int argc,
char* argv[]) {
74 string DataFileName =
SDFile;
94 for (Int_t i = 0; i < BinNum + 1; i++) {
95 ostringstream convert;
97 string nameParameter =
"r";
98 nameParameter += convert.str();
102 cout <<
"Input File: " << DataFileName << endl;
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);
119 ReadEventList(thEnergySpectrum, thEnergySpectrum_rebinned, DataFileName);
122 cerr <<
"\nRead in " << thEnergySpectrum->GetEntries() <<
" events\n" << endl;
127 int Nbins = thEnergySpectrum->GetNbinsX();
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);
135 double lgE = thEnergySpectrum->GetBinCenter(i);
136 double content = thEnergySpectrum->GetBinContent(i) / factor;
137 tgEnergySpectrum->SetPoint(i - 1, lgE, content);
140 tgEnergySpectrum->SetPointError(i - 1, 0., 0., plow / factor, pup / factor);
142 raw_nevents[i - 1] = thEnergySpectrum->GetBinContent(i);
151 int Nbins_rebinned = thEnergySpectrum_rebinned->GetNbinsX();
154 for (
int i = 1; i <= Nbins_rebinned; ++i) {
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;
162 double plow_rebinned, pup_rebinned;
163 poisson_uncertainty(thEnergySpectrum_rebinned->GetBinContent(i), plow_rebinned, pup_rebinned);
181 cerr <<
"Performing initial fit to StandardMultiSmooth\n";
193 cerr <<
"Performing initial fit to StandardICRC2015\n";
203 cerr <<
"Performing initial fit to Spectrum2015_2017SmoothAnkle\n";
213 cerr <<
"Performing initial fit to InfillHard\n";
221 cerr <<
"Performing initial fit to SpectrumInfillICRC2019\n";
238 tgEnergySpectrum->Fit(FitFunction,
"q");
240 tgEnergySpectrum->Fit(FitFunction);
242 for (
int i = 0; i <
Npar; i++) {
243 fParFitInit[i] = FitFunction->GetParameter(i);
252 int nbins = round((
IntXmax -
IntXmin) / thEnergySpectrum->GetBinWidth(1));
257 for (
int i = 1; i <= N; ++i)
262 double resolutionOffset[2] = {0, 0};
273 start[0] = fParFitInit[0] + lgExp;
275 for (
int ipar = 1; ipar <
Npar; ipar++)
276 start[ipar] = fParFitInit[ipar];
283 TVectorD unfoldstat(N);
286 for (
int i = 0; i < N; ++i) {
289 dlgE[i] =
thLgE->GetBinCenter(1) / 2.;
291 TGraph* tgUnfoldStatValue =
new TGraph(N, &
vecLgE[0], &unfoldstat[0]);
293 TCanvas* c1 =
new TCanvas();
298 TGraphAsymmErrors* tgUnfoldSpectrum =
new TGraphAsymmErrors();
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;
305 for (
int i = 0; i <
raw_lgEs.GetNoElements(); ++i) {
307 double factorunfold = tgUnfold->Eval(
raw_lgEs[i]);
308 double statunc_factorunfold = tgUnfoldStatValue->Eval(
raw_lgEs[i]);
309 double nmod =
raw_flux[i] * factorunfold;
313 fOut <<
raw_lgEs[i] <<
" " << thEnergySpectrum->GetBinWidth(i) / 2. <<
" " <<
raw_nevents[i] <<
" " <<
exposure <<
" " << nmod <<
" " << lowerror <<
" " << uperror <<
" " << factorunfold <<
" " << statunc_factorunfold << endl;
315 tgUnfoldSpectrum->SetPoint(i,
raw_lgEs[i], nmod);
316 tgUnfoldSpectrum->SetPointError(i, 0., 0., lowerror, uperror);
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;
323 double statunc_factorunfold_rebinned = tgUnfoldStatValue->Eval(
raw_lgEs_rebinned[i]);
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;
329 fOutRebinned.close();
337 const int N = Npar_Minim;
342 gMinuit.SetPrintLevel(-1);
345 gMinuit.mnexcm(
"SET ERR", arglist, 1, ierflg);
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);
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);
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);
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);
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);
393 gMinuit.mnexcm(
"MINIMIZE", arglist, 2, ierflg);
395 cout <<
"Minuit error flag: " << ierflg << endl;
397 cout <<
"\t Spectrum fit failed during Minuit." << endl;
398 cout <<
"\t Change initial conditions or change unfolding function" << endl;
399 throw std::exception();
402 double fitParameters[N];
403 double fitParErrors[N];
404 for (
int i = 0; i < N; i++)
405 gMinuit.GetParameter(i, fitParameters[i], fitParErrors[i]);
409 for (
int i = 0; i < N; i++) {
414 int ncol =
vecLgE.GetNoElements();
415 TVectorD CorrFactor(ncol);
419 if (computeCovStat) {
421 gMinuit.mnemat(&cov[0][0], N);
429 void FitFCN(Int_t&
npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag) {
436 int ncol =
vecLgE.GetNoElements();
439 for (
int i = 0; i < ncol; ++i)
440 mwraws0[i] = mwraws0[i] *
pow(10.,
vecLgE[i]) * log(10);
442 TVectorD mwraws =
kmatrix * mwraws0;
443 mwraws *=
thLgE->GetBinWidth(1);
449 for (
int i = 0; i < ncol; ++i) {
461 mws[bin - 1] += mwraws[i] *
thLgE->GetBinWidth(1);
465 for (
int i = 0; i < N; ++i)
474 cout << setprecision(5) << endl;
477 double errorJ0 = J0 * log(10) * parsErrorsFit[0];
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;
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;
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;
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;
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;
TVectorD raw_staterrup_rebinned
double FluxModel(const modeltype mtype, double *x, double *par)
void PrintUsage(int nArgs)
string OutPutFileNameRebinned
const bool HeraldAnalysis
TMatrixD kResolutionMatrixDD(TVectorD pCal, TVectorD xos, Double_t lat, Double_t deltaMin, Double_t deltaMax)
const double SpectrumBinSize[2]
TVectorD GetSDCalPars(bool infill=false)
void poisson_uncertainty(double x, double &plow, double &pup)
void TestFormat(string, int)
vector< t2list > out
output of the algorithm: a list of clusters
double Likelihood(double *pars)
TVectorD raw_staterrlow_rebinned
const double SpectrumBins[15][15]
double pow(const double x, const unsigned int i)
void LoadParam(string paramFileName)
const modeltype modelfunctions[2]
map< string, Double_t > mapParameters
TMatrixD UnfoldCorrectionFactorCoV
int main(int argc, char *argv[])
TVectorD MinuitMinimization(double *start, bool computeCovStat)
TVectorD raw_flux_rebinned
double InverseSdCalibration(const double lgE, TVectorD pCal)
TVectorD UnfoldCorrectionFactorMax
double ScaledErrorFunction(const double x, const std::vector< double > &pars)
const double SpectrumMin[2]
TMatrixD propagate_covariance(TVectorD(*f)(TVectorD, const modeltype), TVectorD x, TMatrixD xcov, const modeltype mtype)
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)
void FitFCN(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
TVectorD raw_lgEs_rebinned
TVectorD UnfoldCorrectionFactor
TVectorD raw_nevents_rebinned
const double SpectrumMax[2]
TVectorD GetCorrectionFactor(const TVectorD x, const TMatrixD m, double *par, const modeltype mtype)