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