Commit ee704e03e752e4e9900de6e19d795dd805f2d162
Merge branch '3403-ctools-unit-test-failure' into integration
Showing
2 changed files
with
51 additions
and
19 deletions
src/obs/GObservation.cpp
| ... | ... | @@ -1006,10 +1006,10 @@ double GObservation::likelihood_poisson_unbinned(const GModels& models, |
| 1006 | 1006 | // Create index array of non-zero derivatives and initialise working |
| 1007 | 1007 | // array |
| 1008 | 1008 | int ndev = 0; |
| 1009 | - for (int i = 0; i < npars; ++i) { | |
| 1010 | - values[i] = 0.0; | |
| 1011 | - if (wrk_grad[i] != 0.0 && !gammalib::is_infinite(wrk_grad[i])) { | |
| 1012 | - inx[ndev] = i; | |
| 1009 | + for (int ipar = 0; ipar < npars; ++ipar) { | |
| 1010 | + values[ipar] = 0.0; | |
| 1011 | + if (wrk_grad[ipar] != 0.0 && !gammalib::is_infinite(wrk_grad[ipar])) { | |
| 1012 | + inx[ndev] = ipar; | |
| 1013 | 1013 | ndev++; |
| 1014 | 1014 | } |
| 1015 | 1015 | } |
| ... | ... | @@ -1166,13 +1166,19 @@ double GObservation::likelihood_poisson_binned(const GModels& models, |
| 1166 | 1166 | // Create index array of non-zero derivatives and initialise working |
| 1167 | 1167 | // array |
| 1168 | 1168 | int ndev = 0; |
| 1169 | - for (int i = 0; i < npars; ++i) { | |
| 1170 | - values[i] = 0.0; | |
| 1171 | - if (wrk_grad[i] != 0.0 && !gammalib::is_infinite(wrk_grad[i])) { | |
| 1172 | - inx[ndev] = i; | |
| 1169 | + for (int ipar = 0; ipar < npars; ++ipar) { | |
| 1170 | + values[ipar] = 0.0; | |
| 1171 | + if (wrk_grad[ipar] != 0.0 && !gammalib::is_infinite(wrk_grad[ipar])) { | |
| 1172 | + inx[ndev] = ipar; | |
| 1173 | 1173 | ndev++; |
| 1174 | 1174 | } |
| 1175 | + /* | |
| 1176 | + else if gammalib::is_infinite(wrk_grad[ipar]) { | |
| 1177 | + std::cout << "Infinite gradient for ipar=" << ipar << std::endl; | |
| 1178 | + } | |
| 1179 | + */ | |
| 1175 | 1180 | } |
| 1181 | +//std::cout << ndev << std::endl; | |
| 1176 | 1182 | |
| 1177 | 1183 | // Update gradient vector and curvature matrix. To avoid |
| 1178 | 1184 | // unneccessary computations we distinguish the case where |
| ... | ... | @@ -1354,10 +1360,10 @@ double GObservation::likelihood_gaussian_binned(const GModels& models, |
| 1354 | 1360 | // Create index array of non-zero derivatives and initialise working |
| 1355 | 1361 | // array |
| 1356 | 1362 | int ndev = 0; |
| 1357 | - for (int i = 0; i < npars; ++i) { | |
| 1358 | - values[i] = 0.0; | |
| 1359 | - if (wrk_grad[i] != 0.0 && !gammalib::is_infinite(wrk_grad[i])) { | |
| 1360 | - inx[ndev] = i; | |
| 1363 | + for (int ipar = 0; ipar < npars; ++ipar) { | |
| 1364 | + values[ipar] = 0.0; | |
| 1365 | + if (wrk_grad[ipar] != 0.0 && !gammalib::is_infinite(wrk_grad[ipar])) { | |
| 1366 | + inx[ndev] = ipar; | |
| 1361 | 1367 | ndev++; |
| 1362 | 1368 | } |
| 1363 | 1369 | } | ... | ... |
src/obs/GResponse.cpp
| ... | ... | @@ -203,8 +203,39 @@ double GResponse::convolve(const GModelSky& model, |
| 203 | 203 | // Retrieve true energy boundaries |
| 204 | 204 | GEbounds ebounds = this->ebounds(event.energy()); |
| 205 | 205 | |
| 206 | + // Determine size of result array | |
| 207 | + int size = 1; | |
| 208 | + if (grad) { | |
| 209 | + if (model.spectral() != NULL) { | |
| 210 | + for (int i = 0; i < model.spectral()->size(); ++i) { | |
| 211 | + GModelPar& par = (*(model.spectral()))[i]; | |
| 212 | + if (par.is_free() && par.has_grad()) { | |
| 213 | + size++; | |
| 214 | + } | |
| 215 | + } | |
| 216 | + } | |
| 217 | + if (model.temporal() != NULL) { | |
| 218 | + for (int i = 0; i < model.temporal()->size(); ++i) { | |
| 219 | + GModelPar& par = (*(model.temporal()))[i]; | |
| 220 | + if (par.is_free() && par.has_grad()) { | |
| 221 | + size++; | |
| 222 | + } | |
| 223 | + } | |
| 224 | + } | |
| 225 | + if (model.has_scales()) { | |
| 226 | + for (int i = 0; i < model.scales(); ++i) { | |
| 227 | + GModelPar& par = const_cast<GModelPar&>(model.scale(i)); | |
| 228 | + if (par.name() == obs.instrument()) { | |
| 229 | + if (par.is_free() && par.has_grad()) { | |
| 230 | + size++; | |
| 231 | + } | |
| 232 | + } | |
| 233 | + } | |
| 234 | + } | |
| 235 | + } | |
| 236 | + | |
| 206 | 237 | // Initialise Ndarray array |
| 207 | - GNdarray array; | |
| 238 | + GNdarray array(size); | |
| 208 | 239 | |
| 209 | 240 | // Loop over all boundaries |
| 210 | 241 | for (int i = 0; i < ebounds.size(); ++i) { |
| ... | ... | @@ -224,12 +255,7 @@ double GResponse::convolve(const GModelSky& model, |
| 224 | 255 | integral.fixed_iter(iter); |
| 225 | 256 | |
| 226 | 257 | // Do Romberg integration |
| 227 | - if (array.size() == 0) { | |
| 228 | - array = integral.romberg(etrue_min, etrue_max); | |
| 229 | - } | |
| 230 | - else { | |
| 231 | - array += integral.romberg(etrue_min, etrue_max); | |
| 232 | - } | |
| 258 | + array += integral.romberg(etrue_min, etrue_max); | |
| 233 | 259 | |
| 234 | 260 | } // endif: interval was valid |
| 235 | 261 | ... | ... |