74 {
75
76
77 xAOD::ParametersCovMatrix_t cov;
78 cov.setZero();
79 valid = true;
80
81
82 if( ( static_cast< int >( covMatrixDiag.size() ) == cov.rows() ) ) {
83
84
85
86 for( int i = 0; i < cov.rows(); ++i ) {
87 cov( i, i ) = covMatrixDiag[ i ];
88 }
89 } else {
90 valid = false;
91
92 cov.setIdentity();
93 }
94
96
97
98 if(!offDiagCompr){
99
100 if( (
static_cast< int >( covMatrixOffDiag.size() ) == ( ( (
cov.rows() - 1 ) *
cov.rows() ) / 2 ) ) ) {
101
102
103 std::size_t vecIndex = 0;
104 for(
int i = 1;
i <
cov.rows(); ++
i ) {
105 for(
int j = 0; j <
i; ++j, ++vecIndex ) {
106 float offDiagCoeff =
cov(i,i)>0 &&
cov(j,j)>0 ? covMatrixOffDiag[vecIndex]*sqrt(
cov(i,i)*
cov(j,j)) : 0;
107 cov.fillSymmetric( i, j, offDiagCoeff );
108 }
109 }
110 }
111
113
114 }
115
116 else{
117
119
120
122
124 std::pair<covMatrixIndex,covMatrixIndex> pairIndex = vecPairIndex[
k];
127 float offDiagCoeff =
cov(i,i)>0 &&
cov(j,j)>0 ? covMatrixOffDiag[
k]*sqrt(
cov(i,i)*
cov(j,j)) : 0;
128 cov.fillSymmetric( i, j, offDiagCoeff );
129 }
130
131 }
132
134
135 }
136
137
138
140
141 }
bool definingParametersCovMatrixOffDiagCompr(std::span< const float > covMatrixOffDiag)
constexpr std::size_t COVMATRIX_OFFDIAG_VEC_COMPR_SIZE
constexpr std::array< std::pair< covMatrixIndex, covMatrixIndex >, COVMATRIX_OFFDIAG_VEC_COMPR_SIZE > covMatrixComprIndexPairs