17 const std::string MinimizerType =
"Minuit2";
24 const std::string MinimizerAlgo =
"Migrad";
26 MACH3LOG_INFO(
"Creating instance of Minimizer with {} and {}", MinimizerType, MinimizerAlgo);
28 minuit = std::unique_ptr<ROOT::Math::Minimizer>(
29 ROOT::Math::Factory::CreateMinimizer(MinimizerType.c_str(), MinimizerAlgo.c_str()));
49 const int NparsMinuitFull =
NPars;
54 minuit->SetFunction(fChi2);
58 minuit->SetTolerance(0.01);
59 minuit->SetMaxFunctionCalls(
fitMan->
raw()[
"General"][
"Minuit2"][
"NSteps"].as<
unsigned>());
60 minuit->SetMaxIterations(10000);
66 if (syst->GetDoAdaption())
68 MACH3LOG_ERROR(
"Param Handler {} has enabled Adaption, this is not needed for Minuit so please turn it off", syst->GetDoAdaption());
82 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
85 minuit->SetVariable(ParCounter, ((*it)->GetParName(i)), (*it)->GetParInit(i), (*it)->GetDiagonalError(i)/10);
86 minuit->SetVariableValue(ParCounter, (*it)->GetParInit(i));
88 if(!
fMirroring)
minuit->SetVariableLimits(ParCounter, (*it)->GetLowerBound(i), (*it)->GetUpperBound(i));
89 if((*it)->IsParameterFixed(i))
91 minuit->FixVariable(ParCounter);
97 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
99 minuit->SetVariable(ParCounter, Form(
"%i_PCA", i), (*it)->GetPCAHandler()->GetParPropPCA(i), (*it)->GetPCAHandler()->GetEigenValuesMaster()[i]/10);
100 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
102 minuit->FixVariable(ParCounter);
117 TVectorD* MinuitParValue =
new TVectorD(NparsMinuitFull);
118 TVectorD* MinuitParError =
new TVectorD(NparsMinuitFull);
119 TMatrixDSym* Postmatrix =
new TMatrixDSym(NparsMinuitFull);
121 for(
int i = 0; i < NparsMinuitFull; ++i)
123 (*MinuitParValue)(i) = 0;
124 (*MinuitParError)(i) = 0;
125 for(
int j = 0; j < NparsMinuitFull; ++j)
127 (*Postmatrix)(i,j) = 0;
128 (*Postmatrix)(i,j) =
minuit->CovMatrix(i,j);
133 const double *X =
minuit->X();
134 const double *err =
minuit->Errors();
135 for (std::vector<ParameterHandlerBase*>::iterator it =
systematics.begin(); it !=
systematics.end(); ++it)
139 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
141 double ParVal = X[ParCounter];
145 if(ParVal < (*it)->GetLowerBound(i))
147 ParVal = (*it)->GetLowerBound(i) + ((*it)->GetLowerBound(i) - ParVal);
149 else if (ParVal > (*it)->GetUpperBound(i))
151 ParVal = (*it)->GetUpperBound(i) - ( ParVal - (*it)->GetUpperBound(i));
154 (*MinuitParValue)(ParCounter) = ParVal;
155 (*MinuitParError)(ParCounter) = err[ParCounter];
157 if((*it)->IsParameterFixed(i))
159 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
160 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
167 TVectorD ParVals((*it)->GetNumParams());
168 TVectorD ParVals_PCA((*it)->GetNParameters());
170 TVectorD ErrorVals((*it)->GetNumParams());
171 TVectorD ErrorVals_PCA((*it)->GetNParameters());
173 TMatrixD MatrixVals((*it)->GetNumParams(), (*it)->GetNumParams());
174 TMatrixD MatrixVals_PCA((*it)->GetNParameters(), (*it)->GetNParameters());
178 const int StartVal = ParCounter;
179 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
181 ParVals_PCA(i) = X[ParCounter];
182 ErrorVals_PCA(i) = err[ParCounter];
183 int ParCounterMatrix = StartVal;
184 for(
int j = 0; j < (*it)->GetNParameters(); ++j, ++ParCounterMatrix)
186 MatrixVals_PCA(i,j) =
minuit->CovMatrix(ParCounter,ParCounterMatrix);
189 ParVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ParVals_PCA;
190 ErrorVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ErrorVals_PCA;
191 MatrixVals.Mult(((*it)->GetPCAHandler()->GetTransferMatrix()),MatrixVals_PCA);
193 ParCounter = StartVal;
195 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
197 (*MinuitParValue)(ParCounter) = ParVals(i);
198 (*MinuitParError)(ParCounter) = std::fabs(ErrorVals(i));
199 int ParCounterMatrix = StartVal;
200 for(
int j = 0; j < (*it)->GetNumParams(); ++j, ++ParCounterMatrix)
202 (*Postmatrix)(ParCounter,ParCounterMatrix) = MatrixVals(i,j);
205 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
207 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
208 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
214 MinuitParValue->Write(
"MinuitParValue");
215 MinuitParError->Write(
"MinuitParError");
216 Postmatrix->Write(
"Postmatrix");
217 delete MinuitParValue;
218 delete MinuitParError;
void SaveOutput()
Save output and close files.
TFile * outputFile
Output.
std::string AlgorithmName
Name of fitting algorithm that is being used.
Manager * fitMan
The manager for configuration handling.
void SanitiseInputs()
Remove obsolete memory and make other checks before fit starts.
std::vector< ParameterHandlerBase * > systematics
Systematic holder.
Implementation of base Likelihood Fit class, it is mostly responsible for likelihood calculation whil...
int NParsPCA
Number of all parameters from all covariances in PCA base.
int NPars
Number of all parameters from all covariances.
void PrepareFit()
prepare output and perform sanity checks
bool fMirroring
Flag telling if mirroring is used or not.
virtual double CalcChi2(const double *x)
Chi2 calculation over all included samples and syst objects.
Custom exception class used throughout MaCh3.
The manager class is responsible for managing configurations and settings.
YAML::Node const & raw() const
Return config.
std::unique_ptr< ROOT::Math::Minimizer > minuit
Pointer to minimizer, which most often is Minuit.
MinuitFit(Manager *const fitMan)
Constructor.
void RunMCMC() override
Actual implementation of Minuit Fit algorithm.
virtual ~MinuitFit()
Destructor.