diff --git a/src/ToDo.txt b/src/ToDo.txt index 2973cfee..45d29293 100644 --- a/src/ToDo.txt +++ b/src/ToDo.txt @@ -94,6 +94,14 @@ short term: * PFitter.cpp: implement HESSE **DONE** 08-09-01 +* implement the handling for single side limited boundaries for parameters which is + possible in MINUIT2 + syntax would be: + 0.0 100.0 // lower and upper limit + 0.0 none // lower limit only + none 100.0 // upper limit only + **FIRST IMPLEMENTATION DONE, NEEDS EXTENSIVE TESTING** 08-09-23 + * implement FFT with msr-interface --------------------- diff --git a/src/classes/PFitter.cpp b/src/classes/PFitter.cpp index 9584868d..44eb3d0d 100644 --- a/src/classes/PFitter.cpp +++ b/src/classes/PFitter.cpp @@ -280,13 +280,28 @@ bool PFitter::SetParameters() } else { // add free parameter // check if boundaries are given if (fParams[i].fNoOfParams > 5) { // boundaries given - fMnUserParams.Add(fParams[i].fName.Data(), fParams[i].fValue, fParams[i].fStep, - fParams[i].fLowerBoundary, fParams[i].fUpperBoundary); +cout << endl << ">> name=" << fParams[i].fName.Data() << ", lower=" << fParams[i].fLowerBoundaryPresent << ", upper=" << fParams[i].fUpperBoundaryPresent; + if (fParams[i].fLowerBoundaryPresent && + fParams[i].fUpperBoundaryPresent) { // upper and lower boundaries given +cout << endl << ">> lower and upper"; + fMnUserParams.Add(fParams[i].fName.Data(), fParams[i].fValue, fParams[i].fStep, + fParams[i].fLowerBoundary, fParams[i].fUpperBoundary); + } else if (fParams[i].fLowerBoundaryPresent && + !fParams[i].fUpperBoundaryPresent) { // lower boundary limited +cout << endl << ">> lower only"; + fMnUserParams.Add(fParams[i].fName.Data(), fParams[i].fValue, fParams[i].fStep); + fMnUserParams.SetLowerLimit(fParams[i].fName.Data(), fParams[i].fLowerBoundary); + } else { // upper boundary limited +cout << endl << ">> upper only"; + fMnUserParams.Add(fParams[i].fName.Data(), fParams[i].fValue, fParams[i].fStep); + fMnUserParams.SetUpperLimit(fParams[i].fName.Data(), fParams[i].fUpperBoundary); + } } else { // no boundaries given fMnUserParams.Add(fParams[i].fName.Data(), fParams[i].fValue, fParams[i].fStep); } } } +cout << endl; // check if there is an unused parameter, if so, fix it for (unsigned int i=0; i 5) { f.width(7); f.precision(prec); - f << left << fParam[i].fLowerBoundary; + if (fParam[i].fLowerBoundaryPresent) + f << left << fParam[i].fLowerBoundary; + else + f << left << "none"; f << " "; f.width(7); f.precision(prec); - f << left << fParam[i].fUpperBoundary; + if (fParam[i].fUpperBoundaryPresent) + f << left << fParam[i].fUpperBoundary; + else + f << left << "none"; f << " "; } CheckAndWriteComment(f, ++lineNo); @@ -812,7 +818,6 @@ int PMsrHandler::ParameterInUse(unsigned int paramNo) * \code * No Name Value Step/Neg_Error Pos_Error Boundary_Low Boundary_High * x x x x x x x -> 7 Parameters, e.g. after a MINOS fit - * x x x x x x -> 6 Parameters, e.g. after a MIGRAD fit * x x x x x -> 5 Parameters, e.g. after a MINOS fit * without boundaries * x x x x -> 4 Parameters, e.g. after MIGRAD fit @@ -838,15 +843,17 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) while ((iter != lines.end()) && !error) { // init param structure - param.fNoOfParams = -1; - param.fNo = -1; - param.fName = TString(""); - param.fValue = 0.0; - param.fStep = 0.0; - param.fPosErrorPresent = false; - param.fPosError = 0.0; - param.fLowerBoundary = 0.0; - param.fUpperBoundary = 0.0; + param.fNoOfParams = -1; + param.fNo = -1; + param.fName = TString(""); + param.fValue = 0.0; + param.fStep = 0.0; + param.fPosErrorPresent = false; + param.fPosError = 0.0; + param.fLowerBoundaryPresent = false; + param.fLowerBoundary = 0.0; + param.fUpperBoundaryPresent = false; + param.fUpperBoundary = 0.0; tokens = iter->fLine.Tokenize(" \t"); if (!tokens) { @@ -856,7 +863,7 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) } // handle various input possiblities - if ((tokens->GetEntries() < 4) || (tokens->GetEntries() > 7)) { + if ((tokens->GetEntries() < 4) || (tokens->GetEntries() > 7) || (tokens->GetEntries() == 6)) { error = true; } else { // handle the first 4 parameter since they are always the same // parameter number @@ -905,34 +912,13 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) param.fPosError = (double)str.Atof(); } else { str.ToLower(); - if (!str.CompareTo("none")) + if (!str.CompareTo("none", TString::kIgnoreCase)) param.fPosErrorPresent = false; else error = true; } } - // 6 values, i.e. No Name Value Error Lower_Bounderay Upper_Boundary - if (tokens->GetEntries() == 6) { - param.fNoOfParams = 6; - - // lower boundary - ostr = dynamic_cast(tokens->At(4)); - str = ostr->GetString(); - if (str.IsFloat()) - param.fLowerBoundary = (double)str.Atof(); - else - error = true; - - // upper boundary - ostr = dynamic_cast(tokens->At(5)); - str = ostr->GetString(); - if (str.IsFloat()) - param.fUpperBoundary = (double)str.Atof(); - else - error = true; - } - // 7 values, i.e. No Name Value Neg_Error Pos_Error Lower_Bounderay Upper_Boundary if (tokens->GetEntries() == 7) { param.fNoOfParams = 7; @@ -945,7 +931,7 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) param.fPosError = (double)str.Atof(); } else { str.ToLower(); - if (!str.CompareTo("none")) + if (!str.CompareTo("none", TString::kIgnoreCase)) param.fPosErrorPresent = false; else error = true; @@ -954,18 +940,32 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) // lower boundary ostr = dynamic_cast(tokens->At(5)); str = ostr->GetString(); - if (str.IsFloat()) - param.fLowerBoundary = (double)str.Atof(); - else - error = true; + // check if lower boundary is "none", i.e. upper boundary limited only + if (!str.CompareTo("none", TString::kIgnoreCase)) { // none + param.fLowerBoundaryPresent = false; + } else { // assuming that the lower boundary is a number + if (str.IsFloat()) { + param.fLowerBoundary = (double)str.Atof(); + param.fLowerBoundaryPresent = true; + } else { + error = true; + } + } // upper boundary ostr = dynamic_cast(tokens->At(6)); str = ostr->GetString(); - if (str.IsFloat()) - param.fUpperBoundary = (double)str.Atof(); - else - error = true; + // check if upper boundary is "none", i.e. lower boundary limited only + if (!str.CompareTo("none", TString::kIgnoreCase)) { // none + param.fUpperBoundaryPresent = false; + } else { // assuming a number + if (str.IsFloat()) { + param.fUpperBoundary = (double)str.Atof(); + param.fUpperBoundaryPresent = true; + } else { + error = true; + } + } } } @@ -988,9 +988,9 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) cout << endl << "Step/Neg_Error: the starting step value in a fit (a double), or"; cout << endl << " the symmetric error (MIGRAD, SIMPLEX), or"; cout << endl << " the negative error (MINOS)"; - cout << endl << "Pos_Error: the positive error (MINOS), (a double)"; - cout << endl << "Lower_Boundary: the lower boundary allowed for the fit parameter (a double)"; - cout << endl << "Upper_Boundary: the upper boundary allowed for the fit parameter (a double)"; + cout << endl << "Pos_Error: the positive error (MINOS), (a double or \"none\")"; + cout << endl << "Lower_Boundary: the lower boundary allowed for the fit parameter (a double or \"none\")"; + cout << endl << "Upper_Boundary: the upper boundary allowed for the fit parameter (a double or \"none\")"; cout << endl; } else { // everything is OK, therefore add the parameter to the parameter list fParam.push_back(param); diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 61edf595..cb85cf11 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -196,15 +196,17 @@ typedef vector PMsrLines; *

Holds the information of a parameter. */ typedef struct { - int fNoOfParams; ///< how many parameters are given - int fNo; ///< parameter number - TString fName; ///< name - double fValue; ///< value - double fStep; ///< step / error / neg_error, depending on the situation - bool fPosErrorPresent; ///< positive error is defined (as a number) - double fPosError; ///< positive error if present - double fLowerBoundary; ///< lower boundary for the fit parameter - double fUpperBoundary; ///< upper boundary for the fit parameter + int fNoOfParams; ///< how many parameters are given + int fNo; ///< parameter number + TString fName; ///< name + double fValue; ///< value + double fStep; ///< step / error / neg_error, depending on the situation + bool fPosErrorPresent; ///< positive error is defined (as a number) + double fPosError; ///< positive error if present + bool fLowerBoundaryPresent; ///< flag showing if a lower boundary is present + double fLowerBoundary; ///< lower boundary for the fit parameter + bool fUpperBoundaryPresent; ///< flag showing if an upper boundary is present + double fUpperBoundary; ///< upper boundary for the fit parameter } PMsrParamStructure; //-------------------------------------------------------------