Belle II Software development
NeuroTrigger3DH Class Reference

Classes

struct  TanhLUT
 

Public Member Functions

void initialize ()
 
void initializeCollections (std::string hitCollectionName)
 
void createIntWeights ()
 
void calculateTrackParameters (const CDCTrigger3DHTrack &track)
 
void calculateTrackParametersFixedPrecision (const CDCTrigger3DHTrack &track)
 
void setEventTime (const CDCTrigger3DHTrack &track)
 
std::vector< size_t > load3DHits (const CDCTrigger3DHTrack &track) const
 
std::vector< float > getInputVector (const std::vector< size_t > &hitIds) const
 
std::vector< float > runMLP (const std::vector< float > &input) const
 
std::vector< float > runMLPFixedPrecision (const std::vector< float > &input) const
 
std::vector< float > unscaleTarget (const std::vector< float > &target) const
 
std::vector< float > scaleTarget (const std::vector< float > &target) const
 
int getWeightBits () const
 
int getFractionalWeightBits () const
 
const std::vector< int32_t > & getIntWeights () const
 
int getEventTime () const
 
void setNeuroParameters (const NeuroParametersHough &neuroParameters3DH)
 
void setMLP (const CDCTrigger3DHMLP &mlp)
 
const CDCTrigger3DHMLPgetMLP () const
 

Private Member Functions

int getLowestTime (const RelationVector< CDCTriggerSegmentHit > &trackSegmentHits) const
 
float getScaledDriftTime (const CDCTriggerSegmentHit &trackSegmentHit, const unsigned short maxTime) const
 
double getRelativeID (const CDCTriggerSegmentHit &hit) const
 
float scaleRelativeID (const double relativeID, const unsigned superLayerIdx) const
 

Static Private Member Functions

static constexpr int32_t extractBits (int64_t value, int high, int low)
 

Private Attributes

CDCTrigger3DHMLP m_MLP
 
std::vector< int32_t > m_intWeights
 
int m_fractionalWeightBits
 
NeuroParametersHough m_neuroParameters3DH
 
StoreArray< CDCTriggerSegmentHitm_segmentHits
 
std::string m_hitCollectionName
 
std::array< std::array< double, 2 >, m_nSL > m_radiusWireLayer {}
 
std::array< unsigned short, m_nSL+1 > m_cumulativeWires {}
 
std::array< unsigned short, m_nSL > m_nWires {}
 
double m_referenceID [m_nSL][2] = {}
 
double m_alpha [m_nSL][2] = {}
 
int m_T0 = 0
 
bool m_hasT0 = false
 

Static Private Attributes

static constexpr unsigned int m_nSL = 9
 
static constexpr unsigned int m_nStandardInputNodes = 27
 
static constexpr unsigned int m_nExtendedInputNodes = 126
 
static constexpr int m_precisionPhi = 12
 
static constexpr int m_precisionAlpha = 12
 
static constexpr int m_precisionScaleFactor = 8
 
static constexpr int m_precisionReferenceID = 8
 
static constexpr int m_precisionInputs = 13
 
static constexpr int m_precisionWeights = 17
 

Detailed Description

Definition at line 29 of file NeuroTrigger3DH.h.

Member Function Documentation

◆ calculateTrackParameters()

void calculateTrackParameters ( const CDCTrigger3DHTrack & track)

Definition at line 96 of file NeuroTrigger3DH.cc.

97{
98 const double omega = track.getOmega();
99 const double phi = track.getPhi0();
100 for (unsigned short superLayerIdx = 0; superLayerIdx < m_nSL; ++superLayerIdx) {
101 for (int priorityLayer = 0; priorityLayer < 2; ++priorityLayer) {
102 double radiusWireLayer = m_radiusWireLayer[superLayerIdx][priorityLayer];
103 double alpha = (radiusWireLayer * std::abs(omega) < 2.0)
104 ? std::asin(radiusWireLayer * omega / 2.0)
105 : M_PI_2;
106 double referenceID = (phi - alpha) * m_nWires[superLayerIdx] / (2.0 * M_PI);
107 m_alpha[superLayerIdx][priorityLayer] = alpha;
108 m_referenceID[superLayerIdx][priorityLayer] = std::remainder(referenceID, m_nWires[superLayerIdx]);
109 }
110 }
111}

