Belle II Software  release-05-01-25
InPhi0ImpactBox.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 InPhi0ImpactBox {
27 
28  public:
30  explicit InPhi0ImpactBox(float curlCurv = NAN)
31  : m_curlCurv(curlCurv)
32  {}
33 
34  public:
37 
38  public:
47  ESign getDistanceSign(const HoughBox& houghBox,
48  float x,
49  float y,
50  float l,
51  float /*dxdz*/ = 0,
52  float /*dydz*/ = 0,
53  ILayer /*iCLayer*/ = -1) const
54  {
55  const std::array<DiscretePhi0, 2>& phi0Vec = houghBox.getBounds<DiscretePhi0>();
56  const std::array<ContinuousImpact, 2>& impact = houghBox.getBounds<ContinuousImpact>();
57 
58  std::array<float, 2> xRot;
59  xRot[0] = x * phi0Vec[0]->x() + y * phi0Vec[0]->y();
60  xRot[1] = x * phi0Vec[1]->x() + y * phi0Vec[1]->y();
61 
62  const bool onlyPositiveArm = 0 < m_curlCurv;
63  if (onlyPositiveArm) {
64  // Reject hit if it is on the inward going branch but the curvature suggest it is no curler
65  if (xRot[0] < 0 and xRot[1] < 0) return ESign::c_Invalid;
66  }
67 
68  std::array<float, 2> yRotPlusL;
69  yRotPlusL[0] = -x * phi0Vec[0]->y() + y * phi0Vec[0]->x() + l;
70  yRotPlusL[1] = -x * phi0Vec[1]->y() + y * phi0Vec[1]->x() + l;
71 
72  // Using binary notation encoding lower and upper box bounds to fill the flat array.
73  std::array<float, 4> dist;
74  dist[0b00] = yRotPlusL[0] - static_cast<float>(impact[0]);
75  dist[0b10] = yRotPlusL[1] - static_cast<float>(impact[0]);
76  dist[0b01] = yRotPlusL[0] - static_cast<float>(impact[1]);
77  dist[0b11] = yRotPlusL[1] - static_cast<float>(impact[1]);
78 
79  return ESignUtil::common(dist);
80  }
81 
82  private:
84  float m_curlCurv;
85  };
86  }
88 }
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::InPhi0ImpactBox::m_curlCurv
float m_curlCurv
Curler curvature - set to value greater zero to activate one arm exclusive finding.
Definition: InPhi0ImpactBox.h:92
Belle2::TrackFindingCDC::ESignUtil::ESign
ESign
Enumeration for the distinct sign values of floating point variables.
Definition: ESign.h:37
Belle2::TrackFindingCDC::InPhi0ImpactBox::InPhi0ImpactBox
InPhi0ImpactBox(float curlCurv=NAN)
Constructor taking the curler curvature - give a zero greater 0 to activate one arm exclusive finding...
Definition: InPhi0ImpactBox.h:38
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::InPhi0ImpactBox::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: InPhi0ImpactBox.h:55
Belle2::TrackFindingCDC::ContinuousValue
Type to have values not based on discrete positions from an array.
Definition: ContinuousValue.h:31