Jpp 19.3.0-rc.2
the software that should make you happy
Loading...
Searching...
No Matches
daq_parser.cpp File Reference
#include <DataFormats/daq_common_header.hh>
#include <DataFormats/infoword.hh>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cstring>
#include <sys/ioctl.h>
#include <signal.h>
#include <unistd.h>
#include <vector>
#include <cassert>

Go to the source code of this file.

Functions

void sig_term_change (int)
 
struct __attribute__ ((packed)) hit_t
 
std::ostream & operator<< (std::ostream &stream, const hit_t &hit)
 
void print_acoustic_data (const char *const buffer, ssize_t buffer_size)
 
void print_summary (hit_t const *const hits, std::size_t nhits)
 
void print_optical_data (const char *const buffer, ssize_t buffer_size)
 
void parseData (std::istream &stream)
 
int main (int argc, char *argv[])
 

Variables

static const unsigned int ttdc = 1414808643
 
static const unsigned int taes = 1413563731
 
static int terminal_width
 

Function Documentation

◆ sig_term_change()

void sig_term_change ( int )

Definition at line 23 of file daq_parser.cpp.

24{
25 static bool const is_a_tty = isatty(1);
26
27 if (!is_a_tty) {
28 terminal_width = 80;
29 } else {
30 struct winsize sz;
31
32 ioctl(1, TIOCGWINSZ, &sz);
33 terminal_width = sz.ws_col;
34 }
35}
static int terminal_width

◆ __attribute__()

struct __attribute__ ( (packed) )

Definition at line 23 of file daq_parser.cpp.

38{
39 uint8_t channel;
40 uint32_t timestamp;
41 uint8_t ToT;
42};

◆ operator<<()

std::ostream & operator<< ( std::ostream & stream,
const hit_t & hit )
inline

Definition at line 44 of file daq_parser.cpp.

45{
46 return stream << "C: "
47 << std::setfill(' ') << std::setw(2)
48 << (unsigned int) hit.channel
49
50 << ", T: "
51 << std::setfill(' ') << std::setw(6)
52 << ntohl(hit.timestamp)
53
54 << ", ToT: "
55 << std::setfill(' ') << std::setw(6)
56 << (unsigned int) hit.ToT;
57}

◆ print_acoustic_data()

void print_acoustic_data ( const char *const buffer,
ssize_t buffer_size )

Definition at line 59 of file daq_parser.cpp.

60{
61 if (is_infoword(buffer))
62 {
63 std::cout << "InfoWord: yes\n"
64 << *static_cast<const InfoWord* const>(static_cast<const void* const>(
65 buffer))
66 << '\n';
67 }
68 else
69 {
70 std::cout << "InfoWord: no\n";
71 }
72}
bool is_infoword(const void *const data)
Definition infoword.hh:93

◆ print_summary()

void print_summary ( hit_t const *const hits,
std::size_t nhits )

Definition at line 74 of file daq_parser.cpp.

75{
76 int wrong = 0;
77 std::vector<int> summary(31, 0);
78 for (unsigned i = 0; i < nhits; ++i) {
79 if (hits[i].channel < 0 || hits[i].channel > 30) {
80 ++wrong;
81 } else {
82 ++summary[hits[i].channel];
83 }
84 }
85
86 int const n = terminal_width > 11 ? terminal_width / 11 : 1;
87
88 for (unsigned i = 0; i < summary.size(); ++i) {
89 std::cout << "CH" << std::setfill('0') << std::setw(2) << i
90 << ": " << std::setfill(' ') << std::setw(4) << summary[i] << ' ';
91
92 if ((i + 1) % n == 0) {
93 std::cout << '\n';
94 }
95 }
96
97 std::cout << '\n';
98
99 if (wrong) {
100 std::cout << "wrong channels: " << wrong << '\n';
101 }
102}
const int n
Definition JPolint.hh:791

◆ print_optical_data()

void print_optical_data ( const char *const buffer,
ssize_t buffer_size )

Definition at line 104 of file daq_parser.cpp.