◆ calculateTrackParametersFixedPrecision()

void calculateTrackParametersFixedPrecision ( const CDCTrigger3DHTrack & track)

Definition at line 114 of file NeuroTrigger3DH.cc.

115{
116 const long scalePhi = 1L << m_precisionPhi;
117 const long scaleAlpha = 1L << m_precisionAlpha;
118 const long scaleFactor = 1L << m_precisionScaleFactor;
119 const long scaleID = 1L << m_precisionReferenceID;
120
121 const double omega = track.getOmega();
122 const long phiFixed = std::round(track.getPhi0() * scalePhi);
123
124 for (unsigned short int superLayerIdx = 0; superLayerIdx < m_nSL; ++superLayerIdx) {
125 const long scaledWireFactor = std::round((m_nWires[superLayerIdx] / (2.0 * M_PI)) * scaleFactor);
126 for (int priorityLayer = 0; priorityLayer < 2; ++priorityLayer) {
127 const double radius = m_radiusWireLayer[superLayerIdx][priorityLayer];
128 long alphaFixed = (radius * std::abs(omega) < 2.0)
129 ? std::round(std::asin(radius * omega / 2.0) * scaleAlpha)
130 : std::round(M_PI_2 * scaleAlpha);
131 long deltaPhi = phiFixed - alphaFixed;
132 long refIDFixed = (deltaPhi * scaledWireFactor) / (1L << (m_precisionPhi + m_precisionScaleFactor - m_precisionReferenceID));
133 m_alpha[superLayerIdx][priorityLayer] = static_cast<double>(alphaFixed) / scaleAlpha;
134 m_referenceID[superLayerIdx][priorityLayer] = static_cast<double>(refIDFixed) / scaleID;
135 }
136 }
137}

◆ createIntWeights()

void createIntWeights ( )

Definition at line 75 of file NeuroTrigger3DH.cc.

76{
77 const std::vector<float>& floatWeights = m_MLP.getFloatWeights();
78 float minFloatWeight = *std::min_element(floatWeights.begin(), floatWeights.end());
79 float maxFloatWeight = *std::max_element(floatWeights.begin(), floatWeights.end());
80 float maxAbsoluteWeight = std::max(std::abs(minFloatWeight), std::abs(maxFloatWeight));
81
82 // Calculate the necessary fractional bit size to not exceed precisionWeights for the weights
83 int shift = static_cast<int>(std::ceil(std::log2(maxAbsoluteWeight)));
84 int fractionalWeightBits = m_precisionWeights - shift;
85
86 // Transform the weights and return the fractional bit size for scaling
87 std::vector<int32_t> intWeights(floatWeights.size());
88 std::transform(floatWeights.begin(), floatWeights.end(), intWeights.begin(),
89 [fractionalWeightBits](float w) { return static_cast<int32_t>(std::round(w * (1 << fractionalWeightBits))); });
90
91 m_intWeights = intWeights;
92 m_fractionalWeightBits = fractionalWeightBits;
93}

◆ extractBits()

static constexpr int32_t extractBits ( int64_t value,
int high,
int low )
inlinestaticconstexprprivate

Definition at line 170 of file NeuroTrigger3DH.h.

171 {
172 int width = high - low + 1;
173 int64_t shifted = value >> low;
174 int32_t mask = (1 << width) - 1;
175 int32_t result = static_cast<int32_t>(shifted & mask);
176 if (result & (1 << (width - 1))) {
177 result |= ~mask;
178 }
179 return result;
180 }

◆ getEventTime()

int getEventTime ( ) const
inline

Definition at line 70 of file NeuroTrigger3DH.h.

70{ return m_T0; };

◆ getFractionalWeightBits()

int getFractionalWeightBits ( ) const
inline

Definition at line 66 of file NeuroTrigger3DH.h.

66{ return m_fractionalWeightBits; }

◆ getInputVector()

std::vector< float > getInputVector ( const std::vector< size_t > & hitIds) const

