36 else { assert(
false); }
48 const double residual = (*resiter)[
kResidual];
52 if (fabs(residual) < 0.1) {
54 sum_xx += residual*residual;
62 double mean = sum_x/double(N);
63 double stdev =
sqrt(sum_xx/
double(N) -
pow(sum_x/
double(N), 2));
70 const double residual = (*resiter)[
kResidual];
71 if (mean - 1.5*stdev < residual && residual < mean + 1.5*stdev) {
73 sum_xx += residual*residual;
77 mean = sum_x/double(N);
78 stdev =
sqrt(sum_xx/
double(N) -
pow(sum_x/
double(N), 2));
84 const double residual = (*resiter)[
kResidual];
85 if (mean - 1.5*stdev < residual && residual < mean + 1.5*stdev) {
87 sum_xx += residual*residual;
91 mean = sum_x/double(N);
92 stdev =
sqrt(sum_xx/
double(N) -
pow(sum_x/
double(N), 2));
94 std::vector<int> parNum;
95 std::vector<std::string> parName;
96 std::vector<double>
start;
97 std::vector<double>
step;
98 std::vector<double> low;
99 std::vector<double> high;
101 parNum.push_back(
kAngle); parName.push_back(
std::string(
"angle")); start.push_back(mean); step.push_back(0.1); low.push_back(0.); high.push_back(0.);
102 parNum.push_back(
kXControl); parName.push_back(
std::string(
"xcontrol")); start.push_back(0.); step.push_back(0.1); low.push_back(0.); high.push_back(0.);
103 parNum.push_back(
kYControl); parName.push_back(
std::string(
"ycontrol")); start.push_back(0.); step.push_back(0.1); low.push_back(0.); high.push_back(0.);
104 parNum.push_back(
kSigma); parName.push_back(
std::string(
"sigma")); start.push_back(stdev); step.push_back(0.1*stdev); low.push_back(0.); high.push_back(0.);
106 parNum.push_back(
kGamma); parName.push_back(
std::string(
"gamma")); start.push_back(stdev); step.push_back(0.1*stdev); low.push_back(0.); high.push_back(0.);
113 std::stringstream raw_name, narrowed_name, xcontrol_name, ycontrol_name;
114 raw_name << name <<
"_raw";
115 narrowed_name << name <<
"_narrowed";
116 xcontrol_name << name <<
"_xcontrol";
117 ycontrol_name << name <<
"_ycontrol";
119 TH1F *raw_hist = dir->
make<TH1F>(raw_name.str().c_str(), (raw_name.str() +
std::string(
" (mrad)")).c_str(), 100, -100., 100.);
120 TH1F *narrowed_hist = dir->
make<TH1F>(narrowed_name.str().c_str(), (narrowed_name.str() +
std::string(
" (mrad)")).c_str(), 100, -100., 100.);
121 TProfile *xcontrol_hist = dir->
make<TProfile>(xcontrol_name.str().c_str(), (xcontrol_name.str() +
std::string(
" (mrad)")).c_str(), 100, -1., 1.);
122 TProfile *ycontrol_hist = dir->
make<TProfile>(ycontrol_name.str().c_str(), (ycontrol_name.str() +
std::string(
" (mrad)")).c_str(), 100, -1., 1.);
124 narrowed_name <<
"fit";
125 xcontrol_name <<
"fit";
126 ycontrol_name <<
"fit";
128 double scale_factor = double(
numResiduals()) * (100. - -100.)/100;
130 TF1 *narrowed_fit =
nullptr;
134 narrowed_fit->Write();
139 narrowed_fit->Write();
144 narrowed_fit->Write();
149 narrowed_fit->Write();
152 TF1 *xcontrol_fit =
new TF1(xcontrol_name.str().c_str(),
"[0]+x*[1]", -1., 1.);
154 xcontrol_fit->Write();
156 TF1 *ycontrol_fit =
new TF1(ycontrol_name.str().c_str(),
"[0]+x*[1]", -1., 1.);
158 ycontrol_fit->Write();
161 const double raw_residual = (*resiter)[
kResidual];
163 const double yangle = (*resiter)[
kYAngle];
167 double corrected_residual = raw_residual - xangle_correction - yangle_correction;
169 raw_hist->Fill(raw_residual * 1000.);
170 narrowed_hist->Fill(corrected_residual * 1000.);
172 xcontrol_hist->Fill(xangle, (raw_residual - yangle_correction) * 1000.);
173 ycontrol_hist->Fill(yangle, (raw_residual - xangle_correction) * 1000.);
double MuonResidualsFitter_logGaussPowerTails(double residual, double center, double sigma)
Double_t MuonResidualsFitter_powerLawTails_TF1(Double_t *xvec, Double_t *par)
long numResiduals() const
MuonResidualsFitter * fitter()
int residualsModel() const
double plot(std::string name, TFileDirectory *dir, Alignable *ali) override
bool dofit(void(*fcn)(int &, double *, double &, double *, int), std::vector< int > &parNum, std::vector< std::string > &parName, std::vector< double > &start, std::vector< double > &step, std::vector< double > &low, std::vector< double > &high)
double MuonResidualsFitter_logROOTVoigt(double residual, double center, double sigma, double gamma)
bool fit(Alignable *ali) override
double MuonResidualsFitter_logPowerLawTails(double residual, double center, double sigma, double gamma)
Double_t MuonResidualsFitter_GaussPowerTails_TF1(Double_t *xvec, Double_t *par)
T * make(const Args &...args) const
make new ROOT object
Double_t MuonResidualsFitter_pureGaussian_TF1(Double_t *xvec, Double_t *par)
std::vector< double * >::const_iterator residuals_end() const
void MuonResidualsAngleFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag)
void inform(TMinuit *tMinuit) override
Double_t MuonResidualsFitter_ROOTVoigt_TF1(Double_t *xvec, Double_t *par)
std::vector< double * >::const_iterator residuals_begin() const
static TMinuit * MuonResidualsAngleFitter_TMinuit
int sum_x
More diagnostics.
double MuonResidualsFitter_logPureGaussian(double residual, double center, double sigma)
Power< A, B >::type pow(const A &a, const B &b)