Commit e6d349bfe027c02228dd04f63f1cff22bf2eddfc

Authored by Jürgen Knödlseder
1 parent 8d19bf6c

Support of map cubes lying outside RoI in ctobssim

ChangeLog
1   -2017-03-24
  1 +2017-03-28
2 2  
3 3 * Version 1.3.0 released
4 4 ========================
5 5  
  6 + Support of map cubes lying outside RoI in ctobssim
6 7 Support energy boundary FITS file in ctmapcube (#1978)
7 8 Add csebins script (#1976)
8 9 Consider RoI in ctskymap and use numerical integration for IRF (#1975)
... ...
1 1 New Features and Important Changes in ctools 1.3.0.dev1
2 2  
3   -24 March 2017
  3 +28 March 2017
4 4  
5 5  
6 6 Introduction
... ... @@ -27,7 +27,10 @@ so that writing commas instead of dots is avoided (#1370).
27 27  
28 28 ctobssim - CTA observation simulation
29 29 -------------------------------------
30   -None
  30 +The tool now supports map cubes that are not overlapping with the RoI.
  31 +In this case, no spectral nodes exist and before the spectral flux()
  32 +method called in ctobssim::get_model_flux() was throwing an exception.
  33 +Now, for map cubes outside the RoI the flux is set to zero.
31 34  
32 35  
33 36 ctselect - CTA event selection
... ...
src/ctobssim/ctobssim.cpp
... ... @@ -722,6 +722,11 @@ void ctobssim::simulate_source(GCTAObservation* obs,
722 722 GRan& ran,
723 723 GLog* wrklog)
724 724 {
  725 + // Debug code: signal that we step into the simulate_source method
  726 + #if defined(G_SOURCE_DEBUG)
  727 + std::cout << "ctobssim::simulate_source: in" << std::endl;
  728 + #endif
  729 +
725 730 // Continue only if observation pointer is valid
726 731 if (obs != NULL) {
727 732  
... ... @@ -898,6 +903,11 @@ void ctobssim::simulate_source(GCTAObservation* obs,
898 903  
899 904 } // endif: observation pointer was valid
900 905  
  906 + // Debug code: signal that we are down with the simulate_source method
  907 + #if defined(G_SOURCE_DEBUG)
  908 + std::cout << "ctobssim::simulate_source: out" << std::endl;
  909 + #endif
  910 +
901 911 // Return
902 912 return;
903 913 }
... ... @@ -946,6 +956,14 @@ void ctobssim::simulate_interval(GCTAObservation* obs,
946 956 std::vector<int>& nphotons,
947 957 std::vector<int>& nevents)
948 958 {
  959 + // Debug code: signal that we step into the simulate_interval method
  960 + #if defined(G_SOURCE_DEBUG)
  961 + std::cout << "ctobssim::simulate_interval: in";
  962 + std::cout << " Etrue=[" << etrue_min << "," << etrue_max << "]";
  963 + std::cout << " Ereco=[" << ereco_min << "," << ereco_max << "]";
  964 + std::cout << std::endl;
  965 + #endif
  966 +
949 967 // Loop over all models
950 968 for (int i = 0; i < models.size(); ++i) {
951 969  
... ... @@ -1084,6 +1102,11 @@ void ctobssim::simulate_interval(GCTAObservation* obs,
1084 1102  
1085 1103 } // endfor: looped over models
1086 1104  
  1105 + // Debug code: signal that we are down with the simulate_interval method
  1106 + #if defined(G_SOURCE_DEBUG)
  1107 + std::cout << "ctobssim::simulate_interval: out" << std::endl;
  1108 + #endif
  1109 +
1087 1110 // Return
1088 1111 return;
1089 1112 }
... ... @@ -1289,6 +1312,13 @@ double ctobssim::get_model_flux(const GModelSky* model,
1289 1312 const int& indent,
1290 1313 GLog* wrklog)
1291 1314 {
  1315 + // Debug code: signal that we step into the get_model_flux method
  1316 + #if defined(G_SOURCE_DEBUG)
  1317 + std::cout << "ctobssim::get_model_flux: in";
  1318 + std::cout << " Etrue=[" << emin << "," << emax << "]";
  1319 + std::cout << std::endl;
  1320 + #endif
  1321 +
1292 1322 // Initialise flux
1293 1323 double flux = 0.0;
1294 1324  
... ... @@ -1329,19 +1359,20 @@ double ctobssim::get_model_flux(const GModelSky* model,
1329 1359 // function spectral model that is the product of the diffuse
1330 1360 // cube node function and the spectral model evaluated at the
1331 1361 // energies of the node function
1332   - GModelSpatialDiffuseCube* cube = dynamic_cast<GModelSpatialDiffuseCube*>(model->spatial());
  1362 + GModelSpatialDiffuseCube* cube =
  1363 + dynamic_cast<GModelSpatialDiffuseCube*>(model->spatial());
1333 1364 if (cube != NULL) {
1334 1365  
1335 1366 // Set MC cone
1336 1367 cube->set_mc_cone(centre, radius);
1337 1368  
1338 1369 // Allocate node function to replace the spectral component
1339   - GModelSpectralNodes* nodes = new GModelSpectralNodes(cube->spectrum());
  1370 + GModelSpectralNodes* nodes =
  1371 + new GModelSpectralNodes(cube->spectrum());
1340 1372 for (int i = 0; i < nodes->nodes(); ++i) {
1341 1373 GEnergy energy = nodes->energy(i);
1342   - GTime time; // Dummy time
1343 1374 double intensity = nodes->intensity(i);
1344   - double value = spectral->eval(energy, time);
  1375 + double value = spectral->eval(energy);
1345 1376 nodes->intensity(i, value * intensity);
1346 1377 }
1347 1378  
... ... @@ -1351,11 +1382,18 @@ double ctobssim::get_model_flux(const GModelSky* model,
1351 1382 // Set the spectral model pointer to the node function
1352 1383 spectral = nodes;
1353 1384  
  1385 + // Kluge: if there are no nodes then the spectral->flux method
  1386 + // will throw an exception. We therefore set here the use_model
  1387 + // flag to false in case that there are no spectral nodes
  1388 + if (nodes->nodes() == 0) {
  1389 + use_model = false;
  1390 + }
  1391 +
1354 1392 } // endif: spatial model was a diffuse cube
1355 1393  
1356 1394 // Compute flux within [emin, emax] in model from spectral
1357 1395 // component (units: ph/cm2/s)
1358   - double flux0 = spectral->flux(emin, emax);
  1396 + double flux0 = (use_model) ? spectral->flux(emin, emax) : 0.0;
1359 1397 flux = flux0 * norm;
1360 1398  
1361 1399 // Dump flux
... ... @@ -1379,6 +1417,11 @@ double ctobssim::get_model_flux(const GModelSky* model,
1379 1417  
1380 1418 } // endif: model overlaps with simulation region
1381 1419  
  1420 + // Debug code: signal that we step out of the get_model_flux method
  1421 + #if defined(G_SOURCE_DEBUG)
  1422 + std::cout << "ctobssim::get_model_flux: in" << std::endl;
  1423 + #endif
  1424 +
1382 1425 // Return model flux
1383 1426 return flux;
1384 1427 }
... ...