Belle II Software development
InPhi0ImpactBox.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#pragma once
9
10#include <tracking/trackFindingCDC/hough/boxes/Box.h>
11#include <tracking/trackFindingCDC/topology/ILayer.h>
12
13#include <array>
14#include <cmath>
15
16namespace Belle2 {
21 namespace TrackFindingCDC {
22
25
26 public:
28 explicit InPhi0ImpactBox(float curlCurv = NAN)
29 : m_curlCurv(curlCurv)
30 {}
31
32 public:
35
36 public:
46 float x,
47 float y,
48 float l,
49 float /*dxdz*/ = 0,
50 float /*dydz*/ = 0,
51 ILayer /*iCLayer*/ = -1) const
52 {
53 const std::array<DiscretePhi0, 2>& phi0Vec = houghBox.getBounds<DiscretePhi0>();
54 const std::array<ContinuousImpact, 2>& impact = houghBox.getBounds<ContinuousImpact>();
55
56 std::array<float, 2> xRot;
57 xRot[0] = x * phi0Vec[0]->x() + y * phi0Vec[0]->y();
58 xRot[1] = x * phi0Vec[1]->x() + y * phi0Vec[1]->y();
59
60 const bool onlyPositiveArm = 0 < m_curlCurv;
61 if (onlyPositiveArm) {
62 // Reject hit if it is on the inward going branch but the curvature suggest it is no curler
63 if (xRot[0] < 0 and xRot[1] < 0) return ESign::c_Invalid;
64 }
65
66 std::array<float, 2> yRotPlusL;
67 yRotPlusL[0] = -x * phi0Vec[0]->y() + y * phi0Vec[0]->x() + l;
68 yRotPlusL[1] = -x * phi0Vec[1]->y() + y * phi0Vec[1]->x() + l;
69
70 // Using binary notation encoding lower and upper box bounds to fill the flat array.
71 std::array<float, 4> dist;
72 dist[0b00] = yRotPlusL[0] - static_cast<float>(impact[0]);
73 dist[0b10] = yRotPlusL[1] - static_cast<float>(impact[0]);
74 dist[0b01] = yRotPlusL[0] - static_cast<float>(impact[1]);
75 dist[0b11] = yRotPlusL[1] - static_cast<float>(impact[1]);
76
77 return ESignUtil::common(dist);
78 }
79
80 private:
83 };
84 }
86}
The base class for all boxes.
Definition: Box.h:33
Type to have values not based on discrete positions from an array.
Representation for a discrete position in an array of discrete positions.
Definition: DiscreteValue.h:23
Checker if a position is contained in a family of curves over phi0 and impact.
float m_curlCurv
Curler curvature - set to value greater zero to activate one arm exclusive finding.
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 family of curves.
InPhi0ImpactBox(float curlCurv=NAN)
Constructor taking the curler curvature - give a zero greater 0 to activate one arm exclusive finding...
ESign
Enumeration for the distinct sign values of floating point variables.
Definition: ESign.h:27
static ESign common(ESign n1, ESign n2)
Check if two values have a common sign.
Definition: ESign.h:57
Abstract base class for different kinds of events.