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);
69 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
72 minuit->SetVariable(ParCounter, ((*it)->GetParName(i)), (*it)->GetParInit(i), (*it)->GetDiagonalError(i)/10);
73 minuit->SetVariableValue(ParCounter, (*it)->GetParInit(i));
75 if(!
fMirroring)
minuit->SetVariableLimits(ParCounter, (*it)->GetLowerBound(i), (*it)->GetUpperBound(i));
76 if((*it)->IsParameterFixed(i))
78 minuit->FixVariable(ParCounter);
84 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
86 minuit->SetVariable(ParCounter, Form(
"%i_PCA", i), (*it)->GetPCAHandler()->GetParPropPCA(i), (*it)->GetPCAHandler()->GetEigenValuesMaster()[i]/10);
87 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
89 minuit->FixVariable(ParCounter);
104 TVectorD* MinuitParValue =
new TVectorD(NparsMinuitFull);
105 TVectorD* MinuitParError =
new TVectorD(NparsMinuitFull);
106 TMatrixDSym* Postmatrix =
new TMatrixDSym(NparsMinuitFull);
108 for(
int i = 0; i < NparsMinuitFull; ++i)
110 (*MinuitParValue)(i) = 0;
111 (*MinuitParError)(i) = 0;
112 for(
int j = 0; j < NparsMinuitFull; ++j)
114 (*Postmatrix)(i,j) = 0;
115 (*Postmatrix)(i,j) =
minuit->CovMatrix(i,j);
120 const double *X =
minuit->X();
121 const double *err =
minuit->Errors();
122 for (std::vector<ParameterHandlerBase*>::iterator it =
systematics.begin(); it !=
systematics.end(); ++it)
126 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
128 double ParVal = X[ParCounter];
132 if(ParVal < (*it)->GetLowerBound(i))
134 ParVal = (*it)->GetLowerBound(i) + ((*it)->GetLowerBound(i) - ParVal);
136 else if (ParVal > (*it)->GetUpperBound(i))
138 ParVal = (*it)->GetUpperBound(i) - ( ParVal - (*it)->GetUpperBound(i));
141 (*MinuitParValue)(ParCounter) = ParVal;
142 (*MinuitParError)(ParCounter) = err[ParCounter];
144 if((*it)->IsParameterFixed(i))
146 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
147 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
154 TVectorD ParVals((*it)->GetNumParams());
155 TVectorD ParVals_PCA((*it)->GetNParameters());
157 TVectorD ErrorVals((*it)->GetNumParams());
158 TVectorD ErrorVals_PCA((*it)->GetNParameters());
160 TMatrixD MatrixVals((*it)->GetNumParams(), (*it)->GetNumParams());
161 TMatrixD MatrixVals_PCA((*it)->GetNParameters(), (*it)->GetNParameters());
165 const int StartVal = ParCounter;
166 for(
int i = 0; i < (*it)->GetNParameters(); ++i, ++ParCounter)
168 ParVals_PCA(i) = X[ParCounter];
169 ErrorVals_PCA(i) = err[ParCounter];
170 int ParCounterMatrix = StartVal;
171 for(
int j = 0; j < (*it)->GetNParameters(); ++j, ++ParCounterMatrix)
173 MatrixVals_PCA(i,j) =
minuit->CovMatrix(ParCounter,ParCounterMatrix);
176 ParVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ParVals_PCA;
177 ErrorVals = ((*it)->GetPCAHandler()->GetTransferMatrix())*ErrorVals_PCA;
178 MatrixVals.Mult(((*it)->GetPCAHandler()->GetTransferMatrix()),MatrixVals_PCA);
180 ParCounter = StartVal;
182 for(
int i = 0; i < (*it)->GetNumParams(); ++i, ++ParCounter)
184 (*MinuitParValue)(ParCounter) = ParVals(i);
185 (*MinuitParError)(ParCounter) = std::fabs(ErrorVals(i));
186 int ParCounterMatrix = StartVal;
187 for(
int j = 0; j < (*it)->GetNumParams(); ++j, ++ParCounterMatrix)
189 (*Postmatrix)(ParCounter,ParCounterMatrix) = MatrixVals(i,j);
192 if((*it)->GetPCAHandler()->IsParameterFixedPCA(i))
194 (*MinuitParError)(ParCounter) = (*it)->GetDiagonalError(i);
195 (*Postmatrix)(ParCounter,ParCounter) = (*MinuitParError)(ParCounter) * (*MinuitParError)(ParCounter);
201 MinuitParValue->Write(
"MinuitParValue");
202 MinuitParError->Write(
"MinuitParError");
203 Postmatrix->Write(
"Postmatrix");
204 delete MinuitParValue;
205 delete MinuitParError;
MaCh3Plotting::PlottingManager * man
void SaveOutput()
Save output and close files.
TFile * outputFile
Output.
manager * fitMan
The manager.
std::string AlgorithmName
Name of fitting algorithm that is being used.
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.
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.
The manager class is responsible for managing configurations and settings.
YAML::Node const & raw()
Return config.