29 auto maximum_points = gTarget->GetN();
31 auto amplitude_x = 0.;
32 for (
auto iPnt = start_point; iPnt <= maximum_points; iPnt++)
34 auto current_x = gTarget->GetPointX(iPnt);
35 auto current_y = gTarget->GetPointY(iPnt);
36 if (current_y <= -0.99)
38 if ((maximum ? (amplitude < current_y) : (amplitude > current_y)))
40 amplitude = current_y;
43 if ((maximum ? ((current_y - amplitude) < -0.02) : ((current_y - amplitude) > 0.02)) && (fabs(amplitude) > 0.1))
46 return {amplitude_x, amplitude};
70float find_time_signal(TGraph *gTarget,
float baseline_level, std::pair<float, float> amplitude_full)
74 for (
auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
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))
80 if ((current_y < amplitude_full.second * 0.2) && (min_x == 0))
82 if ((min_x != 0) && (max_x != 0))
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;
93float find_time_timing(TGraph *gTarget,
float baseline_level, std::pair<float, float> amplitude_full)
97 for (
auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
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))
103 if ((current_y > amplitude_full.second * 0.2) && (min_x == 0))
105 if ((min_x != 0) && (max_x != 0))
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;
116float find_time_signal_1(TGraph *gTarget,
float baseline_level, std::pair<float, float> amplitude_full)
118 for (
auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
120 auto current_x = gTarget->GetPointX(iPnt);
121 auto current_y = gTarget->GetPointY(iPnt);
122 if ((current_y < amplitude_full.second * 0.5))
128float find_time_timing_1(TGraph *gTarget,
float baseline_level, std::pair<float, float> amplitude_full)
130 for (
auto iPnt = amplitude_full.first; iPnt > 0; iPnt--)
132 auto current_x = gTarget->GetPointX(iPnt);
133 auto current_y = gTarget->GetPointY(iPnt);
134 if ((current_y > amplitude_full.second * 0.5))
140void tgraphs_to_ttree(std::string input_file,
int vbias = 0, std::string output_file =
"ttree.root")
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());
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])
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.;
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");
182 for (
auto not_used : _TimingGraphs)
185 auto timing_graph = _TimingGraphs[iTer];
186 auto signal_graph = _SignalGraphs[iTer];
187 if (!timing_graph || !signal_graph)
192 signal_amplitude = amplitude_full.second - baseline_level;
199 timing_amplitude = amplitude_full_timing.second - baseline_level_timing;
201 if (amplitude_full_timing.second > -0.6)
204 signal_time =
find_time_signal(signal_graph, baseline_level, amplitude_full);
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);
210 delta = signal_time - timing_time;
211 delta_1 = signal_time_1 - timing_time_1;
213 _TH1F[
"hDelta"]->Fill(delta*1.e9);
214 _TH1F[
"hDelta_1"]->Fill(delta_1*1.e9);
219 for (
auto [label, histo] : _TH1F)
float find_time_timing_1(TGraph *gTarget, float baseline_level, std::pair< float, float > amplitude_full)
Definition tgraphs_to_ttree.C:128
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::pair< float, float > find_first_amplitude(TGraph *gTarget, int start_point=5000, bool maximum=true)
Definition tgraphs_to_ttree.C:27
void tgraphs_to_ttree(std::string input_file, int vbias=0, std::string output_file="ttree.root")
Definition tgraphs_to_ttree.C:140