Belle II Software  release-05-01-25
InPhi0ImpactCurvBox.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #pragma once
11 
12 #include <tracking/trackFindingCDC/hough/boxes/Box.h>
13 #include <tracking/trackFindingCDC/topology/ILayer.h>
14 
15 #include <array>
16 #include <cmath>
17 
18 namespace Belle2 {
23  namespace TrackFindingCDC {
24 
26  class InPhi0ImpactCurvBox {
27 
28  public:
33  explicit InPhi0ImpactCurvBox(float curlCurv = NAN)
34  : m_curlCurv(curlCurv)
35  {}
36 
37  public:
40 
41  public:
50  ESign getDistanceSign(const HoughBox& houghBox,
51  float x,
52  float y,
53  float l,
54  float /*dxdz*/ = 0,
55  float /*dydz*/ = 0,
56  ILayer /*iCLayer*/ = -1) const
57  {
58  const std::array<DiscretePhi0, 2>& phi0Vec = houghBox.getBounds<DiscretePhi0>();
59  const std::array<DiscreteCurv, 2>& curv = houghBox.getBounds<DiscreteCurv>();
60 
61  std::array<float, 2> xRot;
62  xRot[0] = x * phi0Vec[0]->x() + y * phi0Vec[0]->y();
63  xRot[1] = x * phi0Vec[1]->x() + y * phi0Vec[1]->y();
64 
65  const bool isNonCurler = (static_cast<float>(curv[1]) <= m_curlCurv and
66  static_cast<float>(curv[0]) >= -m_curlCurv);
67  const bool onlyPositiveArm = isNonCurler;
68 
69  if (onlyPositiveArm) {
70  // Reject hit if it is on the inward going branch but the curvature suggest it is no curler
71  if (xRot[0] < 0 and xRot[1] < 0) return ESign::c_Invalid;
72  }
73 
74  std::array<float, 2> yRot;
75  yRot[0] = -x * phi0Vec[0]->y() + y * phi0Vec[0]->x();
76  yRot[1] = -x * phi0Vec[1]->y() + y * phi0Vec[1]->x();
77 
78  const std::array<ContinuousImpact, 2>& impact = houghBox.getBounds<ContinuousImpact>();
79 
80  // Using binary notation encoding lower and upper box bounds to fill the flat array.
81  std::array<float, 4> yRotMinusI;
82  yRotMinusI[0b00] = yRot[0] - impact[0];
83  yRotMinusI[0b01] = yRot[0] - impact[1];
84  yRotMinusI[0b10] = yRot[1] - impact[0];
85  yRotMinusI[0b11] = yRot[1] - impact[1];
86 
87  const float l2 = l * l;
88  std::array<float, 4> r2MinusI;
89  r2MinusI[0b00] = xRot[0] * xRot[0] + yRotMinusI[0b00] * yRotMinusI[0b00] - l2;
90  r2MinusI[0b01] = xRot[0] * xRot[0] + yRotMinusI[0b01] * yRotMinusI[0b01] - l2;
91  r2MinusI[0b10] = xRot[1] * xRot[1] + yRotMinusI[0b10] * yRotMinusI[0b10] - l2;
92  r2MinusI[0b11] = xRot[1] * xRot[1] + yRotMinusI[0b11] * yRotMinusI[0b11] - l2;
93 
94 
95  // Using binary notation encoding lower and upper box bounds to fill the flat array.
96  std::array<ESign, 2> distSign;
97  for (int c_Curv = 0; c_Curv < 2; ++c_Curv) {
98  std::array<float, 4> dist;
99  float curvHalf = static_cast<float>(curv[c_Curv]) / 2;
100  dist[0b00] = - yRotMinusI[0b00] + r2MinusI[0b00] * curvHalf - l;
101  dist[0b01] = - yRotMinusI[0b01] + r2MinusI[0b01] * curvHalf - l;
102  dist[0b10] = - yRotMinusI[0b10] + r2MinusI[0b10] * curvHalf - l;
103  dist[0b11] = - yRotMinusI[0b11] + r2MinusI[0b11] * curvHalf - l;
104  distSign[c_Curv] = ESignUtil::common(dist);
105  }
106 
107  return ESignUtil::common(distSign[0], distSign[1]);
108 
109  }
110 
111  private:
113  float m_curlCurv;
114  };
115  }
117 }
Belle2::TrackFindingCDC::Box
The base class for all boxes.
Definition: Box.h:43
Belle2::TrackFindingCDC::ESignUtil::common
static ESign common(ESign n1, ESign n2)
Check if two values have a common sign.
Definition: ESign.h:67
Belle2::TrackFindingCDC::DiscreteValue
Representation for a discrete position in an array of discrete positions.
Definition: DiscreteValue.h:33
Belle2::TrackFindingCDC::ESignUtil::ESign
ESign
Enumeration for the distinct sign values of floating point variables.
Definition: ESign.h:37
Belle2::TrackFindingCDC::InPhi0ImpactCurvBox::getDistanceSign
ESign getDistanceSign(const HoughBox &houghBox, float x, float y, float l, float=0, float=0, ILayer=-1) const
Function that gives the sign of the distance from an observed drift circle to the familiy of curves.
Definition: InPhi0ImpactCurvBox.h:58
Belle2::TrackFindingCDC::InPhi0ImpactCurvBox::InPhi0ImpactCurvBox
InPhi0ImpactCurvBox(float curlCurv=NAN)
Constructor taking the curler curvature Curlers with high curvature than the curler curvature may obt...
Definition: InPhi0ImpactCurvBox.h:41
Belle2::TrackFindingCDC::InPhi0ImpactCurvBox::m_curlCurv
float m_curlCurv
Curler curvature - set to value greater zero to activate on arm exclusive finding.
Definition: InPhi0ImpactCurvBox.h:121
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::InPhi0ImpactCurvBox::HoughBox
Box< DiscretePhi0, ContinuousImpact, DiscreteCurv > HoughBox
The box to which this object correspondes.
Definition: InPhi0ImpactCurvBox.h:47
Belle2::TrackFindingCDC::ContinuousValue
Type to have values not based on discrete positions from an array.
Definition: ContinuousValue.h:31