10 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
11 #include <klm/dataobjects/eklm/EKLMElementNumbers.h>
12 #include <klm/dataobjects/KLMMuidLikelihood.h>
13 #include <klm/muid/MuidBuilder.h>
14 #include <klm/muid/MuidElementNumbers.h>
17 #include <framework/database/Database.h>
18 #include <framework/database/DBStore.h>
19 #include <framework/dataobjects/EventMetaData.h>
20 #include <framework/datastore/StoreArray.h>
21 #include <framework/datastore/StoreObjPtr.h>
22 #include <framework/gearbox/Const.h>
29 #include <gtest/gtest.h>
48 DataStore::Instance().setInitializeActive(
true);
53 DataStore::Instance().setInitializeActive(
false);
56 DBStore& dbStore = DBStore::Instance();
64 DataStore::Instance().reset();
75 std::vector<int> m_pdgVectorMinus = MuidElementNumbers::getPDGVector(-1);
78 std::vector<int> m_pdgVectorPlus = MuidElementNumbers::getPDGVector(1);
85 int pdg = Const::muon.getPDGCode();
86 std::bitset<30> bitExtPattern(std::string(
"11111111111111"));
87 unsigned int extPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
88 unsigned int hitPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
89 bool isForward =
true;
91 int lastBarrelLayer = 13;
92 int lastEndcapLayer = -1;
93 unsigned int outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
94 double chiSquared = 29.5;
95 int degreesOfFreedom = 28;
97 m_muid->setPDGCode(pdg);
98 m_muid->setExtLayerPattern(extPattern);
99 m_muid->setHitLayerPattern(hitPattern);
100 m_muid->setIsForward(isForward);
101 m_muid->setBarrelExtLayer(lastBarrelLayer);
102 m_muid->setEndcapExtLayer(lastBarrelLayer);
103 m_muid->setOutcome(outcome);
104 m_muid->setChiSquared(chiSquared);
105 m_muid->setDegreesOfFreedom(degreesOfFreedom);
106 std::vector<float> logLVector = { -169.215, -0.288937, -46.5124, -49.7292, -72.7715, -96.2517};
107 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
108 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
109 float logL = std::log(m_muidBuilder->getPDF(m_muid));
110 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
111 delete m_muidBuilder;
115 m_pdgVectorPlus = MuidElementNumbers::getPDGVector(1);
116 logLVector = { -169.215, -0.284881, -45.7914, -42.7717, -95.9839, -118.769};
117 for (
size_t i = 0; i < m_pdgVectorPlus.size(); ++i) {
118 m_muidBuilder =
new MuidBuilder(m_pdgVectorPlus.at(i));
119 float logL = std::log(m_muidBuilder->getPDF(m_muid));
120 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
121 delete m_muidBuilder;
129 int pdg = Const::muon.getPDGCode();
130 std::bitset<30> bitExtPattern(std::string(
"11111111111111"));
131 unsigned int extPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
132 std::bitset<30> bitHitPattern(std::string(
"11011111111101"));
133 unsigned int hitPattern =
static_cast<unsigned int>(bitHitPattern.to_ulong());
134 bool isForward =
true;
135 bool escaped =
false;
136 int lastBarrelLayer = 13;
137 int lastEndcapLayer = -1;
138 unsigned int outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
139 double chiSquared = 23.5;
140 int degreesOfFreedom = 24;
142 m_muid->setPDGCode(pdg);
143 m_muid->setExtLayerPattern(extPattern);
144 m_muid->setHitLayerPattern(hitPattern);
145 m_muid->setIsForward(isForward);
146 m_muid->setBarrelExtLayer(lastBarrelLayer);
147 m_muid->setEndcapExtLayer(lastBarrelLayer);
148 m_muid->setOutcome(outcome);
149 m_muid->setChiSquared(chiSquared);
150 m_muid->setDegreesOfFreedom(degreesOfFreedom);
151 std::vector<float> logLVector = { -147.07, -6.37567, -40.9424, -43.8204, -63.8973, -84.6684};
152 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
153 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
154 float logL = std::log(m_muidBuilder->getPDF(m_muid));
155 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
156 delete m_muidBuilder;
164 int pdg = Const::muon.getPDGCode();
165 std::bitset<30> bitExtPattern(std::string(
"11111111111111"));
166 unsigned int extPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
167 std::bitset<30> bitHitPattern(std::string(
"11"));
168 unsigned int hitPattern =
static_cast<unsigned int>(bitHitPattern.to_ulong());
169 bool isForward =
true;
170 bool escaped =
false;
171 int lastBarrelLayer = 1;
172 int lastEndcapLayer = -1;
173 unsigned int outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
174 double chiSquared = 7.5;
175 int degreesOfFreedom = 4;
177 m_muid->setPDGCode(pdg);
178 m_muid->setExtLayerPattern(extPattern);
179 m_muid->setHitLayerPattern(hitPattern);
180 m_muid->setIsForward(isForward);
181 m_muid->setBarrelExtLayer(lastBarrelLayer);
182 m_muid->setEndcapExtLayer(lastBarrelLayer);
183 m_muid->setOutcome(outcome);
184 m_muid->setChiSquared(chiSquared);
185 m_muid->setDegreesOfFreedom(degreesOfFreedom);
186 std::vector<float> logLVector = { -13.0068, -1.82853, -4.78739, -6.44048, -6.67272, -6.8342};
187 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
188 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
189 float logL = std::log(m_muidBuilder->getPDF(m_muid));
190 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
191 delete m_muidBuilder;
199 int pdg = Const::muon.getPDGCode();
200 std::bitset<30> bitExtPattern(std::string(
"1111111000000000000111"));
201 unsigned int extPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
202 unsigned int hitPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
204 bool isForward =
true;
205 bool escaped =
false;
206 int lastBarrelLayer = 2;
207 int lastEndcapLayer = 6;
208 unsigned int outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
209 double chiSquared = 19.5;
210 int degreesOfFreedom = 20;
212 m_muid->setPDGCode(pdg);
213 m_muid->setExtLayerPattern(extPattern);
214 m_muid->setHitLayerPattern(hitPattern);
215 m_muid->setIsForward(isForward);
216 m_muid->setBarrelExtLayer(lastBarrelLayer);
217 m_muid->setEndcapExtLayer(lastBarrelLayer);
218 m_muid->setOutcome(outcome);
219 m_muid->setChiSquared(chiSquared);
220 m_muid->setDegreesOfFreedom(degreesOfFreedom);
221 std::vector<float> logLVector = { -44.4325, -0.746618, -17.3903, -18.7434, -25.4178, -34.7886};
222 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
223 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
224 float logL = std::log(m_muidBuilder->getPDF(m_muid));
225 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
226 delete m_muidBuilder;
231 outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
232 m_muid->setIsForward(isForward);
233 m_muid->setOutcome(outcome);
234 logLVector = { -50.7005, -1.11268, -18.3302, -20.7392, -26.5815, -33.6206};
235 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
236 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
237 float logL = std::log(m_muidBuilder->getPDF(m_muid));
238 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
239 delete m_muidBuilder;
247 int pdg = Const::muon.getPDGCode();
248 std::bitset<30> bitExtPattern(std::string(
"1111111000000000000111"));
249 unsigned int extPattern =
static_cast<unsigned int>(bitExtPattern.to_ulong());
250 std::bitset<30> bitHitPattern(std::string(
"1100111000000000000101"));
251 unsigned int hitPattern =
static_cast<unsigned int>(bitHitPattern.to_ulong());
253 bool isForward =
true;
254 bool escaped =
false;
255 int lastBarrelLayer = 2;
256 int lastEndcapLayer = 6;
257 unsigned int outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
258 double chiSquared = 15.5;
259 int degreesOfFreedom = 14;
260 float efficiency = 0.8437;
262 m_muid->setPDGCode(pdg);
263 m_muid->setExtLayerPattern(extPattern);
264 m_muid->setHitLayerPattern(hitPattern);
265 m_muid->setIsForward(isForward);
266 m_muid->setBarrelExtLayer(lastBarrelLayer);
267 m_muid->setEndcapExtLayer(lastBarrelLayer);
268 m_muid->setOutcome(outcome);
269 m_muid->setChiSquared(chiSquared);
270 m_muid->setDegreesOfFreedom(degreesOfFreedom);
271 for (
int layer = 0; layer < BKLMElementNumbers::getMaximalLayerNumber(); ++layer)
272 m_muid->setExtBKLMEfficiencyValue(layer, efficiency);
273 for (
int layer = 0; layer < EKLMElementNumbers::getMaximalLayerNumber(); ++layer)
274 m_muid->setExtEKLMEfficiencyValue(layer, efficiency);
275 std::vector<float> logLVector = { -38.1205, -2.43391, -16.0512, -17.094, -23.4617, -31.9516};
276 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
277 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
278 float logL = std::log(m_muidBuilder->getPDF(m_muid));
279 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
280 delete m_muidBuilder;
285 outcome = MuidElementNumbers::calculateExtrapolationOutcome(isForward, escaped, lastBarrelLayer, lastEndcapLayer);
286 m_muid->setIsForward(isForward);
287 m_muid->setOutcome(outcome);
288 logLVector = { -43.7474, -2.51744, -16.6359, -18.5523, -23.8643, -29.9728};
289 for (
size_t i = 0; i < m_pdgVectorMinus.size(); ++i) {
290 m_muidBuilder =
new MuidBuilder(m_pdgVectorMinus.at(i));
291 float logL = std::log(m_muidBuilder->getPDF(m_muid));
292 EXPECT_LT(std::abs(logL - logLVector.at(i)), 10E-4);
293 delete m_muidBuilder;
Singleton class to cache database objects.
Class to store the likelihoods from KLM with additional informations related to the extrapolation.
Test for the MuidBuilder class, using the payloads in the default Global Tag.
void SetUp() override
Register the necessary objects in the DataStore and setup the Database.
void TearDown() override
Clear the DataStore and reset the Database.
Build the Muid likelihoods starting from the hit pattern and the transverse scattering in the KLM.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
Type-safe access to single objects in the data store.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
void updateEvent()
Updates all intra-run dependent objects.
void update()
Updates all objects that are outside their interval of validity.
TEST_F(MuidBuilderTest, MuidBuilder05)
Test for a muon with hits in both barrel and endcaps.
Abstract base class for different kinds of events.