14 #include "Math/WrappedTF1.h"
20 #include <TGraphAsymmErrors.h>
21 #include <TGraphErrors.h>
26 #include <TApplication.h>
32 #include <TFeldmanCousins.h>
66 void FitFCN(Int_t&
npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag);
80 const double EeV = 1e18;
82 int main(
int argc,
char* argv[]) {
88 string DataFileName =
SDFile;
110 for (Int_t i = 0; i < BinNum + 1; i++) {
111 ostringstream convert;
113 string nameParameter =
"r";
114 nameParameter += convert.str();
118 cout <<
"Input File: " << DataFileName << endl;
122 int hnbins = round((SpectrumMax - SpectrumMin) / SpectrumBinSize);
123 TH1D* thEnergySpectrum =
new TH1D(
"thEnergySpectrum",
"", hnbins, SpectrumMin, SpectrumMax);
124 TH1D* thEnergySpectrum_rebinned =
new TH1D(
"thEnergySpectrum_rebinned",
"", BinNum, SpectrumBins);
136 vector <double> vLogESD;
140 ReadEventList(vLogESD,thEnergySpectrum, thEnergySpectrum_rebinned, DataFileName);
144 cerr <<
"\nRead in " << thEnergySpectrum->GetEntries() <<
" events\n" << endl;
149 int Nbins = thEnergySpectrum->GetNbinsX();
152 TGraphAsymmErrors* tgEnergySpectrum =
new TGraphAsymmErrors();
153 for (
int i = 1; i <= Nbins; ++i) {
154 double binW = thEnergySpectrum->GetBinWidth(i);
155 double we =
pow(10, thEnergySpectrum->GetBinCenter(i) + binW / 2) -
pow(10, thEnergySpectrum->GetBinCenter(i) - binW / 2);
157 double lgE = thEnergySpectrum->GetBinCenter(i);
158 double content = thEnergySpectrum->GetBinContent(i) / factor;
159 tgEnergySpectrum->SetPoint(i - 1, lgE, content);
162 tgEnergySpectrum->SetPointError(i - 1, 0., 0., plow / factor, pup / factor);
164 raw_nevents[i - 1] = thEnergySpectrum->GetBinContent(i);
173 int Nbins_rebinned = thEnergySpectrum_rebinned->GetNbinsX();
176 for (
int i = 1; i <= Nbins_rebinned; ++i) {
178 double binW_rebinned = thEnergySpectrum_rebinned->GetBinWidth(i);
179 double we_rebinned =
pow(10, thEnergySpectrum_rebinned->GetBinCenter(i) + binW_rebinned / 2) -
pow(10, thEnergySpectrum_rebinned->GetBinCenter(i) - binW_rebinned / 2);
180 double factor_rebinned =
exposure * we_rebinned;
181 double lgE_rebinned = thEnergySpectrum_rebinned->GetBinCenter(i);
182 double content_rebinned = thEnergySpectrum_rebinned->GetBinContent(i) / factor_rebinned;
184 double plow_rebinned, pup_rebinned;
185 poisson_uncertainty(thEnergySpectrum_rebinned->GetBinContent(i), plow_rebinned, pup_rebinned);
202 cerr <<
"Performing initial fit to StandardMultiSmooth\n";
214 cerr <<
"Performing initial fit to StandardICRC2015\n";
224 cerr <<
"Performing initial fit to Spectrum2015_2017SmoothAnkle\n";
234 cerr <<
"Performing initial fit to InfillHard\n";
242 cerr <<
"Performing initial fit to SpectrumInfillICRC2019\n";
259 cerr <<
"Performing initial fit to SpectrumLipari\n";
279 tgEnergySpectrum->Fit(FitFunction,
"q");
281 tgEnergySpectrum->Fit(FitFunction);
283 for (
int i = 0; i <
Npar; i++) {
284 fParFitInit[i] = FitFunction->GetParameter(i);
290 Nbins = thEnergySpectrum->GetNbinsX();
291 for (
int i = 1; i <= Nbins; ++i) {
292 if (thEnergySpectrum->GetBinContent(i)==0){
293 double xerr_lo, xerr_up, yerr_lo, yerr_up;
294 xerr_lo = tgEnergySpectrum->GetErrorXlow(i -1);
295 xerr_up = tgEnergySpectrum->GetErrorXhigh(i -1);
296 yerr_lo = tgEnergySpectrum->GetErrorYlow(i -1);
297 yerr_up = tgEnergySpectrum->GetErrorYhigh(i -1);
298 double plow0, pup0, plow1, pup1;
300 FC_UpperLimits( thEnergySpectrum->GetBinContent(i), plow1, pup1 );
301 double fac = pup1/pup0;
302 tgEnergySpectrum->SetPointError(i - 1, xerr_lo, xerr_up, yerr_lo, yerr_up*fac);
307 Nbins_rebinned = thEnergySpectrum_rebinned->GetNbinsX();
308 for (
int i = 1; i <= Nbins_rebinned; ++i) {
309 if (thEnergySpectrum_rebinned->GetBinContent(i)==0){
310 double plow0, pup0, plow1, pup1;
312 FC_UpperLimits( thEnergySpectrum_rebinned->GetBinContent(i), plow1, pup1 );
313 double fac = pup1/pup0;
326 int nbins = round((
IntXmax -
IntXmin) / thEnergySpectrum->GetBinWidth(1));
331 for (
int i = 1; i <= N; ++i)
336 double resolutionOffset[2] = {0, 0};
350 start[0] = fParFitInit[0] + lgExp;
352 for (
int ipar = 1; ipar <
Npar; ipar++)
353 start[ipar] = fParFitInit[ipar];
359 TVectorD unfoldstat(N);
362 for (
int i = 0; i < N; ++i) {
364 dlgE[i] =
thLgE->GetBinCenter(1) / 2.;
376 TFile *fRootOut =
new TFile(OutPutRootFileName.c_str(),
"RECREATE");
380 for (
int i=0; i<
Npar; i++){
385 FitFunction->SetParameter(i,
parsFit[i]);
391 TGraphAsymmErrors* gre_JRaw =
new TGraphAsymmErrors();
392 TGraphAsymmErrors* gre_JRawE3 =
new TGraphAsymmErrors();
393 TGraphAsymmErrors* gre_J =
new TGraphAsymmErrors();
394 TGraphAsymmErrors* gre_JE3 =
new TGraphAsymmErrors();
395 TGraph* gr_unf =
new TGraph();
396 TGraphAsymmErrors* gre_unf =
new TGraphAsymmErrors();
401 TVectorD UnfoldCorrectionFactor_Likelihood(Nbins);
403 TVectorD UnfoldCorrectionFactorError_Likelihood(Nbins);
408 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;
410 for (
int i = 0; i <
raw_lgEs.GetNoElements(); ++i) {
414 double factorunfold = UnfoldCorrectionFactor_Likelihood[i];
415 double statunc_factorunfold = UnfoldCorrectionFactorError_Likelihood[i];
417 double nmod =
raw_flux[i] * factorunfold;
423 int n2 = sprintf (buffer2,
"%4.2f %3.2f %6d %6.1f %5.4le %5.4le %5.4le %4.3f %4.3f",
raw_lgEs[i], thEnergySpectrum->GetBinWidth(i) / 2., Nevents ,
exposure, nmod ,lowerror, uperror, factorunfold, statunc_factorunfold);
424 fOut << buffer2 << endl;
431 double J = JRaw * factorunfold;
432 double J_loerr = JRaw_loerr * factorunfold;
433 double J_uperr = JRaw_uperr * factorunfold;
434 double fac =
pow(En,3);
435 gre_JRaw->SetPoint(i, En, JRaw);
436 gre_JRaw->SetPointError(i, 0., 0., JRaw_loerr, JRaw_uperr);
437 gre_JRawE3->SetPoint(i, En, JRaw*fac);
438 gre_JRawE3->SetPointError(i, 0., 0., JRaw_loerr*fac, JRaw_uperr*fac);
439 gre_J->SetPoint(i, En, J);
440 gre_J->SetPointError(i, 0., 0., J_loerr, J_uperr);
441 gre_JE3->SetPoint(i, En, J*fac);
442 gre_JE3->SetPointError(i, 0., 0., J_loerr*fac, J_uperr*fac);
443 gr_unf->SetPoint(i, En, factorunfold);
444 gre_unf->SetPoint(i, En, factorunfold);
445 gre_unf->SetPointError(i, 0., 0., statunc_factorunfold, statunc_factorunfold);
453 TGraphAsymmErrors* gre_JRaw_reb =
new TGraphAsymmErrors();
454 TGraphAsymmErrors* gre_JRawE3_reb =
new TGraphAsymmErrors();
455 TGraphAsymmErrors* gre_J_reb =
new TGraphAsymmErrors();
456 TGraphAsymmErrors* gre_JE3_reb =
new TGraphAsymmErrors();
457 TGraph* gr_unf_reb =
new TGraph();
458 TGraphAsymmErrors* gre_unf_reb =
new TGraphAsymmErrors();
461 TAxis *rawAxis_lgE_reb = thEnergySpectrum_rebinned->GetXaxis();
462 int nbins_reb = rawAxis_lgE_reb->GetNbins();
463 TVectorD UnfoldCorrectionFactor_Likelihood_reb(nbins_reb);
465 TVectorD UnfoldCorrectionFactorError_Likelihood_reb(nbins_reb);
470 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 sigma[unfolding_correction]_stat" << endl;
476 double factorunfold_rebinned = UnfoldCorrectionFactor_Likelihood_reb[i];
477 double statunc_factorunfold_rebinned = UnfoldCorrectionFactorError_Likelihood_reb[i];
485 int n2 = sprintf (buffer2,
"%4.2f %3.2f %6d %6.1f %5.4le %5.4le %5.4le %4.3f %4.3f",
raw_lgEs_rebinned[i], thEnergySpectrum_rebinned->GetBinWidth(i) / 2., Nevents ,
exposure, nmod_rebinned ,lowerror_rebinned, uperror_rebinned, factorunfold_rebinned, statunc_factorunfold_rebinned);
486 fOutRebinned << buffer2 << endl;
493 double J = JRaw * factorunfold_rebinned;
494 double J_loerr = JRaw_loerr * factorunfold_rebinned;
495 double J_uperr = JRaw_uperr * factorunfold_rebinned;
496 double fac =
pow(En,3);
497 gre_JRaw_reb->SetPoint(i, En, JRaw);
498 gre_JRaw_reb->SetPointError(i, 0., 0., JRaw_loerr, JRaw_uperr);
499 gre_JRawE3_reb->SetPoint(i, En, JRaw*fac);
500 gre_JRawE3_reb->SetPointError(i, 0., 0., JRaw_loerr*fac, JRaw_uperr*fac);
501 gre_J_reb->SetPoint(i, En, J);
502 gre_J_reb->SetPointError(i, 0., 0., J_loerr, J_uperr);
503 gre_JE3_reb->SetPoint(i, En, J*fac);
504 gre_JE3_reb->SetPointError(i, 0., 0., J_loerr*fac, J_uperr*fac);
505 gr_unf_reb->SetPoint(i, En, factorunfold_rebinned);
506 gre_unf_reb->SetPoint(i, En, factorunfold_rebinned);
507 gre_unf_reb->SetPointError(i, 0., 0., statunc_factorunfold_rebinned, statunc_factorunfold_rebinned);
511 fOutRebinned.close();
524 cout<<
"PRODUCING COMPACT MATRIX "<<endl;
525 TF1* FitFunctionFitted;
526 FitFunctionFitted =
new TF1(
"FittingFunctionFitted",
FluxModels(
modelfunctions.c_str()), SpectrumMin, SpectrumMax, Npar);
527 for (
int u=0;u<
Npar;u++)
529 FitFunctionFitted->SetParameter(u,
parsFit[u]);
556 TGraph* gr_ffitE3_NoBinSizeCorr =
new TGraph();
557 TGraphAsymmErrors* gre_ffitE3_NoBinSizeCorr =
new TGraphAsymmErrors();
558 TGraph* gr_ffitE3 =
new TGraph();
559 TGraphAsymmErrors* gre_ffitE3 =
new TGraphAsymmErrors();
560 TGraph* gr_ffitRawE3 =
new TGraph();
561 TGraphAsymmErrors* gre_ffitRawE3 =
new TGraphAsymmErrors();
562 TGraph* gr_f_unf =
new TGraph();
563 TGraphAsymmErrors* gre_f_unf =
new TGraphAsymmErrors();
564 int NbinsX = thEnergySpectrum->GetNbinsX();
565 double xmin = thEnergySpectrum->GetBinLowEdge(1);
566 double xmax = thEnergySpectrum->GetBinLowEdge(NbinsX) + thEnergySpectrum->GetBinWidth(NbinsX);
568 double step = (xmax-xmin)/nnx;
570 nnx = (xmax-xmin)/step;
572 for (
int i=0; i<=nnx; i++){
574 double logE = xmin + step*i;
575 double En =
pow(10.,logE);
580 double flogE1 = logE - thEnergySpectrum->GetBinWidth(1)/2;
582 double step_flogE = thEnergySpectrum->GetBinWidth(1)/
nl;
584 for (
int l=0; l<
nl; l++){
585 double flogE = flogE1 + step_flogE*l + step_flogE/2.;
586 double fDeltaE = (
pow(10.,flogE+step_flogE/2.)/1e18 -
pow(10.,flogE-step_flogE/2.)/1e18)*1e18;
587 Jint = Jint + FitFunction->Eval(flogE) * fDeltaE;
589 double DeltaE = (
pow(10.,logE+thEnergySpectrum->GetBinWidth(1)/2.)/1e18
590 -
pow(10.,logE-thEnergySpectrum->GetBinWidth(1)/2.)/1e18 ) * 1e18;
591 double Jint_approx = FitFunction->Eval(logE) * DeltaE;
592 double fcorr_bin = Jint / Jint_approx;
596 double Jexp_nocorr = FitFunction->Eval(logE);
597 double Jexp = Jexp_nocorr * fcorr_bin;
601 double dfdpar_ffit[
Npar];
603 for (
int j=0; j<
Npar; j++){
604 dfdpar_ffit[j] = FitFunction->GradientPar(j,x,0.0001);
606 double ffit_err = 0.;
607 for (
int j1=0; j1<
Npar; j1++){
608 for (
int j2=0; j2<
Npar; j2++){
609 ffit_err = ffit_err + dfdpar_ffit[j1]*dfdpar_ffit[j2] *
parsCov[j1][j2];
612 ffit_err =
sqrt(ffit_err);
613 double Jexp_err = ffit_err;
617 double fac =
pow(En,3);
621 gr_ffitE3_NoBinSizeCorr->SetPoint(i, En, Jexp_nocorr*fac);
622 gre_ffitE3_NoBinSizeCorr->SetPoint(i, En, Jexp_nocorr*fac);
623 gre_ffitE3_NoBinSizeCorr->SetPointError(i, 0., 0., Jexp_err*fac, Jexp_err*fac);
626 gr_ffitE3->SetPoint(i, En, Jexp*fac);
627 gre_ffitE3->SetPoint(i, En, Jexp*fac);
628 gre_ffitE3->SetPointError(i, 0., 0., Jexp_err*fac, Jexp_err*fac);
636 flogE1 = logE - thEnergySpectrum->GetBinWidth(1)/2;
637 double flogE2 = logE + thEnergySpectrum->GetBinWidth(1)/2;
639 TAxis *thLgE_thEnergySpectrumBin =
new TAxis(MM, flogE1, flogE2);
641 TVectorD UnfoldCorrectionFactor_Likelihood_thEnergySpectrum(MM);
642 UnfoldCorrectionFactor_Likelihood_thEnergySpectrum =
645 TVectorD UnfoldCorrectionFactorError_Likelihood_thEnergySpectrum(MM);
646 UnfoldCorrectionFactorError_Likelihood_thEnergySpectrum =
649 double unf_thEnergySpectrum = UnfoldCorrectionFactor_Likelihood_thEnergySpectrum[0];
650 double unf_err_thEnergySpectrum = UnfoldCorrectionFactorError_Likelihood_thEnergySpectrum[0];
651 gr_f_unf->SetPoint(i, En, unf_thEnergySpectrum);
652 gre_f_unf->SetPoint(i, En, unf_thEnergySpectrum);
653 gre_f_unf->SetPointError(i, 0., 0., unf_err_thEnergySpectrum, unf_err_thEnergySpectrum);
659 double Jexp_raw = Jexp/unf_thEnergySpectrum;
660 double Jexp_raw_err = Jexp_err/unf_thEnergySpectrum;
661 gr_ffitRawE3->SetPoint(i, En, Jexp_raw*fac);
662 gre_ffitRawE3->SetPoint(i, En, Jexp_raw*fac);
663 gre_ffitRawE3->SetPointError(i, 0., 0., Jexp_raw_err*fac, Jexp_raw_err*fac);
671 TTree *tree_ev =
new TTree(
"tree_ev",
"events");
673 tree_ev->Branch(
"ESD",&ESD,
"ESD/D");
674 for (
int l=0; l<vLogESD.size(); l++){
675 double lgESD = vLogESD.at(l);
676 ESD =
pow(10.,lgESD);
687 TVectorD tPar(Npar), tParErr(Npar);
688 for (
int i=0; i<
Npar; i++){
689 double xpar, xpar_err;
695 if (i==1 || i==2 || i==3) {
705 tParErr(i) = xpar_err;
708 TVectorD tChi2fit(1);
721 thEnergySpectrum->Write();
722 thEnergySpectrum_rebinned->Write();
724 gre_JRaw->Write(
"gre_JRaw");
725 gre_JRawE3->Write(
"gre_JRawE3");
726 gre_J->Write(
"gre_J");
727 gre_JE3->Write(
"gre_JE3");
728 gr_unf->Write(
"gr_unf");
729 gre_unf->Write(
"gre_unf");
731 gre_JRaw_reb->Write(
"gre_JRaw_reb");
732 gre_JRawE3_reb->Write(
"gre_JRawE3_reb");
733 gre_J_reb->Write(
"gre_J_reb");
734 gre_JE3_reb->Write(
"gre_JE3_reb");
735 gr_unf_reb->Write(
"gr_unf_reb");
736 gre_unf_reb->Write(
"gre_unf_reb");
738 gr_f_unf->Write(
"gr_f_unf");
739 gre_f_unf->Write(
"gre_f_unf");
740 gr_ffitE3->Write(
"gr_ffitE3");
741 gre_ffitE3->Write(
"gre_ffitE3");
742 gr_ffitRawE3->Write(
"gr_ffitRawE3");
743 gre_ffitRawE3->Write(
"gre_ffitRawE3");
744 gr_ffitE3_NoBinSizeCorr->Write(
"gr_ffitE3_NoBinSizeCorr");
745 gre_ffitE3_NoBinSizeCorr->Write(
"gre_ffitE3_NoBinSizeCorr");
748 tParErr.Write(
"par_err");
749 tChi2fit.Write(
"Chi2");
751 tIerFlg.Write(
"IerFlg");
761 TVectorD
MinuitMinimization(
double* start, Int_t Npar_Minim,
bool computeCovStat =
true) {
762 const int N = Npar_Minim;
767 gMinuit.SetPrintLevel(1);
770 gMinuit.mnexcm(
"SET ERR", arglist, 1, ierflg);
775 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
776 gMinuit.mnparm(1,
"lgEa", start[1], step, 0, 0, ierflg);
777 gMinuit.mnparm(2,
"g1", start[2], step, 0, 0, ierflg);
778 gMinuit.mnparm(3,
"g2", start[3], step, 0, 0, ierflg);
779 gMinuit.mnparm(4,
"lgEs", start[4], step, 0, 0, ierflg);
780 gMinuit.mnparm(5,
"Dgamma", start[5], step, 0, 0, ierflg);
782 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
783 gMinuit.mnparm(1,
"lgEa", start[1], step, 0, 0, ierflg);
784 gMinuit.mnparm(2,
"lgEx", start[2], step, 0, 0, ierflg);
785 gMinuit.mnparm(3,
"lgEs", start[3], step, 0, 0, ierflg);
786 gMinuit.mnparm(4,
"g1", start[4], step, 0, 0, ierflg);
787 gMinuit.mnparm(5,
"g2", start[5], step, 0, 0, ierflg);
788 gMinuit.mnparm(6,
"g3", start[6], step, 0, 0, ierflg);
789 gMinuit.mnparm(7,
"g4", start[7], step, 0, 0, ierflg);
791 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
792 gMinuit.mnparm(1,
"lgEa", start[1], step, 0, 0, ierflg);
793 gMinuit.mnparm(2,
"g1", start[2], step, 0, 0, ierflg);
794 gMinuit.mnparm(3,
"g2", start[3], step, 0, 0, ierflg);
796 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
797 gMinuit.mnparm(1,
"lgEa", start[1], step, 0, 0, ierflg);
798 gMinuit.mnparm(2,
"g1", start[2], step, 0, 0, ierflg);
799 gMinuit.mnparm(3,
"g2", start[3], step, 0, 0, ierflg);
800 gMinuit.mnparm(4,
"lgEs", start[4], step, 0, 0, ierflg);
801 gMinuit.mnparm(5,
"Dgamma", start[5], step, 0, 0, ierflg);
804 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
805 gMinuit.mnparm(1,
"lgEbreak", start[1], is55 ? 0 : step, 0, 0, ierflg);
806 gMinuit.mnparm(2,
"lgEankle", start[2], step, 0, 0, ierflg);
807 gMinuit.mnparm(3,
"g0", start[3], is55 ? 0 : step, 0, 0, ierflg);
808 gMinuit.mnparm(4,
"g1", start[4], step, 0, 0, ierflg);
809 gMinuit.mnparm(5,
"g2", start[5], step, 0, 0, ierflg);
810 gMinuit.mnparm(6,
"Dgamma", start[6], is55 ? 0 : step, 0, 0, ierflg);
844 gMinuit.mnparm(0,
"Norm", start[0], step, 0, 0, ierflg);
845 gMinuit.mnparm(1,
"lgE12", start[1], step, 0, 0, ierflg);
846 gMinuit.mnparm(2,
"lg23", start[2], step, 0, 0, ierflg);
847 gMinuit.mnparm(3,
"lg34", start[3], step, 0, 0, ierflg);
848 gMinuit.mnparm(4,
"g1", start[4], step, 0, 0, ierflg);
849 gMinuit.mnparm(5,
"g2", start[5], step, 0, 0, ierflg);
850 gMinuit.mnparm(6,
"g3", start[6], step, 0, 0, ierflg);
851 gMinuit.mnparm(7,
"g4", start[7], step, 0, 0, ierflg);
852 gMinuit.mnparm(8,
"w12", start[8], 0, start[8], start[8], ierflg);
853 gMinuit.mnparm(9,
"w23", start[9], 0, start[9], start[9], ierflg);
854 gMinuit.mnparm(10,
"w34", start[10], 0, start[10], start[10], ierflg);
860 if (minDecl==-90. && maxDecl==-42.5){
861 gMinuit.mnparm(0,
"Norm", -13.539070, step, 0, 0, ierflg);
862 gMinuit.mnparm(1,
"lgE12", 18.711274, step, 0, 0, ierflg);
863 gMinuit.mnparm(2,
"lg23", 19.170022, step, 0, 0, ierflg);
864 gMinuit.mnparm(3,
"lg34", 19.660508, step, 0, 0, ierflg);
865 gMinuit.mnparm(4,
"g1", 3.313246, step, 0, 0, ierflg);
866 gMinuit.mnparm(5,
"g2", 2.570759, step, 0, 0, ierflg);
867 gMinuit.mnparm(6,
"g3", 3.070131, step, 0, 0, ierflg);
868 gMinuit.mnparm(7,
"g4", 4.886723, step, 0, 0, ierflg);
871 if (minDecl==-17.3 && maxDecl==25.){
872 gMinuit.mnparm(1,
"lgE12", log10(5.*
EeV), step, log10(3.*
EeV), log10(7.*
EeV), ierflg);
873 gMinuit.mnparm(2,
"lgE23", log10(12.*
EeV), step, log10(8.*
EeV), log10(16.*
EeV), ierflg);
874 gMinuit.mnparm(3,
"lgE34", log10(50.*
EeV), step, log10(20.*
EeV), log10(70.*
EeV), ierflg);
875 gMinuit.mnparm(4,
"g1", 3.3, step, 0, 0, ierflg);
876 gMinuit.mnparm(5,
"g2", 2.5, step, 0, 0, ierflg);
877 gMinuit.mnparm(6,
"g3", 3.2, step, 0, 0, ierflg);
878 gMinuit.mnparm(7,
"g4", 5.0, step, 3., 7., ierflg);
889 gMinuit.mnexcm(
"MINIMIZE", arglist, 2, ierflg);
893 cout <<
"Minuit error flag: " << ierflg << endl;
895 cout <<
"\t Spectrum fit failed during Minuit." << endl;
896 cout <<
"\t Change initial conditions or change unfolding function" << endl;
897 throw std::exception();
900 double fitParameters[N];
901 double fitParErrors[N];
902 for (
int i = 0; i < N; i++)
903 gMinuit.GetParameter(i, fitParameters[i], fitParErrors[i]);
907 for (
int i = 0; i < N; i++) {
913 int ncol =
vecLgE.GetNoElements();
914 TVectorD CorrFactor(ncol);
917 if (computeCovStat) {
929 TMatrixD cov_minuit(N, N);
930 gMinuit.mnemat(&cov_minuit[0][0], N);
934 for (
int j1=0; j1<N; j1++){
935 for (
int j2=0; j2<N; j2++){
940 int NFreePars = gMinuit.GetNumFreePars();
941 int iPar_cov[NFreePars];
944 for (
int i=0; i<N; i++){
946 if (TMath::Abs(fitParErrors[i]/fitParameters[i])>1e-40) {
949 iPar_cov[iParFree] = i;
956 for (
int j1=0; j1<NFreePars; j1++){
957 for (
int j2=0; j2<NFreePars; j2++){
958 int i1 = iPar_cov[j1];
959 int i2 = iPar_cov[j2];
960 cov[i1][i2] = cov_minuit[j1][j2];
967 for (
int i1=0; i1<N; i1++){
968 for (
int i2=0; i2<N; i2++){
973 if (TMath::Abs(fitParErrors[i1])>0. && TMath::Abs(
sqrt(cov[i1][i2])/fitParErrors[i1]-1.)>1e-20 )
974 cout << i1 <<
" " << i2 <<
" ERROR --> " << TMath::Abs(
sqrt(cov[i1][i2])/fitParErrors[i1]) << endl;
982 for (
int j1=0; j1<N; j1++){
983 for (
int j2=0; j2<N; j2++){
985 if (fitParErrors[j1]>0. && fitParErrors[j2]>0.)
986 rho[j1][j2] =
parsCov[j1][j2]/fitParErrors[j1]/fitParErrors[j2];
991 for (
int i2=0; i2<N; i2++)
992 printf(
"%5.0d ",i2+1);
994 for (
int i1=0; i1<N; i1++){
995 printf(
"%5.0d ",i1+1);
996 for (
int i2=0; i2<N; i2++){
997 printf(
"%5.2f ",rho[i1][i2]);
1011 double chi2prob = pvalue*1e2;
1012 double nsigma =
sqrt(2.) * TMath::ErfInverse(1.-pvalue);
1014 printf(
" -ln(L) = %f \n",ff);
1016 printf(
" Ndf = %d \n",(
int)
fNdf);
1017 printf(
" Chi2/Ndf = %f Chi2 prob = %f %% - p-value %le \n",
fChi2_lik/
fNdf, chi2prob, pvalue );
1018 printf(
" n x sigma = %f \n", nsigma);
1024 void FitFCN(Int_t&
npar, Double_t* gin, Double_t& f, Double_t* par, Int_t iflag) {
1031 int ncol =
vecLgE.GetNoElements();
1034 for (
int i = 0; i < ncol; ++i)
1035 mwraws0[i] = mwraws0[i] *
pow(10.,
vecLgE[i]) * log(10);
1037 TVectorD mwraws =
kmatrix * mwraws0;
1038 mwraws *=
thLgE->GetBinWidth(1);
1044 for (
int i = 0; i < ncol; ++i) {
1056 mws[bin - 1] += mwraws[i] *
thLgE->GetBinWidth(1);
1060 for (
int i = 0; i < N; ++i)
1066 for (
int i = 0; i < N; ++i){
1068 double fNexp = mws[i];
1070 Dev[i] = 2. * ( (fNexp - fN * log(fNexp)) - (fN - fN * log(fN)) );
1072 Dev[i] = 2. * ( (fNexp - fN * log(fNexp)) - 0. );
1085 cout << setprecision(5) << endl;
1088 double errorJ0 = J0 * log(10) * parsErrorsFit[0];
1092 cout <<
"\t Resulting parameters fitting the regular array flux model (broken PL + smooth suppression): \n" << endl;
1093 cout <<
"\t Flux normalization: " << J0 <<
" +- " << errorJ0 << endl;
1094 cout <<
"\t Eankle: " <<
pow(10., parsFit[1]) <<
" +- " <<
pow(10., parsFit[1])*log(10)*parsErrorsFit[1] <<
" eV " << endl;
1095 cout <<
"\t Esuppression: " <<
pow(10., parsFit[4]) <<
" +- " <<
pow(10., parsFit[4])*log(10)*parsErrorsFit[4] <<
" eV " << endl;
1096 cout <<
"\t gamma1 " << parsFit[2] <<
" +- " << parsErrorsFit[2] << endl;
1097 cout <<
"\t gamma2 " << parsFit[3] <<
" +- " << parsErrorsFit[3] << endl;
1098 cout <<
"\t Delta_gamma " << parsFit[5] <<
" +- " << parsErrorsFit[5] << endl;
1099 cout <<
"\n" << endl;
1102 cout <<
"\t Resulting parameters fitting the ICRC 2017 folding model (3 breaks PL): \n" << endl;
1103 cout <<
"\t Flux normalization: " << J0 <<
" +- " << errorJ0 << endl;
1104 cout <<
"\t Eankle: " <<
pow(10., parsFit[1]) <<
" +- " <<
pow(10., parsFit[1])*log(10)*parsErrorsFit[1] <<
" eV " << endl;
1105 cout <<
"\t Ex: " <<
pow(10., parsFit[2]) <<
" +- " <<
pow(10., parsFit[2])*log(10)*parsErrorsFit[2] <<
" eV " << endl;
1106 cout <<
"\t Esuppression: " <<
pow(10., parsFit[3]) <<
" +- " <<
pow(10., parsFit[3])*log(10)*parsErrorsFit[3] <<
" eV " << endl;
1107 cout <<
"\t gamma1 " << parsFit[4] <<
" +- " << parsErrorsFit[4] << endl;
1108 cout <<
"\t gamma2 " << parsFit[5] <<
" +- " << parsErrorsFit[5] << endl;
1109 cout <<
"\t gamma3 " << parsFit[6] <<
" +- " << parsErrorsFit[6] << endl;
1110 cout <<
"\t gamma4 " << parsFit[7] <<
" +- " << parsErrorsFit[7] << endl;
1111 cout <<
"\n" << endl;
1114 cout <<
"\t Resulting parameters fitting the Infill array flux model: \n" << endl;
1115 cout <<
"\t Flux normalization: " << J0 <<
" +- " << errorJ0 << endl;
1116 cout <<
"\t Eankle: " <<
pow(10., parsFit[1]) <<
" +- " <<
pow(10., parsFit[1])*log(10)*parsErrorsFit[1] <<
" eV " << endl;
1117 cout <<
"\t gamma1 " << parsFit[2] <<
" +- " << parsErrorsFit[2] << endl;
1118 cout <<
"\t gamma2 " << parsFit[3] <<
" +- " << parsErrorsFit[3] << endl;
1119 cout <<
"\n" << endl;
1122 cout <<
"\t Resulting parameters fitting the regular array flux model (Smooth ankle + smooth suppression): \n" << endl;
1123 cout <<
"\t Flux normalization: " << J0 <<
" +- " << errorJ0 << endl;
1124 cout <<
"\t Eankle: " <<
pow(10., parsFit[1]) <<
" +- " <<
pow(10., parsFit[1])*log(10)*parsErrorsFit[1] <<
" eV " << endl;
1125 cout <<
"\t Esuppression: " <<
pow(10., parsFit[4]) <<
" +- " <<
pow(10., parsFit[4])*log(10)*parsErrorsFit[4] <<
" eV " << endl;
1126 cout <<
"\t gamma1 " << parsFit[2] <<
" +- " << parsErrorsFit[2] << endl;
1127 cout <<
"\t gamma2 " << parsFit[3] <<
" +- " << parsErrorsFit[3] << endl;
1128 cout <<
"\t Delta_gamma " << parsFit[5] <<
" +- " << parsErrorsFit[5] << endl;
1129 cout <<
"\n" << endl;
1132 cout <<
"\t Resulting parameters fitting the ICRC 2019 infill function: \n" << endl;
1133 cout <<
"\t Flux normalization: " << J0 <<
" +- " << errorJ0 << endl;
1134 cout <<
"\t Ebreak: " <<
pow(10., parsFit[1]) <<
" +- " <<
pow(10., parsFit[1])*log(10)*parsErrorsFit[1] <<
" eV " << endl;
1135 cout <<
"\t Eankle: " <<
pow(10., parsFit[2]) <<
" +- " <<
pow(10., parsFit[2])*log(10)*parsErrorsFit[2] <<
" eV " << endl;
1136 cout <<
"\t gamma0 " << parsFit[3] <<
" +- " << parsErrorsFit[3] << endl;
1137 cout <<
"\t gamma1 " << parsFit[4] <<
" +- " << parsErrorsFit[4] << endl;
1138 cout <<
"\t gamma2 " << parsFit[5] <<
" +- " << parsErrorsFit[5] << endl;
1139 cout <<
"\t dGamma " << parsFit[6] <<
" +- " << parsErrorsFit[6] << endl;
1140 cout <<
"\n" << endl;
1145 cout <<
"\n" << endl;
1146 printf(
" J0 = (%le +/- %le) \n",J0,errorJ0);
1147 printf(
" E12 = (%3.1f +/- %3.1f) x 1e18 eV \n",
pow(10., parsFit[1])/
EeV,
pow(10., parsFit[1])*log(10)*parsErrorsFit[1]/
EeV);
1148 printf(
" E23 = (%3.1f +/- %3.1f) x 1e18 eV \n",
pow(10., parsFit[2])/
EeV,
pow(10., parsFit[2])*log(10)*parsErrorsFit[2]/
EeV);
1149 printf(
" E34 = (%3.0f +/- %3.0f) x 1e18 eV \n",
pow(10., parsFit[3])/
EeV,
pow(10., parsFit[3])*log(10)*parsErrorsFit[3]/
EeV);
1150 printf(
" gamma1 = %3.2f +/- %3.2f \n",parsFit[4],parsErrorsFit[4]);
1151 printf(
" gamma2 = %3.2f +/- %3.2f \n",parsFit[5],parsErrorsFit[5]);
1152 printf(
" gamma3 = %3.2f +/- %3.2f \n",parsFit[6],parsErrorsFit[6]);
1153 printf(
" gamma4 = %3.1f +/- %3.1f \n",parsFit[7],parsErrorsFit[7]);
1154 printf(
" w12 = %3.2f +/- %3.2f \n",parsFit[8],parsErrorsFit[8]);
1155 printf(
" w23 = %3.2f +/- %3.2f \n",parsFit[9],parsErrorsFit[9]);
1156 printf(
" w34 = %3.2f +/- %3.2f \n",parsFit[10],parsErrorsFit[10]);
1157 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)
Double_t DirectionalExposureZenith(Double_t thetaMin, Double_t thetaMax)
TVectorD raw_staterrlow_rebinned
const double SpectrumBins[15][15]
double pow(const double x, const unsigned int i)
TVectorD GetCorrectionFactorError_Likelihood(const TVectorD x, const TMatrixD m, int npar, TVectorD par, TVectorD parerr, TMatrixD parcov, string model, TAxis *fAxis_lgE)
void LoadParam(string paramFileName)
const modeltype modelfunctions[2]
TVectorD Chi2_lik(double *pars)
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)
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 kResolutionMatrixZenith(TVectorD pCal, TVectorD xos, double *resolutionOffset)
TVectorD GetCorrectionFactor_Likelihood(const TVectorD x, const TMatrixD m, double *par, string model, TAxis *frawAxis_lgE)
void kResolutionMatrixZenith_J(TVectorD pCal, TVectorD xos, double *resolutionOffset, TF1 *FitFunctionFitted)
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)
void FC_UpperLimits(double x, double &plow, double &pup)