522 double meanx(0.),meany(0.), meanz(0.);
523 double meanxSqr(0.),meanySqr(0.), meanzSqr(0.);
524 double rmsX(0.),rmsY(0.), rmsZ(0.);
527 std::vector<double> vx,vy,vz;
530 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
533 if (!it->valid)
continue;
537 meanxSqr += (it->x)*(it->x);
539 meanySqr += (it->y)*(it->y);
541 meanzSqr += (it->z)*(it->z);
557 double medianx = (vx.size() > 1 ? vx.at(vx.size()/2) : 0.);
558 double mediany = (vy.size() > 1 ? vy.at(vy.size()/2) : 0.);
559 double medianz = (vz.size() > 1 ? vz.at(vz.size()/2) : 0.);
563 <<
" z: " << medianz );
581 for (
unsigned int ivtx(0); ivtx < vx.size(); ++ivtx) {
582 double x = vx.at(ivtx);
583 double y = vy.at(ivtx);
584 double z = vz.at(ivtx);
600 rmsX = std::sqrt( std::abs(meanxSqr - meanx*meanx));
603 rmsY = std::sqrt( std::abs(meanySqr - meany*meany));
606 rmsZ = std::sqrt( std::abs(meanzSqr - meanz*meanz));
620 <<
" " <<
", y: " << meany <<
" " << rmsY <<
", z: " << meanz <<
" " << rmsZ );
624 CLHEP::HepVector chi2Pos(4);
625 CLHEP::HepSymMatrix chi2Cov(4);
626 double zpos(0), zerr(0);
632 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
635 if (!it->valid)
continue;
638 if ( std::abs( medianx - it->x ) >
m_sigTr *rmsX) fail += 4;
639 if ( std::abs( mediany - it->y ) >
m_sigTr *rmsY) fail += 8;
640 if ( std::abs( medianz - it->z ) > 10*rmsZ) fail += 16;
641 if ((rmsX == 0.) or (rmsY == 0.))[[
unlikely]]{
642 throw std::runtime_error(
"InDetBeamSpotVertex::solveChi2: rmsX or rmsY is zero!");
645 if ( (medianx - it->x)*(medianx-it->x)/rmsX/rmsX + (mediany-it->y)*(mediany-it->y)/rmsY/rmsY >
m_sigTr*
m_sigTr) {
646 ATH_MSG_DEBUG(
"Vertex info: extended past radial extent: sig."
647 << std::sqrt((medianx - it->x)*(medianx-it->x)/rmsX/rmsX + (mediany-it->y)*(mediany-it->y)/rmsY/rmsY) <<
" > "
655 ATH_MSG_DEBUG(
"Vertex reject from simple mean; reason: " << fail <<
" : x,y,z: "
656 << it->x <<
" " << it->y <<
" " << it->z
657 <<
" , sigma(x,y,z): " << std::sqrt(it->vxx) <<
" " << std::sqrt(it->vyy)
658 <<
" " << std::sqrt(it->vzz)
666 chi2Pos(1) += it->x * it->vxx + it->y*it->vxy;
667 chi2Pos(2) += it->x*it->vxx*it->z + it->y*it->vxy*it->z;
668 chi2Pos(3) += it->y*it->vyy + it->x*it->vxy;
669 chi2Pos(4) += it->y*it->vyy*it->z + it->x*it->vxy*it->z;
672 chi2Cov.fast(1,1) += it->vxx;
673 chi2Cov.fast(2,1) += it->vxx*it->z;
674 chi2Cov.fast(2,2) += it->vxx*it->z*it->z;
675 chi2Cov.fast(3,1) += it->vxy;
676 chi2Cov.fast(3,2) += it->vxy*it->z;
677 chi2Cov.fast(3,3) += it->vyy;
678 chi2Cov.fast(4,1) += it->vxy*it->z;
679 chi2Cov.fast(4,2) += it->vxy*it->z*it->z;
680 chi2Cov.fast(4,3) += it->vyy*it->z;
681 chi2Cov.fast(4,4) += it->vyy*it->z*it->z;
683 zpos += it->z/it->vzz;
688 ATH_MSG_DEBUG(
"Removed: " << failCount <<
" vertices from simple mean,RMS." );
698 chi2Cov.invert(invFail);
699 chi2Pos = chi2Cov*chi2Pos;
701 throw std::runtime_error(
"InDetBeamSpotVertex::applyOutlierRemoval: zerr is zero.");
704 zerr = 1./std::sqrt(zerr);
710 if (
msgLvl(MSG::DEBUG) ) {
711 ATH_MSG_DEBUG(
"Mean position: x,y,z " << meanx <<
" " << meany <<
" " << meanz );
712 ATH_MSG_DEBUG(
" RMS: x,y,z " << rmsX <<
" " << rmsY <<
" " << rmsZ );
716 ATH_MSG_DEBUG(
"New chi2:" << chi2Pos <<
"\n" << chi2Cov <<
"\n" << zpos <<
" " << zerr );
741 ATH_MSG_INFO(
"Log-Likelihood fit converged in outlier removal. Exiting outlier removal." );
745 CLHEP::HepSymMatrix bsCov(2);
757 ATH_MSG_INFO(
": removeOutliers: LL fit not use/converged/trusted - " <<
758 "using chi2 for mean and simple RMS for width values " );
765 bsCov(1,1) = rmsX*rmsX;
766 bsCov(2,2) = rmsY*rmsY;
783 std::multimap<double, BeamSpot::VrtHolder*> chi2map;
786 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
m_vertexData.begin();
788 if ( !it->valid)
continue;
792 if ( std::abs(it->x - (xbar + it->z*ax)) >
m_sigTr * rmsX) fail += 1;
793 if ( std::abs(it->y - (ybar + it->z*ay)) >
m_sigTr * rmsY) fail += 2;
797 if ( std::abs(it->z - meanz) >
m_sigTr * rmsZ) fail += 8;
800 double increaseChi2(0);
802 increaseChi2 = fail * 1e5;
807 CLHEP::HepSymMatrix b(2);
810 b(1,1) = it->vxx + bsCov(1,1);
811 b(2,2) = it->vyy + bsCov(2,2);
812 b(2,1) = it->vxy + bsCov(2,1);
816 if (failInv)
continue;
817 double ch = (it->x - (xbar + it->z*ax)) * b(1,1) * (it->x - (xbar + it->z*ax))
818 + (it->y - (ybar + it->z*ay)) * b(2,2) * (it->y - (ybar + it->z*ay))
819 + 2*(it->x - (xbar + it->z*ax)) *b(2,1) * (it->y - (ybar + it->z*ay));
826 chi2map.insert(std::make_pair(ch, &(*it)));
832 for (std::multimap<double, BeamSpot::VrtHolder*>::reverse_iterator vit = chi2map.rbegin(); vit != chi2map.rend(); ++vit) {
833 if ( !vit->second)
continue;
834 if ( !vit->second->valid)
continue;
836 ATH_MSG_DEBUG(
" removeOutlier: Reached max number of vertex rejections for this iteration.\n"
837 <<
"\tNeed to recalculate mean positions." );
847 ATH_MSG_DEBUG(
" No more 'bad' vertices found in this iteration." );
849 ATH_MSG_DEBUG(
" No futher vertices removed - moving to final iteration" );
851 ATH_MSG_DEBUG(
" Moving to next iteration of outlier removal." );
859 vit->second->valid =
false;
861 ATH_MSG_DEBUG(
"Vertex rejected; chi2: " << vit->first <<
". pos(x,y,z): "
862 << vit->second->x <<
" " << vit->second->y <<
" " << vit->second->z
863 <<
" , sigma(x,y,z): " << sqrt(vit->second->vxx) <<
" " << sqrt(vit->second->vyy)
864 <<
" " << sqrt(vit->second->vzz)
871 ATH_MSG_WARNING(
"No vertices removed and fit still fails - most likely final result will fail" );
879 std::vector< BeamSpot::VrtHolder > vertexTemp(
m_vertexData);
881 std::random_device rng;
882 std::mt19937 urng(rng());
885 std::vector< BeamSpot::VrtHolder > vertex1,vertex2;
889 bool goodFit1(
false), goodFit2(
false);
895 ATH_MSG_WARNING(
"Fit using \"vertex1\" " << ( llSolve ?
"Successful":
"Failed") );
919 ATH_MSG_WARNING(
"Fit using \"vertex2\" " << ( llSolve ?
"Successful":
"Failed") );
939 ATH_MSG_WARNING(
"Fit was " << ( goodFit2 || goodFit1 ?
"Successful ":
"Unsuccessful ")
940 <<
" using a subset of the available vertices" );
941 if (( goodFit2 || goodFit1) )
947 }
else if (goodFit2) {
958 ATH_MSG_DEBUG(
" Recursive debug: Loop: " <<
m_rCount <<
". Number of failed vertices: " << fCount );
961 if ( fCount > 0 || ( fCount == 0 &&
m_rCount == 1 && !llSolve)) {
964 <<
". No more iterations performed." );
1033 constexpr double Pi =
M_PI;
1040 using Vertices = std::vector<BeamSpot::VrtHolder>;
1042 Vertices::const_iterator vit = BeamSpot::vertexData->begin();
1046 double vxx,vyy, vxy;
1047 double covXX,covYY,covXY;
1051 for ( ; vit != vertexData->end(); ++vit) {
1052 if (!vit->valid)
continue;
1064 covXX = k2 *vxx + par[4]*par[4];
1065 covYY = k2 *vyy + par[5]*par[5];
1066 covXY = k2 *vxy + par[6] *par[4]* par[5];
1068 det = covXX * covYY - covXY*covXY;
1069 double recDet = 1./det;
1072 temp = 2*TMath::Log(2*
Pi);
1073 temp += TMath::Log(det);
1075 covXY = -covXY * recDet;
1076 double t = covXX *recDet;
1077 covXX = covYY *recDet;
1081 (
x - par[0] - par[2]*
z) * covXX * (
x - par[0] - par[2]*
z)
1082 + (
y - par[1] - par[3]*
z) * covYY * (
y - par[1] - par[3]*
z)
1083 + 2*(
x - par[0] - par[2]*
z) * covXY * (
y - par[1] - par[3]*
z)
1086 temp += TMath::Log( 2*
Pi * par[9]*par[9] ) + (
z - par[8]) * (
z-par[8]) / (par[9] * par[9] );
1157 std::map<std::string,double> covMap;
1158 std::vector<double> covVector;
1159 covVector.resize(55);
1164 int map[] = {1,2,9,3,4,5,6,10,7,8};
1166 int map2[] = {1,2,8,3,4,5,6,9,7,10};
1167 for(
int i=0; i < 10; ++i){
1171 int map2[] = {1,2,6,3,4,8,9,7,10,5};
1172 for(
int i=0; i < 10; ++i){
1178 for (
int i=0;i<10;++i) {
1179 for (
int j=i;j<10;++j) {
1181 covVector[
temp++] = 0;
1182 }
else if (
m_fixWidth && ( i == 5 || i == 6 || i == 8 || j == 5 || j == 6 || j == 8 ) ){
1183 covVector[
temp++] = 0;
1192 const std::string keyArr[] = {
"posXErr",
"covXY",
"covXZ",
"covXTiltX",
"covXTiltY",
"covXSx",
"covXSy",
"covXSz",
"covXRhoXY",
"covXk",
1193 "posYErr",
"covYZ",
"covYTiltX",
"covYTiltY",
"covYSx",
"covYSy",
"covYSz",
"covYRhoXY",
"covYk",
1194 "posZErr",
"covZTiltX",
"covZTiltY",
"covZSx",
"covZSy",
"covZSz",
"covZRhoXY",
"covZk",
1195 "tiltXErr",
"covTiltXTiltY",
"covTiltXSx",
"covTiltXSy",
"covTiltXSz",
"covTiltXRhoXY",
"covTiltXk",
1196 "tiltYErr",
"covTiltYSx",
"covTiltYSy",
"covTiltYSz",
"covTiltYRhoXY",
"covTiltYk",
1197 "sigmaXErr",
"covSxSy",
"covSxSz",
"covSxRhoXY",
"covSxk",
1198 "sigmaYErr",
"covSySz",
"covSyRhoXY",
"covSyk",
1199 "sigmaZErr",
"covSzRhoXY",
"covSzk",
1200 "rhoXYErr",
"covRhoXYk",
1207 for(
int i = 0; i < 55; i++){
1208 covMap[keyArr[i]] = covVector[i];
1213 covMap[ keyArr[0] ] = sqrt(covVector[0]);
1214 covMap[ keyArr[10] ] = sqrt(covVector[10]);
1215 covMap[ keyArr[19] ] = sqrt(covVector[19]);
1216 covMap[ keyArr[27] ] = sqrt(covVector[27]);
1217 covMap[ keyArr[34] ] = sqrt(covVector[34]);
1218 covMap[ keyArr[40] ] = sqrt(covVector[40]);
1219 covMap[ keyArr[45] ] = sqrt(covVector[45]);
1220 covMap[ keyArr[49] ] = sqrt(covVector[49]);
1221 covMap[ keyArr[52] ] = sqrt(covVector[52]);
1222 covMap[ keyArr[54] ] = sqrt(covVector[54]);
1229 CLHEP::HepSymMatrix covc =
getCov(
z);
1231 covMap[
"posXErr"] = sqrt( covc(1,1) );
1232 covMap[
"posYErr"] = sqrt( covc(2,2) );
1233 covMap[
"tiltXErr"] = sqrt( covc(3,3) );
1234 covMap[
"tiltYErr"] = sqrt( covc(4,4) );