Commit 8e4fe544e63c98b036b7955b820e5c775f2ab640

Authored by Jürgen Knödlseder
1 parent e0888fb7

Fix energy dispersion bug after implementation of analytical gradients (#3403)

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&amp; models, @@ -1166,13 +1166,19 @@ double GObservation::likelihood_poisson_binned(const GModels&amp; 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&amp; models, @@ -1354,10 +1360,10 @@ double GObservation::likelihood_gaussian_binned(const GModels&amp; 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&amp; model, @@ -203,8 +203,39 @@ double GResponse::convolve(const GModelSky&amp; 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&amp; model, @@ -224,12 +255,7 @@ double GResponse::convolve(const GModelSky&amp; 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