sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
database.C
Go to the documentation of this file.
1#include <iostream>
2#include <map>
3#include <string>
4#include <iomanip>
5#include <sstream>
6#include <fstream>
7#include "TROOT.h"
8#include "TFile.h"
9#include "TStyle.h"
10#include "TApplication.h"
11#include "TProfile.h"
12#include "TLatex.h"
13#include "TTree.h"
14#include "TF1.h"
15#include "TH1F.h"
16#include "TH2F.h"
17#include "TH3F.h"
18#include "TGraphErrors.h"
19#include "TCanvas.h"
20#include "TVirtualFitter.h"
21#include "make_iv_scan.C"
22#include "ureadout_dcr_get.C"
23#include "../utils/graphutils.C"
24
25namespace database
26{
27 // --- Constants ---
28 // Physics constants
29 const double k_boltz_eV = 8.617333262 * 1.e-5; // eV K^{-1}
30 const double k_boltz_J = 1.380649 * 1.e-23; // J K^{-1}
31 //
32 // --- Sensors oriented quantities ---
33 // All sensors
34 std::vector<std::string> sensors_full = {"HPK S13360-3050VS", "HPK S13360-3075VS", "HPK S14161-3050HS"};
35 std::vector<std::string> sensors_short = {"S13361_3050", "S13361_3075", "S14161_3050"};
36 //
37 // Board oriented quantities
38 // --- All available boards
39 std::vector<std::string> all_boards = {
40 "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
41 "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
42 "31", "32", "33", "34"};
43 std::unordered_map<std::string, std::vector<std::string>> standard_status_to_boards = {
44 {"NEW", all_boards},
45 {"TIFPA-IRR1", {"1", "2", "13", "14", "15", "16"}},
46 {"LNL-IRR1", {"21", "22", "23", "24", "25"}},
47 {"TIFPA-OANN", {"2"}}};
48 std::unordered_map<std::string, std::string> standard_status_to_status = {
49 {"NEW", "NEW"},
50 {"TIFPA-IRR1", "TIFPA-IRR1"},
51 {"LNL-IRR1", "LNL-IRR1"},
52 {"TIFPA-OANN", "OANN-150-150h"}};
53 // --- Board to status
54 // --- --- { Board, Status list }
55 std::unordered_map<std::string, std::vector<std::string>> board_to_status_list; // TBI: Fill it reading from the database
56 //
57 // Channel oriented quantities
58 // --- All available channels
59 std::vector<std::string> all_channels = {
60 "A1", "A2", "A3", "A4",
61 "B1", "B2", "B3", "B4",
62 "C1", "C2", "C3", "C4"};
63 // --- Channel to sensor
64 // --- --- { Channels, Sensor }
65 std::unordered_map<std::string, std::string> channel_to_sensor = {
66 {"A1", "HPK S13360-3050VS"},
67 {"A2", "HPK S13360-3050VS"},
68 {"A3", "HPK S13360-3050VS"},
69 {"A4", "HPK S13360-3050VS"},
70 {"B1", "HPK S13360-3075VS"},
71 {"B2", "HPK S13360-3075VS"},
72 {"B3", "HPK S13360-3075VS"},
73 {"B4", "HPK S13360-3075VS"},
74 {"C1", "HPK S14161-3050HS"},
75 {"C2", "HPK S14161-3050HS"},
76 {"C3", "HPK S14161-3050HS"},
77 {"C4", "HPK S14161-3050HS"}};
78 std::unordered_map<std::string, std::string> channel_to_sensor_short = {
79 {"A1", "S13361_3050"},
80 {"A2", "S13361_3050"},
81 {"A3", "S13361_3050"},
82 {"A4", "S13361_3050"},
83 {"B1", "S13361_3075"},
84 {"B2", "S13361_3075"},
85 {"B3", "S13361_3075"},
86 {"B4", "S13361_3075"},
87 {"C1", "S14161_3050"},
88 {"C2", "S14161_3050"},
89 {"C3", "S14161_3050"},
90 {"C4", "S14161_3050"}};
91 // --- Sensor to channels
92 // --- --- { Sensor, Channels }
93 std::unordered_map<std::string, std::vector<std::string>> sensor_to_channels = {
94 {"HPK S13360-3050VS", {"A1", "A2", "A3", "A4"}},
95 {"HPK S13360-3075VS", {"B1", "B2", "B3", "B4"}},
96 {"HPK S14161-3050HS", {"C1", "C2", "C3", "C4"}}};
97 std::unordered_map<std::string, std::vector<std::string>> sensor_short_to_channels = {
98 {"S13361_3050", {"A1", "A2", "A3", "A4"}},
99 {"S13361_3075", {"B1", "B2", "B3", "B4"}},
100 {"S14161_3050", {"C1", "C2", "C3", "C4"}}};
101 //
102 // Status oriented quantities
103 // --- All available statuses
104 std::vector<std::string> all_statuses = {
105 "NEW", // New State
106 "TIFPA-IRR1", "TIFPA-IRR1on", // Irradiated
107 "SANN-100-30m", "SANN-100-2.5h", "SANN-100-24h", // First cycle of fwd/rev annealing
108 "SANN-125-30m", "SANN-125-2.5h", "SANN-125-24h", // Second cycle of fwd/rev annealing
109 "SANN-150-30m", "SANN-150-2.5h", "SANN-150-24h", "SANN-150-73h", "SANN-150-250h", // Third cycle of fwd/rev annealing
110 "PANN1", "PANN2", "PANN3", "PANN3x", // Preventive annealing
111 "TEMP313", "TEMP303", "TEMP293", "TEMP283", "TEMP278", "TEMP273", "TEMP263", "TEMP253"}; // Temperature Vbd Scan
112 std::vector<std::string> TScan_statuses = {
113 "TEMP303", "TEMP293", "TEMP283", "TEMP278", "TEMP273", "TEMP263", "TEMP253"};
114 // --- Status to annealing time
115 // --- --- { Status, Time (min) }
116 std::unordered_map<std::string, double> status_to_annealing_time = {
117 {"NEW", -1}, // New sensors
118 {"TIFPA-IRR1", 0}, // Irradiated sensors
119 {"TIFPA-IRR1-ON", 158.3}, // Online annealing -> Fix in the database.txt
120 {"SANN-100-30m", 30}, // Self annealing @100C
121 {"SANN-100-2.5h", 180},
122 {"SANN-100-24h", 1620},
123 {"SANN-125-30m", 1650}, // Self annealing @125C
124 {"SANN-125-2.5h", 1830},
125 {"SANN-125-24h", 3240},
126 {"SANN-150-30m", 3270}, // Self annealing @150C
127 {"SANN-150-2.5h", 3450},
128 {"SANN-150-24h", 4860},
129 {"SANN-150-73h", 9240},
130 {"SANN-150-250h", 24240},
131 {"SANN-175-30m", 24270},
132 {"PANN1", 9000}, // Preventive annealing @150C
133 {"PANN2", 18000},
134 {"PANN3", 9000},
135 {"PANN3x", 27000}};
136 // --- Status to temperature
137 std::unordered_map<std::string, int> status_to_color = {
138 {"NEW", kAzure - 3},
139 {"TIFPA-IRR1", kGreen + 2},
140 {"TIFPA-IRR2", kGreen - 3},
141 {"LNL-IRR1", kSpring - 7},
142 {"LNL-IRR2", kGreen - 5},
143 {"GIF-IRR1", kOrange},
144 {"OANN-150-150h", kRed - 3}};
145 std::unordered_map<std::string, int> status_to_marker = {
146 {"NEW", 20},
147 {"TIFPA-IRR1", 20},
148 {"GIF-IRR1", 20},
149 {"LNL-IRR1", 21},
150 {"LNL-IRR2", 21},
151 {"OANN-150-150h", 20}};
152 //
153 // Sensor oriented quantities
154 std::vector<std::string> all_sensors = {
155 "HPK S13360-3050VS",
156 "HPK S13360-3075VS",
157 "HPK S14161-3050HS"};
158 std::unordered_map<std::string, int> sensor_to_color = {
159 {"HPK S13360-3050VS", kRed},
160 {"HPK S13360-3075VS", kGreen - 2},
161 {"HPK S14161-3050HS", kAzure - 3}};
162 std::unordered_map<std::string, int> sensor_to_marker = {
163 {"HPK S13360-3050VS", 20},
164 {"HPK S13360-3075VS", 21},
165 {"HPK S14161-3050HS", 29}};
166 std::unordered_map<std::string, std::string> sensor_to_code = {
167 {"HPK S13360-3050VS", "HPK_13_50"},
168 {"HPK S13360-3075VS", "HPK_13_75"},
169 {"HPK S14161-3050HS", "HPK_14_50"}};
170 std::unordered_map<std::string, std::string> code_to_sensor = {
171 {"HPK_13_50", "HPK S13360-3050VS"},
172 {"HPK_13_75", "HPK S13360-3075VS"},
173 {"HPK_14_50", "HPK S14161-3050HS"}};
174 std::unordered_map<std::string, float> sensor_to_vbd = {
175 {"HPK S13360-3050VS", 48.4},
176 {"HPK S13360-3075VS", 47.9},
177 {"HPK S14161-3050HS", 36.5}};
178 std::unordered_map<std::string, float> sensor_to_vbd_Tdep = {
179 {"HPK S13360-3050VS", 0.054},
180 {"HPK S13360-3075VS", 0.054},
181 {"HPK S14161-3050HS", 0.034}};
182 std::unordered_map<std::string, float> DTS_PDE = {
183 {"HPK S13360-3050VS", 0.4},
184 {"HPK S13360-3075VS", 0.5},
185 {"HPK S14161-3050HS", 0.5}};
186 std::unordered_map<std::string, float> DTS_OVop = {
187 {"HPK S13360-3050VS", 3.},
188 {"HPK S13360-3075VS", 3.},
189 {"HPK S14161-3050HS", 2.7}};
190 std::vector<float> standard_overvoltage_points = {
191 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0};
192 //
193 // --- Utility data structures ---
194 // --- Data structure in database reference
195 std::vector<std::string> fields = {
196 "run", "quality", "step", "setup", "iv-mux-1", "iv-mux-2", "dcr-chip-2", "dcr-chip-3"};
197 std::vector<std::string> criteria = {
198 "run", "quality", "step", "setup", "iv-mux-1", "iv-mux-2", "dcr-chip-2", "dcr-chip-3", "temp", "ann-temp", "ann-time"};
199 // --- Global variables
200 std::string basedir = ".";
201 // --- Board, Channel, Status, Curve (IV, DCR, Gain)
202 std::unordered_map<std::string, std::unordered_map<std::string, std::unordered_map<std::string, std::unordered_map<std::string, TGraphErrors *>>>> cache_memory;
203 // --- Board, Status, Information (set-up, mux, dcr-chip )
204 std::unordered_map<std::string, std::unordered_map<std::string, std::unordered_map<std::string, std::vector<std::string>>>> database_memory;
205 // --- TGraph creation
206 using mkgraph_data_structure = std::unordered_map<std::array<float, 2>, std::vector<std::array<float, 2>>>;
207 //
208 // --- Declarations ---
209 // --- I/O
210 void read_database(std::string fname);
211 // --- Getters
212 TGraphErrors *get_iv_scan(std::string board, std::string channel, std::string step, int marker = 1, int color = 1);
213 TGraphErrors *get_dcr_vbias_scan(std::string board, std::string channel, std::string step, int marker = 1, int color = 1);
214 TGraphErrors *get_dcr_threshold_scan(std::string board, std::string channel, std::string step, int marker = 1, int color = 1);
215 TGraphErrors *get_gain(std::string board, std::string channel, std::string step, int marker = 1, int color = 1);
216 std::array<float, 2> get_cross_talk(std::string board, std::string channel, std::string step, std::string check_name = "");
217 TGraphErrors *get_iv_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker = 1, int color = 1);
218 TGraphErrors *get_dcr_vbias_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker = 1, int color = 1);
219 TGraphErrors *get_dcr_threshold_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker = 1, int color = 1);
220 TGraphErrors *get_gain(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker = 1, int color = 1);
221 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
222 std::array<float, 2>
223 get_Yvalue_at_X(std::string board, std::string channel, std::string step, float target_voltage);
224 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
225 std::array<float, 2>
226 get_value_at_overvoltage(std::string board, std::string channel, std::string step, float target_overvoltage);
227 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
228 std::vector<std::array<float, 2>>
229 get_all_values_at_overvoltage(std::string board, std::string sensor, std::string step, float target_overvoltage);
230 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
231 std::vector<std::array<float, 2>>
232 get_all_values_at_overvoltage(std::vector<std::string> boards, std::string sensor, std::string step, float target_overvoltage);
233 std::unordered_map<std::string, std::string>
234 get_filename(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters = {{}});
235 std::string
236 get_database_info(std::string board, std::string step, std::string info);
237 std::vector<std::array<std::string, 2>> get_board_step_history(std::string board, bool is_dcr = false, bool return_runlist = false)
238 {
239 std::vector<std::array<std::string, 2>> result;
241 {
242 if ((all_infos.find("quality") != all_infos.end()) && all_infos["quality"][0] == "good")
243 if ((is_dcr ? all_infos.find("dcr-run") != all_infos.end() : all_infos.find("iv-run") != all_infos.end()) && ((is_dcr ? all_infos["dcr-run"][0] : all_infos["iv-run"][0]) != ""))
244 result.push_back({current_status, is_dcr ? all_infos["dcr-run"][0] : all_infos["iv-run"][0]});
245 }
246 std::sort(result.begin(), result.end(), [](const auto &a, const auto &b)
247 { return a[1] < b[1]; });
248 return result;
249 }
250
251 // Setters
252 template <typename target_type>
254 {
255 // Line qualities
256 target->SetLineColor(marker_color);
257 target->SetLineStyle(kSolid);
258 target->SetLineWidth(2);
259 // Marker qualities
260 target->SetMarkerColor(marker_color);
261 target->SetMarkerStyle(marker_style);
262 target->SetMarkerSize(2);
263 // Fill qualities
264 target->SetFillStyle(0);
265 target->SetFillColor(marker_color);
266 }
267
268 // --- Quality assurance
269 void check_all_plots_loaded();
270 bool check_iv_goodness(TGraphErrors *gTarget);
271
272 // Calculations
273 std::array<float, 2> measure_cross_talk(TGraphErrors *gTarget, std::string plot_name = "");
274 std::array<float, 2> measure_signal_amp(TGraphErrors *gTarget, std::string plot_name = "");
275 std::array<float, 2> measure_fraction_of_damage(std::array<float, 2> target_step, std::array<float, 2> new_reference, std::array<float, 2> maximum_reference);
276
277 // Utilities
278 std::vector<TGraphErrors *> make_graph(mkgraph_data_structure data_structure);
279 void set_multi_graph(std::vector<TGraphErrors *> &target_graphs, int target_color, int target_marker);
280 std::array<float, 2> measure_average(std::vector<std::array<float, 2>> measurements, bool use_rms = false);
281
282 // Implementations
283 // --- I/O
285 {
286 // Start reading the file
287 std::ifstream data_stream(database_input_file);
288 std::string current_line;
289 while (std::getline(data_stream, current_line))
290 {
291 // Skip comment characters
292 if (current_line[0] == '#' || current_line[0] == ' ')
293 continue;
294 // Read database
295 std::stringstream string_in_stream(current_line);
296 std::unordered_map<std::string, std::string> data_by_field;
297 std::string current_data;
298 for (auto current_field : fields)
299 {
302 }
303 // Record IV from multiplexer 1
304 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["iv-run"].push_back(data_by_field["run"]);
305 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["iv-setup"].push_back(data_by_field["setup"]);
306 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["iv-mux"].push_back("1");
307 // Record IV from multiplexer 2
308 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["iv-run"].push_back(data_by_field["run"]);
309 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["iv-setup"].push_back(data_by_field["setup"]);
310 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["iv-mux"].push_back("2");
311 // Record DCR from chip 2
312 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["dcr-run"].push_back(data_by_field["run"]);
313 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["dcr-setup"].push_back(data_by_field["setup"]);
314 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["dcr-chip"].push_back("2");
315 // Record DCR from chip 3
316 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["dcr-run"].push_back(data_by_field["run"]);
317 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["dcr-setup"].push_back(data_by_field["setup"]);
318 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["dcr-chip"].push_back("3");
319 // Record quality
320 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["quality"].push_back(data_by_field["quality"]);
321 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["quality"].push_back(data_by_field["quality"]);
322 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["quality"].push_back(data_by_field["quality"]);
323 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["quality"].push_back(data_by_field["quality"]);
324 // Record temperature
325 std::string temperature = "243";
326 if (data_by_field["step"].find("TEMP") != std::string::npos)
327 {
328 temperature = data_by_field["step"].substr(data_by_field["step"].find("TEMP") + 4, data_by_field["step"].find("TEMP") + 7);
329 }
330 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["temp"].push_back(temperature);
331 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["temp"].push_back(temperature);
332 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["temp"].push_back(temperature);
333 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["temp"].push_back(temperature);
334 // Record annealing temperature and time
335 std::string anneal_temp = "-1";
336 std::string anneal_time = "-1";
337 if (data_by_field["step"].find("ANN") != std::string::npos)
338 {
339 std::stringstream stream;
340 // String with annealing time and temp
341 // --- Extracting temperature
342 auto temp_time_argument = data_by_field["step"].substr(data_by_field["step"].find("ANN-") + 4);
343 if ((temp_time_argument.find("-") != std::string::npos))
344 {
345 auto temp_anneal_temp = std::stof(temp_time_argument.substr(0, temp_time_argument.find("-"))) + 273;
346 stream << std::fixed << std::setprecision(0) << temp_anneal_temp;
347 anneal_temp = stream.str();
348 }
349 // --- Extracting annealing time
350 auto time = temp_time_argument.substr(temp_time_argument.find("-") + 1);
351 auto time_m = -0.5 / 60;
352 auto time_h = -0.5 / (60 * 60);
353 if ((time.find("m") != std::string::npos))
354 {
355 auto temp_time_m = time.substr(time.find_first_of("h") + 1, -time.find_first_of("h") + time.find_first_of("m") - 1);
356 time_m = std::stof(temp_time_m);
357 }
358 if ((time.find("h") != std::string::npos))
359 {
360 auto temp_time_h = time.substr(0, time.find_first_of("h"));
361 time_h = std::stof(time.substr(0, time.find_first_of("h")));
362 }
363 stream.str("");
364 stream << std::fixed << std::setprecision(0) << time_m * 60 + time_h * 60 * 60;
365 anneal_time = stream.str();
366 }
367 // Add annealing temperature to infos
368 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["ann-temp"].push_back(anneal_temp);
369 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["ann-temp"].push_back(anneal_temp);
370 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["ann-temp"].push_back(anneal_temp);
371 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["ann-temp"].push_back(anneal_temp);
372 // Add annealing time to infos
373 database_memory[data_by_field["iv-mux-1"]][data_by_field["step"]]["ann-time"].push_back(anneal_time);
374 database_memory[data_by_field["iv-mux-2"]][data_by_field["step"]]["ann-time"].push_back(anneal_time);
375 database_memory[data_by_field["dcr-chip-2"]][data_by_field["step"]]["ann-time"].push_back(anneal_time);
376 database_memory[data_by_field["dcr-chip-3"]][data_by_field["step"]]["ann-time"].push_back(anneal_time);
377 }
378 }
379
380 // --- Getters
381 // --- --- General functions
382 // --- --- --- Getters at a given X
383
384 // - F - Getter of a value at a given x, the curve is taken as a template argument
385 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
386 std::array<float, 2>
387 get_Yvalue_at_X(std::string board, std::string channel, std::string step, float target_x)
388 {
390 if (!target_curve)
391 return {-1., -1.};
393 }
394 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, std::string)>
395 std::array<float, 2>
396 get_Yvalue_at_X(std::string board, std::string channel, std::string step, float target_x)
397 {
399 if (!target_curve)
400 return {-1., -1.};
402 /*
403 TCanvas *c1 = new TCanvas();
404 target_curve->Draw("ALPE");
405 cout << board << " - " << channel << " - " << step << " - " << result[0] << " - " << result[1] << " target_x:" << target_x << endl;
406 */
407 return result;
408 }
409
410 // - F - Getter of all values for a given sensor at a given x, the curve is taken as a template argument
411 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
412 std::vector<std::array<float, 2>>
413 get_all_sensor_Yvalues_at_X(std::string board, std::string sensor, std::string step, float target_x)
414 {
415 std::vector<std::array<float, 2>> result;
416 for (auto current_channel : sensor_to_channels[sensor])
418 return result;
419 }
420
421 // - F - Getter of all values for a given sensor at a given x for all listed boards, the curve is taken as a template argument
422 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
423 std::vector<std::array<float, 2>>
424 get_all_sensor_Yvalues_at_X(std::vector<std::string> board_list, std::string sensor, std::string step, float target_x)
425 {
426 std::vector<std::array<float, 2>> result;
427 for (auto current_board : board_list)
428 for (auto current_channel : sensor_to_channels[sensor])
430 return result;
431 }
432
433 // - F - Getter of TGraphErrors with average values for a given sensor at a given list of x for all listed boards, the curve is taken as a template argument
434 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int), bool use_rms = false>
436 get_average_sensor_Yvalues_at_X(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> target_x_list)
437 {
439 for (auto current_x : target_x_list)
440 {
441 auto current_point = gResult->GetN();
443 if (current_point_y[0] < 0)
444 continue;
446 gResult->SetPointError(current_point, 0., current_point_y[1]);
447 }
448 return gResult;
449 }
450
451 // - F - Getter of TGraphErrors with average values for a given sensor at a given list of x for one board, the curve is taken as a template argument
452 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int), bool use_rms = false>
454 get_average_sensor_Yvalues_at_X(std::string board, std::string sensor, std::string step, std::vector<float> target_x_list)
455 {
457 }
458
459 /*
460 TCanvas *template_history_at_overvoltage(std::vector<std::pair<std::vector<std::string>,std::array<std::string, 2>>> step_map, float overvoltage)
461 {
462 // Canvas
463 TCanvas *c1 = new TCanvas("", "", 1800, 600);
464 c1->Divide(3, 1);
465 gStyle->SetOptStat(0);
466 TLatex *lLatex = new TLatex();
467
468 // Frame creation
469 TH1F *hframe;
470 if (!time_axis)
471 hframe = new TH1F("hframe", ";;current (A)", steps.size(), 0, steps.size());
472 else
473 hframe = new TH1F("hframe", ";;current (A)", 1000, s_ts(steps[0][1]) - 1000, s_ts(steps[steps.size() - 1][1]) + 1000);
474 hframe->SetMaximum(max);
475 hframe->SetMinimum(min);
476
477 // TGraphErrors for all sensors type
478 TGraphErrors *gSingleGraphs = new TGraphErrors[12];
479 TGraphErrors *gSummaryGraphs = new TGraphErrors[6];
480
481 // Loop over requested steps
482 auto iStep = -1;
483 for (auto current_step : steps)
484 {
485 iStep++;
486 auto iSensor = -1;
487 for (auto current_sensor : sensors_full)
488 {
489 auto current_timestamp = s_ts(current_step[1]);
490 iSensor++;
491 if (!time_axis)
492 hframe->GetXaxis()->SetBinLabel(iStep + 1, current_step[0].c_str());
493 auto current_overvoltage_values = get_all_iv_at_overvoltage(board, current_sensor, current_step[0], overvoltage);
494 auto average_overvoltage_values = measure_average(current_overvoltage_values);
495 auto average_overvoltage_valRMS = measure_average(current_overvoltage_values, true);
496 auto current_point = gSummaryGraphs[0 + iSensor * 2].GetN();
497 time_axis ? gSummaryGraphs[0 + iSensor * 2].SetPoint(current_point, current_timestamp, average_overvoltage_values[0]) : gSummaryGraphs[0 + iSensor * 2].SetPoint(current_point, 0.5 + iStep, average_overvoltage_values[0]);
498 gSummaryGraphs[0 + iSensor * 2].SetPointError(current_point, 0., average_overvoltage_values[1]);
499 time_axis ? gSummaryGraphs[0 + iSensor * 2].SetPoint(current_point, current_timestamp, average_overvoltage_valRMS[0]) : gSummaryGraphs[0 + iSensor * 2].SetPoint(current_point, 0.5 + iStep, average_overvoltage_valRMS[0]);
500 gSummaryGraphs[1 + iSensor * 2].SetPointError(current_point, 0., average_overvoltage_valRMS[1]);
501 for (auto single_sensor = 0; single_sensor < 4; single_sensor++)
502 {
503 current_point = gSingleGraphs[iSensor * 4 + single_sensor].GetN();
504 time_axis ? gSingleGraphs[iSensor * 4 + single_sensor].SetPoint(current_point, current_timestamp, current_overvoltage_values[single_sensor][0]) : gSingleGraphs[iSensor * 4 + single_sensor].SetPoint(current_point, 0.5 + iStep, current_overvoltage_values[single_sensor][0]);
505 gSingleGraphs[iSensor * 4 + single_sensor].SetPointError(current_point, 0., current_overvoltage_values[single_sensor][1]);
506 }
507 }
508 }
509 if (time_axis)
510 {
511 hframe->GetXaxis()->SetTimeDisplay(true);
512 hframe->LabelsOption("v");
513 }
514 c1->cd(1);
515 hframe->Draw();
516 gPad->SetLogy();
517 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[0].c_str());
518 lLatex->DrawLatexNDC(0.725, 0.9, Form("board #%s", board.c_str()));
519 c1->cd(2);
520 hframe->Draw();
521 gPad->SetLogy();
522 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[1].c_str());
523 c1->cd(3);
524 hframe->Draw();
525 gPad->SetLogy();
526 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[2].c_str());
527 for (auto iSns = 0; iSns < 12; iSns++)
528 {
529 gSingleGraphs[iSns].SetMarkerStyle(24);
530 gSingleGraphs[iSns].SetMarkerColor(kGray);
531 gSingleGraphs[iSns].SetLineColor(kGray);
532 c1->cd(1 + iSns / 4);
533 gSingleGraphs[iSns].Draw("samelp");
534 }
535 for (auto iSns = 0; iSns < 6; iSns++)
536 {
537 gSummaryGraphs[iSns].SetMarkerStyle(20);
538 gSummaryGraphs[iSns].SetMarkerColor(kBlack);
539 gSummaryGraphs[iSns].SetLineColor(kBlack);
540 c1->cd(1 + iSns / 2);
541 gSummaryGraphs[iSns].Draw("samelp");
542 }
543 return c1;
544 }
545 */
546
547 //
548 // --- --- --- Getters at a given overvoltage
549
550 // - F - Getter of a value at a given overvoltage, the curve is taken as a template argument
551 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
552 std::array<float, 2>
557 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, std::string)>
558 std::array<float, 2>
559 get_value_at_overvoltage(std::string board, std::string channel, std::string step, float target_overvoltage)
560 {
561 return get_Yvalue_at_X<current_curve_getter>(board, channel, step, sensor_to_vbd[channel_to_sensor[channel]] + target_overvoltage);
562 }
563
564 // - F - Getter of all values for a given sensor at a given overvoltage, the curve is taken as a template argument
565 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
566 std::vector<std::array<float, 2>>
567 get_all_values_at_overvoltage(std::string board, std::string sensor, std::string step, float target_overvoltage)
568 {
570 }
571
572 // - F - Getter of all values for a given sensor at a given overvoltage for all listed boards, the curve is taken as a template argument
573 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int)>
574 std::vector<std::array<float, 2>>
575 get_all_values_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, float target_overvoltage)
576 {
578 }
579
580 // - F - Getter of TGraphErrors with average values for a given sensor at a given list of overvoltages for all listed boards, the curve is taken as a template argument
581 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int), bool use_rms = false>
583 get_average_sensor_values_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points, int marker = kCircle, int color = kBlue)
584 {
586 current_overvoltage += sensor_to_vbd[sensor] + sensor_to_vbd_Tdep[sensor] * (std::stof(get_database_info(board_list[0], step, "temp")) - 243);
588 for (auto iPnt = 0; iPnt < result->GetN(); ++iPnt)
589 result->GetX()[iPnt] -= sensor_to_vbd[sensor] + sensor_to_vbd_Tdep[sensor] * (std::stof(get_database_info(board_list[0], step, "temp")) - 243);
590 result->SetMarkerStyle(marker);
591 result->SetMarkerColor(color);
592 return result;
593 }
594
595 // - F - Getter of TGraphErrors with average values for a given sensor at a given list of x for one board, the curve is taken as a template argument
596 template <TGraphErrors *(*current_curve_getter)(std::string, std::string, std::string, int, int), bool use_rms = false>
598 get_average_sensor_values_at_overvoltage(std::string board, std::string sensor, std::string step, std::vector<float> target_x_list, int marker = kCircle, int color = kBlue)
599 {
601 }
602
603 //
604 // --- --- IV
605
606 // - F - Main function for IV curve getter
607 TGraphErrors *get_iv_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker, int color)
608 {
609 std::string key_word = "IV";
610 // Check the IV curve has been stored
611 if (cache_memory.find(board) != cache_memory.end())
612 {
614 {
616 {
618 {
621 }
622 }
623 }
624 }
625 // Not found: we need to calculate it
627 // Database do not have the run number, return nullptr
628 if (file_name["iv"].empty() || file_name["iv-open"].empty())
629 {
630 std::cout << "[WARNING][database::get_iv_scan] Run number not found in database" << std::endl;
631 cache_memory[board][channel][step][key_word] = nullptr;
633 }
634 // Make iv scan
636 // If something went wrong, return nullptr
638 {
639 std::cout << "[WARNING][database::get_iv_scan] IV scan TGraph error" << std::endl;
640 cache_memory[board][channel][step][key_word] = nullptr;
642 }
643 // If TGraphErrors has 0 points, return nullptr
644 if (cache_memory[board][channel][step][key_word]->GetN() == 0)
645 {
646 std::cout << "[WARNING][database::get_iv_scan] IV scan TGraph has 0 points" << std::endl;
647 cache_memory[board][channel][step][key_word] = nullptr;
649 }
650 // Set requested style
652 // Return result
654 }
655
656 // - F - Simplified function for IV curve getter
658 get_iv_scan(std::string board, std::string channel, std::string step, int marker, int color)
659 {
660 return get_iv_scan(board, channel, step, {{}}, marker, color);
661 }
662
663 // - F - Get average IV over listed parameters
664 template <bool use_rms = false>
666 get_average_iv_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points, int marker = kCircle, int color = kBlue)
667 {
669 }
670
671 //
672 // --- --- DCR
673
674 // - F - Main function for DCR curve getter
676 get_dcr_vbias_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker, int color)
677 {
678 std::string key_word = "DCR_vbias";
679 // Check the DCR curve has been stored
680 if (cache_memory.find(board) != cache_memory.end())
681 {
683 {
685 {
687 {
690 }
691 }
692 }
693 }
694 // Not found: we need to calculate it
696 if (file_name["dcr-vbias"].empty())
697 {
698 std::cout << "[WARNING][database::get_dcr_vbias_scan] Run number not found in database (B: " << board << " C:" << channel << " S:" << step << ")" << std::endl;
699 cache_memory[board][channel][step][key_word] = nullptr;
701 }
702 cache_memory[board][channel][step][key_word] = ureadout_dcr_get(file_name["dcr-vbias"], "bias_voltage", "dead_rate");
704 {
705 std::cout << "[WARNING][database::get_dcr_vbias_scan] DCR vbias scan TGraph error" << std::endl;
706 cache_memory[board][channel][step][key_word] = nullptr;
708 }
709 if (cache_memory[board][channel][step][key_word]->GetN() == 0)
710 {
711 std::cout << "[WARNING][database::get_dcr_vbias_scan] DCR vbias scan TGraph has 0 points" << std::endl;
712 cache_memory[board][channel][step][key_word] = nullptr;
714 }
716 // Return result
718 }
719
720 // - F - Simplified function for DCR curve getter
721 TGraphErrors *get_dcr_vbias_scan(std::string board, std::string channel, std::string step, int marker, int color)
722 {
724 }
725
726 // - F - Get average gain over listed parameters
727 template <bool use_rms = false>
729 get_average_dcr_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points, int marker = kCircle, int color = kBlue)
730 {
732 }
733
734 //
735 // --- --- Gain
736
737 // - F - Main function for Gain curve getter
739 get_gain(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker, int color)
740 {
741 // Check the Gain curve has been stored
742 if (cache_memory.find(board) != cache_memory.end())
743 {
745 {
747 {
749 {
751 return cache_memory[board][channel][step]["Gain"];
752 }
753 }
754 }
755 }
756 // Recover IV and DCR curves
758 if (!reference_iv)
759 {
760 cache_memory[board][channel][step]["Gain"] = nullptr;
761 return cache_memory[board][channel][step]["Gain"];
762 }
763 auto current_iv = ((TGraphErrors *)(reference_iv)->Clone("current_iv"));
764 if (!current_iv)
765 {
766 cache_memory[board][channel][step]["Gain"] = nullptr;
767 return cache_memory[board][channel][step]["Gain"];
768 }
770 if (!current_dcr)
771 {
772 cache_memory[board][channel][step]["Gain"] = nullptr;
773 return cache_memory[board][channel][step]["Gain"];
774 }
775 // Subctract surface current
776 auto baseline = 0.;
777 for (int iPnt = 0; iPnt < 5; ++iPnt)
778 {
779 baseline += current_iv->GetY()[iPnt];
780 }
782 // Make ratio
784 if (!cache_memory[board][channel][step]["Gain"])
785 {
786 cache_memory[board][channel][step]["Gain"] = nullptr;
787 return cache_memory[board][channel][step]["Gain"];
788 }
789 graphutils::y_scale(cache_memory[board][channel][step]["Gain"], 1. / TMath::Qe());
790 //
791 return cache_memory[board][channel][step]["Gain"];
792 }
793
794 // - F - Simplified function for Gain curve getter
796 get_gain(std::string board, std::string channel, std::string step, int marker, int color)
797 {
798 return get_gain(board, channel, step, {{}}, marker, color);
799 }
800
801 // - F - Get gain at overvoltage
802 std::array<float, 2>
803 get_gain_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
804 {
805 return database::get_value_at_overvoltage<database::get_gain>(board, channel, step, overvoltage);
806 }
807
808 // - F - Get average gain over listed parameters
809 template <bool use_rms = false>
811 get_average_gain_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points, int marker = kCircle, int color = kBlue)
812 {
814 }
815
816 //
817 //
818 //
819 //
820 //
821 //
822 //
823 //
824 //
825 //
826 //
827 //
828 //
829 //
830 //
831 // --- SORT ME PLEASE FOR THE LOG --
832 // --- --- DCR
833 // --- --- --- Vbias
834
835 std::array<float, 2>
836 get_dcr_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
837 {
838 return database::get_value_at_overvoltage<database::get_dcr_vbias_scan>(board, channel, step, overvoltage);
839 }
840 std::vector<std::array<float, 2>>
841 get_all_dcr_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
842 {
843 return database::get_all_values_at_overvoltage<database::get_dcr_vbias_scan>(board, sensor, step, overvoltage);
844 }
845 std::vector<std::array<float, 2>>
846 get_all_dcr_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, float overvoltage)
847 {
848 std::vector<std::array<float, 2>> result;
849 for (auto current_board : board_list)
850 {
851 auto list_of_current_values = database::get_all_values_at_overvoltage<database::get_dcr_vbias_scan>(current_board, sensor, step, overvoltage);
853 result.push_back(current_value);
854 }
855 return result;
856 }
857 std::vector<std::array<float, 2>>
858 get_all_dcr_at_overvoltage(std::string sensor, std::string step, float overvoltage)
859 {
860 std::vector<std::array<float, 2>> result;
862 {
863 auto list_of_current_values = database::get_all_values_at_overvoltage<database::get_dcr_vbias_scan>(current_board, sensor, step, overvoltage);
865 result.push_back(current_value);
866 }
867 return result;
868 }
869
870 // Recover standard procedure with std::pair
871 std::tuple<float, float, float>
872 get_PDE_merit(std::vector<std::string> board_list, std::string sensor, std::string step, float window_of_acquisition = 1.)
873 {
874 std::tuple<float, float, float> result;
877 get<0>(result) = (DTS_PDE[sensor] / (dcr_avg[0] * window_of_acquisition));
878 get<1>(result) = (dcr_avg[1] / dcr_avg[0]) * (DTS_PDE[sensor] / (dcr_avg[0] * window_of_acquisition));
879 get<2>(result) = (dcr_RMS[1] / dcr_avg[0]) * (DTS_PDE[sensor] / (dcr_avg[0] * window_of_acquisition));
880 return result;
881 }
882
883 std::tuple<float, float, float>
884 get_relative_PDE_merit(std::tuple<float, float, float> target_merit, std::tuple<float, float, float> standard_merit)
885 {
886 float ref = get<0>(standard_merit);
887 std::tuple<float, float, float> result;
891 // get<1>(result) = sqrt((get<1>(target_merit) / get<0>(target_merit)) * (get<1>(target_merit) / get<0>(target_merit)) + ((get<1>(standard_merit) * get<0>(target_merit) / (get<0>(standard_merit) * get<0>(standard_merit)))) * (get<1>(standard_merit) * get<0>(target_merit) / (get<0>(standard_merit) * get<0>(standard_merit))));
892 // get<2>(result) = sqrt((get<2>(target_merit) / get<0>(target_merit)) * (get<2>(target_merit) / get<0>(target_merit)) + ((get<2>(standard_merit) * get<0>(target_merit) / (get<0>(standard_merit) * get<0>(standard_merit)))) * (get<2>(standard_merit) * get<0>(target_merit) / (get<0>(standard_merit) * get<0>(standard_merit))));
893 return result;
894 }
895
896 // Generalise
897 template <bool use_rms>
899 get_dcr_overvoltage_scan(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points)
900 {
903 {
904 auto current_point = gResult->GetN();
907 gResult->SetPointError(current_point, 0., current_point_y[1]);
908 }
909 return gResult;
910 }
911
912 std::array<float, 2>
913 get_dcr_excess_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
914 {
915 auto current_dcr = database::get_value_at_overvoltage<database::get_dcr_vbias_scan>(board, channel, step, overvoltage);
916 auto new_step_dcr = database::get_value_at_overvoltage<database::get_dcr_vbias_scan>(board, channel, "NEW", overvoltage);
917 return {current_dcr[0] - new_step_dcr[0], sqrt(current_dcr[1] * current_dcr[1] + new_step_dcr[1] * new_step_dcr[1])};
918 }
919 std::vector<std::array<float, 2>>
920 get_all_dcr_excess_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
921 {
922 std::vector<std::array<float, 2>> result;
923 auto all_current_dcr = database::get_all_values_at_overvoltage<database::get_dcr_vbias_scan>(board, sensor, step, overvoltage);
924 auto all_new_step_dcr = database::get_all_values_at_overvoltage<database::get_dcr_vbias_scan>(board, sensor, "NEW", overvoltage);
925 auto iTer = -1;
926 for (auto current_dcr : all_current_dcr)
927 {
928 iTer++;
930 result.push_back({current_dcr[0] - new_step_dcr[0], sqrt(current_dcr[1] * current_dcr[1] + new_step_dcr[1] * new_step_dcr[1])});
931 }
932 return result;
933 }
934 std::vector<std::array<float, 2>>
935 get_all_dcr_excess_at_overvoltage(std::vector<std::string> board_list, std::string sensor, std::string step, float overvoltage)
936 {
937 std::vector<std::array<float, 2>> result;
938 for (auto current_board : board_list)
939 {
942 result.push_back(current_value);
943 }
944 return result;
945 }
946 template <bool use_rms>
948 get_dcr_increase_overvoltage_scan(std::vector<std::string> board_list, std::string sensor, std::string step, std::vector<float> overvoltage_points = standard_overvoltage_points)
949 {
952 {
953 auto current_point = gResult->GetN();
956 gResult->SetPointError(current_point, 0., current_point_y[1]);
957 }
958 return gResult;
959 }
960
961 // --- --- --- Threshold
963 get_dcr_threshold_scan(std::string board, std::string channel, std::string step, int marker, int color)
964 {
966 }
968 get_dcr_threshold_scan(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters, int marker, int color)
969 {
970 std::string key_word = "DCR_threshold";
971 // Check the DCR curve has been stored
972 if (cache_memory.find(board) != cache_memory.end())
973 {
975 {
977 {
979 {
982 }
983 }
984 }
985 }
986 // Not found: we need to calculate it
988 if (file_name["dcr-threshold"].empty())
989 {
990 std::cout << "[WARNING][database::get_dcr_threshold_scan] Run number not found in database" << std::endl;
991 cache_memory[board][channel][step][key_word] = nullptr;
993 }
994 cache_memory[board][channel][step][key_word] = ureadout_dcr_get(file_name["dcr-threshold"], "threshold", "dead_rate");
996 {
997 std::cout << "[WARNING][database::get_dcr_threshold_scan] DCR threshold scan TGraph error" << std::endl;
998 cache_memory[board][channel][step][key_word] = nullptr;
1000 }
1001 if (cache_memory[board][channel][step][key_word]->GetN() == 0)
1002 {
1003 std::cout << "[WARNING][database::get_dcr_threshold_scan] DCR threshold scan TGraph has 0 points" << std::endl;
1004 cache_memory[board][channel][step][key_word] = nullptr;
1006 }
1008 // Return result
1010 }
1011
1012 // --- --- IV
1013
1014 // --- --- --- Vbias
1015 std::array<float, 2>
1016 get_iv_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
1017 {
1018 return database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, step, overvoltage);
1019 }
1020 std::vector<std::array<float, 2>>
1021 get_all_iv_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
1022 {
1023 return database::get_all_values_at_overvoltage<database::get_iv_scan>(board, sensor, step, overvoltage);
1024 }
1025 std::array<float, 2>
1026 get_iv_excess_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
1027 {
1028 auto current_dcr = database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, step, overvoltage);
1029 auto new_step_dcr = database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, "NEW", overvoltage);
1030 return {current_dcr[0] - new_step_dcr[0], sqrt(current_dcr[1] * current_dcr[1] + new_step_dcr[1] * new_step_dcr[1])};
1031 }
1032
1033 std::vector<std::array<float, 2>>
1034 get_all_iv_excess_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
1035 {
1036 std::vector<std::array<float, 2>> result;
1037 auto all_current_dcr = database::get_all_values_at_overvoltage<database::get_iv_scan>(board, sensor, step, overvoltage);
1038 auto all_new_step_dcr = database::get_all_values_at_overvoltage<database::get_iv_scan>(board, sensor, "NEW", overvoltage);
1039 auto iTer = -1;
1040 for (auto current_dcr : all_current_dcr)
1041 {
1042 iTer++;
1044 result.push_back({current_dcr[0] - new_step_dcr[0], sqrt(current_dcr[1] * current_dcr[1] + new_step_dcr[1] * new_step_dcr[1])});
1045 }
1046 return result;
1047 }
1048
1049 std::array<float, 2>
1050 get_iv_FOD_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage, std::string max_damage_step = "TIFPA-IRR1", std::string new_step = "NEW")
1051 {
1052 auto current_iv = database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, step, overvoltage);
1053 auto baselin_iv = database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, new_step, overvoltage);
1054 auto max_dmg_iv = database::get_value_at_overvoltage<database::get_iv_scan>(board, channel, max_damage_step, overvoltage);
1056 }
1057
1058 TCanvas *
1059 get_history_iv_at_overvoltage(std::string board, std::vector<std::array<std::string, 2>> steps, float overvoltage, bool time_axis = true, float min = 1.e-10, float max = 1.e-5)
1060 {
1061 // Canvas
1062 TCanvas *c1 = new TCanvas("", "", 1800, 600);
1063 c1->Divide(3, 1);
1064 gStyle->SetOptStat(0);
1065 TLatex *lLatex = new TLatex();
1066
1067 // Frame creation
1068 TH1F *hframe;
1069 if (!time_axis)
1070 hframe = new TH1F("hframe", ";;current (A)", steps.size(), 0, steps.size());
1071 else
1072 hframe = new TH1F("hframe", ";;current (A)", 5, s_ts(steps[0][1]) - 1000, s_ts(steps[steps.size() - 1][1]) + 1000);
1073 hframe->SetMaximum(max);
1074 hframe->SetMinimum(min);
1075
1076 // TGraphErrors for all sensors type
1079
1080 // Loop over requested steps
1081 auto iStep = -1;
1082 for (auto current_step : steps)
1083 {
1084 iStep++;
1085 auto iSensor = -1;
1086 for (auto current_sensor : sensors_full)
1087 {
1089 iSensor++;
1090 if (!time_axis)
1091 hframe->GetXaxis()->SetBinLabel(iStep + 1, current_step[0].c_str());
1095 auto current_point = gSummaryGraphs[0 + iSensor * 2].GetN();
1097 gSummaryGraphs[0 + iSensor * 2].SetPointError(current_point, 0., average_overvoltage_values[1]);
1099 gSummaryGraphs[1 + iSensor * 2].SetPointError(current_point, 0., average_overvoltage_valRMS[1]);
1100 for (auto single_sensor = 0; single_sensor < 4; single_sensor++)
1101 {
1105 }
1106 }
1107 }
1108 hframe->GetXaxis()->LabelsOption("v");
1109 if (time_axis)
1110 {
1111 hframe->GetXaxis()->SetTimeDisplay(true);
1112 hframe->GetXaxis()->SetTimeFormat("%d\/%m\/%Y%F1970-01-01 00:00:00");
1113 }
1114 c1->cd(1);
1115 hframe->Draw();
1116 gPad->SetLogy();
1117 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[0].c_str());
1118 lLatex->DrawLatexNDC(0.725, 0.9, Form("board #%s", board.c_str()));
1119 c1->cd(2);
1120 hframe->Draw();
1121 gPad->SetLogy();
1122 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[1].c_str());
1123 c1->cd(3);
1124 hframe->Draw();
1125 gPad->SetLogy();
1126 lLatex->DrawLatexNDC(0.175, 0.9, sensors_full[2].c_str());
1127 for (auto iSns = 0; iSns < 12; iSns++)
1128 {
1129 gSingleGraphs[iSns].SetMarkerStyle(24);
1130 gSingleGraphs[iSns].SetMarkerColor(kGray);
1131 gSingleGraphs[iSns].SetLineColor(kGray);
1132 c1->cd(1 + iSns / 4);
1133 gSingleGraphs[iSns].Draw("samelp");
1134 }
1135 for (auto iSns = 0; iSns < 6; iSns++)
1136 {
1137 gSummaryGraphs[iSns].SetMarkerStyle(20);
1138 gSummaryGraphs[iSns].SetMarkerColor(kBlack);
1139 gSummaryGraphs[iSns].SetLineColor(kBlack);
1140 c1->cd(1 + iSns / 2);
1141 gSummaryGraphs[iSns].Draw("samelp");
1142 }
1143 return c1;
1144 }
1145 // --- SORT ME ---
1146 // --- SORT ME ---
1147 // --- SORT ME ---
1148
1149 std::array<float, 2>
1150 get_cross_talk(std::string board, std::string channel, std::string step, std::string check_name)
1151 {
1153 }
1154 std::array<float, 2>
1155 get_sig_amp(std::string board, std::string channel, std::string step, std::string check_name)
1156 {
1158 }
1159 std::unordered_map<std::string, std::string>
1160 get_filename(std::string board, std::string channel, std::string step, std::vector<std::pair<std::string, std::string>> other_filters)
1161 {
1162 if (!database_memory.count(board))
1163 {
1164 std::cout << "[WARNING][database::get_filename] Board " << board << " not stored in the database" << std::endl;
1165 return {};
1166 }
1168 {
1169 std::cout << "[WARNING][database::get_filename] Step " << step << " not stored in the database" << std::endl;
1170 return {};
1171 }
1172 std::string ivfname = "";
1173 std::string ivofname = "";
1174 std::string dcrthrfname = "";
1175 std::string dcrbiasfname = "";
1176 if (database_memory[board][step].count("iv-run"))
1177 {
1178 auto ivrun = database_memory[board][step]["iv-run"].back();
1179 auto ivsetup = database_memory[board][step]["iv-setup"].back();
1180 auto ivmux = database_memory[board][step]["iv-mux"].back();
1181 auto temperature = database_memory[board][step]["temp"].back();
1182
1183 ivfname = basedir + "/" + ivrun + "/" + ivsetup + "/iv/HAMA3_sn0_mux" + ivmux + "/HAMA3_sn0_" + temperature + "K_" + channel + ".ivscan.csv";
1184 ivofname = basedir + "/" + ivrun + "/" + ivsetup + "/iv/HAMA3_sn0_mux" + ivmux + "/HAMA3_sn0_" + temperature + "K_OPEN-" + channel + ".ivscan.csv";
1185 }
1186 if (database_memory[board][step].count("dcr-run"))
1187 {
1188 auto dcrrun = database_memory[board][step]["dcr-run"].back();
1189 auto dcrsetup = database_memory[board][step]["dcr-setup"].back();
1190 auto dcrchip = database_memory[board][step]["dcr-chip"].back();
1191 dcrthrfname = basedir + "/" + dcrrun + "/" + dcrsetup + "/dcr/HAMA3-chip" + dcrchip + "/rate/threshold_scan/chip" + dcrchip + "-" + channel + ".ureadout_dcr_scan.tree.root";
1192 dcrbiasfname = basedir + "/" + dcrrun + "/" + dcrsetup + "/dcr/HAMA3-chip" + dcrchip + "/rate/vbias_scan/chip" + dcrchip + "-" + channel + ".ureadout_dcr_scan.tree.root";
1193 }
1194 return {{"iv", ivfname}, {"iv-open", ivofname}, {"dcr-threshold", dcrthrfname}, {"dcr-vbias", dcrbiasfname}};
1195 }
1196 std::string
1197 get_database_info(std::string board, std::string step, std::string info)
1198 {
1199 if (!database_memory.count(board))
1200 {
1201 std::cout << "[WARNING][database::get_database_info] Board " << board << " is not stored in the database" << std::endl;
1202 return "";
1203 }
1205 {
1206 std::cout << "[WARNING][database::get_database_info] For board " << board << ", step " << step << " is not stored in the database" << std::endl;
1207 return "";
1208 }
1210 {
1211 std::cout << "[WARNING][database::get_database_info] For board " << board << ", step " << step << ", " << info << " is not stored in the database" << std::endl;
1212 return "";
1213 }
1214 return database_memory[board][step][info].back();
1215 }
1216 std::unordered_map<std::string, std::unordered_map<std::string, std::vector<std::string>>>
1218 {
1219 std::unordered_map<std::string, std::unordered_map<std::string, std::vector<std::string>>> null_rslt;
1220 if (!database_memory.count(board))
1221 {
1222 std::cout << "[WARNING][database::get_board_history] Board " << board << " is not stored in the database" << std::endl;
1223 return null_rslt;
1224 }
1225 return database_memory[board];
1226 }
1227 std::unordered_map<std::string, std::vector<std::string>>
1228 get_board_state_infos(std::string board, std::string step)
1229 {
1230 std::unordered_map<std::string, std::vector<std::string>> null_rslt;
1231 if (!database_memory.count(board))
1232 {
1233 std::cout << "[WARNING][database::get_board_state_infos] Board " << board << " is not stored in the database" << std::endl;
1234 return null_rslt;
1235 }
1237 {
1238 std::cout << "[WARNING][database::get_board_state_infos] For board " << board << ", step " << step << " is not stored in the database" << std::endl;
1239 return null_rslt;
1240 }
1241 return database_memory[board][step];
1242 }
1243 std::vector<std::string>
1244 get_board_state_info_history(std::string board, std::string step, std::string info)
1245 {
1246 std::vector<std::string> null_rslt;
1247 if (!database_memory.count(board))
1248 {
1249 std::cout << "[WARNING][database::get_board_state_infos] Board " << board << " is not stored in the database" << std::endl;
1250 return null_rslt;
1251 }
1253 {
1254 std::cout << "[WARNING][database::get_board_state_infos] For board " << board << ", step " << step << " is not stored in the database" << std::endl;
1255 return null_rslt;
1256 }
1257 return database_memory[board][step][info];
1258 }
1259 // --- Quality assurance
1260 void
1262 {
1263 std::cout << "[INFO][database::show_database] Starting print all database entries" << std::endl;
1267 for (auto current_value : all_values)
1268 std::cout << "[INFO][database::show_database] Board " << current_board << " - Status " << current_status << " - Info " << current_information << " - Value " << current_value << std::endl;
1269 }
1270 void
1272 {
1274 {
1276 {
1277 for (auto current_channel : all_channels)
1278 {
1280 std::cout << "[QA::WARNING][database::check_all_plots_loaded][Board:" << current_board.c_str() << " Channel:" << current_channel.c_str() << " Status:" << current_status.c_str() << "] Missing IV!" << std::endl;
1282 std::cout << "[QA::WARNING][database::check_all_plots_loaded][Board:" << current_board.c_str() << " Channel:" << current_channel.c_str() << " Status:" << current_status.c_str() << "] IV found, measurement failed" << std::endl;
1284 std::cout << "[QA::WARNING][database::check_all_plots_loaded][Board:" << current_board.c_str() << " Channel:" << current_channel.c_str() << " Status:" << current_status.c_str() << "] Missing DCR scan!" << std::endl;
1285 }
1286 }
1287 }
1288 }
1289 bool
1291 {
1292 gTarget->Sort();
1293 auto maximum = gTarget->GetY()[gTarget->GetN() - 1];
1294 auto minimum = gTarget->GetY()[0];
1295 return (fabs(maximum / minimum)) > 100.;
1296 }
1297 // Calculations
1298 std::array<std::array<float, 2>, 2>
1300 {
1301 // Clone the target TGraphErrors for drawing check
1302 auto new_target = (TGraphErrors *)(gTarget->Clone("new_target"));
1303
1304 // --- Beautifying
1305 new_target->SetMarkerStyle(20);
1306 new_target->SetMarkerColor(kAzure - 3);
1307
1308 // --- Drawing check
1310 check_my_points->SetMarkerStyle(24);
1311 check_my_points->SetMarkerColor(kRed);
1312 check_my_points->SetMarkerSize(1.2);
1313
1314 // Plateau calculation
1315 std::array<std::array<float, 2>, 2> plateau_values;
1316
1317 // --- Start roughly at mid-point of first plateau
1318 auto first_plateau_tolerance = 0.25;
1319 auto second_plateau_tolerance = 0.50;
1320 auto start_point_plateau = 5;
1321 plateau_values[0][0] = gTarget->GetPointY(start_point_plateau);
1322 plateau_values[0][1] = gTarget->GetErrorY(start_point_plateau) * gTarget->GetErrorY(start_point_plateau);
1324
1325 // --- Add point to check drawing
1326 check_my_points->SetPoint(0, gTarget->GetPointX(start_point_plateau), gTarget->GetPointY(start_point_plateau));
1327
1328 // --- Utility for the mean calculation
1329 auto cuncurrent_points = 1;
1330
1331 // Start looping to the left
1332 for (auto iPnt = start_point_plateau + 1; iPnt < gTarget->GetN(); iPnt++)
1333 {
1334 auto current_x_val = gTarget->GetPointX(iPnt);
1335 auto current_x_err = gTarget->GetErrorX(iPnt);
1336 auto current_y_val = gTarget->GetPointY(iPnt);
1337 auto current_y_err = gTarget->GetErrorY(iPnt);
1338 // Stop when the points deviate over tolerance
1340 break;
1344
1345 // --- Add point to check drawing
1346 check_my_points->SetPoint(check_my_points->GetN(), gTarget->GetPointX(iPnt), gTarget->GetPointY(iPnt));
1347 }
1348 // Start looping to the right
1349 for (auto iPnt = start_point_plateau - 1; iPnt >= 0; iPnt--)
1350 {
1351 auto current_y_val = gTarget->GetPointY(iPnt);
1352 auto current_y_err = gTarget->GetErrorY(iPnt);
1353 // Stop when the points deviate over 15%
1355 break;
1359 // --- Add point to check drawing
1360 check_my_points->SetPoint(check_my_points->GetN(), gTarget->GetPointX(iPnt), gTarget->GetPointY(iPnt));
1361 }
1362
1363 // --- Finalise calculation
1365 plateau_values[0][1] = sqrt(plateau_values[0][1]);
1367
1368 // --- Start roughly at mid-point of first plateau
1370 plateau_values[1][0] = gTarget->GetPointY(start_point_plateau);
1371 plateau_values[1][1] = gTarget->GetErrorY(start_point_plateau) * gTarget->GetErrorY(start_point_plateau);
1373
1374 // --- Add point to check drawing
1375 check_my_points->SetPoint(check_my_points->GetN(), gTarget->GetPointX(start_point_plateau), gTarget->GetPointY(start_point_plateau));
1376
1377 // --- Utility for the mean calculation
1379
1380 // Start looping to the left
1381 for (auto iPnt = start_point_plateau + 1; iPnt < gTarget->GetN(); iPnt++)
1382 {
1383 auto current_y_val = gTarget->GetPointY(iPnt);
1384 auto current_y_err = gTarget->GetErrorY(iPnt);
1385 // Stop when the points deviate over 15%
1387 break;
1391 // --- Add point to check drawing
1392 check_my_points->SetPoint(check_my_points->GetN(), gTarget->GetPointX(iPnt), gTarget->GetPointY(iPnt));
1393 }
1394 for (auto iPnt = start_point_plateau - 1; iPnt >= 0; iPnt--)
1395 {
1396 auto current_y_val = gTarget->GetPointY(iPnt);
1397 auto current_y_err = gTarget->GetErrorY(iPnt);
1398 // Stop when the points deviate over 15%
1400 break;
1404 // --- Add point to check drawing
1405 check_my_points->SetPoint(check_my_points->GetN(), gTarget->GetPointX(iPnt), gTarget->GetPointY(iPnt));
1406 }
1407 // --- Finalise calculation
1409 plateau_values[1][1] = sqrt(plateau_values[1][1]);
1411
1412 // Error calculation
1413 auto error_on_first_plateau = plateau_values[0][1] * plateau_values[0][1] * ((plateau_values[1][0]) / ((plateau_values[0][0] - plateau_values[1][0]) * (plateau_values[0][0] - plateau_values[1][0])));
1414 auto error_on_second_plateau = plateau_values[1][1] * plateau_values[1][1] * ((plateau_values[0][0]) / ((plateau_values[0][0] - plateau_values[1][0]) * (plateau_values[0][0] - plateau_values[1][0])));
1415
1416 // Plot if requested
1417 if (!plot_name.empty())
1418 {
1419 TCanvas *c1 = new TCanvas();
1420 TLatex *lLatex = new TLatex();
1421 gPad->SetLogy();
1422 new_target->Draw("AP");
1423 check_my_points->Draw("SAME P");
1424 lLatex->DrawLatexNDC(0.6, 0.8, Form("CT: %.1f#pm%.1f%% ", 100 * plateau_values[1][0] / (plateau_values[0][0] - plateau_values[1][0]), 100 * sqrt(error_on_first_plateau * error_on_first_plateau + error_on_second_plateau * error_on_second_plateau)));
1425 c1->SaveAs(Form("%s.pdf", plot_name.c_str()));
1426 }
1427
1428 // Return
1430 std::array<float, 2> sig_ampl = {-1., -1.};
1431 return {cross_talk, sig_ampl};
1432 }
1433 std::array<float, 2>
1438 std::array<float, 2>
1443
1444 std::array<float, 2>
1445 measure_fraction_of_damage(std::array<float, 2> target_step, std::array<float, 2> new_reference, std::array<float, 2> maximum_reference)
1446 {
1447 std::array<float, 2> result;
1448 // Calculate mean value
1450 // Calulate uncertainty
1451 // --- uncertainty related to target_step
1453 // --- uncertainty related to new
1455 // --- uncertainty related to maximum
1457 // --- Total uncertainty
1459 return result;
1460 }
1461 std::vector<std::array<float, 2>>
1462 measure_fraction_of_damage(std::vector<std::array<float, 2>> target_step, std::vector<std::array<float, 2>> new_reference, std::vector<std::array<float, 2>> maximum_reference)
1463 {
1464 std::vector<std::array<float, 2>> result;
1465
1466 return result;
1467 }
1468
1469 // Utilities
1471 {
1472 std::vector<TGraphErrors *> result;
1473 auto maximum_size = 0.;
1475 maximum_size = std::max(maximum_size, 1. * y_coordinate_array.size());
1476 for (auto _unused = 0; _unused < maximum_size; _unused++)
1477 result.push_back(new TGraphErrors());
1479 {
1480 auto iy = -1;
1481 for (auto y_coordinate : y_coordinate_array)
1482 {
1483 iy++;
1484 auto ix = result[iy]->GetN();
1485 result[iy]->SetPoint(ix, x_coordinate[0], y_coordinate[0]);
1486 result[iy]->SetPointError(ix, x_coordinate[1], y_coordinate[1]);
1487 }
1488 }
1489 return result;
1490 }
1491 void set_multi_graph(std::vector<TGraphErrors *> &target_graphs, int target_color, int target_marker)
1492 {
1493 for (auto current_graph : target_graphs)
1494 {
1495 current_graph->SetLineColorAlpha(target_color, 0.2);
1496 current_graph->SetLineStyle(kDashed);
1497 current_graph->SetMarkerColorAlpha(target_color, 0.2);
1498 current_graph->SetMarkerStyle(target_marker);
1499 }
1500 target_graphs.at(0)->SetLineColor(target_color);
1501 target_graphs.at(0)->SetLineStyle(kSolid);
1502 target_graphs.at(0)->SetLineWidth(2);
1503 target_graphs.at(0)->SetMarkerColor(target_color);
1504 target_graphs.at(0)->SetMarkerStyle(target_marker);
1505 target_graphs.at(0)->SetMarkerSize(2);
1506 target_graphs.at(1)->SetLineColor(target_color);
1507 target_graphs.at(1)->SetLineStyle(kSolid);
1508 target_graphs.at(1)->SetLineWidth(2);
1509 target_graphs.at(1)->SetMarkerColor(target_color);
1510 target_graphs.at(1)->SetMarkerStyle(target_marker);
1511 target_graphs.at(1)->SetMarkerSize(2);
1512 }
1513
1514 template <bool use_sqsum = true, bool skip_unfit_skim = false>
1515 std::tuple<float, float, float>
1516 measure_average_and_rms(std::vector<std::array<float, 2>> measurements, float rms_tolerance = 5.)
1517 {
1518 // Final result
1519 std::tuple<float, float, float> result = {0., 0., 0.};
1520 std::vector<std::array<float, 2>> skimmed_data;
1521
1522 // Skim dataset from dangerous values
1523 for (auto current_measurement : measurements)
1524 {
1525 if (skip_unfit_skim)
1526 break;
1527 if (std::isnan(current_measurement[0]))
1528 continue;
1529 if (std::isinf(current_measurement[0]))
1530 continue;
1532 }
1533 if (skip_unfit_skim)
1534 skimmed_data = measurements;
1535
1536 // Measure average and error on the average
1538 {
1541 }
1542 get<0>(result) /= skimmed_data.size();
1544
1545 // Measure RMS
1549
1550 // Second skimming for outliers
1551 std::vector<std::array<float, 2>> re_skimmed_data;
1555 if (re_skimmed_data.size() != skimmed_data.size())
1557
1558 return result;
1559 }
1560 // --- ---
1561 std::array<float, 2>
1562 measure_average(std::vector<std::array<float, 2>> measurements, bool use_rms)
1563 {
1564 std::array<float, 2> result;
1565 auto avg = measure_average_and_rms(measurements);
1566 return {get<0>(avg), use_rms ? get<2>(avg) : get<1>(avg)};
1567 }
1568 template <bool use_rms = false>
1569 std::array<float, 2>
1570 measure_average(std::vector<std::array<float, 2>> measurements)
1571 {
1572 std::array<float, 2> result;
1573 auto avg = measure_average_and_rms(measurements);
1574 return {get<0>(avg), use_rms ? get<2>(avg) : get<1>(avg)};
1575 }
1576 void
1578 {
1579 gTarget->SetLineColor(color);
1580 gTarget->SetLineStyle(kSolid);
1581 gTarget->SetLineWidth(2);
1582 gTarget->SetFillStyle(0);
1583 gTarget->SetMarkerColor(color);
1584 gTarget->SetMarkerStyle(marker);
1585 gTarget->SetMarkerSize(2);
1586 }
1587 void
1589 {
1590 gTarget->SetLineColor(color);
1591 gTarget->SetLineStyle(kSolid);
1592 gTarget->SetLineWidth(2);
1593 gTarget->SetFillStyle(0);
1594 gTarget->SetMarkerColor(color);
1595 gTarget->SetMarkerStyle(marker);
1596 gTarget->SetMarkerSize(2);
1597 }
1598 void
1600 {
1601 hTarget->SetLineColor(color);
1602 hTarget->SetLineStyle(kSolid);
1603 hTarget->SetLineWidth(2);
1604 hTarget->SetMarkerColor(color);
1605 hTarget->SetMarkerStyle(marker);
1606 hTarget->SetMarkerSize(2);
1607 hTarget->SetFillStyle(0);
1608 hTarget->SetFillColorAlpha(0., 0.);
1609 hTarget->GetXaxis()->SetBinLabel(1, all_sensors[0].c_str());
1610 hTarget->GetXaxis()->SetBinLabel(2, all_sensors[1].c_str());
1611 hTarget->GetXaxis()->SetBinLabel(3, all_sensors[2].c_str());
1612 }
1613
1614 // - F -
1615 template <typename ArgType,
1616 std::array<float, 2> (*current_value_getter)(std::string, std::string, std::string, ArgType)>
1617 std::vector<TGraphErrors *>
1618 get_steps_history(std::string board, std::string sensor, std::vector<std::string> step_list, ArgType target_fourth, int marker = kFullCircle, int color = kBlack, int sec_marker = kCircle, int sec_color = kGray)
1619 {
1620 std::vector<TGraphErrors *> result;
1621 bool req_all_sensors = true;
1622 if (sensor_to_channels.find(sensor) != sensor_to_channels.end())
1623 req_all_sensors = false;
1624 for (auto iter = 0; iter < (req_all_sensors ? 14 : 6); iter++)
1625 result.push_back(new TGraphErrors());
1626 for (auto iter = 0; iter < 2; iter++)
1627 {
1628 result[iter]->SetMarkerStyle(marker);
1629 result[iter]->SetMarkerColor(color);
1630 }
1631 for (auto iter = 2; iter < (req_all_sensors ? 14 : 6); iter++)
1632 {
1633 result[iter]->SetMarkerStyle(sec_marker);
1634 result[iter]->SetMarkerColor(sec_color);
1635 }
1636 auto i_step = -1;
1637 for (auto current_step : step_list)
1638 {
1639 i_step++;
1640 std::vector<std::array<float, 2>> current_step_channel_values;
1641 auto i_sensor = -1;
1642 if (!req_all_sensors)
1643 {
1644 for (auto current_channel : sensor_to_channels[sensor])
1645 {
1646 i_sensor++;
1649 result[2 + i_sensor]->SetPoint(i_step, 0.5 + i_step, current_value[0]);
1650 result[2 + i_sensor]->SetPointError(i_step, 0, current_value[1]);
1651 }
1652 }
1653 else
1654 {
1655 for (auto current_channel : all_channels)
1656 {
1657 i_sensor++;
1659 // cout << "current_value[0]: " << current_value[0] << endl;
1661 result[2 + i_sensor]->SetPoint(i_step, 0.5 + i_step, current_value[0]);
1662 result[2 + i_sensor]->SetPointError(i_step, 0, current_value[1]);
1663 }
1664 }
1667 result[0]->SetPoint(i_step, 0.5 + i_step, current_avg[0]);
1668 result[0]->SetPointError(i_step, 0, current_avg[1]);
1669 result[1]->SetPoint(i_step, 0.5 + i_step, current_avg_rms[0]);
1670 result[1]->SetPointError(i_step, 0, current_avg_rms[1]);
1671 }
1672 return result;
1673 }
1674
1675 std::vector<TGraphErrors *>
1676 get_steps_history_iv(std::string board, std::string sensor, std::vector<std::string> step_list, float overvoltage, int marker = kFullCircle, int color = kBlack, int sec_marker = kCircle, int sec_color = kGray)
1677 {
1679 }
1680
1681 std::vector<TGraphErrors *>
1682 get_steps_history_gain(std::string board, std::string sensor, std::vector<std::string> step_list, float overvoltage, int marker = kFullCircle, int color = kBlack, int sec_marker = kCircle, int sec_color = kGray)
1683 {
1685 }
1686
1687 std::vector<TGraphErrors *>
1688 get_steps_history_CT(std::string board, std::string sensor, std::vector<std::string> step_list, std::string save_dir, int marker = kFullCircle, int color = kBlack, int sec_marker = kCircle, int sec_color = kGray)
1689 {
1691 }
1692
1693 std::array<float, 2>
1694 get_iv_FOD_at_overvoltage_std_TIFPA(std::string board, std::string channel, std::string step, float overvoltage)
1695 {
1696 return get_iv_FOD_at_overvoltage(board, channel, step, overvoltage, "TIFPA-IRR1", "NEW");
1697 }
1698
1699 std::vector<TGraphErrors *>
1704
1705 // - F -
1706 template <typename ArgType,
1707 std::array<float, 2> (*current_value_getter)(std::string, std::string, std::string, ArgType)>
1708 std::vector<TGraphErrors *>
1709 get_general_TGraphs(std::string sensor, std::vector<std::pair<std::string, std::vector<std::string>>> step_list_w_boards, ArgType target_fourth, int marker = kFullCircle, int color = kBlue)
1710 {
1711 std::vector<TGraphErrors *> result;
1712 bool req_all_sensors = true;
1713 if (sensor_to_channels.find(sensor) != sensor_to_channels.end())
1714 req_all_sensors = false;
1715 for (auto iter = 0; iter < 2; iter++)
1716 {
1717 result.push_back(new TGraphErrors());
1718 result[iter]->SetMarkerStyle(marker);
1719 result[iter]->SetMarkerColor(color);
1720 }
1721 auto i_step = -1;
1723 {
1724 i_step++;
1725 std::vector<std::array<float, 2>> current_step_channel_values;
1726 for (auto current_board : all_boards)
1727 {
1728 auto i_sensor = -1;
1729 if (!req_all_sensors)
1730 {
1731 for (auto current_channel : sensor_to_channels[sensor])
1732 {
1733 i_sensor++;
1735 if (current_value[0] < 0)
1736 continue;
1738 }
1739 }
1740 else
1741 {
1742 for (auto current_channel : all_channels)
1743 {
1744 i_sensor++;
1746 if (current_value[0] < 0)
1747 continue;
1749 }
1750 }
1751 }
1754 result[0]->SetPoint(i_step, 0.5 + i_step, current_avg[0]);
1755 result[0]->SetPointError(i_step, 0, current_avg[1]);
1756 result[1]->SetPoint(i_step, 0.5 + i_step, current_avg_rms[0]);
1757 result[1]->SetPointError(i_step, 0, current_avg_rms[1]);
1758 }
1759 return result;
1760 }
1761
1762 std::vector<TGraphErrors *>
1763 get_general_TGraphs_iv(std::string sensor, std::vector<std::pair<std::string, std::vector<std::string>>> step_list_w_boards, float overvoltage, int marker = kFullCircle, int color = kBlue)
1764 {
1766 }
1767
1768 std::vector<TGraphErrors *>
1769 get_general_TGraphs_ct(std::string sensor, std::vector<std::pair<std::string, std::vector<std::string>>> step_list_w_boards, std::string fig_check_name, int marker = kFullCircle, int color = kBlue)
1770 {
1772 }
1773
1774}
TH2_Type * build_fine_tune_raw_histogram(std::vector< TString > kInputFileNames, TString kRunTag, TString kOutputFileName, bool kRecalculate)
Functions -------------------------------------------------------------------------------------------...
Definition fine_analysis.h:80
TGraphErrors * make_iv_scan(std::string filename, std::string filenameOPEN="", std::string filenameZERO="", float vbreak=-1.)
Definition make_iv_scan.C:154
Definition database.C:26
std::unordered_map< std::string, std::vector< std::string > > standard_status_to_boards
Definition database.C:43
std::unordered_map< std::string, std::unordered_map< std::string, std::unordered_map< std::string, std::vector< std::string > > > > database_memory
Definition database.C:204
std::tuple< float, float, float > get_relative_PDE_merit(std::tuple< float, float, float > target_merit, std::tuple< float, float, float > standard_merit)
Definition database.C:884
std::vector< std::string > all_boards
Definition database.C:39
std::vector< TGraphErrors * > make_graph(mkgraph_data_structure data_structure)
Definition database.C:1470
std::array< float, 2 > get_value_at_overvoltage(std::string board, std::string channel, std::string step, float target_overvoltage)
Definition database.C:553
std::vector< float > standard_overvoltage_points
Definition database.C:190
TGraphErrors * get_gain(std::string board, std::string channel, std::string step, int marker=1, int color=1)
Definition database.C:796
std::vector< TGraphErrors * > get_general_TGraphs_ct(std::string sensor, std::vector< std::pair< std::string, std::vector< std::string > > > step_list_w_boards, std::string fig_check_name, int marker=kFullCircle, int color=kBlue)
Definition database.C:1769
void show_database()
Definition database.C:1261
std::unordered_map< std::string, std::vector< std::string > > sensor_short_to_channels
Definition database.C:97
std::unordered_map< std::string, std::string > channel_to_sensor
Definition database.C:65
std::unordered_map< std::string, std::unordered_map< std::string, std::vector< std::string > > > get_board_history(std::string board)
Definition database.C:1217
std::vector< std::string > get_board_state_info_history(std::string board, std::string step, std::string info)
Definition database.C:1244
TGraphErrors * get_dcr_increase_overvoltage_scan(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points)
Definition database.C:948
std::vector< std::string > fields
Definition database.C:195
std::array< float, 2 > get_cross_talk(std::string board, std::string channel, std::string step, std::string check_name="")
Definition database.C:1150
std::vector< TGraphErrors * > get_steps_history_CT(std::string board, std::string sensor, std::vector< std::string > step_list, std::string save_dir, int marker=kFullCircle, int color=kBlack, int sec_marker=kCircle, int sec_color=kGray)
Definition database.C:1688
std::vector< std::string > criteria
Definition database.C:197
std::unordered_map< std::string, float > DTS_PDE
Definition database.C:182
std::unordered_map< std::string, std::string > code_to_sensor
Definition database.C:170
std::tuple< float, float, float > measure_average_and_rms(std::vector< std::array< float, 2 > > measurements, float rms_tolerance=5.)
Definition database.C:1516
std::vector< TGraphErrors * > get_steps_history_FOD_std_TIFPA(std::string board, std::string sensor, std::vector< std::string > step_list, float overvoltage, int marker=kFullCircle, int color=kBlue, int sec_marker=kCircle, int sec_color=kGray)
Definition database.C:1700
TGraphErrors * get_dcr_threshold_scan(std::string board, std::string channel, std::string step, int marker=1, int color=1)
Definition database.C:963
std::array< float, 2 > get_gain_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:803
std::unordered_map< std::string, std::vector< std::string > > get_board_state_infos(std::string board, std::string step)
Definition database.C:1228
void read_database(std::string fname)
Definition database.C:284
std::vector< std::array< float, 2 > > get_all_values_at_overvoltage(std::string board, std::string sensor, std::string step, float target_overvoltage)
Definition database.C:567
std::array< float, 2 > measure_average(std::vector< std::array< float, 2 > > measurements, bool use_rms=false)
Definition database.C:1562
std::array< float, 2 > get_iv_FOD_at_overvoltage_std_TIFPA(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:1694
void set_as_main_line(TGraph *gTarget, int marker, int color)
Definition database.C:1577
std::vector< std::array< float, 2 > > get_all_dcr_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
Definition database.C:841
std::unordered_map< std::string, std::string > get_filename(std::string board, std::string channel, std::string step, std::vector< std::pair< std::string, std::string > > other_filters={{}})
Definition database.C:1160
TGraphErrors * get_average_iv_at_overvoltage(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points, int marker=kCircle, int color=kBlue)
Definition database.C:666
std::vector< std::array< float, 2 > > get_all_iv_excess_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
Definition database.C:1034
std::unordered_map< std::string, std::string > standard_status_to_status
Definition database.C:48
std::vector< std::array< float, 2 > > get_all_dcr_excess_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
Definition database.C:920
std::array< float, 2 > get_dcr_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:836
TGraphErrors * get_dcr_overvoltage_scan(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points)
Definition database.C:899
std::vector< std::string > all_sensors
Definition database.C:154
std::array< float, 2 > get_Yvalue_at_X(std::string board, std::string channel, std::string step, float target_voltage)
Definition database.C:387
TGraphErrors * get_average_sensor_Yvalues_at_X(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > target_x_list)
Definition database.C:436
std::unordered_map< std::string, int > sensor_to_marker
Definition database.C:162
std::vector< TGraphErrors * > get_general_TGraphs(std::string sensor, std::vector< std::pair< std::string, std::vector< std::string > > > step_list_w_boards, ArgType target_fourth, int marker=kFullCircle, int color=kBlue)
Definition database.C:1709
std::vector< std::string > sensors_full
Definition database.C:34
std::vector< std::string > TScan_statuses
Definition database.C:112
std::unordered_map< std::string, float > sensor_to_vbd
Definition database.C:174
std::unordered_map< std::string, int > sensor_to_color
Definition database.C:158
std::vector< TGraphErrors * > get_steps_history_gain(std::string board, std::string sensor, std::vector< std::string > step_list, float overvoltage, int marker=kFullCircle, int color=kBlack, int sec_marker=kCircle, int sec_color=kGray)
Definition database.C:1682
void set_standard_style(target_type *target, int marker_style=20, int marker_color=kBlack)
Definition database.C:253
std::unordered_map< std::string, std::string > channel_to_sensor_short
Definition database.C:78
std::array< float, 2 > get_iv_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:1016
std::unordered_map< std::string, float > DTS_OVop
Definition database.C:186
std::string basedir
Definition database.C:200
std::unordered_map< std::string, std::string > sensor_to_code
Definition database.C:166
const double k_boltz_J
Definition database.C:30
bool check_iv_goodness(TGraphErrors *gTarget)
Definition database.C:1290
void set_multi_graph(std::vector< TGraphErrors * > &target_graphs, int target_color, int target_marker)
Definition database.C:1491
std::array< std::array< float, 2 >, 2 > measure_cross_talk_and_signal_amp(TGraphErrors *gTarget, std::string plot_name)
Definition database.C:1299
TGraphErrors * get_iv_scan(std::string board, std::string channel, std::string step, int marker=1, int color=1)
Definition database.C:658
std::unordered_map< std::string, std::vector< std::string > > sensor_to_channels
Definition database.C:93
std::vector< TGraphErrors * > get_steps_history_iv(std::string board, std::string sensor, std::vector< std::string > step_list, float overvoltage, int marker=kFullCircle, int color=kBlack, int sec_marker=kCircle, int sec_color=kGray)
Definition database.C:1676
TGraphErrors * get_dcr_vbias_scan(std::string board, std::string channel, std::string step, int marker=1, int color=1)
Definition database.C:721
TGraphErrors * get_average_dcr_at_overvoltage(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points, int marker=kCircle, int color=kBlue)
Definition database.C:729
std::unordered_map< std::string, float > sensor_to_vbd_Tdep
Definition database.C:178
TCanvas * get_history_iv_at_overvoltage(std::string board, std::vector< std::array< std::string, 2 > > steps, float overvoltage, bool time_axis=true, float min=1.e-10, float max=1.e-5)
Definition database.C:1059
std::unordered_map< std::array< float, 2 >, std::vector< std::array< float, 2 > > > mkgraph_data_structure
Definition database.C:206
std::array< float, 2 > get_sig_amp(std::string board, std::string channel, std::string step, std::string check_name)
Definition database.C:1155
const double k_boltz_eV
Definition database.C:29
std::array< float, 2 > measure_signal_amp(TGraphErrors *gTarget, std::string plot_name="")
Definition database.C:1439
std::unordered_map< std::string, std::vector< std::string > > board_to_status_list
Definition database.C:55
std::vector< std::string > all_channels
Definition database.C:59
std::unordered_map< std::string, int > status_to_color
Definition database.C:137
std::string get_database_info(std::string board, std::string step, std::string info)
Definition database.C:1197
std::array< float, 2 > get_dcr_excess_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:913
void check_all_plots_loaded()
Definition database.C:1271
std::array< float, 2 > measure_cross_talk(TGraphErrors *gTarget, std::string plot_name="")
Definition database.C:1434
std::vector< std::array< float, 2 > > get_all_iv_at_overvoltage(std::string board, std::string sensor, std::string step, float overvoltage)
Definition database.C:1021
std::vector< std::array< std::string, 2 > > get_board_step_history(std::string board, bool is_dcr=false, bool return_runlist=false)
Definition database.C:237
std::unordered_map< std::string, int > status_to_marker
Definition database.C:145
std::vector< std::string > sensors_short
Definition database.C:35
TGraphErrors * get_average_gain_at_overvoltage(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points, int marker=kCircle, int color=kBlue)
Definition database.C:811
std::tuple< float, float, float > get_PDE_merit(std::vector< std::string > board_list, std::string sensor, std::string step, float window_of_acquisition=1.)
Definition database.C:872
std::vector< std::array< float, 2 > > get_all_sensor_Yvalues_at_X(std::string board, std::string sensor, std::string step, float target_x)
Definition database.C:413
TGraphErrors * get_average_sensor_values_at_overvoltage(std::vector< std::string > board_list, std::string sensor, std::string step, std::vector< float > overvoltage_points=standard_overvoltage_points, int marker=kCircle, int color=kBlue)
Definition database.C:583
std::unordered_map< std::string, std::unordered_map< std::string, std::unordered_map< std::string, std::unordered_map< std::string, TGraphErrors * > > > > cache_memory
Definition database.C:202
std::vector< std::string > all_statuses
Definition database.C:104
std::vector< TGraphErrors * > get_general_TGraphs_iv(std::string sensor, std::vector< std::pair< std::string, std::vector< std::string > > > step_list_w_boards, float overvoltage, int marker=kFullCircle, int color=kBlue)
Definition database.C:1763
std::array< float, 2 > measure_fraction_of_damage(std::array< float, 2 > target_step, std::array< float, 2 > new_reference, std::array< float, 2 > maximum_reference)
Definition database.C:1445
std::vector< TGraphErrors * > get_steps_history(std::string board, std::string sensor, std::vector< std::string > step_list, ArgType target_fourth, int marker=kFullCircle, int color=kBlack, int sec_marker=kCircle, int sec_color=kGray)
Definition database.C:1618
std::array< float, 2 > get_iv_FOD_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage, std::string max_damage_step="TIFPA-IRR1", std::string new_step="NEW")
Definition database.C:1050
std::array< float, 2 > get_iv_excess_at_overvoltage(std::string board, std::string channel, std::string step, float overvoltage)
Definition database.C:1026
std::unordered_map< std::string, double > status_to_annealing_time
Definition database.C:116
void set_style(TGraphErrors *g, int marker, int color, int fill=0)
Definition graphutils.C:113
TGraphErrors * ratio(TGraphErrors *gn, TGraphErrors *gd, bool propagate_error=true)
Definition graphutils.C:496
std::array< float, 2 > eval_with_errors(TGraphErrors *gTarget, float _xtarget)
Definition graphutils.C:85
void y_shift(TGraphErrors *g, float val)
Definition graphutils.C:649
void y_scale(TGraphErrors *g, double scale)
Definition graphutils.C:273
TGraphErrors * ureadout_dcr_get(const std::string filename, const std::string whatx, const std::string whaty="dead_rate")
Definition ureadout_dcr_get.C:4
std::time_t s_ts(const std::string &datetime)
Definition utility.h:63