sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
analysis_utils.h
Go to the documentation of this file.
1#pragma once
3string
5( string search_key ) {
6 extern char **environ;
7 int iTer = 0;
8 string result = "./";
9 while(environ[iTer]) {
10 string current_string = environ[iTer++];
11 auto key_position = current_string.find(search_key);
12 auto key_length = search_key.size();
13 if ( key_position < current_string.size() && key_position == 0 && current_string.substr(key_length,1) == "=" ) {
14 result = current_string.substr(key_length+key_position+1);
15 }
16 }
17 return result;
18}
20namespace analysis_utils {
23struct data_t {
24 int fifo;
25 int type;
27 int column;
28 int pixel;
29 int tdc;
31 int coarse;
32 int fine;
33};
44typedef std::vector<data_t> channel_data_t;
45typedef std::map<int, channel_data_t> chip_data_t;
46typedef std::map<int, chip_data_t> frame_data_t;
47typedef std::map<int, frame_data_t> spill_data_t;
48typedef std::map<int, spill_data_t> framed_data_t;
49typedef std::tuple<TString,int> global_identifier_t;
53const int frame_size = 1024; // [clock cycles]
54const Int_t kGlobalIndexRange = 768;
55const Int_t kGlobalIndexTiming_Start = 512;
57std::map<std::string, int> _next_spill;
59const Int_t kFineRange = 512;
60const TString intput_rawdata_directory = TString(get_environment_variable("ALCOR_DATA_DIR"))+TString("/");
61const TString intput_rawdata_decoded_file_dir = intput_rawdata_directory + TString("./%s/decoded/");
62const TString intput_rawdata_decoded_file = intput_rawdata_decoded_file_dir + TString("./alcdaq.fifo_%i.root");
63const TString output_preprocess_directory = TString(get_environment_variable("ALCOR_WORK_DIR"))+TString("/")+TString("PreProcessedData/");
66const double coarse_to_s = 3.1250000e-09;
67const double coarse_to_us = 3.1250000e-03;
68const double coarse_to_ns = 3.1250000;
70const int rollover_to_coarse = 32768.;
71const double rollover_to_s = 0.0001024;
72const double rollover_to_us = 102.4;
73const double rollover_to_ns = 102400.;
75int eo2do[32] = {22, 20, 18, 16, 24, 26, 28, 30, 25, 27, 29, 31, 23, 21, 19, 17, 9, 11, 13, 15, 7, 5, 3, 1, 6, 4, 2, 0, 8, 10, 12, 14};
77std::vector<std::string> data_filenames = {
78 "alcdaq.fifo_0.root", "alcdaq.fifo_1.root", "alcdaq.fifo_2.root", "alcdaq.fifo_3.root",
79 "alcdaq.fifo_4.root", "alcdaq.fifo_5.root", "alcdaq.fifo_6.root", "alcdaq.fifo_7.root",
80 "alcdaq.fifo_8.root", "alcdaq.fifo_9.root", "alcdaq.fifo_10.root", "alcdaq.fifo_11.root",
81 "alcdaq.fifo_12.root", "alcdaq.fifo_13.root", "alcdaq.fifo_14.root", "alcdaq.fifo_15.root"
82};
83std::vector<std::string> timing_filenames = {
84 "alcdaq.fifo_16.root", "alcdaq.fifo_17.root", "alcdaq.fifo_18.root", "alcdaq.fifo_19.root",
85 "alcdaq.fifo_20.root", "alcdaq.fifo_21.root", "alcdaq.fifo_22.root", "alcdaq.fifo_23.root"
86};
87std::vector<std::string> extra_filenames = {
88 "alcdaq.fifo_24.root"
89};
90std::vector<std::string> all_filenames = {"alcdaq.fifo_0.root", "alcdaq.fifo_1.root", "alcdaq.fifo_2.root", "alcdaq.fifo_3.root",
91 "alcdaq.fifo_4.root", "alcdaq.fifo_5.root", "alcdaq.fifo_6.root", "alcdaq.fifo_7.root",
92 "alcdaq.fifo_8.root", "alcdaq.fifo_9.root", "alcdaq.fifo_10.root", "alcdaq.fifo_11.root",
93 "alcdaq.fifo_12.root", "alcdaq.fifo_13.root", "alcdaq.fifo_14.root", "alcdaq.fifo_15.root",
94 "alcdaq.fifo_16.root", "alcdaq.fifo_17.root", "alcdaq.fifo_18.root", "alcdaq.fifo_19.root",
95 "alcdaq.fifo_20.root", "alcdaq.fifo_21.root", "alcdaq.fifo_22.root", "alcdaq.fifo_23.root",
96 "alcdaq.fifo_24.root"};
98bool kVerboseInfo = false;
99bool kVerboseWarning = true;
100bool kVerboseError = true;
101bool kVerboseFatal = true;
106std::pair<int, int> get_index ( int pixel, int column );
107int get_eochannel ( int pixel, int column );
108int get_global_index ( int fifo, int pixel, int column, int tdc, bool kUseFIFO = true );
109std::tuple<Int_t,Int_t,Int_t,Int_t>
110 get_full_info ( Int_t iIndex );
111void set_verbose_level ( int kVerboseLevel );
113bool sort_data ( data_t i, data_t j );
114void load_tree ( TTree* kInputTree, data_t &kReadData );
115//bool populate_framed_data ( framed_data_t &framed_data, std::string dirname, std::vector<std::string> filenames = all_filenames, int frame_size = 1024 );
119int
121 ( int pixel, int column ) {
122 int eoch = pixel + 4 * column;
123 int doch = eo2do[eoch];
124 return doch;
125}
127std::pair<int, int>
129 ( int pixel, int column ) {
130 int doch = get_dochannel(pixel, column);
131 int ix = doch / 4;
132 int iy = doch % 4;
133 return {ix, iy};
134}
136int
138( int fifo, int pixel, int column, int tdc, bool kUseFIFO = true ) {
142 Bool_t kSkipCorrupted = false;
143 if ( fifo < 0 ) kSkipCorrupted = true;
144 if ( pixel < 0 ) kSkipCorrupted = true;
145 if ( column < 0 ) kSkipCorrupted = true;
146 if ( tdc < 0 ) kSkipCorrupted = true;
147 if ( kSkipCorrupted ) {
148 std::cout << "[ERROR] Invalid negative value given, failed to determine global index!" << std::endl;
149 return -1;
150 }
151 int chip = kUseFIFO ? fifo / 4 : fifo;
152 int index = tdc + 4 * pixel + 16 * column + 128 * chip;
153 return index;
154}
156std::tuple<Int_t,Int_t,Int_t,Int_t>
158( Int_t iIndex ) {
160 std::tuple<Int_t,Int_t,Int_t,Int_t> kResult;
161 get<0>(kResult) = (iIndex/128)%6;
162 get<1>(kResult) = (iIndex/4)%4;
163 get<2>(kResult) = (iIndex/16)%8;
164 get<3>(kResult) = iIndex%4;
165 return kResult;
166}
168bool
170 ( data_t i, data_t j ) {
171 auto itime = i.coarse + i.rollover * rollover_to_coarse;
172 auto jtime = j.coarse + j.rollover * rollover_to_coarse;
173 return (itime < jtime);
174}
176void
178( TTree* kInputTree, data_t &kReadData ) {
179 if ( !kInputTree ) { std::cout << "[ERROR] analysis_utils::load_tree for data_t: Invalid Tree given" << std::endl; return; }
180 kInputTree->SetBranchAddress( "fifo", &kReadData.fifo );
181 kInputTree->SetBranchAddress( "type", &kReadData.type );
182 kInputTree->SetBranchAddress( "counter", &kReadData.counter );
183 kInputTree->SetBranchAddress( "column", &kReadData.column );
184 kInputTree->SetBranchAddress( "pixel", &kReadData.pixel );
185 kInputTree->SetBranchAddress( "tdc", &kReadData.tdc );
186 kInputTree->SetBranchAddress( "rollover", &kReadData.rollover );
187 kInputTree->SetBranchAddress( "coarse", &kReadData.coarse );
188 kInputTree->SetBranchAddress( "fine", &kReadData.fine );
189}
191bool
192populate_framed_data(framed_data_t &framed_data, std::string dirname, std::vector<std::string> filenames = all_filenames, int frame_size = 1024)
193{
195 bool has_data = false;
196 framed_data.clear();
197
199 for (const auto filename : filenames) {
200
202 if (!_next_spill.count(filename)) _next_spill[filename] = 0;
203
204 const auto pathname = dirname + "/" + filename;
205
207 std::cout << " --- opening decoded file: " << pathname << std::endl;
208 auto fin = TFile::Open(pathname.c_str());
209 if (!fin || !fin->IsOpen()) continue;
210
212 data_t data;
213 auto tin = (TTree *)fin->Get("alcor");
214 auto nev = tin->GetEntries();
215 std::cout << " --- found " << nev << " entries in tree " << std::endl;
216 tin->SetBranchAddress("fifo", &data.fifo);
217 tin->SetBranchAddress("type", &data.type);
218 tin->SetBranchAddress("counter", &data.counter);
219 tin->SetBranchAddress("column", &data.column);
220 tin->SetBranchAddress("pixel", &data.pixel);
221 tin->SetBranchAddress("tdc", &data.tdc);
222 tin->SetBranchAddress("rollover", &data.rollover);
223 tin->SetBranchAddress("coarse", &data.coarse);
224 tin->SetBranchAddress("fine", &data.fine);
225
227 int spill = 0;
228 for (int iev = _next_spill[filename]; iev < nev; ++iev) {
229 tin->GetEntry(iev);
230
232 if (data.type == kStartSpill) {
233 has_data = true;
234 continue;
235 }
236
238 if (data.type == kAlcorHit) {
239 auto chip = data.fifo / 4;
240 auto doch = get_dochannel(data.pixel, data.column);
241 auto coarse = data.coarse + data.rollover * rollover_to_coarse;
242 auto frame = coarse / frame_size;
243 framed_data[spill][frame][chip][doch].push_back(data);
244 }
245
247 if (data.type == kEndSpill) {
249 auto &frames = framed_data[spill];
250 for (auto &frame_data : frames) {
251 auto &chips = frame_data.second;
252 for (auto &chip_data : chips) {
253 auto &channels = chip_data.second;
254 for (auto &channel_data : channels) {
255 auto &hits = channel_data.second;
256 std::sort(hits.begin(), hits.end(), sort_data);
257 }
258 }
259 }
260 spill++;
261 _next_spill[filename] = iev + 1;
262 break;
263 }
264
265 }
267 fin->Close();
268
269 }
272 if ( !has_data ) _next_spill.clear();
273 return has_data;
274}
276void
278( int kVerboseLevel = 4 ) {
279 switch ( kVerboseLevel ) {
280 case 0:
281 kVerboseInfo = false;
282 kVerboseWarning = false;
283 kVerboseError = false;
284 kVerboseFatal = false;
285 break;
286
287 case 1:
288 kVerboseInfo = false;
289 kVerboseWarning = false;
290 kVerboseError = false;
291 kVerboseFatal = true;
292 break;
293
294 case 2:
295 kVerboseInfo = false;
296 kVerboseWarning = false;
297 kVerboseError = true;
298 kVerboseFatal = true;
299 break;
300
301 case 3:
302 kVerboseInfo = false;
303 kVerboseWarning = true;
304 kVerboseError = true;
305 kVerboseFatal = true;
306 break;
307
308 case 4:
309 kVerboseInfo = true;
310 kVerboseWarning = true;
311 kVerboseError = true;
312 kVerboseFatal = true;
313 break;
314
315 default:
316 kVerboseInfo = false;
317 kVerboseWarning = true;
318 kVerboseError = true;
319 kVerboseFatal = true;
320 break;
321 }
322}
324}
string get_environment_variable(string search_key)
Definition analysis_utils.h:5
Definition analysis_utils.h:20
std::vector< std::string > timing_filenames
Definition analysis_utils.h:83
type_t
— Datatype Structure --------------------------------------------------------------------------------...
Definition analysis_utils.h:36
@ kAlcorHit
Definition analysis_utils.h:37
@ kTriggerTag
Definition analysis_utils.h:38
@ kStartSpill
Definition analysis_utils.h:39
@ kEndSpill
Definition analysis_utils.h:40
bool kVerboseWarning
Definition analysis_utils.h:99
const int frame_size
Variables -------------------------------------------------------------------------------------------...
Definition analysis_utils.h:53
std::vector< std::string > data_filenames
— Filenames
Definition analysis_utils.h:77
int get_dochannel(int pixel, int column)
— Implementation — — Getter & Setters
Definition analysis_utils.h:121
bool sort_data(data_t i, data_t j)
— — Data handling
Definition analysis_utils.h:170
std::map< int, channel_data_t > chip_data_t
Definition analysis_utils.h:45
bool kVerboseFatal
Definition analysis_utils.h:101
const TString output_preprocess_directory
Definition analysis_utils.h:63
int get_eochannel(int pixel, int column)
int eo2do[32]
— — Electronics-Detector conversions
Definition analysis_utils.h:75
std::vector< std::string > extra_filenames
Definition analysis_utils.h:87
void load_tree(TTree *kInputTree, data_t &kReadData)
Definition analysis_utils.h:178
bool populate_framed_data(framed_data_t &framed_data, std::string dirname, std::vector< std::string > filenames=all_filenames, int frame_size=1024)
Definition analysis_utils.h:192
const TString intput_rawdata_directory
Definition analysis_utils.h:60
std::map< std::string, int > _next_spill
Definition analysis_utils.h:57
void set_verbose_level(int kVerboseLevel)
Definition analysis_utils.h:278
std::tuple< Int_t, Int_t, Int_t, Int_t > get_full_info(Int_t iIndex)
Definition analysis_utils.h:158
std::vector< std::string > all_filenames
Definition analysis_utils.h:90
const Int_t kGlobalIndexTiming_End
Definition analysis_utils.h:56
const TString intput_rawdata_decoded_file_dir
Definition analysis_utils.h:61
const double rollover_to_us
Definition analysis_utils.h:72
std::map< int, chip_data_t > frame_data_t
Definition analysis_utils.h:46
const Int_t kGlobalIndexRange
Definition analysis_utils.h:54
const Int_t kFineRange
— Finetune analysis
Definition analysis_utils.h:59
const double rollover_to_ns
Definition analysis_utils.h:73
int get_global_index(int fifo, int pixel, int column, int tdc, bool kUseFIFO=true)
Definition analysis_utils.h:138
const TString intput_rawdata_decoded_file
Definition analysis_utils.h:62
std::vector< data_t > channel_data_t
Analysis types --------------------------------------------------------------------------------------...
Definition analysis_utils.h:44
const double coarse_to_ns
Definition analysis_utils.h:68
std::tuple< TString, int > global_identifier_t
Definition analysis_utils.h:49
std::map< int, frame_data_t > spill_data_t
Definition analysis_utils.h:47
const int rollover_to_coarse
— — Rollover
Definition analysis_utils.h:70
std::map< int, spill_data_t > framed_data_t
Definition analysis_utils.h:48
const double rollover_to_s
Definition analysis_utils.h:71
bool kVerboseInfo
— Verbose levels
Definition analysis_utils.h:98
const Int_t kGlobalIndexTiming_Start
Definition analysis_utils.h:55
const double coarse_to_s
— Convertion — — Coarse
Definition analysis_utils.h:66
std::pair< int, int > get_index(int pixel, int column)
Functions -------------------------------------------------------------------------------------------...
Definition analysis_utils.h:129
const double coarse_to_us
Definition analysis_utils.h:67
bool kVerboseError
Definition analysis_utils.h:100
Data Structures — ALCOR output structure.
Definition analysis_utils.h:23
int fifo
Definition analysis_utils.h:24
int pixel
Definition analysis_utils.h:28
int counter
Definition analysis_utils.h:26
int type
Definition analysis_utils.h:25
int column
Definition analysis_utils.h:27
int tdc
Definition analysis_utils.h:29
int coarse
Definition analysis_utils.h:31
int fine
Definition analysis_utils.h:32
int rollover
Definition analysis_utils.h:30