| 227 |
// By default Migrad is used. |
// By default Migrad is used. |
| 228 |
// Return true if the found minimum is valid and update internal chached values of |
// Return true if the found minimum is valid and update internal chached values of |
| 229 |
// minimum values, errors and covariance matrix. |
// minimum values, errors and covariance matrix. |
| 230 |
|
// Status of minimizer is set to: |
| 231 |
|
// migradResult + 10*minosResult + 100*hesseResult + 1000*improveResult |
| 232 |
|
|
| 233 |
|
|
| 234 |
assert(fMinuit != 0 ); |
assert(fMinuit != 0 ); |
| 235 |
|
|
| 274 |
|
|
| 275 |
} |
} |
| 276 |
|
|
| 277 |
|
fStatus = ierr; |
| 278 |
|
|
| 279 |
// run improved if needed |
// run improved if needed |
| 280 |
if (ierr == 0 && fType == ROOT::Minuit::kMigradImproved) |
if (ierr == 0 && fType == ROOT::Minuit::kMigradImproved) { |
| 281 |
fMinuit->mnexcm("IMPROVE",arglist,1,ierr); |
fMinuit->mnexcm("IMPROVE",arglist,1,ierr); |
| 282 |
|
fStatus += 1000*ierr; |
| 283 |
|
} |
| 284 |
|
|
| 285 |
// check if Hesse needs to be run |
// check if Hesse needs to be run |
| 286 |
if (ierr == 0 && IsValidError() ) { |
if (ierr == 0 && IsValidError() ) { |
| 287 |
fMinuit->mnexcm("HESSE",arglist,1,ierr); |
fMinuit->mnexcm("HESSE",arglist,1,ierr); |
| 288 |
|
fStatus += 100*ierr; |
| 289 |
} |
} |
| 290 |
|
|
| 291 |
|
|
| 310 |
// store global min results (only if minimization is OK) |
// store global min results (only if minimization is OK) |
| 311 |
if (ierr == 0) { |
if (ierr == 0) { |
| 312 |
fCovar.resize(fDim*fDim); |
fCovar.resize(fDim*fDim); |
| 313 |
|
if (fNFree >= fDim) { // no fixed parameters |
| 314 |
fMinuit->mnemat(&fCovar.front(), fDim); |
fMinuit->mnemat(&fCovar.front(), fDim); |
| 315 |
|
} |
| 316 |
|
else { |
| 317 |
|
// case of fixed params need to take care |
| 318 |
|
if (fNFree > fDim) return true; |
| 319 |
|
std::vector<double> tmpMat(fNFree*fNFree); |
| 320 |
|
fMinuit->mnemat(&tmpMat.front(), fNFree); |
| 321 |
|
|
| 322 |
|
|
| 323 |
|
unsigned int l = 0; |
| 324 |
|
for (unsigned int i = 0; i < fDim; ++i) { |
| 325 |
|
|
| 326 |
|
if ( fMinuit->fNiofex[i] > 0 ) { // not fixed ? |
| 327 |
|
unsigned int m = 0; |
| 328 |
|
for (unsigned int j = 0; j <= i; ++j) { |
| 329 |
|
if ( fMinuit->fNiofex[j] > 0 ) { //not fixed |
| 330 |
|
fCovar[i*fDim + j] = tmpMat[l*fNFree + m]; |
| 331 |
|
fCovar[j*fDim + i] = fCovar[i*fDim + j]; |
| 332 |
|
m++; |
| 333 |
|
} |
| 334 |
|
} |
| 335 |
|
l++; |
| 336 |
|
} |
| 337 |
|
} |
| 338 |
|
|
| 339 |
|
} |
| 340 |
|
|
| 341 |
// need to re-run Minos again if requested |
// need to re-run Minos again if requested |
| 342 |
fMinosRun = false; |
fMinosRun = false; |
| 372 |
|
|
| 373 |
int nargs = 2; |
int nargs = 2; |
| 374 |
fMinuit->mnexcm("MINOS",arglist,nargs,ierr); |
fMinuit->mnexcm("MINOS",arglist,nargs,ierr); |
| 375 |
if (ierr != 0 ) return false; |
fStatus += 10*ierr; |
| 376 |
|
|
| 377 |
fMinosRun = true; |
fMinosRun = true; |
| 378 |
|
|
| 379 |
} |
} |
| 380 |
|
|
| 381 |
double errParab = 0; |
double errParab = 0; |
| 382 |
double gcor = 0; |
double gcor = 0; |
| 383 |
// what returns if parameter fixed or constant or at limit ? |
// what returns if parameter fixed or constant or at limit ? |
| 384 |
fMinuit->mnerrs(i,errUp,errLow, errParab, gcor); |
fMinuit->mnerrs(i,errUp,errLow, errParab, gcor); |
| 385 |
|
|
| 386 |
|
if (fStatus%100 != 0 ) return false; |
| 387 |
return true; |
return true; |
| 388 |
|
|
| 389 |
} |
} |