Skip to content
Snippets Groups Projects

Address #199 and fix Moore#422

Merged Gerhard Raven requested to merge issue-199 into master
1 file
+ 129
51
Compare changes
  • Side-by-side
  • Inline
@@ -14,6 +14,87 @@
using namespace LHCb;
enum struct ErrorCode {
hypo,
lh,
pos_mismatch,
pos_x,
pos_y,
pos_z,
pos_e,
center0,
center1,
digit_size,
digit_ref,
cluster_size,
cluster_ref,
hypo_size,
hypo_ref,
cov00,
cov11,
cov22,
spread00,
spread11,
cov10,
cov20,
cov21,
spread10
};
std::ostream& operator<<( std::ostream& os, ErrorCode ec ) {
switch ( ec ) {
case ErrorCode::hypo:
return os << "Hypo";
case ErrorCode::lh:
return os << "lh";
case ErrorCode::pos_mismatch:
return os << "pos_mismatch";
case ErrorCode::pos_x:
return os << "pos_x";
case ErrorCode::pos_y:
return os << "pos_y";
case ErrorCode::pos_z:
return os << "pos_z";
case ErrorCode::pos_e:
return os << "pos_e";
case ErrorCode::center0:
return os << "center0";
case ErrorCode::center1:
return os << "center1";
case ErrorCode::digit_size:
return os << "digit_size";
case ErrorCode::digit_ref:
return os << "digit_ref";
case ErrorCode::cluster_size:
return os << "cluster_size";
case ErrorCode::cluster_ref:
return os << "cluster_ref";
case ErrorCode::hypo_size:
return os << "hypo_size";
case ErrorCode::hypo_ref:
return os << "hypo_ref";
case ErrorCode::cov00:
return os << "cov00";
case ErrorCode::cov11:
return os << "cov11";
case ErrorCode::cov22:
return os << "cov22";
case ErrorCode::cov10:
return os << "cov10";
case ErrorCode::cov20:
return os << "cov20";
case ErrorCode::cov21:
return os << "cov21";
case ErrorCode::spread00:
return os << "spread00";
case ErrorCode::spread10:
return os << "spread10";
case ErrorCode::spread11:
return os << "spread11";
}
throw std::runtime_error{"unknown CaloHypo unpacking ErrorCode"};
}
void CaloHypoPacker::pack( const DataVector& hypos, PackedDataVector& phypos ) const {
// packing version
@@ -209,93 +290,90 @@ StatusCode CaloHypoPacker::check( const DataVector& dataA, const DataVector& dat
parent().warning() << "Wrong key : old " << oHypo->key() << " test " << tHypo->key() << endmsg;
}
bool isOK = true;
std::vector<ErrorCode> errors;
if ( oHypo->hypothesis() != tHypo->hypothesis() ) isOK = false;
if ( 1.e-7 < std::abs( ( oHypo->lh() - tHypo->lh() ) / oHypo->lh() ) ) isOK = false;
if ( oHypo->hypothesis() != tHypo->hypothesis() ) errors.push_back( ErrorCode::hypo );
if ( 1.e-7 < std::abs( ( oHypo->lh() - tHypo->lh() ) / oHypo->lh() ) ) errors.push_back( ErrorCode::lh );
const LHCb::CaloPosition* oPos = oHypo->position();
const LHCb::CaloPosition* tPos = tHypo->position();
std::vector<double> oDiag, tDiag, oFrac, tFrac;
if ( oPos == 0 && tPos != 0 ) isOK = false;
if ( oPos != 0 && tPos == 0 ) isOK = false;
if ( oPos == 0 && tPos != 0 ) errors.push_back( ErrorCode::pos_mismatch );
if ( oPos != 0 && tPos == 0 ) errors.push_back( ErrorCode::pos_mismatch );
if ( oPos != 0 && tPos != 0 ) {
if ( 5.e-5 < std::abs( oPos->z() - tPos->z() ) ) isOK = false;
if ( 5.e-5 < std::abs( oPos->x() - tPos->x() ) ) isOK = false;
if ( 5.e-5 < std::abs( oPos->y() - tPos->y() ) ) isOK = false;
if ( 5.e-3 < std::abs( oPos->e() - tPos->e() ) ) isOK = false;
if ( 5.e-5 < std::abs( oPos->center()( 0 ) - tPos->center()( 0 ) ) ) isOK = false;
if ( 5.e-5 < std::abs( oPos->center()( 1 ) - tPos->center()( 1 ) ) ) isOK = false;
oDiag.push_back( safe_sqrt( oPos->covariance()( 0, 0 ) ) );
oDiag.push_back( safe_sqrt( oPos->covariance()( 1, 1 ) ) );
oDiag.push_back( safe_sqrt( oPos->covariance()( 2, 2 ) ) );
oDiag.push_back( safe_sqrt( oPos->spread()( 0, 0 ) ) );
oDiag.push_back( safe_sqrt( oPos->spread()( 1, 1 ) ) );
tDiag.push_back( safe_sqrt( tPos->covariance()( 0, 0 ) ) );
tDiag.push_back( safe_sqrt( tPos->covariance()( 1, 1 ) ) );
tDiag.push_back( safe_sqrt( tPos->covariance()( 2, 2 ) ) );
tDiag.push_back( safe_sqrt( tPos->spread()( 0, 0 ) ) );
tDiag.push_back( safe_sqrt( tPos->spread()( 1, 1 ) ) );
if ( 5.e-5 < std::abs( oDiag[0] - tDiag[0] ) ) isOK = false;
if ( 5.e-5 < std::abs( oDiag[1] - tDiag[1] ) ) isOK = false;
if ( 5.e-3 < std::abs( oDiag[2] - tDiag[2] ) ) isOK = false;
if ( 5.e-5 < std::abs( oDiag[3] - tDiag[3] ) ) isOK = false;
if ( 5.e-5 < std::abs( oDiag[4] - tDiag[4] ) ) isOK = false;
oFrac.push_back( oPos->covariance()( 1, 0 ) / oDiag[1] / oDiag[0] );
oFrac.push_back( oPos->covariance()( 2, 0 ) / oDiag[2] / oDiag[0] );
oFrac.push_back( oPos->covariance()( 2, 1 ) / oDiag[2] / oDiag[1] );
oFrac.push_back( oPos->spread()( 1, 0 ) / oDiag[3] / oDiag[4] );
tFrac.push_back( tPos->covariance()( 1, 0 ) / tDiag[1] / tDiag[0] );
tFrac.push_back( tPos->covariance()( 2, 0 ) / tDiag[2] / tDiag[0] );
tFrac.push_back( tPos->covariance()( 2, 1 ) / tDiag[2] / tDiag[1] );
tFrac.push_back( tPos->spread()( 1, 0 ) / tDiag[3] / tDiag[4] );
if ( 5.e-5 < std::abs( oPos->z() - tPos->z() ) ) errors.push_back( ErrorCode::pos_z );
if ( 5.e-5 < std::abs( oPos->x() - tPos->x() ) ) errors.push_back( ErrorCode::pos_x );
if ( 5.e-5 < std::abs( oPos->y() - tPos->y() ) ) errors.push_back( ErrorCode::pos_y );
if ( 5.e-3 < std::abs( oPos->e() - tPos->e() ) ) errors.push_back( ErrorCode::pos_e );
if ( 5.e-5 < std::abs( oPos->center()( 0 ) - tPos->center()( 0 ) ) ) errors.push_back( ErrorCode::center0 );
if ( 5.e-5 < std::abs( oPos->center()( 1 ) - tPos->center()( 1 ) ) ) errors.push_back( ErrorCode::center1 );
auto oDiag = std::array{safe_sqrt( oPos->covariance()( 0, 0 ) ), safe_sqrt( oPos->covariance()( 1, 1 ) ),
safe_sqrt( oPos->covariance()( 2, 2 ) ), safe_sqrt( oPos->spread()( 0, 0 ) ),
safe_sqrt( oPos->spread()( 1, 1 ) )};
auto tDiag = std::array{safe_sqrt( tPos->covariance()( 0, 0 ) ), safe_sqrt( tPos->covariance()( 1, 1 ) ),
safe_sqrt( tPos->covariance()( 2, 2 ) ), safe_sqrt( tPos->spread()( 0, 0 ) ),
safe_sqrt( tPos->spread()( 1, 1 ) )};
if ( 5.e-5 < std::abs( oDiag[0] - tDiag[0] ) ) errors.push_back( ErrorCode::cov00 );
if ( 5.e-5 < std::abs( oDiag[1] - tDiag[1] ) ) errors.push_back( ErrorCode::cov11 );
if ( 5.e-3 < std::abs( oDiag[2] - tDiag[2] ) ) errors.push_back( ErrorCode::cov22 );
if ( 5.e-5 < std::abs( oDiag[3] - tDiag[3] ) ) errors.push_back( ErrorCode::spread00 );
if ( 5.e-5 < std::abs( oDiag[4] - tDiag[4] ) ) errors.push_back( ErrorCode::spread11 );
auto oFrac =
std::array{oPos->covariance()( 1, 0 ) / oDiag[1] / oDiag[0], oPos->covariance()( 2, 0 ) / oDiag[2] / oDiag[0],
oPos->covariance()( 2, 1 ) / oDiag[2] / oDiag[1], oPos->spread()( 1, 0 ) / oDiag[3] / oDiag[4]};
auto tFrac =
std::array{tPos->covariance()( 1, 0 ) / tDiag[1] / tDiag[0], tPos->covariance()( 2, 0 ) / tDiag[2] / tDiag[0],
tPos->covariance()( 2, 1 ) / tDiag[2] / tDiag[1], tPos->spread()( 1, 0 ) / tDiag[3] / tDiag[4]};
auto ec = std::array{ErrorCode::cov10, ErrorCode::cov20, ErrorCode::cov21, ErrorCode::spread10};
for ( unsigned int kk = 0; oFrac.size() > kk; ++kk ) {
if ( 2.e-5 < std::abs( oFrac[kk] - tFrac[kk] ) ) isOK = false;
if ( 2.e-5 < std::abs( oFrac[kk] - tFrac[kk] ) ) errors.push_back( ec[kk] );
}
}
if ( oHypo->digits().size() != tHypo->digits().size() ) {
isOK = false;
errors.push_back( ErrorCode::digit_size );
} else {
for ( unsigned int kk = 0; oHypo->digits().size() > kk; kk++ ) {
const LHCb::CaloDigit* dum = oHypo->digits()[kk]; // convert smartref to pointers
const LHCb::CaloDigit* dum1 = tHypo->digits()[kk];
if ( dum != dum1 ) isOK = false;
if ( dum != dum1 ) errors.push_back( ErrorCode::digit_ref );
}
}
if ( oHypo->clusters().size() != tHypo->clusters().size() ) {
isOK = false;
errors.push_back( ErrorCode::cluster_size );
} else {
for ( unsigned int kk = 0; oHypo->clusters().size() > kk; kk++ ) {
const LHCb::CaloCluster* dum = oHypo->clusters()[kk]; // convert smartref to pointers
const LHCb::CaloCluster* dum1 = tHypo->clusters()[kk];
if ( dum != dum1 ) isOK = false;
if ( dum != dum1 ) errors.push_back( ErrorCode::cluster_ref );
}
}
if ( oHypo->hypos().size() != tHypo->hypos().size() ) {
isOK = false;
errors.push_back( ErrorCode::hypo_size );
} else {
for ( unsigned int kk = 0; oHypo->hypos().size() > kk; kk++ ) {
const LHCb::CaloHypo* dum = oHypo->hypos()[kk]; // convert smartref to pointers
const LHCb::CaloHypo* dum1 = tHypo->hypos()[kk];
if ( dum != dum1 ) isOK = false;
if ( dum != dum1 ) errors.push_back( ErrorCode::hypo_ref );
}
}
// Force for tests
// isOK = false;
if ( !isOK || MSG::DEBUG >= parent().msgLevel() ) {
if ( !errors.empty() || MSG::DEBUG >= parent().msgLevel() ) {
const std::string loc = ( dataA.registry() ? dataA.registry()->identifier() : "Not in TES" );
parent().warning() << "Problem with CaloHypo data packing :-" << endmsg
<< " Original CaloHypo key=" << oHypo->key() << " in '" << loc << "'" << endmsg << *oHypo
parent().warning() << "Problem with CaloHypo data packing :-" << endmsg;
for ( auto e : errors ) parent().warning() << e << " ";
parent().warning() << endmsg;
parent().warning() << " Original CaloHypo key=" << oHypo->key() << " in '" << loc << "'" << endmsg << *oHypo
<< endmsg << " Unpacked CaloHypo" << endmsg << *tHypo << endmsg;
}
}
Loading