CMS 3D CMS Logo

MuonResiduals1DOFFitter.cc
Go to the documentation of this file.
2 #include "TMath.h"
3 
8 
10 
11 void MuonResiduals1DOFFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag) {
13  MuonResidualsFitter *fitter = fitinfo->fitter();
14 
15  fval = 0.;
16  for (std::vector<double *>::const_iterator resiter = fitter->residuals_begin(); resiter != fitter->residuals_end();
17  ++resiter) {
18  const double residual = (*resiter)[MuonResiduals1DOFFitter::kResid];
19  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
20 
21  const double residpeak = par[MuonResiduals1DOFFitter::kAlign];
22  const double residsigma = par[MuonResiduals1DOFFitter::kSigma];
23  const double residgamma = par[MuonResiduals1DOFFitter::kGamma];
24 
27  weight = 1.;
28 
29  if (!MuonResiduals1DOFFitter_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
31  fval += -weight * MuonResidualsFitter_logPureGaussian(residual, residpeak, residsigma);
32  } else if (fitter->residualsModel() == MuonResidualsFitter::kPowerLawTails) {
33  fval += -weight * MuonResidualsFitter_logPowerLawTails(residual, residpeak, residsigma, residgamma);
34  } else if (fitter->residualsModel() == MuonResidualsFitter::kROOTVoigt) {
35  fval += -weight * MuonResidualsFitter_logROOTVoigt(residual, residpeak, residsigma, residgamma);
36  } else if (fitter->residualsModel() == MuonResidualsFitter::kGaussPowerTails) {
37  fval += -weight * MuonResidualsFitter_logGaussPowerTails(residual, residpeak, residsigma);
38  } else {
39  assert(false);
40  }
41  }
42  }
43 }
44 
49  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
50  if (m_weightAlignment) {
51  double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
52  if (TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
55  }
56  } else {
59  }
60  }
62 }
63 
65  initialize_table(); // if not already initialized
66  sumofweights();
67 
68  double resid_sum = 0.;
69  double resid_sum2 = 0.;
70  double resid_N = 0.;
71 
72  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
73  const double residual = (*resiter)[MuonResiduals1DOFFitter::kResid];
74  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
75  double weight = 1. / redchi2;
76  if (!m_weightAlignment)
77  weight = 1.;
78 
79  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
80  if (fabs(residual) < 10.) { // 10 cm
81  resid_sum += weight * residual;
82  resid_sum2 += weight * residual * residual;
83  resid_N += weight;
84  }
85  }
86  }
87 
88  double resid_mean = resid_sum / resid_N;
89  double resid_stdev = sqrt(resid_sum2 / resid_N - pow(resid_sum / resid_N, 2));
90 
91  resid_sum = 0.;
92  resid_sum2 = 0.;
93  resid_N = 0.;
94 
95  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
96  const double residual = (*resiter)[MuonResiduals1DOFFitter::kResid];
97  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
98  double weight = 1. / redchi2;
99  if (!m_weightAlignment)
100  weight = 1.;
101 
102  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
103  if (fabs(residual - resid_mean) < 2.5 * resid_stdev) {
104  resid_sum += weight * residual;
105  resid_sum2 += weight * residual * residual;
106  resid_N += weight;
107  }
108  }
109  }
110 
111  resid_mean = resid_sum / resid_N;
112  resid_stdev = sqrt(resid_sum2 / resid_N - pow(resid_sum / resid_N, 2));
113 
114  std::vector<int> num;
115  std::vector<std::string> name;
116  std::vector<double> start;
117  std::vector<double> step;
118  std::vector<double> low;
119  std::vector<double> high;
120 
121  if (fixed(kAlign)) {
122  num.push_back(kAlign);
123  name.push_back(std::string("Align"));
124  start.push_back(0.);
125  step.push_back(0.01 * resid_stdev);
126  low.push_back(0.);
127  high.push_back(0.);
128  } else {
129  num.push_back(kAlign);
130  name.push_back(std::string("Align"));
131  start.push_back(resid_mean);
132  step.push_back(0.01 * resid_stdev);
133  low.push_back(0.);
134  high.push_back(0.);
135  }
136  num.push_back(kSigma);
137  name.push_back(std::string("Sigma"));
138  start.push_back(resid_stdev);
139  step.push_back(0.01 * resid_stdev);
140  low.push_back(0.);
141  high.push_back(0.);
143  num.push_back(kGamma);
144  name.push_back(std::string("Gamma"));
145  start.push_back(0.1 * resid_stdev);
146  step.push_back(0.01 * resid_stdev);
147  low.push_back(0.);
148  high.push_back(0.);
149  }
150 
152 }
153 
155  sumofweights();
156 
157  std::stringstream name_residual, name_residual_raw;
158  name_residual << name << "_residual";
159  name_residual_raw << name << "_residual_raw";
160 
161  double min_residual = -100.;
162  double max_residual = 100.;
163  TH1F *hist_residual = dir->make<TH1F>(name_residual.str().c_str(), "", 100, min_residual, max_residual);
164  TH1F *hist_residual_raw = dir->make<TH1F>(name_residual_raw.str().c_str(), "", 100, min_residual, max_residual);
165 
166  name_residual << "_fit";
167  TF1 *fit_residual = nullptr;
168  if (residualsModel() == kPureGaussian) {
169  fit_residual =
170  new TF1(name_residual.str().c_str(), MuonResidualsFitter_pureGaussian_TF1, min_residual, max_residual, 3);
171  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
172  10. * value(kAlign),
173  10. * value(kSigma));
174  } else if (residualsModel() == kPowerLawTails) {
175  fit_residual =
176  new TF1(name_residual.str().c_str(), MuonResidualsFitter_powerLawTails_TF1, min_residual, max_residual, 4);
177  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
178  10. * value(kAlign),
179  10. * value(kSigma),
180  10. * value(kGamma));
181  } else if (residualsModel() == kROOTVoigt) {
182  fit_residual =
183  new TF1(name_residual.str().c_str(), MuonResidualsFitter_ROOTVoigt_TF1, min_residual, max_residual, 4);
184  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
185  10. * value(kAlign),
186  10. * value(kSigma),
187  10. * value(kGamma));
188  } else if (residualsModel() == kGaussPowerTails) {
189  fit_residual =
190  new TF1(name_residual.str().c_str(), MuonResidualsFitter_GaussPowerTails_TF1, min_residual, max_residual, 3);
191  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
192  10. * value(kAlign),
193  10. * value(kSigma));
194  } else {
195  assert(false);
196  }
197 
198  fit_residual->SetLineColor(2);
199  fit_residual->SetLineWidth(2);
200  fit_residual->Write();
201 
202  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
203  const double resid = (*resiter)[MuonResiduals1DOFFitter::kResid];
204  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
205  double weight = 1. / redchi2;
206  if (!m_weightAlignment)
207  weight = 1.;
208 
209  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
210  hist_residual->Fill(10. * (resid + value(kAlign)), weight);
211  }
212 
213  hist_residual_raw->Fill(10. * resid);
214  }
215 
216  double chi2 = 0.;
217  double ndof = 0.;
218  for (int i = 1; i <= hist_residual->GetNbinsX(); i++) {
219  double xi = hist_residual->GetBinCenter(i);
220  double yi = hist_residual->GetBinContent(i);
221  double yerri = hist_residual->GetBinError(i);
222  double yth = fit_residual->Eval(xi);
223  if (yerri > 0.) {
224  chi2 += pow((yth - yi) / yerri, 2);
225  ndof += 1.;
226  }
227  }
228  ndof -= npar();
229 
230  return (ndof > 0. ? chi2 / ndof : -1.);
231 }
Definition: start.py:1
double MuonResidualsFitter_logGaussPowerTails(double residual, double center, double sigma)
Double_t MuonResidualsFitter_powerLawTails_TF1(Double_t *xvec, Double_t *par)
std::vector< double * >::const_iterator residuals_begin() const
static double MuonResiduals1DOFFitter_number_of_hits
MuonResidualsFitter * fitter()
Definition: weight.py:1
constexpr int pow(int x)
Definition: conifer.h:24
double value(int parNum)
std::vector< double * >::const_iterator residuals_end() const
assert(be >=bs)
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)
static TMinuit * MuonResiduals1DOFFitter_TMinuit
bool fit(Alignable *ali) override
T sqrt(T t)
Definition: SSEVec.h:19
double MuonResidualsFitter_logPowerLawTails(double residual, double center, double sigma, double gamma)
static bool MuonResiduals1DOFFitter_weightAlignment
Double_t MuonResidualsFitter_GaussPowerTails_TF1(Double_t *xvec, Double_t *par)
static double MuonResiduals1DOFFitter_sum_of_weights
Double_t MuonResidualsFitter_pureGaussian_TF1(Double_t *xvec, Double_t *par)
double plot(std::string name, TFileDirectory *dir, Alignable *ali) override
step
Definition: StallMonitor.cc:98
Double_t MuonResidualsFitter_ROOTVoigt_TF1(Double_t *xvec, Double_t *par)
void MuonResiduals1DOFFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag)
double MuonResidualsFitter_logPureGaussian(double residual, double center, double sigma)
void inform(TMinuit *tMinuit) override