Commit eb9b3f229ebdd450eec790176fa9b16515e54cc3
1 parent
6642ae65
Add parameter and methods for accessing generated GFits object in ctskymap
This enables accessing the generated skymaps without calling 'save()' first
Showing
4 changed files
with
62 additions
and
32 deletions
pyext/ctskymap.i
| ... | ... | @@ -49,6 +49,7 @@ public: |
| 49 | 49 | void save(void); |
| 50 | 50 | void publish(const std::string& name = ""); |
| 51 | 51 | const GSkyMap& skymap(void) const; |
| 52 | + const GFits& fits(void) const; | |
| 52 | 53 | void exclusion_map(const GSkyRegionMap& exclusion_map); |
| 53 | 54 | GSkyRegionMap exclusion_map(void) const; |
| 54 | 55 | }; | ... | ... |
src/ctskymap/ctskymap.cpp
| ... | ... | @@ -240,6 +240,9 @@ void ctskymap::run(void) |
| 240 | 240 | publish(); |
| 241 | 241 | } |
| 242 | 242 | |
| 243 | + // Create the output fits object | |
| 244 | + construct_fits(); | |
| 245 | + | |
| 243 | 246 | // Return |
| 244 | 247 | return; |
| 245 | 248 | } |
| ... | ... | @@ -262,51 +265,60 @@ void ctskymap::save(void) |
| 262 | 265 | // Get sky map filename |
| 263 | 266 | m_outmap = (*this)["outmap"].filename(); |
| 264 | 267 | |
| 265 | - // Create empty FITS file | |
| 266 | - GFits fits; | |
| 268 | + // Save FITS file to disk | |
| 269 | + m_fits.saveto(m_outmap, clobber()); | |
| 267 | 270 | |
| 268 | - // Write sky map into FITS file | |
| 269 | - write_map(fits, m_skymap, "SKYMAP"); | |
| 271 | + } // endif: filename and map were not empty | |
| 270 | 272 | |
| 271 | - // If background subtraction is requested then write the background map, | |
| 272 | - // the significance map, the counts map and the acceptance map to the | |
| 273 | - // FITS file | |
| 274 | - if (m_bkgsubtract != "NONE") { | |
| 273 | + // Write into logger what has been done | |
| 274 | + std::string fname = (m_outmap.is_empty()) ? "NONE" : m_outmap.url(); | |
| 275 | + if (m_skymap.is_empty()) { | |
| 276 | + fname.append(" (map is empty, no file created)"); | |
| 277 | + } | |
| 278 | + log_value(NORMAL, "Sky map file", fname); | |
| 275 | 279 | |
| 276 | - // Write background map into FITS file | |
| 277 | - write_map(fits, m_bkgmap, "BACKGROUND"); | |
| 280 | + // Return | |
| 281 | + return; | |
| 282 | +} | |
| 278 | 283 | |
| 279 | 284 | |
| 280 | - // Write significance map into FITS file | |
| 281 | - write_map(fits, m_sigmap, "SIGNIFICANCE"); | |
| 285 | +/***********************************************************************//** | |
| 286 | + * @brief Construct GFits object consisting of all maps | |
| 287 | + * | |
| 288 | + * Assembles all of the skymaps into a GFits object. This object is saved | |
| 289 | + * when ctskymap::save() is called. the object can also be accessed by | |
| 290 | + * calling ctskymap::fits(). | |
| 291 | + ***************************************************************************/ | |
| 292 | +void ctskymap::construct_fits(void) | |
| 293 | +{ | |
| 294 | + // Write sky map into FITS object | |
| 295 | + write_map(m_fits, m_skymap, "SKYMAP"); | |
| 282 | 296 | |
| 283 | - // Write counts map into FITS file | |
| 284 | - write_map(fits, m_counts, "COUNTS"); | |
| 297 | + // If background subtraction is requested then write the background map, | |
| 298 | + // the significance map, the counts map and the acceptance map to the | |
| 299 | + // FITS file | |
| 300 | + if (m_bkgsubtract != "NONE") { | |
| 285 | 301 | |
| 286 | - // Write acceptance map into FITS file | |
| 287 | - write_map(fits, m_acceptance, "ACCEPTANCE"); | |
| 302 | + // Write background map into FITS file | |
| 303 | + write_map(m_fits, m_bkgmap, "BACKGROUND"); | |
| 288 | 304 | |
| 289 | - // If RING background subtraction is requested then write also | |
| 290 | - // the exclusion map to the FITS file | |
| 291 | - if (m_bkgsubtract == "RING") { | |
| 292 | - write_map(fits, m_exclmap, "EXCLUSION"); | |
| 293 | - } | |
| 305 | + // Write significance map into FITS file | |
| 306 | + write_map(m_fits, m_sigmap, "SIGNIFICANCE"); | |
| 294 | 307 | |
| 295 | - } // endif: background subtraction was requested | |
| 308 | + // Write counts map into FITS file | |
| 309 | + write_map(m_fits, m_counts, "COUNTS"); | |
| 296 | 310 | |
| 297 | - // Save FITS file to disk | |
| 298 | - fits.saveto(m_outmap, clobber()); | |
| 311 | + // Write acceptance map into FITS file | |
| 312 | + write_map(m_fits, m_acceptance, "ACCEPTANCE"); | |
| 299 | 313 | |
| 300 | - } // endif: filename and map were not empty | |
| 314 | + // If RING background subtraction is requested then write also | |
| 315 | + // the exclusion map to the FITS file | |
| 316 | + if (m_bkgsubtract == "RING") { | |
| 317 | + write_map(m_fits, m_exclmap, "EXCLUSION"); | |
| 318 | + } | |
| 301 | 319 | |
| 302 | - // Write into logger what has been done | |
| 303 | - std::string fname = (m_outmap.is_empty()) ? "NONE" : m_outmap.url(); | |
| 304 | - if (m_skymap.is_empty()) { | |
| 305 | - fname.append(" (map is empty, no file created)"); | |
| 306 | - } | |
| 307 | - log_value(NORMAL, "Sky map file", fname); | |
| 320 | + } // endif: background subtraction was requested | |
| 308 | 321 | |
| 309 | - // Return | |
| 310 | 322 | return; |
| 311 | 323 | } |
| 312 | 324 | |
| ... | ... | @@ -372,6 +384,7 @@ void ctskymap::init_members(void) |
| 372 | 384 | m_counts.clear(); |
| 373 | 385 | m_acceptance.clear(); |
| 374 | 386 | m_exclmap.clear(); |
| 387 | + m_fits.clear(); | |
| 375 | 388 | |
| 376 | 389 | // Initialise cache |
| 377 | 390 | m_solidangle.clear(); |
| ... | ... | @@ -415,6 +428,7 @@ void ctskymap::copy_members(const ctskymap& app) |
| 415 | 428 | m_counts = app.m_counts; |
| 416 | 429 | m_acceptance = app.m_acceptance; |
| 417 | 430 | m_exclmap = app.m_exclmap; |
| 431 | + m_fits = app.m_fits; | |
| 418 | 432 | |
| 419 | 433 | // Copy cache |
| 420 | 434 | m_solidangle = app.m_solidangle; | ... | ... |
src/ctskymap/ctskymap.hpp
| ... | ... | @@ -61,6 +61,7 @@ public: |
| 61 | 61 | void save(void); |
| 62 | 62 | void publish(const std::string& name = ""); |
| 63 | 63 | const GSkyMap& skymap(void) const; |
| 64 | + const GFits& fits(void) const; | |
| 64 | 65 | void exclusion_map(const GSkyRegionMap& exclusion_map); |
| 65 | 66 | GSkyRegionMap exclusion_map(void) const; |
| 66 | 67 | |
| ... | ... | @@ -87,6 +88,7 @@ protected: |
| 87 | 88 | double& non, |
| 88 | 89 | double& noff, |
| 89 | 90 | double& alpha); |
| 91 | + void construct_fits(void); | |
| 90 | 92 | void ring_bounding_box(const int& ipixel, int& ix1, int& ix2, |
| 91 | 93 | int& iy1, int& iy2) const; |
| 92 | 94 | GSkyMap ring_convolve(const GSkyMap& map, const double& rmin, |
| ... | ... | @@ -123,6 +125,7 @@ protected: |
| 123 | 125 | GSkyMap m_counts; //!< Counts map |
| 124 | 126 | GSkyMap m_acceptance; //!< Acceptance map |
| 125 | 127 | GSkyMap m_exclmap; //!< Exclusion map for RING background |
| 128 | + GFits m_fits; //!< Output GFits object | |
| 126 | 129 | |
| 127 | 130 | // Caching variables to prevent multiple computations of the same thing |
| 128 | 131 | std::vector<double> m_solidangle; //!< Cached pixel solid angles |
| ... | ... | @@ -145,6 +148,13 @@ const GSkyMap& ctskymap::skymap(void) const |
| 145 | 148 | } |
| 146 | 149 | |
| 147 | 150 | |
| 151 | +inline | |
| 152 | +const GFits& ctskymap::fits(void) const | |
| 153 | +{ | |
| 154 | + return m_fits; | |
| 155 | +} | |
| 156 | + | |
| 157 | + | |
| 148 | 158 | /***********************************************************************//** |
| 149 | 159 | * @brief Set exclusion region map |
| 150 | 160 | * | ... | ... |
test/test_ctskymap.py
| ... | ... | @@ -290,6 +290,11 @@ class Test(test): |
| 290 | 290 | self._check_result_file('ctskymap_ring_py1.fits[BACKGROUND]', 10, 10) |
| 291 | 291 | self._check_result_file('ctskymap_ring_py1.fits[SIGNIFICANCE]', 10, 10) |
| 292 | 292 | |
| 293 | + # Check generated fits object | |
| 294 | + self._check_map(gammalib.GSkyMap(skymap.fits().image('SKYMAP')), nx=10, ny=10) | |
| 295 | + self._check_map(gammalib.GSkyMap(skymap.fits().image('BACKGROUND')), nx=10, ny=10) | |
| 296 | + self._check_map(gammalib.GSkyMap(skymap.fits().image('SIGNIFICANCE')), nx=10, ny=10) | |
| 297 | + | |
| 293 | 298 | # Test iterative RING background subtraction |
| 294 | 299 | skymap = ctools.ctskymap() |
| 295 | 300 | skymap['inobs'] = self._events | ... | ... |