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"
38 using namespace ROOT::Minuit2;
49 ffit_type =
"default";
50 ffit_variable =
"default";
57 fpar_name[1] =
"SigmaZ0 ";
60 fpar_name[4] =
"dxdz ";
61 fpar_name[5] =
"dydz ";
62 fpar_name[6] =
"SigmaBeam ";
71 theFitter =
new VariableMetricMinimizer();
76 fapplychi2cut =
false;
86 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
109 if ( ffit_variable ==
"z" ) {
111 if ( ffit_type ==
"chi2" ) {
113 return Fit_z_chi2(inipar);
115 }
else if ( ffit_type ==
"likelihood" ) {
117 return Fit_z_likelihood(inipar);
119 }
else if ( ffit_type ==
"combined" ) {
122 double tmp_par[2] = {tmp_beamspot.
z0(), tmp_beamspot.
sigmaZ()};
123 return Fit_z_likelihood(tmp_par);
128 <<
"Error in BeamSpotProducer/BSFitter: "
129 <<
"Illegal fit type, options are chi2,likelihood or combined(ie. first chi2 then likelihood)";
132 }
else if ( ffit_variable ==
"d" ) {
134 if ( ffit_type ==
"d0phi" ) {
138 }
else if ( ffit_type ==
"likelihood" ) {
140 return Fit_d_likelihood(inipar);
142 }
else if ( ffit_type ==
"combined" ) {
146 double tmp_par[4] = {tmp_beamspot.
x0(), tmp_beamspot.
y0(), tmp_beamspot.
dxdz(), tmp_beamspot.
dydz()};
147 return Fit_d_likelihood(tmp_par);
151 <<
"Error in BeamSpotProducer/BSFitter: "
152 <<
"Illegal fit type, options are d0phi, likelihood or combined";
154 }
else if ( ffit_variable ==
"d*z" || ffit_variable ==
"default" ) {
156 if ( ffit_type ==
"likelihood" || ffit_type ==
"default" ) {
171 this->Setd0Cut_d0phi(4.0);
203 if (ffit_type ==
"likelihood") {
204 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_d0phi.
z0(),
207 double tmp_error_par[7];
209 tmp_error_par[6]=0.0;
211 reco::BeamSpot tmp_lh = Fit_d_z_likelihood(tmp_par,tmp_error_par);
214 edm::LogWarning(
"BSFitter") <<
"BSFitter: Result is non physical. Log-Likelihood fit to extract beam width did not converge." << std::endl;
222 edm::LogInfo(
"BSFitter") <<
"default track-based fit does not extract beam width." << std::endl;
227 }
else if ( ffit_type ==
"resolution" ) {
233 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_z.
z0(),
235 double tmp_error_par[7];
236 for(
int s=0;
s<6;
s++){ tmp_error_par[
s] =
pow(tmp_par[
s],0.5);}
237 tmp_error_par[6]=0.0;
239 reco::BeamSpot tmp_beam = Fit_d_z_likelihood(tmp_par,tmp_error_par);
241 double tmp_par2[7] = {tmp_beam.
x0(), tmp_beam.
y0(), tmp_beam.
z0(),
249 edm::LogWarning(
"BSFitter") <<
"Result is non physical. Log-Likelihood fit did not converge." << std::endl;
258 <<
"Error in BeamSpotProducer/BSFitter: "
259 <<
"Illegal fit type, options are likelihood or resolution";
264 <<
"Error in BeamSpotProducer/BSFitter: "
265 <<
"Illegal variable type, options are \"z\", \"d\", or \"d*z\"";
278 std::vector<double> par(2,0);
279 std::vector<double> err(2,0);
283 err.push_back(0.0001);
284 err.push_back(0.0001);
288 thePDF->SetPDFs(
"PDFGauss_z");
289 thePDF->SetData(fBSvector);
293 MnUserParameters upar;
294 upar.Add(
"X0", 0.,0.);
295 upar.Add(
"Y0", 0.,0.);
296 upar.Add(
"Z0", inipar[0],0.001);
297 upar.Add(
"sigmaZ",inipar[1],0.001);
299 MnMigrad migrad(*thePDF, upar);
301 FunctionMinimum fmin = migrad();
302 ff_minimum = fmin.Fval();
323 for (
int j = 2 ;
j < 4 ; ++
j) {
324 for(
int k =
j ;
k < 4 ; ++
k) {
331 fmin.Parameters().Vec()(2)),
332 fmin.Parameters().Vec()(3),
351 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
353 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
357 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam) {
359 h1z->Fill( iparam->z0() );
364 TF1 fgaus(
"fgaus",
"gaus");
365 h1z->Fit(&fgaus,
"QLM0");
369 double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
373 matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
374 matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
395 edm::LogInfo(
"BSFitter") <<
"number of total input tracks: " << fBSvector.size() << std::endl;
399 if ( (
int)fBSvector.size() <= fminNtrks ) {
400 edm::LogWarning(
"BSFitter") <<
"need at least " << fminNtrks <<
" tracks to run beamline fitter." << std::endl;
406 theanswer = Fit_d0phi();
407 if ( goodfit ) fnthite++;
413 ftmprow > fconvergence * fBSvector.size() &&
414 ftmprow > fminNtrks ) {
416 theanswer = Fit_d0phi();
420 ftmprow > fconvergence * fBSvector.size() &&
421 ftmprow > fminNtrks ) {
422 preanswer = theanswer;
429 theanswer = preanswer;
433 edm::LogInfo(
"BSFitter") <<
"Total number of successful iterations = " << ( goodfit ? (fnthite+1) : fnthite ) << std::endl;
451 if (fnthite > 0)
edm::LogInfo(
"BSFitter") <<
" number of tracks used: " << ftmprow << std::endl;
461 TMatrixD x_result(4,1);
462 TMatrixDSym V_result(4);
475 std::vector<BSTrkParameters>::iterator iparam = fBSvector.begin();
483 for( iparam = fBSvector.begin() ;
484 iparam != fBSvector.end() ; ++iparam) {
494 g(0,0) =
sin(iparam->phi0());
495 g(1,0) = -
cos(iparam->phi0());
496 g(2,0) = iparam->z0() *
g(0,0);
497 g(3,0) = iparam->z0() *
g(1,0);
501 double sigmabeam2 = 0.006 * 0.006;
502 if (finputBeamWidth > 0 ) sigmabeam2 = finputBeamWidth * finputBeamWidth;
503 else {
edm::LogWarning(
"BSFitter") <<
"using in fit beam width = " <<
sqrt(sigmabeam2) << std::endl; }
507 double sigma2 = sigmabeam2 + (iparam->sigd0())* (iparam->sigd0());
509 TMatrixD ftmptrans(1,4);
510 ftmptrans = ftmptrans.Transpose(ftmp);
511 TMatrixD dcor = ftmptrans *
g;
512 double chi2tmp = (iparam->d0() - dcor(0,0)) * (iparam->d0() - dcor(0,0))/sigma2;
513 (*iparam) =
BSTrkParameters(iparam->z0(),iparam->sigz0(),iparam->d0(),iparam->sigd0(),
514 iparam->phi0(), iparam->pt(),dcor(0,0),chi2tmp);
517 if (fapplyd0cut && fnthite>0 ) {
518 if (
std::abs(iparam->d0() - dcor(0,0)) > fd0cut ) pass =
false;
521 if (fapplychi2cut && fnthite>0 ) {
522 if ( chi2tmp > fchi2cut ) pass =
false;
528 for(
int j = 0 ;
j < 4 ; ++
j) {
529 for(
int k =
j ;
k < 4 ; ++
k) {
535 Vint += (temp * (1 / sigma2));
536 b += (iparam->d0() / sigma2 *
g);
539 h1z->Fill( iparam->z0() );
544 Double_t determinant;
547 if (!bk.Decompose()) {
550 <<
"Decomposition failed, matrix singular ?" << std::endl
551 <<
"condition number = " << bk.Condition() << std::endl;
554 V_result = Vint.InvertFast(&determinant);
555 x_result = V_result *
b;
569 TF1 fgaus(
"fgaus",
"gaus");
571 auto status = h1z->Fit(&fgaus,
"QLM0",
"",h1z->GetMean() -2.*h1z->GetRMS(),h1z->GetMean() +2.*h1z->GetRMS());
577 edm::LogError(
"NoBeamSpotFit")<<
"gaussian fit failed. no BS d0 fit";
580 double fpar[2] = {fgaus.GetParameter(1), fgaus.GetParameter(2) };
584 for (
int j = 0 ;
j < 2 ; ++
j) {
585 for(
int k =
j ;
k < 2 ; ++
k) {
590 for (
int j = 4 ;
j < 6 ; ++
j) {
591 for(
int k =
j ;
k < 6 ; ++
k) {
597 matrix(2,2) = fgaus.GetParError(1) * fgaus.GetParError(1);
598 matrix(3,3) = fgaus.GetParError(2) * fgaus.GetParError(2);
606 double x0tmp = x_result(0,0);
607 double y0tmp = x_result(1,0);
609 x0tmp += x_result(2,0)*fpar[0];
610 y0tmp += x_result(3,0)*fpar[0];
638 fapplychi2cut =
true;
648 thePDF->SetPDFs(
"PDFGauss_d");
649 thePDF->SetData(fBSvector);
651 MnUserParameters upar;
652 upar.Add(
"X0", inipar[0],0.001);
653 upar.Add(
"Y0", inipar[1],0.001);
654 upar.Add(
"Z0", 0.,0.001);
655 upar.Add(
"sigmaZ",0.,0.001);
656 upar.Add(
"dxdz",inipar[2],0.001);
657 upar.Add(
"dydz",inipar[3],0.001);
660 MnMigrad migrad(*thePDF, upar);
662 FunctionMinimum fmin = migrad();
663 ff_minimum = fmin.Fval();
666 for (
int j = 0 ;
j < 6 ; ++
j) {
667 for(
int k =
j ;
k < 6 ; ++
k) {
673 fmin.Parameters().Vec()(1),
676 fmin.Parameters().Vec()(4),
677 fmin.Parameters().Vec()(5),
685 if(option==1)init_pars[6]=0.0005;
696 double last_minvalue=1.0e+10;
697 double init_bw=-99.99;
701 double DeltadCut=0.1000;
702 if(init_pars[6]<0.0200){DeltadCut=0.0900; }
703 if(init_pars[6]<0.0100){DeltadCut=0.0700;}
706 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
709 if(option==1)iters=500;
710 if(option==2)iters=1;
712 for(
int p=0;
p<iters;
p++){
714 if(iters==500)init_pars[6]+=0.0002;
717 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam)
720 d_sig =
sqrt(init_pars[6]*init_pars[6] + (iparam->sigd0())*(iparam->sigd0()));
721 d_dprime = iparam->d0() - ( ( (init_pars[0] + iparam->z0()*(init_pars[4]))*
sin(iparam->phi0()) )
722 - ( (init_pars[1] + iparam->z0()*(init_pars[5]))*
cos(iparam->phi0()) ) );
725 if(
std::abs(d_dprime)<DeltadCut && option==2){ fBSvectorBW.push_back(*iparam);}
727 d_result = (
exp(-(d_dprime*d_dprime)/(2.0*d_sig*d_sig)))/(d_sig*fsqrt2pi);
728 z_sig =
sqrt(iparam->sigz0() * iparam->sigz0() + init_pars[3]*init_pars[3]);
729 z_result = (
exp(-((iparam->z0() - init_pars[2])*(iparam->z0() - init_pars[2]))/(2.0*z_sig*z_sig)))/(z_sig*fsqrt2pi);
730 tot_pdf=z_result*d_result;
736 if(d_result < 1.0
e-05){ tot_pdf=z_result*1.0e-05;
740 function =
function +
log(tot_pdf);
747 function= -2.0*
function;
748 if(
function<last_minvalue){init_bw=init_pars[6];
749 last_minvalue=
function; }
754 init_bw=init_bw+(0.20*init_bw);
761 <<
"scanPDF:====>>>> WARNING***: The initial guess value of Beam width is negative!!!!!!"<<std::endl
762 <<
"scanPDF:====>>>> Assigning beam width a starting value of "<<init_bw<<
" cm"<<std::endl;
779 inipar[6]=scanPDF(inipar,tracksFailed,1);
780 error_par[6]=(inipar[6])*0.20;
785 scanPDF(inipar,tracksFailed,2);
790 std::vector<BSTrkParameters>::const_iterator iparamBW = fBSvectorBW.begin();
791 for( iparamBW = fBSvectorBW.begin(); iparamBW != fBSvectorBW.end(); ++iparamBW)
792 { fBSvector.push_back(*iparamBW);
796 thePDF->SetPDFs(
"PDFGauss_d*PDFGauss_z");
797 thePDF->SetData(fBSvector);
798 MnUserParameters upar;
800 upar.Add(
"X0", inipar[0],error_par[0]);
801 upar.Add(
"Y0", inipar[1],error_par[1]);
802 upar.Add(
"Z0", inipar[2],error_par[2]);
803 upar.Add(
"sigmaZ",inipar[3],error_par[3]);
804 upar.Add(
"dxdz",inipar[4],error_par[4]);
805 upar.Add(
"dydz",inipar[5],error_par[5]);
806 upar.Add(
"BeamWidthX",inipar[6],error_par[6]);
809 MnMigrad migrad(*thePDF, upar);
811 FunctionMinimum fmin = migrad();
816 ff_minimum = fmin.Fval();
819 bool ff_nfcn=fmin.HasReachedCallLimit();
820 bool ff_cov=fmin.HasCovariance();
821 bool testing=fmin.IsValid();
827 edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: MINUIT DID NOT CONVERGES PROPERLY !!!!!!"<<std::endl;
828 if(ff_nfcn)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: No. of Calls Exhausted"<<std::endl;
829 if(!ff_cov)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: Covariance did not found"<<std::endl;
832 edm::LogInfo(
"BSFitter") <<
"The Total # Tracks used for beam width fit = "<<(fBSvectorBW.size())<<std::endl;
836 double lastIter_pars[7];
838 for(
int ip=0;ip<7;ip++){ lastIter_pars[ip]=fmin.Parameters().Vec()(ip);
844 scanPDF(lastIter_pars,tracksFailed,2);
847 edm::LogWarning(
"BSFitter") <<
"WARNING: # of tracks which have very low pdf value (pdf_d < 1.0e-05) are = "<<tracksFailed<<std::endl;
856 for (
int j = 0 ;
j < 7 ; ++
j) {
857 for(
int k =
j ;
k < 7 ; ++
k) {
864 fmin.Parameters().Vec()(1),
865 fmin.Parameters().Vec()(2)),
866 fmin.Parameters().Vec()(3),
867 fmin.Parameters().Vec()(4),
868 fmin.Parameters().Vec()(5),
869 fmin.Parameters().Vec()(6),
880 thePDF->SetPDFs(
"PDFGauss_d_resolution*PDFGauss_z");
881 thePDF->SetData(fBSvector);
883 MnUserParameters upar;
884 upar.Add(
"X0", inipar[0],0.001);
885 upar.Add(
"Y0", inipar[1],0.001);
886 upar.Add(
"Z0", inipar[2],0.001);
887 upar.Add(
"sigmaZ",inipar[3],0.001);
888 upar.Add(
"dxdz",inipar[4],0.001);
889 upar.Add(
"dydz",inipar[5],0.001);
890 upar.Add(
"BeamWidthX",inipar[6],0.0001);
891 upar.Add(
"c0",0.0010,0.0001);
892 upar.Add(
"c1",0.0090,0.0001);
895 upar.Fix(
"BeamWidthX");
898 MnMigrad migrad(*thePDF, upar);
900 FunctionMinimum fmin = migrad();
901 ff_minimum = fmin.Fval();
905 for (
int j = 0 ;
j < 6 ; ++
j) {
906 for(
int k =
j ;
k < 6 ; ++
k) {
916 fresolution_c0 = fmin.Parameters().Vec()(6);
917 fresolution_c1 = fmin.Parameters().Vec()(7);
918 fres_c0_err =
sqrt( fmin.Error().Matrix()(6,6) );
919 fres_c1_err =
sqrt( fmin.Error().Matrix()(7,7) );
921 for (
int j = 6 ;
j < 8 ; ++
j) {
922 for(
int k = 6 ;
k < 8 ; ++
k) {
923 fres_matrix(
j-6,
k-6) = fmin.Error().Matrix()(
j,
k);
928 fmin.Parameters().Vec()(1),
929 fmin.Parameters().Vec()(2)),
930 fmin.Parameters().Vec()(3),
931 fmin.Parameters().Vec()(4),
932 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