521 double meanx(0.),meany(0.), meanz(0.);
522 double meanxSqr(0.),meanySqr(0.), meanzSqr(0.);
523 double rmsX(0.),rmsY(0.), rmsZ(0.);
526 std::vector<double> vx,vy,vz;
529 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
532 if (!it->valid)
continue;
536 meanxSqr += (it->x)*(it->x);
538 meanySqr += (it->y)*(it->y);
540 meanzSqr += (it->z)*(it->z);
556 double medianx = (vx.size() > 1 ? vx.at(vx.size()/2) : 0.);
557 double mediany = (vy.size() > 1 ? vy.at(vy.size()/2) : 0.);
558 double medianz = (vz.size() > 1 ? vz.at(vz.size()/2) : 0.);
562 <<
" z: " << medianz );
580 for (
unsigned int ivtx(0); ivtx < vx.size(); ++ivtx) {
581 double x = vx.at(ivtx);
582 double y = vy.at(ivtx);
583 double z = vz.at(ivtx);
599 rmsX = std::sqrt( std::abs(meanxSqr - meanx*meanx));
602 rmsY = std::sqrt( std::abs(meanySqr - meany*meany));
605 rmsZ = std::sqrt( std::abs(meanzSqr - meanz*meanz));
619 <<
" " <<
", y: " << meany <<
" " << rmsY <<
", z: " << meanz <<
" " << rmsZ );
623 CLHEP::HepVector chi2Pos(4);
624 CLHEP::HepSymMatrix chi2Cov(4);
625 double zpos(0), zerr(0);
631 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
634 if (!it->valid)
continue;
637 if ( std::abs( medianx - it->x ) >
m_sigTr *rmsX) fail += 4;
638 if ( std::abs( mediany - it->y ) >
m_sigTr *rmsY) fail += 8;
639 if ( std::abs( medianz - it->z ) > 10*rmsZ) fail += 16;
642 if ( (medianx - it->x)*(medianx-it->x)/rmsX/rmsX + (mediany-it->y)*(mediany-it->y)/rmsY/rmsY >
m_sigTr*
m_sigTr) {
643 ATH_MSG_DEBUG(
"Vertex info: extended past radial extent: sig."
644 << sqrt((medianx - it->x)*(medianx-it->x)/rmsX/rmsX + (mediany-it->y)*(mediany-it->y)/rmsY/rmsY) <<
" > "
652 ATH_MSG_DEBUG(
"Vertex reject from simple mean; reason: " << fail <<
" : x,y,z: "
653 << it->x <<
" " << it->y <<
" " << it->z
654 <<
" , sigma(x,y,z): " << sqrt(it->vxx) <<
" " << sqrt(it->vyy)
655 <<
" " << sqrt(it->vzz)
663 chi2Pos(1) += it->x * it->vxx + it->y*it->vxy;
664 chi2Pos(2) += it->x*it->vxx*it->z + it->y*it->vxy*it->z;
665 chi2Pos(3) += it->y*it->vyy + it->x*it->vxy;
666 chi2Pos(4) += it->y*it->vyy*it->z + it->x*it->vxy*it->z;
669 chi2Cov.fast(1,1) += it->vxx;
670 chi2Cov.fast(2,1) += it->vxx*it->z;
671 chi2Cov.fast(2,2) += it->vxx*it->z*it->z;
672 chi2Cov.fast(3,1) += it->vxy;
673 chi2Cov.fast(3,2) += it->vxy*it->z;
674 chi2Cov.fast(3,3) += it->vyy;
675 chi2Cov.fast(4,1) += it->vxy*it->z;
676 chi2Cov.fast(4,2) += it->vxy*it->z*it->z;
677 chi2Cov.fast(4,3) += it->vyy*it->z;
678 chi2Cov.fast(4,4) += it->vyy*it->z*it->z;
680 zpos += it->z/it->vzz;
685 ATH_MSG_DEBUG(
"Removed: " << failCount <<
" vertices from simple mean,RMS." );
695 chi2Cov.invert(invFail);
696 chi2Pos = chi2Cov*chi2Pos;
698 zerr = 1./std::sqrt(zerr);
704 if (
msgLvl(MSG::DEBUG) ) {
705 ATH_MSG_DEBUG(
"Mean position: x,y,z " << meanx <<
" " << meany <<
" " << meanz );
706 ATH_MSG_DEBUG(
" RMS: x,y,z " << rmsX <<
" " << rmsY <<
" " << rmsZ );
710 ATH_MSG_DEBUG(
"New chi2:" << chi2Pos <<
"\n" << chi2Cov <<
"\n" << zpos <<
" " << zerr );
735 ATH_MSG_INFO(
"Log-Likelihood fit converged in outlier removal. Exiting outlier removal." );
739 CLHEP::HepSymMatrix bsCov(2);
751 ATH_MSG_INFO(
": removeOutliers: LL fit not use/converged/trusted - " <<
752 "using chi2 for mean and simple RMS for width values " );
759 bsCov(1,1) = rmsX*rmsX;
760 bsCov(2,2) = rmsY*rmsY;
777 std::multimap<double, BeamSpot::VrtHolder*> chi2map;
780 for ( std::vector< BeamSpot::VrtHolder >::iterator it =
m_vertexData.begin();
782 if ( !it->valid)
continue;
786 if ( std::abs(it->x - (xbar + it->z*ax)) >
m_sigTr * rmsX) fail += 1;
787 if ( std::abs(it->y - (ybar + it->z*ay)) >
m_sigTr * rmsY) fail += 2;
791 if ( std::abs(it->z - meanz) >
m_sigTr * rmsZ) fail += 8;
794 double increaseChi2(0);
796 increaseChi2 = fail * 1e5;
801 CLHEP::HepSymMatrix b(2);
804 b(1,1) = it->vxx + bsCov(1,1);
805 b(2,2) = it->vyy + bsCov(2,2);
806 b(2,1) = it->vxy + bsCov(2,1);
810 if (failInv)
continue;
811 double ch = (it->x - (xbar + it->z*ax)) * b(1,1) * (it->x - (xbar + it->z*ax))
812 + (it->y - (ybar + it->z*ay)) * b(2,2) * (it->y - (ybar + it->z*ay))
813 + 2*(it->x - (xbar + it->z*ax)) *b(2,1) * (it->y - (ybar + it->z*ay));
820 chi2map.insert(std::make_pair(ch, &(*it)));
826 for (std::multimap<double, BeamSpot::VrtHolder*>::reverse_iterator vit = chi2map.rbegin(); vit != chi2map.rend(); ++vit) {
827 if ( !vit->second)
continue;
828 if ( !vit->second->valid)
continue;
830 ATH_MSG_DEBUG(
" removeOutlier: Reached max number of vertex rejections for this iteration.\n"
831 <<
"\tNeed to recalculate mean positions." );
841 ATH_MSG_DEBUG(
" No more 'bad' vertices found in this iteration." );
843 ATH_MSG_DEBUG(
" No futher vertices removed - moving to final iteration" );
845 ATH_MSG_DEBUG(
" Moving to next iteration of outlier removal." );
853 vit->second->valid =
false;
855 ATH_MSG_DEBUG(
"Vertex rejected; chi2: " << vit->first <<
". pos(x,y,z): "
856 << vit->second->x <<
" " << vit->second->y <<
" " << vit->second->z
857 <<
" , sigma(x,y,z): " << sqrt(vit->second->vxx) <<
" " << sqrt(vit->second->vyy)
858 <<
" " << sqrt(vit->second->vzz)
865 ATH_MSG_WARNING(
"No vertices removed and fit still fails - most likely final result will fail" );
873 std::vector< BeamSpot::VrtHolder > vertexTemp(
m_vertexData);
875 std::random_device rng;
876 std::mt19937 urng(rng());
879 std::vector< BeamSpot::VrtHolder > vertex1,vertex2;
883 bool goodFit1(
false), goodFit2(
false);
889 ATH_MSG_WARNING(
"Fit using \"vertex1\" " << ( llSolve ?
"Successful":
"Failed") );
913 ATH_MSG_WARNING(
"Fit using \"vertex2\" " << ( llSolve ?
"Successful":
"Failed") );
933 ATH_MSG_WARNING(
"Fit was " << ( goodFit2 || goodFit1 ?
"Successful ":
"Unsuccessful ")
934 <<
" using a subset of the available vertices" );
935 if (( goodFit2 || goodFit1) )
941 }
else if (goodFit2) {
952 ATH_MSG_DEBUG(
" Recursive debug: Loop: " <<
m_rCount <<
". Number of failed vertices: " << fCount );
955 if ( fCount > 0 || ( fCount == 0 &&
m_rCount == 1 && !llSolve)) {
958 <<
". No more iterations performed." );
1027 constexpr double Pi =
M_PI;
1034 using Vertices = std::vector<BeamSpot::VrtHolder>;
1035 Vertices::const_iterator vit = BeamSpot::vertexData->begin();
1039 double vxx,vyy, vxy;
1040 double covXX,covYY,covXY;
1044 for ( ; vit != vertexData->end(); ++vit) {
1045 if (!vit->valid)
continue;
1057 covXX = k2 *vxx + par[4]*par[4];
1058 covYY = k2 *vyy + par[5]*par[5];
1059 covXY = k2 *vxy + par[6] *par[4]* par[5];
1061 det = covXX * covYY - covXY*covXY;
1062 double recDet = 1./det;
1065 temp = 2*TMath::Log(2*
Pi);
1066 temp += TMath::Log(det);
1068 covXY = -covXY * recDet;
1069 double t = covXX *recDet;
1070 covXX = covYY *recDet;
1074 (
x - par[0] - par[2]*
z) * covXX * (
x - par[0] - par[2]*
z)
1075 + (
y - par[1] - par[3]*
z) * covYY * (
y - par[1] - par[3]*
z)
1076 + 2*(
x - par[0] - par[2]*
z) * covXY * (
y - par[1] - par[3]*
z)
1079 temp += TMath::Log( 2*
Pi * par[9]*par[9] ) + (
z - par[8]) * (
z-par[8]) / (par[9] * par[9] );
1150 std::map<std::string,double> covMap;
1151 std::vector<double> covVector;
1152 covVector.resize(55);
1157 int map[] = {1,2,9,3,4,5,6,10,7,8};
1159 int map2[] = {1,2,8,3,4,5,6,9,7,10};
1160 for(
int i=0; i < 10; ++i){
1164 int map2[] = {1,2,6,3,4,8,9,7,10,5};
1165 for(
int i=0; i < 10; ++i){
1171 for (
int i=0;i<10;++i) {
1172 for (
int j=i;j<10;++j) {
1174 covVector[
temp++] = 0;
1175 }
else if (
m_fixWidth && ( i == 5 || i == 6 || i == 8 || j == 5 || j == 6 || j == 8 ) ){
1176 covVector[
temp++] = 0;
1185 const std::string keyArr[] = {
"posXErr",
"covXY",
"covXZ",
"covXTiltX",
"covXTiltY",
"covXSx",
"covXSy",
"covXSz",
"covXRhoXY",
"covXk",
1186 "posYErr",
"covYZ",
"covYTiltX",
"covYTiltY",
"covYSx",
"covYSy",
"covYSz",
"covYRhoXY",
"covYk",
1187 "posZErr",
"covZTiltX",
"covZTiltY",
"covZSx",
"covZSy",
"covZSz",
"covZRhoXY",
"covZk",
1188 "tiltXErr",
"covTiltXTiltY",
"covTiltXSx",
"covTiltXSy",
"covTiltXSz",
"covTiltXRhoXY",
"covTiltXk",
1189 "tiltYErr",
"covTiltYSx",
"covTiltYSy",
"covTiltYSz",
"covTiltYRhoXY",
"covTiltYk",
1190 "sigmaXErr",
"covSxSy",
"covSxSz",
"covSxRhoXY",
"covSxk",
1191 "sigmaYErr",
"covSySz",
"covSyRhoXY",
"covSyk",
1192 "sigmaZErr",
"covSzRhoXY",
"covSzk",
1193 "rhoXYErr",
"covRhoXYk",
1200 for(
int i = 0; i < 55; i++){
1201 covMap[keyArr[i]] = covVector[i];
1206 covMap[ keyArr[0] ] = sqrt(covVector[0]);
1207 covMap[ keyArr[10] ] = sqrt(covVector[10]);
1208 covMap[ keyArr[19] ] = sqrt(covVector[19]);
1209 covMap[ keyArr[27] ] = sqrt(covVector[27]);
1210 covMap[ keyArr[34] ] = sqrt(covVector[34]);
1211 covMap[ keyArr[40] ] = sqrt(covVector[40]);
1212 covMap[ keyArr[45] ] = sqrt(covVector[45]);
1213 covMap[ keyArr[49] ] = sqrt(covVector[49]);
1214 covMap[ keyArr[52] ] = sqrt(covVector[52]);
1215 covMap[ keyArr[54] ] = sqrt(covVector[54]);
1222 CLHEP::HepSymMatrix covc =
getCov(
z);
1224 covMap[
"posXErr"] = sqrt( covc(1,1) );
1225 covMap[
"posYErr"] = sqrt( covc(2,2) );
1226 covMap[
"tiltXErr"] = sqrt( covc(3,3) );
1227 covMap[
"tiltYErr"] = sqrt( covc(4,4) );