CMS 3D CMS Logo

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