87 {
89
91
92 T0MTSettings t0_setting;
94
98 T0MTHistos drift_time_spec;
99
100 std::array<T0MTHistos, 2> drift_time_spec_ml;
101
103 int k_min(-1);
104
105 unsigned int nb_bins(100);
106 double bin_content;
107 std::vector<SamplePoint> point(nb_bins + 1);
109 double scf = 0.;
110 RtFromPoints rt_from_points;
111
113
115
118 log << MSG::WARNING <<
"analyse() - Less than 2000 drift-time entries! No r-t relationship will be determined!" <<
endmsg;
119 return false;
120 }
121
123
125
126
128
129
130
132 float min_t =
m_t_drift[0].first - 100.0;
134 std::unique_ptr<TH1F> tspec = std::make_unique<TH1F>("tspec", "DRIFT-TIME SPECTRUM", n_bins, min_t, max_t);
135 std::array<std::unique_ptr<TH1F>, 2> tspec_ml;
136 tspec_ml[0] = std::make_unique<TH1F>("tspec_ml0", "DRIFT-TIME SPECTRUM ML 0", n_bins, min_t, max_t);
137 tspec_ml[1] = std::make_unique<TH1F>("tspec_ml1", "DRIFT-TIME SPECTRUM ML 1", n_bins, min_t, max_t);
138
140 tspec->Fill(
k.first, 1.0);
141 tspec_ml[
static_cast<unsigned int>(
k.second)]->Fill(
k.first, 1.0);
142 }
143 drift_time_spec.
SetTSpec(1, tspec.get(), &t0_setting,
false);
144 drift_time_spec_ml[0].SetTSpec(2, tspec_ml[0].
get(), &t0_setting,
false);
145 drift_time_spec_ml[1].SetTSpec(3, tspec_ml[1].
get(), &t0_setting,
false);
146
147
148
149 if (!drift_time_spec.
FitT0() || !drift_time_spec.
T0Ok()) {
151 log << MSG::WARNING <<
"analyse() - t0 fit not successful, no r-t relationship will be calculated!" <<
endmsg;
152 return false;
153 }
155
156 if (!drift_time_spec.
FitTmax() || !drift_time_spec.
TmaxOk()) {
158 log << MSG::WARNING <<
"analyse() - tmax fit not successful, no r-t relationship will be calculated!" <<
endmsg;
159 return false;
160 }
163
164
166 for (
unsigned int k = 0;
k <
m_t_drift.size();
k++) {
168 if (k_min < 0 &&
m_t_drift[k].first >=
t0) { k_min =
k; }
169 }
170
171
172 bin_content =
static_cast<double>(
m_nb_hits_used) /
static_cast<double>(nb_bins);
173
175
177 point[0].set_x2(0.0);
178 point[0].set_error(0.1);
179
180
181 for (
unsigned int k = 1;
k < nb_bins;
k++) {
183 point[
k].set_x1(
m_t_drift[k_min +
static_cast<int>(bin_content) * (k)].first);
184 point[
k].set_x2(radius);
185 point[
k].set_error(1.0);
186 }
187
188 point[nb_bins].set_x1(tmax);
189 point[nb_bins].set_x2(
m_r_max);
190 point[nb_bins].set_error(1.);
191
192
194
196
198 std::vector<SamplePoint> add_fit_point;
199 add_fit_point.push_back(SamplePoint(tmax,
m_r_max, 1.0));
200 RtParabolicExtrapolation rt_extrapolated;
203 std::shared_ptr<IRtRelation> rt_new = std::make_shared<RtRelationLookUp>(tmp_rt);
204
206
208
210 bool fit_ok(true);
211 std::array<float, 2>
b{}, tmax{},
T{};
212 for (
unsigned int i = 0;
i < 2;
i++) {
213 if (!drift_time_spec_ml[i].FitT0()) {
214 fit_ok = false;
215 break;
216 }
217 if (!drift_time_spec_ml[i].FitTmax()) {
218 fit_ok = false;
219 break;
220 }
225 }
226 if (fit_ok) {
227 int refit =
static_cast<int>((
b[1] + 1.33717e-03) > (
b[0] + 1.33717e-03));
228 int norefit = static_cast<bool>(refit) ? 0 : 1;
229 TF1 *fixfun = drift_time_spec_ml[refit].GetTMaxFunctionNC();
232 TList *
l = drift_time_spec_ml[refit].GetTSpec()->GetListOfFunctions();
233 l->Remove(
l->FindObject(
"mt_tmax_fermi"));
234 fit_ok = drift_time_spec_ml[refit].FitTmax();
237 }
238
240 }
241
243
245
246 m_output = std::make_unique<RtCalibrationOutput>(
247 rt_new, std::make_shared<RtFullInfo>(
"RtCalibrationIntegration", 1,
m_nb_segments_used, 0.0, 0.0, 0.0, 0.0));
248
249 return true;
250}
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void update_parameter_on_mttmax(TH1 *h, TF1 *f, const float &b, const float &T, const T0MTSettingsTMax &tmax_settings)
TGraphErrors * GetEntries(TH2F *histo)
unsigned int m_nb_hits_used
std::shared_ptr< IRtRelation > m_rt
unsigned int m_nb_segments_used
double m_lower_extrapolation_radius
sets the lower radius to perform the
double m_upper_extrapolation_radius
parabolic extrapolation.
bool m_add_tmax_difference
std::shared_ptr< RtCalibrationOutput > m_output
std::vector< std::pair< double, bool > > m_t_drift
static std::unique_ptr< IRtRelation > getRtChebyshev(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of r-t data points into a r(t) relation expressed as a series of chebychev polynomial...
static constexpr int T0_PAR_NR_T0
parameter numbers in t0 fit
static constexpr int TMAX_PAR_NR_TMAX
parameters numbers for tmax fit
bool T0Ok() const
returns true if t0-fit was successfull
static constexpr int TMAX_PAR_NR_T
static constexpr int TMAX_PAR_NR_B
bool FitT0()
Perform t0-fit Returns true if fit is successfull.
bool FitTmax()
Performs tmax-fit Returns true if fit is successfull.
void SetTSpec(int id, TH1F *spec, const T0MTSettings *settings, bool copy_spec=true)
set the pointer of the drift-time spectrum to an existing spectrum.
const TF1 * GetT0Function() const
returns function fitted to the riding edge of the spectrum
bool TmaxOk() const
returns true if tmax-fir was successfull
const TF1 * GetTMaxFunction() const
returns function fitted to the riding edge of the spectrum
double SlicingThreshold() const
the chi2 threshold at which the slicing method is used
double ScrambleThreshold() const
the chi2 threshold at which the scrambling method is used
double DistAB() const
Distance of the a/b region from the detected falling edge.
const bool & AddFitfun() const
If set to true the fitted functions are added to the histograms.
const T0MTSettingsT0 * T0Settings() const
get settings for the t0-fit
const T0MTSettingsTMax * TMaxSettings() const
get settings for the tmax-fit
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
IMessageSvc * getMessageSvc(bool quiet=false)
l
Printing final latex table to .tex output file.