Skip to content

Commit 8f9273d

Browse files
committed
TRD: CalibratorVdExB: Reuse Fitter
This avoids instantiating a similar object all the time. Now it is done once during the init and then just reused. Hopefully, this provides a small performance boost. Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent b0b408f commit 8f9273d

2 files changed

Lines changed: 28 additions & 25 deletions

File tree

Detectors/TRD/calibration/include/TRDCalibration/CalibratorVdExB.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "Rtypes.h"
2727
#include "TProfile.h"
28+
#include "Fit/Fitter.h"
2829

2930
#include <array>
3031
#include <cstdlib>
@@ -72,13 +73,15 @@ class CalibratorVdExB final : public o2::calibration::TimeSlotCalibration<o2::tr
7273
void retrievePrev(o2::framework::ProcessingContext& pc);
7374

7475
private:
75-
bool mInitDone{false}; ///< flag to avoid creating the TProfiles multiple times
76-
size_t mMinEntriesTotal; ///< minimum total number of angular deviations (on average ~3 entries per bin for each TRD chamber)
77-
size_t mMinEntriesChamber; ///< minimum number of angular deviations per chamber for accepting refitted value (~3 per bin)
76+
bool mInitDone{false}; //< flag to avoid creating the TProfiles multiple times
77+
size_t mMinEntriesTotal; //< minimum total number of angular deviations (on average ~3 entries per bin for each TRD chamber)
78+
size_t mMinEntriesChamber; //< minimum number of angular deviations per chamber for accepting refitted value (~3 per bin)
7879
bool mEnableOutput; //< enable output of calibration fits and tprofiles in a root file instead of the ccdb
79-
FitFunctor mFitFunctor; ///< used for minimization procedure
80-
std::vector<o2::ccdb::CcdbObjectInfo> mInfoVector; ///< vector of CCDB infos; each element is filled with CCDB description of accompanying CCDB calibration object
81-
std::vector<o2::trd::CalVdriftExB> mObjectVector; ///< vector of CCDB calibration objects; the extracted vDrift and ExB per chamber for given slot
80+
FitFunctor mFitFunctor; //< used for minimization procedure
81+
std::vector<o2::ccdb::CcdbObjectInfo> mInfoVector; //< vector of CCDB infos; each element is filled with CCDB description of accompanying CCDB calibration object
82+
std::vector<o2::trd::CalVdriftExB> mObjectVector; //< vector of CCDB calibration objects; the extracted vDrift and ExB per chamber for given slot
83+
ROOT::Fit::Fitter mFitter; //< Fitter object will be reused across slots
84+
double mParamsStart[2]; //< Start fit parameter
8285
ClassDefOverride(CalibratorVdExB, 3);
8386
};
8487

Detectors/TRD/calibration/src/CalibratorVdExB.cxx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "Framework/TimingInfo.h"
1919
#include "Framework/InputRecord.h"
2020
#include "DataFormatsTRD/Constants.h"
21-
#include "Fit/Fitter.h"
2221
#include "TStopwatch.h"
2322
#include "CCDB/CcdbApi.h"
2423
#include "CCDB/BasicCCDBManager.h"
@@ -110,6 +109,20 @@ void CalibratorVdExB::initProcessing()
110109
for (int iDet = 0; iDet < MAXCHAMBER; ++iDet) {
111110
mFitFunctor.profiles[iDet] = std::make_unique<TProfile>(Form("profAngleDiff_%i", iDet), Form("profAngleDiff_%i", iDet), NBINSANGLEDIFF, -MAXIMPACTANGLE, MAXIMPACTANGLE);
112111
}
112+
113+
mFitter.SetFCN<FitFunctor>(2, mFitFunctor, mParamsStart);
114+
mFitter.Config().ParSettings(ParamIndex::LA).SetLimits(-0.7, 0.7);
115+
mFitter.Config().ParSettings(ParamIndex::LA).SetStepSize(.01);
116+
mFitter.Config().ParSettings(ParamIndex::VD).SetLimits(0., 3.);
117+
mFitter.Config().ParSettings(ParamIndex::VD).SetStepSize(.01);
118+
ROOT::Math::MinimizerOptions opt;
119+
opt.SetMinimizerType("Minuit2");
120+
opt.SetMinimizerAlgorithm("Migrad");
121+
opt.SetPrintLevel(0);
122+
opt.SetMaxFunctionCalls(1'000);
123+
opt.SetTolerance(.001);
124+
mFitter.Config().SetMinimizerOptions(opt);
125+
113126
mInitDone = true;
114127
}
115128

@@ -165,24 +178,11 @@ void CalibratorVdExB::finalizeSlot(Slot& slot)
165178
LOGF(debug, "Chamber %d did not reach minimum amount of entries for refit", iDet);
166179
continue;
167180
}
168-
ROOT::Fit::Fitter fitter;
169-
double paramsStart[2];
170-
paramsStart[ParamIndex::LA] = 0. * TMath::DegToRad();
171-
paramsStart[ParamIndex::VD] = 1.;
172-
fitter.SetFCN<FitFunctor>(2, mFitFunctor, paramsStart);
173-
fitter.Config().ParSettings(ParamIndex::LA).SetLimits(-0.7, 0.7);
174-
fitter.Config().ParSettings(ParamIndex::LA).SetStepSize(.01);
175-
fitter.Config().ParSettings(ParamIndex::VD).SetLimits(0., 3.);
176-
fitter.Config().ParSettings(ParamIndex::VD).SetStepSize(.01);
177-
ROOT::Math::MinimizerOptions opt;
178-
opt.SetMinimizerType("Minuit2");
179-
opt.SetMinimizerAlgorithm("Migrad");
180-
opt.SetPrintLevel(0);
181-
opt.SetMaxFunctionCalls(1'000);
182-
opt.SetTolerance(.001);
183-
fitter.Config().SetMinimizerOptions(opt);
184-
fitter.FitFCN();
185-
auto fitResult = fitter.Result();
181+
// Reset Start Parameter
182+
mParamsStart[ParamIndex::LA] = 0.0;
183+
mParamsStart[ParamIndex::VD] = 1.0;
184+
mFitter.FitFCN();
185+
auto fitResult = mFitter.Result();
186186
laFitResults[iDet] = fitResult.Parameter(ParamIndex::LA);
187187
vdFitResults[iDet] = fitResult.Parameter(ParamIndex::VD);
188188
LOGF(debug, "Fit result for chamber %i: vd=%f, la=%f", iDet, vdFitResults[iDet], laFitResults[iDet] * TMath::RadToDeg());

0 commit comments

Comments
 (0)