|
ATLAS Offline Software
|
Go to the documentation of this file.
12 #include "GaudiKernel/MsgStream.h"
29 f->GetRange(rmin, rmax);
30 std::unique_ptr<TF1> slope_function =
33 slope_function->FixParameter(1,
b);
36 h->Fit(
"slope_function",
"R+",
"");
42 bool add_tmax_difference) {
70 if (seg.
mdtHOT()[
k]->driftTime() < -8e8)
continue;
71 m_t_drift.push_back(std::pair<double, bool>(seg.
mdtHOT()[
k]->driftTime(), seg.
mdtHOT()[
k]->identify().mdtMultilayer() == 2));
77 m_t_drift.push_back(std::pair<double, bool>(seg.
mdtHOT()[
k]->driftTime(), seg.
mdtHOT()[
k]->identify().mdtMultilayer() == 2));
98 std::array<T0MTHistos, 2> drift_time_spec_ml;
103 unsigned int nb_bins(100);
105 std::vector<SamplePoint> point(nb_bins + 1);
116 log << MSG::WARNING <<
"analyse() - Less than 2000 drift-time entries! No r-t relationship will be determined!" <<
endmsg;
130 float min_t =
m_t_drift[0].first - 100.0;
132 std::unique_ptr<TH1F> tspec = std::make_unique<TH1F>(
"tspec",
"DRIFT-TIME SPECTRUM", n_bins, min_t, max_t);
133 std::array<std::unique_ptr<TH1F>, 2> tspec_ml;
134 tspec_ml[0] = std::make_unique<TH1F>(
"tspec_ml0",
"DRIFT-TIME SPECTRUM ML 0", n_bins, min_t, max_t);
135 tspec_ml[1] = std::make_unique<TH1F>(
"tspec_ml1",
"DRIFT-TIME SPECTRUM ML 1", n_bins, min_t, max_t);
138 tspec->Fill(
k.first, 1.0);
139 tspec_ml[
static_cast<unsigned int>(
k.second)]->Fill(
k.first, 1.0);
141 drift_time_spec.
SetTSpec(1, tspec.get(), &t0_setting,
false);
142 drift_time_spec_ml[0].SetTSpec(2, tspec_ml[0].
get(), &t0_setting,
false);
143 drift_time_spec_ml[1].SetTSpec(3, tspec_ml[1].
get(), &t0_setting,
false);
147 if (!drift_time_spec.
FitT0() || !drift_time_spec.
T0Ok()) {
149 log << MSG::WARNING <<
"analyse() - t0 fit not successful, no r-t relationship will be calculated!" <<
endmsg;
154 if (!drift_time_spec.
FitTmax() || !drift_time_spec.
TmaxOk()) {
156 log << MSG::WARNING <<
"analyse() - tmax fit not successful, no r-t relationship will be calculated!" <<
endmsg;
170 bin_content =
static_cast<double>(
m_nb_hits_used) /
static_cast<double>(nb_bins);
175 point[0].set_x2(0.0);
176 point[0].set_error(0.1);
179 for (
unsigned int k = 1;
k < nb_bins;
k++) {
181 point[
k].set_x1(
m_t_drift[k_min +
static_cast<int>(bin_content) * (
k)].
first);
183 point[
k].set_error(1.0);
186 point[nb_bins].set_x1(tmax);
187 point[nb_bins].set_x2(
m_r_max);
188 point[nb_bins].set_error(1.);
196 std::vector<SamplePoint> add_fit_point;
201 std::shared_ptr<IRtRelation> rt_new = std::make_shared<RtRelationLookUp>(tmp_rt);
209 std::array<float, 2>
b{}, tmax{}, T{};
210 for (
unsigned int i = 0;
i < 2;
i++) {
211 if (!drift_time_spec_ml[
i].FitT0()) {
215 if (!drift_time_spec_ml[
i].FitTmax()) {
225 int refit =
static_cast<int>((
b[1] + 1.33717e-03) > (
b[0] + 1.33717
e-03));
226 int norefit =
static_cast<bool>(refit) ? 0 : 1;
227 TF1 *fixfun = drift_time_spec_ml[refit].GetTMaxFunctionNC();
230 TList *
l = drift_time_spec_ml[refit].GetTSpec()->GetListOfFunctions();
231 l->Remove(
l->FindObject(
"mt_tmax_fermi"));
232 fit_ok = drift_time_spec_ml[refit].FitTmax();
244 m_output = std::make_unique<RtCalibrationOutput>(
245 rt_new, std::make_shared<RtFullInfo>(
"RtCalibrationIntegration", 1,
m_nb_segments_used, 0.0, 0.0, 0.0, 0.0));
const T0MTSettingsTMax * TMaxSettings() const
get settings for the tmax-fit
std::shared_ptr< IMdtCalibrationOutput > MdtCalibOutputPtr
unsigned int m_nb_hits_used
bool handleSegment(MuonCalibSegment &seg)
analyse the segment "seg"
singleton-like access to IMessageSvc via open function and helper
double WidthAB() const
Width of the region in which the parameters a and b are estimated.
bool m_add_tmax_difference
const TF1 * GetT0Function() const
returns function fitted to the riding edge of the spectrum
unsigned int m_nb_segments_used
const T0MTSettingsT0 * T0Settings() const
get settings for the t0-fit
TGraphErrors * GetEntries(TH2F *histo)
void SetTmaxDiff(const double d)
set the difference in total drift time betwene the two multilayers (ML1 - ML2)
Equidistant look up table for rt-relations with the time as key.
IMessageSvc * getMessageSvc(bool quiet=false)
std::shared_ptr< IRtRelation > m_rt
void setInput(const IMdtCalibrationOutput *rt_input) override
the method is empty as no initial r-t relationship is required by the algorithm
unsigned int mdtCloseHits() const
retrieve the number of nearby mdt hits.
double m_upper_extrapolation_radius
parabolic extrapolation.
bool analyse()
perform the integration method
bool FitTmax()
Performs tmax-fit Returns true if fit is successfull.
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.
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.
Double_t slope_function_C(Double_t *x, Double_t *par)
MdtCalibOutputPtr getResults() const override
returns the final r-t relationship
std::shared_ptr< RtCalibrationOutput > m_output
static constexpr int TMAX_PAR_NR_A
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
static RtChebyshev getRtChebyshev(const std::vector< SamplePoint > &sample_points, const unsigned int &order)
< get an RtChebyshev resembling the r(t) function as described by the sample points in the vector "sa...
double m_lower_extrapolation_radius
sets the lower radius to perform the
bool converged() const
returns true, if the integration method has been performed
static constexpr int TMAX_PAR_NR_B
static constexpr int TMAX_PAR_NR_T0
static constexpr int T0_PAR_NR_T0
parameter numbers in t0 fit
MdtCalibOutputPtr analyseSegments(const MuonSegVec &seg) override
determine r(t)
unsigned int mdtHitsOnTrack() const
retrieve the number of MdtCalibHitBase s assigned to this segment
const TF1 * GetTMaxFunction() const
returns function fitted to the riding edge of the spectrum
void init(bool close_hits, double r_max, double lower_extrapolation_radius, double higher_extrapolation_radius, bool add_tmax_difference)
bool FitT0()
Perform t0-fit Returns true if fit is successfull.
const bool & AddFitfun() const
If set to true the fitted functions are added to the histograms.
static constexpr int TMAX_PAR_NR_T
std::vector< std::pair< double, bool > > m_t_drift
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
static constexpr int TMAX_PAR_NR_TMAX
parameters numbers for tmax fit
unsigned int number_of_hits_used() const
get the number of hits used in the r-t determination
std::vector< std::shared_ptr< MuonCalibSegment > > MuonSegVec
static constexpr int TMAX_PAR_NR_BACK
const MdtHitVec & mdtHOT() const
retrieve the full set of MdtCalibHitBase s assigned to this segment
void update_parameter_on_mttmax(TH1 *h, TF1 *f, const float &b, const float &T, const T0MTSettingsTMax &tmax_settings)
bool T0Ok() const
returns true if t0-fit was successfull
bool TmaxOk() const
returns true if tmax-fir was successfull