CMS 3D CMS Logo

BSFitter.cc
Go to the documentation of this file.
1 
14 #include "Minuit2/VariableMetricMinimizer.h"
15 #include "Minuit2/FunctionMinimum.h"
16 #include "Minuit2/MnPrint.h"
17 #include "Minuit2/MnMigrad.h"
18 #include "Minuit2/MnUserParameterState.h"
19 //#include "CLHEP/config/CLHEP.h"
20 
21 // C++ standard
22 #include <vector>
23 #include <cmath>
24 
25 // CMS
30 
31 // ROOT
32 #include "TMatrixD.h"
33 #include "TMatrixDSym.h"
34 #include "TDecompBK.h"
35 #include "TH1.h"
36 #include "TF1.h"
37 #include "TMinuitMinimizer.h"
38 
39 using namespace ROOT::Minuit2;
40 
41 
42 //_____________________________________________________________________
44  fbeamtype = reco::BeamSpot::Unknown;
45 
46  //In order to make fitting ROOT histograms thread safe
47  // one must call this undocumented function
48  TMinuitMinimizer::UseStaticMinuit(false);
49 }
50 
51 //_____________________________________________________________________
52 BSFitter::BSFitter( const std:: vector< BSTrkParameters > &BSvector ) {
53  //In order to make fitting ROOT histograms thread safe
54  // one must call this undocumented function
55  TMinuitMinimizer::UseStaticMinuit(false);
56 
57  ffit_type = "default";
58  ffit_variable = "default";
59 
60  fBSvector = BSvector;
61 
62  fsqrt2pi = sqrt(2.* TMath::Pi());
63 
64  fpar_name[0] = "z0 ";
65  fpar_name[1] = "SigmaZ0 ";
66  fpar_name[2] = "X0 ";
67  fpar_name[3] = "Y0 ";
68  fpar_name[4] = "dxdz ";
69  fpar_name[5] = "dydz ";
70  fpar_name[6] = "SigmaBeam ";
71 
72  //if (theGausszFcn == 0 ) {
73  thePDF = new BSpdfsFcn();
74 
75 
76 //}
77  //if (theFitter == 0 ) {
78 
79  theFitter = new VariableMetricMinimizer();
80 
81  //}
82 
83  fapplyd0cut = false;
84  fapplychi2cut = false;
85  ftmprow = 0;
86  ftmp.ResizeTo(4,1);
87  ftmp.Zero();
88  fnthite=0;
89  fMaxZ = 50.; //cm
90  fconvergence = 0.5; // stop fit when 50% of the input collection has been removed.
91  fminNtrks = 100;
92  finputBeamWidth = -1; // no input
93 
94  h1z = new TH1F("h1z","z distribution",200,-fMaxZ, fMaxZ);
95 
96 }
97 
98 //______________________________________________________________________
100 {
101  //delete fBSvector;
102  delete thePDF;
103  delete theFitter;
104 }
105 
106 
107 //______________________________________________________________________
109 
110  return this->Fit(nullptr);
111 
112 }
113 
114 //______________________________________________________________________
115 reco::BeamSpot BSFitter::Fit(double *inipar = nullptr) {
116  fbeamtype = reco::BeamSpot::Unknown;
117  if ( ffit_variable == "z" ) {
118 
119  if ( ffit_type == "chi2" ) {
120 
121  return Fit_z_chi2(inipar);
122 
123  } else if ( ffit_type == "likelihood" ) {
124 
125  return Fit_z_likelihood(inipar);
126 
127  } else if ( ffit_type == "combined" ) {
128 
129  reco::BeamSpot tmp_beamspot = Fit_z_chi2(inipar);
130  double tmp_par[2] = {tmp_beamspot.z0(), tmp_beamspot.sigmaZ()};
131  return Fit_z_likelihood(tmp_par);
132 
133  } else {
134 
135  throw cms::Exception("LogicError")
136  << "Error in BeamSpotProducer/BSFitter: "
137  << "Illegal fit type, options are chi2,likelihood or combined(ie. first chi2 then likelihood)";
138 
139  }
140  } else if ( ffit_variable == "d" ) {
141 
142  if ( ffit_type == "d0phi" ) {
143  this->d0phi_Init();
144  return Fit_d0phi();
145 
146  } else if ( ffit_type == "likelihood" ) {
147 
148  return Fit_d_likelihood(inipar);
149 
150  } else if ( ffit_type == "combined" ) {
151 
152  this->d0phi_Init();
153  reco::BeamSpot tmp_beamspot = Fit_d0phi();
154  double tmp_par[4] = {tmp_beamspot.x0(), tmp_beamspot.y0(), tmp_beamspot.dxdz(), tmp_beamspot.dydz()};
155  return Fit_d_likelihood(tmp_par);
156 
157  } else {
158  throw cms::Exception("LogicError")
159  << "Error in BeamSpotProducer/BSFitter: "
160  << "Illegal fit type, options are d0phi, likelihood or combined";
161  }
162  } else if ( ffit_variable == "d*z" || ffit_variable == "default" ) {
163 
164  if ( ffit_type == "likelihood" || ffit_type == "default" ) {
165 
167  // we are now fitting Z inside d0phi fitter
168  // first fit z distribution using a chi2 fit
169  //reco::BeamSpot tmp_z = Fit_z_chi2(inipar);
170  //for (int j = 2 ; j < 4 ; ++j) {
171  //for(int k = j ; k < 4 ; ++k) {
172  // matrix(j,k) = tmp_z.covariance()(j,k);
173  //}
174  //}
175 
176  // use d0-phi algorithm to extract transverse position
177  this->d0phi_Init();
178  //reco::BeamSpot tmp_d0phi= Fit_d0phi(); // change to iterative procedure:
179  this->Setd0Cut_d0phi(4.0);
180  reco::BeamSpot tmp_d0phi= Fit_ited0phi();
181 
182  //for (int j = 0 ; j < 2 ; ++j) {
183  // for(int k = j ; k < 2 ; ++k) {
184  // matrix(j,k) = tmp_d0phi.covariance()(j,k);
185  //}
186  //}
187  // slopes
188  //for (int j = 4 ; j < 6 ; ++j) {
189  // for(int k = j ; k < 6 ; ++k) {
190  // matrix(j,k) = tmp_d0phi.covariance()(j,k);
191  // }
192  //}
193 
194 
195  // put everything into one object
196  reco::BeamSpot spot(reco::BeamSpot::Point(tmp_d0phi.x0(), tmp_d0phi.y0(), tmp_d0phi.z0()),
197  tmp_d0phi.sigmaZ(),
198  tmp_d0phi.dxdz(),
199  tmp_d0phi.dydz(),
200  0.,
201  tmp_d0phi.covariance(),
202  fbeamtype );
203 
204 
205 
206  //reco::BeamSpot tmp_z = Fit_z_chi2(inipar);
207 
208  //reco::BeamSpot tmp_d0phi = Fit_d0phi();
209 
210  // log-likelihood fit
211  if (ffit_type == "likelihood") {
212  double tmp_par[7] = {tmp_d0phi.x0(), tmp_d0phi.y0(), tmp_d0phi.z0(),
213  tmp_d0phi.sigmaZ(), tmp_d0phi.dxdz(), tmp_d0phi.dydz(),0.0};
214 
215  double tmp_error_par[7];
216  for(int s=0;s<6;s++){ tmp_error_par[s] = pow( tmp_d0phi.covariance()(s,s),0.5);}
217  tmp_error_par[6]=0.0;
218 
219  reco::BeamSpot tmp_lh = Fit_d_z_likelihood(tmp_par,tmp_error_par);
220 
221  if (edm::isNotFinite(ff_minimum)) {
222  edm::LogWarning("BSFitter") << "BSFitter: Result is non physical. Log-Likelihood fit to extract beam width did not converge." << std::endl;
224  return tmp_lh;
225  }
226  return tmp_lh;
227 
228  } else {
229 
230  edm::LogInfo("BSFitter") << "default track-based fit does not extract beam width." << std::endl;
231  return spot;
232  }
233 
234 
235  } else if ( ffit_type == "resolution" ) {
236 
237  reco::BeamSpot tmp_z = Fit_z_chi2(inipar);
238  this->d0phi_Init();
239  reco::BeamSpot tmp_d0phi = Fit_d0phi();
240 
241  double tmp_par[7] = {tmp_d0phi.x0(), tmp_d0phi.y0(), tmp_z.z0(),
242  tmp_z.sigmaZ(), tmp_d0phi.dxdz(), tmp_d0phi.dydz(),0.0};
243  double tmp_error_par[7];
244  for(int s=0;s<6;s++){ tmp_error_par[s] = pow(tmp_par[s],0.5);}
245  tmp_error_par[6]=0.0;
246 
247  reco::BeamSpot tmp_beam = Fit_d_z_likelihood(tmp_par,tmp_error_par);
248 
249  double tmp_par2[7] = {tmp_beam.x0(), tmp_beam.y0(), tmp_beam.z0(),
250  tmp_beam.sigmaZ(), tmp_beam.dxdz(), tmp_beam.dydz(),
251  tmp_beam.BeamWidthX()};
252 
253  reco::BeamSpot tmp_lh = Fit_dres_z_likelihood(tmp_par2);
254 
255  if (edm::isNotFinite(ff_minimum)) {
256 
257  edm::LogWarning("BSFitter") << "Result is non physical. Log-Likelihood fit did not converge." << std::endl;
259  return tmp_lh;
260  }
261  return tmp_lh;
262 
263  } else {
264 
265  throw cms::Exception("LogicError")
266  << "Error in BeamSpotProducer/BSFitter: "
267  << "Illegal fit type, options are likelihood or resolution";
268  }
269  } else {
270 
271  throw cms::Exception("LogicError")
272  << "Error in BeamSpotProducer/BSFitter: "
273  << "Illegal variable type, options are \"z\", \"d\", or \"d*z\"";
274  }
275 
276 
277 }
278 
279 //______________________________________________________________________
281 
282  //std::cout << "Fit_z(double *) called" << std::endl;
283  //std::cout << "inipar[0]= " << inipar[0] << std::endl;
284  //std::cout << "inipar[1]= " << inipar[1] << std::endl;
285 
286  std::vector<double> par(2,0);
287  std::vector<double> err(2,0);
288 
289  par.push_back(0.0);
290  par.push_back(7.0);
291  err.push_back(0.0001);
292  err.push_back(0.0001);
293  //par[0] = 0.0; err[0] = 0.0;
294  //par[1] = 7.0; err[1] = 0.0;
295 
296  thePDF->SetPDFs("PDFGauss_z");
297  thePDF->SetData(fBSvector);
298  //std::cout << "data loaded"<< std::endl;
299 
300  //FunctionMinimum fmin = theFitter->Minimize(*theGausszFcn, par, err, 1, 500, 0.1);
301  MnUserParameters upar;
302  upar.Add("X0", 0.,0.);
303  upar.Add("Y0", 0.,0.);
304  upar.Add("Z0", inipar[0],0.001);
305  upar.Add("sigmaZ",inipar[1],0.001);
306 
307  MnMigrad migrad(*thePDF, upar);
308 
309  FunctionMinimum fmin = migrad();
310  ff_minimum = fmin.Fval();
311  //std::cout << " eval= " << ff_minimum
312  // << "/n params[0]= " << fmin.Parameters().Vec()(0) << std::endl;
313 
314  /*
315  TMinuit *gmMinuit = new TMinuit(2);
316 
317  //gmMinuit->SetFCN(z_fcn);
318  gmMinuit->SetFCN(myFitz_fcn);
319 
320 
321  int ierflg = 0;
322  double step[2] = {0.001,0.001};
323 
324  for (int i = 0; i<2; i++) {
325  gmMinuit->mnparm(i,fpar_name[i].c_str(),inipar[i],step[i],0,0,ierflg);
326  }
327  gmMinuit->Migrad();
328  */
330 
331  for (int j = 2 ; j < 4 ; ++j) {
332  for(int k = j ; k < 4 ; ++k) {
333  matrix(j,k) = fmin.Error().Matrix()(j,k);
334  }
335  }
336 
338  0.,
339  fmin.Parameters().Vec()(2)),
340  fmin.Parameters().Vec()(3),
341  0.,
342  0.,
343  0.,
344  matrix,
345  fbeamtype );
346 }
347 
348 //______________________________________________________________________
350 
351  // N.B. this fit is not performed anymore but now
352  // Z is fitted in the same track set used in the d0-phi fit after
353  // each iteration
354 
355 
356  //std::cout << "Fit_z_chi2() called" << std::endl;
357  // FIXME: include whole tracker z length for the time being
358  // ==> add protection and z0 cut
359  h1z = new TH1F("h1z","z distribution",200,-fMaxZ, fMaxZ);
360 
361  std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
362 
363  // HERE check size of track vector
364 
365  for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam) {
366 
367  h1z->Fill( iparam->z0() );
368  //std::cout<<"z0="<<iparam->z0()<<"; sigZ0="<<iparam->sigz0()<<std::endl;
369  }
370 
371  //Use our own copy for thread safety
372  // also do not add to global list of functions
373  TF1 fgaus("fgaus","gaus",0.,1.,TF1::EAddToList::kNo);
374  h1z->Fit(&fgaus,"QLMN0 SERIAL");
375  //std::cout << "fitted "<< std::endl;
376 
377  //std::cout << "got function" << std::endl;
378  double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
379  //std::cout<<"Debug fpar[2] = (" <<fpar[0]<<","<<fpar[1]<<")"<<std::endl;
381  // add matrix values.
382  matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
383  matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
384 
385  //delete h1z;
386 
388  0.,
389  fpar[0]),
390  fpar[1],
391  0.,
392  0.,
393  0.,
394  matrix,
395  fbeamtype );
396 
397 
398 }
399 
400 //______________________________________________________________________
402 
403  this->d0phi_Init();
404  edm::LogInfo("BSFitter") << "number of total input tracks: " << fBSvector.size() << std::endl;
405 
406  reco::BeamSpot theanswer;
407 
408  if ( (int)fBSvector.size() <= fminNtrks ) {
409  edm::LogWarning("BSFitter") << "need at least " << fminNtrks << " tracks to run beamline fitter." << std::endl;
410  fbeamtype = reco::BeamSpot::Fake;
411  theanswer.setType(fbeamtype);
412  return theanswer;
413  }
414 
415  theanswer = Fit_d0phi(); //get initial ftmp and ftmprow
416  if ( goodfit ) fnthite++;
417  //std::cout << "Initial tempanswer (iteration 0): " << theanswer << std::endl;
418 
419  reco::BeamSpot preanswer = theanswer;
420 
421  while ( goodfit &&
422  ftmprow > fconvergence * fBSvector.size() &&
423  ftmprow > fminNtrks ) {
424 
425  theanswer = Fit_d0phi();
426  fd0cut /= 1.5;
427  fchi2cut /= 1.5;
428  if ( goodfit &&
429  ftmprow > fconvergence * fBSvector.size() &&
430  ftmprow > fminNtrks ) {
431  preanswer = theanswer;
432  //std::cout << "Iteration " << fnthite << ": " << preanswer << std::endl;
433  fnthite++;
434  }
435  }
436  // FIXME: return fit results from previous iteration for both bad fit and for >50% tracks thrown away
437  //std::cout << "The last iteration, theanswer: " << theanswer << std::endl;
438  theanswer = preanswer;
439  //std::cout << "Use previous results from iteration #" << ( fnthite > 0 ? fnthite-1 : 0 ) << std::endl;
440  //if ( fnthite > 1 ) std::cout << theanswer << std::endl;
441 
442  edm::LogInfo("BSFitter") << "Total number of successful iterations = " << ( goodfit ? (fnthite+1) : fnthite ) << std::endl;
443  if (goodfit) {
444  fbeamtype = reco::BeamSpot::Tracker;
445  theanswer.setType(fbeamtype);
446  }
447  else {
448  edm::LogWarning("BSFitter") << "Fit doesn't converge!!!" << std::endl;
449  fbeamtype = reco::BeamSpot::Unknown;
450  theanswer.setType(fbeamtype);
451  }
452  return theanswer;
453 }
454 
455 
456 //______________________________________________________________________
458 
459  //LogDebug ("BSFitter") << " we will use " << fBSvector.size() << " tracks.";
460  if (fnthite > 0) edm::LogInfo("BSFitter") << " number of tracks used: " << ftmprow << std::endl;
461  //std::cout << " ftmp = matrix("<<ftmp.GetNrows()<<","<<ftmp.GetNcols()<<")"<<std::endl;
462  //std::cout << " ftmp(0,0)="<<ftmp(0,0)<<std::endl;
463  //std::cout << " ftmp(1,0)="<<ftmp(1,0)<<std::endl;
464  //std::cout << " ftmp(2,0)="<<ftmp(2,0)<<std::endl;
465  //std::cout << " ftmp(3,0)="<<ftmp(3,0)<<std::endl;
466 
467  h1z->Reset();
468 
469 
470  TMatrixD x_result(4,1);
471  TMatrixDSym V_result(4);
472 
473  TMatrixDSym Vint(4);
474  TMatrixD b(4,1);
475 
476  //Double_t weightsum = 0;
477 
478  Vint.Zero();
479  b.Zero();
480 
481  TMatrixD g(4,1);
482  TMatrixDSym temp(4);
483 
484  std::vector<BSTrkParameters>::iterator iparam = fBSvector.begin();
485  ftmprow=0;
486 
487 
488  //edm::LogInfo ("BSFitter") << " test";
489 
490  //std::cout << "BSFitter: fit" << std::endl;
491 
492  for( iparam = fBSvector.begin() ;
493  iparam != fBSvector.end() ; ++iparam) {
494 
495 
496  //if(i->weight2 == 0) continue;
497 
498  //if (ftmprow==0) {
499  //std::cout << "d0=" << iparam->d0() << " sigd0=" << iparam->sigd0()
500  //<< " phi0="<< iparam->phi0() << " z0=" << iparam->z0() << std::endl;
501  //std::cout << "d0phi_d0=" << iparam->d0phi_d0() << " d0phi_chi2="<<iparam->d0phi_chi2() << std::endl;
502  //}
503  g(0,0) = sin(iparam->phi0());
504  g(1,0) = -cos(iparam->phi0());
505  g(2,0) = iparam->z0() * g(0,0);
506  g(3,0) = iparam->z0() * g(1,0);
507 
508 
509  // average transverse beam width
510  double sigmabeam2 = 0.006 * 0.006;
511  if (finputBeamWidth > 0 ) sigmabeam2 = finputBeamWidth * finputBeamWidth;
512  else {
513  //edm::LogWarning("BSFitter") << "using in fit beam width = " << sqrt(sigmabeam2) << std::endl;
514  }
515 
516  //double sigma2 = sigmabeam2 + (iparam->sigd0())* (iparam->sigd0()) / iparam->weight2;
517  // this should be 2*sigmabeam2?
518  double sigma2 = sigmabeam2 + (iparam->sigd0())* (iparam->sigd0());
519 
520  TMatrixD ftmptrans(1,4);
521  ftmptrans = ftmptrans.Transpose(ftmp);
522  TMatrixD dcor = ftmptrans * g;
523  double chi2tmp = (iparam->d0() - dcor(0,0)) * (iparam->d0() - dcor(0,0))/sigma2;
524  (*iparam) = BSTrkParameters(iparam->z0(),iparam->sigz0(),iparam->d0(),iparam->sigd0(),
525  iparam->phi0(), iparam->pt(),dcor(0,0),chi2tmp);
526 
527  bool pass = true;
528  if (fapplyd0cut && fnthite>0 ) {
529  if ( std::abs(iparam->d0() - dcor(0,0)) > fd0cut ) pass = false;
530 
531  }
532  if (fapplychi2cut && fnthite>0 ) {
533  if ( chi2tmp > fchi2cut ) pass = false;
534 
535  }
536 
537  if (pass) {
538  temp.Zero();
539  for(int j = 0 ; j < 4 ; ++j) {
540  for(int k = j ; k < 4 ; ++k) {
541  temp(j,k) += g(j,0) * g(k,0);
542  }
543  }
544 
545 
546  Vint += (temp * (1 / sigma2));
547  b += (iparam->d0() / sigma2 * g);
548  //weightsum += sqrt(i->weight2);
549  ftmprow++;
550  h1z->Fill( iparam->z0() );
551  }
552 
553 
554  }
555  Double_t determinant;
556  TDecompBK bk(Vint);
557  bk.SetTol(1e-11); //FIXME: find a better way to solve x_result
558  if (!bk.Decompose()) {
559  goodfit = false;
560  edm::LogWarning("BSFitter")
561  << "Decomposition failed, matrix singular ?" << std::endl
562  << "condition number = " << bk.Condition() << std::endl;
563  }
564  else {
565  V_result = Vint.InvertFast(&determinant);
566  x_result = V_result * b;
567  }
568  // for(int j = 0 ; j < 4 ; ++j) {
569  // for(int k = 0 ; k < 4 ; ++k) {
570  // std::cout<<"V_result("<<j<<","<<k<<")="<<V_result(j,k)<<std::endl;
571  // }
572  // }
573  // for (int j=0;j<4;++j){
574  // std::cout<<"x_result("<<j<<",0)="<<x_result(j,0)<<std::endl;
575  // }
576  //LogDebug ("BSFitter") << " d0-phi fit done.";
577  //std::cout<< " d0-phi fit done." << std::endl;
578 
579  //Use our own copy for thread safety
580  // also do not add to global list of functions
581  TF1 fgaus("fgaus","gaus",0.,1.,TF1::EAddToList::kNo);
582  //returns 0 if OK
583  //auto status = h1z->Fit(&fgaus,"QLM0","",h1z->GetMean() -2.*h1z->GetRMS(),h1z->GetMean() +2.*h1z->GetRMS());
584  auto status = h1z->Fit(&fgaus,"QLN0 SERIAL","",h1z->GetMean() -2.*h1z->GetRMS(),h1z->GetMean() +2.*h1z->GetRMS());
585 
586  //std::cout << "fitted "<< std::endl;
587 
588  //std::cout << "got function" << std::endl;
589  if (status){
590  //edm::LogError("NoBeamSpotFit")<<"gaussian fit failed. no BS d0 fit";
591 
592  return reco::BeamSpot();
593  }
594  double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
595 
597  // first two parameters
598  for (int j = 0 ; j < 2 ; ++j) {
599  for(int k = j ; k < 2 ; ++k) {
600  matrix(j,k) = V_result(j,k);
601  }
602  }
603  // slope parameters
604  for (int j = 4 ; j < 6 ; ++j) {
605  for(int k = j ; k < 6 ; ++k) {
606  matrix(j,k) = V_result(j-2,k-2);
607  }
608  }
609 
610  // Z0 and sigmaZ
611  matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
612  matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
613 
614  ftmp = x_result;
615 
616  // x0 and y0 are *not* x,y at z=0, but actually at z=0
617  // to correct for this, we need to translate them to z=z0
618  // using the measured slopes
619  //
620  double x0tmp = x_result(0,0);
621  double y0tmp = x_result(1,0);
622 
623  x0tmp += x_result(2,0)*fpar[0];
624  y0tmp += x_result(3,0)*fpar[0];
625 
626 
628  y0tmp,
629  fpar[0]),
630  fpar[1],
631  x_result(2,0),
632  x_result(3,0),
633  0.,
634  matrix,
635  fbeamtype );
636 
637 }
638 
639 
640 //______________________________________________________________________
641 void BSFitter::Setd0Cut_d0phi(double d0cut) {
642 
643  fapplyd0cut = true;
644 
645  //fBSforCuts = BSfitted;
646  fd0cut = d0cut;
647 }
648 
649 //______________________________________________________________________
651 
652  fapplychi2cut = true;
653 
654  //fBSforCuts = BSfitted;
655  fchi2cut = chi2cut;
656 }
657 
658 //______________________________________________________________________
660 
661 
662  thePDF->SetPDFs("PDFGauss_d");
663  thePDF->SetData(fBSvector);
664 
665  MnUserParameters upar;
666  upar.Add("X0", inipar[0],0.001);
667  upar.Add("Y0", inipar[1],0.001);
668  upar.Add("Z0", 0.,0.001);
669  upar.Add("sigmaZ",0.,0.001);
670  upar.Add("dxdz",inipar[2],0.001);
671  upar.Add("dydz",inipar[3],0.001);
672 
673 
674  MnMigrad migrad(*thePDF, upar);
675 
676  FunctionMinimum fmin = migrad();
677  ff_minimum = fmin.Fval();
678 
680  for (int j = 0 ; j < 6 ; ++j) {
681  for(int k = j ; k < 6 ; ++k) {
682  matrix(j,k) = fmin.Error().Matrix()(j,k);
683  }
684  }
685 
686  return reco::BeamSpot( reco::BeamSpot::Point(fmin.Parameters().Vec()(0),
687  fmin.Parameters().Vec()(1),
688  0.),
689  0.,
690  fmin.Parameters().Vec()(4),
691  fmin.Parameters().Vec()(5),
692  0.,
693  matrix,
694  fbeamtype );
695 }
696 //______________________________________________________________________
697 double BSFitter::scanPDF(double *init_pars, int & tracksfixed, int option){
698 
699  if(option==1)init_pars[6]=0.0005; //starting value for any given configuration
700 
701  //local vairables with initial values
702  double fsqrt2pi=0.0;
703  double d_sig=0.0;
704  double d_dprime=0.0;
705  double d_result=0.0;
706  double z_sig=0.0;
707  double z_result=0.0;
708  double function=0.0;
709  double tot_pdf=0.0;
710  double last_minvalue=1.0e+10;
711  double init_bw=-99.99;
712  int iters=0;
713 
714  //used to remove tracks if far away from bs by this
715  double DeltadCut=0.1000;
716  if(init_pars[6]<0.0200){DeltadCut=0.0900; } //worked for high 2.36TeV
717  if(init_pars[6]<0.0100){DeltadCut=0.0700;} //just a guesss for 7 TeV but one should scan for actual values
718 
719 
720 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
721 
722 
723 if(option==1)iters=500;
724 if(option==2)iters=1;
725 
726 for(int p=0;p<iters;p++){
727 
728  if(iters==500)init_pars[6]+=0.0002;
729  tracksfixed=0;
730 
731 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam)
732  {
733  fsqrt2pi = sqrt(2.* TMath::Pi());
734  d_sig = sqrt(init_pars[6]*init_pars[6] + (iparam->sigd0())*(iparam->sigd0()));
735  d_dprime = iparam->d0() - ( ( (init_pars[0] + iparam->z0()*(init_pars[4]))*sin(iparam->phi0()) )
736  - ( (init_pars[1] + iparam->z0()*(init_pars[5]))*cos(iparam->phi0()) ) );
737 
738  //***Remove tracks before the fit which gives low pdf values to blow up the pdf
739  if(std::abs(d_dprime)<DeltadCut && option==2){ fBSvectorBW.push_back(*iparam);}
740 
741  d_result = (exp(-(d_dprime*d_dprime)/(2.0*d_sig*d_sig)))/(d_sig*fsqrt2pi);
742  z_sig = sqrt(iparam->sigz0() * iparam->sigz0() + init_pars[3]*init_pars[3]);
743  z_result = (exp(-((iparam->z0() - init_pars[2])*(iparam->z0() - init_pars[2]))/(2.0*z_sig*z_sig)))/(z_sig*fsqrt2pi);
744  tot_pdf=z_result*d_result;
745 
746  //for those trcks which gives problems due to very tiny pdf_d values.
747  //Update: This protection will NOT be used with the dprime cut above but still kept here to get
748  // the intial value of beam width reasonably
749  //A warning will appear if there were any tracks with < 10^-5 for pdf_d so that (d-dprime) cut can be lowered
750  if(d_result < 1.0e-05){ tot_pdf=z_result*1.0e-05;
751  //if(option==2)std::cout<<"last Iter d-d' = "<<(std::abs(d_dprime))<<std::endl;
752  tracksfixed++; }
753 
754  function = function + log(tot_pdf);
755 
756 
757  }//loop over tracks
758 
759 
760  function= -2.0*function;
761  if(function<last_minvalue){init_bw=init_pars[6];
762  last_minvalue=function; }
763  function=0.0;
764  }//loop over beam width
765 
766  if(init_bw>0) {
767  init_bw=init_bw+(0.20*init_bw); //start with 20 % more
768 
769  }
770  else{
771 
772  if(option==1){
773  edm::LogWarning("BSFitter")
774  <<"scanPDF:====>>>> WARNING***: The initial guess value of Beam width is negative!!!!!!"<<std::endl
775  <<"scanPDF:====>>>> Assigning beam width a starting value of "<<init_bw<<" cm"<<std::endl;
776  init_bw=0.0200;
777 
778  }
779  }
780 
781 
782  return init_bw;
783 
784 }
785 
786 //________________________________________________________________________________
787 reco::BeamSpot BSFitter::Fit_d_z_likelihood(double *inipar, double *error_par) {
788 
789  int tracksFailed=0;
790 
791  //estimate first guess of beam width and tame 20% extra of it to start
792  inipar[6]=scanPDF(inipar,tracksFailed,1);
793  error_par[6]=(inipar[6])*0.20;
794 
795 
796  //Here remove the tracks which give low pdf and fill into a new vector
797  //std::cout<<"Size of Old vector = "<<(fBSvector.size())<<std::endl;
798  /* double junk= */ scanPDF(inipar,tracksFailed,2);
799  //std::cout<<"Size of New vector = "<<(fBSvectorBW.size())<<std::endl;
800 
801  //Refill the fBSVector again with new sets of tracks
802  fBSvector.clear();
803  std::vector<BSTrkParameters>::const_iterator iparamBW = fBSvectorBW.begin();
804  for( iparamBW = fBSvectorBW.begin(); iparamBW != fBSvectorBW.end(); ++iparamBW)
805  { fBSvector.push_back(*iparamBW);
806  }
807 
808 
809  thePDF->SetPDFs("PDFGauss_d*PDFGauss_z");
810  thePDF->SetData(fBSvector);
811  MnUserParameters upar;
812 
813  upar.Add("X0", inipar[0],error_par[0]);
814  upar.Add("Y0", inipar[1],error_par[1]);
815  upar.Add("Z0", inipar[2],error_par[2]);
816  upar.Add("sigmaZ",inipar[3],error_par[3]);
817  upar.Add("dxdz",inipar[4],error_par[4]);
818  upar.Add("dydz",inipar[5],error_par[5]);
819  upar.Add("BeamWidthX",inipar[6],error_par[6]);
820 
821 
822  MnMigrad migrad(*thePDF, upar);
823 
824  FunctionMinimum fmin = migrad();
825 
826  // std::cout<<"-----how the fit evoves------"<<std::endl;
827  // std::cout<<fmin<<std::endl;
828 
829  ff_minimum = fmin.Fval();
830 
831 
832  bool ff_nfcn=fmin.HasReachedCallLimit();
833  bool ff_cov=fmin.HasCovariance();
834  bool testing=fmin.IsValid();
835 
836 
837  //Print WARNINGS if minimum did not converged
838  if( ! testing )
839  {
840  edm::LogWarning("BSFitter") <<"===========>>>>>** WARNING: MINUIT DID NOT CONVERGES PROPERLY !!!!!!"<<std::endl;
841  if(ff_nfcn) edm::LogWarning("BSFitter") <<"===========>>>>>** WARNING: No. of Calls Exhausted"<<std::endl;
842  if(!ff_cov) edm::LogWarning("BSFitter") <<"===========>>>>>** WARNING: Covariance did not found"<<std::endl;
843  }
844 
845  edm::LogInfo("BSFitter") <<"The Total # Tracks used for beam width fit = "<<(fBSvectorBW.size())<<std::endl;
846 
847 
848  //Checks after fit is performed
849  double lastIter_pars[7];
850 
851  for(int ip=0;ip<7;ip++){ lastIter_pars[ip]=fmin.Parameters().Vec()(ip);
852  }
853 
854 
855 
856  tracksFailed=0;
857  /* double lastIter_scan= */ scanPDF(lastIter_pars,tracksFailed,2);
858 
859 
860  edm::LogWarning("BSFitter") <<"WARNING: # of tracks which have very low pdf value (pdf_d < 1.0e-05) are = "<<tracksFailed<<std::endl;
861 
862 
863 
864  //std::cout << " eval= " << ff_minimum
865  // << "/n params[0]= " << fmin.Parameters().Vec()(0) << std::endl;
866 
868 
869  for (int j = 0 ; j < 7 ; ++j) {
870  for(int k = j ; k < 7 ; ++k) {
871  matrix(j,k) = fmin.Error().Matrix()(j,k);
872  }
873  }
874 
875 
876  return reco::BeamSpot( reco::BeamSpot::Point(fmin.Parameters().Vec()(0),
877  fmin.Parameters().Vec()(1),
878  fmin.Parameters().Vec()(2)),
879  fmin.Parameters().Vec()(3),
880  fmin.Parameters().Vec()(4),
881  fmin.Parameters().Vec()(5),
882  fmin.Parameters().Vec()(6),
883 
884  matrix,
885  fbeamtype );
886 }
887 
888 
889 //______________________________________________________________________
891 
892 
893  thePDF->SetPDFs("PDFGauss_d_resolution*PDFGauss_z");
894  thePDF->SetData(fBSvector);
895 
896  MnUserParameters upar;
897  upar.Add("X0", inipar[0],0.001);
898  upar.Add("Y0", inipar[1],0.001);
899  upar.Add("Z0", inipar[2],0.001);
900  upar.Add("sigmaZ",inipar[3],0.001);
901  upar.Add("dxdz",inipar[4],0.001);
902  upar.Add("dydz",inipar[5],0.001);
903  upar.Add("BeamWidthX",inipar[6],0.0001);
904  upar.Add("c0",0.0010,0.0001);
905  upar.Add("c1",0.0090,0.0001);
906 
907  // fix beam width
908  upar.Fix("BeamWidthX");
909  // number of parameters in fit are 9-1 = 8
910 
911  MnMigrad migrad(*thePDF, upar);
912 
913  FunctionMinimum fmin = migrad();
914  ff_minimum = fmin.Fval();
915 
917 
918  for (int j = 0 ; j < 6 ; ++j) {
919  for(int k = j ; k < 6 ; ++k) {
920  matrix(j,k) = fmin.Error().Matrix()(j,k);
921  }
922  }
923 
924  //std::cout << " fill resolution values" << std::endl;
925  //std::cout << " matrix size= " << fmin.Error().Matrix().size() << std::endl;
926  //std::cout << " vec(6)="<< fmin.Parameters().Vec()(6) << std::endl;
927  //std::cout << " vec(7)="<< fmin.Parameters().Vec()(7) << std::endl;
928 
929  fresolution_c0 = fmin.Parameters().Vec()(6);
930  fresolution_c1 = fmin.Parameters().Vec()(7);
931  fres_c0_err = sqrt( fmin.Error().Matrix()(6,6) );
932  fres_c1_err = sqrt( fmin.Error().Matrix()(7,7) );
933 
934  for (int j = 6 ; j < 8 ; ++j) {
935  for(int k = 6 ; k < 8 ; ++k) {
936  fres_matrix(j-6,k-6) = fmin.Error().Matrix()(j,k);
937  }
938  }
939 
940  return reco::BeamSpot( reco::BeamSpot::Point(fmin.Parameters().Vec()(0),
941  fmin.Parameters().Vec()(1),
942  fmin.Parameters().Vec()(2)),
943  fmin.Parameters().Vec()(3),
944  fmin.Parameters().Vec()(4),
945  fmin.Parameters().Vec()(5),
946  inipar[6],
947  matrix,
948  fbeamtype );
949 }
950 
951 
952 
reco::BeamSpot Fit_d_likelihood(double *inipar)
Definition: BSFitter.cc:659
const double Pi
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:31
double z0() const
z coordinate
Definition: BeamSpot.h:68
virtual ~BSFitter()
Definition: BSFitter.cc:99
reco::BeamSpot Fit()
Definition: BSFitter.cc:108
reco::BeamSpot Fit_z_likelihood(double *inipar)
Definition: BSFitter.cc:280
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:29
double scanPDF(double *init_pars, int &tracksFailed, int option)
Definition: BSFitter.cc:697
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
reco::BeamSpot Fit_dres_z_likelihood(double *inipar)
Definition: BSFitter.cc:890
void setType(BeamType type)
set beam type
Definition: BeamSpot.h:131
double dydz() const
dydz slope
Definition: BeamSpot.h:84
bool isNotFinite(T x)
Definition: isFinite.h:10
Definition: Fit.h:34
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
BSFitter()
Definition: BSFitter.cc:43
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:86
double dxdz() const
dxdz slope
Definition: BeamSpot.h:82
int k[5][pyjets_maxn]
reco::BeamSpot Fit_ited0phi()
Definition: BSFitter.cc:401
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
double b
Definition: hdecay.h:120
reco::BeamSpot Fit_z_chi2(double *inipar)
Definition: BSFitter.cc:349
void Setd0Cut_d0phi(double d0cut)
Definition: BSFitter.cc:641
double covariance(int i, int j) const
(i,j)-th element of error matrix
Definition: BeamSpot.h:112
double y0() const
y coordinate
Definition: BeamSpot.h:66
void SetChi2Cut_d0phi(double chi2cut)
Definition: BSFitter.cc:650
reco::BeamSpot Fit_d0phi()
Definition: BSFitter.cc:457
reco::BeamSpot Fit_d_z_likelihood(double *inipar, double *error_par)
Definition: BSFitter.cc:787
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
double x0() const
x coordinate
Definition: BeamSpot.h:64