3 #ifdef STANDALONE_FITTER 18 double sum_of_weights;
19 double number_of_hits;
20 bool weight_alignment;
22 double residual_x(
double delta_x,
double delta_z,
23 double delta_phix,
double delta_phiy,
double delta_phiz,
24 double track_x,
double track_y,
double track_dxdz,
double track_dydz,
25 double alpha,
double resslope)
28 - track_dxdz * delta_z
29 - track_y * track_dxdz * delta_phix
30 + track_x * track_dxdz * delta_phiy
31 - track_y * delta_phiz
35 double residual_dxdz(
double delta_x,
double delta_z,
36 double delta_phix,
double delta_phiy,
double delta_phiz,
37 double track_x,
double track_y,
double track_dxdz,
double track_dydz)
39 return -track_dxdz * track_dydz * delta_phix
40 + (1. + track_dxdz * track_dxdz) * delta_phiy
41 - track_dydz * delta_phiz;
44 Double_t residual_x_trackx_TF1(Double_t *
xx, Double_t *
p) {
return 10.*residual_x(p[0], p[2], p[3], p[4], p[5], xx[0], p[7], p[8], p[9], p[10], p[11]); }
45 Double_t residual_x_tracky_TF1(Double_t *
xx, Double_t *
p) {
return 10.*residual_x(p[0], p[2], p[3], p[4], p[5], p[6], xx[0], p[8], p[9], p[10], p[11]); }
46 Double_t residual_x_trackdxdz_TF1(Double_t *
xx, Double_t *
p) {
return 10.*residual_x(p[0], p[2], p[3], p[4], p[5], p[6], p[7], xx[0], p[9], p[10], p[11]); }
47 Double_t residual_x_trackdydz_TF1(Double_t *
xx, Double_t *
p) {
return 10.*residual_x(p[0], p[2], p[3], p[4], p[5], p[6], p[7], p[8], xx[0], p[10], p[11]); }
49 Double_t residual_dxdz_trackx_TF1(Double_t *
xx, Double_t *
p) {
return 1000.*residual_dxdz(p[0], p[2], p[3], p[4], p[5], xx[0], p[7], p[8], p[9]); }
50 Double_t residual_dxdz_tracky_TF1(Double_t *
xx, Double_t *
p) {
return 1000.*residual_dxdz(p[0], p[2], p[3], p[4], p[5], p[6], xx[0], p[8], p[9]); }
51 Double_t residual_dxdz_trackdxdz_TF1(Double_t *
xx, Double_t *
p) {
return 1000.*residual_dxdz(p[0], p[2], p[3], p[4], p[5], p[6], p[7], xx[0], p[9]); }
52 Double_t residual_dxdz_trackdydz_TF1(Double_t *
xx, Double_t *
p) {
return 1000.*residual_dxdz(p[0], p[2], p[3], p[4], p[5], p[6], p[7], p[8], xx[0]); }
86 double residpeak = residual_x(alignx, alignz, alignphix, alignphiy, alignphiz, positionX, positionY, angleX, angleY, coeff, resslope);
87 double resslopepeak = residual_dxdz(alignx, alignz, alignphix, alignphiy, alignphiz, positionX, positionY, angleX, angleY);
89 double weight = (1./redchi2) * number_of_hits / sum_of_weights;
90 if (!weight_alignment) weight = 1.;
92 if (!weight_alignment || TMath::Prob(redchi2*8, 8) < 0.99)
129 else { assert(
false); }
155 if (TMath::Prob(redchi2*8, 8) < 0.99) {
156 sum_of_weights += 1./redchi2;
157 number_of_hits += 1.;
161 sum_of_weights += 1.;
162 number_of_hits += 1.;
165 return sum_of_weights;
174 double res_std = 0.5;
175 double resslope_std = 0.005;
178 std::string names[10] = {
"AlignX",
"AlignZ",
"AlignPhiX",
"AlignPhiY",
"AlignPhiZ",
"ResidSigma",
"ResSlopeSigma",
"Alpha",
"ResidGamma",
"ResSlopeGamma"};
179 double starts[10] = {0., 0., 0., 0., 0., res_std, resslope_std, 0., 0.1*res_std, 0.1*resslope_std};
180 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};
181 double lows[10] = {0., 0., 0., 0., 0., 0., 0., -1., 0., 0.};
182 double highs[10] = {0., 0., 0., 0., 0., 10., 0.1, 1., 0., 0.};
184 std::vector<int>
num(nums, nums+5);
185 std::vector<std::string>
name(names, names+5);
186 std::vector<double>
start(starts, starts+5);
187 std::vector<double>
step(steps, steps+5);
188 std::vector<double> low(lows, lows+5);
189 std::vector<double> high(highs, highs+5);
196 for(ni=0; ni<2; ni++) idx[ni] = ni+5;
197 if (add_alpha) idx[ni++] = 7;
198 else if (add_gamma)
for(; ni<4; ni++) idx[ni] = ni+6;
203 if (add_gamma) idx[ni++] = 8;
209 if (add_gamma) idx[ni++] = 9;
213 for (
int i=0;
i<ni;
i++){
214 num.push_back(nums[idx[
i]]);
215 name.push_back(names[idx[i]]);
216 start.push_back(starts[idx[i]]);
217 step.push_back(steps[idx[i]]);
218 low.push_back(lows[idx[i]]);
219 high.push_back(highs[idx[i]]);
230 double mean_residual = 0., mean_resslope = 0.;
231 double mean_trackx = 0., mean_tracky = 0., mean_trackdxdz = 0., mean_trackdydz = 0.;
236 const double redchi2 = (*rit)[
kRedChi2];
237 double weight = 1./redchi2;
242 double factor_w = 1./(sum_w +
weight);
243 mean_residual = factor_w * (sum_w * mean_residual + weight * (*rit)[
kResid]);
244 mean_resslope = factor_w * (sum_w * mean_resslope + weight * (*rit)[
kResSlope]);
245 mean_trackx = factor_w * (sum_w * mean_trackx + weight * (*rit)[
kPositionX]);
246 mean_tracky = factor_w * (sum_w * mean_tracky + weight * (*rit)[
kPositionY]);
247 mean_trackdxdz = factor_w * (sum_w * mean_trackdxdz + weight * (*rit)[
kAngleX]);
248 mean_trackdydz = factor_w * (sum_w * mean_trackdydz + weight * (*rit)[
kAngleY]);
253 std::string name_residual, name_resslope, name_residual_raw, name_resslope_raw, name_residual_cut, name_alpha;
254 std::string name_residual_trackx, name_resslope_trackx;
255 std::string name_residual_tracky, name_resslope_tracky;
256 std::string name_residual_trackdxdz, name_resslope_trackdxdz;
257 std::string name_residual_trackdydz, name_resslope_trackdydz;
259 name_residual = name +
"_residual";
260 name_resslope = name +
"_resslope";
261 name_residual_raw = name +
"_residual_raw";
262 name_resslope_raw = name +
"_resslope_raw";
263 name_residual_cut = name +
"_residual_cut";
264 name_alpha = name +
"_alpha";
265 name_residual_trackx = name +
"_residual_trackx";
266 name_resslope_trackx = name +
"_resslope_trackx";
267 name_residual_tracky = name +
"_residual_tracky";
268 name_resslope_tracky = name +
"_resslope_tracky";
269 name_residual_trackdxdz = name +
"_residual_trackdxdz";
270 name_resslope_trackdxdz = name +
"_resslope_trackdxdz";
271 name_residual_trackdydz = name +
"_residual_trackdydz";
272 name_resslope_trackdydz = name +
"_resslope_trackdydz";
276 int bins_residual = 150, bins_resslope = 100;
277 double min_residual = -75., max_residual = 75.;
278 double min_resslope = -50., max_resslope = 50.;
279 double min_trackx = -width/2., max_trackx = width/2.;
280 double min_tracky = -length/2., max_tracky = length/2.;
281 double min_trackdxdz = -1.5, max_trackdxdz = 1.5;
282 double min_trackdydz = -1.5, max_trackdydz = 1.5;
284 TH1F *hist_residual = dir->
make<TH1F>(name_residual.c_str(),
"", bins_residual, min_residual, max_residual);
285 TH1F *hist_resslope = dir->
make<TH1F>(name_resslope.c_str(),
"", bins_resslope, min_resslope, max_resslope);
286 TH1F *hist_residual_raw = dir->
make<TH1F>(name_residual_raw.c_str(),
"", bins_residual, min_residual, max_residual);
287 TH1F *hist_resslope_raw = dir->
make<TH1F>(name_resslope_raw.c_str(),
"", bins_resslope, min_resslope, max_resslope);
288 TH1F *hist_residual_cut = dir->
make<TH1F>(name_residual_cut.c_str(),
"", bins_residual, min_residual, max_residual);
289 TH2F *hist_alpha = dir->
make<TH2F>(name_alpha.c_str(),
"", 50, min_resslope, max_resslope, 50, -50., 50.);
291 TProfile *hist_residual_trackx = dir->
make<TProfile>(name_residual_trackx.c_str(),
"", 50, min_trackx, max_trackx, min_residual, max_residual);
292 TProfile *hist_resslope_trackx = dir->
make<TProfile>(name_resslope_trackx.c_str(),
"", 50, min_trackx, max_trackx, min_resslope, max_resslope);
293 TProfile *hist_residual_tracky = dir->
make<TProfile>(name_residual_tracky.c_str(),
"", 50, min_tracky, max_tracky, min_residual, max_residual);
294 TProfile *hist_resslope_tracky = dir->
make<TProfile>(name_resslope_tracky.c_str(),
"", 50, min_tracky, max_tracky, min_resslope, max_resslope);
295 TProfile *hist_residual_trackdxdz = dir->
make<TProfile>(name_residual_trackdxdz.c_str(),
"", 250, min_trackdxdz, max_trackdxdz, min_residual, max_residual);
296 TProfile *hist_resslope_trackdxdz = dir->
make<TProfile>(name_resslope_trackdxdz.c_str(),
"", 250, min_trackdxdz, max_trackdxdz, min_resslope, max_resslope);
297 TProfile *hist_residual_trackdydz = dir->
make<TProfile>(name_residual_trackdydz.c_str(),
"", 250, min_trackdydz, max_trackdydz, min_residual, max_residual);
298 TProfile *hist_resslope_trackdydz = dir->
make<TProfile>(name_resslope_trackdydz.c_str(),
"", 250, min_trackdydz, max_trackdydz, min_resslope, max_resslope);
300 hist_residual_trackx->SetAxisRange(-10., 10.,
"Y");
301 hist_resslope_trackx->SetAxisRange(-10., 10.,
"Y");
302 hist_residual_tracky->SetAxisRange(-10., 10.,
"Y");
303 hist_resslope_tracky->SetAxisRange(-10., 10.,
"Y");
304 hist_residual_trackdxdz->SetAxisRange(-10., 10.,
"Y");
305 hist_resslope_trackdxdz->SetAxisRange(-10., 10.,
"Y");
306 hist_residual_trackdydz->SetAxisRange(-10., 10.,
"Y");
307 hist_resslope_trackdydz->SetAxisRange(-10., 10.,
"Y");
309 name_residual +=
"_fit";
310 name_resslope +=
"_fit";
311 name_alpha +=
"_fit";
312 name_residual_trackx +=
"_fit";
313 name_resslope_trackx +=
"_fit";
314 name_residual_tracky +=
"_fit";
315 name_resslope_tracky +=
"_fit";
316 name_residual_trackdxdz +=
"_fit";
317 name_resslope_trackdxdz +=
"_fit";
318 name_residual_trackdydz +=
"_fit";
319 name_resslope_trackdydz +=
"_fit";
321 TF1 *fit_residual =
nullptr;
322 TF1 *fit_resslope =
nullptr;
327 fit_residual->SetParErrors(er_res);
331 fit_resslope->SetParErrors(er_resslope);
351 else { assert(
false); }
353 fit_residual->SetLineColor(2); fit_residual->SetLineWidth(2); fit_residual->Write();
354 fit_resslope->SetLineColor(2); fit_resslope->SetLineWidth(2); fit_resslope->Write();
356 TF1 *fit_alpha =
new TF1(name_alpha.c_str(),
"[0] + x*[1]", min_resslope, max_resslope);
366 a = -
b * mean_resslope;
369 fit_alpha->SetParameters(a,
b);
370 fit_alpha->SetLineColor(2); fit_alpha->SetLineWidth(2); fit_alpha->Write();
372 TProfile *fit_residual_trackx = dir->
make<TProfile>(name_residual_trackx.c_str(),
"", 50, min_trackx, max_trackx);
373 TProfile *fit_resslope_trackx = dir->
make<TProfile>(name_resslope_trackx.c_str(),
"", 50, min_trackx, max_trackx);
374 TProfile *fit_residual_tracky = dir->
make<TProfile>(name_residual_tracky.c_str(),
"", 50, min_tracky, max_tracky);
375 TProfile *fit_resslope_tracky = dir->
make<TProfile>(name_resslope_tracky.c_str(),
"", 50, min_tracky, max_tracky);
376 TProfile *fit_residual_trackdxdz = dir->
make<TProfile>(name_residual_trackdxdz.c_str(),
"", 250, min_trackdxdz, max_trackdxdz);
377 TProfile *fit_resslope_trackdxdz = dir->
make<TProfile>(name_resslope_trackdxdz.c_str(),
"", 250, min_trackdxdz, max_trackdxdz);
378 TProfile *fit_residual_trackdydz = dir->
make<TProfile>(name_residual_trackdydz.c_str(),
"", 250, min_trackdydz, max_trackdydz);
379 TProfile *fit_resslope_trackdydz = dir->
make<TProfile>(name_resslope_trackdydz.c_str(),
"", 250, min_trackdydz, max_trackdydz);
381 fit_residual_trackx->SetLineColor(2); fit_residual_trackx->SetLineWidth(2);
382 fit_resslope_trackx->SetLineColor(2); fit_resslope_trackx->SetLineWidth(2);
383 fit_residual_tracky->SetLineColor(2); fit_residual_tracky->SetLineWidth(2);
384 fit_resslope_tracky->SetLineColor(2); fit_resslope_tracky->SetLineWidth(2);
385 fit_residual_trackdxdz->SetLineColor(2); fit_residual_trackdxdz->SetLineWidth(2);
386 fit_resslope_trackdxdz->SetLineColor(2); fit_resslope_trackdxdz->SetLineWidth(2);
387 fit_residual_trackdydz->SetLineColor(2); fit_residual_trackdydz->SetLineWidth(2);
388 fit_resslope_trackdydz->SetLineColor(2); fit_resslope_trackdydz->SetLineWidth(2);
390 name_residual_trackx +=
"line";
391 name_resslope_trackx +=
"line";
392 name_residual_tracky +=
"line";
393 name_resslope_tracky +=
"line";
394 name_residual_trackdxdz +=
"line";
395 name_resslope_trackdxdz +=
"line";
396 name_residual_trackdydz +=
"line";
397 name_resslope_trackdydz +=
"line";
399 TF1 *fitline_residual_trackx =
new TF1(name_residual_trackx.c_str(), residual_x_trackx_TF1, min_trackx, max_trackx, 12);
400 TF1 *fitline_resslope_trackx =
new TF1(name_resslope_trackx.c_str(), residual_dxdz_trackx_TF1, min_trackx, max_trackx, 12);
401 TF1 *fitline_residual_tracky =
new TF1(name_residual_tracky.c_str(), residual_x_tracky_TF1, min_tracky, max_tracky, 12);
402 TF1 *fitline_resslope_tracky =
new TF1(name_resslope_tracky.c_str(), residual_dxdz_tracky_TF1, min_tracky, max_tracky, 12);
403 TF1 *fitline_residual_trackdxdz =
new TF1(name_residual_trackdxdz.c_str(), residual_x_trackdxdz_TF1, min_trackdxdz, max_trackdxdz, 12);
404 TF1 *fitline_resslope_trackdxdz =
new TF1(name_resslope_trackdxdz.c_str(), residual_dxdz_trackdxdz_TF1, min_trackdxdz, max_trackdxdz, 12);
405 TF1 *fitline_residual_trackdydz =
new TF1(name_residual_trackdydz.c_str(), residual_x_trackdydz_TF1, min_trackdydz, max_trackdydz, 12);
406 TF1 *fitline_resslope_trackdydz =
new TF1(name_resslope_trackdydz.c_str(), residual_dxdz_trackdydz_TF1, min_trackdydz, max_trackdydz, 12);
408 std::vector<TF1*> fitlines;
409 fitlines.push_back(fitline_residual_trackx);
410 fitlines.push_back(fitline_resslope_trackx);
411 fitlines.push_back(fitline_residual_tracky);
412 fitlines.push_back(fitline_resslope_tracky);
413 fitlines.push_back(fitline_residual_trackdxdz);
414 fitlines.push_back(fitline_resslope_trackdxdz);
415 fitlines.push_back(fitline_residual_trackdydz);
416 fitlines.push_back(fitline_resslope_trackdydz);
419 mean_trackx, mean_tracky, mean_trackdxdz, mean_trackdydz,
value(
kAlpha), mean_resslope};
422 for(std::vector<TF1*>::const_iterator itr = fitlines.begin(); itr != fitlines.end(); itr++)
424 (*itr)->SetParameters(fitparameters);
425 (*itr)->SetLineColor(2);
426 (*itr)->SetLineWidth(2);
431 const double resid = (*resiter)[
kResid];
432 const double resslope = (*resiter)[
kResSlope];
433 const double positionX = (*resiter)[
kPositionX];
434 const double positionY = (*resiter)[
kPositionY];
435 const double angleX = (*resiter)[
kAngleX];
436 const double angleY = (*resiter)[
kAngleY];
437 const double redchi2 = (*resiter)[
kRedChi2];
438 double weight = 1./redchi2;
442 hist_alpha->Fill(1000.*resslope, 10.*resid);
446 double geom_resid = residual_x(
value(
kAlignX),
value(
kAlignZ),
value(
kAlignPhiX),
value(
kAlignPhiY),
value(
kAlignPhiZ), positionX, positionY, angleX, angleY, coeff, resslope);
447 hist_residual->Fill(10.*(resid - geom_resid +
value(
kAlignX)), weight);
448 hist_residual_trackx->Fill(positionX, 10.*resid, weight);
449 hist_residual_tracky->Fill(positionY, 10.*resid, weight);
450 hist_residual_trackdxdz->Fill(angleX, 10.*resid, weight);
451 hist_residual_trackdydz->Fill(angleY, 10.*resid, weight);
452 fit_residual_trackx->Fill(positionX, 10.*geom_resid, weight);
453 fit_residual_tracky->Fill(positionY, 10.*geom_resid, weight);
454 fit_residual_trackdxdz->Fill(angleX, 10.*geom_resid, weight);
455 fit_residual_trackdydz->Fill(angleY, 10.*geom_resid, weight);
458 hist_resslope->Fill(1000.*(resslope - geom_resslope +
value(
kAlignPhiY)), weight);
459 hist_resslope_trackx->Fill(positionX, 1000.*resslope, weight);
460 hist_resslope_tracky->Fill(positionY, 1000.*resslope, weight);
461 hist_resslope_trackdxdz->Fill(angleX, 1000.*resslope, weight);
462 hist_resslope_trackdydz->Fill(angleY, 1000.*resslope, weight);
463 fit_resslope_trackx->Fill(positionX, 1000.*geom_resslope, weight);
464 fit_resslope_tracky->Fill(positionY, 1000.*geom_resslope, weight);
465 fit_resslope_trackdxdz->Fill(angleX, 1000.*geom_resslope, weight);
466 fit_resslope_trackdydz->Fill(angleY, 1000.*geom_resslope, weight);
469 hist_residual_raw->Fill(10.*resid);
470 hist_resslope_raw->Fill(1000.*resslope);
471 if (fabs(resslope) < 0.005) hist_residual_cut->Fill(10.*resid);
476 for (
int i = 1;
i <= hist_residual->GetNbinsX();
i++) {
477 double xi = hist_residual->GetBinCenter(
i);
478 double yi = hist_residual->GetBinContent(
i);
479 double yerri = hist_residual->GetBinError(
i);
480 double yth = fit_residual->Eval(xi);
482 chi2 +=
pow((yth - yi)/yerri, 2);
486 for (
int i = 1;
i <= hist_resslope->GetNbinsX();
i++) {
487 double xi = hist_resslope->GetBinCenter(
i);
488 double yi = hist_resslope->GetBinContent(
i);
489 double yerri = hist_resslope->GetBinError(
i);
490 double yth = fit_resslope->Eval(xi);
492 chi2 +=
pow((yth - yi)/yerri, 2);
498 return (ndof > 0. ? chi2 / ndof : -1.);
504 TFile *
f =
new TFile(fname.c_str());
505 TTree *
t = (TTree*)f->Get(
"mual_ttree");
508 TFile *tmpf =
new TFile(
"small_tree_fit.root",
"recreate");
509 assert(tmpf!=
nullptr);
512 TTree *
tt = t->CopyTree(Form(
"is_dt && ring_wheel==%d && station==%d && sector==%d && select==%d", wheel, station, sector, (
bool)preselected));
515 tt->SetBranchAddress(
"res_x", &r.
res_x);
516 tt->SetBranchAddress(
"res_slope_x", &r.
res_slope_x);
517 tt->SetBranchAddress(
"pos_x", &r.
pos_x);
518 tt->SetBranchAddress(
"pos_y", &r.
pos_y);
519 tt->SetBranchAddress(
"angle_x", &r.
angle_x);
520 tt->SetBranchAddress(
"angle_y", &r.
angle_y);
521 tt->SetBranchAddress(
"pz", &r.
pz);
522 tt->SetBranchAddress(
"pt", &r.
pt);
523 tt->SetBranchAddress(
"q", &r.
q);
525 Long64_t nentries = tt->GetEntries();
526 for (Long64_t
i=0;
i<nentries;
i++)
align::Scalar width() const
double MuonResidualsFitter_logGaussPowerTails(double residual, double center, double sigma)
Double_t MuonResidualsFitter_powerLawTails_TF1(Double_t *xvec, Double_t *par)
static const HistoName names[]
double MuonResidualsFitter_logPureGaussian2D(double x, double y, double x0, double y0, double sx, double sy, double r)
double plot(std::string name, TFileDirectory *dir, Alignable *ali) override
void fill(double *residual)
MuonResidualsFitter * fitter()
int residualsModel() const
TTree * readNtuple(std::string fname, unsigned int wheel, unsigned int station, unsigned int sector, unsigned int preselected=1)
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 MuonResiduals5DOFFitter_FCN(int &npar, double *gin, double &fval, double *par, int iflag)
double MuonResidualsFitter_logPowerLawTails(double residual, double center, double sigma, double gamma)
Double_t MuonResidualsFitter_GaussPowerTails_TF1(Double_t *xvec, Double_t *par)
void fix(int parNum, bool dofix=true)
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.
Double_t MuonResidualsFitter_pureGaussian_TF1(Double_t *xvec, Double_t *par)
align::Scalar length() const
double errorerror(int parNum)
void inform(TMinuit *tMinuit) override
void correctBField() override
std::vector< double * >::const_iterator residuals_end() const
int useRes(int pattern=-1)
Double_t MuonResidualsFitter_ROOTVoigt_TF1(Double_t *xvec, Double_t *par)
std::vector< double * >::const_iterator residuals_begin() const
double sumofweights() override
double MuonResidualsFitter_logPureGaussian(double residual, double center, double sigma)
Power< A, B >::type pow(const A &a, const B &b)
bool fit(Alignable *ali) override