25 MnUserParameterState::MnUserParameterState(
const std::vector<double>& par, 
const std::vector<double>& err) :
 
   26    fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fParameters(MnUserParameters(par, err)), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(MnUserCovariance())
 
   29 MnUserParameterState::MnUserParameterState(
const MnUserParameters& par) :
 
   30    fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fParameters(par), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(MnUserCovariance()) {
 
   33    for(std::vector<MinuitParameter>::const_iterator ipar = MinuitParameters().begin(); ipar != MinuitParameters().end(); ++ipar) {
 
   34       if((*ipar).IsConst() || (*ipar).IsFixed()) 
continue;
 
   35       if((*ipar).HasLimits())
 
   36          fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value()));
 
   38          fIntParameters.push_back((*ipar).Value());
 
   45 MnUserParameterState::MnUserParameterState(
const std::vector<double>& par, 
const std::vector<double>& cov, 
unsigned int nrow) :
 
   46    fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
 
   47    fParameters(MnUserParameters()), fCovariance(MnUserCovariance(cov, nrow)), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(MnUserCovariance(cov, nrow)) {
 
   50    std::vector<double> err; err.reserve(par.size());
 
   51    for(
unsigned int i = 0; i < par.size(); i++) {
 
   52       assert(fCovariance(i,i) > 0.);
 
   53       err.push_back(sqrt(fCovariance(i,i)));
 
   55    fParameters = MnUserParameters(par, err);
 
   56    assert(fCovariance.Nrow() == VariableParameters());
 
   59 MnUserParameterState::MnUserParameterState(
const std::vector<double>& par, 
const MnUserCovariance& cov) :
 
   60    fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
 
   61    fParameters(MnUserParameters()), fCovariance(cov), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(cov) {
 
   64    std::vector<double> err; err.reserve(par.size());
 
   65    for(
unsigned int i = 0; i < par.size(); i++) {
 
   66       assert(fCovariance(i,i) > 0.);
 
   67       err.push_back(sqrt(fCovariance(i,i)));
 
   69    fParameters = MnUserParameters(par, err);
 
   70    assert(fCovariance.Nrow() == VariableParameters());
 
   74 MnUserParameterState::MnUserParameterState(
const MnUserParameters& par, 
const MnUserCovariance& cov) :
 
   75    fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
 
   76    fParameters(par), fCovariance(cov), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(cov) {
 
   80    fIntCovariance.Scale(0.5);
 
   81    for(std::vector<MinuitParameter>::const_iterator ipar = MinuitParameters().begin(); ipar != MinuitParameters().end(); ++ipar) {
 
   82       if((*ipar).IsConst() || (*ipar).IsFixed()) 
continue;
 
   83       if((*ipar).HasLimits())
 
   84          fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value()));
 
   86          fIntParameters.push_back((*ipar).Value());
 
   88    assert(fCovariance.Nrow() == VariableParameters());
 
   97 MnUserParameterState::MnUserParameterState(
const MinimumState& st, 
double up, 
const MnUserTransformation& trafo) :
 
   98    fValid(st.IsValid()), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1),
 
   99    fFVal(st.Fval()), fEDM(st.Edm()), fNFcn(st.NFcn()), fParameters(MnUserParameters()), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(MnUserCovariance()) {
 
  105    for(std::vector<MinuitParameter>::const_iterator ipar = trafo.Parameters().begin(); ipar != trafo.Parameters().end(); ++ipar) {
 
  106       if((*ipar).IsConst()) {
 
  107          Add((*ipar).GetName(), (*ipar).Value());
 
  108       } 
else if((*ipar).IsFixed()) {
 
  109          Add((*ipar).GetName(), (*ipar).Value(), (*ipar).Error());
 
  110          if((*ipar).HasLimits()) {
 
  111             if((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit())
 
  112                SetLimits((*ipar).GetName(), (*ipar).LowerLimit(),(*ipar).UpperLimit());
 
  113             else if((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit())
 
  114                SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit());
 
  116                SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit());
 
  118          Fix((*ipar).GetName());
 
  119       } 
else if((*ipar).HasLimits()) {
 
  120          unsigned int i = trafo.IntOfExt((*ipar).Number());
 
  121          double err = st.Error().IsValid() ? sqrt(2.*up*st.Error().InvHessian()(i,i)) : st.Parameters().Dirin()(i);
 
  122          Add((*ipar).GetName(), trafo.Int2ext(i, st.Vec()(i)), trafo.Int2extError(i, st.Vec()(i), err));
 
  123          if((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit())
 
  124             SetLimits((*ipar).GetName(), (*ipar).LowerLimit(), (*ipar).UpperLimit());
 
  125          else if((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit())
 
  126             SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit());
 
  128             SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit());
 
  130          unsigned int i = trafo.IntOfExt((*ipar).Number());
 
  131          double err = st.Error().IsValid() ? sqrt(2.*up*st.Error().InvHessian()(i,i)) : st.Parameters().Dirin()(i);
 
  132          Add((*ipar).GetName(), st.Vec()(i), err);
 
  137    fCovarianceValid = st.Error().IsValid();
 
  142    if (st.Error().IsAvailable() ) fCovStatus = 0;
 
  144    if(fCovarianceValid) {
 
  145       fCovariance = trafo.Int2extCovariance(st.Vec(), st.Error().InvHessian());
 
  146       fIntCovariance = MnUserCovariance(std::vector<double>(st.Error().InvHessian().Data(), st.Error().InvHessian().Data()+st.Error().InvHessian().size()), st.Error().InvHessian().Nrow());
 
  147       fCovariance.Scale(2.*up);
 
  148       fGlobalCC = MnGlobalCorrelationCoeff(st.Error().InvHessian());
 
  149       fGCCValid = fGlobalCC.IsValid();
 
  151       assert(fCovariance.Nrow() == VariableParameters());
 
  155    if (st.Error().IsMadePosDef() ) fCovStatus = 2;
 
  156    if (st.Error().IsAccurate() ) fCovStatus = 3;
 
  160 MnUserCovariance MnUserParameterState::Hessian()
 const {
 
  163    MnAlgebraicSymMatrix mat(fCovariance.Nrow() );
 
  164    std::copy(fCovariance.Data().begin(), fCovariance.Data().end(), mat.Data() );
 
  165    int ifail = Invert(mat);
 
  168       MN_INFO_MSG(
"MnUserParameterState:Hessian inversion fails- return diagonal matrix.");
 
  170       MnUserCovariance tmp(fCovariance.Nrow());
 
  171       for(
unsigned int i = 0; i < fCovariance.Nrow(); i++) {
 
  172          tmp(i,i) = 1./fCovariance(i,i);
 
  177    MnUserCovariance hessian( mat.Data(), fCovariance.Nrow() );
 
  185 const std::vector<MinuitParameter>& MnUserParameterState::MinuitParameters()
 const {
 
  187    return fParameters.Parameters();
 
  190 std::vector<double> MnUserParameterState::Params()
 const {
 
  192    return fParameters.Params();
 
  194 std::vector<double> MnUserParameterState::Errors()
 const {
 
  196    return fParameters.Errors();
 
  199 const MinuitParameter& MnUserParameterState::Parameter(
unsigned int i)
 const {
 
  201    return fParameters.Parameter(i);
 
  204 void MnUserParameterState::Add(
const std::string & name, 
double val, 
double err) {
 
  206    if ( fParameters.Add(name, val, err) ) {
 
  207       fIntParameters.push_back(val);
 
  208       fCovarianceValid = 
false;
 
  216       if (Parameter(i).IsConst() ) {
 
  217          std::string msg = 
"Cannot modify status of constant parameter " + name;
 
  218          MN_INFO_MSG2(
"MnUserParameterState::Add",msg.c_str());
 
  223       if (Parameter(i).IsFixed() ) Release(i);
 
  228 void MnUserParameterState::Add(
const std::string & name, 
double val, 
double err, 
double low, 
double up) {
 
  230    if ( fParameters.Add(name, val, err, low, up) ) {
 
  231       fCovarianceValid = 
false;
 
  232       fIntParameters.push_back(Ext2int(Index(name), val));
 
  239       if (Parameter(i).IsConst() ) {
 
  240          std::string msg = 
"Cannot modify status of constant parameter " + name;
 
  241          MN_INFO_MSG2(
"MnUserParameterState::Add",msg.c_str());
 
  247       if (Parameter(i).IsFixed() ) Release(i);
 
  253 void MnUserParameterState::Add(
const std::string & name, 
double val) {
 
  255    if ( fParameters.Add(name, val) )
 
  263 void MnUserParameterState::Fix(
unsigned int e) {
 
  265    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
 
  266       unsigned int i = IntOfExt(e);
 
  267       if(fCovarianceValid) {
 
  268          fCovariance = MnCovarianceSqueeze()(fCovariance, i);
 
  269          fIntCovariance = MnCovarianceSqueeze()(fIntCovariance, i);
 
  271       fIntParameters.erase(fIntParameters.begin()+i, fIntParameters.begin()+i+1);
 
  277 void MnUserParameterState::Release(
unsigned int e) {
 
  280    if (Parameter(e).IsConst() ) 
return;
 
  281    fParameters.Release(e);
 
  282    fCovarianceValid = 
false;
 
  284    unsigned int i = IntOfExt(e);
 
  285    if(Parameter(e).HasLimits())
 
  286       fIntParameters.insert(fIntParameters.begin()+i, Ext2int(e, Parameter(e).Value()));
 
  288       fIntParameters.insert(fIntParameters.begin()+i, Parameter(e).Value());
 
  291 void MnUserParameterState::SetValue(
unsigned int e, 
double val) {
 
  293    fParameters.SetValue(e, val);
 
  294    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
 
  295       unsigned int i = IntOfExt(e);
 
  296       if(Parameter(e).HasLimits())
 
  297          fIntParameters[i] = Ext2int(e, val);
 
  299          fIntParameters[i] = val;
 
  303 void MnUserParameterState::SetError(
unsigned int e, 
double val) {
 
  305    fParameters.SetError(e, val);
 
  308 void MnUserParameterState::SetLimits(
unsigned int e, 
double low, 
double up) {
 
  310    fParameters.SetLimits(e, low, up);
 
  311    fCovarianceValid = 
false;
 
  313    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
 
  314       unsigned int i = IntOfExt(e);
 
  315       if(low < fIntParameters[i] && fIntParameters[i] < up)
 
  316          fIntParameters[i] = Ext2int(e, fIntParameters[i]);
 
  317       else if (low >=  fIntParameters[i] )
 
  318          fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error() );
 
  320          fIntParameters[i] = Ext2int(e, up - 0.1 * Parameter(e).Error() );
 
  324 void MnUserParameterState::SetUpperLimit(
unsigned int e, 
double up) {
 
  326    fParameters.SetUpperLimit(e, up);
 
  327    fCovarianceValid = 
false;
 
  329    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
 
  330       unsigned int i = IntOfExt(e);
 
  331       if(fIntParameters[i] < up)
 
  332          fIntParameters[i] = Ext2int(e, fIntParameters[i]);
 
  334          fIntParameters[i] = Ext2int(e, up -  0.1 * Parameter(e).Error() );
 
  338 void MnUserParameterState::SetLowerLimit(
unsigned int e, 
double low) {
 
  340    fParameters.SetLowerLimit(e, low);
 
  341    fCovarianceValid = 
false;
 
  343    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
 
  344       unsigned int i = IntOfExt(e);
 
  345       if(low < fIntParameters[i])
 
  346          fIntParameters[i] = Ext2int(e, fIntParameters[i]);
 
  348          fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error() );
 
  352 void MnUserParameterState::RemoveLimits(
unsigned int e) {
 
  354    fParameters.RemoveLimits(e);
 
  355    fCovarianceValid = 
false;
 
  357    if(!Parameter(e).IsFixed() && !Parameter(e).IsConst())
 
  358       fIntParameters[IntOfExt(e)] = Value(e);
 
  361 double MnUserParameterState::Value(
unsigned int i)
 const {
 
  363    return fParameters.Value(i);
 
  365 double MnUserParameterState::Error(
unsigned int i)
 const {
 
  367    return fParameters.Error(i);
 
  372 void MnUserParameterState::Fix(
const std::string & name) { Fix(Index(name));}
 
  374 void MnUserParameterState::Release(
const std::string & name) {Release(Index(name));}
 
  376 void MnUserParameterState::SetValue(
const std::string & name, 
double val) {SetValue(Index(name), val);}
 
  378 void MnUserParameterState::SetError(
const std::string & name, 
double val) { SetError(Index(name), val);}
 
  380 void MnUserParameterState::SetLimits(
const std::string & name, 
double low, 
double up) {SetLimits(Index(name), low, up);}
 
  382 void MnUserParameterState::SetUpperLimit(
const std::string & name, 
double up) { SetUpperLimit(Index(name), up);}
 
  384 void MnUserParameterState::SetLowerLimit(
const std::string & name, 
double low) {SetLowerLimit(Index(name), low);}
 
  386 void MnUserParameterState::RemoveLimits(
const std::string & name) {RemoveLimits(Index(name));}
 
  388 double MnUserParameterState::Value(
const std::string & name)
 const {
return Value(Index(name));}
 
  390 double MnUserParameterState::Error(
const std::string & name)
 const {
return Error(Index(name));}
 
  393 unsigned int MnUserParameterState::Index(
const std::string & name)
 const {
 
  395    return fParameters.Index(name);
 
  398 const char* MnUserParameterState::Name(
unsigned int i)
 const {
 
  400    return fParameters.Name(i);
 
  402 const std::string & MnUserParameterState::GetName(
unsigned int i)
 const {
 
  404    return fParameters.GetName(i);
 
  409 double MnUserParameterState::Int2ext(
unsigned int i, 
double val)
 const {
 
  411    return fParameters.Trafo().Int2ext(i, val);
 
  413 double MnUserParameterState::Ext2int(
unsigned int e, 
double val)
 const {
 
  415    return fParameters.Trafo().Ext2int(e, val);
 
  417 unsigned int MnUserParameterState::IntOfExt(
unsigned int ext)
 const {
 
  419    return fParameters.Trafo().IntOfExt(ext);
 
  421 unsigned int MnUserParameterState::ExtOfInt(
unsigned int internal)
 const {
 
  423    return fParameters.Trafo().ExtOfInt(
internal);
 
  425 unsigned int MnUserParameterState::VariableParameters()
 const {
 
  427    return fParameters.Trafo().VariableParameters();
 
  429 const MnMachinePrecision& MnUserParameterState::Precision()
 const {
 
  431    return fParameters.Precision();
 
  434 void MnUserParameterState::SetPrecision(
double eps) {
 
  436    fParameters.SetPrecision(eps);