8#include <ecl/dbobjects/ECLDatabaseImporter.h>
17#include <ecl/dbobjects/ECLDigitEnergyConstants.h>
18#include <ecl/dbobjects/ECLDigitTimeConstants.h>
19#include <ecl/modules/eclShowerShape/ECLShowerShapeModule.h>
20#include <ecl/dbobjects/ECLShowerShapeSecondMomentCorrection.h>
21#include <ecl/dbobjects/ECLShowerCorrectorLeakageCorrection.h>
22#include <ecl/dbobjects/ECLShowerEnergyCorrectionTemporary.h>
23#include <ecl/dbobjects/ECLTrackClusterMatchingParameterizations.h>
24#include <ecl/dbobjects/ECLTrackClusterMatchingThresholds.h>
25#include <ecl/dataobjects/ECLShower.h>
28#include <framework/database/IntervalOfValidity.h>
29#include <framework/database/Database.h>
30#include <framework/database/DBImportArray.h>
31#include <framework/database/DBImportObjPtr.h>
36#include <TClonesArray.h>
47 for (
auto& inputFileName : inputFileNames)
57 TClonesArray digitCalibrationConstants(
"Belle2::ECLDigitEnergyConstants");
65 TFile* f = TFile::Open(inputFile.c_str(),
"READ");
67 TIter next(f->GetListOfKeys());
69 while ((key = (TKey*) next())) {
71 string histconstants = key->GetName();
73 if (histconstants.compare(
"energy") == 0) {
74 energy = (TH1F*)f->Get(histconstants.c_str());
75 }
else if (histconstants.compare(
"amplitude") == 0) {
76 amplitude = (TH1F*)f->Get(histconstants.c_str());
79 else { B2FATAL(
"Key name does not match any of the following: energy, amplitude!"); }
85 if (nFiles != 1) { B2FATAL(
"Sorry, you must only import one file at a time for now!"); }
87 if (!amplitude) B2FATAL(
"None of the input files contains the histogram called 'amplitude'!");
88 if (!energy) B2FATAL(
"None of the input files contains the histogram called 'energy'!");
92 for (
int bin = 1; bin <= amplitude->GetNbinsX(); ++bin) {
93 float amplitudeval = amplitude->GetBinContent(bin);
94 float energyval = energy->GetBinContent(bin);
106 TClonesArray digitCalibrationConstants(
"Belle2::ECLDigitTimeConstants");
113 TFile* f = TFile::Open(inputFile.c_str(),
"READ");
115 TIter next(f->GetListOfKeys());
117 while ((key = (TKey*) next())) {
119 string histconstants = key->GetName();
121 if (histconstants.compare(
"constantB") == 0) {
122 offset = (TH1F*)f->Get(histconstants.c_str());
123 }
else { B2FATAL(
"Key name does not match any of the following: constantC!"); }
129 if (nFiles != 1) { B2FATAL(
"Sorry, you must only import one file at a time for now!"); }
131 if (!offset) B2FATAL(
"None of the input files contains the histogram called 'constantB'!");
135 for (
int bin = 1; bin <= offset->GetNbinsX(); ++bin) {
136 float offsetval = offset->GetBinContent(bin);
148 B2FATAL(
"Sorry, you must only import one file at a time for now!");
153 if (!inputFile || inputFile->IsZombie())
157 TTree* correctionTree = getRootObjectFromFile<TTree*>(inputFile,
"ParameterNtuple");
158 TTree* helperTree = getRootObjectFromFile<TTree*>(inputFile,
"ConstantNtuple");
164 int bgFractionBinNum;
169 float correctionFactor;
180 std::vector<int> m_bgFractionBinNum;
181 std::vector<int> m_regNum;
182 std::vector<int> m_phiBinNum;
183 std::vector<int> m_thetaBinNum;
184 std::vector<int> m_energyBinNum;
185 std::vector<float> m_correctionFactor;
187 for (
long iEntry = 0; iEntry < correctionTree->GetEntries(); ++iEntry) {
188 correctionTree->GetEntry(iEntry);
190 m_bgFractionBinNum.push_back(bgFractionBinNum);
191 m_regNum.push_back(regNum);
192 m_phiBinNum.push_back(phiBinNum);
193 m_thetaBinNum.push_back(thetaBinNum);
194 m_energyBinNum.push_back(energyBinNum);
195 m_correctionFactor.push_back(correctionFactor);
212 int numOfReg1ThetaBins;
213 int numOfReg2ThetaBins;
214 int numOfReg3ThetaBins;
239 std::vector<float> m_avgRecEn;
240 std::vector<float> m_lReg1Theta;
241 std::vector<float> m_hReg1Theta;
242 std::vector<float> m_lReg2Theta;
243 std::vector<float> m_hReg2Theta;
244 std::vector<float> m_lReg3Theta;
245 std::vector<float> m_hReg3Theta;
246 std::vector<int> m_numOfBfBins;
247 std::vector<int> m_numOfEnergyBins;
248 std::vector<int> m_numOfPhiBins;
249 std::vector<int> m_numOfReg1ThetaBins;
250 std::vector<int> m_numOfReg2ThetaBins;
251 std::vector<int> m_numOfReg3ThetaBins;
252 std::vector<int> m_phiPeriodicity;
254 for (
long iEntry = 0; iEntry < helperTree->GetEntries(); ++iEntry) {
255 helperTree->GetEntry(iEntry);
256 for (
unsigned int iIdx = 0; iIdx < avgRecEns.size(); ++iIdx) m_avgRecEn.push_back(avgRecEns[iIdx]);
258 m_lReg1Theta.push_back(lReg1Theta);
259 m_hReg1Theta.push_back(hReg1Theta);
260 m_lReg2Theta.push_back(lReg2Theta);
261 m_hReg2Theta.push_back(hReg2Theta);
262 m_lReg3Theta.push_back(lReg3Theta);
263 m_hReg3Theta.push_back(hReg3Theta);
264 m_numOfBfBins.push_back(numOfBfBins);
265 m_numOfEnergyBins.push_back(numOfEnergyBins);
266 m_numOfPhiBins.push_back(numOfPhiBins);
267 m_numOfReg1ThetaBins.push_back(numOfReg1ThetaBins);
268 m_numOfReg2ThetaBins.push_back(numOfReg2ThetaBins);
269 m_numOfReg3ThetaBins.push_back(numOfReg3ThetaBins);
270 m_phiPeriodicity.push_back(phiPeriodicity);
293 m_numOfReg1ThetaBins,
294 m_numOfReg2ThetaBins,
295 m_numOfReg3ThetaBins,
315 B2FATAL(
"Sorry, you must only import one file at a time for now!");
321 if (!inputFile || inputFile->IsZombie())
325 TGraph* theta_N1_graph = getRootObjectFromFile<TGraph*>(inputFile,
"SecondMomentCorrections_theta_N1");
329 TGraph* phi_N1_graph = getRootObjectFromFile<TGraph*>(inputFile,
"SecondMomentCorrections_phi_N1");
333 TGraph* theta_N2_graph = getRootObjectFromFile<TGraph*>(inputFile,
"SecondMomentCorrections_theta_N2");
337 TGraph* phi_N2_graph = getRootObjectFromFile<TGraph*>(inputFile,
"SecondMomentCorrections_phi_N2");
357 B2FATAL(
"Sorry, you must only import one file at a time for now!");
361 if (path.extension() !=
".root")
362 B2FATAL(
"Expecting a .root file. Aborting");
366 TGraph2D* theta_geo_graph = getRootObjectFromFile<TGraph2D*>(inputFile,
"LeakageCorrections_theta_geometry");
367 TGraph2D* phi_geo_graph = getRootObjectFromFile<TGraph2D*>(inputFile,
"LeakageCorrections_phi_geometry");
368 TGraph2D* theta_en_graph = getRootObjectFromFile<TGraph2D*>(inputFile,
"LeakageCorrections_theta_energy");
369 TGraph2D* phi_en_graph = getRootObjectFromFile<TGraph2D*>(inputFile,
"LeakageCorrections_phi_energy");
370 TH1F* bg_histo = getRootObjectFromFile<TH1F*>(inputFile,
"LeakageCorrections_background_fraction");
372 double bkgFactor = bg_histo->GetBinContent(1);
374 double thetaMin = theta_en_graph->GetXmin();
375 double thetaMax = theta_en_graph->GetXmax();
376 double phiMin = phi_en_graph->GetXmin();
377 double phiMax = phi_en_graph->GetXmax();
379 double energyMin = theta_en_graph->GetYmin();
380 double energyMax = theta_en_graph->GetYmax();
383 B2DEBUG(28,
"Leakage DBobjects angle boundaries: thetaMin=" << thetaMin <<
" thetaMax=" << thetaMax <<
" phiMin= " << phiMin <<
384 " phiMax= " << phiMax <<
" enmin=" << energyMin <<
385 " enmax=" << energyMax);
394 if (std::abs(bkgFactor - 1.0) < 1e-9) {
397 dbPtr_theta_geo.
construct(*theta_geo_graph, thetaMin, thetaMax, energyMin, energyMax);
399 dbPtr_phi_geo.
construct(*phi_geo_graph, phiMin, phiMax, energyMin, energyMax);
401 dbPtr_theta_en.
construct(*theta_en_graph, thetaMin, thetaMax, energyMin, energyMax);
403 dbPtr_phi_en.
construct(*phi_en_graph, phiMin, phiMax, energyMin, energyMax);
406 dbPtr_theta_geo.
import(iov);
407 dbPtr_phi_geo.
import(iov);
408 dbPtr_theta_en.
import(iov);
411 if (std::abs(bkgFactor - 1.0) < 1e-9) {
414 dbPtr_theta_geo.
construct(*theta_geo_graph, thetaMin, thetaMax, energyMin, energyMax);
416 dbPtr_phi_geo.
construct(*phi_geo_graph, phiMin, phiMax, energyMin, energyMax);
418 dbPtr_theta_en.
construct(*theta_en_graph, thetaMin, thetaMax, energyMin, energyMax);
420 dbPtr_phi_en.
construct(*phi_en_graph, phiMin, phiMax, energyMin, energyMax);
423 dbPtr_theta_geo.
import(iov);
424 dbPtr_phi_geo.
import(iov);
425 dbPtr_theta_en.
import(iov);
435 B2FATAL(
"Sorry, you must only import one file at a time for now!");
439 if (path.extension() !=
".txt")
440 B2FATAL(
"Expecting a .txt file. Aborting");
442 vector<pair<double, double>> m_matchingThresholdPairsFWD;
443 vector<pair<double, double>> m_matchingThresholdPairsBWD;
444 vector<pair<double, pair<double, double>>> m_matchingThresholdPairsBRL;
445 pair<double, double> m_matchingThresholdPair;
446 pair<double, pair<double, double>> m_thetaMatchingThresholdPair;
447 double pt, threshold, thetalimit;
452 while (getline(infile, line)) {
453 istringstream iss(line);
455 if (eclregion ==
"FWD" || eclregion ==
"BWD") {
456 iss >> pt >> threshold;
457 m_matchingThresholdPair = make_pair(pt, threshold);
458 if (eclregion ==
"FWD") m_matchingThresholdPairsFWD.push_back(m_matchingThresholdPair);
459 else m_matchingThresholdPairsBWD.push_back(m_matchingThresholdPair);
460 }
else if (eclregion ==
"BRL") {
461 iss >> thetalimit >> pt >> threshold;
462 m_matchingThresholdPair = make_pair(pt, threshold);
463 m_thetaMatchingThresholdPair = make_pair(thetalimit, m_matchingThresholdPair);
464 m_matchingThresholdPairsBRL.push_back(m_thetaMatchingThresholdPair);
469 dbPtr.
construct(m_matchingThresholdPairsFWD, m_matchingThresholdPairsBWD, m_matchingThresholdPairsBRL);
480 B2FATAL(
"Sorry, you must only import one file at a time for now!");
485 if (!inputFile || inputFile->IsZombie())
488 map<string, TF1> m_parametrizationFunctions;
489 vector<string> angles = {
"Theta",
"Phi"};
490 vector<string> regions = {
"BRL",
"BWD",
"FWD"};
491 vector<string> hittypes = {
"CROSS",
"DL",
"NEAR"};
493 for (
const auto& angle : angles) {
494 for (
const auto& region : regions) {
495 for (
const auto& hittype : hittypes) {
496 m_parametrizationFunctions.insert(make_pair(angle + region + hittype, *(getRootObjectFromFile<TF1*>(inputFile,
497 "RMSParameterization" + angle + region + hittype))));
503 dbPtr.
construct(m_parametrizationFunctions);
Class for importing array of objects to the database.
T * appendNew()
Construct a new T object at the end of the array.
bool import(const IntervalOfValidity &iov)
Import the object to database.
Class for importing a single object to the database.
void construct(Args &&... params)
Construct an object of type T in this DBImportObjPtr using the provided constructor arguments.
std::string m_phiBinNumBranchName
phiBinNum branch name
std::string m_numOfPhiBinsBranchName
numOfPhiBins branch name
std::string m_avgRecEnBranchName
avgRecEn branch name
std::string m_numOfReg3ThetaBinsBranchName
numOfReg3ThetaBins branch name
std::string m_numOfReg2ThetaBinsBranchName
numOfReg2ThetaBins branch name
void importShowerShapesSecondMomentCorrections()
Import ECL shower shape corrections to second moment to the database.
const int m_numAvgRecEnEntries
Number of entries in avgRecEn array.
std::string m_hReg2ThetaBranchName
hReg2Theta branch name
std::string m_hReg3ThetaBranchName
hReg3Theta branch name
void importDigitEnergyCalibration()
Import ECL energy calibration constants to the database.
void importShowerCorrectorLeakageCorrections()
Import ECL leakage corrections to showers.
std::string m_thetaBinNumBranchName
thetaBinNum branch name
std::string m_lReg2ThetaBranchName
lReg2Theta branch name
void importTrackClusterMatchingThresholds()
Import threshold values for track ECL cluster matching to the database.
void importShowerEnergyCorrectionTemporary()
Import ECL corrections to showers energies.
std::vector< std::string > m_inputFileNames
Input file name.
std::string m_bgFractionBinNumBranchName
Branch names for shower corrector leakage correction root file.
std::string m_numOfEnergyBinsBranchName
numOfEnergyBins branch name
void importDigitTimeCalibration()
Import ECL time calibration constants to the database.
std::string m_lReg3ThetaBranchName
lReg3Theta branch name
std::string m_correctionFactorBranchName
correctionFactor branch name
std::string m_numOfBfBinsBranchName
numOfBfBins branch name
std::string m_regNumBranchName
regNum branch name
std::string m_hReg1ThetaBranchName
hReg1Theta branch name
std::string m_energyBinNumBranchName
energyBinNum branch name
void importTrackClusterMatchingParameterizations()
Import parameterizations for the RMS between tracks and ECL clusters to the database.
ECLDatabaseImporter(std::vector< std::string > inputFileNames, const std::string &m_name)
Constructor.
std::string m_name
Database object (output) file name.
std::string m_phiPeriodicityBranchName
phiPeriodicity branch name
std::string m_lReg1ThetaBranchName
lReg1Theta branch name
std::string m_numOfReg1ThetaBinsBranchName
numOfReg1ThetaBins branch name
Energy calibration constants per digit.
Time and time resolution calibration constants per digit.
@ c_phiType
type of phi identifier
@ c_thetaType
type of theta identifier
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
@ c_nPhotons
CR is split into n photons (N1)
A class that describes the interval of experiments/runs for which an object in the database is valid.
static Database & Instance()
Instance of a singleton Database.
bool storeData(const std::string &name, TObject *object, const IntervalOfValidity &iov)
Store an object in the database.
Abstract base class for different kinds of events.