Definition at line 179 of file NeuroTrigger3DH.cc.

180{
181 const size_t nInput = m_neuroParameters3DH.nInput;
182
183 if (nInput != m_nStandardInputNodes && nInput != m_nExtendedInputNodes) {
184 B2FATAL("Invalid neural network input size");
185 }
186 // Maximal drift time (for scaling), hits with larger values are ignored.
187 constexpr unsigned short tMax = 256;
188
189 const bool hasExtendedInput = (nInput == m_nExtendedInputNodes);
190 const size_t featuresPerHit = nInput / m_nSL;
191 const size_t patternSize = 11;
192
193 std::vector<float> inputVector(nInput, 0.0f);
194 for (const size_t hitIdx : hitIds) {
195 const CDCTriggerSegmentHit* trackSegmentHit = m_segmentHits[hitIdx];
196 const unsigned short priority = trackSegmentHit->getPriorityPosition();
197 const unsigned short superLayerIdx = trackSegmentHit->getISuperLayer();
198 const size_t priorityLayer = (priority == 3) ? 0 : 1;
199 const size_t baseIdx = featuresPerHit * superLayerIdx;
200
201 const float relativeID = scaleRelativeID(getRelativeID(*trackSegmentHit), superLayerIdx);
202 const float alpha = m_alpha[superLayerIdx][priorityLayer];
203 const float scaledDriftTime = getScaledDriftTime(*trackSegmentHit, tMax);
204
205 inputVector[baseIdx] = relativeID;
206 inputVector[baseIdx + 1] = scaledDriftTime;
207 inputVector[baseIdx + 2] = alpha;
208
209 if (m_hasT0 && hasExtendedInput) {
210 unsigned int hitPattern = trackSegmentHit->gethitpattern();
211 for (size_t j = 0; j < patternSize; ++j) {
212 inputVector[baseIdx + 3 + j] = (hitPattern >> j) & 1;
213 }
214 }
215 }
216 return inputVector;
217}
unsigned short getPriorityPosition() const
get position of the priority cell within the track segment (0: no hit, 3: 1st priority,...
unsigned int gethitpattern() const
get hit pattern in a segment hit
unsigned short getISuperLayer() const
get super layer number.

◆ getIntWeights()

const std::vector< int32_t > & getIntWeights ( ) const
inline

Definition at line 68 of file NeuroTrigger3DH.h.

68{ return m_intWeights; }

◆ getLowestTime()

int getLowestTime ( const RelationVector< CDCTriggerSegmentHit > & trackSegmentHits) const
private

Definition at line 152 of file NeuroTrigger3DH.cc.

153{
154 int lowestTime = 9999;
155 for (unsigned int hitIdx = 0; hitIdx < trackSegmentHits.size(); ++hitIdx) {
156 if (trackSegmentHits.weight(hitIdx) < 0) continue;
157 if (trackSegmentHits[hitIdx]->priorityTime() < lowestTime) {
158 lowestTime = trackSegmentHits[hitIdx]->priorityTime();
159 }
160 }
161 return lowestTime;
162}
size_t size() const
Get number of relations.
float weight(int index) const
Get weight with index.

◆ getMLP()

const CDCTrigger3DHMLP & getMLP ( ) const
inline

Definition at line 76 of file NeuroTrigger3DH.h.

76{ return m_MLP; };

◆ getRelativeID()

double getRelativeID ( const CDCTriggerSegmentHit & hit) const
private

Definition at line 220 of file NeuroTrigger3DH.cc.

221{
222 const int superLayerIdx = trackSegmentHit.getISuperLayer();
223 const unsigned int priority = trackSegmentHit.getPriorityPosition();
224 const unsigned int priorityLayer = (priority == 3) ? 0 : 1;
225 // 0 = no hit, 1 = 2nd right, 2 = 2nd left, 3 = fist priority
226 constexpr std::array<short, 4> priorityOffsetFactor = {0, -1, 1, 0};
227 double relativeID = trackSegmentHit.getSegmentID()
228 - m_cumulativeWires[superLayerIdx]
229 + 0.5 * priorityOffsetFactor[priority]
230 - m_referenceID[superLayerIdx][priorityLayer];
231 return std::remainder(relativeID, m_nWires[superLayerIdx]);
232}

◆ getScaledDriftTime()

float getScaledDriftTime ( const CDCTriggerSegmentHit & trackSegmentHit,
const unsigned short maxTime ) const
private

Definition at line 251 of file NeuroTrigger3DH.cc.

252{
253 const float scaleT = std::pow(2.0f, std::floor(std::log2(1.0f / maxTime)));
254 int driftTime = (m_hasT0) ? trackSegmentHit.priorityTime() - m_T0 : 0;
255 driftTime = std::clamp(driftTime, 0, static_cast<int>(maxTime));
256 // 0 = no hit, 1 = right, 2 = left, 3 = undetermined
257 constexpr std::array<short, 4> leftRightFactor = {0, -1, 1, 0};
258 float scaledDriftTime = leftRightFactor[trackSegmentHit.getLeftRight()] * driftTime * scaleT;
259 return scaledDriftTime;
260}
short priorityTime() const
get hit time of priority cell in trigger clocks
unsigned short getLeftRight() const
get position of the priority cell relative to the track (0: no hit, 1: right, 2: left,...

◆ getWeightBits()

int getWeightBits ( ) const
inline

Definition at line 64 of file NeuroTrigger3DH.h.

64{ return m_precisionWeights; }

◆ initialize()

void initialize ( )

Definition at line 25 of file NeuroTrigger3DH.cc.

26{
27 std::array<std::vector<int>, m_nSL> getWireLayerID;
28
29 int layer = 0;
30 // First superlayer (8 layers)
31 for (int i = 0; i < 8; ++i) {
32 getWireLayerID[0].push_back(layer++);
33 }
34 // Remaining superlayers (6 layers each)
35 for (unsigned short superLayerIdx = 1; superLayerIdx < m_nSL; ++superLayerIdx) {
36 for (int i = 0; i < 6; ++i) {
37 getWireLayerID[superLayerIdx].push_back(layer++);
38 }
39 }
40
41 const CDC::CDCGeometryPar& cdc = CDC::CDCGeometryPar::Instance();
42
43 for (unsigned short superLayerIdx = 0; superLayerIdx < m_nSL; ++superLayerIdx) {
44 if (superLayerIdx == 0) {
45 m_radiusWireLayer[superLayerIdx][0] = cdc.senseWireR(getWireLayerID[superLayerIdx][3]);
46 m_radiusWireLayer[superLayerIdx][1] = cdc.senseWireR(getWireLayerID[superLayerIdx][4]);
47 } else {
48 m_radiusWireLayer[superLayerIdx][0] = cdc.senseWireR(getWireLayerID[superLayerIdx][2]);
49 m_radiusWireLayer[superLayerIdx][1] = cdc.senseWireR(getWireLayerID[superLayerIdx][3]);
50 }
51 m_nWires[superLayerIdx] = cdc.nWiresInLayer(getWireLayerID[superLayerIdx][0]);
52 }
53
54 m_cumulativeWires[0] = 0;
55 for (unsigned short superLayerIdx = 1; superLayerIdx <= m_nSL; ++superLayerIdx) {
56 m_cumulativeWires[superLayerIdx] = m_cumulativeWires[superLayerIdx - 1] + m_nWires[superLayerIdx - 1];
57 }
58}
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.

◆ initializeCollections()

void initializeCollections ( std::string hitCollectionName)

Definition at line 61 of file NeuroTrigger3DH.cc.

62{
63 m_segmentHits.isRequired(hitCollectionName);
64 m_hitCollectionName = hitCollectionName;
65}

◆ load3DHits()

std::vector< size_t > load3DHits ( const CDCTrigger3DHTrack & track) const

Definition at line 165 of file NeuroTrigger3DH.cc.

166{
167 RelationVector<CDCTriggerSegmentHit> trackSegmentHits =
168 track.getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName);
169 std::vector<size_t> allHitIDs;
170 for (size_t hitIdx = 0; hitIdx < trackSegmentHits.size(); ++hitIdx) {
171 if (trackSegmentHits.weight(hitIdx) >= 0) { // Ignore hits with negative relation weight
172 allHitIDs.push_back(trackSegmentHits[hitIdx]->getArrayIndex());
173 }
174 }
175 return allHitIDs;
176}

◆ runMLP()

std::vector< float > runMLP ( const std::vector< float > & input) const

Definition at line 263 of file NeuroTrigger3DH.cc.

264{
265 const CDCTrigger3DHMLP& network = m_MLP;
266 const std::vector<float>& weights = network.getFloatWeights();
267
268 std::vector<float> layerInput = input;
269 std::vector<float> layerOutput;
270 size_t weightIndex = 0;
271
272 const size_t nLayers = network.getNumberOfLayers();
273 for (size_t layerIdx = 1; layerIdx < nLayers; ++layerIdx) {
274 layerInput.push_back(1.0f); // add bias
275 const size_t nInputs = layerInput.size();
276 const size_t nOutputs = network.getNumberOfNodes(layerIdx);
277 layerOutput.assign(nOutputs, 0.0f); // create new empty output vector
278 for (size_t outIdx = 0; outIdx < nOutputs; ++outIdx) {
279 for (size_t inputIdx = 0; inputIdx < nInputs; ++inputIdx) {
280 layerOutput[outIdx] += layerInput[inputIdx] * weights[weightIndex++];
281 }
282 layerOutput[outIdx] = std::tanh(layerOutput[outIdx]);
283 }
284 layerInput = layerOutput;
285 }
286 return unscaleTarget(layerOutput);
287}

◆ runMLPFixedPrecision()

std::vector< float > runMLPFixedPrecision ( const std::vector< float > & input) const

Definition at line 290 of file NeuroTrigger3DH.cc.

291{
292 const CDCTrigger3DHMLP& network = m_MLP;
293 const int fractionalInputBits = m_precisionInputs - 1;
294
295 // Transform the input floats (range [-2, 2]) to m_precisionInputs bit integers
296 std::vector<int32_t> layerInput(input.size());
297 std::transform(input.begin(), input.end(), layerInput.begin(),
298 [](float i) { return static_cast<int32_t>(std::round(i * (1 << fractionalInputBits))); });
299
300 std::vector<int32_t> layerOutput;
301 size_t weightIndex = 0;
302 const size_t nLayers = network.getNumberOfLayers();
303 for (size_t layerIdx = 1; layerIdx < nLayers; ++layerIdx) {
304 // Set bias input and scaling shift (different precisions for network inputs and tanh outputs possible)
305 unsigned int scalingShift;
306 if (layerIdx == 1) {
307 layerInput.push_back(1 << fractionalInputBits);
308 scalingShift = fractionalInputBits + m_fractionalWeightBits - TanhLUT::LUT_FRAC_BITS;
309 } else {
310 layerInput.push_back(1 << TanhLUT::LUT_FRAC_BITS);
311 scalingShift = TanhLUT::LUT_FRAC_BITS + m_fractionalWeightBits - TanhLUT::LUT_FRAC_BITS;
312 }
313 const size_t nOutputs = network.getNumberOfNodes(layerIdx);
314 const size_t nInputs = layerInput.size();
315 layerOutput.assign(nOutputs, 0);
316 for (size_t outIdx = 0; outIdx < nOutputs; ++outIdx) {
317 int64_t mulAccSum = 0;
318 for (size_t inputIdx = 0; inputIdx < nInputs; ++inputIdx) {
319 mulAccSum += static_cast<int64_t>(layerInput[inputIdx]) * static_cast<int64_t>(m_intWeights[weightIndex++]);
320 }
321 int mulAccSumSign = (mulAccSum < 0) ? -1 : 1;
322
323 // Cutting a LUT_FRAC_BITS + MAX_FLOAT_SHIFT + HEADROOM_BITS + 1 window from the DSP
324 // This is equivalent to uint32_t lutInput = static_cast<uint32_t>(std::abs(mulAccSum) >> scalingShift);
325 const int high = scalingShift + TanhLUT::LUT_FRAC_BITS + TanhLUT::MAX_FLOAT_SHIFT + TanhLUT::HEADROOM_BITS;
326 const int low = scalingShift;
327 uint32_t lutInput = static_cast<uint32_t>(std::abs(extractBits(mulAccSum, high, low)));
328
329 int32_t outFix;
330 if (lutInput >= TanhLUT::LUT_SATURATION) {
331 outFix = static_cast<int32_t>(mulAccSumSign * ((1 << TanhLUT::LUT_FRAC_BITS) - 1));
332 } else {
333 // This is just a scaling shift (equivalent to lutInput >> MAX_FLOAT_SHIFT if LUT_FRAC_BITS == LUT_INDEX_BITS)
334 size_t lutIdx = static_cast<size_t>((lutInput * TanhLUT::LUT_SIZE) / TanhLUT::LUT_SATURATION);
335 int32_t lutVal = TanhLUT::get(lutIdx);
336 outFix = static_cast<int32_t>(mulAccSumSign * lutVal);
337 }
338 layerOutput[outIdx] = outFix;
339 }
340 layerInput = layerOutput;
341 }
342 // Convert back to float and unscale
343 std::vector<float> output(layerOutput.size(), 0.0f);
344 std::transform(layerOutput.begin(), layerOutput.end(), output.begin(),
345 [](int32_t val) { return val / static_cast<float>(1 << TanhLUT::LUT_FRAC_BITS); });
346 return unscaleTarget(output);
347}

◆ scaleRelativeID()

float scaleRelativeID ( const double relativeID,
const unsigned superLayerIdx ) const
private

Definition at line 235 of file NeuroTrigger3DH.cc.

236{
237 // Relevant ID ranges for each super layer (2x9)
238 constexpr std::array<float, 18> relevantID =
239 {-1.5, 1.5, -7.5, -0.5, -1.5, 1.5, 0.5, 7.5, -1.5, 1.5, -8.5, 0.5, -2.5, 1.5, -0.5, 10.5, -3.5, 2.5};
240 const float idMin = relevantID[2 * superLayerIdx];
241 const float idMax = relevantID[2 * superLayerIdx + 1];
242 const float range = idMax - idMin;
243 float scale = 2.0f / range;
244 // Round down to nearest power of 2 for FPGA implementation
245 scale = std::pow(2.0f, std::floor(std::log2(scale)));
246 const float offset = (idMin + idMax) * 0.5f;
247 return scale * static_cast<float>(relativeID - offset);
248}

◆ scaleTarget()

std::vector< float > scaleTarget ( const std::vector< float > & target) const

Definition at line 367 of file NeuroTrigger3DH.cc.

368{
369 std::vector<float> scaled(target.size());
370 for (size_t i = 0; i < target.size(); ++i) {
371 float min = m_neuroParameters3DH.outputScale[2 * i];
372 float max = m_neuroParameters3DH.outputScale[2 * i + 1];
373 if (i == 1) {
374 min *= Unit::deg;
375 max *= Unit::deg;
376 }
377 float range = max - min;
378 scaled[i] = 2.0f * (target[i] - min) / range - 1.0f;
379 }
380 return scaled;
381}
static const double deg
degree to radians
Definition Unit.h:109

◆ setEventTime()

void setEventTime ( const CDCTrigger3DHTrack & track)

Definition at line 140 of file NeuroTrigger3DH.cc.

141{
142 m_T0 = getLowestTime(track.getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName));
143 if (m_T0 < 9999) {
144 m_hasT0 = true;
145 } else {
146 m_T0 = 0;
147 m_hasT0 = false;
148 }
149}

