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." );
1156 std::map<std::string,double> covMap;
1157 std::vector<double> covVector;
1158 covVector.resize(55);
1163 int map[] = {1,2,9,3,4,5,6,10,7,8};
1165 int map2[] = {1,2,8,3,4,5,6,9,7,10};
1166 for(
int i=0; i < 10; ++i){
1170 int map2[] = {1,2,6,3,4,8,9,7,10,5};
1171 for(
int i=0; i < 10; ++i){
1177 for (
int i=0;i<10;++i) {
1178 for (
int j=i;j<10;++j) {
1180 covVector[
temp++] = 0;
1181 }
else if (
m_fixWidth && ( i == 5 || i == 6 || i == 8 || j == 5 || j == 6 || j == 8 ) ){
1182 covVector[
temp++] = 0;
1191 const std::string keyArr[] = {
"posXErr",
"covXY",
"covXZ",
"covXTiltX",
"covXTiltY",
"covXSx",
"covXSy",
"covXSz",
"covXRhoXY",
"covXk",
1192 "posYErr",
"covYZ",
"covYTiltX",
"covYTiltY",
"covYSx",
"covYSy",
"covYSz",
"covYRhoXY",
"covYk",
1193 "posZErr",
"covZTiltX",
"covZTiltY",
"covZSx",
"covZSy",
"covZSz",
"covZRhoXY",
"covZk",
1194 "tiltXErr",
"covTiltXTiltY",
"covTiltXSx",
"covTiltXSy",
"covTiltXSz",
"covTiltXRhoXY",
"covTiltXk",
1195 "tiltYErr",
"covTiltYSx",
"covTiltYSy",
"covTiltYSz",
"covTiltYRhoXY",
"covTiltYk",
1196 "sigmaXErr",
"covSxSy",
"covSxSz",
"covSxRhoXY",
"covSxk",
1197 "sigmaYErr",
"covSySz",
"covSyRhoXY",
"covSyk",
1198 "sigmaZErr",
"covSzRhoXY",
"covSzk",
1199 "rhoXYErr",
"covRhoXYk",
1206 for(
int i = 0; i < 55; i++){
1207 covMap[keyArr[i]] = covVector[i];
1212 covMap[ keyArr[0] ] = sqrt(covVector[0]);
1213 covMap[ keyArr[10] ] = sqrt(covVector[10]);
1214 covMap[ keyArr[19] ] = sqrt(covVector[19]);
1215 covMap[ keyArr[27] ] = sqrt(covVector[27]);
1216 covMap[ keyArr[34] ] = sqrt(covVector[34]);
1217 covMap[ keyArr[40] ] = sqrt(covVector[40]);
1218 covMap[ keyArr[45] ] = sqrt(covVector[45]);
1219 covMap[ keyArr[49] ] = sqrt(covVector[49]);
1220 covMap[ keyArr[52] ] = sqrt(covVector[52]);
1221 covMap[ keyArr[54] ] = sqrt(covVector[54]);
1228 CLHEP::HepSymMatrix covc =
getCov(
z);
1230 covMap[
"posXErr"] = sqrt( covc(1,1) );
1231 covMap[
"posYErr"] = sqrt( covc(2,2) );
1232 covMap[
"tiltXErr"] = sqrt( covc(3,3) );
1233 covMap[
"tiltYErr"] = sqrt( covc(4,4) );