switched PFitter to smart pointers.

This commit is contained in:
suter_a 2023-10-21 11:39:16 +02:00
parent 9ef5c5cac6
commit 5f66baa1e2
2 changed files with 31 additions and 60 deletions

View File

@ -285,10 +285,6 @@ PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bo
fCmdLines = *runInfo->GetMsrCommands(); fCmdLines = *runInfo->GetMsrCommands();
// init class variables // init class variables
fFitterFcn = nullptr;
fFitterFcnDKS = nullptr;
fFcnMin = nullptr;
fScanAll = true; fScanAll = true;
fScanParameter[0] = 0; fScanParameter[0] = 0;
fScanParameter[1] = 0; fScanParameter[1] = 0;
@ -338,7 +334,7 @@ PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bo
// create fit function object depending whether DKS/GPU can be used or not // create fit function object depending whether DKS/GPU can be used or not
if (fDKSReady && (fDKSTag != DKS_CPU_OPENMP)) { // run on the GPU if (fDKSReady && (fDKSTag != DKS_CPU_OPENMP)) { // run on the GPU
fFitterFcnDKS = new PFitterFcnDKS(runListCollection, fUseChi2, fDKSTag, theo); fFitterFcnDKS = std::make_unique<PFitterFcnDKS>(runListCollection, fUseChi2, fDKSTag, theo);
if (!fFitterFcnDKS) { if (!fFitterFcnDKS) {
fIsValid = false; fIsValid = false;
} }
@ -347,7 +343,7 @@ PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bo
} }
} else { // run on the CPU } else { // run on the CPU
fDKSReady = false; // needed in case dksTag == DKS_CPU_OPENMP fDKSReady = false; // needed in case dksTag == DKS_CPU_OPENMP
fFitterFcn = new PFitterFcn(runListCollection, fUseChi2); fFitterFcn = std::make_unique<PFitterFcn>(runListCollection, fUseChi2);
if (!fFitterFcn) { if (!fFitterFcn) {
fIsValid = false; fIsValid = false;
} }
@ -367,21 +363,6 @@ PFitter::~PFitter()
fScanData.clear(); fScanData.clear();
fElapsedTime.clear(); fElapsedTime.clear();
if (fFcnMin) {
delete fFcnMin;
fFcnMin = nullptr;
}
if (fFitterFcnDKS) {
delete fFitterFcnDKS;
fFitterFcnDKS = 0;
}
if (fFitterFcn) {
delete fFitterFcn;
fFitterFcn = nullptr;
}
} }
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
@ -1688,11 +1669,11 @@ Bool_t PFitter::ExecuteContours()
return false; return false;
} }
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
ROOT::Minuit2::MnContours contours((*fcn), *fFcnMin); ROOT::Minuit2::MnContours contours((*fcn), *fFcnMin);
@ -1832,11 +1813,11 @@ Bool_t PFitter::ExecuteHesse()
// call hesse // call hesse
Double_t start=0.0, end=0.0; Double_t start=0.0, end=0.0;
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
start=MilliTime(); start=MilliTime();
ROOT::Minuit2::MnUserParameterState mnState = hesse((*fcn), fMnUserParams, maxfcn); ROOT::Minuit2::MnUserParameterState mnState = hesse((*fcn), fMnUserParams, maxfcn);
end=MilliTime(); end=MilliTime();
@ -1880,11 +1861,11 @@ Bool_t PFitter::ExecuteMigrad()
// create migrad object // create migrad object
// strategy is by default = 'default' // strategy is by default = 'default'
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
ROOT::Minuit2::MnMigrad migrad((*fcn), fMnUserParams, fStrategy); ROOT::Minuit2::MnMigrad migrad((*fcn), fMnUserParams, fStrategy);
// minimize // minimize
@ -1908,11 +1889,7 @@ Bool_t PFitter::ExecuteMigrad()
} }
// keep FunctionMinimum object // keep FunctionMinimum object
if (fFcnMin) { // fFcnMin exist hence clean up first fFcnMin.reset(new ROOT::Minuit2::FunctionMinimum(min));
delete fFcnMin;
fFcnMin = nullptr;
}
fFcnMin = new ROOT::Minuit2::FunctionMinimum(min);
// keep user parameters // keep user parameters
if (fFcnMin) if (fFcnMin)
@ -1969,11 +1946,11 @@ Bool_t PFitter::ExecuteMinimize()
// create minimizer object // create minimizer object
// strategy is by default = 'default' // strategy is by default = 'default'
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
ROOT::Minuit2::MnMinimize minimize((*fcn), fMnUserParams, fStrategy); ROOT::Minuit2::MnMinimize minimize((*fcn), fMnUserParams, fStrategy);
// minimize // minimize
@ -1998,11 +1975,7 @@ Bool_t PFitter::ExecuteMinimize()
} }
// keep FunctionMinimum object // keep FunctionMinimum object
if (fFcnMin) { // fFcnMin exist hence clean up first fFcnMin.reset(new ROOT::Minuit2::FunctionMinimum(min));
delete fFcnMin;
fFcnMin = nullptr;
}
fFcnMin = new ROOT::Minuit2::FunctionMinimum(min);
// keep user parameters // keep user parameters
if (fFcnMin) if (fFcnMin)
@ -2073,11 +2046,11 @@ Bool_t PFitter::ExecuteMinos()
// make minos analysis // make minos analysis
Double_t start=0.0, end=0.0; Double_t start=0.0, end=0.0;
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
start=MilliTime(); start=MilliTime();
ROOT::Minuit2::MnMinos minos((*fcn), (*fFcnMin)); ROOT::Minuit2::MnMinos minos((*fcn), (*fFcnMin));
@ -2273,11 +2246,11 @@ Bool_t PFitter::ExecuteScan()
{ {
std::cout << ">> PFitter::ExecuteScan(): will call scan ..." << std::endl; std::cout << ">> PFitter::ExecuteScan(): will call scan ..." << std::endl;
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
ROOT::Minuit2::MnScan scan((*fcn), fMnUserParams); ROOT::Minuit2::MnScan scan((*fcn), fMnUserParams);
if (fScanAll) { // not clear at the moment what to be done here if (fScanAll) { // not clear at the moment what to be done here
@ -2741,11 +2714,11 @@ Bool_t PFitter::ExecuteSimplex()
// create minimizer object // create minimizer object
// strategy is by default = 'default' // strategy is by default = 'default'
ROOT::Minuit2::FCNBase *fcn = 0; ROOT::Minuit2::FCNBase *fcn = nullptr;
if (fDKSReady) if (fDKSReady)
fcn = fFitterFcnDKS; fcn = fFitterFcnDKS.get();
else else
fcn = fFitterFcn; fcn = fFitterFcn.get();
ROOT::Minuit2::MnSimplex simplex((*fcn), fMnUserParams, fStrategy); ROOT::Minuit2::MnSimplex simplex((*fcn), fMnUserParams, fStrategy);
// minimize // minimize
@ -2769,11 +2742,7 @@ Bool_t PFitter::ExecuteSimplex()
} }
// keep FunctionMinimum object // keep FunctionMinimum object
if (fFcnMin) { // fFcnMin exist hence clean up first fFcnMin.reset(new ROOT::Minuit2::FunctionMinimum(min));
delete fFcnMin;
fFcnMin = nullptr;
}
fFcnMin = new ROOT::Minuit2::FunctionMinimum(min);
// keep user parameters // keep user parameters
if (fFcnMin) if (fFcnMin)

View File

@ -30,6 +30,8 @@
#ifndef _PFITTER_H_ #ifndef _PFITTER_H_
#define _PFITTER_H_ #define _PFITTER_H_
#include <memory>
#include "TString.h" #include "TString.h"
#include "Minuit2/MnUserParameters.h" #include "Minuit2/MnUserParameters.h"
@ -140,11 +142,11 @@ class PFitter
PMsrLines fCmdLines; ///< all the Minuit commands from the msr-file PMsrLines fCmdLines; ///< all the Minuit commands from the msr-file
PIntPairVector fCmdList; ///< command list, first=cmd, second=cmd line index PIntPairVector fCmdList; ///< command list, first=cmd, second=cmd line index
PFitterFcn *fFitterFcn; ///< pointer to the fitter function object std::unique_ptr<PFitterFcn> fFitterFcn; ///< pointer to the fitter function object
PFitterFcnDKS *fFitterFcnDKS; ///< pointer to the DKS fitter function object std::unique_ptr<PFitterFcnDKS> fFitterFcnDKS; ///< pointer to the DKS fitter function object
ROOT::Minuit2::MnUserParameters fMnUserParams; ///< minuit2 input parameter list ROOT::Minuit2::MnUserParameters fMnUserParams; ///< minuit2 input parameter list
ROOT::Minuit2::FunctionMinimum *fFcnMin; ///< function minimum object std::unique_ptr<ROOT::Minuit2::FunctionMinimum> fFcnMin; ///< function minimum object
// minuit2 scan/contours command relate variables (see MnScan/MnContours in the minuit2 user manual) // minuit2 scan/contours command relate variables (see MnScan/MnContours in the minuit2 user manual)
Bool_t fScanAll; ///< flag. false: single parameter scan, true: not implemented yet (see MnScan/MnContours in the minuit2 user manual) Bool_t fScanAll; ///< flag. false: single parameter scan, true: not implemented yet (see MnScan/MnContours in the minuit2 user manual)