CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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  int N = 0;
72 
73  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
74  const double residual = (*resiter)[MuonResiduals1DOFFitter::kResid];
75  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
76  double weight = 1. / redchi2;
77  if (!m_weightAlignment)
78  weight = 1.;
79 
80  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
81  if (fabs(residual) < 10.) { // 10 cm
82  resid_sum += weight * residual;
83  resid_sum2 += weight * residual * residual;
84  resid_N += weight;
85  N++;
86  }
87  }
88  }
89 
90  double resid_mean = resid_sum / resid_N;
91  double resid_stdev = sqrt(resid_sum2 / resid_N - pow(resid_sum / resid_N, 2));
92 
93  resid_sum = 0.;
94  resid_sum2 = 0.;
95  resid_N = 0.;
96 
97  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
98  const double residual = (*resiter)[MuonResiduals1DOFFitter::kResid];
99  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
100  double weight = 1. / redchi2;
101  if (!m_weightAlignment)
102  weight = 1.;
103 
104  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
105  if (fabs(residual - resid_mean) < 2.5 * resid_stdev) {
106  resid_sum += weight * residual;
107  resid_sum2 += weight * residual * residual;
108  resid_N += weight;
109  }
110  }
111  }
112 
113  resid_mean = resid_sum / resid_N;
114  resid_stdev = sqrt(resid_sum2 / resid_N - pow(resid_sum / resid_N, 2));
115 
116  std::vector<int> num;
117  std::vector<std::string> name;
118  std::vector<double> start;
119  std::vector<double> step;
120  std::vector<double> low;
121  std::vector<double> high;
122 
123  if (fixed(kAlign)) {
124  num.push_back(kAlign);
125  name.push_back(std::string("Align"));
126  start.push_back(0.);
127  step.push_back(0.01 * resid_stdev);
128  low.push_back(0.);
129  high.push_back(0.);
130  } else {
131  num.push_back(kAlign);
132  name.push_back(std::string("Align"));
133  start.push_back(resid_mean);
134  step.push_back(0.01 * resid_stdev);
135  low.push_back(0.);
136  high.push_back(0.);
137  }
138  num.push_back(kSigma);
139  name.push_back(std::string("Sigma"));
140  start.push_back(resid_stdev);
141  step.push_back(0.01 * resid_stdev);
142  low.push_back(0.);
143  high.push_back(0.);
145  num.push_back(kGamma);
146  name.push_back(std::string("Gamma"));
147  start.push_back(0.1 * resid_stdev);
148  step.push_back(0.01 * resid_stdev);
149  low.push_back(0.);
150  high.push_back(0.);
151  }
152 
153  return dofit(&MuonResiduals1DOFFitter_FCN, num, name, start, step, low, high);
154 }
155 
157  sumofweights();
158 
159  std::stringstream name_residual, name_residual_raw;
160  name_residual << name << "_residual";
161  name_residual_raw << name << "_residual_raw";
162 
163  double min_residual = -100.;
164  double max_residual = 100.;
165  TH1F *hist_residual = dir->make<TH1F>(name_residual.str().c_str(), "", 100, min_residual, max_residual);
166  TH1F *hist_residual_raw = dir->make<TH1F>(name_residual_raw.str().c_str(), "", 100, min_residual, max_residual);
167 
168  name_residual << "_fit";
169  TF1 *fit_residual = nullptr;
170  if (residualsModel() == kPureGaussian) {
171  fit_residual =
172  new TF1(name_residual.str().c_str(), MuonResidualsFitter_pureGaussian_TF1, min_residual, max_residual, 3);
173  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
174  10. * value(kAlign),
175  10. * value(kSigma));
176  } else if (residualsModel() == kPowerLawTails) {
177  fit_residual =
178  new TF1(name_residual.str().c_str(), MuonResidualsFitter_powerLawTails_TF1, min_residual, max_residual, 4);
179  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
180  10. * value(kAlign),
181  10. * value(kSigma),
182  10. * value(kGamma));
183  } else if (residualsModel() == kROOTVoigt) {
184  fit_residual =
185  new TF1(name_residual.str().c_str(), MuonResidualsFitter_ROOTVoigt_TF1, min_residual, max_residual, 4);
186  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
187  10. * value(kAlign),
188  10. * value(kSigma),
189  10. * value(kGamma));
190  } else if (residualsModel() == kGaussPowerTails) {
191  fit_residual =
192  new TF1(name_residual.str().c_str(), MuonResidualsFitter_GaussPowerTails_TF1, min_residual, max_residual, 3);
193  fit_residual->SetParameters(MuonResiduals1DOFFitter_sum_of_weights * (max_residual - min_residual) / 100.,
194  10. * value(kAlign),
195  10. * value(kSigma));
196  } else {
197  assert(false);
198  }
199 
200  fit_residual->SetLineColor(2);
201  fit_residual->SetLineWidth(2);
202  fit_residual->Write();
203 
204  for (std::vector<double *>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
205  const double resid = (*resiter)[MuonResiduals1DOFFitter::kResid];
206  const double redchi2 = (*resiter)[MuonResiduals1DOFFitter::kRedChi2];
207  double weight = 1. / redchi2;
208  if (!m_weightAlignment)
209  weight = 1.;
210 
211  if (!m_weightAlignment || TMath::Prob(redchi2 * 8, 8) < 0.99) { // no spikes allowed
212  hist_residual->Fill(10. * (resid + value(kAlign)), weight);
213  }
214 
215  hist_residual_raw->Fill(10. * resid);
216  }
217 
218  double chi2 = 0.;
219  double ndof = 0.;
220  for (int i = 1; i <= hist_residual->GetNbinsX(); i++) {
221  double xi = hist_residual->GetBinCenter(i);
222  double yi = hist_residual->GetBinContent(i);
223  double yerri = hist_residual->GetBinError(i);
224  double yth = fit_residual->Eval(xi);
225  if (yerri > 0.) {
226  chi2 += pow((yth - yi) / yerri, 2);
227  ndof += 1.;
228  }
229  }
230  ndof -= npar();
231 
232  return (ndof > 0. ? chi2 / ndof : -1.);
233 }
double MuonResidualsFitter_logGaussPowerTails(double residual, double center, double sigma)
std::vector< double * >::const_iterator residuals_begin() const
Double_t MuonResidualsFitter_powerLawTails_TF1(Double_t *xvec, Double_t *par)
static double MuonResiduals1DOFFitter_number_of_hits
MuonResidualsFitter * fitter()
double value(int parNum)
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)
T * make(const Args &...args) const
make new ROOT object
static double MuonResiduals1DOFFitter_sum_of_weights
Double_t MuonResidualsFitter_pureGaussian_TF1(Double_t *xvec, Double_t *par)
#define N
Definition: blowfish.cc:9
double plot(std::string name, TFileDirectory *dir, Alignable *ali) override
std::vector< double * >::const_iterator residuals_end() const
step
Definition: StallMonitor.cc:94
int weight
Definition: histoStyle.py:51
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)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
void inform(TMinuit *tMinuit) override