12 #include <klm/modules/KLMStripEfficiencyCollector/KLMStripEfficiencyCollectorModule.h>
13 #include <klm/dataobjects/KLMChannelIndex.h>
16 #include <CLHEP/Vector/ThreeVector.h>
26 m_GeometryBKLM(
nullptr),
28 m_MatchingFile(
nullptr),
29 m_MatchingTree(
nullptr),
30 m_MatchingHitData( {0, 0, 0, 0, 0, 0, 0.,
nullptr,
nullptr}),
33 setDescription(
"Module for KLM strip efficiency data collection.");
34 addParam(
"MuonListName", m_MuonListName,
"Muon list name.",
35 std::string(
"mu+:all"));
36 addParam(
"AllowedDistance1D", m_AllowedDistance1D,
37 "Maximal distance in the units of strip number from ExtHit to "
38 "matching KLMDigit.",
double(8));
39 addParam(
"MinimalMatchingDigits", m_MinimalMatchingDigits,
40 "Minimal number of matching digits.", 0);
41 addParam(
"MinimalMatchingDigitsOuterLayers",
42 m_MinimalMatchingDigitsOuterLayers,
43 "Minimal number of matching digits in outer layers.", 0);
44 addParam(
"MinimalMomentumNoOuterLayers", m_MinimalMomentumNoOuterLayers,
45 "Minimal momentum in case there are no hits in outer layers.", 0.0);
46 addParam(
"RemoveUnusedMuons", m_RemoveUnusedMuons,
47 "Whether to remove unused muons.",
false);
48 addParam(
"IgnoreBackwardPropagation", m_IgnoreBackwardPropagation,
49 "Whether to ignore ExtHits with backward propagation.",
false);
50 addParam(
"Debug", m_Debug,
"Debug mode.",
false);
51 addParam(
"DebugFileName", m_MatchingFileName,
"Debug file name.", std::string(
"matching.root"));
52 setPropertyFlags(c_ParallelProcessingCertified);
66 TH1F* matchedDigitsInPlane =
new TH1F(
67 "matchedDigitsInPlane",
"Number of matching KLMDigits",
68 nPlanes, -0.5,
double(nPlanes) - 0.5);
69 TH1F* allExtHitsInPlane =
new TH1F(
70 "allExtHitsInPlane",
"Number of ExtHits",
71 nPlanes, -0.5,
double(nPlanes) - 0.5);
72 registerObject<TH1F>(
"matchedDigitsInPlane", matchedDigitsInPlane);
73 registerObject<TH1F>(
"allExtHitsInPlane", allExtHitsInPlane);
102 B2FATAL(
"KLM channel status data are not available.");
103 int minimalActivePlanes = -1;
108 int activePlanes = 0;
111 for (; klmPlane != klmNextSector; ++klmPlane) {
114 bool isActive =
false;
117 for (; klmChannel != klmNextPlane; ++ klmChannel) {
122 B2FATAL(
"Incomplete KLM channel status data.");
136 if (activePlanes == 0)
138 if (minimalActivePlanes < 0)
139 minimalActivePlanes = activePlanes;
140 else if (minimalActivePlanes < activePlanes)
141 minimalActivePlanes = activePlanes;
143 if ((minimalActivePlanes >= 0) &&
145 B2WARNING(
"The minimal number of active planes (" << minimalActivePlanes <<
146 ") is less than the minimal number of matching digits (" <<
148 "matching digits is reduced to make the calibration possible.");
159 std::vector<unsigned int> toRemove;
160 unsigned int nMuons =
m_MuonList->getListSize();
167 TH1F* matchedDigitsInPlane = getObjectPtr<TH1F>(
"matchedDigitsInPlane");
168 TH1F* allExtHitsInPlane = getObjectPtr<TH1F>(
"allExtHitsInPlane");
169 for (
unsigned int i = 0; i < nMuons; ++i) {
174 toRemove.push_back(muon->getArrayIndex());
181 std::map<uint16_t, struct HitData>& hitMap,
182 uint16_t planeGlobal,
struct HitData* hitData)
184 std::map<uint16_t, struct HitData>::iterator it;
185 it = hitMap.find(planeGlobal);
190 if (it == hitMap.end()) {
191 hitMap.insert(std::pair<uint16_t, struct HitData>(
192 planeGlobal, *hitData));
204 if (digit.isMultiStrip())
206 if (!(digit.getSubdetector() == hitData->
subdetector &&
207 digit.getSection() == hitData->
section &&
208 digit.getLayer() == hitData->
layer &&
209 digit.getSector() == hitData->
sector &&
210 digit.getPlane() == hitData->
plane))
213 hitData->
digit = &digit;
220 const Particle* muon, TH1F* matchedDigitsInPlane, TH1F* allExtHitsInPlane)
222 const int nExtrapolationLayers =
224 const Track* track = muon->getTrack();
226 std::map<uint16_t, struct HitData> selectedHits;
227 std::map<uint16_t, struct HitData>::iterator it;
230 struct HitData hitData, hitDataPrevious;
231 TVector3 extHitPosition;
232 CLHEP::Hep3Vector extHitPositionCLHEP, localPosition;
234 int extHitLayer[nExtrapolationLayers] = {0};
235 int digitLayer[nExtrapolationLayers] = {0};
237 for (
const ExtHit& hit : extHits) {
244 if (hit.getStatus() != EXT_EXIT)
253 if (hit.isBackwardPropagated())
256 uint16_t planeGlobal = 0;
258 hitData.
digit =
nullptr;
259 if (hit.getDetectorID() == Const::EDetector::EKLM) {
260 int stripGlobal = hit.getCopyID();
270 B2FATAL(
"Incomplete KLM channel status data.");
274 extHitLayer[layer - 1]++;
278 addHit(selectedHits, planeGlobal, &hitData);
280 }
else if (hit.getDetectorID() == Const::EDetector::BKLM) {
281 int moduleNumber = hit.getCopyID();
298 B2FATAL(
"Incomplete KLM channel status data.");
302 extHitLayer[layer - 1]++;
306 addHit(selectedHits, planeGlobal, &hitData);
310 extHitPosition = hit.getPosition();
311 extHitPositionCLHEP.setX(extHitPosition.X());
312 extHitPositionCLHEP.setY(extHitPosition.Y());
313 extHitPositionCLHEP.setZ(extHitPosition.Z());
317 localPosition = module->globalToLocal(extHitPositionCLHEP);
319 hitData.
strip = module->getZStrip(localPosition);
331 std::memcpy(&hitDataPrevious, &hitData,
sizeof(
struct HitData));
335 hitData.
strip,
false)) {
341 B2FATAL(
"Incomplete KLM channel status data.");
345 extHitLayer[layer - 1]++;
350 addHit(selectedHits, planeGlobal, &hitData);
354 hitData.
strip = module->getPhiStrip(localPosition);
358 hitData.
strip,
false)) {
364 B2FATAL(
"Incomplete KLM channel status data.");
368 extHitLayer[layer - 1]++;
373 addHit(selectedHits, planeGlobal, &hitData);
382 std::map<int, int>::iterator it2;
383 for (it = selectedHits.begin(); it != selectedHits.end(); ++it) {
385 if (it->second.digit !=
nullptr) {
388 it->second.subdetector, it->second.layer);
389 digitLayer[layer - 1]++;
395 for (it = selectedHits.begin(); it != selectedHits.end(); ++it) {
396 int matchingDigits = 0;
397 int matchingDigitsOuterLayers = 0;
398 int extHitsOuterLayers = 0;
400 it->second.subdetector, it->second.layer) - 1;
401 for (
int i = 0; i < nExtrapolationLayers; ++i) {
403 matchingDigits += digitLayer[i];
405 matchingDigitsOuterLayers += digitLayer[i];
406 extHitsOuterLayers += extHitLayer[i];
433 if (it->second.digit) {