sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
fine_analysis.h
Go to the documentation of this file.
1#ifndef ALCOR_UTILITYFINEANALYSIS_H
2#define ALCOR_UTILITYFINEANALYSIS_H
12#include "analysis_utils.h"
13using namespace analysis_utils;
16typedef std::tuple<double, double, double> kFineTuneParamsType;
17std::map<global_identifier_t,kFineTuneParamsType> kFineTuneParameters; // Is detector unit oriented
18std::map<TString,TH2F*> kFineTuneRawHistograms; // Is Run oriented
22bool kIgnoreFix = false;
24const float kEspilonOffsets = 0.001; // 3.125 ps
25const float kEspilonOffMean = 0.001; // 3.125 ps
30const TString output_preprocess_fine_analysis_file_offset_rslt = output_preprocess_fine_analysis_directory + TString("/%s/FineTuneOffsetResults.root");
31const TString output_preprocess_fine_analysis_file_check = output_preprocess_fine_analysis_directory + TString("/%s/FineTuneResultsCheck.root");
33TF1* fine_analysis_fit_function = new TF1("fine_analysis_fit_function", "[0]*(1./(exp((x-[1])/[2])+1))*(1./(exp(([3]-x)/[4])+1))", 20., 150.);
38template< typename TH2_Type = TH2F >
39TH2_Type* build_fine_tune_raw_histogram ( std::vector<TString> kInputFileNames, TString kRunTag, TString kOutputFileName, bool kRecalculate );
40template< typename TH2_Type = TH2F >
41TH2_Type* build_fine_tune_raw_histogram ( TString kRunTag, TString kOutputFileName, bool kRecalculate );
42template< typename TH2_Type = TH2F >
43TH2_Type* run_fine_tune_analysis ( TString kRunTag, TString kOutputFileName, TString kOutputGraphics, bool kRecalculate );
47double get_fine_calibration_min ( global_identifier_t kFilters ) { return get<0>(get_fine_calibration(kFilters)); }
48double get_fine_calibration_max ( global_identifier_t kFilters ) { return get<1>(get_fine_calibration(kFilters)); }
49double get_fine_calibration_offset ( global_identifier_t kFilters ) { return get<2>(get_fine_calibration(kFilters)); }
50template< typename TH2_Type = TH2F >
51TH2_Type* get_fine_tune_parameters ( TString kRunTag );
52template< typename TH2_Type = TH2F >
53TH2_Type* get_fine_tune_raw_histogram ( TString kRunTag );
54TH1D* get_fine_tune_raw_histogram ( global_identifier_t kFilters ) { return get_fine_tune_raw_histogram( get<0>(kFilters) )->ProjectionY( Form("hFine_%i", get<1>(kFilters) ), get<1>(kFilters) + 1, get<1>(kFilters) + 1); }
55void set_fine_calibration ( global_identifier_t kFilters, double kCalibrationMin, double kCalibrationMax, double kCalibrationOffset ) { kFineTuneParameters[kFilters] = { kCalibrationMin, kCalibrationMax, kCalibrationOffset }; }
56void set_fine_calibration_min ( global_identifier_t kFilters, double kCalibrationMin ) { get<0>(kFineTuneParameters[kFilters]) = kCalibrationMin; }
57void set_fine_calibration_max ( global_identifier_t kFilters, double kCalibrationMax ) { get<1>(kFineTuneParameters[kFilters]) = kCalibrationMax; }
58void set_fine_calibration_offset ( global_identifier_t kFilters, double kCalibrationOffset ) { get<2>(kFineTuneParameters[kFilters]) = kCalibrationOffset; }
60void set_fine_analysis_fit_function ( TH1D* histo, int riseThreshold =1, int dropThreshold =1, int max_step = -3, int min_step = 3);
61template< typename TH2_Type = TH2F >
62void set_fine_tune_raw_histogram ( TString kRunTag, TH2_Type* kFineTuneRawHistogram ) { kFineTuneRawHistograms[kRunTag] = kFineTuneRawHistogram; }
63void set_fine_tune_raw_histogram ( TString kRunTag ) { kFineTuneRawHistograms[kRunTag] = build_fine_tune_raw_histogram( kRunTag, "", false ); };
64template< typename TH2_Type = TH2F >
65void set_fine_tune_raw_histogram ( global_identifier_t kFilters, TH2_Type* kFineTuneRawHistogram ) { set_fine_tune_raw_histogram( get<0>(kFilters), kFineTuneRawHistogram ); }
68double calculate_calibrated_phase ( int kFineParameter, double kCalibrationMin, double kCalibrationMax, double kCalibrationOffset );
69double calculate_calibrated_phase ( int kFineParameter, global_identifier_t kFilters ) { return calculate_calibrated_phase(kFineParameter, get_fine_calibration_min(kFilters), get_fine_calibration_max(kFilters), get_fine_calibration_offset(kFilters)); }
70double calculate_calibrated_phase ( int kFineParameter, TString kRunTag, int kGlobalIndex ) { return calculate_calibrated_phase(kFineParameter,{kRunTag,kGlobalIndex}); };
71template< typename TH1_Type = TH1F >
72int get_fit_bump ( TH1_Type* histo, double critical_value, int bin_step );
77template< typename TH2_Type = TH2F >
78TH2_Type*
80 ( std::vector<TString> kInputFileNames, TString kRunTag, TString kOutputFileName, bool kRecalculate ) {
82 TFile* kFileOut = new TFile( Form (output_preprocess_fine_analysis_file_raw,kRunTag.Data()));
84 cout << "[INFO] Looking if fine tune histogram for tuning is cached" << endl;
85 if ( kFileOut->IsOpen() && !kRecalculate ) { cout << "[INFO] Found! Using cached" << endl; return (TH2F*)(kFileOut->Get("hFine_All")); }
86 else { cout << "[INFO] Not found! Re-generating" << endl; delete kFileOut; }
88 TH2_Type* hFine_All = new TH2_Type("hFine_All", ";index;fine", kGlobalIndexRange, 0, kGlobalIndexRange, kFineRange, 0, kFineRange);
90 for ( auto kCurrentFileName : kInputFileNames ) {
91 std::cout << "[INFO] Opening file: " << kCurrentFileName.Data() << std::endl;
93 auto kCurrentFile = TFile::Open(kCurrentFileName);
94 if ( !kCurrentFile || !kCurrentFile->IsOpen() ) {
95 std::cout << "[WARNING] Opening file: " << kCurrentFileName.Data() << " failed!" << std::endl;
96 continue;
97 }
99 data_t kCurrentData;
100 TTree* kCurrentTree = (TTree *)kCurrentFile->Get("alcor");
101 if ( !kCurrentTree ) {
102 std::cout << "[WARNING] No \"alcor\" tree in file: " << kCurrentFileName.Data() << ". Loading failed!" << std::endl;
103 continue;
104 }
106 auto nEvents = kCurrentTree->GetEntries();
107 load_tree( kCurrentTree, kCurrentData );
108 for (int iEv = 0; iEv < nEvents; ++iEv) {
109 kCurrentTree->GetEntry(iEv);
110 int iCurrentIndex = get_global_index( kCurrentData.fifo, kCurrentData.pixel, kCurrentData.column, kCurrentData.tdc );
111 hFine_All->Fill( iCurrentIndex, kCurrentData.fine);
112 }
113 kCurrentFile->Close();
114 }
116 if ( kOutputFileName.Length() != 0 ) {
117 // system(Form("mkdir -p %s", kOutputFileName.Data())); //! TODO: Create folder (?)
118 kFileOut = new TFile( kOutputFileName, "RECREATE" );
119 hFine_All->Write();
120 kFileOut->Close();
121 } else {
122 system(Form("mkdir -p %s/%s",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
123 kFileOut = new TFile( Form (output_preprocess_fine_analysis_file_raw,kRunTag.Data()), "RECREATE" );
124 hFine_All->Write();
125 kFileOut->Close();
126 }
127 return hFine_All;
128}
130template< typename TH2_Type = TH2F >
131TH2_Type*
133 ( TString kRunTag, TString kOutputFileName, bool kRecalculate ) {
134 std::vector<TString> kInputFileNames;
135 for ( Int_t iFile = 0; iFile < 24; iFile++ ) { kInputFileNames.push_back(Form(intput_rawdata_decoded_file,kRunTag.Data(),iFile)); }
137}
139template< typename TH2_Type = TH2F >
146 cout << "[INFO] Looking if fine tune histogram for tuning is cached" << endl;
147 if ( kFileOut->IsOpen() && !kRecalculate ) { cout << "[INFO] Found! Using cached" << endl; return (TH2F*)(kFileOut->Get("kFine_All_Tune_Params")); }
148 else { cout << "[INFO] Not found! Re-generating" << endl; delete kFileOut; }
150 gROOT->SetBatch(true);
154 TH2_Type* kFine_All_Tune_Params = new TH2_Type( "kFine_All_Tune_Params", "kFine_All_Tune_Params", kGlobalIndexRange, -0.5, kGlobalIndexRange-0.5, 6, 0., 6.);
155 TH1F* kMaximumDistribution = new TH1F( "kMaximumDistribution", "kMaximumDistribution", 200, 0, 200 );
156 TH1F* kMinimumDistribution = new TH1F( "kMinimumDistribution", "kMinimumDistribution", 200, 0, 200 );
157 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(1,"Normalisation");
158 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(2,"Maximum");
159 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(3,"Sigma Max");
160 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(4,"Minimum");
161 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(5,"Sigma Min");
162 kFine_All_Tune_Params->GetYaxis()->SetBinLabel(6,"Offset");
164 for ( Int_t iIndex = 0; iIndex < kGlobalIndexRange; iIndex++ ) {
170 if ( kCurrentFineHisto->GetEntries() <= 100 ) {
171 cout << "[WARNING] Skipping empty histogram " << iIndex << " chip:" << get<0>(kCurrentInfos) << " pixel:" << get<1>(kCurrentInfos) << " column:" << get<2>(kCurrentInfos) << " TDC:" << get<3>(kCurrentInfos) << endl;
172 continue;
173 }
176 kFine_All_Tune_Params->SetBinContent( iIndex+1, 1, fine_analysis_fit_function->GetParameter(0) );
177 kFine_All_Tune_Params->SetBinContent( iIndex+1, 2, fine_analysis_fit_function->GetParameter(1) );
178 kFine_All_Tune_Params->SetBinContent( iIndex+1, 3, fine_analysis_fit_function->GetParameter(2) );
179 kFine_All_Tune_Params->SetBinContent( iIndex+1, 4, fine_analysis_fit_function->GetParameter(3) );
180 kFine_All_Tune_Params->SetBinContent( iIndex+1, 5, fine_analysis_fit_function->GetParameter(4) );
181 kMaximumDistribution->Fill(fine_analysis_fit_function->GetParameter(1));
182 kMinimumDistribution->Fill(fine_analysis_fit_function->GetParameter(3));
183 if ( !(kOutputGraphics.Length() == 0) ) {
184 system(Form("mkdir -p %s",kOutputGraphics.Data()));
185 TLatex* kLatex = new TLatex();
186 auto kMinimum = fine_analysis_fit_function->GetParameter(3);
187 auto kMaximum = fine_analysis_fit_function->GetParameter(1);
188 TCanvas* c1 = new TCanvas("", "", 1000, 300);
189 c1->Divide(3,1);
190 c1->cd(1);
191 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMinimum -10, kMinimum +20);
192 kCurrentFineHisto->DrawCopy();
193 kLatex->DrawLatexNDC(0.6, 0.5, Form("Min: %.2f", kMinimum));
194 c1->cd(2);
195 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMinimum -10, kMaximum +10);
196 kCurrentFineHisto->DrawCopy();
197 kLatex->DrawLatexNDC(0.4, 0.5, Form("Max: %.2f", kMaximum));
198 kLatex->DrawLatexNDC(0.4, 0.45, Form("Min: %.2f", kMinimum));
199 c1->cd(3);
200 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMaximum -20, kMaximum +10);
201 kCurrentFineHisto->DrawCopy();
202 kLatex->DrawLatexNDC(0.3, 0.5, Form("Max: %.2f", kMaximum));
203 c1->SaveAs(Form("%s/%s.pdf",kOutputGraphics.Data(),kCurrentFineHisto->GetName()));
204 } else {
206 TLatex* kLatex = new TLatex();
207 auto kMinimum = fine_analysis_fit_function->GetParameter(3);
208 auto kMaximum = fine_analysis_fit_function->GetParameter(1);
209 TCanvas* c1 = new TCanvas("", "", 1000, 300);
210 c1->Divide(3,1);
211 c1->cd(1);
212 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMinimum -10, kMinimum +20);
213 kCurrentFineHisto->DrawCopy();
214 kLatex->DrawLatexNDC(0.6, 0.5, Form("Min: %.2f", kMinimum));
215 c1->cd(2);
216 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMinimum -10, kMaximum +10);
217 kCurrentFineHisto->DrawCopy();
218 kLatex->DrawLatexNDC(0.4, 0.5, Form("Max: %.2f", kMaximum));
219 kLatex->DrawLatexNDC(0.4, 0.45, Form("Min: %.2f", kMinimum));
220 c1->cd(3);
221 kCurrentFineHisto->GetXaxis()->SetRangeUser(kMaximum -20, kMaximum +10);
222 kCurrentFineHisto->DrawCopy();
223 kLatex->DrawLatexNDC(0.3, 0.5, Form("Max: %.2f", kMaximum));
224 c1->SaveAs(Form("%s/%s.pdf", Form( output_preprocess_fine_analysis_graphics_dir.Data(),kRunTag.Data()),kCurrentFineHisto->GetName()));
225 }
226 }
228 if ( kOutputFileName.Length() != 0 ) {
229 // system(Form("mkdir -p %s", kOutputFileName.Data())); //! TODO: Create folder (?)
230 kFileOut = new TFile( kOutputFileName, "RECREATE" );
231 kMaximumDistribution->Write();
232 kMinimumDistribution->Write();
233 hFine_All->Write();
234 kFine_All_Tune_Params->Write();
235 kFileOut->Close();
236 } else {
237 system(Form("mkdir -p %s/%s",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
239 kMaximumDistribution->Write();
240 kMinimumDistribution->Write();
241 hFine_All->Write();
242 kFine_All_Tune_Params->Write();
243 kFileOut->Close();
244 }
246 gROOT->SetBatch(false);
248}
250void
260 for ( auto &spill_data : framed_data ) {
261 auto spill = spill_data.first;
262 auto &frames = spill_data.second;
263 for (auto &frame_data : frames) {
264 auto frame = frame_data.first;
265 auto &chips = frame_data.second;
266 double average_time[6] = {0.};
267 for (auto &chip_data : chips) {
268 auto kNormalisation = 0;
269 auto chip = chip_data.first;
271 if ( chip < 4 ) continue;
272 auto &channels = chip_data.second;
273 for (auto &channel_data : channels) {
274 auto channel = channel_data.first;
275 auto &hits = channel_data.second;
277 auto &hit = hits[0];
278 int iCurrentIndex = get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc );
279 if ( iCurrentIndex == kGlobalIndex ) continue;
280 double phase = calculate_calibrated_phase( hit.fine, kRunTag, get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc ) );
281 if ( phase <= -9.9 ) continue;
282 double time = hit.coarse * coarse_to_ns + hit.rollover * rollover_to_ns - phase * coarse_to_ns; // [ns]
283 average_time[chip] += time;
285 }
286 if (channels.size() > 0) average_time[chip] /= kNormalisation;
287 }
288 if ( chips[4].size() != 32 || chips[5].size() != 32 ) continue;
289 auto delta = average_time[4] - average_time[5];
290 if ( fabs(delta) > 5. ) continue;
291 auto reference = 0.5 * ( average_time[4] + average_time[5] ); // [ns]
293 if ( chips.find(kExaminedChip) == chips.end() ) continue;
295 if ( channels.find(kExaminedChannel) == channels.end() ) continue;
297 auto &hit = hits[0];
298 if ( hit.tdc != kExaminedTDC ) continue;
300 int iCurrentIndex = get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc );
301 if ( iCurrentIndex != kGlobalIndex ) continue;
302 double phase = calculate_calibrated_phase( hit.fine, kRunTag, get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc ) );
303 if ( phase <= -9.9 ) continue;
304 double time = hit.coarse * coarse_to_ns + hit.rollover * rollover_to_ns - phase * coarse_to_ns; // [ns]
305 delta = time - reference;
307 }
308 }
309 }
310}
312template< typename TH2_Type = TH2F,
313 typename TH3_Type = TH3F >
320 cout << "[INFO] Looking if fine tune offset histogram for tuning is cached" << endl;
321 if ( kFileOut->IsOpen() && !kRecalculate ) { cout << "[INFO] Found! Using cached" << endl; return (TH2F*)(kFileOut->Get("kFine_All_Tune_Params")); }
322 else { cout << "[INFO] Not found! Re-generating" << endl; delete kFileOut; }
326 gROOT->SetBatch(true);
328 TH2_Type* hFine_Offset_All = new TH2_Type("hFine_Offset_All", ";index;#Delta t", kGlobalIndexRange, 0, kGlobalIndexRange, 1000, -50, 50 );
329 TH3_Type* hFine_Check_Tune_Phas = new TH3_Type("hFine_Check_Tune", ";index;#Delta t", kGlobalIndexRange, 0, kGlobalIndexRange, 1000, -50, 50, 400, -2, +2 );
330 TH3_Type* hFine_Check_Tune_Fine = new TH3_Type("hFine_Check_Raw_", ";index;#Delta t", kGlobalIndexRange, 0, kGlobalIndexRange, 1000, -50, 50, kFineRange, 0, kFineRange );
331 TH3_Type* hFine_Check_TRaw_Phas = new TH3_Type("hFine_Check_Tune", ";index;#Delta t", kGlobalIndexRange, 0, kGlobalIndexRange, 1000, -50, 50, 400, -2, +2 );
332 TH3_Type* hFine_Check_TRaw_Fine = new TH3_Type("hFine_Check_Raw_", ";index;#Delta t", kGlobalIndexRange, 0, kGlobalIndexRange, 1000, -50, 50, kFineRange, 0, kFineRange );
334 system(Form("mkdir -p %s/%s",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
336 kFine_All_Tune_Params->Write();
337 hFine_Offset_All->Write();
338 kFileOut->Close();
340 for ( int iTer = 0; iTer < kMaximumOffsetCalibIteration; iTer++ ) {
341 break;
343 hFine_Offset_All->Reset();
347 auto hCurrentSlice = hFine_Offset_All->ProjectionY(Form("kOffsetTune_%i",iIndex),iIndex+1,iIndex+1);
349 auto kNewOffset = hCurrentSlice->GetMean() / coarse_to_ns;
350 auto kOldOffset = kFine_All_Tune_Params->GetBinContent(iIndex+1,6);
356 system(Form("mkdir -p %s/%s/OffsetCheck/",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
357 TCanvas* cPlotFit = new TCanvas();
358 gPad->SetLogy();
359 hCurrentSlice->GetXaxis()->SetRangeUser(-10,10);
360 hCurrentSlice->Draw();
361 cPlotFit->SaveAs(Form("%s/%s/OffsetCheck/OffsetCheck_%i_%i.pdf",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data(),iIndex,iTer));
362 delete cPlotFit;
363 }
365 }
368 if ( kOutputFileName.Length() != 0 ) {
369 // system(Form("mkdir -p %s", kOutputFileName.Data())); //! TODO: Create folder (?)
370 kFileOut = new TFile( kOutputFileName, "RECREATE" );
371 kFine_All_Tune_Params->Write();
372 hFine_Offset_All->Write();
373 hFine_Check_Tune_Phas->Write();
374 hFine_Check_Tune_Fine->Write();
375 hFine_Check_TRaw_Phas->Write();
376 hFine_Check_TRaw_Fine->Write();
377 kFileOut->Close();
378 } else {
379 system(Form("mkdir -p %s/%s",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
381 kFine_All_Tune_Params->Write();
382 hFine_Offset_All->Write();
383 hFine_Check_Tune_Phas->Write();
384 hFine_Check_Tune_Fine->Write();
385 hFine_Check_TRaw_Phas->Write();
386 hFine_Check_TRaw_Fine->Write();
387 kFileOut->Close();
388 }
390 gROOT->SetBatch(false);
391 return hFine_Offset_All;
392}
403template< typename TH2_Type = TH2F >
406 ( TString kRunTag ) {
408 run_fine_tune_analysis ( kRunTag, "", "", false );
409 run_fine_tune_offset_analysis ( kRunTag, "", "", false );
412 return (TH2F*)(kFileOut->Get("kFine_All_Tune_Params"));
413}
415template< typename TH2_Type = TH2F >
423void
433void
435 ( TH1D* histo, int riseThreshold =1, int dropThreshold =1, int max_step = -3, int min_step = 3) {
436 double guess = histo->GetBinContent(70);
437 dropThreshold = 0.25*guess;
438 riseThreshold = 0.25*guess;
441 double height = histo->GetBinContent((int)(0.5*(max+min)));
442 double minguess = histo->GetBinCenter(min);
443 double maxguess = histo->GetBinCenter(max);
444 // Set Parameter 0
445 fine_analysis_fit_function->SetParLimits(0, height*0.7, height*1.3);
446 fine_analysis_fit_function->SetParameter(0, height );
447 // Set Parameter 1
448 fine_analysis_fit_function->SetParLimits(1, maxguess*0.7, maxguess*1.3);
449 fine_analysis_fit_function->SetParameter(1, maxguess);
450 // Set Parameter 2
451 fine_analysis_fit_function->SetParLimits(2, 0, 1.);
452 fine_analysis_fit_function->SetParameter(2, 0.4);
453 // Set Parameter 3
454 fine_analysis_fit_function->SetParLimits(3, minguess*0.7, minguess*1.3);
455 fine_analysis_fit_function->SetParameter(3, minguess);
456 // Set Parameter 4
457 fine_analysis_fit_function->SetParLimits(4, 0, 1.);
458 fine_analysis_fit_function->SetParameter(4, 0.4);
459}
463double
484template< typename TH1_Type = TH1F >
485int
487( TH1_Type* histo, double critical_value, int bin_step ) {
488 if ( bin_step > 0 ) {
489 for ( int j=1; j<=histo->GetNbinsX()-bin_step; j+=bin_step ) {
490 double y1 = histo->GetBinContent(j);
491 double y2 = histo->GetBinContent(j+bin_step);
492 if ( fabs(y1-y2) > critical_value ){
493 return (int)(j+bin_step*0.5);
494 }
495 }
496 } else if ( bin_step < 0 ) {
497 for ( int j=histo->GetNbinsX(); j>(-bin_step); j+=bin_step ) {
498 double y1 = histo->GetBinContent(j);
499 double y2 = histo->GetBinContent(j+bin_step);
500 if ( fabs(y1-y2) > critical_value ){
501 return (int)(j+bin_step*0.5);
502 }
503 }
504 }
505 return -1;
506}
510template< typename TH3_Type = TH3F >
511void
515 gROOT->SetBatch();
518 for ( auto &spill_data : framed_data ) {
519 auto spill = spill_data.first;
520 auto &frames = spill_data.second;
521 for (auto &frame_data : frames) {
522 kIgnoreFix = false;
523 auto frame = frame_data.first;
524 auto &chips = frame_data.second;
525 double average_time[6] = {0.};
526 for (auto &chip_data : chips) {
527 auto kNormalisation = 0;
528 auto chip = chip_data.first;
529 if ( chip < 4 ) continue;
530 auto &channels = chip_data.second;
531 for (auto &channel_data : channels) {
532 auto channel = channel_data.first;
533 auto &hits = channel_data.second;
535 auto &hit = hits[0];
536 double phase = calculate_calibrated_phase( hit.fine, kRunTag, get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc ) );
537 if ( phase <= -9.9 ) continue;
538 double time = hit.coarse * coarse_to_ns + hit.rollover * rollover_to_ns - phase * coarse_to_ns; // [ns]
539 average_time[chip] += time;
541 }
542 if (channels.size() > 0) average_time[chip] /= kNormalisation;
543 }
544 if ( chips[4].size() != 32 || chips[5].size() != 32 ) continue;
545 auto delta = average_time[4] - average_time[5];
546 if ( fabs(delta) > 5. ) continue;
547 auto reference = 0.5 * ( average_time[4] + average_time[5] ); // [ns]
549 kIgnoreFix = true;
550 for (auto &chip_data : chips) {
551 auto kNormalisation = 0;
552 auto chip = chip_data.first;
553 auto &channels = chip_data.second;
554 for (auto &channel_data : channels) {
555 auto channel = channel_data.first;
556 auto &hits = channel_data.second;
558 auto &hit = hits[0];
559 auto global_index = get_global_index( hit.fifo, hit.pixel, hit.column, hit.tdc );
561 double calib_time = hit.coarse * coarse_to_ns + hit.rollover * rollover_to_ns - phase * coarse_to_ns; // [ns]
562 double uncal_time = hit.coarse * coarse_to_ns + hit.rollover * rollover_to_ns; // [ns]
567 }
568 }
569 }
570 }
571 }
572 system(Form("mkdir -p %s/%s/TDC_FineTune_Check/",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data()));
573 for ( Int_t iIndex = 512; iIndex < kGlobalIndexRange; iIndex++ ) {
574 TCanvas* cPlotFit = new TCanvas();
575 cPlotFit->Divide(2,2);
576 cPlotFit->cd(1);
577 gStyle->SetOptStat(0);
578 hFine_Check_Tune_Fine->GetXaxis()->SetRange(iIndex+1,iIndex+1);
579 auto hTune_Fine = hFine_Check_Tune_Fine->Project3DProfile("yz");
580 hTune_Fine->SetTitle("t_{i}-t_{ref} both tuned vs fine par.");
581 hTune_Fine->GetYaxis()->SetTitle("t_{i}-t_{ref} (ns)");
582 hTune_Fine->GetXaxis()->SetTitle("fine par. a.u.");
583 hTune_Fine->Draw("COLZ");
584 cPlotFit->cd(2);
585 gStyle->SetOptStat(0);
586 hFine_Check_Tune_Phas->GetXaxis()->SetRange(iIndex+1,iIndex+1);
587 auto hTune_Phas = hFine_Check_Tune_Phas->Project3DProfile("yz");
588 hTune_Phas->SetTitle("t_{i}-t_{ref} both tuned vs calib. phase");
589 hTune_Phas->GetYaxis()->SetTitle("t_{i}-t_{ref} (ns)");
590 hTune_Phas->GetXaxis()->SetTitle("phase a.u.");
591 hTune_Phas->Draw("COLZ");
592 cPlotFit->cd(3);
593 gStyle->SetOptStat(0);
594 hFine_Check_TRaw_Fine->GetXaxis()->SetRange(iIndex+1,iIndex+1);
595 auto hTRaw_Fine = hFine_Check_TRaw_Fine->Project3DProfile("yz");
596 hTRaw_Fine->SetTitle("t_{i}-t_{ref} only ref tuned vs fine par.");
597 hTRaw_Fine->GetYaxis()->SetTitle("t_{i}-t_{ref} (ns)");
598 hTRaw_Fine->GetXaxis()->SetTitle("fine par. a.u.");
599 hTRaw_Fine->Draw("COLZ");
600 cPlotFit->cd(4);
601 gStyle->SetOptStat(0);
602 hFine_Check_TRaw_Phas->GetXaxis()->SetRange(iIndex+1,iIndex+1);
603 auto hTRaw_Phas = hFine_Check_TRaw_Phas->Project3DProfile("yz");
604 hTRaw_Phas->SetTitle("t_{i}-t_{ref} only ref tuned vs calib. phase");
605 hTRaw_Phas->GetYaxis()->SetTitle("t_{i}-t_{ref} (ns)");
606 hTRaw_Phas->GetXaxis()->SetTitle("phase a.u.");
607 hTRaw_Phas->Draw("COLZ");
609 cPlotFit->SaveAs(Form("%s/%s/TDC_FineTune_Check/TDC%i.pdf",output_preprocess_fine_analysis_directory.Data(),kRunTag.Data(),iIndex));
610 delete cPlotFit;
611 }
612 hFine_Check_Tune_Fine->GetXaxis()->SetRange(-1,-1);
613 hFine_Check_Tune_Phas->GetXaxis()->SetRange(-1,-1);
614 hFine_Check_TRaw_Fine->GetXaxis()->SetRange(-1,-1);
615 hFine_Check_TRaw_Phas->GetXaxis()->SetRange(-1,-1);
616 gROOT->SetBatch(false);
617}
619#endif
void set_fine_calibration(global_identifier_t kFilters, double kCalibrationMin, double kCalibrationMax, double kCalibrationOffset)
Definition fine_analysis.h:55
TH2_Type * build_fine_tune_raw_histogram(std::vector< TString > kInputFileNames, TString kRunTag, TString kOutputFileName, bool kRecalculate)
Functions -------------------------------------------------------------------------------------------...
Definition fine_analysis.h:80
const TString output_preprocess_fine_analysis_file_rslt
Definition fine_analysis.h:28
TH2_Type * run_fine_tune_analysis(TString kRunTag, TString kOutputFileName, TString kOutputGraphics, bool kRecalculate)
Definition fine_analysis.h:142
const TString output_preprocess_fine_analysis_file_offset_rslt
Definition fine_analysis.h:30
std::map< global_identifier_t, kFineTuneParamsType > kFineTuneParameters
Definition fine_analysis.h:17
double get_fine_calibration_offset(global_identifier_t kFilters)
Definition fine_analysis.h:49
std::map< TString, TH2F * > kFineTuneRawHistograms
Definition fine_analysis.h:18
void check_fine_tune_effect(TString kRunTag, TH3_Type &hFine_Check_Tune_Phas, TH3_Type &hFine_Check_Tune_Fine, TH3_Type &hFine_Check_TRaw_Phas, TH3_Type &hFine_Check_TRaw_Fine)
NEW THINGS TO INTEGRATE ------—.
Definition fine_analysis.h:513
TH2_Type * run_fine_tune_offset_analysis(TString kRunTag, TString kOutputFileName, TString kOutputGraphics, bool kRecalculate)
Definition fine_analysis.h:316
const TString output_preprocess_fine_analysis_directory
Definition fine_analysis.h:26
void raw_delta_fine_tune_offset(TString kRunTag, int kGlobalIndex, TH2F &hFine_Offset_All)
Definition fine_analysis.h:252
const float kEspilonOffMean
Definition fine_analysis.h:25
int get_fit_bump(TH1_Type *histo, double critical_value, int bin_step)
@Chiara Fraticelli
Definition fine_analysis.h:487
TF1 * fine_analysis_fit_function
Definition fine_analysis.h:33
double get_fine_calibration_max(global_identifier_t kFilters)
Definition fine_analysis.h:48
const TString output_preprocess_fine_analysis_file_offset_raw
Definition fine_analysis.h:29
const TString output_preprocess_fine_analysis_file_check
Definition fine_analysis.h:31
TH2_Type * get_fine_tune_parameters(TString kRunTag)
Get stored fine tune parameters from calibration file.
Definition fine_analysis.h:406
double calculate_calibrated_phase(int kFineParameter, double kCalibrationMin, double kCalibrationMax, double kCalibrationOffset)
— — Calibration function
Definition fine_analysis.h:465
void set_fine_calibration_offset(global_identifier_t kFilters, double kCalibrationOffset)
Definition fine_analysis.h:58
void set_fine_analysis_fit_function(TH1D *histo, int riseThreshold=1, int dropThreshold=1, int max_step=-3, int min_step=3)
@Chiara Fraticelli
Definition fine_analysis.h:435
std::tuple< double, double, double > kFineTuneParamsType
Data Structures -------------------------------------------------------------------------------------...
Definition fine_analysis.h:16
const float kEspilonOffsets
Definition fine_analysis.h:24
void set_fine_tune_raw_histogram(TString kRunTag, TH2_Type *kFineTuneRawHistogram)
Definition fine_analysis.h:62
bool kIgnoreFix
Variables -------------------------------------------------------------------------------------------...
Definition fine_analysis.h:22
const TString output_preprocess_fine_analysis_graphics_dir
Definition fine_analysis.h:32
const int kMaximumOffsetCalibIteration
Definition fine_analysis.h:23
TH2_Type * get_fine_tune_raw_histogram(TString kRunTag)
Get the raw histograms for calibration.
Definition fine_analysis.h:418
void set_fine_calibration_max(global_identifier_t kFilters, double kCalibrationMax)
Definition fine_analysis.h:57
kFineTuneParamsType get_fine_calibration(global_identifier_t kFilters)
— — Getter & Setters
Definition fine_analysis.h:398
void set_fine_calibration_min(global_identifier_t kFilters, double kCalibrationMin)
Definition fine_analysis.h:56
double get_fine_calibration_min(global_identifier_t kFilters)
Definition fine_analysis.h:47
const TString output_preprocess_fine_analysis_file_raw
Definition fine_analysis.h:27
Definition analysis_utils.h:20
std::vector< std::string > timing_filenames
Definition analysis_utils.h:83
const int frame_size
Variables -------------------------------------------------------------------------------------------...
Definition analysis_utils.h:53
int get_dochannel(int pixel, int column)
— Implementation — — Getter & Setters
Definition analysis_utils.h:121
const TString output_preprocess_directory
Definition analysis_utils.h:63
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
std::tuple< Int_t, Int_t, Int_t, Int_t > get_full_info(Int_t iIndex)
Definition analysis_utils.h:158
const Int_t kGlobalIndexTiming_End
Definition analysis_utils.h:56
const TString intput_rawdata_decoded_file_dir
Definition analysis_utils.h:61
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
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, spill_data_t > framed_data_t
Definition analysis_utils.h:48
const Int_t kGlobalIndexTiming_Start
Definition analysis_utils.h:55
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 column
Definition analysis_utils.h:27
int tdc
Definition analysis_utils.h:29
int fine
Definition analysis_utils.h:32