15 #include "Minuit2/VariableMetricMinimizer.h"
16 #include "Minuit2/FunctionMinimum.h"
17 #include "Minuit2/MnPrint.h"
18 #include "Minuit2/MnMigrad.h"
19 #include "Minuit2/MnUserParameterState.h"
34 #include "TMatrixDSym.h"
35 #include "TDecompBK.h"
39 using namespace ROOT::Minuit2;
50 ffit_type =
"default";
51 ffit_variable =
"default";
58 fpar_name[1] =
"SigmaZ0 ";
61 fpar_name[4] =
"dxdz ";
62 fpar_name[5] =
"dydz ";
63 fpar_name[6] =
"SigmaBeam ";
72 theFitter =
new VariableMetricMinimizer();
77 fapplychi2cut =
false;
87 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
110 if ( ffit_variable ==
"z" ) {
112 if ( ffit_type ==
"chi2" ) {
114 return Fit_z_chi2(inipar);
116 }
else if ( ffit_type ==
"likelihood" ) {
118 return Fit_z_likelihood(inipar);
120 }
else if ( ffit_type ==
"combined" ) {
123 double tmp_par[2] = {tmp_beamspot.
z0(), tmp_beamspot.
sigmaZ()};
124 return Fit_z_likelihood(tmp_par);
129 <<
"Error in BeamSpotProducer/BSFitter: "
130 <<
"Illegal fit type, options are chi2,likelihood or combined(ie. first chi2 then likelihood)";
133 }
else if ( ffit_variable ==
"d" ) {
135 if ( ffit_type ==
"d0phi" ) {
139 }
else if ( ffit_type ==
"likelihood" ) {
141 return Fit_d_likelihood(inipar);
143 }
else if ( ffit_type ==
"combined" ) {
147 double tmp_par[4] = {tmp_beamspot.
x0(), tmp_beamspot.
y0(), tmp_beamspot.
dxdz(), tmp_beamspot.
dydz()};
148 return Fit_d_likelihood(tmp_par);
152 <<
"Error in BeamSpotProducer/BSFitter: "
153 <<
"Illegal fit type, options are d0phi, likelihood or combined";
155 }
else if ( ffit_variable ==
"d*z" || ffit_variable ==
"default" ) {
157 if ( ffit_type ==
"likelihood" || ffit_type ==
"default" ) {
172 this->Setd0Cut_d0phi(4.0);
204 if (ffit_type ==
"likelihood") {
205 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_d0phi.
z0(),
208 double tmp_error_par[7];
210 tmp_error_par[6]=0.0;
212 reco::BeamSpot tmp_lh = Fit_d_z_likelihood(tmp_par,tmp_error_par);
215 edm::LogWarning(
"BSFitter") <<
"BSFitter: Result is non physical. Log-Likelihood fit to extract beam width did not converge." << std::endl;
223 edm::LogInfo(
"BSFitter") <<
"default track-based fit does not extract beam width." << std::endl;
228 }
else if ( ffit_type ==
"resolution" ) {
234 double tmp_par[7] = {tmp_d0phi.
x0(), tmp_d0phi.
y0(), tmp_z.
z0(),
236 double tmp_error_par[7];
237 for(
int s=0;
s<6;
s++){ tmp_error_par[
s] =
pow(tmp_par[
s],0.5);}
238 tmp_error_par[6]=0.0;
240 reco::BeamSpot tmp_beam = Fit_d_z_likelihood(tmp_par,tmp_error_par);
242 double tmp_par2[7] = {tmp_beam.
x0(), tmp_beam.
y0(), tmp_beam.
z0(),
250 edm::LogWarning(
"BSFitter") <<
"Result is non physical. Log-Likelihood fit did not converge." << std::endl;
259 <<
"Error in BeamSpotProducer/BSFitter: "
260 <<
"Illegal fit type, options are likelihood or resolution";
265 <<
"Error in BeamSpotProducer/BSFitter: "
266 <<
"Illegal variable type, options are \"z\", \"d\", or \"d*z\"";
279 std::vector<double> par(2,0);
280 std::vector<double> err(2,0);
284 err.push_back(0.0001);
285 err.push_back(0.0001);
289 thePDF->SetPDFs(
"PDFGauss_z");
290 thePDF->SetData(fBSvector);
294 MnUserParameters upar;
295 upar.Add(
"X0", 0.,0.);
296 upar.Add(
"Y0", 0.,0.);
297 upar.Add(
"Z0", inipar[0],0.001);
298 upar.Add(
"sigmaZ",inipar[1],0.001);
300 MnMigrad migrad(*thePDF, upar);
302 FunctionMinimum fmin = migrad();
303 ff_minimum = fmin.Fval();
324 for (
int j = 2 ;
j < 4 ; ++
j) {
325 for(
int k =
j ;
k < 4 ; ++
k) {
332 fmin.Parameters().Vec()(2)),
333 fmin.Parameters().Vec()(3),
352 h1z =
new TH1F(
"h1z",
"z distribution",200,-fMaxZ, fMaxZ);
354 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
358 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam) {
360 h1z->Fill( iparam->z0() );
364 h1z->Fit(
"gaus",
"QLM0");
367 TF1 *fgaus = h1z->GetFunction(
"gaus");
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;
568 h1z->Fit(
"gaus",
"QLM0",
"",h1z->GetMean() -2.*h1z->GetRMS(),h1z->GetMean() +2.*h1z->GetRMS());
571 TF1 *fgaus = h1z->GetFunction(
"gaus");
574 edm::LogError(
"NoBeamSpotFit")<<
"gaussian fit failed. no BS d0 fit";
577 double fpar[2] = {fgaus->GetParameter(1), fgaus->GetParameter(2) };
581 for (
int j = 0 ;
j < 2 ; ++
j) {
582 for(
int k =
j ;
k < 2 ; ++
k) {
587 for (
int j = 4 ;
j < 6 ; ++
j) {
588 for(
int k =
j ;
k < 6 ; ++
k) {
594 matrix(2,2) = fgaus->GetParError(1) * fgaus->GetParError(1);
595 matrix(3,3) = fgaus->GetParError(2) * fgaus->GetParError(2);
603 double x0tmp = x_result(0,0);
604 double y0tmp = x_result(1,0);
606 x0tmp += x_result(2,0)*fpar[0];
607 y0tmp += x_result(3,0)*fpar[0];
635 fapplychi2cut =
true;
645 thePDF->SetPDFs(
"PDFGauss_d");
646 thePDF->SetData(fBSvector);
648 MnUserParameters upar;
649 upar.Add(
"X0", inipar[0],0.001);
650 upar.Add(
"Y0", inipar[1],0.001);
651 upar.Add(
"Z0", 0.,0.001);
652 upar.Add(
"sigmaZ",0.,0.001);
653 upar.Add(
"dxdz",inipar[2],0.001);
654 upar.Add(
"dydz",inipar[3],0.001);
657 MnMigrad migrad(*thePDF, upar);
659 FunctionMinimum fmin = migrad();
660 ff_minimum = fmin.Fval();
663 for (
int j = 0 ;
j < 6 ; ++
j) {
664 for(
int k =
j ;
k < 6 ; ++
k) {
670 fmin.Parameters().Vec()(1),
673 fmin.Parameters().Vec()(4),
674 fmin.Parameters().Vec()(5),
682 if(option==1)init_pars[6]=0.0005;
693 double last_minvalue=1.0e+10;
694 double init_bw=-99.99;
698 double DeltadCut=0.1000;
699 if(init_pars[6]<0.0200){DeltadCut=0.0900; }
700 if(init_pars[6]<0.0100){DeltadCut=0.0700;}
703 std::vector<BSTrkParameters>::const_iterator iparam = fBSvector.begin();
706 if(option==1)iters=500;
707 if(option==2)iters=1;
709 for(
int p=0;
p<iters;
p++){
711 if(iters==500)init_pars[6]+=0.0002;
714 for( iparam = fBSvector.begin(); iparam != fBSvector.end(); ++iparam)
717 d_sig =
sqrt(init_pars[6]*init_pars[6] + (iparam->sigd0())*(iparam->sigd0()));
718 d_dprime = iparam->d0() - ( ( (init_pars[0] + iparam->z0()*(init_pars[4]))*
sin(iparam->phi0()) )
719 - ( (init_pars[1] + iparam->z0()*(init_pars[5]))*
cos(iparam->phi0()) ) );
722 if(
std::abs(d_dprime)<DeltadCut && option==2){ fBSvectorBW.push_back(*iparam);}
724 d_result = (
exp(-(d_dprime*d_dprime)/(2.0*d_sig*d_sig)))/(d_sig*fsqrt2pi);
725 z_sig =
sqrt(iparam->sigz0() * iparam->sigz0() + init_pars[3]*init_pars[3]);
726 z_result = (
exp(-((iparam->z0() - init_pars[2])*(iparam->z0() - init_pars[2]))/(2.0*z_sig*z_sig)))/(z_sig*fsqrt2pi);
727 tot_pdf=z_result*d_result;
733 if(d_result < 1.0
e-05){ tot_pdf=z_result*1.0e-05;
737 function =
function +
log(tot_pdf);
744 function= -2.0*
function;
745 if(
function<last_minvalue){init_bw=init_pars[6];
746 last_minvalue=
function; }
751 init_bw=init_bw+(0.20*init_bw);
758 <<
"scanPDF:====>>>> WARNING***: The initial guess value of Beam width is negative!!!!!!"<<std::endl
759 <<
"scanPDF:====>>>> Assigning beam width a starting value of "<<init_bw<<
" cm"<<std::endl;
776 inipar[6]=scanPDF(inipar,tracksFailed,1);
777 error_par[6]=(inipar[6])*0.20;
782 scanPDF(inipar,tracksFailed,2);
787 std::vector<BSTrkParameters>::const_iterator iparamBW = fBSvectorBW.begin();
788 for( iparamBW = fBSvectorBW.begin(); iparamBW != fBSvectorBW.end(); ++iparamBW)
789 { fBSvector.push_back(*iparamBW);
793 thePDF->SetPDFs(
"PDFGauss_d*PDFGauss_z");
794 thePDF->SetData(fBSvector);
795 MnUserParameters upar;
797 upar.Add(
"X0", inipar[0],error_par[0]);
798 upar.Add(
"Y0", inipar[1],error_par[1]);
799 upar.Add(
"Z0", inipar[2],error_par[2]);
800 upar.Add(
"sigmaZ",inipar[3],error_par[3]);
801 upar.Add(
"dxdz",inipar[4],error_par[4]);
802 upar.Add(
"dydz",inipar[5],error_par[5]);
803 upar.Add(
"BeamWidthX",inipar[6],error_par[6]);
806 MnMigrad migrad(*thePDF, upar);
808 FunctionMinimum fmin = migrad();
813 ff_minimum = fmin.Fval();
816 bool ff_nfcn=fmin.HasReachedCallLimit();
817 bool ff_cov=fmin.HasCovariance();
818 bool testing=fmin.IsValid();
824 edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: MINUIT DID NOT CONVERGES PROPERLY !!!!!!"<<std::endl;
825 if(ff_nfcn)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: No. of Calls Exhausted"<<std::endl;
826 if(!ff_cov)
edm::LogWarning(
"BSFitter") <<
"===========>>>>>** WARNING: Covariance did not found"<<std::endl;
829 edm::LogInfo(
"BSFitter") <<
"The Total # Tracks used for beam width fit = "<<(fBSvectorBW.size())<<std::endl;
833 double lastIter_pars[7];
835 for(
int ip=0;ip<7;ip++){ lastIter_pars[ip]=fmin.Parameters().Vec()(ip);
841 scanPDF(lastIter_pars,tracksFailed,2);
844 edm::LogWarning(
"BSFitter") <<
"WARNING: # of tracks which have very low pdf value (pdf_d < 1.0e-05) are = "<<tracksFailed<<std::endl;
853 for (
int j = 0 ;
j < 7 ; ++
j) {
854 for(
int k =
j ;
k < 7 ; ++
k) {
861 fmin.Parameters().Vec()(1),
862 fmin.Parameters().Vec()(2)),
863 fmin.Parameters().Vec()(3),
864 fmin.Parameters().Vec()(4),
865 fmin.Parameters().Vec()(5),
866 fmin.Parameters().Vec()(6),
877 thePDF->SetPDFs(
"PDFGauss_d_resolution*PDFGauss_z");
878 thePDF->SetData(fBSvector);
880 MnUserParameters upar;
881 upar.Add(
"X0", inipar[0],0.001);
882 upar.Add(
"Y0", inipar[1],0.001);
883 upar.Add(
"Z0", inipar[2],0.001);
884 upar.Add(
"sigmaZ",inipar[3],0.001);
885 upar.Add(
"dxdz",inipar[4],0.001);
886 upar.Add(
"dydz",inipar[5],0.001);
887 upar.Add(
"BeamWidthX",inipar[6],0.0001);
888 upar.Add(
"c0",0.0010,0.0001);
889 upar.Add(
"c1",0.0090,0.0001);
892 upar.Fix(
"BeamWidthX");
895 MnMigrad migrad(*thePDF, upar);
897 FunctionMinimum fmin = migrad();
898 ff_minimum = fmin.Fval();
902 for (
int j = 0 ;
j < 6 ; ++
j) {
903 for(
int k =
j ;
k < 6 ; ++
k) {
913 fresolution_c0 = fmin.Parameters().Vec()(6);
914 fresolution_c1 = fmin.Parameters().Vec()(7);
915 fres_c0_err =
sqrt( fmin.Error().Matrix()(6,6) );
916 fres_c1_err =
sqrt( fmin.Error().Matrix()(7,7) );
918 for (
int j = 6 ;
j < 8 ; ++
j) {
919 for(
int k = 6 ;
k < 8 ; ++
k) {
920 fres_matrix(
j-6,
k-6) = fmin.Error().Matrix()(
j,
k);
925 fmin.Parameters().Vec()(1),
926 fmin.Parameters().Vec()(2)),
927 fmin.Parameters().Vec()(3),
928 fmin.Parameters().Vec()(4),
929 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)
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