12 #include <klm/calibration/KLMLikelihoodParametersImporter.h>
15 #include <klm/dbobjects/KLMLikelihoodParameters.h>
16 #include <klm/muid/MuidElementNumbers.h>
19 #include <framework/database/DBImportObjPtr.h>
20 #include <framework/database/DBObjPtr.h>
21 #include <framework/gearbox/GearDir.h>
22 #include <framework/database/IntervalOfValidity.h>
23 #include <framework/logging/Logger.h>
33 void KLMLikelihoodParametersImporter::writeLikelihoodParameters()
35 B2WARNING(
"The method KLMLikelihoodParametersImporter::writeMuidParameters() is temporary unavailable, sorry! :(");
40 vector<string>
const hypotheses = {
"Positron",
"Electron" ,
"Deuteron",
"Antideuteron",
"Proton",
"Antiproton",
"PionPlus",
"PionMinus",
"KaonPlus",
"KaonMinus",
"MuonPlus",
"MuonMinus" };
41 for (
unsigned int hypothesis = 0; hypothesis < hypotheses.size(); hypothesis++) {
42 GearDir content(
"/Detector/Muid/MuidParameters//Experiment[@exp=\"0\"]/");
43 content.append(hypotheses[hypothesis]);
44 for (
int outcome = 1; outcome <= MuidElementNumbers::getMaximalOutcome(); ++outcome) {
45 GearDir outcomeContent(content);
46 outcomeContent.
append((boost::format(
"/LayerProfile/Outcome[@outcome=\"%1%\"]/") % (outcome)).str());
47 for (
int lastLayer = 0; lastLayer <= MuidElementNumbers::getMaximalBarrelLayer(); ++lastLayer) {
48 if (!(MuidElementNumbers::checkExtrapolationOutcome(outcome, lastLayer)))
50 std::vector<double> layerPDF = outcomeContent.
getArray((boost::format(
"LastLayer[@layer=\"%1%\"]") % (lastLayer)).str());
54 for (
int detector = 0; detector <= MuidElementNumbers::getMaximalDetector(); ++detector) {
55 GearDir detectorContent(content);
56 if (detector == 0) detectorContent.
append(
"/TransversePDF/BarrelAndEndcap");
57 if (detector == 1) detectorContent.
append(
"/TransversePDF/BarrelOnly");
58 if (detector == 2) 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);
76 likelihoodParameters.
import(Iov);
79 void KLMLikelihoodParametersImporter::readLikelihoodParameters()
82 vector<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)))
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] <<
" , ");
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());
112 for (
int i = 0; i < MuidElementNumbers::getSizeReducedChiSquared(); ++i) {
113 B2INFO(
" PDF " << reducedChiSquaredPDF[i]);