From 686419119f5fb9546b9d741bf2ab9c642760a58a Mon Sep 17 00:00:00 2001 From: nemu Date: Fri, 12 Mar 2010 15:13:39 +0000 Subject: [PATCH] some minor improvments in the SCAN/CONTOURS handling --- src/classes/PFitter.cpp | 29 +++++++++++++++++++++++++---- src/include/PFitter.h | 2 ++ src/musrfit.cpp | 9 +++++---- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/classes/PFitter.cpp b/src/classes/PFitter.cpp index e83ea118..96679cb9 100644 --- a/src/classes/PFitter.cpp +++ b/src/classes/PFitter.cpp @@ -71,6 +71,7 @@ using namespace std; PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bool_t chisq_only) : fChisqOnly(chisq_only), fRunInfo(runInfo) { + fIsScanOnly = true; fConverged = false; fUseChi2 = true; // chi^2 is the default @@ -356,14 +357,18 @@ Bool_t PFitter::CheckCommands() } else if (it->fLine.Contains("EIGEN")) { fCmdList.push_back(PMN_EIGEN); } else if (it->fLine.Contains("HESSE")) { + fIsScanOnly = false; fCmdList.push_back(PMN_HESSE); } else if (it->fLine.Contains("MACHINE_PRECISION")) { fCmdList.push_back(PMN_MACHINE_PRECISION); } else if (it->fLine.Contains("MIGRAD")) { + fIsScanOnly = false; fCmdList.push_back(PMN_MIGRAD); } else if (it->fLine.Contains("MINIMIZE")) { + fIsScanOnly = false; fCmdList.push_back(PMN_MINIMIZE); } else if (it->fLine.Contains("MINOS")) { + fIsScanOnly = false; fCmdList.push_back(PMN_MINOS); } else if (it->fLine.Contains("MNPLOT")) { fCmdList.push_back(PMN_PLOT); @@ -578,6 +583,20 @@ Bool_t PFitter::ExecuteContours() { cout << ">> PFitter::ExecuteContours() ..." << endl; + // if already some minimization is done use the minuit2 output as input + if (!fFcnMin) { + cerr << endl << "**WARNING**: CONTOURS musn't be called before any minimization (MINIMIZE/MIGRAD/SIMPLEX) is done!!"; + cerr << endl; + return false; + } + + // check if minimum was valid + if (!fFcnMin->IsValid()) { + cerr << endl << "**ERROR**: CONTOURS cannot started since the previous minimization failed :-("; + cerr << endl; + return false; + } + ROOT::Minuit2::MnContours contours((*fFitterFcn), *fFcnMin); fScanData = contours(fScanParameter[0], fScanParameter[1], fScanNoPoints); @@ -856,6 +875,8 @@ Bool_t PFitter::ExecuteScan() fScanData = scan.Scan(fScanParameter[0], fScanNoPoints, fScanLow, fScanHigh); } + fConverged = true; + return true; } @@ -958,15 +979,15 @@ Bool_t PFitter::ExecuteSave() fout.setf(ios::left, ios::adjustfield); fout.width(7); if (fParams[i].fLowerBoundaryPresent) - fout << fParams[i].fLowerBoundary; + fout << fParams[i].fLowerBoundary; else - fout << "---"; + fout << "---"; fout.setf(ios::left, ios::adjustfield); fout.width(7); if (fParams[i].fUpperBoundaryPresent) - fout << fParams[i].fUpperBoundary; + fout << fParams[i].fUpperBoundary; else - fout << "---"; + fout << "---"; } else { fout.setf(ios::left, ios::adjustfield); fout.width(7); diff --git a/src/include/PFitter.h b/src/include/PFitter.h index e07d23b2..e64675f2 100644 --- a/src/include/PFitter.h +++ b/src/include/PFitter.h @@ -68,11 +68,13 @@ class PFitter virtual ~PFitter(); Bool_t IsValid() { return fIsValid; } + Bool_t IsScanOnly() { return fIsScanOnly; } Bool_t HasConverged() { return fConverged; } Bool_t DoFit(); private: Bool_t fIsValid; + Bool_t fIsScanOnly; Bool_t fConverged; Bool_t fChisqOnly; Bool_t fUseChi2; diff --git a/src/musrfit.cpp b/src/musrfit.cpp index 71511bfe..bfd8e078 100644 --- a/src/musrfit.cpp +++ b/src/musrfit.cpp @@ -497,12 +497,13 @@ int main(int argc, char *argv[]) fitter = new PFitter(msrHandler, runListCollection, chisq_only); if (fitter->IsValid()) { fitter->DoFit(); - msrHandler->SetMsrStatisticConverged(fitter->HasConverged()); + if (!fitter->IsScanOnly()) + msrHandler->SetMsrStatisticConverged(fitter->HasConverged()); } } // write log file - if (success && !chisq_only) { + if (success && !chisq_only && !fitter->IsScanOnly()) { status = msrHandler->WriteMsrLogFile(); if (status != PMUSR_SUCCESS) { switch (status) { @@ -532,7 +533,7 @@ int main(int argc, char *argv[]) } // rename MINUIT2.OUTPUT and MINUIT2.root file if wanted - if (keep_mn2_output && !chisq_only) { + if (keep_mn2_output && !chisq_only && !fitter->IsScanOnly()) { // 1st rename MINUIT2.OUTPUT TString fln = TString(filename); char ext[32]; @@ -547,7 +548,7 @@ int main(int argc, char *argv[]) gSystem->CopyFile("MINUIT2.root", fln.Data(), kTRUE); } - if (!chisq_only) { + if (!chisq_only && !fitter->IsScanOnly()) { // swap msr- and mlog-file cout << endl << ">> swapping msr-, mlog-file ..." << endl; // copy msr-file -> __temp.msr