CbmRoot
Loading...
Searching...
No Matches
AccDataSis18.cxx
Go to the documentation of this file.
1/* Copyright (C) 2022-2025 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
5#include "AccDataSis18.h"
6
7#include <Logger.h> // for LOG output
8
9#include <iomanip>
10#include <iostream>
11
12AccTimingEvent::AccTimingEvent(uint64_t ulPlannedUTCIn, uint64_t ulPlannedTAIIn, uint64_t ulRawEventIn,
13 uint64_t ulRawParamsIn, uint32_t uRawTimingFlagsIn, uint64_t ulExecutedUTCIn,
14 uint64_t ulExecutedTAIIn)
15 : fulPlannedUTC {ulPlannedUTCIn}
16 , fulPlannedTAI {ulPlannedTAIIn}
17 , fulRawEvent {ulRawEventIn}
18 , fulRawParams {ulRawParamsIn}
19 , fuRawTimingFlags {uRawTimingFlagsIn}
20 , fulExecutedUTC {ulExecutedUTCIn}
21 , fulExecutedTAI {ulExecutedTAIIn}
22{
23}
24
25AccTimingEvent::AccTimingEvent(std::string sLine, bool bVerbose)
26{
27 /*
28 * Format used to generate the timing files
29 * | std::cout << "Planned UTC: " << setw(20) << deadline.getUTC();
30 * | std::cout << " TAI: " << setw(20) <<deadline.getTAI();
31 * | std::cout << " Raw:" << std::hex << std::setfill('0')
32 * | << " 0x" << std::setw(16) << id
33 * | << " 0x" << std::setw(16) << param
34 * | << " 0x" << std::setw(4) << flags
35 * | << std::dec << std::setfill(' ');
36 * | std::cout << " exec UTC: " << setw(20) <<executed.getUTC();
37 * | std::cout << " TAI: " << setw(20) <<executed.getTAI();
38 * |
39 * | /// Dec Hex Name Meaning
40 * | ///
41 * | /// Spill limits
42 * | /// 46 2E EVT_EXTR_START_SLOW Start of extraction
43 * | /// 49 31 EVT_EXTR_KICKER_START Start of extraction
44 * | /// 51 33 EVT_EXTR_END End of extraction
45 * | /// 78 4E EVT_EXTR_STOP_SLOW End of slow extraction
46 * | ///
47 * | /// Cycle limits
48 * | /// 32 20 EVT_START_CYCLE First Event in a cycle
49 * | /// 55 37 EVT_END_CYCLE End of a cycle
50 * | uint32_t uEventNb = ((id >> 36) & 0xfff);
51 * | switch (uEventNb) {
52 * | case 32:
53 * | std::cout << " => EVT_START_CYCLE ";
54 * | break;
55 * | case 55:
56 * | std::cout << " => EVT_END_CYCLE ";
57 * | break;
58 * | case 46:
59 * | std::cout << " => EVT_EXTR_START_SLOW ";
60 * | break;
61 * | case 49:
62 * | std::cout << " => EVT_EXTR_KICKER_START ";
63 * | break;
64 * | case 51:
65 * | std::cout << " => EVT_EXTR_END ";
66 * | break;
67 * | case 78:
68 * | std::cout << " => EVT_EXTR_STOP_SLOW ";
69 * | break;
70 * | }
71 * | std::cout << tr_formatDate(deadline, pmode);
72 * | std::cout << tr_formatActionFlags(flags, executed - deadline, pmode);
73 * | std::cout << std::endl;
74 */
75
76 std::string sToken = "Planned UTC: ";
77 std::size_t posTok = sLine.find(sToken);
78 sLine = sLine.substr(posTok + sToken.size());
79
80 sToken = " TAI: ";
81 posTok = sLine.find(sToken);
82 fulPlannedUTC = std::stoul(sLine.substr(0, posTok));
83 sLine = sLine.substr(posTok + sToken.size());
84
85 sToken = " Raw: 0x";
86 posTok = sLine.find(sToken);
87 fulPlannedTAI = std::stoul(sLine.substr(0, posTok));
88 sLine = sLine.substr(posTok + sToken.size());
89
90 sToken = " 0x";
91 posTok = sLine.find(sToken);
92 fulRawEvent = std::stoul(sLine.substr(0, posTok), 0, 16);
93 sLine = sLine.substr(posTok + sToken.size());
94
95 sToken = " 0x";
96 posTok = sLine.find(sToken);
97 fulRawParams = std::stoul(sLine.substr(0, posTok), 0, 16);
98 sLine = sLine.substr(posTok + sToken.size());
99
100 sToken = " exec UTC: ";
101 posTok = sLine.find(sToken);
102 fuRawTimingFlags = std::stoul(sLine.substr(0, posTok), 0, 16);
103 sLine = sLine.substr(posTok + sToken.size());
104
105 sToken = " TAI: ";
106 posTok = sLine.find(sToken);
107 fulExecutedUTC = std::stoul(sLine.substr(0, posTok));
108 sLine = sLine.substr(posTok + sToken.size());
109
110 sToken = " => ";
111 posTok = sLine.find(sToken);
112 fulExecutedTAI = std::stoul(sLine.substr(0, posTok));
113 sLine = sLine.substr(posTok + sToken.size());
114
115 if (bVerbose) Print();
116}
117
119{
120 /* clang-format off */
121 LOG(info) << "Planned UTC: " << std::setw(20) << fulPlannedUTC
122 << " TAI: " << std::setw(20) << fulPlannedTAI
123 << " Raw:" << std::hex << std::setfill('0')
124 << " 0x" << std::setw(16) << fulRawEvent
125 << " 0x" << std::setw(16) << fulRawParams
126 << " 0x" << std::setw(4) << fuRawTimingFlags
127 << std::dec << std::setfill(' ')
128 << " exec UTC: " << std::setw(20) << fulExecutedUTC
129 << " TAI: " << std::setw(20) << fulExecutedTAI;
130 /* clang-format on */
131}
132//--------------------------------------------------------------------------------------------------------------------//
133
134AccPatternEvent::AccPatternEvent(uint64_t ulPlannedUTCIn, uint64_t ulPlannedTAIIn, bool bHtdPatternOnIn,
135 uint64_t ulExecutedUTCIn, uint64_t ulExecutedTAIIn)
136 : fulPlannedUTC{ulPlannedUTCIn}
137 , fulPlannedTAI{ulPlannedTAIIn}
138 , fbHtdPatternOn{bHtdPatternOnIn}
139 , fulExecutedUTC{ulExecutedUTCIn}
140 , fulExecutedTAI{ulExecutedTAIIn}
141{
142}
143
144AccPatternEvent::AccPatternEvent(std::string sLine, bool bVerbose)
145{
146 /*
147 * Format used to generate the timing files
148 * | std::cout << "Planned UTC: " << setw(20) << deadline.getUTC();
149 * | std::cout << " TAI: " << setw(20) << deadline.getTAI();
150 * | std::cout << " HTD Pattern: " << bOnOff;
151 * | std::cout << " exec UTC: " << setw(20) << executed.getUTC();
152 * | std::cout << " TAI: " << setw(20) << executed.getTAI();
153 * | std::cout << tr_formatDate(deadline, pmode, false);
154 * | std::cout << std::endl;
155 */
156
157 std::string sToken = "Planned UTC: ";
158 std::size_t posTok = sLine.find(sToken);
159 sLine = sLine.substr(posTok + sToken.size());
160
161 sToken = " TAI: ";
162 posTok = sLine.find(sToken);
163 fulPlannedUTC = std::stoul(sLine.substr(0, posTok));
164 sLine = sLine.substr(posTok + sToken.size());
165
166 sToken = " HTD Pattern: ";
167 posTok = sLine.find(sToken);
168 fulPlannedTAI = std::stoul(sLine.substr(0, posTok));
169 sLine = sLine.substr(posTok + sToken.size());
170
171 sToken = " exec UTC: ";
172 posTok = sLine.find(sToken);
173 fbHtdPatternOn = std::stoi(sLine.substr(0, posTok));
174 sLine = sLine.substr(posTok + sToken.size());
175
176 sToken = " TAI: ";
177 posTok = sLine.find(sToken);
178 fulExecutedUTC = std::stoul(sLine.substr(0, posTok));
179 sLine = sLine.substr(posTok + sToken.size());
180
181 sToken = "0x"; // FIXME: typo/bug in recording SW led to no space between the TAI time and the final hex nb
182 posTok = sLine.find(sToken);
183 fulExecutedTAI = std::stoul(sLine.substr(0, posTok));
184 sLine = sLine.substr(posTok + sToken.size());
185
186 if (bVerbose) Print();
187}
188
190{
191 /* clang-format off */
192 LOG(info) << "Planned UTC: " << std::setw(20) << fulPlannedUTC
193 << " TAI: " << std::setw(20) << fulPlannedTAI
194 << " HTD Pattern: " << (IsHtdOn() ? "On " : "Off")
195 << " exec UTC: " << std::setw(20) << fulExecutedUTC
196 << " TAI: " << std::setw(20) << fulExecutedTAI;
197 /* clang-format on */
198}
199//--------------------------------------------------------------------------------------------------------------------//
200
201bool AccStatusTs::IsSpillOnAtTime(uint64_t uTimeUtc) const
202{
203 bool bSpillOn = IsSpillOnAtStart();
204
205 std::vector<AccTimingEvent>::const_iterator it = fvEventsDuringTS.begin();
206 while (it != fvEventsDuringTS.end() && (*it < uTimeUtc)) {
207 if (bSpillOn && it->IsExtractionEnd()) {
209 bSpillOn = false;
210 }
211 else if (!bSpillOn && (it->IsExtractionStart() || it->IsKickerStart())) {
213 bSpillOn = true;
214 }
215 }
216 return bSpillOn;
217}
218
219uint32_t AccStatusTs::GetSpillIdxAtTime(uint64_t uTimeUtc) const
220{
221 bool bSpillOn = IsSpillOnAtStart();
222 uint32_t uSpillIdx = fuSpillIndexAtStart;
223
224 std::vector<AccTimingEvent>::const_iterator it = fvEventsDuringTS.begin();
225 while (it != fvEventsDuringTS.end() && (*it < uTimeUtc)) {
226 if (bSpillOn && it->IsExtractionEnd()) {
228 bSpillOn = false;
229 }
230 else if (!bSpillOn && (it->IsExtractionStart() || it->IsKickerStart())) {
232 bSpillOn = true;
233 uSpillIdx++;
234 }
235 }
236 return uSpillIdx;
237}
238
239bool AccStatusTs::IsPatternOnAtTime(uint64_t uTimeUtc) const
240{
241 bool bPatternOn = IsPatternOnAtStart();
242
243 std::vector<AccPatternEvent>::const_iterator it = fvPatternsDuringTS.begin();
244 while (it != fvPatternsDuringTS.end() && (*it < uTimeUtc)) {
245 bPatternOn = it->IsHtdOn();
246 }
247 return bPatternOn;
248}
249//--------------------------------------------------------------------------------------------------------------------//
uint64_t fulExecutedTAI
bool IsHtdOn() const
uint64_t fulPlannedUTC
Constants.
AccPatternEvent()=default
uint64_t fulExecutedUTC
uint64_t fulPlannedTAI
void Print() const
std::vector< AccPatternEvent > fvPatternsDuringTS
bool IsSpillOnAtTime(uint64_t uTimeUtc) const
bool IsPatternOnAtTime(uint64_t uTimeUtc) const
std::vector< AccTimingEvent > fvEventsDuringTS
uint32_t GetSpillIdxAtTime(uint64_t uTimeUtc) const
bool IsPatternOnAtStart() const
True when we start with an HTD cave pattern enabled.
bool IsSpillOnAtStart() const
True when we start in the middle of an extraction spill.
uint32_t fuSpillIndexAtStart
Members.
uint64_t fulRawParams
uint64_t fulPlannedTAI
uint64_t fulExecutedUTC
uint64_t fulRawEvent
uint64_t fulExecutedTAI
AccTimingEvent()=default
void Print() const
uint32_t fuRawTimingFlags
uint64_t fulPlannedUTC
Fields.