NSL
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
TrackFiducialVolume.cpp
Go to the documentation of this file.
2 
3 // NAIA headers
4 #include <Containers/Utils.hpp>
5 
6 namespace NSL {
7 namespace Selections {
8 namespace Track {
9 
10 // Beware, for L9 the check is X only, not R
11 constexpr std::array<float, 9> fid_R = {62, 62, 46, 46, 46, 46, 46, 46, 43};
12 constexpr std::array<float, 9> fid_Y = {47, 40, 44, 44, 36, 36, 44, 44, 29};
13 
14 bool IsInsideFiducial(unsigned int ilayer, NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType,
15  NAIA::Event &event) {
16 
17  assert(ilayer > 0 && ilayer < 10);
18  auto layer = static_cast<NAIA::TrTrack::FitPositionHeight>(ilayer-1);
19 
20  float x = event.trTrackBase->TrTrackFitPos[layer][fitType][spanType][NAIA::TrTrack::Side::X];
21  float y = event.trTrackBase->TrTrackFitPos[layer][fitType][spanType][NAIA::TrTrack::Side::Y];
22 
23  if (layer == NAIA::TrTrack::FitPositionHeight::Layer9) {
24  if (std::fabs(x) > fid_R[layer] || std::fabs(y) > fid_Y[layer])
25  return false;
26  } else {
27  if (std::sqrt(x * x + y * y) > fid_R[layer] || std::fabs(y) > fid_Y[layer])
28  return false;
29  }
30 
31  return true;
32 }
33 
34 InnerFiducialVolume::InnerFiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType) {
35  m_matcher = std::make_shared<boolMatcher>([=](Event &event) {
36  if (!event.trTrackBase->FitIDExists(fitType, spanType))
37  return false;
38 
39  unsigned int nhits = 0;
40 
41  for (unsigned int layer = 2; layer < 9; ++layer)
42  if (IsInsideFiducial(layer, fitType, spanType, event))
43  nhits++;
44  if (nhits < 5)
45  return false;
46 
47  if (!IsInsideFiducial(2, fitType, spanType, event))
48  return false;
49  if (!(IsInsideFiducial(3, fitType, spanType, event) || IsInsideFiducial(4, fitType, spanType, event)))
50  return false;
51  if (!(IsInsideFiducial(5, fitType, spanType, event) || IsInsideFiducial(6, fitType, spanType, event)))
52  return false;
53  if (!(IsInsideFiducial(7, fitType, spanType, event) || IsInsideFiducial(8, fitType, spanType, event)))
54  return false;
55 
56  return true;
57  });
58 }
59 
60 L1FiducialVolume::L1FiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType) {
61  m_matcher = std::make_shared<boolMatcher>([=](Event &event) {
62  if (!event.trTrackBase->FitIDExists(fitType, spanType))
63  return false;
64 
65  return IsInsideFiducial(1, fitType, spanType, event);
66  });
67 }
68 
69 L9FiducialVolume::L9FiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType) {
70  m_matcher = std::make_shared<boolMatcher>([=](Event &event) {
71  if (!event.trTrackBase->FitIDExists(fitType, spanType))
72  return false;
73 
74  return IsInsideFiducial(9, fitType, spanType, event);
75  });
76 }
77 
78 } // namespace Track
79 } // namespace Selections
80 } // namespace NSL
NAIA::Event Event
Definition: matchers.h:11
constexpr std::array< float, 9 > fid_R
constexpr std::array< float, 9 > fid_Y
bool IsInsideFiducial(unsigned int ilayer, NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType, NAIA::Event &event)
InnerFiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType)
L1FiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType)
L9FiducialVolume(NAIA::TrTrack::Fit fitType, NAIA::TrTrack::Span spanType)
RefCMatcher m_matcher
Definition: Selection.h:73