implemented single side parameter boundary handling for MINUIT2
This commit is contained in:
parent
8ba07a692a
commit
4f1ade3ca7
@ -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
|
||||
|
||||
---------------------
|
||||
|
@ -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<fParams.size(); i++) {
|
||||
|
@ -322,11 +322,17 @@ int PMsrHandler::WriteMsrLogFile()
|
||||
if (fParam[i].fNoOfParams > 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<TObjString*>(tokens->At(4));
|
||||
str = ostr->GetString();
|
||||
if (str.IsFloat())
|
||||
param.fLowerBoundary = (double)str.Atof();
|
||||
else
|
||||
error = true;
|
||||
|
||||
// upper boundary
|
||||
ostr = dynamic_cast<TObjString*>(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<TObjString*>(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<TObjString*>(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);
|
||||
|
@ -196,15 +196,17 @@ typedef vector<PMsrLineStructure> PMsrLines;
|
||||
* <p> 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;
|
||||
|
||||
//-------------------------------------------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user