Belle II Software development
KLMLikelihoodParametersImporter.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <klm/calibration/KLMLikelihoodParametersImporter.h>
11
12/* KLM headers. */
13#include <klm/dbobjects/KLMLikelihoodParameters.h>
14#include <klm/muid/MuidElementNumbers.h>
15
16/* Basf2 headers. */
17#include <framework/database/DBImportObjPtr.h>
18#include <framework/database/DBObjPtr.h>
19#include <framework/gearbox/GearDir.h>
20#include <framework/database/IntervalOfValidity.h>
21#include <framework/logging/Logger.h>
22
23/* C++ headers. */
24#include <fstream>
25#include <string>
26#include <vector>
27
28using namespace Belle2;
29
31{
32 B2WARNING("The method KLMLikelihoodParametersImporter::writeMuidParameters() is temporary unavailable, sorry! :(");
33 return;
35 DBImportObjPtr<KLMLikelihoodParameters> likelihoodParameters;
36 likelihoodParameters.construct();
37 std::vector<std::string> const hypotheses = {"Positron", "Electron", "Deuteron", "Antideuteron", "Proton", "Antiproton", "PionPlus", "PionMinus", "KaonPlus", "KaonMinus", "MuonPlus", "MuonMinus" };
38 for (unsigned int hypothesis = 0; hypothesis < hypotheses.size(); hypothesis++) {
39 GearDir content("/Detector/Muid/MuidParameters//Experiment[@exp=\"0\"]/");
40 content.append(hypotheses[hypothesis]);
41 for (int outcome = 1; outcome <= MuidElementNumbers::getMaximalOutcome(); ++outcome) {
42 GearDir outcomeContent(content);
43 outcomeContent.append((boost::format("/LayerProfile/Outcome[@outcome=\"%1%\"]/") % (outcome)).str());
44 for (int lastLayer = 0; lastLayer <= MuidElementNumbers::getMaximalBarrelLayer(); ++lastLayer) {
45 if (!(MuidElementNumbers::checkExtrapolationOutcome(outcome, lastLayer)))
46 break;
47 std::vector<double> layerPDF = outcomeContent.getArray((boost::format("LastLayer[@layer=\"%1%\"]") % (lastLayer)).str());
48 likelihoodParameters->setLongitudinalPDF(hypothesis, outcome, lastLayer, layerPDF);
49 }
50 }
51 for (int detector = 0; detector <= MuidElementNumbers::getMaximalDetector(); ++detector) {
52 GearDir detectorContent(content);
53 if (detector == 0)
54 detectorContent.append("/TransversePDF/BarrelAndEndcap");
55 if (detector == 1)
56 detectorContent.append("/TransversePDF/BarrelOnly");
57 if (detector == 2)
58 detectorContent.append("/TransversePDF/EndcapOnly");
59 for (int halfNdof = 1; halfNdof <= MuidElementNumbers::getMaximalHalfNdof(); ++halfNdof) {
60 double reducedChiSquaredThreshold = detectorContent.getDouble((boost::format("DegreesOfFreedom[@ndof=\"%1%\"]/Tail/Threshold") %
61 (2 * halfNdof)).str());
62 double reducedChiSquaredScaleY = detectorContent.getDouble((boost::format("DegreesOfFreedom[@ndof=\"%1%\"]/Tail/ScaleY") %
63 (2 * halfNdof)).str());
64 double reducedChiSquaredScaleX = detectorContent.getDouble((boost::format("DegreesOfFreedom[@ndof=\"%1%\"]/Tail/ScaleX") %
65 (2 * halfNdof)).str());
66 std::vector<double> reducedChiSquaredPDF = detectorContent.getArray((boost::format("DegreesOfFreedom[@ndof=\"%1%\"]/Histogram") %
67 (2 * halfNdof)).str());
68 likelihoodParameters->setTransversePDF(hypothesis, detector, halfNdof * 2, reducedChiSquaredPDF);
69 likelihoodParameters->setTransverseThreshold(hypothesis, detector, halfNdof * 2, reducedChiSquaredThreshold);
70 likelihoodParameters->setTransverseScaleY(hypothesis, detector, halfNdof * 2, reducedChiSquaredScaleY);
71 likelihoodParameters->setTransverseScaleX(hypothesis, detector, halfNdof * 2, reducedChiSquaredScaleX);
72 }
73 }
74 }
75 IntervalOfValidity Iov(0, 0, -1, -1);
76 likelihoodParameters.import(Iov);
77}
78
80{
81 DBObjPtr<KLMLikelihoodParameters> likelihoodParameters;
82 std::vector<std::string> const hypotheses = {"Positron", "Electron", "Deuteron", "Antideuteron", "Proton", "Antiproton", "PionPlus", "PionMinus", "KaonPlus", "KaonMinus", "MuonPlus", "MuonMinus" };
83 for (unsigned int hypothesis = 0; hypothesis < hypotheses.size(); hypothesis++) {
84 B2INFO(" hypothesisName " << hypotheses[hypothesis]);
85 for (int outcome = 1; outcome <= MuidElementNumbers::getMaximalOutcome(); ++outcome) {
86 B2INFO(" outcome " << outcome);
87 for (int lastLayer = 0; lastLayer <= MuidElementNumbers::getMaximalBarrelLayer(); ++lastLayer) {
88 B2INFO(" lastLayer " << lastLayer);
89 if (!(MuidElementNumbers::checkExtrapolationOutcome(outcome, lastLayer)))
90 break;
91 std::vector<double> layerPDF = likelihoodParameters->getLongitudinalPDF(hypothesis, outcome, lastLayer);
92 B2INFO(" layerPDF: ");
93 for (unsigned int layer = 0; layer < layerPDF.size(); ++layer) {
94 B2INFO(layerPDF[layer] << " , ");
95 }
96 }
97 }
98 const char* detectorNames[] = {"BarrelAndEndcap", "BarrelOnly", "EndcapOnly"};
99 for (int detector = 0; detector <= MuidElementNumbers::getMaximalDetector(); ++detector) {
100 B2INFO(" detectorName " << detectorNames[detector]);
101 for (int halfNdof = 1; halfNdof <= MuidElementNumbers::getMaximalHalfNdof(); ++halfNdof) {
102 B2INFO(" Ndof " << halfNdof * 2);
103 B2INFO(" ReducedChiSquaredThreshold " << likelihoodParameters->getTransverseThreshold(hypothesis, detector, halfNdof * 2));
104 B2INFO(" ReducedChiSquaredScaleY " << likelihoodParameters->getTransverseScaleY(hypothesis, detector, halfNdof * 2));
105 B2INFO(" ReducedChiSquaredScaleX " << likelihoodParameters->getTransverseScaleX(hypothesis, detector, halfNdof * 2));
106 std::vector<double> reducedChiSquaredPDF = likelihoodParameters->getTransversePDF(hypothesis, detector, halfNdof * 2);
107 if (reducedChiSquaredPDF.size() != MuidElementNumbers::getSizeReducedChiSquared()) {
108 B2ERROR("KLMLikelihoodParametersImporter::TransversePDF vector for hypothesis " << hypotheses[hypothesis] << " detector " <<
109 detectorNames[detector]
110 << " has " << reducedChiSquaredPDF.size() << " entries; should be " << MuidElementNumbers::getSizeReducedChiSquared());
111 } else {
112 for (int i = 0; i < MuidElementNumbers::getSizeReducedChiSquared(); ++i) {
113 B2INFO(" PDF " << reducedChiSquaredPDF[i]);
114 }
115 }
116 }
117 }
118 }
119}
120
bool import(const IntervalOfValidity &iov)
Import the object to database.
Definition: DBImportBase.cc:36
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.
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
void append(const std::string &path)
Append something to the current path, modifying the GearDir in place.
Definition: GearDir.h:52
A class that describes the interval of experiments/runs for which an object in the database is valid.
void readLikelihoodParameters()
Read KLMLikelihoodParameters from the database.
void writeLikelihoodParameters()
Write KLMLikelihoodParameters into the database.
static constexpr int getMaximalDetector()
Get maximal value of the detector selector (for transverse scattering).
static constexpr int getMaximalHalfNdof()
Get maximal value of NDof/2 (for transverse scattering).
static constexpr int getMaximalBarrelLayer()
Get maximal barrel layer number (0-based).
static bool checkExtrapolationOutcome(unsigned int outcome, int lastLayer)
Check the track extrapolation outcome.
static constexpr int getSizeReducedChiSquared()
Get size of array with reduced chi-squared values (for transverse scattering).
static constexpr int getMaximalOutcome()
Get maximal value of the track extrapolation outcome.
std::vector< double > getArray(const std::string &path) const noexcept(false)
Get the parameter path as a list of double values converted to the standard unit.
Definition: Interface.cc:123
double getDouble(const std::string &path="") const noexcept(false)
Get the parameter path as a double.
Definition: Interface.cc:41
Abstract base class for different kinds of events.