39 B2INFO(
" Mean of Chi2 / NDF of tracks before calibration: " << chisqHist->GetMean());
42 B2INFO(
"Less than " <<
m_minEntries <<
" collected: " << chisqHist->GetEntries() <<
". Return c_NotEnoughData.");
49 for (
auto file : mille->getFiles()) {
51 B2ERROR(
"Missing file: " << file);
61 B2ERROR(
m_pede.getExitMessage());
65 if (
m_result.getNoParameters() == 0) {
66 B2INFO(
"No parameters to store. Failure.");
86 int undeterminedParams = 0;
87 double maxCorrectionPull = 0.;
88 int maxCorrectionPullLabel = 0;
90 double paramChi2 = 0.;
97 GlobalCalibrationManager::initGlobalVector(
result);
98 GlobalCalibrationManager::initGlobalVector(errors);
99 GlobalCalibrationManager::initGlobalVector(corrections);
102 std::vector<std::tuple<unsigned short, unsigned short, unsigned short, double>> resultTuple;
104 for (
auto& exprun : expRuns) {
106 result.loadFromDB(event1);
108 corrections.construct();
120 for (
int ipar = 0; ipar <
m_result.getNoParameters(); ipar++) {
121 if (!
m_result.isParameterDetermined(ipar)) {
122 if (!
m_result.isParameterFixed(ipar)) {
123 ++undeterminedParams;
129 double correction =
m_result.getParameterCorrection(ipar);
130 double error =
m_result.getParameterError(ipar);
131 double pull = correction / error;
134 paramChi2 += pull * pull;
136 if (fabs(pull) > fabs(maxCorrectionPull)) {
137 maxCorrectionPull = pull;
138 maxCorrectionPullLabel = label.label();
143 result.updateGlobalParam(correction, label.getUniqueId(), label.getElementId(), label.getParameterId());
144 errors.setGlobalParam(error, label.getUniqueId(), label.getElementId(), label.getParameterId());
145 corrections.setGlobalParam(correction, label.getUniqueId(), label.getElementId(), label.getParameterId());
147 resultTuple.push_back({label.getUniqueId(), label.getElementId(), label.getParameterId(), correction});
151 result.postReadFromResult(resultTuple);
153 for (
auto object :
result.releaseObjects()) {
156 for (
auto object : errors.releaseObjects()) {
159 for (
auto object : corrections.releaseObjects()) {
165 GlobalCalibrationManager::initGlobalVector(gpv);
171 timeline.loadFromDB();
176 for (
int ipar = 0; ipar <
m_result.getNoParameters(); ipar++) {
177 if (!
m_result.isParameterDetermined(ipar)) {
178 if (!
m_result.isParameterFixed(ipar)) {
179 ++undeterminedParams;
185 double correction =
m_result.getParameterCorrection(ipar);
186 double error =
m_result.getParameterError(ipar);
187 double pull = correction / error;
190 paramChi2 += pull * pull;
192 if (fabs(pull) > fabs(maxCorrectionPull)) {
193 maxCorrectionPull = pull;
194 maxCorrectionPullLabel = label.label();
199 timeline.updateGlobalParam(label, correction);
206 auto objects = timeline.releaseObjects();
207 for (
auto iov_obj : objects) {
216 if (iov_obj.second)
delete iov_obj.second;
221 for (
auto iov_obj : objects_errors) {
231 if (iov_obj.second)
delete iov_obj.second;
236 for (
auto iov_obj : objects_corrections) {
246 if (iov_obj.second)
delete iov_obj.second;
252 if (undeterminedParams) {
253 B2WARNING(
"There are " << undeterminedParams <<
" undetermined parameters.");
255 B2WARNING(
"Not enough data for calibration.");
262 if (paramChi2 / nParams > 1. || fabs(maxCorrectionPull) > 10.) {
263 B2INFO(
"Largest correction/error is " << maxCorrectionPull <<
" for parameter with label " << maxCorrectionPullLabel);
264 B2INFO(
"Parameter corrections Chi2/NDF, e.g. sum[(correction/error)^2]/#params = " << paramChi2 / nParams
265 <<
" = " << paramChi2 <<
" / " << nParams <<
" > 1.");
267 B2INFO(
"Requesting iteration.");
280 const std::string milleFileName(
"gbl-data.mille");
285 B2WARNING(
"No GBL data tree object in collected data.");
287 }
else if (!gblDataTree->GetEntries()) {
288 B2WARNING(
"No trajectories in GBL data tree.");
293 auto milleBinary =
new gbl::MilleBinary(milleFileName);
298 std::vector<unsigned int>* indLocal;
299 std::vector<double>* derLocal;
300 std::vector<int>* labGlobal;
301 std::vector<double>* derGlobal;
304 std::vector<gbl::GblData>* currentGblData =
new std::vector<gbl::GblData>();
305 gblDataTree->SetBranchAddress(
"GblData", ¤tGblData);
307 B2INFO(
"Writing Millepede binary files...");
308 for (
unsigned int iRecord = 0; iRecord < gblDataTree->GetEntries(); ++iRecord) {
309 gblDataTree->GetEntry(iRecord);
314 for (gbl::GblData& theData : *currentGblData) {
315 theData.getAllData(aValue, aErr, indLocal, derLocal, labGlobal,
317 milleBinary->addData(aValue, aErr, *indLocal, *derLocal, *labGlobal,
320 milleBinary->writeRecord();
324 B2INFO(
"Millepede binary files written.");