Commit ee704e03e752e4e9900de6e19d795dd805f2d162

Authored by Jürgen Knödlseder
2 parents ca0d79f4 8e4fe544

Merge branch '3403-ctools-unit-test-failure' into integration

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&amp; 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&amp; 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&amp; 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&amp; 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  
... ...