| 64 |
|
|
| 65 |
|
|
| 66 |
TLinearMinimizer::TLinearMinimizer(int ) : |
TLinearMinimizer::TLinearMinimizer(int ) : |
| 67 |
|
fRobust(false), |
| 68 |
fDim(0), |
fDim(0), |
| 69 |
fObjFunc(0), |
fObjFunc(0), |
| 70 |
fFitter(0) |
fFitter(0) |
| 73 |
// type is not used - needed for consistency with other minimizer plug-ins |
// type is not used - needed for consistency with other minimizer plug-ins |
| 74 |
} |
} |
| 75 |
|
|
| 76 |
|
TLinearMinimizer::TLinearMinimizer ( const char * type ) : |
| 77 |
|
fRobust(false), |
| 78 |
|
fDim(0), |
| 79 |
|
fObjFunc(0), |
| 80 |
|
fFitter(0) |
| 81 |
|
{ |
| 82 |
|
// constructor passing a type of algorithm, (supported now robust via LTS regression) |
| 83 |
|
|
| 84 |
|
// select type from the string |
| 85 |
|
std::string algoname(type); |
| 86 |
|
std::transform(algoname.begin(), algoname.end(), algoname.begin(), (int(*)(int)) tolower ); |
| 87 |
|
|
| 88 |
|
if (algoname == "robust") fRobust = true; |
| 89 |
|
|
| 90 |
|
} |
| 91 |
|
|
| 92 |
TLinearMinimizer::~TLinearMinimizer() |
TLinearMinimizer::~TLinearMinimizer() |
| 93 |
{ |
{ |
| 147 |
// create TLinearFitter (do it now because olny now now the coordinate dimensions) |
// create TLinearFitter (do it now because olny now now the coordinate dimensions) |
| 148 |
if (fFitter) delete fFitter; // reset by deleting previous copy |
if (fFitter) delete fFitter; // reset by deleting previous copy |
| 149 |
fFitter = new TLinearFitter( static_cast<const ModelFunc::BaseFunc&>(modfunc).NDim() ); |
fFitter = new TLinearFitter( static_cast<const ModelFunc::BaseFunc&>(modfunc).NDim() ); |
| 150 |
fFitter->StoreData(false); |
|
| 151 |
|
fFitter->StoreData(fRobust); // need a copy of data in case of robust fitting |
| 152 |
|
|
| 153 |
fFitter->SetBasisFunctions(&flist); |
fFitter->SetBasisFunctions(&flist); |
| 154 |
|
|
| 182 |
|
|
| 183 |
if (fFitter == 0 || fObjFunc == 0) return false; |
if (fFitter == 0 || fObjFunc == 0) return false; |
| 184 |
|
|
| 185 |
int iret = fFitter->Eval(); |
int iret = 0; |
| 186 |
|
if (!fRobust) |
| 187 |
|
iret = fFitter->Eval(); |
| 188 |
|
else { |
| 189 |
|
// robust fitting - get h parameter using tolerance (t.b. improved) |
| 190 |
|
double h = Tolerance(); |
| 191 |
|
std::cout << "do robust fitting with h = " << h << std::endl; |
| 192 |
|
iret = fFitter->EvalRobust(h); |
| 193 |
|
} |
| 194 |
|
fStatus = iret; |
| 195 |
|
|
| 196 |
if (iret != 0) { |
if (iret != 0) { |
| 197 |
Warning("Minimize","TLinearFitter failed in finding the solution"); |
Warning("Minimize","TLinearFitter failed in finding the solution"); |
| 201 |
|
|
| 202 |
// get parameter values |
// get parameter values |
| 203 |
fParams.resize( fDim); |
fParams.resize( fDim); |
| 204 |
fErrors.resize( fDim); |
// no error available for robust fitting |
| 205 |
|
if (!fRobust) fErrors.resize( fDim); |
| 206 |
for (unsigned int i = 0; i < fDim; ++i) { |
for (unsigned int i = 0; i < fDim; ++i) { |
| 207 |
fParams[i] = fFitter->GetParameter( i); |
fParams[i] = fFitter->GetParameter( i); |
| 208 |
fErrors[i] = fFitter->GetParError( i ); |
if (!fRobust) fErrors[i] = fFitter->GetParError( i ); |
| 209 |
} |
} |
| 210 |
fCovar.resize(fDim*fDim); |
fCovar.resize(fDim*fDim); |
| 211 |
double * cov = fFitter->GetCovarianceMatrix(); |
double * cov = fFitter->GetCovarianceMatrix(); |
| 212 |
std::copy(cov,cov+fDim*fDim,fCovar.begin() ); |
|
| 213 |
|
if (!fRobust && cov) std::copy(cov,cov+fDim*fDim,fCovar.begin() ); |
| 214 |
|
|
| 215 |
// calculate chi2 value |
// calculate chi2 value |
| 216 |
|
|