◆ setMLP()

void setMLP ( const CDCTrigger3DHMLP & mlp)

Definition at line 68 of file NeuroTrigger3DH.cc.

69{
70 m_MLP = mlp;
71 m_neuroParameters3DH = mlp.getNeuroParameters();
72}

◆ setNeuroParameters()

void setNeuroParameters ( const NeuroParametersHough & neuroParameters3DH)
inline

Definition at line 72 of file NeuroTrigger3DH.h.

72{ m_neuroParameters3DH = neuroParameters3DH; };

◆ unscaleTarget()

std::vector< float > unscaleTarget ( const std::vector< float > & target) const

Definition at line 350 of file NeuroTrigger3DH.cc.

351{
352 std::vector<float> unscaled(target.size());
353 for (size_t i = 0; i < target.size(); ++i) {
354 float min = m_neuroParameters3DH.outputScale[2 * i];
355 float max = m_neuroParameters3DH.outputScale[2 * i + 1];
356 if (i == 1) {
357 min *= Unit::deg;
358 max *= Unit::deg;
359 }
360 float range = max - min;
361 unscaled[i] = (target[i] + 1.0f) * range * 0.5f + min;
362 }
363 return unscaled;
364}

Member Data Documentation

◆ m_alpha

double m_alpha[m_nSL][2] = {}
private

