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));