sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
wavedesc.h
Go to the documentation of this file.
1#pragma once
2#include "waveutils.h"
3
4struct __attribute((packed)) WAVEDESC_t {
5 char INITIAL_CRAP[21];
6 char DESCRIPTOR_NAME[16];
7 char TEMPLATE_NAME[16];
8 short COMM_TYPE;
9 short COMM_ORDER;
10 int WAVE_DESCRIPTOR;
11 int USER_TEXT;
12 int RES_DESC1;
13 int TRIGTIME_ARRAY;
14 int RIS_TIME_ARRAY;
15 int RES_ARRAY1;
16 int WAVE_ARRAY_1;
17 int WAVE_ARRAY_2;
18 int RES_ARRAY2;
19 int RES_ARRAY3;
20 char INSTRUMENT_NAME[16];
21 int INSTRUMENT_NUMBER;
22 char TRACE_LABEL[16];
23 short RESERVED1;
24 short RESERVED2;
25 int WAVE_ARRAY_COUNT;
26 int PNTS_PER_SCREEN;
27 int FIRST_VALID_PNT;
28 int LAST_VALID_PNT;
29 int FIRST_POINT;
30 int SPARSING_FACTOR;
31 int SEGMENT_INDEX;
32 int SUBARRAY_COUNT;
33 int SWEEPS_PER_ACQ;
34 short POINTS_PER_PAIR;
35 short PAIR_OFFSET;
36 float VERTICAL_GAIN;
37 float VERTICAL_OFFSET;
38 float MAX_VALUE;
39 float MIN_VALUE;
40 short NOMINAL_BITS;
41 short NOM_SUBARRAY_COUNT;
42 float HORIZ_INTERVAL;
43 double HORIZ_OFFSET;
44 double PIXEL_OFFSET;
45 char VERTUNIT[48];
46 char HORIZUNIT[48];
47 float HORIZ_UNCERTAINTY;
48 double TRIGGER_TIME_seconds;
49 char TRIGGER_TIME_minutes;
50 char TRIGGER_TIME_hours;
51 char TRIGGER_TIME_days;
52 char TRIGGER_TIME_months;
53 short TRIGGER_TIME_year;
54 short TRIGGER_TIME_unused;
55 float ACQ_DURATION;
56 short RECORD_TYPE;
57 short PROCESSING_DONE;
58 short RESERVED5;
59 short RIS_SWEEPS;
60 short TIMEBASE;
61 short VERT_COUPLING;
62 float PROBE_ATT;
63 short FIXED_VERT_GAIN;
64 short BANDWIDTH_LIMIT;
65 float VERTICAL_VERNIER;
66 float ACQ_VERT_OFFSET;
67 short WAVE_SOURCE;
68 char TERMINATOR;
69};
70
71void
72WAVEDESC_dump(WAVEDESC_t WAVEDESC)
73{
74 std::cout << "DECRIPTOR_NAME: " << WAVEDESC.DESCRIPTOR_NAME << std::endl;
75 std::cout << "TEMPLATE_NAME: " << WAVEDESC.TEMPLATE_NAME << std::endl;
76 std::cout << "COMM_TYPE: " << WAVEDESC.COMM_TYPE << std::endl;
77 std::cout << "COMM_ORDER: " << WAVEDESC.COMM_ORDER << std::endl;
78 std::cout << "WAVE_DESCRIPTOR: " << WAVEDESC.WAVE_DESCRIPTOR << std::endl;
79 std::cout << "USER_TEXT: " << WAVEDESC.USER_TEXT << std::endl;
80 std::cout << "RES_DESC1: " << WAVEDESC.RES_DESC1 << std::endl;
81 std::cout << "TRIGTIME_ARRAY: " << WAVEDESC.TRIGTIME_ARRAY << std::endl;
82 std::cout << "RIS_TIME_ARRAY: " << WAVEDESC.RIS_TIME_ARRAY << std::endl;
83 std::cout << "RES_ARRAY1: " << WAVEDESC.RES_ARRAY1 << std::endl;
84 std::cout << "WAVE_ARRAY_1: " << WAVEDESC.WAVE_ARRAY_1 << std::endl;
85 std::cout << "WAVE_ARRAY_2: " << WAVEDESC.WAVE_ARRAY_2 << std::endl;
86 std::cout << "RES_ARRAY2: " << WAVEDESC.RES_ARRAY2 << std::endl;
87 std::cout << "RES_ARRAY3: " << WAVEDESC.RES_ARRAY3 << std::endl;
88 std::cout << "INSTRUMENT_NAME: " << WAVEDESC.INSTRUMENT_NAME << std::endl;
89 std::cout << "INSTRUMENT_NUMBER: " << WAVEDESC.INSTRUMENT_NUMBER << std::endl;
90 std::cout << "TRACE_LABEL: " << WAVEDESC.TRACE_LABEL << std::endl;
91 std::cout << "RESERVED1: " << WAVEDESC.RESERVED1 << std::endl;
92 std::cout << "RESERVED2: " << WAVEDESC.RESERVED2 << std::endl;
93 std::cout << "WAVE_ARRAY_COUNT: " << WAVEDESC.WAVE_ARRAY_COUNT << std::endl;
94 std::cout << "PNTS_PER_SCREEN: " << WAVEDESC.PNTS_PER_SCREEN << std::endl;
95 std::cout << "FIRST_VALID_PNT: " << WAVEDESC.FIRST_VALID_PNT << std::endl;
96 std::cout << "LAST_VALID_PNT: " << WAVEDESC.LAST_VALID_PNT << std::endl;
97 std::cout << "FIRST_POINT: " << WAVEDESC.FIRST_POINT << std::endl;
98 std::cout << "SPARSING_FACTOR: " << WAVEDESC.SPARSING_FACTOR << std::endl;
99 std::cout << "SEGMENT_INDEX: " << WAVEDESC.SEGMENT_INDEX << std::endl;
100 std::cout << "SUBARRAY_COUNT: " << WAVEDESC.SUBARRAY_COUNT << std::endl;
101 std::cout << "SWEEPS_PER_ACQ: " << WAVEDESC.SWEEPS_PER_ACQ << std::endl;
102 std::cout << "POINTS_PER_PAIR: " << WAVEDESC.POINTS_PER_PAIR << std::endl;
103 std::cout << "PAIR_OFFSET: " << WAVEDESC.PAIR_OFFSET << std::endl;
104 std::cout << "VERTICAL_GAIN: " << WAVEDESC.VERTICAL_GAIN << std::endl;
105 std::cout << "VERTICAL_OFFSET: " << WAVEDESC.VERTICAL_OFFSET << std::endl;
106 std::cout << "MAX_VALUE: " << WAVEDESC.MAX_VALUE << std::endl;
107 std::cout << "MIN_VALUE: " << WAVEDESC.MIN_VALUE << std::endl;
108 std::cout << "NOMINAL_BITS: " << WAVEDESC.NOMINAL_BITS << std::endl;
109 std::cout << "NOM_SUBARRAY_COUNT: " << WAVEDESC.NOM_SUBARRAY_COUNT << std::endl;
110 std::cout << "HORIZ_INTERVAL: " << WAVEDESC.HORIZ_INTERVAL << std::endl;
111 std::cout << "HORIZ_OFFSET: " << WAVEDESC.HORIZ_OFFSET << std::endl;
112 std::cout << "PIXEL_OFFSET: " << WAVEDESC.PIXEL_OFFSET << std::endl;
113 std::cout << "VERTUNIT: " << WAVEDESC.VERTUNIT << std::endl;
114 std::cout << "HORIZUNIT: " << WAVEDESC.HORIZUNIT << std::endl;
115 std::cout << "HORIZ_UNCERTAINTY: " << WAVEDESC.HORIZ_UNCERTAINTY << std::endl;
116 std::cout << "TRIGGER_TIME_seconds: " << WAVEDESC.TRIGGER_TIME_seconds << std::endl;
117 std::cout << "TRIGGER_TIME_minutes: " << WAVEDESC.TRIGGER_TIME_minutes << std::endl;
118 std::cout << "TRIGGER_TIME_hours: " << WAVEDESC.TRIGGER_TIME_hours << std::endl;
119 std::cout << "TRIGGER_TIME_days: " << WAVEDESC.TRIGGER_TIME_days << std::endl;
120 std::cout << "TRIGGER_TIME_months: " << WAVEDESC.TRIGGER_TIME_months << std::endl;
121 std::cout << "TRIGGER_TIME_year: " << WAVEDESC.TRIGGER_TIME_year << std::endl;
122 std::cout << "TRIGGER_TIME_unused: " << WAVEDESC.TRIGGER_TIME_unused << std::endl;
123 std::cout << "ACQ_DURATION: " << WAVEDESC.ACQ_DURATION << std::endl;
124 std::cout << "RECORD_TYPE: " << WAVEDESC.RECORD_TYPE << std::endl;
125 std::cout << "PROCESSING_DONE: " << WAVEDESC.PROCESSING_DONE << std::endl;
126 std::cout << "RESERVED5: " << WAVEDESC.RESERVED5 << std::endl;
127 std::cout << "RIS_SWEEPS: " << WAVEDESC.RIS_SWEEPS << std::endl;
128 std::cout << "TIMEBASE: " << WAVEDESC.TIMEBASE << std::endl;
129 std::cout << "VERT_COUPLING: " << WAVEDESC.VERT_COUPLING << std::endl;
130 std::cout << "PROBE_ATT: " << WAVEDESC.PROBE_ATT << std::endl;
131 std::cout << "FIXED_VERT_GAIN: " << WAVEDESC.FIXED_VERT_GAIN << std::endl;
132 std::cout << "BANDWIDTH_LIMIT: " << WAVEDESC.BANDWIDTH_LIMIT << std::endl;
133 std::cout << "VERTICAL_VERNIER: " << WAVEDESC.VERTICAL_VERNIER << std::endl;
134 std::cout << "ACQ_VERT_OFFSET: " << WAVEDESC.ACQ_VERT_OFFSET << std::endl;
135 std::cout << "WAVE_SOURCE: " << WAVEDESC.WAVE_SOURCE << std::endl;
136}
137
139{
140
141 public:
142 waveform(std::string filename);
143 void rewind();
144 bool next();
145 TGraph get_graph() { return graph; };
146 std::vector<float> get_transitions(float threshold, float sign);
147 float get_amplitude(float tmin, float tmax);
148
149 private:
150 std::ifstream file;
151 WAVEDESC_t WAVEDESC;
152 char DATA[1048576];
153 TGraph graph;
154
155};
156
157waveform::waveform(std::string filename)
158{
159 file.open(filename, std::ios::binary);
160}
161
162void
164{
165 file.clear();
166 file.seekg(0);
167}
168
169bool
171{
172 graph.Set(0);
173 file.read((char *)&WAVEDESC, sizeof(WAVEDESC));
174 if (file.eof()) return false;
175 file.read((char *)&DATA, WAVEDESC.WAVE_ARRAY_1);
176 for (int i = WAVEDESC.FIRST_VALID_PNT; i < WAVEDESC.LAST_VALID_PNT; ++i) {
177 double x = (WAVEDESC.HORIZ_INTERVAL * i + WAVEDESC.HORIZ_OFFSET) * 1.e9;
178 double y = (WAVEDESC.VERTICAL_GAIN * DATA[i] - WAVEDESC.VERTICAL_OFFSET) * 1.e3;
179 graph.SetPoint(i, x, y);
180 }
181 return true;
182}
183
184float
185waveform::get_amplitude(float tmin, float tmax)
186{
187 float amp = 0.;
188 for (int i = 0; i < graph.GetN(); ++i) {
189 if (graph.GetX()[i] > tmin && graph.GetX()[i] < tmax && graph.GetY()[i] > amp)
190 amp = graph.GetY()[i];
191 }
192 return amp;
193}
194
195std::vector<float>
197{
198 std::vector<float> values;
199 bool armed = false;
200 for (int i = 0; i < graph.GetN(); ++i) {
201 if (!armed && sign * graph.GetY()[i] > sign * threshold * 0.5)
202 continue;
203 armed = true;
204 if (sign * graph.GetY()[i] < sign * threshold)
205 continue;
206 values.push_back(graph.GetX()[i]);
207 armed = false;
208 }
209 return values;
210}
Definition wavedesc.h:139
std::vector< float > get_transitions(float threshold, float sign)
Definition wavedesc.h:196
float get_amplitude(float tmin, float tmax)
Definition wavedesc.h:185
waveform(std::string filename)
Definition wavedesc.h:157
void rewind()
Definition wavedesc.h:163
bool next()
Definition wavedesc.h:170
TGraph get_graph()
Definition wavedesc.h:145
float threshold
Definition my_test_macro_for_WF_fitting.C:6
void WAVEDESC_dump(WAVEDESC_t WAVEDESC)
Definition wavedesc.h:72
struct __attribute((packed)) WAVEDESC_t
Definition wavedesc.h:4