Commit 8e4fe544e63c98b036b7955b820e5c775f2ab640
1 parent
e0888fb7
Fix energy dispersion bug after implementation of analytical gradients (#3403)
Showing
5 changed files
with
54 additions
and
22 deletions
src/model/GModelSpatialDiffuse.cpp
| ... | ... | @@ -65,7 +65,7 @@ GModelSpatialDiffuse::GModelSpatialDiffuse(void) : GModelSpatial() |
| 65 | 65 | * @param[in] model Diffuse spatial model. |
| 66 | 66 | ***************************************************************************/ |
| 67 | 67 | GModelSpatialDiffuse::GModelSpatialDiffuse(const GModelSpatialDiffuse& model) : |
| 68 | - GModelSpatial() | |
| 68 | + GModelSpatial(model) | |
| 69 | 69 | { |
| 70 | 70 | // Initialise members |
| 71 | 71 | init_members(); | ... | ... |
src/model/GModelSpatialElliptical.cpp
| ... | ... | @@ -89,7 +89,7 @@ GModelSpatialElliptical::GModelSpatialElliptical(const GXmlElement& xml) : |
| 89 | 89 | * @param[in] model Elliptical spatial model. |
| 90 | 90 | ***************************************************************************/ |
| 91 | 91 | GModelSpatialElliptical::GModelSpatialElliptical(const GModelSpatialElliptical& model) : |
| 92 | - GModelSpatial() | |
| 92 | + GModelSpatial(model) | |
| 93 | 93 | { |
| 94 | 94 | // Initialise members |
| 95 | 95 | init_members(); | ... | ... |
src/model/GModelSpatialRadial.cpp
| ... | ... | @@ -90,7 +90,7 @@ GModelSpatialRadial::GModelSpatialRadial(const GXmlElement& xml) : |
| 90 | 90 | * @param[in] model Radial spatial model. |
| 91 | 91 | ***************************************************************************/ |
| 92 | 92 | GModelSpatialRadial::GModelSpatialRadial(const GModelSpatialRadial& model) : |
| 93 | - GModelSpatial() | |
| 93 | + GModelSpatial(model) | |
| 94 | 94 | { |
| 95 | 95 | // Initialise members |
| 96 | 96 | init_members(); | ... | ... |
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 | ... | ... |