sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
tgraphs_to_ttree.C
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <filesystem>
4
5std::map<int, float> thresholds;
6std::map<int, float> mean_1pe;
7std::map<int, float> sigma_1pe;
9{
10 thresholds[51] = 0.25;
11 thresholds[52] = 0.30;
12 thresholds[53] = 0.35;
13 thresholds[55] = 0.45;
14 thresholds[57] = 0.55;
15 mean_1pe[51] = 1.72219e-01;
16 mean_1pe[52] = 2.24019e-01;
17 mean_1pe[53] = 2.73532e-01;
18 mean_1pe[55] = 3.74145e-01;
19 mean_1pe[57] = 4.60333e-01;
20 sigma_1pe[51] = 4.21654e-03;
21 sigma_1pe[52] = 4.22809e-03;
22 sigma_1pe[53] = 5.20792e-03;
23 sigma_1pe[55] = 5.19898e-03;
24 sigma_1pe[57] = 6.05599e-03;
25}
26
27std::pair<float, float> find_first_amplitude(TGraph *gTarget, int start_point = 5000, bool maximum = true)
28{
29 auto maximum_points = gTarget->GetN();
30 auto amplitude = 0.;
31 auto amplitude_x = 0.;
32 for (auto iPnt = start_point; iPnt <= maximum_points; iPnt++)
33 {
34 auto current_x = gTarget->GetPointX(iPnt);
35 auto current_y = gTarget->GetPointY(iPnt);
36 if (current_y <= -0.99)
37 continue;
38 if ((maximum ? (amplitude < current_y) : (amplitude > current_y)))
39 {
40 amplitude = current_y;
41 amplitude_x = iPnt;
42 }
43 if ((maximum ? ((current_y - amplitude) < -0.02) : ((current_y - amplitude) > 0.02)) && (fabs(amplitude) > 0.1))
44 break;
45 }
46 return {amplitude_x, amplitude};
47}
48
49float measure_baseline_signal(TGraph *gTarget, int max_point = 3000)
50{
51 auto average_baseline = 0.;
52 for (auto iPnt = 1; iPnt <= max_point; iPnt++)
53 {
54 average_baseline += gTarget->GetPointY(iPnt) / max_point;
55 }
56 return average_baseline;
57}
58
59float measure_baseline_timing(TGraph *gTarget)
60{
61 auto maximum_points = gTarget->GetN();
62 auto average_baseline = 0.;
63 for (auto iPnt = 1; iPnt <= maximum_points; iPnt++)
64 {
65 // average_baseline += gTarget->GetPointY(iPnt) / max_point;
66 }
67 return average_baseline;
68}
69
70float find_time_signal(TGraph *gTarget, float baseline_level, std::pair<float, float> amplitude_full)
71{
72 auto max_x = 0.;
73 auto min_x = 0.;
74 for (auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
75 {
76 auto current_x = gTarget->GetPointX(iPnt);
77 auto current_y = gTarget->GetPointY(iPnt);
78 if ((current_y < amplitude_full.second * 0.8) && (max_x == 0))
79 max_x = current_x;
80 if ((current_y < amplitude_full.second * 0.2) && (min_x == 0))
81 min_x = current_x;
82 if ((min_x != 0) && (max_x != 0))
83 break;
84 }
85 gTarget->Fit("pol1", "Q", "", min_x, max_x);
86 auto pol1 = gTarget->GetFunction("pol1");
87 auto q = pol1->GetParameter(0);
88 auto m = pol1->GetParameter(1);
89 auto timing_x = (baseline_level - q) / m;
90 return timing_x;
91}
92
93float find_time_timing(TGraph *gTarget, float baseline_level, std::pair<float, float> amplitude_full)
94{
95 auto max_x = 0.;
96 auto min_x = 0.;
97 for (auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
98 {
99 auto current_x = gTarget->GetPointX(iPnt);
100 auto current_y = gTarget->GetPointY(iPnt);
101 if ((current_y > amplitude_full.second * 0.8) && (max_x == 0))
102 max_x = current_x;
103 if ((current_y > amplitude_full.second * 0.2) && (min_x == 0))
104 min_x = current_x;
105 if ((min_x != 0) && (max_x != 0))
106 break;
107 }
108 gTarget->Fit("pol1", "Q", "", min_x, max_x);
109 auto pol1 = gTarget->GetFunction("pol1");
110 auto q = pol1->GetParameter(0);
111 auto m = pol1->GetParameter(1);
112 auto timing_x = (baseline_level - q) / m;
113 return timing_x;
114}
115
116float find_time_signal_1(TGraph *gTarget, float baseline_level, std::pair<float, float> amplitude_full)
117{
118 for (auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
119 {
120 auto current_x = gTarget->GetPointX(iPnt);
121 auto current_y = gTarget->GetPointY(iPnt);
122 if ((current_y < amplitude_full.second * 0.5))
123 return current_x;
124 }
125 return -1.;
126}
127
128float find_time_timing_1(TGraph *gTarget, float baseline_level, std::pair<float, float> amplitude_full)
129{
130 for (auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
131 {
132 auto current_x = gTarget->GetPointX(iPnt);
133 auto current_y = gTarget->GetPointY(iPnt);
134 if ((current_y > amplitude_full.second * 0.5))
135 return current_x;
136 }
137 return -1.;
138}
139
140void tgraphs_to_ttree(std::string input_file, int vbias = 0, std::string output_file = "ttree.root")
141{
143 std::map<int, TGraph *> _TimingGraphs;
144 std::map<int, TGraph *> _SignalGraphs;
145 std::map<std::string, TH1F *> _TH1F;
146 _TH1F["hDelta"] = new TH1F("hDelta", "hDelta", 2000, 50, 100);
147 _TH1F["hDelta_1"] = new TH1F("hDelta_1", "hDelta_1", 2000, 50, 100);
148 auto timing_channel_graphs = -1;
149 auto signal_channel_graphs = -1;
150 TFile *fin = new TFile(input_file.c_str());
151 while (true)
152 {
153 timing_channel_graphs++;
154 signal_channel_graphs++;
155 std::string timing_label = "timing_" + std::to_string(timing_channel_graphs);
156 std::string signal_label = "signal_" + std::to_string(signal_channel_graphs);
157 _TimingGraphs[timing_channel_graphs] = (TGraph *)(fin->Get(timing_label.c_str()));
158 _SignalGraphs[signal_channel_graphs] = (TGraph *)(fin->Get(signal_label.c_str()));
159 if (!_TimingGraphs[timing_channel_graphs] || !_SignalGraphs[signal_channel_graphs])
160 break;
161 }
162 // Output files
163 TFile *fout = new TFile(output_file.c_str(), "RECREATE");
164 float signal_amplitude = 0.;
165 float timing_amplitude = 0.;
166 float signal_time = 0.;
167 float timing_time = 0.;
168 float signal_time_1 = 0.;
169 float timing_time_1 = 0.;
170 float delta = 0.;
171 float delta_1 = 0.;
172 TTree *tree = new TTree("tree", "tree");
173 tree->Branch("signal_amplitude", &signal_amplitude, "signal_amplitude/F");
174 tree->Branch("timing_amplitude", &timing_amplitude, "timing_amplitude/F");
175 tree->Branch("signal_time", &signal_time, "signal_time/F");
176 tree->Branch("timing_time", &timing_time, "timing_time/F");
177 tree->Branch("signal_time_1", &signal_time_1, "signal_time_1/F");
178 tree->Branch("timing_time_1", &timing_time_1, "timing_time_1/F");
179 tree->Branch("delta", &delta, "delta/F");
180 tree->Branch("delta_1", &delta_1, "delta_1/F");
181 int iTer = -1;
182 for (auto not_used : _TimingGraphs)
183 {
184 iTer++;
185 auto timing_graph = _TimingGraphs[iTer];
186 auto signal_graph = _SignalGraphs[iTer];
187 if (!timing_graph || !signal_graph)
188 continue;
189 // Amplitude of signal
190 auto amplitude_full = find_first_amplitude(signal_graph);
191 auto baseline_level = measure_baseline_signal(signal_graph);
192 signal_amplitude = amplitude_full.second - baseline_level;
193 // Cut on 1-pe
194 if (fabs(amplitude_full.second - mean_1pe[vbias]) > 10 * sigma_1pe[vbias])
195 continue;
196 // Amplitude of timing
197 auto baseline_level_timing = measure_baseline_timing(timing_graph);
198 auto amplitude_full_timing = find_first_amplitude(timing_graph, 0, false);
199 timing_amplitude = amplitude_full_timing.second - baseline_level_timing;
200 // Cut on good timing
201 if (amplitude_full_timing.second > -0.6)
202 continue;
203 // Timing of signal
204 signal_time = find_time_signal(signal_graph, baseline_level, amplitude_full);
205 signal_time_1 = find_time_signal_1(signal_graph, baseline_level, amplitude_full);
206 // Timing of timing_1
207 timing_time = find_time_timing(timing_graph, baseline_level_timing, amplitude_full_timing);
208 timing_time_1 = find_time_timing_1(timing_graph, baseline_level_timing, amplitude_full_timing);
209 // Delta
210 delta = signal_time - timing_time;
211 delta_1 = signal_time_1 - timing_time_1;
212 // Histogram
213 _TH1F["hDelta"]->Fill(delta*1.e9);
214 _TH1F["hDelta_1"]->Fill(delta_1*1.e9);
215 // Tree fill
216 tree->Fill();
217 }
218 tree->Write();
219 for (auto [label, histo] : _TH1F)
220 histo->Write();
221 fout->Close();
222}
std::map< int, float > thresholds
Definition tgraphs_to_ttree.C:5
float find_time_timing_1(TGraph *gTarget, float baseline_level, std::pair< float, float > amplitude_full)
Definition tgraphs_to_ttree.C:128
std::map< int, float > mean_1pe
Definition tgraphs_to_ttree.C:6
float measure_baseline_signal(TGraph *gTarget, int max_point=3000)
Definition tgraphs_to_ttree.C:49
float find_time_signal(TGraph *gTarget, float baseline_level, std::pair< float, float > amplitude_full)
Definition tgraphs_to_ttree.C:70
float find_time_signal_1(TGraph *gTarget, float baseline_level, std::pair< float, float > amplitude_full)
Definition tgraphs_to_ttree.C:116
float find_time_timing(TGraph *gTarget, float baseline_level, std::pair< float, float > amplitude_full)
Definition tgraphs_to_ttree.C:93
std::map< int, float > sigma_1pe
Definition tgraphs_to_ttree.C:7
std::pair< float, float > find_first_amplitude(TGraph *gTarget, int start_point=5000, bool maximum=true)
Definition tgraphs_to_ttree.C:27
float measure_baseline_timing(TGraph *gTarget)
Definition tgraphs_to_ttree.C:59
void tgraphs_to_ttree(std::string input_file, int vbias=0, std::string output_file="ttree.root")
Definition tgraphs_to_ttree.C:140
void set_thresholds()
Definition tgraphs_to_ttree.C:8