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()));
31 std::string Features = gROOT->GetConfigFeatures();
32 if (Features.find(
"minuit2_omp") != std::string::npos) {
33 MACH3LOG_ERROR(
"Minuit in ROOT has been compiled with OMP support");
34 MACH3LOG_ERROR(
"Since MaCh3 uses OMP for reweight this could cause terrible clash");
55 const int NparsMinuitFull =
NPars;
60 minuit->SetFunction(fChi2);
64 minuit->SetTolerance(0.01);
65 minuit->SetMaxFunctionCalls(
fitMan->
raw()[
"General"][
"Minuit2"][
"NSteps"].as<
unsigned>());
66 minuit->SetMaxIterations(10000);
72 if (syst->GetDoAdaption())
74 MACH3LOG_ERROR(
"Param Handler {} has enabled Adaption, this is not needed for Minuit so please turn it off", syst->GetDoAdaption());
85 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
89 minuit->SetVariable(ParCounter, ((*it)->GetParName(i)), (*it)->GetParPreFit(i), (*it)->GetDiagonalError(i)/10);
90 minuit->SetVariableValue(ParCounter, (*it)->GetParPreFit(i));
92 if(!
fMirroring)
minuit->SetVariableLimits(ParCounter, (*it)->GetLowerBound(i), (*it)->GetUpperBound(i));
93 if((*it)->IsParameterFixed(i))
95 minuit->FixVariable(ParCounter);
101 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
105 minuit->SetVariable(ParCounter, Form(
"%i_PCA", i), (*it)->GetPCAHandler()->GetParPropPCA(i), (*it)->GetPCAHandler()->GetEigenValuesMaster()[i]/10);
106 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
108 minuit->FixVariable(ParCounter);
123 TVectorD* MinuitParValue =
new TVectorD(NparsMinuitFull);
124 TVectorD* MinuitParError =
new TVectorD(NparsMinuitFull);
125 TMatrixDSym* Postmatrix =
new TMatrixDSym(NparsMinuitFull);
127 for(
int i = 0; i < NparsMinuitFull; ++i)
129 (*MinuitParValue)(i) = 0;
130 (*MinuitParError)(i) = 0;
131 for(
int j = 0; j < NparsMinuitFull; ++j)
133 (*Postmatrix)(i,j) = 0;
134 (*Postmatrix)(i,j) =
minuit->CovMatrix(i,j);
139 const double *X =
minuit->X();
140 const double *err =
minuit->Errors();
141 for (std::vector<ParameterHandlerBase*>::iterator it =
systematics.begin(); it !=
systematics.end(); ++it)
145 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
147 double ParVal = X[ParCounter];
151 if(ParVal < (*it)->GetLowerBound(i))
153 ParVal = (*it)->GetLowerBound(i) + ((*it)->GetLowerBound(i) - ParVal);
155 else if (ParVal > (*it)->GetUpperBound(i))
157 ParVal = (*it)->GetUpperBound(i) - ( ParVal - (*it)->GetUpperBound(i));
160 (*MinuitParValue)(ParCounter) = ParVal;
161 (*MinuitParError)(ParCounter) = err[ParCounter];
163 if((*it)->IsParameterFixed(i))
165 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
166 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
173 TVectorD ParVals((*it)->GetNumParams());
174 TVectorD ParVals_PCA((*it)->GetNParameters());
176 TVectorD ErrorVals((*it)->GetNumParams());
177 TVectorD ErrorVals_PCA((*it)->GetNParameters());
179 TMatrixD MatrixVals((*it)->GetNumParams(), (*it)->GetNumParams());
180 TMatrixD MatrixVals_PCA((*it)->GetNParameters(), (*it)->GetNParameters());
184 const int StartVal = ParCounter;
185 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
187 ParVals_PCA(i) = X[ParCounter];
188 ErrorVals_PCA(i) = err[ParCounter];
189 int ParCounterMatrix = StartVal;
190 for(
int j = 0; j < (*it)->GetNParameters(); ++j, ++ParCounterMatrix)
192 MatrixVals_PCA(i,j) =
minuit->CovMatrix(ParCounter,ParCounterMatrix);
195 ParVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ParVals_PCA;
196 ErrorVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ErrorVals_PCA;
197 MatrixVals.Mult(((*it)->GetPCAHandler()->GetTransferMatrix()),MatrixVals_PCA);
199 ParCounter = StartVal;
201 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
203 (*MinuitParValue)(ParCounter) = ParVals(i);
204 (*MinuitParError)(ParCounter) = std::fabs(ErrorVals(i));
205 int ParCounterMatrix = StartVal;
206 for(
int j = 0; j < (*it)->GetNumParams(); ++j, ++ParCounterMatrix)
208 (*Postmatrix)(ParCounter,ParCounterMatrix) = MatrixVals(i,j);
211 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
213 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
214 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
220 MinuitParValue->Write(
"MinuitParValue");
221 MinuitParError->Write(
"MinuitParError");
222 Postmatrix->Write(
"Postmatrix");
223 delete MinuitParValue;
224 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() final
Actual implementation of Minuit Fit algorithm.
virtual ~MinuitFit()
Destructor.