CMS 3D CMS Logo

MuonResiduals6DOFrphiFitter.cc
Go to the documentation of this file.
1 // $Id:$
2 
3 #ifdef STANDALONE_FITTER
5 #else
7 //#include "DataFormats/MuonDetId/interface/CSCDetId.h"
8 #endif
9 
10 #include "TH2F.h"
11 #include "TMath.h"
12 #include "TTree.h"
13 #include "TFile.h"
14 
15 namespace
16 {
17  TMinuit *minuit;
18 
19  double sum_of_weights;
20  double number_of_hits;
21  bool weight_alignment;
22 
23  //const CSCGeometry *cscGeometry;
24  //static CSCDetId cscDetId;
25  double csc_R;
26 
27 
28  double getResidual(double delta_x, double delta_y, double delta_z,
29  double delta_phix, double delta_phiy, double delta_phiz,
30  double track_x, double track_y, double track_dxdz, double track_dydz,
31  double R, double alpha, double resslope)
32  {
33  return
34  delta_x
35  - (track_x/R - 3.*pow(track_x/R, 3)) * delta_y
36  - track_dxdz * delta_z
37  - track_y * track_dxdz * delta_phix
38  + track_x * track_dxdz * delta_phiy
39  - track_y * delta_phiz
40  + resslope * alpha;
41  }
42 
43 
44  double getResSlope(double delta_x, double delta_y, double delta_z,
45  double delta_phix, double delta_phiy, double delta_phiz,
46  double track_x, double track_y, double track_dxdz, double track_dydz, double R)
47  {
48  return
49  -track_dxdz/2./R * delta_y
50  + (track_x/R - track_dxdz * track_dydz) * delta_phix
51  + (1. + track_dxdz * track_dxdz) * delta_phiy
52  - track_dydz * delta_phiz;
53  }
54 
55 
56  double effectiveR(double x, double y)
57  {
58 // CSCDetId id = cscDetId;
59 // CSCDetId layerId(id.endcap(), id.station(), id.ring(), id.chamber(), 3);
60 // int strip = cscGeometry->layer(layerId)->geometry()->nearestStrip(align::LocalPoint(x, y, 0.));
61 // double angle = cscGeometry->layer(layerId)->geometry()->stripAngle(strip) - M_PI/2.;
62 // if (fabs(angle) < 1e-10) return csc_R;
63 // else return x/tan(angle) - y;
64  return csc_R;
65  }
66 
67 
68  Double_t residual_trackx_TF1(Double_t *xx, Double_t *p) { return 10.*getResidual(p[0], p[1], p[2], p[3], p[4], p[5], xx[0], p[7], p[8], p[9], effectiveR(xx[0], p[7]), p[10], p[11]); }
69  Double_t residual_tracky_TF1(Double_t *xx, Double_t *p) { return 10.*getResidual(p[0], p[1], p[2], p[3], p[4], p[5], p[6], xx[0], p[8], p[9], effectiveR(p[6], xx[0]), p[10], p[11]); }
70  Double_t residual_trackdxdz_TF1(Double_t *xx, Double_t *p) { return 10.*getResidual(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], xx[0], p[9], effectiveR(p[6], p[7]), p[10], p[11]); }
71  Double_t residual_trackdydz_TF1(Double_t *xx, Double_t *p) { return 10.*getResidual(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], xx[0], effectiveR(p[6], p[7]), p[10], p[11]); }
72 
73  Double_t resslope_trackx_TF1(Double_t *xx, Double_t *p) { return 1000.*getResSlope(p[0], p[1], p[2], p[3], p[4], p[5], xx[0], p[7], p[8], p[9], effectiveR(xx[0], p[7])); }
74  Double_t resslope_tracky_TF1(Double_t *xx, Double_t *p) { return 1000.*getResSlope(p[0], p[1], p[2], p[3], p[4], p[5], p[6], xx[0], p[8], p[9], effectiveR(p[6], xx[0])); }
75  Double_t resslope_trackdxdz_TF1(Double_t *xx, Double_t *p) { return 1000.*getResSlope(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], xx[0], p[9], effectiveR(p[6], p[7])); }
76  Double_t resslope_trackdydz_TF1(Double_t *xx, Double_t *p) { return 1000.*getResSlope(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], xx[0], effectiveR(p[6], p[7])); }
77 }
78 
79 
80 void MuonResiduals6DOFrphiFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag)
81 {
82  MuonResidualsFitterFitInfo *fitinfo = (MuonResidualsFitterFitInfo*)(minuit->GetObjectFit());
83  MuonResidualsFitter *fitter = fitinfo->fitter();
84 
85  fval = 0.;
86  for (std::vector<double*>::const_iterator resiter = fitter->residuals_begin(); resiter != fitter->residuals_end(); ++resiter)
87  {
88  const double residual = (*resiter)[MuonResiduals6DOFrphiFitter::kResid];
89  const double resslope = (*resiter)[MuonResiduals6DOFrphiFitter::kResSlope];
90  const double positionX = (*resiter)[MuonResiduals6DOFrphiFitter::kPositionX];
91  const double positionY = (*resiter)[MuonResiduals6DOFrphiFitter::kPositionY];
92  const double angleX = (*resiter)[MuonResiduals6DOFrphiFitter::kAngleX];
93  const double angleY = (*resiter)[MuonResiduals6DOFrphiFitter::kAngleY];
94  const double redchi2 = (*resiter)[MuonResiduals6DOFrphiFitter::kRedChi2];
95 
96  const double alignx = par[MuonResiduals6DOFrphiFitter::kAlignX];
97  const double aligny = par[MuonResiduals6DOFrphiFitter::kAlignY];
98  const double alignz = par[MuonResiduals6DOFrphiFitter::kAlignZ];
99  const double alignphix = par[MuonResiduals6DOFrphiFitter::kAlignPhiX];
100  const double alignphiy = par[MuonResiduals6DOFrphiFitter::kAlignPhiY];
101  const double alignphiz = par[MuonResiduals6DOFrphiFitter::kAlignPhiZ];
102  const double residsigma = par[MuonResiduals6DOFrphiFitter::kResidSigma];
103  const double resslopesigma = par[MuonResiduals6DOFrphiFitter::kResSlopeSigma];
104  const double alpha = par[MuonResiduals6DOFrphiFitter::kAlpha];
105  const double residgamma = par[MuonResiduals6DOFrphiFitter::kResidGamma];
106  const double resslopegamma = par[MuonResiduals6DOFrphiFitter::kResSlopeGamma];
107 
108  double coeff = alpha;
110  fitter->residualsModel() == MuonResidualsFitter::kPureGaussian2D) coeff = 0.;
111  double effr = effectiveR(positionX, positionY);
112  double residpeak = getResidual(alignx, aligny, alignz, alignphix, alignphiy, alignphiz, positionX, positionY, angleX, angleY, effr, coeff, resslope);
113  double resslopepeak = getResSlope(alignx, aligny, alignz, alignphix, alignphiy, alignphiz, positionX, positionY, angleX, angleY, effr);
114 
115  double weight = (1./redchi2) * number_of_hits / sum_of_weights;
116  if (!weight_alignment) weight = 1.;
117 
118  if (!weight_alignment || TMath::Prob(redchi2*6, 6) < 0.99) // no spikes allowed
119  {
121  if (fitter->useRes() == MuonResidualsFitter::k1111 || fitter->useRes() == MuonResidualsFitter::k1110 || fitter->useRes() == MuonResidualsFitter::k1010) {
122  fval += -weight * MuonResidualsFitter_logPureGaussian(residual, residpeak, residsigma);
123  fval += -weight * MuonResidualsFitter_logPureGaussian(resslope, resslopepeak, resslopesigma);
124  }
125  else if (fitter->useRes() == MuonResidualsFitter::k1100) {
126  fval += -weight * MuonResidualsFitter_logPureGaussian(residual, residpeak, residsigma);
127  }
128  else if (fitter->useRes() == MuonResidualsFitter::k0010) {
129  fval += -weight * MuonResidualsFitter_logPureGaussian(resslope, resslopepeak, resslopesigma);
130  }
131  }
133  if (fitter->useRes() == MuonResidualsFitter::k1111 || fitter->useRes() == MuonResidualsFitter::k1110 || fitter->useRes() == MuonResidualsFitter::k1010) {
134  fval += -weight * MuonResidualsFitter_logPureGaussian2D(residual, resslope, residpeak, resslopepeak, residsigma, resslopesigma, alpha);
135  }
136  else if (fitter->useRes() == MuonResidualsFitter::k1100) {
137  fval += -weight * MuonResidualsFitter_logPureGaussian(residual, residpeak, residsigma);
138  }
139  else if (fitter->useRes() == MuonResidualsFitter::k0010) {
140  fval += -weight * MuonResidualsFitter_logPureGaussian(resslope, resslopepeak, resslopesigma);
141  }
142  }
143  else if (fitter->residualsModel() == MuonResidualsFitter::kPowerLawTails) {
144  fval += -weight * MuonResidualsFitter_logPowerLawTails(residual, residpeak, residsigma, residgamma);
145  fval += -weight * MuonResidualsFitter_logPowerLawTails(resslope, resslopepeak, resslopesigma, resslopegamma);
146  }
147  else if (fitter->residualsModel() == MuonResidualsFitter::kROOTVoigt) {
148  fval += -weight * MuonResidualsFitter_logROOTVoigt(residual, residpeak, residsigma, residgamma);
149  fval += -weight * MuonResidualsFitter_logROOTVoigt(resslope, resslopepeak, resslopesigma, resslopegamma);
150  }
152  fval += -weight * MuonResidualsFitter_logGaussPowerTails(residual, residpeak, residsigma);
153  fval += -weight * MuonResidualsFitter_logGaussPowerTails(resslope, resslopepeak, resslopesigma);
154  }
155  else { assert(false); }
156  }
157  }
158 }
159 
160 
162 {
164 }
165 
166 
168 {
169  minuit = tMinuit;
170 }
171 
172 
174 {
175  sum_of_weights = 0.;
176  number_of_hits = 0.;
177  weight_alignment = m_weightAlignment;
178  for (std::vector<double*>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
179  if (m_weightAlignment) {
180  double redchi2 = (*resiter)[kRedChi2];
181  if (TMath::Prob(redchi2*6, 6) < 0.99) { // no spikes allowed
182  sum_of_weights += 1./redchi2;
183  number_of_hits += 1.;
184  }
185  }
186  else {
187  sum_of_weights += 1.;
188  number_of_hits += 1.;
189  }
190  }
191  return sum_of_weights;
192 }
193 
194 
196 {
197  //cscGeometry = m_cscGeometry;
198  //cscDetId = CSCDetId(ali->geomDetId().rawId());
199 
200 #ifndef STANDALONE_FITTER
201  csc_R = sqrt(pow(ali->globalPosition().x(), 2) + pow(ali->globalPosition().y(), 2));
202 #else
203  csc_R = 200; // not important what number it is, as we usually not use the DOF where it matters
204 #endif
205 
206  initialize_table(); // if not already initialized
207  sumofweights();
208 
209  double res_std = 0.5;
210  double resslope_std = 0.002;
211 
213  std::string names[10] = {"AlignX","AlignZ","AlignPhiX","AlignPhiY","AlignPhiZ", "ResidSigma","ResSlopeSigma", "Alpha", "ResidGamma","ResSlopeGamma"};
214  double starts[10] = {0., 0., 0., 0., 0., res_std, resslope_std, 0., 0.1*res_std, 0.1*resslope_std};
215  double steps[10] = {0.1, 0.1, 0.001, 0.001, 0.001, 0.001*res_std, 0.001*resslope_std, 0.001, 0.01*res_std, 0.01*resslope_std};
216  double lows[10] = {0., 0., 0., 0., 0., 0., 0., -1., 0., 0.};
217  double highs[10] = {0., 0., 0., 0., 0., 10., 0.1, 1., 0., 0.};
218 
219  std::vector<int> num(nums, nums+5);
220  std::vector<std::string> name(names, names+5);
221  std::vector<double> start(starts, starts+5);
222  std::vector<double> step(steps, steps+5);
223  std::vector<double> low(lows, lows+5);
224  std::vector<double> high(highs, highs+5);
225 
226  bool add_alpha = ( residualsModel() == kPureGaussian2D);
227  bool add_gamma = ( residualsModel() == kROOTVoigt || residualsModel() == kPowerLawTails);
228 
229  int idx[4], ni = 0;
230  if (useRes() == k1111 || useRes() == k1110 || useRes() == k1010) {
231  for(ni=0; ni<2; ni++) idx[ni] = ni+5;
232  if (add_alpha) idx[ni++] = 7;
233  else if (add_gamma) for(; ni<4; ni++) idx[ni] = ni+6;
234  if (!add_alpha) fix(kAlpha);
235  }
236  else if (useRes() == k1100) {
237  idx[ni++] = 5;
238  if (add_gamma) idx[ni++] = 8;
240  fix(kAlpha);
241  }
242  else if (useRes() == k0010) {
243  idx[ni++] = 6;
244  if (add_gamma) idx[ni++] = 9;
245  fix(kResidSigma);
246  fix(kAlpha);
247  }
248  for (int i=0; i<ni; i++){
249  num.push_back(nums[idx[i]]);
250  name.push_back(names[idx[i]]);
251  start.push_back(starts[idx[i]]);
252  step.push_back(steps[idx[i]]);
253  low.push_back(lows[idx[i]]);
254  high.push_back(highs[idx[i]]);
255  }
256 
257  return dofit(&MuonResiduals6DOFrphiFitter_FCN, num, name, start, step, low, high);
258 }
259 
260 
262 {
263  sumofweights();
264 
265  double mean_residual = 0., mean_resslope = 0.;
266  double mean_trackx = 0., mean_tracky = 0., mean_trackdxdz = 0., mean_trackdydz = 0.;
267  double sum_w = 0.;
268 
269  for (std::vector<double*>::const_iterator rit = residuals_begin(); rit != residuals_end(); ++rit)
270  {
271  const double redchi2 = (*rit)[kRedChi2];
272  double weight = 1./redchi2;
273  if (!m_weightAlignment) weight = 1.;
274 
275  if (!m_weightAlignment || TMath::Prob(redchi2*6, 6) < 0.99) // no spikes allowed
276  {
277  double factor_w = 1./(sum_w + weight);
278  mean_residual = factor_w * (sum_w * mean_residual + weight * (*rit)[kResid]);
279  mean_resslope = factor_w * (sum_w * mean_resslope + weight * (*rit)[kResSlope]);
280  mean_trackx = factor_w * (sum_w * mean_trackx + weight * (*rit)[kPositionX]);
281  mean_tracky = factor_w * (sum_w * mean_tracky + weight * (*rit)[kPositionY]);
282  mean_trackdxdz = factor_w * (sum_w * mean_trackdxdz + weight * (*rit)[kAngleX]);
283  mean_trackdydz = factor_w * (sum_w * mean_trackdydz + weight * (*rit)[kAngleY]);
284  sum_w += weight;
285  }
286  }
287 
288  std::string name_residual, name_resslope, name_residual_raw, name_resslope_raw, name_residual_cut, name_alpha;
289  std::string name_residual_trackx, name_resslope_trackx;
290  std::string name_residual_tracky, name_resslope_tracky;
291  std::string name_residual_trackdxdz, name_resslope_trackdxdz;
292  std::string name_residual_trackdydz, name_resslope_trackdydz;
293 
294  name_residual = name + "_residual";
295  name_resslope = name + "_resslope";
296  name_residual_raw = name + "_residual_raw";
297  name_resslope_raw = name + "_resslope_raw";
298  name_residual_cut = name + "_residual_cut";
299  name_alpha = name + "_alpha";
300  name_residual_trackx = name + "_residual_trackx";
301  name_resslope_trackx = name + "_resslope_trackx";
302  name_residual_tracky = name + "_residual_tracky";
303  name_resslope_tracky = name + "_resslope_tracky";
304  name_residual_trackdxdz = name + "_residual_trackdxdz";
305  name_resslope_trackdxdz = name + "_resslope_trackdxdz";
306  name_residual_trackdydz = name + "_residual_trackdydz";
307  name_resslope_trackdydz = name + "_resslope_trackdydz";
308 
309  double width = ali->surface().width();
310  double length = ali->surface().length();
311  int bins_residual = 100, bins_resslope = 100;
312  double min_residual = -50., max_residual = 50.;
313  double min_resslope = -50., max_resslope = 50.;
314  double min_trackx = -width/2., max_trackx = width/2.;
315  double min_tracky = -length/2., max_tracky = length/2.;
316  double min_trackdxdz = -1.5, max_trackdxdz = 1.5;
317  double min_trackdydz = -1.5, max_trackdydz = 1.5;
318 
319  TH1F *hist_residual = dir->make<TH1F>(name_residual.c_str(), "", bins_residual, min_residual, max_residual);
320  TH1F *hist_resslope = dir->make<TH1F>(name_resslope.c_str(), "", bins_resslope, min_resslope, max_resslope);
321  TH1F *hist_residual_raw = dir->make<TH1F>(name_residual_raw.c_str(), "", bins_residual, min_residual, max_residual);
322  TH1F *hist_resslope_raw = dir->make<TH1F>(name_resslope_raw.c_str(), "", bins_resslope, min_resslope, max_resslope);
323  TH1F *hist_residual_cut = dir->make<TH1F>(name_residual_cut.c_str(), "", bins_residual, min_residual, max_residual);
324  TH2F *hist_alpha = dir->make<TH2F>(name_alpha.c_str(),"", 50, min_resslope, max_resslope, 50, -50., 50.);
325 
326  TProfile *hist_residual_trackx = dir->make<TProfile>(name_residual_trackx.c_str(), "", 50, min_trackx, max_trackx, min_residual, max_residual);
327  TProfile *hist_resslope_trackx = dir->make<TProfile>(name_resslope_trackx.c_str(), "", 50, min_trackx, max_trackx, min_resslope, max_resslope);
328  TProfile *hist_residual_tracky = dir->make<TProfile>(name_residual_tracky.c_str(), "", 50, min_tracky, max_tracky, min_residual, max_residual);
329  TProfile *hist_resslope_tracky = dir->make<TProfile>(name_resslope_tracky.c_str(), "", 50, min_tracky, max_tracky, min_resslope, max_resslope);
330  TProfile *hist_residual_trackdxdz = dir->make<TProfile>(name_residual_trackdxdz.c_str(), "", 500, min_trackdxdz, max_trackdxdz, min_residual, max_residual);
331  TProfile *hist_resslope_trackdxdz = dir->make<TProfile>(name_resslope_trackdxdz.c_str(), "", 500, min_trackdxdz, max_trackdxdz, min_resslope, max_resslope);
332  TProfile *hist_residual_trackdydz = dir->make<TProfile>(name_residual_trackdydz.c_str(), "", 500, min_trackdydz, max_trackdydz, min_residual, max_residual);
333  TProfile *hist_resslope_trackdydz = dir->make<TProfile>(name_resslope_trackdydz.c_str(), "", 500, min_trackdydz, max_trackdydz, min_resslope, max_resslope);
334 
335  hist_residual_trackx->SetAxisRange(-10., 10., "Y");
336  hist_resslope_trackx->SetAxisRange(-10., 10., "Y");
337  hist_residual_tracky->SetAxisRange(-10., 10., "Y");
338  hist_resslope_tracky->SetAxisRange(-10., 10., "Y");
339  hist_residual_trackdxdz->SetAxisRange(-10., 10., "Y");
340  hist_resslope_trackdxdz->SetAxisRange(-10., 10., "Y");
341  hist_residual_trackdydz->SetAxisRange(-10., 10., "Y");
342  hist_resslope_trackdydz->SetAxisRange(-10., 10., "Y");
343 
344  name_residual += "_fit";
345  name_resslope += "_fit";
346  name_alpha += "_fit";
347  name_residual_trackx += "_fit";
348  name_resslope_trackx += "_fit";
349  name_residual_tracky += "_fit";
350  name_resslope_tracky += "_fit";
351  name_residual_trackdxdz += "_fit";
352  name_resslope_trackdxdz += "_fit";
353  name_residual_trackdydz += "_fit";
354  name_resslope_trackdydz += "_fit";
355 
356  TF1 *fit_residual = nullptr;
357  TF1 *fit_resslope = nullptr;
359  fit_residual = new TF1(name_residual.c_str(), MuonResidualsFitter_pureGaussian_TF1, min_residual, max_residual, 3);
360  fit_residual->SetParameters(sum_of_weights * (max_residual - min_residual)/bins_residual, 10.*value(kAlignX), 10.*value(kResidSigma));
361  const double er_res[3] = {0., 10.*errorerror(kAlignX), 10.*errorerror(kResidSigma)};
362  fit_residual->SetParErrors(er_res);
363  fit_resslope = new TF1(name_resslope.c_str(), MuonResidualsFitter_pureGaussian_TF1, min_resslope, max_resslope, 3);
364  fit_resslope->SetParameters(sum_of_weights * (max_resslope - min_resslope)/bins_resslope, 1000.*value(kAlignPhiY), 1000.*value(kResSlopeSigma));
365  const double er_resslope[3] = {0., 1000.*errorerror(kAlignPhiY), 1000.*errorerror(kResSlopeSigma)};
366  fit_resslope->SetParErrors(er_resslope);
367  }
368  else if (residualsModel() == kPowerLawTails) {
369  fit_residual = new TF1(name_residual.c_str(), MuonResidualsFitter_powerLawTails_TF1, min_residual, max_residual, 4);
370  fit_residual->SetParameters(sum_of_weights * (max_residual - min_residual)/bins_residual, 10.*value(kAlignX), 10.*value(kResidSigma), 10.*value(kResidGamma));
371  fit_resslope = new TF1(name_resslope.c_str(), MuonResidualsFitter_powerLawTails_TF1, min_resslope, max_resslope, 4);
372  fit_resslope->SetParameters(sum_of_weights * (max_resslope - min_resslope)/bins_resslope, 1000.*value(kAlignPhiY), 1000.*value(kResSlopeSigma), 1000.*value(kResSlopeGamma));
373  }
374  else if (residualsModel() == kROOTVoigt) {
375  fit_residual = new TF1(name_residual.c_str(), MuonResidualsFitter_ROOTVoigt_TF1, min_residual, max_residual, 4);
376  fit_residual->SetParameters(sum_of_weights * (max_residual - min_residual)/bins_residual, 10.*value(kAlignX), 10.*value(kResidSigma), 10.*value(kResidGamma));
377  fit_resslope = new TF1(name_resslope.c_str(), MuonResidualsFitter_ROOTVoigt_TF1, min_resslope, max_resslope, 4);
378  fit_resslope->SetParameters(sum_of_weights * (max_resslope - min_resslope)/bins_resslope, 1000.*value(kAlignPhiY), 1000.*value(kResSlopeSigma), 1000.*value(kResSlopeGamma));
379  }
380  else if (residualsModel() == kGaussPowerTails) {
381  fit_residual = new TF1(name_residual.c_str(), MuonResidualsFitter_GaussPowerTails_TF1, min_residual, max_residual, 3);
382  fit_residual->SetParameters(sum_of_weights * (max_residual - min_residual)/bins_residual, 10.*value(kAlignX), 10.*value(kResidSigma));
383  fit_resslope = new TF1(name_resslope.c_str(), MuonResidualsFitter_GaussPowerTails_TF1, min_resslope, max_resslope, 3);
384  fit_resslope->SetParameters(sum_of_weights * (max_resslope - min_resslope)/bins_resslope, 1000.*value(kAlignPhiY), 1000.*value(kResSlopeSigma));
385  }
386  else { assert(false); }
387 
388  fit_residual->SetLineColor(2); fit_residual->SetLineWidth(2); fit_residual->Write();
389  fit_resslope->SetLineColor(2); fit_resslope->SetLineWidth(2); fit_resslope->Write();
390 
391  TF1 *fit_alpha = new TF1(name_alpha.c_str(), "[0] + x*[1]", min_resslope, max_resslope);
392  double a = 10.*value(kAlignX), b = 10.*value(kAlpha)/1000.;
394  {
395  double sx = 10.*value(kResidSigma), sy = 1000.*value(kResSlopeSigma), r = value(kAlpha);
396  a = mean_residual;
397  b = 0.;
398  if ( sx != 0. )
399  {
400  b = 1./(sy/sx*r);
401  a = - b * mean_resslope;
402  }
403  }
404  fit_alpha->SetParameters(a, b);
405  fit_alpha->SetLineColor(2); fit_alpha->SetLineWidth(2); fit_alpha->Write();
406 
407  TProfile *fit_residual_trackx = dir->make<TProfile>(name_residual_trackx.c_str(), "", 100, min_trackx, max_trackx);
408  TProfile *fit_resslope_trackx = dir->make<TProfile>(name_resslope_trackx.c_str(), "", 100, min_trackx, max_trackx);
409  TProfile *fit_residual_tracky = dir->make<TProfile>(name_residual_tracky.c_str(), "", 100, min_tracky, max_tracky);
410  TProfile *fit_resslope_tracky = dir->make<TProfile>(name_resslope_tracky.c_str(), "", 100, min_tracky, max_tracky);
411  TProfile *fit_residual_trackdxdz = dir->make<TProfile>(name_residual_trackdxdz.c_str(), "", 500, min_trackdxdz, max_trackdxdz);
412  TProfile *fit_resslope_trackdxdz = dir->make<TProfile>(name_resslope_trackdxdz.c_str(), "", 500, min_trackdxdz, max_trackdxdz);
413  TProfile *fit_residual_trackdydz = dir->make<TProfile>(name_residual_trackdydz.c_str(), "", 500, min_trackdydz, max_trackdydz);
414  TProfile *fit_resslope_trackdydz = dir->make<TProfile>(name_resslope_trackdydz.c_str(), "", 500, min_trackdydz, max_trackdydz);
415 
416  fit_residual_trackx->SetLineColor(2); fit_residual_trackx->SetLineWidth(2);
417  fit_resslope_trackx->SetLineColor(2); fit_resslope_trackx->SetLineWidth(2);
418  fit_residual_tracky->SetLineColor(2); fit_residual_tracky->SetLineWidth(2);
419  fit_resslope_tracky->SetLineColor(2); fit_resslope_tracky->SetLineWidth(2);
420  fit_residual_trackdxdz->SetLineColor(2); fit_residual_trackdxdz->SetLineWidth(2);
421  fit_resslope_trackdxdz->SetLineColor(2); fit_resslope_trackdxdz->SetLineWidth(2);
422  fit_residual_trackdydz->SetLineColor(2); fit_residual_trackdydz->SetLineWidth(2);
423  fit_resslope_trackdydz->SetLineColor(2); fit_resslope_trackdydz->SetLineWidth(2);
424 
425  name_residual_trackx += "line";
426  name_resslope_trackx += "line";
427  name_residual_tracky += "line";
428  name_resslope_tracky += "line";
429  name_residual_trackdxdz += "line";
430  name_resslope_trackdxdz += "line";
431  name_residual_trackdydz += "line";
432  name_resslope_trackdydz += "line";
433 
434  TF1 *fitline_residual_trackx = new TF1(name_residual_trackx.c_str(), residual_trackx_TF1, min_trackx, max_trackx, 12);
435  TF1 *fitline_resslope_trackx = new TF1(name_resslope_trackx.c_str(), resslope_trackx_TF1, min_trackx, max_trackx, 12);
436  TF1 *fitline_residual_tracky = new TF1(name_residual_tracky.c_str(), residual_tracky_TF1, min_tracky, max_tracky, 12);
437  TF1 *fitline_resslope_tracky = new TF1(name_resslope_tracky.c_str(), resslope_tracky_TF1, min_tracky, max_tracky, 12);
438  TF1 *fitline_residual_trackdxdz = new TF1(name_residual_trackdxdz.c_str(), residual_trackdxdz_TF1, min_trackdxdz, max_trackdxdz, 12);
439  TF1 *fitline_resslope_trackdxdz = new TF1(name_resslope_trackdxdz.c_str(), resslope_trackdxdz_TF1, min_trackdxdz, max_trackdxdz, 12);
440  TF1 *fitline_residual_trackdydz = new TF1(name_residual_trackdydz.c_str(), residual_trackdydz_TF1, min_trackdydz, max_trackdydz, 12);
441  TF1 *fitline_resslope_trackdydz = new TF1(name_resslope_trackdydz.c_str(), resslope_trackdydz_TF1, min_trackdydz, max_trackdydz, 12);
442 
443  std::vector< TF1* > fitlines;
444  fitlines.push_back(fitline_residual_trackx);
445  fitlines.push_back(fitline_resslope_trackx);
446  fitlines.push_back(fitline_residual_tracky);
447  fitlines.push_back(fitline_resslope_tracky);
448  fitlines.push_back(fitline_residual_trackdxdz);
449  fitlines.push_back(fitline_resslope_trackdxdz);
450  fitlines.push_back(fitline_residual_trackdydz);
451  fitlines.push_back(fitline_resslope_trackdydz);
452 
453  double fitparameters[12] = {value(kAlignX), value(kAlignY), value(kAlignZ), value(kAlignPhiX), value(kAlignPhiY), value(kAlignPhiZ),
454  mean_trackx, mean_tracky, mean_trackdxdz, mean_trackdydz, value(kAlpha), mean_resslope};
455  if (residualsModel() == kPureGaussian2D) fitparameters[10] = 0.;
456 
457  for(std::vector<TF1*>::const_iterator itr = fitlines.begin(); itr != fitlines.end(); itr++)
458  {
459  (*itr)->SetParameters(fitparameters);
460  (*itr)->SetLineColor(2);
461  (*itr)->SetLineWidth(2);
462  (*itr)->Write();
463  }
464 
465  for (std::vector<double*>::const_iterator resiter = residuals_begin(); resiter != residuals_end(); ++resiter) {
466  const double resid = (*resiter)[kResid];
467  const double resslope = (*resiter)[kResSlope];
468  const double positionX = (*resiter)[kPositionX];
469  const double positionY = (*resiter)[kPositionY];
470  const double angleX = (*resiter)[kAngleX];
471  const double angleY = (*resiter)[kAngleY];
472  const double redchi2 = (*resiter)[kRedChi2];
473  double weight = 1./redchi2;
474  if (!m_weightAlignment) weight = 1.;
475 
476  if (!m_weightAlignment || TMath::Prob(redchi2*6, 6) < 0.99) { // no spikes allowed
477  hist_alpha->Fill(1000.*resslope, 10.*resid);
478 
479  double coeff = value(kAlpha);
480  if (residualsModel() == kPureGaussian || residualsModel() == kPureGaussian2D) coeff = 0.;
481  double geom_resid = getResidual(value(kAlignX), value(kAlignY), value(kAlignZ), value(kAlignPhiX), value(kAlignPhiY), value(kAlignPhiZ), positionX, positionY, angleX, angleY, effectiveR(positionX, positionY), coeff, resslope);
482  hist_residual->Fill(10.*(resid - geom_resid + value(kAlignX)), weight);
483  hist_residual_trackx->Fill(positionX, 10.*resid, weight);
484  hist_residual_tracky->Fill(positionY, 10.*resid, weight);
485  hist_residual_trackdxdz->Fill(angleX, 10.*resid, weight);
486  hist_residual_trackdydz->Fill(angleY, 10.*resid, weight);
487  fit_residual_trackx->Fill(positionX, 10.*geom_resid, weight);
488  fit_residual_tracky->Fill(positionY, 10.*geom_resid, weight);
489  fit_residual_trackdxdz->Fill(angleX, 10.*geom_resid, weight);
490  fit_residual_trackdydz->Fill(angleY, 10.*geom_resid, weight);
491 
492  double geom_resslope = getResSlope(value(kAlignX), value(kAlignY), value(kAlignZ), value(kAlignPhiX), value(kAlignPhiY), value(kAlignPhiZ), positionX, positionY, angleX, angleY, effectiveR(positionX, positionY));
493  hist_resslope->Fill(1000.*(resslope - geom_resslope + value(kAlignPhiY)), weight);
494  hist_resslope_trackx->Fill(positionX, 1000.*resslope, weight);
495  hist_resslope_tracky->Fill(positionY, 1000.*resslope, weight);
496  hist_resslope_trackdxdz->Fill(angleX, 1000.*resslope, weight);
497  hist_resslope_trackdydz->Fill(angleY, 1000.*resslope, weight);
498  fit_resslope_trackx->Fill(positionX, 1000.*geom_resslope, weight);
499  fit_resslope_tracky->Fill(positionY, 1000.*geom_resslope, weight);
500  fit_resslope_trackdxdz->Fill(angleX, 1000.*geom_resslope, weight);
501  fit_resslope_trackdydz->Fill(angleY, 1000.*geom_resslope, weight);
502  }
503 
504  hist_residual_raw->Fill(10.*resid);
505  hist_resslope_raw->Fill(1000.*resslope);
506  if (fabs(resslope) < 0.005) hist_residual_cut->Fill(10.*resid);
507  }
508 
509  double chi2 = 0.;
510  double ndof = 0.;
511  for (int i = 1; i <= hist_residual->GetNbinsX(); i++) {
512  double xi = hist_residual->GetBinCenter(i);
513  double yi = hist_residual->GetBinContent(i);
514  double yerri = hist_residual->GetBinError(i);
515  double yth = fit_residual->Eval(xi);
516  if (yerri > 0.) {
517  chi2 += pow((yth - yi)/yerri, 2);
518  ndof += 1.;
519  }
520  }
521  for (int i = 1; i <= hist_resslope->GetNbinsX(); i++) {
522  double xi = hist_resslope->GetBinCenter(i);
523  double yi = hist_resslope->GetBinContent(i);
524  double yerri = hist_resslope->GetBinError(i);
525  double yth = fit_resslope->Eval(xi);
526  if (yerri > 0.) {
527  chi2 += pow((yth - yi)/yerri, 2);
528  ndof += 1.;
529  }
530  }
531  ndof -= npar();
532 
533  return (ndof > 0. ? chi2 / ndof : -1.);
534 }
535 
536 
537 TTree * MuonResiduals6DOFrphiFitter::readNtuple(std::string fname, unsigned int endcap, unsigned int station, unsigned int ring, unsigned int chamber, unsigned int preselected)
538 {
539  TFile *f = new TFile(fname.c_str());
540  TTree *t = (TTree*)f->Get("mual_ttree");
541 
542  // Create new temporary file
543  TFile *tmpf = new TFile("small_tree_fit.root","recreate");
544  assert(tmpf!=nullptr);
545 
546  // filter the tree (temporarily lives in the new file)
547  TTree *tt = t->CopyTree(Form("!is_dt && is_plus==%d && ring_wheel==%d && station==%d && sector==%d && select==%d", 2-endcap, station, ring, chamber, (bool)preselected));
548 
550  tt->SetBranchAddress("res_x", &r.res_x);
551  tt->SetBranchAddress("res_slope_x", &r.res_slope_x);
552  tt->SetBranchAddress("pos_x", &r.pos_x);
553  tt->SetBranchAddress("pos_y", &r.pos_y);
554  tt->SetBranchAddress("angle_x", &r.angle_x);
555  tt->SetBranchAddress("angle_y", &r.angle_y);
556  tt->SetBranchAddress("pz", &r.pz);
557  tt->SetBranchAddress("pt", &r.pt);
558  tt->SetBranchAddress("q", &r.q);
559 
560  Long64_t nentries = tt->GetEntries();
561  for (Long64_t i=0;i<nentries; i++)
562  {
563  tt->GetEntry(i);
564  double *rdata = new double[MuonResiduals6DOFrphiFitter::kNData];
565  rdata[kResid] = r.res_x;
566  rdata[kResSlope] = r.res_slope_x;
567  rdata[kPositionX] = r.pos_x;
568  rdata[kPositionY] = r.pos_y;
569  rdata[kAngleX] = r.angle_x;
570  rdata[kAngleY] = r.angle_y;
571  rdata[kRedChi2] = 0.1;
572  rdata[kPz] = r.pz;
573  rdata[kPt] = r.pt;
574  rdata[kCharge] = r.q;
575  fill(rdata);
576  }
577  delete f;
578  //delete tmpf;
579  return tt;
580 }
align::Scalar width() const
double MuonResidualsFitter_logGaussPowerTails(double residual, double center, double sigma)
float alpha
Definition: AMPTWrapper.h:95
Double_t MuonResidualsFitter_powerLawTails_TF1(Double_t *xvec, Double_t *par)
double MuonResidualsFitter_logPureGaussian2D(double x, double y, double x0, double y0, double sx, double sy, double r)
T y() const
Definition: PV3DBase.h:63
void fill(double *residual)
MuonResidualsFitter * fitter()
Definition: weight.py:1
TTree * readNtuple(std::string fname, unsigned int endcap, unsigned int station, unsigned int ring, unsigned int chamber, unsigned int preselected=1)
double value(int parNum)
const std::string names[nVars_]
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)
void inform(TMinuit *tMinuit) override
double plot(std::string name, TFileDirectory *dir, Alignable *ali) override
T sqrt(T t)
Definition: SSEVec.h:18
void MuonResiduals6DOFrphiFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag)
double MuonResidualsFitter_logPowerLawTails(double residual, double center, double sigma, double gamma)
double f[11][100]
Double_t MuonResidualsFitter_GaussPowerTails_TF1(Double_t *xvec, Double_t *par)
void fix(int parNum, bool dofix=true)
bool fit(Alignable *ali) override
T * make(const Args &...args) const
make new ROOT object
virtual void correctBField()=0
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
Definition: Alignable.h:135
Double_t MuonResidualsFitter_pureGaussian_TF1(Double_t *xvec, Double_t *par)
align::Scalar length() const
double errorerror(int parNum)
double b
Definition: hdecay.h:120
std::vector< double * >::const_iterator residuals_end() const
int useRes(int pattern=-1)
string fname
main script
double a
Definition: hdecay.h:121
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:138
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
T x() const
Definition: PV3DBase.h:62
double MuonResidualsFitter_logPureGaussian(double residual, double center, double sigma)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40