Definition at line 112 of file NeuroTrigger3DH.h.

112{};

◆ m_cumulativeWires

std::array< unsigned short, m_nSL + 1 > m_cumulativeWires {}
private

Definition at line 106 of file NeuroTrigger3DH.h.

106{};

◆ m_fractionalWeightBits

int m_fractionalWeightBits
private

Definition at line 93 of file NeuroTrigger3DH.h.

◆ m_hasT0

bool m_hasT0 = false
private

Definition at line 116 of file NeuroTrigger3DH.h.

◆ m_hitCollectionName

std::string m_hitCollectionName
private

Definition at line 99 of file NeuroTrigger3DH.h.

◆ m_intWeights

std::vector<int32_t> m_intWeights
private

Definition at line 91 of file NeuroTrigger3DH.h.

◆ m_MLP

CDCTrigger3DHMLP m_MLP
private

Definition at line 89 of file NeuroTrigger3DH.h.

◆ m_neuroParameters3DH

NeuroParametersHough m_neuroParameters3DH
private

Definition at line 95 of file NeuroTrigger3DH.h.

◆ m_nExtendedInputNodes

unsigned int m_nExtendedInputNodes = 126
staticconstexprprivate

Definition at line 120 of file NeuroTrigger3DH.h.

◆ m_nSL

