Commit 23bd532eb1bc8c2275e4998c1f3245754119e7f1
1 parent
6a937bc4
Use pointing in get_stacked_response() if xref and yref arguments are None
Showing
1 changed file
with
96 additions
and
91 deletions
cscripts/obsutils.py
| @@ -25,7 +25,7 @@ import ctools | @@ -25,7 +25,7 @@ import ctools | ||
| 25 | # Simulate observations # | 25 | # Simulate observations # |
| 26 | # ===================== # | 26 | # ===================== # |
| 27 | def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | 27 | def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, |
| 28 | - emin=None, emax=None, nbins=0, | 28 | + emin=None, emax=None, nbins=0, addbounds=False, |
| 29 | binsz=0.05, npix=200, proj='TAN', coord='GAL'): | 29 | binsz=0.05, npix=200, proj='TAN', coord='GAL'): |
| 30 | """ | 30 | """ |
| 31 | Simulate events for all observations in the container | 31 | Simulate events for all observations in the container |
| @@ -58,6 +58,8 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | @@ -58,6 +58,8 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | ||
| 58 | Maximum energy of counts cube for binned (TeV) | 58 | Maximum energy of counts cube for binned (TeV) |
| 59 | nbins : int, optional | 59 | nbins : int, optional |
| 60 | Number of energy bins (0=unbinned) | 60 | Number of energy bins (0=unbinned) |
| 61 | + addbounds : bool, optional | ||
| 62 | + Add boundaries at observation energies | ||
| 61 | binsz : float, optional | 63 | binsz : float, optional |
| 62 | Pixel size for binned simulation (deg/pixel) | 64 | Pixel size for binned simulation (deg/pixel) |
| 63 | npix : int, optional | 65 | npix : int, optional |
| @@ -92,22 +94,15 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | @@ -92,22 +94,15 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | ||
| 92 | # Binned option? | 94 | # Binned option? |
| 93 | if nbins > 0: | 95 | if nbins > 0: |
| 94 | 96 | ||
| 95 | - # If energy boundaries are not given then determine common energy | ||
| 96 | - # boundaries for all observations | 97 | + # If energy boundaries are not given then determine the minimum and |
| 98 | + # the maximum energies from all observations and use these values | ||
| 99 | + # as energy boundaries. The energy boundaries are given in TeV. | ||
| 97 | if emin == None or emax == None: | 100 | if emin == None or emax == None: |
| 98 | - emin = None | ||
| 99 | - emax = None | 101 | + emin = 1.0e30 |
| 102 | + emax = 0.0 | ||
| 100 | for run in sim.obs(): | 103 | for run in sim.obs(): |
| 101 | - run_emin = run.events().ebounds().emin().TeV() | ||
| 102 | - run_emax = run.events().ebounds().emax().TeV() | ||
| 103 | - if emin == None: | ||
| 104 | - emin = run_emin | ||
| 105 | - elif run_emin > emin: | ||
| 106 | - emin = run_emin | ||
| 107 | - if emax == None: | ||
| 108 | - emax = run_emax | ||
| 109 | - elif run_emax > emax: | ||
| 110 | - emax = run_emax | 104 | + emin = min(run.events().ebounds().emin().TeV(), emin) |
| 105 | + emax = max(run.events().ebounds().emax().TeV(), emax) | ||
| 111 | 106 | ||
| 112 | # Allocate ctbin application and set parameters | 107 | # Allocate ctbin application and set parameters |
| 113 | bin = ctools.ctbin(sim.obs()) | 108 | bin = ctools.ctbin(sim.obs()) |
| @@ -136,26 +131,16 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | @@ -136,26 +131,16 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, | ||
| 136 | # cubes and append them to the observation | 131 | # cubes and append them to the observation |
| 137 | if len(sim.obs()) > 1: | 132 | if len(sim.obs()) > 1: |
| 138 | 133 | ||
| 139 | - # Get xref, yref, coordsys and proj from counts cube | ||
| 140 | - _xref = bin.cube().counts().projection().crval(0) | ||
| 141 | - _yref = bin.cube().counts().projection().crval(1) | ||
| 142 | - _coordsys = bin.cube().counts().projection().coordsys() | ||
| 143 | - _proj = bin.cube().counts().projection().code() | ||
| 144 | - | ||
| 145 | - # Kluge: map "EQU" to "CEL" coordinate system (not sure why the | ||
| 146 | - # GSkyProjection::coordsys returns "EQU" instead of "CEL" | ||
| 147 | - if _coordsys == 'EQU': | ||
| 148 | - _coordsys = 'CEL' | ||
| 149 | - | ||
| 150 | - # Get stacked response | ||
| 151 | - response = get_stacked_response(sim.obs(), _xref, _yref, | 134 | + # Get stacked response (use pointing for map centre) |
| 135 | + response = get_stacked_response(sim.obs(), None, None, | ||
| 152 | binsz=binsz, nxpix=npix, nypix=npix, | 136 | binsz=binsz, nxpix=npix, nypix=npix, |
| 153 | emin=emin, emax=emax, enumbins=nbins, | 137 | emin=emin, emax=emax, enumbins=nbins, |
| 154 | edisp=edisp, | 138 | edisp=edisp, |
| 155 | - coordsys=_coordsys, proj=_proj, | 139 | + coordsys=coord, proj=proj, |
| 140 | + addbounds=addbounds, | ||
| 156 | log=log, debug=debug, | 141 | log=log, debug=debug, |
| 157 | chatter=chatter) | 142 | chatter=chatter) |
| 158 | - | 143 | + |
| 159 | # Set stacked response | 144 | # Set stacked response |
| 160 | if edisp: | 145 | if edisp: |
| 161 | bin.obs()[0].response(response['expcube'], | 146 | bin.obs()[0].response(response['expcube'], |
| @@ -478,11 +463,14 @@ def set_observations(ra, dec, rad, tstart, duration, emin, emax, irf, caldb, | @@ -478,11 +463,14 @@ def set_observations(ra, dec, rad, tstart, duration, emin, emax, irf, caldb, | ||
| 478 | # ==================== # | 463 | # ==================== # |
| 479 | def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | 464 | def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, |
| 480 | emin=0.1, emax=100.0, enumbins=20, edisp=False, | 465 | emin=0.1, emax=100.0, enumbins=20, edisp=False, |
| 481 | - coordsys='GAL', proj='TAN', | 466 | + coordsys='GAL', proj='TAN', addbounds=False, |
| 482 | log=False, debug=False, chatter=2): | 467 | log=False, debug=False, chatter=2): |
| 483 | """ | 468 | """ |
| 484 | Get stacked response cubes | 469 | Get stacked response cubes |
| 485 | 470 | ||
| 471 | + If no xref and yref arguments have been specified then use the pointing | ||
| 472 | + information to determine the map centre | ||
| 473 | + | ||
| 486 | Parameters | 474 | Parameters |
| 487 | ---------- | 475 | ---------- |
| 488 | obs : `~gammalib.GObservations` | 476 | obs : `~gammalib.GObservations` |
| @@ -509,6 +497,8 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | @@ -509,6 +497,8 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | ||
| 509 | Coordinate system | 497 | Coordinate system |
| 510 | proj : str, optional | 498 | proj : str, optional |
| 511 | Projection | 499 | Projection |
| 500 | + addbounds : bool, optional | ||
| 501 | + Add boundaries at observation energies | ||
| 512 | log : bool, optional | 502 | log : bool, optional |
| 513 | Create log file(s) | 503 | Create log file(s) |
| 514 | debug : bool, optional | 504 | debug : bool, optional |
| @@ -521,6 +511,13 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | @@ -521,6 +511,13 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | ||
| 521 | result : dict | 511 | result : dict |
| 522 | Dictionary of response cubes | 512 | Dictionary of response cubes |
| 523 | """ | 513 | """ |
| 514 | + # If no xref and yref arguments have been specified then use the pointing | ||
| 515 | + # information | ||
| 516 | + if xref == None or yref == None: | ||
| 517 | + usepnt = True | ||
| 518 | + else: | ||
| 519 | + usepnt = False | ||
| 520 | + | ||
| 524 | # Compute spatial binning for point spread function and energy dispersion | 521 | # Compute spatial binning for point spread function and energy dispersion |
| 525 | # cubes | 522 | # cubes |
| 526 | psf_binsz = 10.0 * binsz | 523 | psf_binsz = 10.0 * binsz |
| @@ -529,63 +526,69 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | @@ -529,63 +526,69 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | ||
| 529 | 526 | ||
| 530 | # Create exposure cube | 527 | # Create exposure cube |
| 531 | expcube = ctools.ctexpcube(obs) | 528 | expcube = ctools.ctexpcube(obs) |
| 532 | - expcube['incube'] = 'NONE' | ||
| 533 | - expcube['usepnt'] = False | ||
| 534 | - expcube['ebinalg'] = 'LOG' | ||
| 535 | - expcube['xref'] = xref | ||
| 536 | - expcube['yref'] = yref | ||
| 537 | - expcube['binsz'] = binsz | ||
| 538 | - expcube['nxpix'] = nxpix | ||
| 539 | - expcube['nypix'] = nypix | ||
| 540 | - expcube['enumbins'] = enumbins | ||
| 541 | - expcube['emin'] = emin | ||
| 542 | - expcube['emax'] = emax | ||
| 543 | - expcube['coordsys'] = coordsys | ||
| 544 | - expcube['proj'] = proj | ||
| 545 | - expcube['debug'] = debug | ||
| 546 | - expcube['chatter'] = chatter | 529 | + expcube['incube'] = 'NONE' |
| 530 | + expcube['usepnt'] = usepnt | ||
| 531 | + expcube['ebinalg'] = 'LOG' | ||
| 532 | + expcube['binsz'] = binsz | ||
| 533 | + expcube['nxpix'] = nxpix | ||
| 534 | + expcube['nypix'] = nypix | ||
| 535 | + expcube['enumbins'] = enumbins | ||
| 536 | + expcube['emin'] = emin | ||
| 537 | + expcube['emax'] = emax | ||
| 538 | + expcube['coordsys'] = coordsys | ||
| 539 | + expcube['proj'] = proj | ||
| 540 | + expcube['addbounds'] = addbounds | ||
| 541 | + expcube['debug'] = debug | ||
| 542 | + expcube['chatter'] = chatter | ||
| 543 | + if not usepnt: | ||
| 544 | + expcube['xref'] = xref | ||
| 545 | + expcube['yref'] = yref | ||
| 547 | if log: | 546 | if log: |
| 548 | expcube.logFileOpen() | 547 | expcube.logFileOpen() |
| 549 | expcube.run() | 548 | expcube.run() |
| 550 | 549 | ||
| 551 | # Create point spread function cube | 550 | # Create point spread function cube |
| 552 | psfcube = ctools.ctpsfcube(obs) | 551 | psfcube = ctools.ctpsfcube(obs) |
| 553 | - psfcube['incube'] = 'NONE' | ||
| 554 | - psfcube['usepnt'] = False | ||
| 555 | - psfcube['ebinalg'] = 'LOG' | ||
| 556 | - psfcube['xref'] = xref | ||
| 557 | - psfcube['yref'] = yref | ||
| 558 | - psfcube['binsz'] = psf_binsz | ||
| 559 | - psfcube['nxpix'] = psf_nxpix | ||
| 560 | - psfcube['nypix'] = psf_nypix | ||
| 561 | - psfcube['enumbins'] = enumbins | ||
| 562 | - psfcube['emin'] = emin | ||
| 563 | - psfcube['emax'] = emax | ||
| 564 | - psfcube['coordsys'] = coordsys | ||
| 565 | - psfcube['proj'] = proj | ||
| 566 | - psfcube['debug'] = debug | ||
| 567 | - psfcube['chatter'] = chatter | 552 | + psfcube['incube'] = 'NONE' |
| 553 | + psfcube['usepnt'] = usepnt | ||
| 554 | + psfcube['ebinalg'] = 'LOG' | ||
| 555 | + psfcube['binsz'] = psf_binsz | ||
| 556 | + psfcube['nxpix'] = psf_nxpix | ||
| 557 | + psfcube['nypix'] = psf_nypix | ||
| 558 | + psfcube['enumbins'] = enumbins | ||
| 559 | + psfcube['emin'] = emin | ||
| 560 | + psfcube['emax'] = emax | ||
| 561 | + psfcube['coordsys'] = coordsys | ||
| 562 | + psfcube['proj'] = proj | ||
| 563 | + psfcube['addbounds'] = addbounds | ||
| 564 | + psfcube['debug'] = debug | ||
| 565 | + psfcube['chatter'] = chatter | ||
| 566 | + if not usepnt: | ||
| 567 | + psfcube['xref'] = xref | ||
| 568 | + psfcube['yref'] = yref | ||
| 568 | if log: | 569 | if log: |
| 569 | psfcube.logFileOpen() | 570 | psfcube.logFileOpen() |
| 570 | psfcube.run() | 571 | psfcube.run() |
| 571 | 572 | ||
| 572 | # Create background cube | 573 | # Create background cube |
| 573 | bkgcube = ctools.ctbkgcube(obs) | 574 | bkgcube = ctools.ctbkgcube(obs) |
| 574 | - bkgcube['incube'] = 'NONE' | ||
| 575 | - bkgcube['usepnt'] = False | ||
| 576 | - bkgcube['ebinalg'] = 'LOG' | ||
| 577 | - bkgcube['xref'] = xref | ||
| 578 | - bkgcube['yref'] = yref | ||
| 579 | - bkgcube['binsz'] = binsz | ||
| 580 | - bkgcube['nxpix'] = nxpix | ||
| 581 | - bkgcube['nypix'] = nypix | ||
| 582 | - bkgcube['enumbins'] = enumbins | ||
| 583 | - bkgcube['emin'] = emin | ||
| 584 | - bkgcube['emax'] = emax | ||
| 585 | - bkgcube['coordsys'] = coordsys | ||
| 586 | - bkgcube['proj'] = proj | ||
| 587 | - bkgcube['debug'] = debug | ||
| 588 | - bkgcube['chatter'] = chatter | 575 | + bkgcube['incube'] = 'NONE' |
| 576 | + bkgcube['usepnt'] = usepnt | ||
| 577 | + bkgcube['ebinalg'] = 'LOG' | ||
| 578 | + bkgcube['binsz'] = binsz | ||
| 579 | + bkgcube['nxpix'] = nxpix | ||
| 580 | + bkgcube['nypix'] = nypix | ||
| 581 | + bkgcube['enumbins'] = enumbins | ||
| 582 | + bkgcube['emin'] = emin | ||
| 583 | + bkgcube['emax'] = emax | ||
| 584 | + bkgcube['coordsys'] = coordsys | ||
| 585 | + bkgcube['proj'] = proj | ||
| 586 | + bkgcube['addbounds'] = addbounds | ||
| 587 | + bkgcube['debug'] = debug | ||
| 588 | + bkgcube['chatter'] = chatter | ||
| 589 | + if not usepnt: | ||
| 590 | + bkgcube['xref'] = xref | ||
| 591 | + bkgcube['yref'] = yref | ||
| 589 | if log: | 592 | if log: |
| 590 | bkgcube.logFileOpen() | 593 | bkgcube.logFileOpen() |
| 591 | bkgcube.run() | 594 | bkgcube.run() |
| @@ -593,21 +596,23 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | @@ -593,21 +596,23 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, | ||
| 593 | # If energy dispersion is requested then create energy dispersion cube | 596 | # If energy dispersion is requested then create energy dispersion cube |
| 594 | if edisp: | 597 | if edisp: |
| 595 | edispcube = ctools.ctedispcube(obs) | 598 | edispcube = ctools.ctedispcube(obs) |
| 596 | - edispcube['incube'] = 'NONE' | ||
| 597 | - edispcube['usepnt'] = False | ||
| 598 | - edispcube['ebinalg'] = 'LOG' | ||
| 599 | - edispcube['xref'] = xref | ||
| 600 | - edispcube['yref'] = yref | ||
| 601 | - edispcube['binsz'] = psf_binsz | ||
| 602 | - edispcube['nxpix'] = psf_nxpix | ||
| 603 | - edispcube['nypix'] = psf_nypix | ||
| 604 | - edispcube['enumbins'] = enumbins | ||
| 605 | - edispcube['emin'] = emin | ||
| 606 | - edispcube['emax'] = emax | ||
| 607 | - edispcube['coordsys'] = coordsys | ||
| 608 | - edispcube['proj'] = proj | ||
| 609 | - edispcube['debug'] = debug | ||
| 610 | - edispcube['chatter'] = chatter | 599 | + edispcube['incube'] = 'NONE' |
| 600 | + edispcube['usepnt'] = usepnt | ||
| 601 | + edispcube['ebinalg'] = 'LOG' | ||
| 602 | + edispcube['binsz'] = psf_binsz | ||
| 603 | + edispcube['nxpix'] = psf_nxpix | ||
| 604 | + edispcube['nypix'] = psf_nypix | ||
| 605 | + edispcube['enumbins'] = enumbins | ||
| 606 | + edispcube['emin'] = emin | ||
| 607 | + edispcube['emax'] = emax | ||
| 608 | + edispcube['coordsys'] = coordsys | ||
| 609 | + edispcube['proj'] = proj | ||
| 610 | + edispcube['addbounds'] = addbounds | ||
| 611 | + edispcube['debug'] = debug | ||
| 612 | + edispcube['chatter'] = chatter | ||
| 613 | + if not usepnt: | ||
| 614 | + edispcube['xref'] = xref | ||
| 615 | + edispcube['yref'] = yref | ||
| 611 | if log: | 616 | if log: |
| 612 | edispcube.logFileOpen() | 617 | edispcube.logFileOpen() |
| 613 | edispcube.run() | 618 | edispcube.run() |