105{
106 const unsigned int nhits = buffer_size / sizeof(hit_t);
107
108 std::cout << "Number of hits: " << nhits << '\n';
109
110 const hit_t* const hits = static_cast<const hit_t* const>(
111 static_cast<const void* const>(buffer)
112 );
113
114 if (nhits) {
115 const int printing = 20 > nhits ? nhits : 20;
116 const unsigned int n = terminal_width > 37 ? terminal_width / 37 : 1;
117
118 for (int i = 0; i < printing; ++i)
119 {
120 std::cout << "Hit"
121 << std::setfill('0') << std::setw(2)
122 << i
123 << ": "
124 << hits[i] << ' ';
125
126 if ((i + 1) % n == 0)
127 {
128 std::cout << '\n';
129 }
130 else
131 {
132 std::cout << "| ";
133 }
134 }
135 }
136 std::cout << '\n';
137
138 print_summary(hits, nhits);
139}
static const size_t buffer_size
void print_summary(hit_t const *const hits, std::size_t nhits)
const char *const hit_t
Definition io_ascii.hh:24

◆ parseData()

void parseData ( std::istream & stream)

Definition at line 141 of file daq_parser.cpp.

142{
143 int count = 0;
144 std::vector<char> payload;
145
146 while (stream)
147 {
148 DAQCommonHeader header;
149 stream.read((char*) &header, sizeof(header));
150
151 if (stream.gcount() != sizeof(header))
152 {
153 return;
154 }
155
156 std::cout << "Counter: " << ++count << '\n';
157 std::cout << DAQHeaderPrinter(&header) << '\n';
158
159 assert(header.FrameLength - sizeof(header) >= 0 && "Wrong frame length.");
160
161 std::size_t const payload_size = header.FrameLength - sizeof(header);
162
163 if (payload.capacity() < payload_size)
164 {
165 payload.resize(payload_size);
166 }
167
168 stream.read((char*) payload.data(), payload_size);
169
170 if (static_cast<std::size_t>(stream.gcount()) != payload_size)
171 {
172 return;
173 }
174
175 if (header.DataType == ttdc) {
176 print_optical_data(payload.data(), payload_size);
177 } else if (header.DataType == taes) {
178 print_acoustic_data(payload.data(), payload_size);
179 } else {
180 std::cout << "Unknown data type\n";
181 }
182
183 std::cout << ' ' << std::string((terminal_width > 3 ? terminal_width - 2 : 1), '=') << " \n";
184 }
185}
static const unsigned int taes
void print_acoustic_data(const char *const buffer, ssize_t buffer_size)
static const unsigned int ttdc
void print_optical_data(const char *const buffer, ssize_t buffer_size)

◆ main()

int main ( int argc,
char * argv[] )

Definition at line 187 of file daq_parser.cpp.

188{
189 if (argc > 1)
190 {
191 if (strcmp(argv[1], "-h") == 0)
192 {
193 std::cout << "Usage: " << argv[0] << " [-h] [filename]\n"
194 << "Options:\n"
195 << "-h shows this help\n"
196 << "filename: if specified reads from file, otherwise stdin is used\n";
197 return 0;
198 }
199 }
200
201 // Initialise the terminal_width global variable
203
204 // Set the signal callback funciton for signal 28 (SIGWINCH, window changed)
205 signal(SIGWINCH, sig_term_change);
206
207 if (argc == 1)
208 {
209 parseData(std::cin);
210 }
211 else
212 {
213 std::ifstream input_file(argv[1], std::ios::binary);
214 parseData(input_file);
215 }
216}
void parseData(std::istream &stream)
void sig_term_change(int)

Variable Documentation

◆ ttdc

const unsigned int ttdc = 1414808643
static
Author
cpellegrino

Definition at line 18 of file daq_parser.cpp.

◆ taes

const unsigned int taes = 1413563731
static

Definition at line 19 of file daq_parser.cpp.

◆ terminal_width

int terminal_width
static

Definition at line 21 of file daq_parser.cpp.