unsigned int m_nSL = 9
staticconstexprprivate

Definition at line 102 of file NeuroTrigger3DH.h.

◆ m_nStandardInputNodes

unsigned int m_nStandardInputNodes = 27
staticconstexprprivate

Definition at line 119 of file NeuroTrigger3DH.h.

◆ m_nWires

std::array<unsigned short, m_nSL> m_nWires {}
private

Definition at line 108 of file NeuroTrigger3DH.h.

108{};

◆ m_precisionAlpha

int m_precisionAlpha = 12
staticconstexprprivate

Definition at line 124 of file NeuroTrigger3DH.h.

◆ m_precisionInputs

int m_precisionInputs = 13
staticconstexprprivate

Definition at line 129 of file NeuroTrigger3DH.h.

◆ m_precisionPhi

int m_precisionPhi = 12
staticconstexprprivate

Definition at line 123 of file NeuroTrigger3DH.h.

◆ m_precisionReferenceID

int m_precisionReferenceID = 8
staticconstexprprivate

Definition at line 126 of file NeuroTrigger3DH.h.

◆ m_precisionScaleFactor

int m_precisionScaleFactor = 8
staticconstexprprivate

Definition at line 125 of file NeuroTrigger3DH.h.

◆ m_precisionWeights

int m_precisionWeights = 17
staticconstexprprivate

Definition at line 130 of file NeuroTrigger3DH.h.

◆ m_radiusWireLayer

std::array<std::array<double, 2>, m_nSL> m_radiusWireLayer {}
private

Definition at line 104 of file NeuroTrigger3DH.h.

104{};

◆ m_referenceID

double m_referenceID[m_nSL][2] = {}
private

Definition at line 110 of file NeuroTrigger3DH.h.

110{};

◆ m_segmentHits

StoreArray<CDCTriggerSegmentHit> m_segmentHits
private

Definition at line 97 of file NeuroTrigger3DH.h.

◆ m_T0

int m_T0 = 0
private

Definition at line 114 of file NeuroTrigger3DH.h.


The documentation for this class was generated from the following files: