17 #include <trg/cdc/dataobjects/Bitstream.h>
18 #include <trg/cdc/dataobjects/CDCTriggerTrack.h>
19 #include <trg/cdc/dataobjects/CDCTriggerSegmentHit.h>
20 #include <trg/cdc/dataobjects/CDCTriggerFinderClone.h>
21 #include <trg/cdc/dataobjects/CDCTriggerMLPInput.h>
22 #include <framework/gearbox/Const.h>
23 #include <trg/cdc/dbobjects/CDCTriggerNeuroConfig.h>
31 namespace CDCTriggerUnpacker {
33 constexpr
double pi() {
return std::atan(1) * 4; }
36 static constexpr std::array<int, 9> nMergers = {10, 10, 12, 14, 16, 18, 20, 22, 24};
41 static constexpr
int TSFOutputWidth = TSF_TO_2D_WIDTH;
42 static constexpr
int nTrackers = NUM_2D;
43 static constexpr
int nAxialTSF = NUM_TSF;
44 static constexpr
int nStereoTSF = 4;
45 static constexpr
int T2DOutputWidth = T2D_TO_3D_WIDTH;
46 static constexpr
unsigned lenTS = 21;
48 static constexpr
int nMax2DTracksPerClock = 4;
51 static constexpr
int clockCounterWidth = 9;
54 static constexpr std::array<int, nAxialTSF> nAxialMergers = {10, 12, 16, 20, 24};
56 static constexpr std::array<int, 9> nWiresInSuperLayer = {
57 160, 160, 192, 224, 256, 288, 320, 352, 384
60 static constexpr
int nCellsInLayer = 16;
63 using TSFOutputVector = std::array<char, TSFOutputWidth>;
64 using TSFOutputArray = std::array<TSFOutputVector, nTrackers>;
65 using TSFOutputBus = std::array<TSFOutputArray, nAxialTSF>;
66 using TSFOutputBitStream = Bitstream<TSFOutputBus>;
68 using T2DOutputVector = std::array<char, T2DOutputWidth>;
69 using T2DOutputBus = std::array<T2DOutputVector, nTrackers>;
70 using T2DOutputBitStream = Bitstream<T2DOutputBus>;
72 using NNVector = std::array<char, NN_WIDTH>;
73 using NNBus = std::array<NNVector, nTrackers>;
74 using NNBitStream = Bitstream<NNBus>;
84 std::string padto(std::string s,
unsigned l)
87 s.insert(s.begin(), l - s.size(),
' ');
91 std::string padright(std::string s,
unsigned l)
94 s.insert(s.end(), l - s.size(),
' ');
99 void printBuffer(
int* buf,
int nwords)
101 for (
int j = 0; j < nwords; ++j) {
102 printf(
" %.8x", buf[j]);
103 if ((j + 1) % 8 == 0) {
111 std::string rawIntToAscii(
int buf)
113 std::ostringstream firmwareTypeStream;
114 firmwareTypeStream << std::hex << buf;
115 std::string firmwareTypeHex(firmwareTypeStream.str());
116 std::string firmwareType(4,
'0');
117 for (
int i = 0; i < 4; i++) {
118 std::istringstream firmwareTypeIStream(firmwareTypeHex.substr(i * 2, 2));
120 firmwareTypeIStream >> std::hex >> character;
121 firmwareType[i] = character;
126 std::string rawIntToString(
int buf)
128 std::ostringstream firmwareVersionStream;
129 firmwareVersionStream << std::hex << buf;
130 return firmwareVersionStream.str();
156 char std_logic(
bool inBit)
168 for (
int i = 0; i < size; i++) {
169 if (count[i] >= 0 && count[i] < 9) {
172 B2DEBUG(20,
"invalid signal detected: " <<
static_cast<int>(count[i]));
182 int ini = padding ? 4 - signal.size() % 4 : 0;
183 std::string res(ini,
'0');
184 for (
auto const& bit : signal) {
185 if (bit >= 0 && bit < 9) {
188 B2DEBUG(20,
"invalid signal detected: " <<
static_cast<int>(bit));
196 void display_hex(
const std::array<char, N>& signal)
198 std::ios oldState(
nullptr);
199 oldState.copyfmt(std::cout);
200 if (std::any_of(signal.begin(), signal.end(), [](
char i)
201 {return i != zero_val && i != one_val;})) {
202 B2DEBUG(20,
"Some bit in the signal vector is neither 0 nor 1. \n" <<
203 "Displaying binary values instead.");
207 std::cout << std::setfill(
'0');
208 for (
unsigned i = 0; i < signal.size(); i += 4) {
209 std::bitset<4> set(binString.substr(i, 4));
210 std::cout << std::setw(1) << std::hex << set.to_ulong();
214 std::cout.copyfmt(oldState);
224 template<
size_t nbits,
size_t min,
size_t max>
225 std::bitset < max - min + 1 >
subset(std::bitset<nbits> set)
227 const size_t outWidth = max - min + 1;
228 std::string str = set.to_string();
229 return std::bitset<outWidth>(str.substr(nbits - max - 1, outWidth));
240 unsigned short globalSegmentID(
unsigned short localID,
unsigned short iSL)
242 auto itr = nWiresInSuperLayer.begin();
243 unsigned short globalID = std::accumulate(itr, itr + iSL, 0);
248 static const double realNaN = std::numeric_limits<double>::quiet_NaN();
250 using tsOut = std::array<unsigned, 4>;
251 using tsOutArray = std::array<tsOut, 5>;
277 std::array<tsOut, 9>
ts;
286 if (
int(b2line.
offset + foundtime) >= 0 &&
291 if (
int(slv_to_bin_string(bitsn->
signal()[iTracker]).size()) >= (NN_WIDTH - b2line.
start)) {
292 data = slv_to_bin_string(bitsn->
signal()[iTracker]).substr(NN_WIDTH - 1 - b2line.
end, b2line.
end - b2line.
start + 1);
308 std::vector<bool> decodedriftthreshold(std::string p_driftthreshold)
310 std::vector<bool> res;
311 for (
unsigned i = 0; i < p_driftthreshold.size(); ++i) {
312 if (p_driftthreshold.substr(i, 1) ==
"1") {
314 }
else if (p_driftthreshold.substr(i, 1) ==
"0") {
315 res.push_back(
false);
317 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
318 res.push_back(
false);
323 std::vector<bool> decodefoundoldtrack(std::string p_foundoldtrack)
325 std::vector<bool> res;
326 for (
unsigned i = 0; i < p_foundoldtrack.size(); ++i) {
327 if (p_foundoldtrack.substr(i, 1) ==
"1") {
329 }
else if (p_foundoldtrack.substr(i, 1) ==
"0") {
330 res.push_back(
false);
332 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
333 res.push_back(
false);
338 bool decodevalstereobit(
const std::string& p_valstereobit)
341 if (p_valstereobit ==
"1") {
343 }
else if (p_valstereobit ==
"0") {
346 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
362 unsigned TSIDInSL(
unsigned tsIDInTracker,
unsigned iSL,
unsigned iTracker)
364 const unsigned nCellsInSL = nMergers[iSL] * nCellsInLayer;
366 unsigned iTS = tsIDInTracker + nCellsInSL * iTracker / nTrackers;
368 if (iTS >= nCellsInSL) {
383 int mlp_bin_to_signed_int(std::string signal)
385 constexpr
unsigned len = 13;
386 std::bitset<len> signal_bit(signal);
387 const unsigned shift = 16 - len;
390 int signal_out = (int16_t (signal_bit.to_ulong() << shift)) >> shift;
401 tsOut decodeTSHit(std::string tsIn)
403 constexpr
unsigned lenID = 8;
404 constexpr
unsigned lenPriorityTime = 9;
405 constexpr
unsigned lenLR = 2;
406 constexpr
unsigned lenPriorityPosition = 2;
407 constexpr std::array<unsigned, 4> tsLens = {
408 lenID, lenPriorityTime, lenLR, lenPriorityPosition
410 std::array<unsigned, 5> tsPos = { 0 };
411 std::partial_sum(tsLens.begin(), tsLens.end(), tsPos.begin() + 1);
413 tsOutput[0] = std::bitset<tsLens[0]>(tsIn.substr(tsPos[0], tsLens[0])).to_ulong();
414 tsOutput[1] = std::bitset<tsLens[1]>(tsIn.substr(tsPos[1], tsLens[1])).to_ulong();
415 tsOutput[2] = std::bitset<tsLens[2]>(tsIn.substr(tsPos[2], tsLens[2])).to_ulong();
416 tsOutput[3] = std::bitset<tsLens[3]>(tsIn.substr(tsPos[3], tsLens[3])).to_ulong();
419 tsOut decodeTSHit_sim(std::string tsIn, std::string twodcc)
421 constexpr
unsigned lenID = 8;
422 constexpr
unsigned lenPriorityTime = 9;
423 constexpr
unsigned lenLR = 2;
424 constexpr
unsigned lenPriorityPosition = 2;
425 constexpr std::array<unsigned, 4> tsLens = {
426 lenID, lenPriorityTime, lenLR, lenPriorityPosition
428 std::string C = tsIn.substr(lenID + 5, 4);
429 std::string B = tsIn.substr(lenID, 5);
430 std::string Bp = twodcc.substr(4, 5);
431 std::string Ap = twodcc.substr(0, 4);
434 if (std::stoul(B, 0, 2) <= std::stoul(Bp, 0, 2)) {
437 B2DEBUG(14,
"2DCC overflow detected!");
438 pts = std::bitset<4>(std::stoul(Ap, 0, 2) - 1).to_string() + B + C;
440 pt = std::stoul(pts, 0, 2);
441 std::array<unsigned, 5> tsPos = { 0 };
442 std::partial_sum(tsLens.begin(), tsLens.end(), tsPos.begin() + 1);
444 tsOutput[0] = std::bitset<tsLens[0]>(tsIn.substr(tsPos[0], tsLens[0])).to_ulong();
446 tsOutput[2] = std::bitset<tsLens[2]>(tsIn.substr(tsPos[2], tsLens[2])).to_ulong();
447 tsOutput[3] = std::bitset<tsLens[3]>(tsIn.substr(tsPos[3], tsLens[3])).to_ulong();
450 tsOut decodeTSHit_ext(std::string tsIn, std::string expt)
452 constexpr
unsigned lenID = 8;
453 constexpr
unsigned lenPriorityTime = 9;
454 constexpr
unsigned lenLR = 2;
455 constexpr
unsigned lenPriorityPosition = 2;
456 constexpr std::array<unsigned, 4> tsLens = {
457 lenID, lenPriorityTime, lenLR, lenPriorityPosition
459 unsigned pt = std::stoul(expt, 0, 2);
460 std::array<unsigned, 5> tsPos = { 0 };
461 std::partial_sum(tsLens.begin(), tsLens.end(), tsPos.begin() + 1);
463 tsOutput[0] = std::bitset<tsLens[0]>(tsIn.substr(tsPos[0], tsLens[0])).to_ulong();
465 tsOutput[2] = std::bitset<tsLens[2]>(tsIn.substr(tsPos[2], tsLens[2])).to_ulong();
466 tsOutput[3] = std::bitset<tsLens[3]>(tsIn.substr(tsPos[3], tsLens[3])).to_ulong();
479 TRG2DFinderTrack decode2DTrack(
const std::string& p_charge __attribute__((unused)),
482 const std::string& p_ts0,
483 const std::string& p_ts2,
484 const std::string& p_ts4,
485 const std::string& p_ts6,
486 const std::string& p_ts8,
488 const std::string& p_2dcc,
492 unsigned shift = 16 - p_omega.size();
493 TRG2DFinderTrack trackout;
494 int omega = std::stoi(p_omega, 0, 2);
497 int omegafirm = (int16_t (omega << shift)) >> shift;
500 const double BField = 1.5e-4;
508 int phi = std::stoi(p_phi, 0, 2);
510 double globalPhi0 = pi() / 4 + pi() / 2 / 80 * (phi + 1) + pi() / 2 * iTracker;
513 trackout.ts[0] = (sim13dt) ? decodeTSHit_sim(p_ts0, p_2dcc) : decodeTSHit(p_ts0);
514 trackout.ts[1] = (sim13dt) ? decodeTSHit_sim(p_ts2, p_2dcc) : decodeTSHit(p_ts2);
515 trackout.ts[2] = (sim13dt) ? decodeTSHit_sim(p_ts4, p_2dcc) : decodeTSHit(p_ts4);
516 trackout.ts[3] = (sim13dt) ? decodeTSHit_sim(p_ts6, p_2dcc) : decodeTSHit(p_ts6);
517 trackout.ts[4] = (sim13dt) ? decodeTSHit_sim(p_ts8, p_2dcc) : decodeTSHit(p_ts8);
519 if (globalPhi0 > pi() * 2) {
520 globalPhi0 -= pi() * 2;
522 trackout.phi0 = globalPhi0;
523 B2DEBUG(20,
"Unpacking 2DTrack in Tracker: " << iTracker);
524 B2DEBUG(20,
" Omega: " << std::to_string(omega) <<
", Omegafirm: " << std::to_string(omegafirm) <<
", converted to: " <<
525 std::to_string(trackout.omega));
526 B2DEBUG(20,
" Phi: " << std::to_string(phi) <<
", converted to: " << std::to_string(trackout.phi0));
530 TRG2DFinderTrack decode2DTrack(std::string trackIn,
unsigned iTracker)
532 constexpr
unsigned lenCharge = 2;
533 constexpr
unsigned lenOmega = 7;
534 constexpr
unsigned lenPhi0 = 7;
535 constexpr std::array<unsigned, 3> trackLens = {lenCharge, lenOmega, lenPhi0};
536 std::array<unsigned, 4> trackPos{ 0 };
537 std::partial_sum(trackLens.begin(), trackLens.end(), trackPos.begin() + 1);
538 const unsigned shift = 16 - lenOmega;
539 TRG2DFinderTrack trackOut;
540 std::bitset<trackLens[1]> omega(trackIn.substr(trackPos[1], trackLens[1]));
543 int omegaFirm = (int16_t (omega.to_ulong() << shift)) >> shift;
545 const double BField = 1.5e-4;
550 int phi0 = std::bitset<trackLens[2]>(trackIn.substr(trackPos[2], trackLens[2])).to_ulong();
551 trackOut.phi0 = pi() / 4 + pi() / 2 / 80 * (phi0 + 1);
552 for (
unsigned i = 0; i < 5; ++i) {
553 trackOut.ts[i] = decodeTSHit(trackIn.substr(trackPos.back() + i * lenTS, lenTS));
557 double globalPhi0 = trackOut.phi0 + pi() / 2 * iTracker;
558 if (globalPhi0 > pi() * 2) {
559 globalPhi0 -= pi() * 2;
561 trackOut.phi0 = globalPhi0;
573 TRGNeuroTrack decodeNNTrack(std::string p_mlpout_z,
574 std::string p_mlpout_theta,
575 std::string p_tsfsel,
576 std::string p_mlpin_alpha,
577 std::string p_mlpin_drifttime,
578 std::string p_mlpin_id,
579 std::string p_netsel,
580 const DBObjPtr<CDCTriggerNeuroConfig>& neurodb,
581 const std::string& p_2dcc,
583 B2LDataField p_extendedpts)
586 float scale_z = 1. / (1 << (p_mlpout_z.size() - 1));
587 float scale_theta = 1. / (1 << (p_mlpout_theta.size() - 1));
588 float scale_alpha = 1. / (1 << (p_mlpin_alpha.size() - 1) / 9);
589 float scale_drifttime = 1. / (1 << (p_mlpin_drifttime.size() - 1) / 9);
590 float scale_id = 1. / (1 << (p_mlpin_id.size() - 1) / 9);
591 TRGNeuroTrack foundTrack;
592 int theta_raw = mlp_bin_to_signed_int(p_mlpout_theta);
593 int z_raw = mlp_bin_to_signed_int(p_mlpout_z);
594 std::vector<float> unscaledT = neurodb->getMLPs()[0].unscaleTarget({(z_raw * scale_z), (theta_raw * scale_theta)});
595 foundTrack.z = unscaledT[0];
596 foundTrack.theta = unscaledT[1];
597 foundTrack.sector = std::stoi(p_netsel, 0, 2);
598 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
599 foundTrack.inputAlpha[iSL] =
600 mlp_bin_to_signed_int(p_mlpin_alpha.substr((8 - iSL) * p_mlpin_alpha.size() / 9, p_mlpin_alpha.size() / 9)) * scale_alpha;
601 foundTrack.inputT[iSL] =
602 mlp_bin_to_signed_int(p_mlpin_drifttime.substr((8 - iSL) * p_mlpin_drifttime.size() / 9,
603 p_mlpin_drifttime.size() / 9)) * scale_drifttime;
604 foundTrack.inputID[iSL] =
605 mlp_bin_to_signed_int(p_mlpin_id.substr((8 - iSL) * p_mlpin_drifttime.size() / 9, p_mlpin_drifttime.size() / 9)) * scale_id;
607 foundTrack.ts[iSL] = decodeTSHit_sim(p_tsfsel.substr((8 - iSL) * lenTS, lenTS), p_2dcc);
609 if (p_extendedpts.name !=
"None") {
610 foundTrack.ts[iSL] = decodeTSHit_ext(p_tsfsel.substr((8 - iSL) * lenTS, lenTS), p_extendedpts.data.substr((8 - iSL) * 13, 13));
612 foundTrack.ts[iSL] = decodeTSHit(p_tsfsel.substr((8 - iSL) * lenTS, lenTS));
618 TRGNeuroTrack decodeNNTrack_old(std::string trackIn, std::string selectIn)
620 constexpr
unsigned lenMLP = 13;
621 float scale = 1. / (1 << (lenMLP - 1));
622 TRGNeuroTrack foundTrack;
623 int theta_raw = mlp_bin_to_signed_int(trackIn.substr(1, lenMLP));
624 foundTrack.theta = theta_raw * scale * M_PI_2 + M_PI_2;
625 int z_raw = mlp_bin_to_signed_int(trackIn.substr(lenMLP + 1, lenMLP));
626 foundTrack.z = z_raw * scale * 50.;
627 foundTrack.sector = std::bitset<3>(trackIn.substr(2 * lenMLP + 1, 3)).to_ulong();
628 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
629 foundTrack.inputAlpha[iSL] =
630 mlp_bin_to_signed_int(selectIn.substr((2 + (8 - iSL)) * lenMLP + 4, lenMLP)) * scale;
631 foundTrack.inputT[iSL] =
632 mlp_bin_to_signed_int(selectIn.substr((11 + (8 - iSL)) * lenMLP + 4, lenMLP)) * scale;
633 foundTrack.inputID[iSL] =
634 mlp_bin_to_signed_int(selectIn.substr((20 + (8 - iSL)) * lenMLP + 4, lenMLP)) * scale;
636 decodeTSHit(selectIn.substr(29 * lenMLP + 4 + (8 - iSL) * lenTS, lenTS));
645 CDCTriggerSegmentHit* addTSHit(tsOut ts,
unsigned iSL,
unsigned iTracker,
646 StoreArray<CDCTriggerSegmentHit>* tsHits,
649 unsigned iTS = TSIDInSL(ts[0], iSL, iTracker);
651 CDCTriggerSegmentHit* hit =
nullptr;
665 hit = tsHits->appendNew(iSL, iTS, ts[3], ts[2], ts[1], 0, foundTime, iTracker);
666 B2DEBUG(15,
"make hit at SL " << iSL <<
" ID " << iTS <<
" clock " << foundTime <<
" iTracker " << iTracker);
685 void decode2DOutput(
short foundTime,
686 T2DOutputBitStream* bits,
687 StoreArray<CDCTriggerTrack>* storeTracks,
688 StoreArray<CDCTriggerFinderClone>* storeClones,
689 StoreArray<CDCTriggerSegmentHit>* tsHits)
691 const unsigned lenTrack = 121;
692 const unsigned oldTrackWidth = 6;
693 const unsigned foundWidth = 6;
694 std::array<int, 4> posTrack;
695 for (
unsigned i = 0; i < posTrack.size(); ++i) {
696 posTrack[i] = oldTrackWidth + foundWidth + lenTrack * i;
698 for (
unsigned iTracker = 0; iTracker < nTrackers; ++iTracker) {
699 const auto slv = bits->signal()[iTracker];
701 substr(clockCounterWidth, T2DOutputWidth - clockCounterWidth);
702 for (
unsigned i = 0; i < nMax2DTracksPerClock; ++i) {
704 if (slv[clockCounterWidth + oldTrackWidth + i] == one_val) {
705 TRG2DFinderTrack trk = decode2DTrack(strOutput.substr(posTrack[i], lenTrack), iTracker);
706 B2DEBUG(15,
"2DOut phi0:" << trk.phi0 <<
", omega:" << trk.omega
707 <<
", at clock " << foundTime <<
", tracker " << iTracker);
708 CDCTriggerTrack* track =
709 storeTracks->appendNew(trk.phi0, trk.omega, 0., foundTime, iTracker);
710 CDCTriggerFinderClone* clone =
711 storeClones->appendNew(slv[clockCounterWidth + i] == one_val, iTracker);
712 clone->addRelationTo(track);
719 for (
unsigned iAx = 0; iAx < nAxialTSF; ++iAx) {
720 const auto& ts = trk.ts[iAx];
722 unsigned iTS = TSIDInSL(ts[0], 2 * iAx, iTracker);
723 CDCTriggerSegmentHit* hit =
724 tsHits->appendNew(2 * iAx,
735 2000 + iTracker * 100 + foundTime,
737 track->addRelationTo(hit);
757 void decode2DInput(
short foundTime,
758 std::array<int, 4> timeOffset,
759 TSFOutputBitStream* bits,
760 StoreArray<CDCTriggerSegmentHit>* tsHits)
763 for (
unsigned iAx = 0; iAx < nAxialTSF; ++iAx) {
764 for (
unsigned iTracker = 0; iTracker < nTrackers; ++iTracker) {
765 const auto& tracker = bits->signal()[iAx][iTracker];
767 bool noMoreHit =
false;
768 for (
unsigned pos = clockCounterWidth; pos < TSFOutputWidth; pos += lenTS) {
769 std::string tsHitStr = strInput.substr(pos, lenTS);
770 B2DEBUG(50, tsHitStr);
771 tsOut ts = decodeTSHit(tsHitStr);
776 }
else if (noMoreHit) {
777 B2DEBUG(20,
"Discontinuous TS hit detected!");
779 unsigned iTS = TSIDInSL(ts[0], 2 * iAx, iTracker);
781 CDCTriggerSegmentHit hit(2 * iAx,
787 foundTime + timeOffset[iTracker],
800 if (std::none_of(tsHits->begin(), tsHits->end(),
801 [hit](CDCTriggerSegmentHit storeHit) {
802 return (storeHit.getSegmentID() == hit.getSegmentID() &&
803 storeHit.foundTime() == hit.foundTime());
805 B2DEBUG(40,
"found TS hit ID " << hit.getSegmentID() <<
806 ", SL" << 2 * iAx <<
", local ID " << iTS <<
808 tsHits->appendNew(hit);
810 B2DEBUG(45,
"skipping redundant hit ID " << hit.getSegmentID() <<
" in 2D" << iTracker);
833 CDCTriggerTrack* decodeNNInput(
short iclock,
836 StoreArray<CDCTriggerTrack>* store2DTracks,
837 StoreArray<CDCTriggerSegmentHit>* tsHits)
839 CDCTriggerTrack* track2D =
nullptr;
840 constexpr
unsigned lenTrack = 135;
842 const auto slvIn = bitsIn->signal()[iTracker];
844 strIn = strIn.substr(NN_WIDTH - 570 - 496, 982);
846 for (
unsigned iSt = 0; iSt < nStereoTSF; ++iSt) {
847 for (
unsigned iHit = 0; iHit < 10; ++iHit) {
849 unsigned pos = ((nStereoTSF - iSt - 1) * 10 + iHit) * lenTS;
850 tsOut ts = decodeTSHit(strIn.substr(pos, lenTS));
852 addTSHit(ts, iSt * 2 + 1, iTracker, tsHits, iclock);
856 std::string strTrack = strIn.substr(nStereoTSF * 10 * lenTS, lenTrack);
857 if (!std::all_of(strTrack.begin(), strTrack.end(), [](
char i) {return i ==
'0';})) {
858 std::string infobits = strTrack.substr(5 * lenTS + 14, 16);
859 strTrack =
"00" + strTrack.substr(5 * lenTS, 14) + strTrack.substr(0,
861 TRG2DFinderTrack trk2D = decode2DTrack(strTrack, iTracker);
862 B2DEBUG(15,
"NNIn phi0:" << trk2D.phi0 <<
", omega:" << trk2D.omega
863 <<
", at clock " << iclock <<
", tracker " << iTracker);
864 B2DEBUG(300,
"Content of new infobits: " << infobits);
865 std::vector<bool> foundoldtrack;
866 std::vector<bool> driftthreshold;
869 for (i = 0; i < 6; i++) {
870 if (infobits.substr(i, 1) ==
"1") {
871 foundoldtrack.push_back(
true);
872 }
else if (infobits.substr(i, 1) ==
"0") {
873 foundoldtrack.push_back(
false);
875 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
876 foundoldtrack.push_back(
false);
880 if (infobits.substr(i, 1) ==
"1") {
882 }
else if (infobits.substr(i, 1) ==
"0") {
883 valstereobit =
false;
885 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
886 valstereobit =
false;
888 for (i = 7; i < 16; i++) {
889 if (infobits.substr(i, 1) ==
"1") {
890 driftthreshold.push_back(
true);
891 }
else if (infobits.substr(i, 1) ==
"0") {
892 driftthreshold.push_back(
false);
894 B2WARNING(
"Invalid input in NNBitstream appending 'false'!");
895 driftthreshold.push_back(
false);
898 B2DEBUG(15,
"bits for foundoldtrack: " << foundoldtrack[0]
903 << foundoldtrack[5]);
904 B2DEBUG(15,
"bits for driftthreshold: " << driftthreshold[0]
912 << driftthreshold[8]);
913 B2DEBUG(15,
"bits for valstereobit: " << valstereobit);
924 B2DEBUG(15,
"make new 2D track with phi " << trk2D.phi0 <<
" omega " << trk2D.omega <<
" clock " << iclock);
925 track2D = store2DTracks->appendNew(trk2D.phi0, trk2D.omega, 0., foundoldtrack, driftthreshold, valstereobit, iclock, iTracker);
927 for (
unsigned iAx = 0; iAx < nAxialTSF; ++iAx) {
928 const auto& ts = trk2D.ts[iAx];
930 CDCTriggerSegmentHit* hit =
931 addTSHit(ts, 2 * iAx, iTracker, tsHits, iclock);
932 track2D->addRelationTo(hit);
960 void decodeNNOutput_old(
short foundTime,
962 NNBitStream* bitsOut,
963 NNBitStream* bitsSelectTS,
964 StoreArray<CDCTriggerTrack>* storeNNTracks,
965 StoreArray<CDCTriggerSegmentHit>* tsHits,
966 StoreArray<CDCTriggerMLPInput>* storeNNInputs,
967 CDCTriggerTrack* track2D)
969 const auto slvOut = bitsOut->signal()[iTracker];
971 strTrack = strTrack.substr(496, 570);
972 const auto slvSelect = bitsSelectTS->signal()[iTracker];
974 strSelect = strSelect.substr(496, 570);
975 TRGNeuroTrack trkNN = decodeNNTrack_old(strTrack, strSelect);
976 B2DEBUG(15,
"make new NN track with , z:" << trkNN.z <<
", theta:" << trkNN.theta <<
977 ", sector:" << trkNN.sector <<
", clock " << foundTime);
978 double phi0 = track2D->getPhi0();
979 double omega = track2D->getOmega();
980 std::vector<bool> tsvector(9,
false);
981 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
982 if (trkNN.ts[iSL][3] > 0) {
983 tsvector[iSL] =
true;
986 CDCTriggerTrack* trackNN = storeNNTracks->appendNew(phi0, omega, 0.,
987 trkNN.z, cos(trkNN.theta) / sin(trkNN.theta), 0., track2D->getFoundOldTrack(), track2D->getDriftThreshold(),
988 track2D->getValidStereoBit(), trkNN.sector, tsvector, foundTime, iTracker);
989 std::vector<float> inputVector(27, 0.);
990 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
991 inputVector[3 * iSL] = trkNN.inputID[iSL];
992 inputVector[3 * iSL + 1] = trkNN.inputT[iSL];
993 inputVector[3 * iSL + 2] = trkNN.inputAlpha[iSL];
995 CDCTriggerMLPInput* storeInput =
996 storeNNInputs->appendNew(inputVector, trkNN.sector);
997 trackNN->addRelationTo(storeInput);
998 track2D->addRelationTo(trackNN);
1000 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
1001 if (trkNN.ts[iSL][3] > 0) {
1002 CDCTriggerSegmentHit* hit = addTSHit(trkNN.ts[iSL] , iSL, iTracker, tsHits, foundTime);
1003 trackNN->addRelationTo(hit);
1026 StoreArray<CDCTriggerUnpacker::NNBitStream>* bitsNN,
1027 StoreArray<CDCTriggerTrack>* store2DTracks,
1028 StoreArray<CDCTriggerTrack>* storeNNTracks,
1029 StoreArray<CDCTriggerSegmentHit>* tsHits,
1030 StoreArray<CDCTriggerSegmentHit>* tsHitsAll,
1031 StoreArray<CDCTriggerMLPInput>* storeNNInputs,
1032 const DBObjPtr<CDCTriggerNeuroConfig>& neurodb,
1035 for (
unsigned iTracker = 0; iTracker < nTrackers; ++iTracker) {
1036 B2DEBUG(21,
"----------------------------------------------------------------------------------------------------");
1037 B2DEBUG(21, padright(
" Unpacking Tracker: " + std::to_string(iTracker), 100));
1040 for (
short iclock = 0; iclock < bitsNN->getEntries(); ++iclock) {
1042 B2LDataField p_nnenable(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"NNEnable"));
1043 if (p_nnenable.name ==
"None") {
1044 B2DEBUG(5,
"Neurotrigger: NNENable position unknown, skipping ... ");
1046 }
else if (p_nnenable.data ==
"1") {
1047 B2DEBUG(10, padright(
"Tracker: " + std::to_string(iTracker) +
", Clock: " + std::to_string(iclock) +
" : NNEnable set!", 100));
1049 B2DEBUG(21, padright(
" UnpackerClock: " + std::to_string(iclock), 100));
1053 CDCTriggerNeuroConfig::B2FormatLine nnall;
1057 nnall.name =
"nnall";
1058 B2LDataField p_nnall(bitsNN, iclock, iTracker, nnall);
1059 B2DEBUG(22, padright(
" all bits: ", 100));
1060 B2DEBUG(22, padright(
" " + p_nnall.data, 100));
1062 B2LDataField p_driftthreshold(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"DriftThreshold"));
1063 if ((p_driftthreshold.name !=
"None") && (p_driftthreshold.data.size() == 0)) {
1064 B2DEBUG(10,
"Could not load Datafield: " << p_driftthreshold.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1069 B2LDataField p_valstereobit(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"ValStereoBit"));
1070 if ((p_valstereobit.name !=
"None") && (p_valstereobit.data.size() == 0)) {
1071 B2DEBUG(10,
"Could not load Datafield: " << p_valstereobit.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1076 B2LDataField p_foundoldtrack(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"FoundOldTrack"));
1077 if ((p_foundoldtrack.name !=
"None") && (p_foundoldtrack.data.size() == 0)) {
1078 B2DEBUG(10,
"Could not load Datafield: " << p_foundoldtrack.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1083 B2LDataField p_phi(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"Phi"));
1084 if ((p_phi.name !=
"None") && (p_phi.data.size() == 0)) {
1085 B2DEBUG(10,
"Could not load Datafield: " << p_phi.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1089 B2LDataField p_omega(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"Omega"));
1090 if ((p_omega.name !=
"None") && (p_omega.data.size() == 0)) {
1091 B2DEBUG(10,
"Could not load Datafield: " << p_omega.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1095 B2LDataField p_ts8(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TS8"));
1096 if ((p_ts8.name !=
"None") && (p_ts8.data.size() == 0)) {
1097 B2DEBUG(10,
"Could not load Datafield: " << p_ts8.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1101 B2LDataField p_ts6(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TS6"));
1102 if ((p_ts6.name !=
"None") && (p_ts6.data.size() == 0)) {
1103 B2DEBUG(10,
"Could not load Datafield: " << p_ts6.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1107 B2LDataField p_ts4(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TS4"));
1108 if ((p_ts4.name !=
"None") && (p_ts4.data.size() == 0)) {
1109 B2DEBUG(10,
"Could not load Datafield: " << p_ts4.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1113 B2LDataField p_ts2(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TS2"));
1114 if ((p_ts2.name !=
"None") && (p_ts2.data.size() == 0)) {
1115 B2DEBUG(10,
"Could not load Datafield: " << p_ts2.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1119 B2LDataField p_ts0(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TS0"));
1120 if ((p_ts0.name !=
"None") && (p_ts0.data.size() == 0)) {
1121 B2DEBUG(10,
"Could not load Datafield: " << p_ts0.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1125 B2LDataField p_tsf1(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TSF1"));
1126 if ((p_tsf1.name !=
"None") && (p_tsf1.data.size() == 0)) {
1127 B2DEBUG(10,
"Could not load Datafield: " << p_tsf1.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1131 B2LDataField p_tsf3(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TSF3"));
1132 if ((p_tsf3.name !=
"None") && (p_tsf3.data.size() == 0)) {
1133 B2DEBUG(10,
"Could not load Datafield: " << p_tsf3.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1137 B2LDataField p_tsf5(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TSF5"));
1138 if ((p_tsf5.name !=
"None") && (p_tsf5.data.size() == 0)) {
1139 B2DEBUG(10,
"Could not load Datafield: " << p_tsf5.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1143 B2LDataField p_tsf7(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TSF7"));
1144 if ((p_tsf7.name !=
"None") && (p_tsf7.data.size() == 0)) {
1145 B2DEBUG(10,
"Could not load Datafield: " << p_tsf7.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1149 B2LDataField p_tsfsel(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"TSFsel"));
1150 if ((p_tsfsel.name !=
"None") && (p_tsfsel.data.size() == 0)) {
1151 B2DEBUG(10,
"Could not load Datafield: " << p_tsfsel.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1155 B2LDataField p_mlpin_alpha(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"MLPIn_alpha"));
1156 if ((p_mlpin_alpha.name !=
"None") && (p_mlpin_alpha.data.size() == 0)) {
1157 B2DEBUG(10,
"Could not load Datafield: " << p_mlpin_alpha.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1162 B2LDataField p_mlpin_drifttime(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"MLPIn_driftt"));
1163 if ((p_mlpin_drifttime.name !=
"None") && (p_mlpin_drifttime.data.size() == 0)) {
1164 B2DEBUG(10,
"Could not load Datafield: " << p_mlpin_drifttime.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1169 B2LDataField p_mlpin_id(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"MLPIn_id"));
1170 if ((p_mlpin_id.name !=
"None") && (p_mlpin_id.data.size() == 0)) {
1171 B2DEBUG(10,
"Could not load Datafield: " << p_mlpin_id.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1176 B2LDataField p_netsel(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"Netsel"));
1177 if ((p_netsel.name !=
"None") && (p_netsel.data.size() == 0)) {
1178 B2DEBUG(10,
"Could not load Datafield: " << p_netsel.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1182 B2LDataField p_mlpout_z(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"MLPOut_z"));
1183 if ((p_mlpout_z.name !=
"None") && (p_mlpout_z.data.size() == 0)) {
1184 B2DEBUG(10,
"Could not load Datafield: " << p_mlpout_z.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1189 B2LDataField p_mlpout_theta(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"MLPOut_theta"));
1190 if ((p_mlpout_theta.name !=
"None") && (p_mlpout_theta.data.size() == 0)) {
1191 B2DEBUG(10,
"Could not load Datafield: " << p_mlpout_theta.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1196 B2LDataField p_2dcc(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"2dcc"));
1197 if ((p_2dcc.name !=
"None") && (p_2dcc.data.size() == 0)) {
1198 B2DEBUG(10,
"Could not load Datafield: " << p_2dcc.name <<
" from bitstream. Maybe offset was out of bounds? clock: " << iclock);
1202 B2LDataField p_extendedpts(bitsNN, iclock, iTracker, neurodb->getB2FormatLine(
"extendedPriorityTimes"));
1203 if ((p_extendedpts.name !=
"None") && (p_extendedpts.data.size() == 0)) {
1204 B2DEBUG(10,
"Could not load Datafield: " << p_extendedpts.name <<
" from bitstream. Maybe offset was out of bounds? clock: " <<
1210 CDCTriggerTrack* track2D =
nullptr;
1214 B2DEBUG(21, padright(
" Stereos: ", 100));
1215 for (
auto stereolayer : {p_tsf1, p_tsf3, p_tsf5, p_tsf7}) {
1216 if (stereolayer.name ==
"None") {
1217 B2ERROR(
"Error in CDCTriggerNeuroConfig Payload, position of stereo tsf could not be found!");
1220 std::string tsstr =
" | ";
1221 for (
unsigned iHit = 0; iHit < 10; ++iHit) {
1222 tsOut ts = (sim13dt) ? decodeTSHit_sim(stereolayer.data.substr(iHit * lenTS, lenTS),
1223 p_2dcc.data) : decodeTSHit(stereolayer.data.substr(iHit * lenTS, lenTS));
1225 unsigned iTS = TSIDInSL(ts[0], sln * 2 + 1, iTracker);
1226 tsstr += std::to_string(iTS) +
", " + std::to_string(ts[1]) +
", " + std::to_string(ts[2]) +
", " + std::to_string(ts[3]) +
" | ";
1227 addTSHit(ts, sln * 2 + 1, iTracker, tsHitsAll, iclock);
1230 B2DEBUG(21, padright(
" SL" + std::to_string(sln * 2 + 1) + tsstr, 100));
1234 B2DEBUG(21, padright(
" 2DCC: " + std::to_string(std::stoi(p_2dcc.data, 0, 2)) +
", (" + p_2dcc.data +
")", 100));
1235 if (p_nnenable.data ==
"1") {
1236 std::vector<bool> foundoldtrack{
false};
1237 std::vector<bool> driftthreshold{
false};
1239 if (p_foundoldtrack.name !=
"None") {
1240 foundoldtrack = decodefoundoldtrack(p_foundoldtrack.data);
1242 if (p_driftthreshold.name !=
"None") {
1243 driftthreshold = decodedriftthreshold(p_driftthreshold.data);
1245 if (p_valstereobit.name !=
"None") {
1246 valstereobit = decodevalstereobit(p_valstereobit.data);
1249 if (std::all_of(p_phi.data.begin(), p_phi.data.end(), [](
char i) {return i == 0;})) {
1250 B2ERROR(
"Empty Phi Value found for 2DTrack, should not happen!");
1253 TRG2DFinderTrack trk2D = decode2DTrack(
1265 track2D = store2DTracks->appendNew(trk2D.phi0, trk2D.omega, 0., foundoldtrack, driftthreshold, valstereobit, iclock, iTracker);
1266 B2DEBUG(12, padright(
" 2DTrack: (phi=" + std::to_string(trk2D.phi0) +
", omega=" + std::to_string(
1267 trk2D.omega) +
", update=" + std::to_string(foundoldtrack[1]) +
")", 100));
1271 for (
unsigned iAx = 0; iAx < nAxialTSF; ++iAx) {
1272 const auto& ts = trk2D.ts[iAx];
1274 CDCTriggerSegmentHit* hit =
1275 addTSHit(ts, 2 * iAx, iTracker, tsHitsAll, iclock);
1276 unsigned iTS = TSIDInSL(ts[0], iAx * 2, iTracker);
1277 tsstr +=
"(SL" + std::to_string(iAx * 2) +
", " + std::to_string(iTS) +
", " + std::to_string(ts[1]) +
", " + std::to_string(
1278 ts[2]) +
", " + std::to_string(ts[3]) +
"),";
1279 track2D->addRelationTo(hit);
1282 B2DEBUG(16, padright(
" 2DTrack TS: " + tsstr, 100));
1286 TRGNeuroTrack trkNN;
1287 trkNN = decodeNNTrack(p_mlpout_z.data,
1288 p_mlpout_theta.data,
1291 p_mlpin_drifttime.data,
1300 B2DEBUG(11, padright(
" NNTrack: (z=" + std::to_string(trkNN.z) +
", theta=" + std::to_string(trkNN.theta) +
")", 100));
1302 double phi0 = track2D->getPhi0();
1303 double omega = track2D->getOmega();
1305 std::vector<bool> tsvector(9,
false);
1309 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
1310 if (trkNN.ts[iSL][3] > 0) {
1311 tsvector[iSL] =
true;
1312 unsigned iTS = TSIDInSL(trkNN.ts[iSL][0], iSL, iTracker);
1313 tsstr +=
"(SL" + std::to_string(iSL) +
", " + std::to_string(iTS) +
", " + std::to_string(trkNN.ts[iSL][1]) +
", " + std::to_string(
1314 trkNN.ts[iSL][2]) +
", " + std::to_string(trkNN.ts[iSL][3]) +
"),\n";
1317 if (!(trk2D.ts[iSL / 2][0] == trkNN.ts[iSL][0] &&
1319 trk2D.ts[iSL / 2][2] == trkNN.ts[iSL][2] &&
1320 trk2D.ts[iSL / 2][3] == trkNN.ts[iSL][3])) {
1326 tsstr +=
"( - ),\n";
1330 B2DEBUG(15, padright(
" NNTrack TS: " + tsstr, 100));
1332 CDCTriggerTrack* trackNN = storeNNTracks->appendNew(phi0, omega, 0.,
1333 trkNN.z, cos(trkNN.theta) / sin(trkNN.theta), 0., track2D->getFoundOldTrack(), track2D->getDriftThreshold(),
1334 track2D->getValidStereoBit(), trkNN.sector, tsvector, iclock, iTracker);
1336 if (isin2d ==
false) {
1337 trackNN->setQualityVector(1);
1339 std::vector<float> inputVector(27, 0.);
1340 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
1341 inputVector[3 * iSL] = trkNN.inputID[iSL];
1342 inputVector[3 * iSL + 1] = trkNN.inputT[iSL];
1343 inputVector[3 * iSL + 2] = trkNN.inputAlpha[iSL];
1345 CDCTriggerMLPInput* storeInput =
1346 storeNNInputs->appendNew(inputVector, trkNN.sector);
1347 trackNN->addRelationTo(storeInput);
1348 track2D->addRelationTo(trackNN);
1350 for (
unsigned iSL = 0; iSL < 9; ++iSL) {
1351 if (trkNN.ts[iSL][3] > 0) {
1352 CDCTriggerSegmentHit* hit =
nullptr;
1382 hit = addTSHit(trkNN.ts[iSL] , iSL, iTracker, tsHits, iclock);
1386 trackNN->addRelationTo(hit);
1388 track2D->addRelationTo(hit);
1412 void decodeNNIO_old(
1413 StoreArray<CDCTriggerUnpacker::NNBitStream>* bitsNN,
1414 StoreArray<CDCTriggerTrack>* store2DTracks,
1415 StoreArray<CDCTriggerTrack>* storeNNTracks,
1416 StoreArray<CDCTriggerSegmentHit>* tsHits,
1417 StoreArray<CDCTriggerMLPInput>* storeNNInputs)
1419 for (
short iclock = 0; iclock < bitsNN->getEntries(); ++iclock) {
1420 NNBitStream* bitsIn = (*bitsNN)[iclock];
1421 NNBitStream* bitsOutEnable = (*bitsNN)[iclock];
1422 for (
unsigned iTracker = 0; iTracker < nTrackers; ++iTracker) {
1423 const auto slvOutEnable = bitsOutEnable->signal()[iTracker];
1424 const auto slvIn = bitsIn->signal()[iTracker];
1427 if (stringOutEnable.c_str()[0] ==
'1') {
1428 CDCTriggerTrack* nntrack2D = decodeNNInput(iclock, iTracker, bitsIn, store2DTracks, tsHits);
1430 int foundTime = iclock;
1431 if (foundTime < bitsNN->getEntries()) {
1432 NNBitStream* bitsOut = (*bitsNN)[foundTime];
1433 NNBitStream* bitsSelectTS = (*bitsNN)[iclock];
1434 decodeNNOutput_old(iclock, iTracker, bitsOut, bitsSelectTS,
1435 storeNNTracks, tsHits, storeNNInputs,
Class to hold one clock cycle of raw bit content.
const SignalBus & signal()
accessors
static const double speedOfLight
[cm/ns]
Accessor to arrays stored in the data store.
int getEntries() const
Get the number of objects in the array.
static const double realNaN
shortcut for NaN of double type
Abstract base class for different kinds of events.
const char one_val
'1' in XSI VHDL simulation
const char * std_logic_literal[]
In case you are not familiar with VHDL simulation, there are 9 possible values defined for the standa...
std::bitset< max - min+1 > subset(std::bitset< nbits > set)
extract a subset of bitstring, like substring.
const char zero_val
'0' in XSI VHDL simulation
std::string slv_to_bin_string(std::array< char, N > signal, bool padding=false)
Transform into string.
void display_hex(const std::array< char, N > &signal)
Display signal in hex.
std::string display_value(const char *count, int size)
Display value of the signal.
tsOutArray ts
all TS of a 2D track
double omega
omega of a 2D track
double phi0
phi0 of a 2D track
std::array< float, 9 > inputT
input T list of a NN track
std::array< float, 9 > inputAlpha
input Alpha list of a NN track
unsigned sector
sector of a NN track
std::array< float, 9 > inputID
input ID list of a NN track
std::array< tsOut, 9 > ts
input TS list of a NN track
double theta
theta of a NN track