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,7 +65,7 @@ GModelSpatialDiffuse::GModelSpatialDiffuse(void) : GModelSpatial() | ||
| 65 | * @param[in] model Diffuse spatial model. | 65 | * @param[in] model Diffuse spatial model. |
| 66 | ***************************************************************************/ | 66 | ***************************************************************************/ |
| 67 | GModelSpatialDiffuse::GModelSpatialDiffuse(const GModelSpatialDiffuse& model) : | 67 | GModelSpatialDiffuse::GModelSpatialDiffuse(const GModelSpatialDiffuse& model) : |
| 68 | - GModelSpatial() | 68 | + GModelSpatial(model) |
| 69 | { | 69 | { |
| 70 | // Initialise members | 70 | // Initialise members |
| 71 | init_members(); | 71 | init_members(); |
src/model/GModelSpatialElliptical.cpp
| @@ -89,7 +89,7 @@ GModelSpatialElliptical::GModelSpatialElliptical(const GXmlElement& xml) : | @@ -89,7 +89,7 @@ GModelSpatialElliptical::GModelSpatialElliptical(const GXmlElement& xml) : | ||
| 89 | * @param[in] model Elliptical spatial model. | 89 | * @param[in] model Elliptical spatial model. |
| 90 | ***************************************************************************/ | 90 | ***************************************************************************/ |
| 91 | GModelSpatialElliptical::GModelSpatialElliptical(const GModelSpatialElliptical& model) : | 91 | GModelSpatialElliptical::GModelSpatialElliptical(const GModelSpatialElliptical& model) : |
| 92 | - GModelSpatial() | 92 | + GModelSpatial(model) |
| 93 | { | 93 | { |
| 94 | // Initialise members | 94 | // Initialise members |
| 95 | init_members(); | 95 | init_members(); |
src/model/GModelSpatialRadial.cpp
| @@ -90,7 +90,7 @@ GModelSpatialRadial::GModelSpatialRadial(const GXmlElement& xml) : | @@ -90,7 +90,7 @@ GModelSpatialRadial::GModelSpatialRadial(const GXmlElement& xml) : | ||
| 90 | * @param[in] model Radial spatial model. | 90 | * @param[in] model Radial spatial model. |
| 91 | ***************************************************************************/ | 91 | ***************************************************************************/ |
| 92 | GModelSpatialRadial::GModelSpatialRadial(const GModelSpatialRadial& model) : | 92 | GModelSpatialRadial::GModelSpatialRadial(const GModelSpatialRadial& model) : |
| 93 | - GModelSpatial() | 93 | + GModelSpatial(model) |
| 94 | { | 94 | { |
| 95 | // Initialise members | 95 | // Initialise members |
| 96 | init_members(); | 96 | init_members(); |
src/obs/GObservation.cpp
| @@ -1006,10 +1006,10 @@ double GObservation::likelihood_poisson_unbinned(const GModels& models, | @@ -1006,10 +1006,10 @@ double GObservation::likelihood_poisson_unbinned(const GModels& models, | ||
| 1006 | // Create index array of non-zero derivatives and initialise working | 1006 | // Create index array of non-zero derivatives and initialise working |
| 1007 | // array | 1007 | // array |
| 1008 | int ndev = 0; | 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 | ndev++; | 1013 | ndev++; |
| 1014 | } | 1014 | } |
| 1015 | } | 1015 | } |
| @@ -1166,13 +1166,19 @@ double GObservation::likelihood_poisson_binned(const GModels& models, | @@ -1166,13 +1166,19 @@ double GObservation::likelihood_poisson_binned(const GModels& models, | ||
| 1166 | // Create index array of non-zero derivatives and initialise working | 1166 | // Create index array of non-zero derivatives and initialise working |
| 1167 | // array | 1167 | // array |
| 1168 | int ndev = 0; | 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 | ndev++; | 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 | // Update gradient vector and curvature matrix. To avoid | 1183 | // Update gradient vector and curvature matrix. To avoid |
| 1178 | // unneccessary computations we distinguish the case where | 1184 | // unneccessary computations we distinguish the case where |
| @@ -1354,10 +1360,10 @@ double GObservation::likelihood_gaussian_binned(const GModels& models, | @@ -1354,10 +1360,10 @@ double GObservation::likelihood_gaussian_binned(const GModels& models, | ||
| 1354 | // Create index array of non-zero derivatives and initialise working | 1360 | // Create index array of non-zero derivatives and initialise working |
| 1355 | // array | 1361 | // array |
| 1356 | int ndev = 0; | 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 | ndev++; | 1367 | ndev++; |
| 1362 | } | 1368 | } |
| 1363 | } | 1369 | } |
src/obs/GResponse.cpp
| @@ -203,8 +203,39 @@ double GResponse::convolve(const GModelSky& model, | @@ -203,8 +203,39 @@ double GResponse::convolve(const GModelSky& model, | ||
| 203 | // Retrieve true energy boundaries | 203 | // Retrieve true energy boundaries |
| 204 | GEbounds ebounds = this->ebounds(event.energy()); | 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 | // Initialise Ndarray array | 237 | // Initialise Ndarray array |
| 207 | - GNdarray array; | 238 | + GNdarray array(size); |
| 208 | 239 | ||
| 209 | // Loop over all boundaries | 240 | // Loop over all boundaries |
| 210 | for (int i = 0; i < ebounds.size(); ++i) { | 241 | for (int i = 0; i < ebounds.size(); ++i) { |
| @@ -224,12 +255,7 @@ double GResponse::convolve(const GModelSky& model, | @@ -224,12 +255,7 @@ double GResponse::convolve(const GModelSky& model, | ||
| 224 | integral.fixed_iter(iter); | 255 | integral.fixed_iter(iter); |
| 225 | 256 | ||
| 226 | // Do Romberg integration | 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 | } // endif: interval was valid | 260 | } // endif: interval was valid |
| 235 | 261 |