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" 33 #include "TMatrixDSym.h" 34 #include "TDecompBK.h" 37 #include "TMinuitMinimizer.h" 48 TMinuitMinimizer::UseStaticMinuit(
false);
55 TMinuitMinimizer::UseStaticMinuit(
false);
57 ffit_type =
"default";
58 ffit_variable =
"default";
65 fpar_name[1] =
"SigmaZ0 ";
68 fpar_name[4] =
"dxdz ";
69 fpar_name[5] =
"dydz ";
70 fpar_name[6] =
"SigmaBeam ";
79 theFitter =
new VariableMetricMinimizer();
84 fapplychi2cut =
false;
94 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
117 if ( ffit_variable ==
"z" ) {
119 if ( ffit_type ==
"chi2" ) {
121 return Fit_z_chi2(inipar);
123 }
else if ( ffit_type ==
"likelihood" ) {
125 return Fit_z_likelihood(inipar);
127 }
else if ( ffit_type ==
"combined" ) {
130 double tmp_par[2] = {tmp_beamspot.
z0(), tmp_beamspot.
sigmaZ()};
131 return Fit_z_likelihood(tmp_par);
136 <<
"Error in BeamSpotProducer/BSFitter: " 137 <<
"Illegal fit type, options are chi2,likelihood or combined(ie. first chi2 then likelihood)";
140 }
else if ( ffit_variable ==
"d" ) {
142 if ( ffit_type ==
"d0phi" ) {
146 }
else if ( ffit_type ==
"likelihood" ) {
148 return Fit_d_likelihood(inipar);
150 }
else if ( ffit_type ==
"combined" ) {
154 double tmp_par[4] = {tmp_beamspot.
x0(), tmp_beamspot.
y0(), tmp_beamspot.
dxdz(), tmp_beamspot.
dydz()};
155 return Fit_d_likelihood(tmp_par);
159 <<
"Error in BeamSpotProducer/BSFitter: " 160 <<
"Illegal fit type, options are d0phi, likelihood or combined";
162 }
else if ( ffit_variable ==
"d*z" || ffit_variable ==
"default" ) {
164 if ( ffit_type ==
"likelihood" || ffit_type ==
"default" ) {
179 this->Setd0Cut_d0phi(4.0);
211 if (ffit_type ==
"likelihood") {
212 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_d0phi.
z0(),
215 double tmp_error_par[7];
217 tmp_error_par[6]=0.0;
219 reco::BeamSpot tmp_lh = Fit_d_z_likelihood(tmp_par,tmp_error_par);
222 edm::LogWarning(
"BSFitter") <<
"BSFitter: Result is non physical. Log-Likelihood fit to extract beam width did not converge." << std::endl;
230 edm::LogInfo(
"BSFitter") <<
"default track-based fit does not extract beam width." << std::endl;
235 }
else if ( ffit_type ==
"resolution" ) {
241 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_z.
z0(),
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;
247 reco::BeamSpot tmp_beam = Fit_d_z_likelihood(tmp_par,tmp_error_par);
249 double tmp_par2[7] = {tmp_beam.
x0(), tmp_beam.
y0(), tmp_beam.
z0(),
257 edm::LogWarning(
"BSFitter") <<
"Result is non physical. Log-Likelihood fit did not converge." << std::endl;
266 <<
"Error in BeamSpotProducer/BSFitter: " 267 <<
"Illegal fit type, options are likelihood or resolution";
272 <<
"Error in BeamSpotProducer/BSFitter: " 273 <<
"Illegal variable type, options are \"z\", \"d\", or \"d*z\"";
286 std::vector<double> par(2,0);
287 std::vector<double> err(2,0);
291 err.push_back(0.0001);
292 err.push_back(0.0001);
296 thePDF->SetPDFs(
"PDFGauss_z");
297 thePDF->SetData(fBSvector);
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);
307 MnMigrad migrad(*thePDF, upar);
309 FunctionMinimum fmin = migrad();
310 ff_minimum = fmin.Fval();
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);
339 fmin.Parameters().Vec()(2)),
340 fmin.Parameters().Vec()(3),
359 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
361 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
365 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam) {
367 h1z->Fill( iparam->z0() );
372 TF1 fgaus(
"fgaus",
"gaus");
373 h1z->Fit(&fgaus,
"QLMN0");
377 double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
381 matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
382 matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
403 edm::LogInfo(
"BSFitter") <<
"number of total input tracks: " << fBSvector.size() << std::endl;
407 if ( (
int)fBSvector.size() <= fminNtrks ) {
408 edm::LogWarning(
"BSFitter") <<
"need at least " << fminNtrks <<
" tracks to run beamline fitter." << std::endl;
414 theanswer = Fit_d0phi();
415 if ( goodfit ) fnthite++;
421 ftmprow > fconvergence * fBSvector.size() &&
422 ftmprow > fminNtrks ) {
424 theanswer = Fit_d0phi();
428 ftmprow > fconvergence * fBSvector.size() &&
429 ftmprow > fminNtrks ) {
430 preanswer = theanswer;
437 theanswer = preanswer;
441 edm::LogInfo(
"BSFitter") <<
"Total number of successful iterations = " << ( goodfit ? (fnthite+1) : fnthite ) << std::endl;
459 if (fnthite > 0)
edm::LogInfo(
"BSFitter") <<
" number of tracks used: " << ftmprow << std::endl;
469 TMatrixD x_result(4,1);
470 TMatrixDSym V_result(4);
483 std::vector<BSTrkParameters>::iterator iparam = fBSvector.begin();
491 for( iparam = fBSvector.begin() ;
492 iparam != fBSvector.end() ; ++iparam) {
502 g(0,0) =
sin(iparam->phi0());
503 g(1,0) = -
cos(iparam->phi0());
504 g(2,0) = iparam->z0() *
g(0,0);
505 g(3,0) = iparam->z0() *
g(1,0);
509 double sigmabeam2 = 0.006 * 0.006;
510 if (finputBeamWidth > 0 ) sigmabeam2 = finputBeamWidth * finputBeamWidth;
517 double sigma2 = sigmabeam2 + (iparam->sigd0())* (iparam->sigd0());
519 TMatrixD ftmptrans(1,4);
520 ftmptrans = ftmptrans.Transpose(ftmp);
521 TMatrixD dcor = ftmptrans *
g;
522 double chi2tmp = (iparam->d0() - dcor(0,0)) * (iparam->d0() - dcor(0,0))/sigma2;
523 (*iparam) =
BSTrkParameters(iparam->z0(),iparam->sigz0(),iparam->d0(),iparam->sigd0(),
524 iparam->phi0(), iparam->pt(),dcor(0,0),chi2tmp);
527 if (fapplyd0cut && fnthite>0 ) {
528 if (
std::abs(iparam->d0() - dcor(0,0)) > fd0cut ) pass =
false;
531 if (fapplychi2cut && fnthite>0 ) {
532 if ( chi2tmp > fchi2cut ) pass =
false;
538 for(
int j = 0 ; j < 4 ; ++j) {
539 for(
int k = j ;
k < 4 ; ++
k) {
545 Vint += (temp * (1 / sigma2));
546 b += (iparam->d0() / sigma2 *
g);
549 h1z->Fill( iparam->z0() );
554 Double_t determinant;
557 if (!bk.Decompose()) {
560 <<
"Decomposition failed, matrix singular ?" << std::endl
561 <<
"condition number = " << bk.Condition() << std::endl;
564 V_result = Vint.InvertFast(&determinant);
565 x_result = V_result *
b;
579 TF1 fgaus(
"fgaus",
"gaus");
582 auto status = h1z->Fit(&fgaus,
"QLN0",
"",h1z->GetMean() -2.*h1z->GetRMS(),h1z->GetMean() +2.*h1z->GetRMS());
592 double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
596 for (
int j = 0 ; j < 2 ; ++j) {
597 for(
int k = j ;
k < 2 ; ++
k) {
602 for (
int j = 4 ; j < 6 ; ++j) {
603 for(
int k = j ;
k < 6 ; ++
k) {
609 matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
610 matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
618 double x0tmp = x_result(0,0);
619 double y0tmp = x_result(1,0);
621 x0tmp += x_result(2,0)*fpar[0];
622 y0tmp += x_result(3,0)*fpar[0];
650 fapplychi2cut =
true;
660 thePDF->SetPDFs(
"PDFGauss_d");
661 thePDF->SetData(fBSvector);
663 MnUserParameters upar;
664 upar.Add(
"X0", inipar[0],0.001);
665 upar.Add(
"Y0", inipar[1],0.001);
666 upar.Add(
"Z0", 0.,0.001);
667 upar.Add(
"sigmaZ",0.,0.001);
668 upar.Add(
"dxdz",inipar[2],0.001);
669 upar.Add(
"dydz",inipar[3],0.001);
672 MnMigrad migrad(*thePDF, upar);
674 FunctionMinimum fmin = migrad();
675 ff_minimum = fmin.Fval();
678 for (
int j = 0 ; j < 6 ; ++j) {
679 for(
int k = j ;
k < 6 ; ++
k) {
680 matrix(j,
k) = fmin.Error().Matrix()(j,
k);
685 fmin.Parameters().Vec()(1),
688 fmin.Parameters().Vec()(4),
689 fmin.Parameters().Vec()(5),
697 if(option==1)init_pars[6]=0.0005;
708 double last_minvalue=1.0e+10;
709 double init_bw=-99.99;
713 double DeltadCut=0.1000;
714 if(init_pars[6]<0.0200){DeltadCut=0.0900; }
715 if(init_pars[6]<0.0100){DeltadCut=0.0700;}
718 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
721 if(option==1)iters=500;
722 if(option==2)iters=1;
724 for(
int p=0;
p<iters;
p++){
726 if(iters==500)init_pars[6]+=0.0002;
729 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam)
732 d_sig =
sqrt(init_pars[6]*init_pars[6] + (iparam->sigd0())*(iparam->sigd0()));
733 d_dprime = iparam->d0() - ( ( (init_pars[0] + iparam->z0()*(init_pars[4]))*
sin(iparam->phi0()) )
734 - ( (init_pars[1] + iparam->z0()*(init_pars[5]))*
cos(iparam->phi0()) ) );
737 if(
std::abs(d_dprime)<DeltadCut && option==2){ fBSvectorBW.push_back(*iparam);}
739 d_result = (
exp(-(d_dprime*d_dprime)/(2.0*d_sig*d_sig)))/(d_sig*fsqrt2pi);
740 z_sig =
sqrt(iparam->sigz0() * iparam->sigz0() + init_pars[3]*init_pars[3]);
741 z_result = (
exp(-((iparam->z0() - init_pars[2])*(iparam->z0() - init_pars[2]))/(2.0*z_sig*z_sig)))/(z_sig*fsqrt2pi);
742 tot_pdf=z_result*d_result;
748 if(d_result < 1.0
e-05){ tot_pdf=z_result*1.0e-05;
752 function =
function +
log(tot_pdf);
758 function= -2.0*
function;
759 if(
function<last_minvalue){init_bw=init_pars[6];
760 last_minvalue=
function; }
765 init_bw=init_bw+(0.20*init_bw);
772 <<
"scanPDF:====>>>> WARNING***: The initial guess value of Beam width is negative!!!!!!"<<std::endl
773 <<
"scanPDF:====>>>> Assigning beam width a starting value of "<<init_bw<<
" cm"<<std::endl;
790 inipar[6]=scanPDF(inipar,tracksFailed,1);
791 error_par[6]=(inipar[6])*0.20;
796 scanPDF(inipar,tracksFailed,2);
801 std::vector<BSTrkParameters>::const_iterator iparamBW = fBSvectorBW.begin();
802 for( iparamBW = fBSvectorBW.begin(); iparamBW != fBSvectorBW.end(); ++iparamBW)
803 { fBSvector.push_back(*iparamBW);
807 thePDF->SetPDFs(
"PDFGauss_d*PDFGauss_z");
808 thePDF->SetData(fBSvector);
809 MnUserParameters upar;
811 upar.Add(
"X0", inipar[0],error_par[0]);
812 upar.Add(
"Y0", inipar[1],error_par[1]);
813 upar.Add(
"Z0", inipar[2],error_par[2]);
814 upar.Add(
"sigmaZ",inipar[3],error_par[3]);
815 upar.Add(
"dxdz",inipar[4],error_par[4]);
816 upar.Add(
"dydz",inipar[5],error_par[5]);
817 upar.Add(
"BeamWidthX",inipar[6],error_par[6]);
820 MnMigrad migrad(*thePDF, upar);
822 FunctionMinimum fmin = migrad();
827 ff_minimum = fmin.Fval();
830 bool ff_nfcn=fmin.HasReachedCallLimit();
831 bool ff_cov=fmin.HasCovariance();
832 bool testing=fmin.IsValid();
838 edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: MINUIT DID NOT CONVERGES PROPERLY !!!!!!"<<std::endl;
839 if(ff_nfcn)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: No. of Calls Exhausted"<<std::endl;
840 if(!ff_cov)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: Covariance did not found"<<std::endl;
843 edm::LogInfo(
"BSFitter") <<
"The Total # Tracks used for beam width fit = "<<(fBSvectorBW.size())<<std::endl;
847 double lastIter_pars[7];
849 for(
int ip=0;ip<7;ip++){ lastIter_pars[ip]=fmin.Parameters().Vec()(ip);
855 scanPDF(lastIter_pars,tracksFailed,2);
858 edm::LogWarning(
"BSFitter") <<
"WARNING: # of tracks which have very low pdf value (pdf_d < 1.0e-05) are = "<<tracksFailed<<std::endl;
867 for (
int j = 0 ; j < 7 ; ++j) {
868 for(
int k = j ;
k < 7 ; ++
k) {
869 matrix(j,
k) = fmin.Error().Matrix()(j,
k);
875 fmin.Parameters().Vec()(1),
876 fmin.Parameters().Vec()(2)),
877 fmin.Parameters().Vec()(3),
878 fmin.Parameters().Vec()(4),
879 fmin.Parameters().Vec()(5),
880 fmin.Parameters().Vec()(6),
891 thePDF->SetPDFs(
"PDFGauss_d_resolution*PDFGauss_z");
892 thePDF->SetData(fBSvector);
894 MnUserParameters upar;
895 upar.Add(
"X0", inipar[0],0.001);
896 upar.Add(
"Y0", inipar[1],0.001);
897 upar.Add(
"Z0", inipar[2],0.001);
898 upar.Add(
"sigmaZ",inipar[3],0.001);
899 upar.Add(
"dxdz",inipar[4],0.001);
900 upar.Add(
"dydz",inipar[5],0.001);
901 upar.Add(
"BeamWidthX",inipar[6],0.0001);
902 upar.Add(
"c0",0.0010,0.0001);
903 upar.Add(
"c1",0.0090,0.0001);
906 upar.Fix(
"BeamWidthX");
909 MnMigrad migrad(*thePDF, upar);
911 FunctionMinimum fmin = migrad();
912 ff_minimum = fmin.Fval();
916 for (
int j = 0 ; j < 6 ; ++j) {
917 for(
int k = j ;
k < 6 ; ++
k) {
918 matrix(j,
k) = fmin.Error().Matrix()(j,
k);
927 fresolution_c0 = fmin.Parameters().Vec()(6);
928 fresolution_c1 = fmin.Parameters().Vec()(7);
929 fres_c0_err =
sqrt( fmin.Error().Matrix()(6,6) );
930 fres_c1_err =
sqrt( fmin.Error().Matrix()(7,7) );
932 for (
int j = 6 ; j < 8 ; ++j) {
933 for(
int k = 6 ;
k < 8 ; ++
k) {
934 fres_matrix(j-6,
k-6) = fmin.Error().Matrix()(j,
k);
939 fmin.Parameters().Vec()(1),
940 fmin.Parameters().Vec()(2)),
941 fmin.Parameters().Vec()(3),
942 fmin.Parameters().Vec()(4),
943 fmin.Parameters().Vec()(5),
reco::BeamSpot Fit_d_likelihood(double *inipar)
math::Error< dimension >::type CovarianceMatrix
double z0() const
z coordinate
reco::BeamSpot Fit_z_likelihood(double *inipar)
Sin< T >::type sin(const T &t)
math::XYZPoint Point
point in the space
double scanPDF(double *init_pars, int &tracksFailed, int option)
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
reco::BeamSpot Fit_dres_z_likelihood(double *inipar)
void setType(BeamType type)
set beam type
double dydz() const
dydz slope
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
double BeamWidthX() const
beam width X
double dxdz() const
dxdz slope
reco::BeamSpot Fit_ited0phi()
double sigmaZ() const
sigma z
reco::BeamSpot Fit_z_chi2(double *inipar)
void Setd0Cut_d0phi(double d0cut)
double covariance(int i, int j) const
(i,j)-th element of error matrix
double y0() const
y coordinate
void SetChi2Cut_d0phi(double chi2cut)
reco::BeamSpot Fit_d0phi()
reco::BeamSpot Fit_d_z_likelihood(double *inipar, double *error_par)
Power< A, B >::type pow(const A &a, const B &b)
double x0() const
x coordinate