18 MnParameterScan::MnParameterScan(
const FCNBase& fcn,
const MnUserParameters& par) : fFCN(fcn), fParameters(par), fAmin(fcn(par.Params())) {}
20 MnParameterScan::MnParameterScan(
const FCNBase& fcn,
const MnUserParameters& par,
double fval) : fFCN(fcn), fParameters(par), fAmin(fval) {}
22 std::vector<std::pair<double, double> > MnParameterScan::operator()(
unsigned int par,
unsigned int maxsteps,
double low,
double high) {
26 std::vector<std::pair<double, double> > result; result.reserve(maxsteps+1);
27 std::vector<double> params = fParameters.Params();
28 result.push_back(std::pair<double, double>(params[par], fAmin));
30 if(low > high)
return result;
31 if(maxsteps < 2)
return result;
33 if(low == 0. && high == 0.) {
34 low = params[par] - 2.*fParameters.Error(par);
35 high = params[par] + 2.*fParameters.Error(par);
38 if(low == 0. && high == 0. && fParameters.Parameter(par).HasLimits()) {
39 if(fParameters.Parameter(par).HasLowerLimit())
40 low = fParameters.Parameter(par).LowerLimit();
41 if(fParameters.Parameter(par).HasUpperLimit())
42 high = fParameters.Parameter(par).UpperLimit();
45 if(fParameters.Parameter(par).HasLimits()) {
46 if(fParameters.Parameter(par).HasLowerLimit())
47 low = std::max(low, fParameters.Parameter(par).LowerLimit());
48 if(fParameters.Parameter(par).HasUpperLimit())
49 high = std::min(high, fParameters.Parameter(par).UpperLimit());
53 double stp = (high - low)/
double(maxsteps - 1);
54 for(
unsigned int i = 0; i < maxsteps; i++) {
55 params[par] = x0 + double(i)*stp;
56 double fval = fFCN(params);
58 fParameters.SetValue(par, params[par]);
61 result.push_back(std::pair<double, double>(params[par], fval));