diff --git a/src/ToDo.txt b/src/ToDo.txt index 1b0d1e0b..1f2b4947 100644 --- a/src/ToDo.txt +++ b/src/ToDo.txt @@ -39,6 +39,7 @@ short term: **DONE** 08-03-10 * implement table based theory functions (LF stuff) + static GKT LF **DONE** 08-03-12 * check midas keyboard routines for the usability diff --git a/src/classes/PFitter.cpp b/src/classes/PFitter.cpp index 713ee17d..1e7b2d79 100644 --- a/src/classes/PFitter.cpp +++ b/src/classes/PFitter.cpp @@ -30,13 +30,22 @@ ***************************************************************************/ #include +#include using namespace std; +#include + #include "Minuit2/FunctionMinimum.h" #include "Minuit2/MnMinimize.h" #include "Minuit2/MnMigrad.h" #include "Minuit2/MnMinos.h" #include "Minuit2/MnSimplex.h" +#include "Minuit2/MnUserParameterState.h" + +#include "TCanvas.h" +#include "TH2.h" +#include "TFile.h" +#include "TDatime.h" #include "PFitter.h" @@ -423,7 +432,7 @@ bool PFitter::ExecuteMinos() */ bool PFitter::ExecuteSave() { - cout << "PFitter::ExecuteSave(): not yet implemented ..." << endl; + cout << "PFitter::ExecuteSave(): will write minuit2 output file ..." << endl; // if any minimization was done, otherwise get out immediately if (!fFcnMin) { @@ -431,6 +440,169 @@ bool PFitter::ExecuteSave() return false; } + ROOT::Minuit2::MnUserParameterState mnState = fFcnMin->UserState(); + + // check if the user parameter state is valid + if (!mnState.IsValid()) { + cout << endl << "**WARNING** Minuit2 User Parameter State is not valid, i.e. nothing to be saved"; + cout << endl; + return false; + } + + ofstream fout; + + // open minuit2 output file + fout.open("MINUIT2.OUTPUT", iostream::out); + if (!fout.is_open()) { + cout << endl << "**ERROR** PFitter::ExecuteSave() couldn't open MINUIT2.OUTPUT file"; + cout << endl; + return false; + } + + // write header + TDatime dt; + fout << endl << "*************************************************************************"; + fout << endl << " musrfit MINUIT2 output file from " << fRunInfo->GetFileName().Data() << " - " << dt.AsSQLString(); + fout << endl << "*************************************************************************"; + fout << endl; + + // write global informations + fout << endl << " Fval() = " << mnState.Fval() << ", Edm() = " << mnState.Edm() << ", NFcn() = " << mnState.NFcn(); + fout << endl; + fout << endl << "*************************************************************************"; + + // write parameters + fParams = *(fRunInfo->GetMsrParamList()); // get the update parameters back + fout << endl << " PARAMETERS"; + fout << endl << "-------------------------------------------------------------------------"; + fout << endl << " Parabolic Minos"; + fout << endl << " No Name Value Error Negative Positive Limits"; + for (unsigned int i=0; i 0.0) + fout << " "; + fout.setf(ios::left, ios::adjustfield); + fout.precision(6); + fout.width(14); + fout << cov(i,j); + } + } + } else { + fout << endl << " no covariance matrix available"; + } + fout << endl; + fout << endl << "*************************************************************************"; + + // write correlation matrix + fout << endl << " CORRELATION COEFFICIENTS"; + fout << endl << "-------------------------------------------------------------------------"; + if (mnState.HasGlobalCC() && mnState.HasCovariance()) { + ROOT::Minuit2::MnGlobalCorrelationCoeff corr = mnState.GlobalCC(); + ROOT::Minuit2::MnUserCovariance cov = mnState.Covariance(); + fout << endl << " No Global "; + for (unsigned int i=0; iGetFileName(); + title += " - "; + title += dt.AsSQLString(); + TCanvas *ccorr = new TCanvas("ccorr", "title", 500, 500); + TH2D *hcorr = new TH2D("hcorr", title, fParams.size(), 0.0, fParams.size(), fParams.size(), 0.0, fParams.size()); + double dval; + for (unsigned int i=0; iFill((double)i,(double)i,1.0); + } else { + dval = cov(i,j)/(fMnUserParams.Error(i)*fMnUserParams.Error(j)); + hcorr->Fill((double)i,(double)j,dval); + fout << dval; + } + } + } + // write correlation matrix into a root file + TFile ff("MINUIT2.root", "recreate"); + ccorr->Draw(); + hcorr->Draw("COLZTEXT"); + ccorr->Write(); + ff.Close(); + // clean up + if (ccorr) + delete ccorr; + if (hcorr) + delete hcorr; + } else { + fout << endl << " no correlation coefficients available"; + } + + // close MINUIT2.OUTPUT file + fout.close(); + return true; } diff --git a/src/include/PMsrHandler.h b/src/include/PMsrHandler.h index 18d4e167..2b9e07e4 100644 --- a/src/include/PMsrHandler.h +++ b/src/include/PMsrHandler.h @@ -68,6 +68,7 @@ class PMsrHandler virtual PMsrStatisticStructure* GetMsrStatistic() { return &fStatistic; } virtual unsigned int GetNoOfParams() { return fParam.size(); } + virtual const TString& GetFileName() const { return fFileName; } virtual bool SetMsrParamValue(unsigned int i, double value); virtual bool SetMsrParamStep(unsigned int i, double value);