Commit e991511e54f5ee19e93596921bb0166b32c91af5
1 parent
6124ca81
Adapt to ctools coding conventions, clean-up and test code, and add a unit test.
Showing
11 changed files
with
170 additions
and
154 deletions
AUTHORS
| @@ -2,3 +2,4 @@ Juergen Knoedlseder (jurgen.knodlseder@irap.omp.eu) | @@ -2,3 +2,4 @@ Juergen Knoedlseder (jurgen.knodlseder@irap.omp.eu) | ||
| 2 | Jean-Baptiste Cayrou (cayrou@etud.insa-toulouse.fr) | 2 | Jean-Baptiste Cayrou (cayrou@etud.insa-toulouse.fr) |
| 3 | Christoph Deil (Christoph.Deil@mpi-hd.mpg.de) | 3 | Christoph Deil (Christoph.Deil@mpi-hd.mpg.de) |
| 4 | Michael Mayer (michael.mayer@desy.de) | 4 | Michael Mayer (michael.mayer@desy.de) |
| 5 | +Chia-Chun Lu (Chia-Chun.Lu@mpi-hd.mpg.de) |
ChangeLog
| 1 | -2014-07-18 Juergen Knoedlseder <jurgen.knodlseder@irap.omp.eu> | 1 | +2014-07-20 Juergen Knoedlseder <jurgen.knodlseder@irap.omp.eu> |
| 2 | 2 | ||
| 3 | * Version 0.8.0 released | 3 | * Version 0.8.0 released |
| 4 | ======================== | 4 | ======================== |
| @@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
| 6 | Adapt to GammaLib 0.9.0 interface | 6 | Adapt to GammaLib 0.9.0 interface |
| 7 | ctbin now always merges event lists into a single counts cube | 7 | ctbin now always merges event lists into a single counts cube |
| 8 | Add ctexpcube tool | 8 | Add ctexpcube tool |
| 9 | + Add ctcubemask tool | ||
| 9 | Support energy dispersion in ctobssim, ctlike and ctmodel | 10 | Support energy dispersion in ctobssim, ctlike and ctmodel |
| 10 | Correct ctobssim for thread safety | 11 | Correct ctobssim for thread safety |
| 11 | Enhance documentation | 12 | Enhance documentation |
NEWS
| @@ -2,7 +2,7 @@ New Features and Important Changes in ctools 00-08-00 | @@ -2,7 +2,7 @@ New Features and Important Changes in ctools 00-08-00 | ||
| 2 | 2 | ||
| 3 | Author(s) : Juergen Knoedlseder | 3 | Author(s) : Juergen Knoedlseder |
| 4 | 4 | ||
| 5 | -18 July 2014 | 5 | +20 July 2014 |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | 1. Introduction | 8 | 1. Introduction |
| @@ -88,12 +88,19 @@ file. The cube definition may be taken from a counts map or may be | @@ -88,12 +88,19 @@ file. The cube definition may be taken from a counts map or may be | ||
| 88 | specified by user parameters. | 88 | specified by user parameters. |
| 89 | 89 | ||
| 90 | 90 | ||
| 91 | -11. Examples | 91 | +11. ctcubemask - CTA cube filtering |
| 92 | +----------------------------------- | ||
| 93 | +The first version of the ctcubemask tool is included in the release. | ||
| 94 | +ctcubemask allows filtering of bins in a counts cube by setting the | ||
| 95 | +bin content to -1. Filtering can be done by energy, for a circular | ||
| 96 | +Region of Interest (ROI) or using ds9 exclusion regions. | ||
| 97 | + | ||
| 98 | +12. Examples | ||
| 92 | ------------ | 99 | ------------ |
| 93 | None | 100 | None |
| 94 | 101 | ||
| 95 | 102 | ||
| 96 | -12. Scripts | 103 | +13. Scripts |
| 97 | ----------- | 104 | ----------- |
| 98 | Add logL and event statistics to cspull output file. | 105 | Add logL and event statistics to cspull output file. |
| 99 | 106 | ||
| @@ -102,11 +109,11 @@ Convert all tabs into spaces. | @@ -102,11 +109,11 @@ Convert all tabs into spaces. | ||
| 102 | The obsutils script has now been moved into the ctools module namespace. | 109 | The obsutils script has now been moved into the ctools module namespace. |
| 103 | 110 | ||
| 104 | 111 | ||
| 105 | -13. caldb | 112 | +14. caldb |
| 106 | --------- | 113 | --------- |
| 107 | None | 114 | None |
| 108 | 115 | ||
| 109 | 116 | ||
| 110 | -14. models | 117 | +15. models |
| 111 | ---------- | 118 | ---------- |
| 112 | None | 119 | None |
configure.ac
| @@ -883,6 +883,7 @@ AC_CONFIG_FILES([Makefile | @@ -883,6 +883,7 @@ AC_CONFIG_FILES([Makefile | ||
| 883 | src/ctskymap/Makefile | 883 | src/ctskymap/Makefile |
| 884 | src/ctselect/Makefile | 884 | src/ctselect/Makefile |
| 885 | src/ctexpcube/Makefile | 885 | src/ctexpcube/Makefile |
| 886 | + src/ctcubemask/Makefile | ||
| 886 | src/ctools-setup | 887 | src/ctools-setup |
| 887 | test/Makefile | 888 | test/Makefile |
| 888 | test/test_cscripts.sh | 889 | test/test_cscripts.sh |
pyext/ctcubemask.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | - * ctcubemask - CTA mask cube tool * | 2 | + * ctcubemask.i - CTA mask cube tool * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | * copyright (C) 2014 Chia-Chun Lu * | 4 | * copyright (C) 2014 Chia-Chun Lu * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| @@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
| 20 | ***************************************************************************/ | 20 | ***************************************************************************/ |
| 21 | /** | 21 | /** |
| 22 | * @file ctcubemask.i | 22 | * @file ctcubemask.i |
| 23 | - * @brief CTA data selection tool Python interface definition | 23 | + * @brief CTA mask cube interface definition |
| 24 | * @author Chia-Chun Lu | 24 | * @author Chia-Chun Lu |
| 25 | */ | 25 | */ |
| 26 | %{ | 26 | %{ |
| @@ -49,9 +49,9 @@ public: | @@ -49,9 +49,9 @@ public: | ||
| 49 | void execute(void); | 49 | void execute(void); |
| 50 | void run(void); | 50 | void run(void); |
| 51 | void save(void); | 51 | void save(void); |
| 52 | - GObservations& obs(void) { return m_obs; } | 52 | + GObservations& obs(void); |
| 53 | void get_parameters(void); | 53 | void get_parameters(void); |
| 54 | - void apply_mask(GCTAObservation* obs, const std::string& filename); | 54 | + void apply_mask(GCTAObservation* obs); |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | 57 |
src/Makefile.am
| @@ -12,7 +12,7 @@ SUBDIRS = ctbin \ | @@ -12,7 +12,7 @@ SUBDIRS = ctbin \ | ||
| 12 | ctselect \ | 12 | ctselect \ |
| 13 | ctskymap \ | 13 | ctskymap \ |
| 14 | ctexpcube \ | 14 | ctexpcube \ |
| 15 | - ctcubemask | 15 | + ctcubemask |
| 16 | 16 | ||
| 17 | # Scripts to be distributed | 17 | # Scripts to be distributed |
| 18 | scripts = ctools-setup \ | 18 | scripts = ctools-setup \ |
| @@ -31,7 +31,7 @@ libctools_la_LIBADD = ctbin/libctbin.la \ | @@ -31,7 +31,7 @@ libctools_la_LIBADD = ctbin/libctbin.la \ | ||
| 31 | ctselect/libctselect.la \ | 31 | ctselect/libctselect.la \ |
| 32 | ctskymap/libctskymap.la \ | 32 | ctskymap/libctskymap.la \ |
| 33 | ctexpcube/libctexpcube.la \ | 33 | ctexpcube/libctexpcube.la \ |
| 34 | - ctcubemask/libctcubemask.la | 34 | + ctcubemask/libctcubemask.la |
| 35 | 35 | ||
| 36 | # Distribute scripts | 36 | # Distribute scripts |
| 37 | EXTRA_DIST = $(scripts) | 37 | EXTRA_DIST = $(scripts) |
src/ctcubemask/ctcubemask.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | - * ctfilter - CTA cube filter tool * | 2 | + * ctcubemask.cpp - CTA cube filter tool * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | * copyright (C) 2014 by Chia-Chun Lu * | 4 | * copyright (C) 2014 by Chia-Chun Lu * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| @@ -34,9 +34,8 @@ | @@ -34,9 +34,8 @@ | ||
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | /* __ Method name definitions ____________________________________________ */ | 36 | /* __ Method name definitions ____________________________________________ */ |
| 37 | -#define G_RUN "ctcubemask::run()" | ||
| 38 | -#define G_APPLY_MASK "ctcubemask::apply_mask(GCTAObservation*,"\ | ||
| 39 | - "std::string&)" | 37 | +#define G_RUN "ctcubemask::run()" |
| 38 | +#define G_APPLY_MASK "ctcubemask::apply_mask(GCTAObservation*)" | ||
| 40 | 39 | ||
| 41 | /* __ Debug definitions __________________________________________________ */ | 40 | /* __ Debug definitions __________________________________________________ */ |
| 42 | 41 | ||
| @@ -96,7 +95,7 @@ ctcubemask::ctcubemask(GObservations obs) : GApplication(CTCUBEMASK_NAME, CTCUBE | @@ -96,7 +95,7 @@ ctcubemask::ctcubemask(GObservations obs) : GApplication(CTCUBEMASK_NAME, CTCUBE | ||
| 96 | * @param[in] argv Array of command line arguments. | 95 | * @param[in] argv Array of command line arguments. |
| 97 | ***************************************************************************/ | 96 | ***************************************************************************/ |
| 98 | ctcubemask::ctcubemask(int argc, char *argv[]) : | 97 | ctcubemask::ctcubemask(int argc, char *argv[]) : |
| 99 | - GApplication(CTCUBEMASK_NAME, CTCUBEMASK_VERSION, argc, argv) | 98 | + GApplication(CTCUBEMASK_NAME, CTCUBEMASK_VERSION, argc, argv) |
| 100 | { | 99 | { |
| 101 | // Initialise members | 100 | // Initialise members |
| 102 | init_members(); | 101 | init_members(); |
| @@ -151,7 +150,7 @@ ctcubemask::~ctcubemask(void) | @@ -151,7 +150,7 @@ ctcubemask::~ctcubemask(void) | ||
| 151 | * | 150 | * |
| 152 | * @param[in] app Application. | 151 | * @param[in] app Application. |
| 153 | ***************************************************************************/ | 152 | ***************************************************************************/ |
| 154 | -ctcubemask& ctcubemask::operator= (const ctcubemask& app) | 153 | +ctcubemask& ctcubemask::operator=(const ctcubemask& app) |
| 155 | { | 154 | { |
| 156 | // Execute only if object is not identical | 155 | // Execute only if object is not identical |
| 157 | if (this != &app) { | 156 | if (this != &app) { |
| @@ -287,33 +286,9 @@ void ctcubemask::run(void) | @@ -287,33 +286,9 @@ void ctcubemask::run(void) | ||
| 287 | // Save event file name (for possible saving) | 286 | // Save event file name (for possible saving) |
| 288 | m_infiles[i] = obs->eventfile(); | 287 | m_infiles[i] = obs->eventfile(); |
| 289 | 288 | ||
| 290 | - // Get temporary file name | ||
| 291 | - std::string filename = std::tmpnam(NULL); | ||
| 292 | - | ||
| 293 | - // Save observation in temporary file | ||
| 294 | - obs->save(filename, true); | ||
| 295 | - | ||
| 296 | - // Log saved FITS file | ||
| 297 | - if (logExplicit()) { | ||
| 298 | - GFits tmpfile(filename); | ||
| 299 | - log << std::endl; | ||
| 300 | - log.header1("FITS file content of temporary file"); | ||
| 301 | - log << tmpfile << std::endl; | ||
| 302 | - tmpfile.close(); | ||
| 303 | - } | ||
| 304 | - | ||
| 305 | - // Check temporary file | ||
| 306 | - std::string message = check_infile(filename); | ||
| 307 | - if (message.length() > 0) { | ||
| 308 | - throw GException::app_error(G_RUN, message); | ||
| 309 | - } | ||
| 310 | - | ||
| 311 | // Load observation from temporary file, including event selection | 289 | // Load observation from temporary file, including event selection |
| 312 | - apply_mask(obs, filename); | 290 | + apply_mask(obs); |
| 313 | 291 | ||
| 314 | - // Remove temporary file | ||
| 315 | - std::remove(filename.c_str()); | ||
| 316 | - | ||
| 317 | } // endif: had a CTA observation | 292 | } // endif: had a CTA observation |
| 318 | 293 | ||
| 319 | } // endfor: looped over all observations | 294 | } // endfor: looped over all observations |
| @@ -409,7 +384,7 @@ void ctcubemask::get_parameters(void) | @@ -409,7 +384,7 @@ void ctcubemask::get_parameters(void) | ||
| 409 | try { | 384 | try { |
| 410 | 385 | ||
| 411 | // Load event list in CTA observation | 386 | // Load event list in CTA observation |
| 412 | - obs.load_binned(m_infile); | 387 | + obs.load(m_infile); |
| 413 | 388 | ||
| 414 | // Append CTA observation to container | 389 | // Append CTA observation to container |
| 415 | m_obs.append(obs); | 390 | m_obs.append(obs); |
| @@ -455,115 +430,119 @@ void ctcubemask::get_parameters(void) | @@ -455,115 +430,119 @@ void ctcubemask::get_parameters(void) | ||
| 455 | 430 | ||
| 456 | 431 | ||
| 457 | /***********************************************************************//** | 432 | /***********************************************************************//** |
| 458 | - * @brief Select events | 433 | + * @brief Apply mask to counts cube |
| 459 | * | 434 | * |
| 460 | * @param[in] obs CTA observation. | 435 | * @param[in] obs CTA observation. |
| 461 | - * @param[in] filename File name. | ||
| 462 | * | 436 | * |
| 463 | - * Select events from a FITS file by making use of the selection possibility | ||
| 464 | - * of the cfitsio library on loading a file. A selection string is created | ||
| 465 | - * from the specified criteria that is appended to the filename so that | ||
| 466 | - * cfitsio will automatically filter the event data. This selection string | ||
| 467 | - * is then applied when opening the FITS file. The opened FITS file is then | ||
| 468 | - * saved into a temporary file which is the loaded into the actual CTA | ||
| 469 | - * observation, overwriting the old CTA observation. The ROI, GTI and EBounds | ||
| 470 | - * of the CTA event list are then set accordingly to the specified selection. | ||
| 471 | - * Finally, the temporary file created during this process is removed. | ||
| 472 | - * | ||
| 473 | - * Good Time Intervals of the observation will be limited to the time | ||
| 474 | - * interval [m_tmin, m_tmax]. If m_tmin=m_tmax=0, no time selection is | ||
| 475 | - * performed. | ||
| 476 | - * | ||
| 477 | - * @todo Use INDEF instead of 0.0 for pointing as RA/DEC selection | 437 | + * Masks out event bins by setting their content to -1. |
| 478 | ***************************************************************************/ | 438 | ***************************************************************************/ |
| 479 | -void ctcubemask::apply_mask(GCTAObservation* obs, const std::string& filename) | 439 | +void ctcubemask::apply_mask(GCTAObservation* obs) |
| 480 | { | 440 | { |
| 481 | - std::cout<< "start appply filter" << std::endl; | ||
| 482 | - // Open FITS file | ||
| 483 | - GFits file(filename); | ||
| 484 | - GCTAEventCube* cube = (GCTAEventCube*) obs->events(); | ||
| 485 | - GEbounds ebounds = cube->ebounds(); | ||
| 486 | - GSkymap map = cube->map(); | ||
| 487 | - | ||
| 488 | - // Apply energy selection | ||
| 489 | - int e_idx1 = 0; | ||
| 490 | - int e_idx2 = 0; | ||
| 491 | - int n_ebin = ebounds.size(); | ||
| 492 | - | ||
| 493 | - // Loop over ebounds to find the first energy band | ||
| 494 | - for ( int i = 0 ; i < ebounds.size() ; i++){ | ||
| 495 | - double emin = ebounds.emin(i).TeV(); | ||
| 496 | - if ( emin > m_emin ){ | ||
| 497 | - e_idx1 = i; | ||
| 498 | - break; | ||
| 499 | - } | ||
| 500 | - } | 441 | + // Get pointer to CTA event cube. Continue only if we have a cube |
| 442 | + GCTAEventCube* cube = dynamic_cast<GCTAEventCube*>(const_cast<GEvents*>(obs->events())); | ||
| 443 | + if (cube != NULL) { | ||
| 444 | + | ||
| 445 | + // Extract event cube and energy boundaries | ||
| 446 | + GSkymap map = cube->map(); | ||
| 447 | + const GEbounds& ebounds = cube->ebounds(); | ||
| 448 | + | ||
| 449 | + // Initialise energy selection | ||
| 450 | + int n_ebin = ebounds.size(); | ||
| 451 | + int e_idx1 = 0; | ||
| 452 | + int e_idx2 = n_ebin; | ||
| 453 | + | ||
| 454 | + // Loop over ebounds to find the first valid energy band | ||
| 455 | + for (int i = 0; i < n_ebin; ++i) { | ||
| 456 | + double emin = ebounds.emin(i).TeV() + 1.0e-6; // Rounding tolerance | ||
| 457 | + if (emin >= m_emin) { | ||
| 458 | + e_idx1 = i; | ||
| 459 | + break; | ||
| 460 | + } | ||
| 461 | + } | ||
| 501 | 462 | ||
| 502 | - std::cout << "finish looping over ebounds to find 1st" << std::endl; | ||
| 503 | - std::cout << "e_ix1 " << e_idx1 << std::endl; | 463 | + // Loop over ebounds to find the last valid energy band |
| 464 | + for (int i = n_ebin-1; i >= 0; i--) { | ||
| 465 | + double emax = ebounds.emax(i).TeV() - 1.0e-6; // Rounding tolerance | ||
| 466 | + if (emax <= m_emax) { | ||
| 467 | + e_idx2 = i; | ||
| 468 | + break; | ||
| 469 | + } | ||
| 470 | + } | ||
| 504 | 471 | ||
| 505 | - // Loop over ebounds to find the last energy band | ||
| 506 | - for ( int i = ebounds.size()-1 ; i < ebounds.size() ; i--){ | ||
| 507 | - double emin = ebounds.emin(i).TeV(); | ||
| 508 | - if ( emin < m_emax ){ | ||
| 509 | - e_idx2 = i-1; | ||
| 510 | - break; | ||
| 511 | - } | ||
| 512 | - } | ||
| 513 | - std::cout << "finish looping over ebounds to find 1st" << std::endl; | ||
| 514 | - std::cout << "e_ix2 " << e_idx2 << std::endl; | ||
| 515 | - | ||
| 516 | - // Set all pixels outside the desired energy bands negative | ||
| 517 | - int npix = map.npix(); | ||
| 518 | - for ( int i = 0 ; i < e_idx1 ; i++){ | ||
| 519 | - for ( int pixel = 0 ; pixel < npix ; pixel++){ | ||
| 520 | - map(pixel,i) = -1; | ||
| 521 | - } | ||
| 522 | - } | ||
| 523 | - for ( int i = e_idx2 ; i < ebounds.size() ; i++){ | ||
| 524 | - for ( int pixel = 0 ; pixel < npix ; pixel++){ | ||
| 525 | - map(pixel,i) = -1; | ||
| 526 | - } | ||
| 527 | - } | ||
| 528 | - std::cout << "finish energy band filter" << std::endl; | ||
| 529 | - | ||
| 530 | - | ||
| 531 | - | ||
| 532 | - // Set all pixels inside the desired energy bands | ||
| 533 | - // but outside ROI or inside exlusion regions negative | ||
| 534 | - GSkyRegions regs = GSkyRegions(m_regfile); | ||
| 535 | - GSkyRegionCircle roi = GSkyRegionCircle(m_ra, m_dec, m_rad); | ||
| 536 | - for ( int i = e_idx1 ; i <= e_idx2 ; i++){ | ||
| 537 | - for ( int pixel = 0 ; pixel < npix ; pixel++){ | ||
| 538 | - GSkyDir dir = map.inx2dir(pixel); | ||
| 539 | - if ( roi.contains(dir) == false || | ||
| 540 | - regs.contains(dir) == true){ | ||
| 541 | - map(pixel,i) = -1; | ||
| 542 | - } | ||
| 543 | - } | ||
| 544 | - } | ||
| 545 | - std::cout << "finish roi selection" << std::endl; | ||
| 546 | - | ||
| 547 | - GCTAEventCube newcube( map, ebounds, obs->events()->gti()); | ||
| 548 | - obs->events(newcube); | 472 | + // Set all pixels outside the desired energy bands to -1.0 |
| 473 | + int npix = map.npix(); | ||
| 474 | + for (int i = 0; i < e_idx1; ++i) { | ||
| 475 | + for (int pixel = 0; pixel < npix; ++pixel) { | ||
| 476 | + map(pixel,i) = -1.0; | ||
| 477 | + } | ||
| 478 | + } | ||
| 479 | + for (int i = e_idx2 + 1; i < n_ebin; ++i) { | ||
| 480 | + for (int pixel = 0; pixel < npix; ++pixel) { | ||
| 481 | + map(pixel,i) = -1.0; | ||
| 482 | + } | ||
| 483 | + } | ||
| 549 | 484 | ||
| 550 | - // Log selected FITS file | ||
| 551 | - if (logExplicit()) { | ||
| 552 | - log << std::endl; | ||
| 553 | - log.header1("FITS file content after filter"); | ||
| 554 | - log << file << std::endl; | ||
| 555 | - } | 485 | + // Log selected energy band |
| 486 | + if (logTerse()) { | ||
| 487 | + log << gammalib::parformat("Selected energy band"); | ||
| 488 | + log << ebounds.emin(e_idx1).TeV() << " - "; | ||
| 489 | + log << ebounds.emax(e_idx2).TeV() << " TeV"; | ||
| 490 | + log << std::endl; | ||
| 491 | + } | ||
| 556 | 492 | ||
| 557 | - // Check if we have an IMAGE HDU | ||
| 558 | - if (!file.contains("IMAGE")) { | ||
| 559 | - std::string message = "No \"IMAGE\" extension found in FITS file. "; | ||
| 560 | - throw GException::app_error(G_APPLY_MASK, message); | ||
| 561 | - } | 493 | + // Set all pixels inside selected energy bands but outside ROI |
| 494 | + // to -1.0 | ||
| 495 | + GSkyRegionCircle roi(m_ra, m_dec, m_rad); | ||
| 496 | + for (int i = e_idx1; i <= e_idx2; ++i) { | ||
| 497 | + for (int pixel = 0; pixel < npix; ++pixel) { | ||
| 498 | + GSkyDir dir = map.inx2dir(pixel); | ||
| 499 | + if (!roi.contains(dir)) { | ||
| 500 | + map(pixel,i) = -1.0; | ||
| 501 | + } | ||
| 502 | + } | ||
| 503 | + } | ||
| 504 | + | ||
| 505 | + // Log selected energy band | ||
| 506 | + if (logTerse()) { | ||
| 507 | + log << gammalib::parformat("Selected ROI"); | ||
| 508 | + log << "RA=" << m_ra << " deg, "; | ||
| 509 | + log << "DEC=" << m_dec << " deg, "; | ||
| 510 | + log << "Radius=" << m_rad << " deg"; | ||
| 511 | + log << std::endl; | ||
| 512 | + } | ||
| 513 | + | ||
| 514 | + // Set all pixels inside selected energy bands and inside exclusion | ||
| 515 | + // regions to -1.0 | ||
| 516 | + if (m_regfile != "NONE") { | ||
| 517 | + GSkyRegions regions = GSkyRegions(m_regfile); | ||
| 518 | + for (int i = e_idx1; i <= e_idx2; ++i) { | ||
| 519 | + for (int pixel = 0; pixel < npix; ++pixel) { | ||
| 520 | + GSkyDir dir = map.inx2dir(pixel); | ||
| 521 | + if (regions.contains(dir)) { | ||
| 522 | + map(pixel,i) = -1.0; | ||
| 523 | + } | ||
| 524 | + } | ||
| 525 | + } | ||
| 526 | + if (logTerse()) { | ||
| 527 | + log << gammalib::parformat("Exclusion regions"); | ||
| 528 | + log << std::endl; | ||
| 529 | + log.indent(1); | ||
| 530 | + log << regions.print(); | ||
| 531 | + log << std::endl; | ||
| 532 | + log.indent(0); | ||
| 533 | + } | ||
| 534 | + } | ||
| 535 | + else { | ||
| 536 | + if (logTerse()) { | ||
| 537 | + log << gammalib::parformat("Exclusion regions"); | ||
| 538 | + log << "None" << std::endl; | ||
| 539 | + } | ||
| 540 | + } | ||
| 562 | 541 | ||
| 542 | + // Put back map into the event cube | ||
| 543 | + cube->map(map); | ||
| 563 | 544 | ||
| 564 | - // Get CTA event list pointer | ||
| 565 | - GCTAEventList* list = | ||
| 566 | - static_cast<GCTAEventList*>(const_cast<GEvents*>(obs->events())); | 545 | + } // endif: observation contained an event cube |
| 567 | 546 | ||
| 568 | // Return | 547 | // Return |
| 569 | return; | 548 | return; |
| @@ -798,7 +777,7 @@ void ctcubemask::save_xml(void) | @@ -798,7 +777,7 @@ void ctcubemask::save_xml(void) | ||
| 798 | * nothing if the observation pointer is not valid. | 777 | * nothing if the observation pointer is not valid. |
| 799 | ***************************************************************************/ | 778 | ***************************************************************************/ |
| 800 | void ctcubemask::save_counts_map(const GCTAObservation* obs, | 779 | void ctcubemask::save_counts_map(const GCTAObservation* obs, |
| 801 | - const std::string& outfile) const | 780 | + const std::string& outfile) const |
| 802 | { | 781 | { |
| 803 | // Save only if observation is valid | 782 | // Save only if observation is valid |
| 804 | if (obs != NULL) { | 783 | if (obs != NULL) { |
src/ctcubemask/ctcubemask.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | - * ctcubemask - CTA cube filter tool * | 2 | + * ctcubemask.hpp - CTA cube filter tool * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | * copyright (C) 2014 by Chia-Chun Lu * | 4 | * copyright (C) 2014 by Chia-Chun Lu * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| @@ -35,7 +35,7 @@ | @@ -35,7 +35,7 @@ | ||
| 35 | 35 | ||
| 36 | /* __Definitions _________________________________________________________ */ | 36 | /* __Definitions _________________________________________________________ */ |
| 37 | #define CTCUBEMASK_NAME "ctcubemask" | 37 | #define CTCUBEMASK_NAME "ctcubemask" |
| 38 | -#define CTCUBEMASK_VERSION "00-05-00" | 38 | +#define CTCUBEMASK_VERSION "00-01-00" |
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | /***********************************************************************//** | 41 | /***********************************************************************//** |
| @@ -53,7 +53,7 @@ public: | @@ -53,7 +53,7 @@ public: | ||
| 53 | virtual ~ctcubemask(void); | 53 | virtual ~ctcubemask(void); |
| 54 | 54 | ||
| 55 | // Operators | 55 | // Operators |
| 56 | - ctcubemask& operator= (const ctcubemask& app); | 56 | + ctcubemask& operator=(const ctcubemask& app); |
| 57 | 57 | ||
| 58 | // Methods | 58 | // Methods |
| 59 | void clear(void); | 59 | void clear(void); |
| @@ -62,7 +62,7 @@ public: | @@ -62,7 +62,7 @@ public: | ||
| 62 | void save(void); | 62 | void save(void); |
| 63 | GObservations& obs(void) { return m_obs; } | 63 | GObservations& obs(void) { return m_obs; } |
| 64 | void get_parameters(void); | 64 | void get_parameters(void); |
| 65 | - void apply_mask(GCTAObservation* obs, const std::string& filename); | 65 | + void apply_mask(GCTAObservation* obs); |
| 66 | 66 | ||
| 67 | protected: | 67 | protected: |
| 68 | // Protected methods | 68 | // Protected methods |
src/ctcubemask/ctcubemask.par
| @@ -4,23 +4,23 @@ | @@ -4,23 +4,23 @@ | ||
| 4 | # # | 4 | # # |
| 5 | # ------------------------------------------------------------------------- # | 5 | # ------------------------------------------------------------------------- # |
| 6 | # # | 6 | # # |
| 7 | -# File: ctfilter.par # | ||
| 8 | -# Version: 00-04-00 # | 7 | +# File: ctcubemask.par # |
| 8 | +# Version: 00-01-00 # | ||
| 9 | # # | 9 | # # |
| 10 | # Author: Chia-Chun Lu # | 10 | # Author: Chia-Chun Lu # |
| 11 | # c.lu@mpi-hd.mpg.de # | 11 | # c.lu@mpi-hd.mpg.de # |
| 12 | # IRAP # | 12 | # IRAP # |
| 13 | # # | 13 | # # |
| 14 | -# Purpose: Parameter file for the ctselect application # | 14 | +# Purpose: Parameter file for the ctcubemask application # |
| 15 | # # | 15 | # # |
| 16 | ############################################################################# | 16 | ############################################################################# |
| 17 | # | 17 | # |
| 18 | # File information | 18 | # File information |
| 19 | #================= | 19 | #================= |
| 20 | -infile, f, a, "test/data/crab_events.fits.gz",,,"Input event list or observation definition file" | ||
| 21 | -regfile, f, a, "exlusion.reg",,,"exclusion region file in ds9 format" | ||
| 22 | -outfile, f, a, "filtered_cube.fits",,,"Output event list or observation definition file" | ||
| 23 | -prefix, s, h, "filtered_",,,"Prefix for counts maps in observation definition file" | 20 | +infile, f, a, "cntmap.fits",,,"Input counts cube or observation definition file" |
| 21 | +regfile, f, a, "NONE",,,"Exclusion region file in ds9 format" | ||
| 22 | +outfile, f, a, "filtered_cube.fits",,,"Output event cube or observation definition file" | ||
| 23 | +prefix, s, h, "filtered_",,,"Prefix for counts cube in observation definition file" | ||
| 24 | # | 24 | # |
| 25 | # Selection parameters | 25 | # Selection parameters |
| 26 | #===================== | 26 | #===================== |
test/data/exclusion.reg
0 → 100644
test/test_ctools.sh
| @@ -41,6 +41,7 @@ ctobssim=../src/ctobssim/ctobssim | @@ -41,6 +41,7 @@ ctobssim=../src/ctobssim/ctobssim | ||
| 41 | ctselect=../src/ctselect/ctselect | 41 | ctselect=../src/ctselect/ctselect |
| 42 | ctskymap=../src/ctskymap/ctskymap | 42 | ctskymap=../src/ctskymap/ctskymap |
| 43 | ctexpcube=../src/ctexpcube/ctexpcube | 43 | ctexpcube=../src/ctexpcube/ctexpcube |
| 44 | +ctcubemask=../src/ctcubemask/ctcubemask | ||
| 44 | 45 | ||
| 45 | 46 | ||
| 46 | # | 47 | # |
| @@ -387,3 +388,25 @@ else | @@ -387,3 +388,25 @@ else | ||
| 387 | $ECHO " expcube2.fits file is not valid" | 388 | $ECHO " expcube2.fits file is not valid" |
| 388 | exit 1 | 389 | exit 1 |
| 389 | fi | 390 | fi |
| 391 | + | ||
| 392 | + | ||
| 393 | +# | ||
| 394 | +# Test ctcubemask | ||
| 395 | +# =============== | ||
| 396 | +$ECHO -n "Test ctcubemask: " | ||
| 397 | +$ctcubemask infile="data/crab_events.fits" \ | ||
| 398 | + regfile="data/exclusion.reg" \ | ||
| 399 | + outfile="filtered_cube.fits" \ | ||
| 400 | + ra=83.63 \ | ||
| 401 | + dec=22.01 \ | ||
| 402 | + rad=2.0 \ | ||
| 403 | + emin=0.1 \ | ||
| 404 | + emax=100.0 | ||
| 405 | +$ECHO -n "." | ||
| 406 | +if [ -s "filtered_cube.fits" ] | ||
| 407 | +then | ||
| 408 | + $ECHO -n "." | ||
| 409 | +else | ||
| 410 | + $ECHO " filtered_cube.fits file is not valid" | ||
| 411 | + exit 1 | ||
| 412 | +fi |