roman-snpit-snappl 0.13.0__tar.gz → 0.15.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of roman-snpit-snappl might be problematic. Click here for more details.

Files changed (99) hide show
  1. {roman_snpit_snappl-0.13.0/roman_snpit_snappl.egg-info → roman_snpit_snappl-0.15.0}/PKG-INFO +13 -13
  2. roman_snpit_snappl-0.15.0/changes/74.bugfix.rst +1 -0
  3. roman_snpit_snappl-0.15.0/changes/79.snappl.rst +1 -0
  4. roman_snpit_snappl-0.15.0/changes/82.snappl.rst +1 -0
  5. roman_snpit_snappl-0.15.0/experimentation/ap_phot_simulated_images.py +68 -0
  6. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/pyproject.toml +15 -13
  7. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0/roman_snpit_snappl.egg-info}/PKG-INFO +13 -13
  8. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/SOURCES.txt +4 -0
  9. roman_snpit_snappl-0.15.0/roman_snpit_snappl.egg-info/requires.txt +28 -0
  10. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/_version.py +3 -3
  11. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/diaobject.py +4 -3
  12. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/image.py +5 -5
  13. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/image_simulator.py +51 -48
  14. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/imagecollection.py +2 -1
  15. roman_snpit_snappl-0.13.0/roman_snpit_snappl.egg-info/requires.txt +0 -28
  16. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.cruft.json +0 -0
  17. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/CODEOWNERS +0 -0
  18. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  19. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md +0 -0
  20. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/PR_TEMPLATE.md +0 -0
  21. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/dependabot.yml +0 -0
  22. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/labeler.yml +0 -0
  23. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/workflows/changelog.yml +0 -0
  24. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/workflows/run_labeler.yml +0 -0
  25. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/workflows/run_snappl_tests.yml +0 -0
  26. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/workflows/sphinx-deploy.yml +0 -0
  27. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.github/workflows/sub_package_update.yml +0 -0
  28. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.gitignore +0 -0
  29. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/.pre-commit-config.yaml +0 -0
  30. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/CHANGES.rst +0 -0
  31. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/CITATION.cff +0 -0
  32. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/CODE_OF_CONDUCT.md +0 -0
  33. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/CONTRIBUTING.md +0 -0
  34. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/LICENSE +0 -0
  35. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/MANIFEST.in +0 -0
  36. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/README.rst +0 -0
  37. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/.gitkeep +0 -0
  38. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/10.snappl.rst +0 -0
  39. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/13.bugfix.rst +0 -0
  40. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/14.snappl.rst +0 -0
  41. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/15.feature.rst +0 -0
  42. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/16.feature.rst +0 -0
  43. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/18.feature.rst +0 -0
  44. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/20.bugfix.rst +0 -0
  45. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/23.snappl.rst +0 -0
  46. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/26.feature.rst +0 -0
  47. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/29.feature.rst +0 -0
  48. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/3.snappl.rst +0 -0
  49. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/31.feature.rst +0 -0
  50. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/35.snappl.rst +0 -0
  51. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/36.snappl.rst +0 -0
  52. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/37.snappl.rst +0 -0
  53. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/40.snappl.rst +0 -0
  54. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/41.snappl.rst +0 -0
  55. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/43.snappl.rst +0 -0
  56. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/47.feature.rst +0 -0
  57. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/49.docs.rst +0 -0
  58. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/5.snappl.rst +0 -0
  59. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/54.snappl.rst +0 -0
  60. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/57.snappl.rst +0 -0
  61. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/58.snappl.rst +0 -0
  62. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/61.bugfix.rst +0 -0
  63. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/62.snappl.rst +0 -0
  64. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/63.snappl.rst +0 -0
  65. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/65.bugfix.rst +0 -0
  66. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/68.feature.rst +0 -0
  67. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/72.snappl.rst +0 -0
  68. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/73.feature.rst +0 -0
  69. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/8.snappl.rst +0 -0
  70. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/changes/9.snappl.rst +0 -0
  71. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/codespell-ignore.txt +0 -0
  72. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/Makefile +0 -0
  73. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/_static/logo_black_filled.png +0 -0
  74. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/api.rst +0 -0
  75. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/changes.rst +0 -0
  76. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/conf.py +0 -0
  77. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/index.rst +0 -0
  78. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/installation.rst +0 -0
  79. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/make.bat +0 -0
  80. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/docs/usage.rst +0 -0
  81. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/experimentation/README.md +0 -0
  82. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/experimentation/play_with_photutils.py +0 -0
  83. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/licenses/.DS_Store +0 -0
  84. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/licenses/LICENSE.rst +0 -0
  85. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/licenses/README.rst +0 -0
  86. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/licenses/TEMPLATE_LICENSE.rst +0 -0
  87. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/dependency_links.txt +0 -0
  88. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/not-zip-safe +0 -0
  89. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/top_level.txt +0 -0
  90. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/setup.cfg +0 -0
  91. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/setup.py +0 -0
  92. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/__init__.py +0 -0
  93. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/_dev/__init__.py +0 -0
  94. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/_dev/scm_version.py +0 -0
  95. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/data/README.rst +0 -0
  96. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/psf.py +0 -0
  97. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/sed.py +0 -0
  98. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/snappl/wcs.py +0 -0
  99. {roman_snpit_snappl-0.13.0 → roman_snpit_snappl-0.15.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roman_snpit_snappl
3
- Version: 0.13.0
3
+ Version: 0.15.0
4
4
  Summary: Photometry utilities for the Roman SNPIT
5
5
  Author: Roman Supernova Project Infrastructure Team
6
6
  Maintainer-email: Roman SN PIT <raknop@lbl.gov>
@@ -10,18 +10,18 @@ Classifier: Programming Language :: Python
10
10
  Requires-Python: >=3.11
11
11
  Description-Content-Type: text/x-rst
12
12
  License-File: LICENSE
13
- Requires-Dist: numpy
14
- Requires-Dist: scipy
15
- Requires-Dist: astropy
16
- Requires-Dist: photutils
17
- Requires-Dist: pandas
18
- Requires-Dist: h5py
19
- Requires-Dist: roman-datamodels
20
- Requires-Dist: snpit_utils
21
- Requires-Dist: towncrier
22
- Requires-Dist: setuptools_scm
23
- Requires-Dist: cruft
24
- Requires-Dist: coverage
13
+ Requires-Dist: astropy<8.0.0,>=7.1.0
14
+ Requires-Dist: fitsio<2.0.0,>=1.2.5
15
+ Requires-Dist: galsim<3.0.0,>=2.7.2
16
+ Requires-Dist: gwcs<0.27.0,>=0.26.0
17
+ Requires-Dist: h5py<4.0.0,>=3.14.0
18
+ Requires-Dist: numpy<3.0.0,>=2.2.6
19
+ Requires-Dist: pandas<3.0.0,>=2.3.3
20
+ Requires-Dist: photutils<3.0.0,>=2.3.0
21
+ Requires-Dist: pyyaml<7.0.0,>=6.0.3
22
+ Requires-Dist: roman-datamodels<0.28.0,>=0.27.0
23
+ Requires-Dist: scipy<2.0.0,>=1.16.2
24
+ Requires-Dist: snpit_utils<0.1.0,>=0.0.12
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pytest; extra == "test"
27
27
  Requires-Dist: pytest-doctestplus; extra == "test"
@@ -0,0 +1 @@
1
+ Fix an issue in ImageSimulator where pointsources were all 2× too bright.
@@ -0,0 +1 @@
1
+ Make the URL of the roman-desc-simdex configurable
@@ -0,0 +1 @@
1
+ Playing with dependencies
@@ -0,0 +1,68 @@
1
+ import argparse
2
+ from matplotlib import pyplot
3
+
4
+ import numpy as np
5
+ import photutils.aperture
6
+
7
+ from snappl.image import FITSImageStdHeaders
8
+
9
+ parser = argparse.ArgumentParser( 'ap_phot_ismulated_images.py' )
10
+ parser.add_argument( '-i', '--image-basenames', nargs='+', required=True,
11
+ help="Image basenames. Leave off _image.fits" )
12
+ parser.add_argument( '-r', '--ra', type=float, required=True, help="Transient RA" )
13
+ parser.add_argument( '-d', '--dec', type=float, required=True, help="Transient Dec" )
14
+ parser.add_argument( '--rad', type=float, default=5.0, help="Aperture radius in pixels (default 5)" )
15
+ parser.add_argument( '--transient-peak-mag', '--tp', type=float, default=21.,
16
+ help="Peak magnitude of transient (default: 21)" )
17
+ parser.add_argument( '--transient-start-mjd', '--tt0', type=float, default=60010.,
18
+ help="Start MJD of transient linear rise (default: 60010.)" )
19
+ parser.add_argument( '--transient-peak-mjd', '--ttm', type=float, default=60030.,
20
+ help="Peak MJD of transient (default: 60030.)" )
21
+ parser.add_argument( '--transient-end-mjd', '--tt1', type=float, default=60060.,
22
+ help="End MJD of transient linear decay (default: 60060.)" )
23
+ parser.add_argument( '-s', '--save-plot', default=None,
24
+ help="Save plot to this file" )
25
+ args = parser.parse_args()
26
+
27
+
28
+ images = [ FITSImageStdHeaders(p, std_imagenames=True) for p in args.image_basenames ]
29
+ mjds = np.array( [ i.mjd for i in images ] )
30
+
31
+ fluxen = []
32
+ apflux = []
33
+ apfluxerr = []
34
+ for image in images:
35
+ data = image.get_data( which='data' )[0]
36
+ noise = image.get_data( which='noise' )[0]
37
+ peakflux = 10 ** ( ( args.transient_peak_mag - image.zeropoint ) / -2.5 )
38
+ flux = 0.
39
+ if ( image.mjd >= args.transient_start_mjd ) and ( image.mjd <= args.transient_end_mjd ):
40
+ mjdedge = ( args.transient_start_mjd if image.mjd < args.transient_peak_mjd
41
+ else args.transient_end_mjd )
42
+ flux = peakflux * ( image.mjd - mjdedge ) / ( args.transient_peak_mjd - mjdedge )
43
+ fluxen.append( flux )
44
+
45
+ wcs = image.get_wcs()
46
+ x, y = wcs.world_to_pixel( args.ra, args.dec )
47
+ aperture = photutils.aperture.CircularAperture( (x, y), args.rad )
48
+ res = photutils.aperture.aperture_photometry( data, aperture, error=noise )
49
+ apflux.append( res['aperture_sum'][0] )
50
+ apfluxerr.append( res['aperture_sum_err'][0] )
51
+
52
+ fluxen = np.array( fluxen )
53
+ apflux = np.array( apflux )
54
+ apfluxerr = np.array( apfluxerr )
55
+
56
+ fig, ax = pyplot.subplots()
57
+ fig.set_tight_layout( True )
58
+ ax.errorbar( mjds, apflux - fluxen, apfluxerr, linestyle='none', marker='s', color='red',
59
+ label=f'{args.rad}-pix radius aperture' )
60
+ xmin, xmax = ax.get_xlim()
61
+ ax.hlines( 0, xmin, xmax, linestyle='dotted', color='black' )
62
+ ax.set_label( "MJD" )
63
+ ax.set_ylabel( "Apphot flux - true flux (counts)" )
64
+ ax.legend()
65
+ fig.show()
66
+ if args.save_plot is not None:
67
+ fig.savefig( args.save_plot )
68
+ pyplot.show()
@@ -17,19 +17,18 @@ classifiers = [
17
17
  "Programming Language :: Python"
18
18
  ]
19
19
  dependencies = [
20
- "numpy",
21
- "scipy",
22
- "astropy",
23
- "photutils",
24
- "pandas",
25
- "h5py",
26
- "roman-datamodels",
27
- "snpit_utils",
28
- "towncrier",
29
- "setuptools_scm",
30
- "cruft",
31
- "coverage",
32
-
20
+ "astropy>=7.1.0,<8.0.0",
21
+ "fitsio>=1.2.5,<2.0.0",
22
+ "galsim>=2.7.2,<3.0.0",
23
+ "gwcs>=0.26.0,<0.27.0",
24
+ "h5py>=3.14.0,<4.0.0",
25
+ "numpy>=2.2.6,<3.0.0",
26
+ "pandas>=2.3.3,<3.0.0",
27
+ "photutils>=2.3.0,<3.0.0",
28
+ "pyyaml>=6.0.3,<7.0.0",
29
+ "roman-datamodels>=0.27.0,<0.28.0",
30
+ "scipy>=1.16.2,<2.0.0",
31
+ "snpit_utils>=0.0.12,<0.1.0"
33
32
  ]
34
33
  license-files = ["LICENSE"]
35
34
 
@@ -69,6 +68,9 @@ repository = "https://github.com/Roman-Supernova-PIT"
69
68
 
70
69
  [build-system]
71
70
  requires = [
71
+ "towncrier",
72
+ "cruft",
73
+ "coverage",
72
74
  "setuptools>=62.1",
73
75
  "setuptools_scm[tomli]>=6.2",
74
76
  "wheel",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roman_snpit_snappl
3
- Version: 0.13.0
3
+ Version: 0.15.0
4
4
  Summary: Photometry utilities for the Roman SNPIT
5
5
  Author: Roman Supernova Project Infrastructure Team
6
6
  Maintainer-email: Roman SN PIT <raknop@lbl.gov>
@@ -10,18 +10,18 @@ Classifier: Programming Language :: Python
10
10
  Requires-Python: >=3.11
11
11
  Description-Content-Type: text/x-rst
12
12
  License-File: LICENSE
13
- Requires-Dist: numpy
14
- Requires-Dist: scipy
15
- Requires-Dist: astropy
16
- Requires-Dist: photutils
17
- Requires-Dist: pandas
18
- Requires-Dist: h5py
19
- Requires-Dist: roman-datamodels
20
- Requires-Dist: snpit_utils
21
- Requires-Dist: towncrier
22
- Requires-Dist: setuptools_scm
23
- Requires-Dist: cruft
24
- Requires-Dist: coverage
13
+ Requires-Dist: astropy<8.0.0,>=7.1.0
14
+ Requires-Dist: fitsio<2.0.0,>=1.2.5
15
+ Requires-Dist: galsim<3.0.0,>=2.7.2
16
+ Requires-Dist: gwcs<0.27.0,>=0.26.0
17
+ Requires-Dist: h5py<4.0.0,>=3.14.0
18
+ Requires-Dist: numpy<3.0.0,>=2.2.6
19
+ Requires-Dist: pandas<3.0.0,>=2.3.3
20
+ Requires-Dist: photutils<3.0.0,>=2.3.0
21
+ Requires-Dist: pyyaml<7.0.0,>=6.0.3
22
+ Requires-Dist: roman-datamodels<0.28.0,>=0.27.0
23
+ Requires-Dist: scipy<2.0.0,>=1.16.2
24
+ Requires-Dist: snpit_utils<0.1.0,>=0.0.12
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pytest; extra == "test"
27
27
  Requires-Dist: pytest-doctestplus; extra == "test"
@@ -55,7 +55,10 @@ changes/65.bugfix.rst
55
55
  changes/68.feature.rst
56
56
  changes/72.snappl.rst
57
57
  changes/73.feature.rst
58
+ changes/74.bugfix.rst
59
+ changes/79.snappl.rst
58
60
  changes/8.snappl.rst
61
+ changes/82.snappl.rst
59
62
  changes/9.snappl.rst
60
63
  docs/Makefile
61
64
  docs/api.rst
@@ -67,6 +70,7 @@ docs/make.bat
67
70
  docs/usage.rst
68
71
  docs/_static/logo_black_filled.png
69
72
  experimentation/README.md
73
+ experimentation/ap_phot_simulated_images.py
70
74
  experimentation/play_with_photutils.py
71
75
  licenses/.DS_Store
72
76
  licenses/LICENSE.rst
@@ -0,0 +1,28 @@
1
+ astropy<8.0.0,>=7.1.0
2
+ fitsio<2.0.0,>=1.2.5
3
+ galsim<3.0.0,>=2.7.2
4
+ gwcs<0.27.0,>=0.26.0
5
+ h5py<4.0.0,>=3.14.0
6
+ numpy<3.0.0,>=2.2.6
7
+ pandas<3.0.0,>=2.3.3
8
+ photutils<3.0.0,>=2.3.0
9
+ pyyaml<7.0.0,>=6.0.3
10
+ roman-datamodels<0.28.0,>=0.27.0
11
+ scipy<2.0.0,>=1.16.2
12
+ snpit_utils<0.1.0,>=0.0.12
13
+
14
+ [docs]
15
+ sphinx
16
+ sphinx-automodapi
17
+ matplotlib
18
+ mock
19
+ tomli
20
+ graphviz
21
+
22
+ [test]
23
+ pytest
24
+ pytest-doctestplus
25
+ pytest-cov
26
+ requests
27
+ tox
28
+ devpi_process
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.13.0'
32
- __version_tuple__ = version_tuple = (0, 13, 0)
31
+ __version__ = version = '0.15.0'
32
+ __version_tuple__ = version_tuple = (0, 15, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g57a44b882'
34
+ __commit_id__ = commit_id = 'g719a5ba90'
@@ -1,5 +1,6 @@
1
1
  __all__ = [ 'DiaObject', 'DiaObjectOU2024', 'DiaObjectManual' ]
2
2
 
3
+ from snpit_utils.config import Config
3
4
  from snpit_utils.http import retry_post
4
5
 
5
6
 
@@ -53,7 +54,7 @@ class DiaObject:
53
54
  ----------
54
55
  collection : str
55
56
  Which collection of object to search. Currently only
56
- "ou2024" and "manuasl" are implemented, but others will be later.
57
+ "ou2024" and "manual" are implemented, but others will be later.
57
58
 
58
59
  subset : str
59
60
  Subset of collection to search. Many collections (including
@@ -189,8 +190,8 @@ class DiaObjectOU2024( DiaObject ):
189
190
  if mjd_end_min is not None:
190
191
  params['mjd_end_max'] = float( mjd_end_max )
191
192
 
192
-
193
- res = retry_post( 'https://roman-desc-simdex.lbl.gov/findtransients', json=params )
193
+ simdex = Config.get().value( 'photometry.snappl.simdex_server' )
194
+ res = retry_post( f'{simdex}/findtransients', json=params )
194
195
  objinfo = res.json()
195
196
 
196
197
  diaobjects = []
@@ -548,7 +548,7 @@ class Numpy2DImage( Image ):
548
548
  @property
549
549
  def data( self ):
550
550
  if self._data is None:
551
- self._load_data()
551
+ self._load_data( which='data' )
552
552
  return self._data
553
553
 
554
554
  @data.setter
@@ -564,7 +564,7 @@ class Numpy2DImage( Image ):
564
564
  @property
565
565
  def noise( self ):
566
566
  if self._noise is None:
567
- self._load_data()
567
+ self._load_data( which='noise' )
568
568
  return self._noise
569
569
 
570
570
  @noise.setter
@@ -580,7 +580,7 @@ class Numpy2DImage( Image ):
580
580
  @property
581
581
  def flags( self ):
582
582
  if self._flags is None:
583
- self._load_data()
583
+ self._load_data( which='flags' )
584
584
  return self._flags
585
585
 
586
586
  @flags.setter
@@ -607,9 +607,9 @@ class Numpy2DImage( Image ):
607
607
  self._image_shape = self.data.shape
608
608
  return self._image_shape
609
609
 
610
- def _load_data( self ):
610
+ def _load_data( self, which="all" ):
611
611
  """Loads (or reloads) the data from disk."""
612
- self.get_data( which="all", cache=True, always_reload=False )
612
+ self.get_data( which=which, cache=True, always_reload=False )
613
613
 
614
614
  def free( self ):
615
615
  self._data = None
@@ -5,31 +5,14 @@ import multiprocessing
5
5
 
6
6
  import numpy as np
7
7
  import astropy.wcs
8
- import astropy.io.fits
9
8
 
10
9
  from snpit_utils.logger import SNLogger
10
+ from snpit_utils.utils import isSequence
11
11
  from snappl.psf import PSF
12
12
  from snappl.image import FITSImageStdHeaders
13
13
  from snappl.wcs import AstropyWCS
14
14
 
15
15
 
16
- def _kwargs_list_to_kwargs( kwargs_list ):
17
- unpack = re.compile( r"^([a-zA-Z0-9_]+)\s*=\s*(.*[^\s])\s*$" )
18
- kwargs = {}
19
- for arg in kwargs_list:
20
- mat = unpack.search( arg )
21
- if mat is None:
22
- raise ValueError( f"Failed to parse key=val from '{arg}'" )
23
- try:
24
- kwargs[ mat.group(1) ] = int( mat.group(2) )
25
- except ValueError:
26
- try:
27
- kwargs[ mat.group(1) ] = float( mat.group(2) )
28
- except ValueError:
29
- kwargs[ mat.group(1) ] = mat.group(2)
30
- return kwargs
31
-
32
-
33
16
  class ImageSimulatorPointSource:
34
17
  def __init__( self, ra=None, dec=None, psf=None ):
35
18
  if any( i is None for i in [ ra, dec, psf ] ):
@@ -50,13 +33,13 @@ class ImageSimulatorPointSource:
50
33
  x0 = int( np.floor( x + 0.5 ) )
51
34
  y0 = int( np.floor( y + 0.5 ) )
52
35
  stamp = self.psf.get_stamp( x, y, x0=x0, y0=y0, flux=flux )
36
+ var = np.zeros( stamp.shape )
53
37
  if noisy:
54
38
  if rng is None:
55
39
  rng = np.random.default_rng()
56
40
  w = stamp > 0
57
- var = np.zeros( stamp.shape )
58
41
  var[ w ] = stamp[ w ] / gain
59
- stamp[ w ] += rng.normal( stamp[w], np.sqrt( var[w] ) )
42
+ stamp[ w ] += rng.normal( 0., np.sqrt( var[w] ) )
60
43
 
61
44
  sx0 = 0
62
45
  sx1 = stamp.shape[1]
@@ -114,13 +97,10 @@ class ImageSimulationStar( ImageSimulatorPointSource ):
114
97
 
115
98
 
116
99
  class ImageSimulatorStarCollection:
117
- def __init__( self, ra=None, dec=None, fieldrad=None, m0=None, m1=None, alpha=None, nstars=None,
118
- psf_class='gaussian', psf_kwargs=['sigmax=1.', 'sigmay=1.', 'theta=0.'],
119
- rng=None ):
100
+ def __init__( self, psf, ra=None, dec=None, fieldrad=None, m0=None, m1=None, alpha=None, nstars=None, rng=None ):
120
101
  if rng is None:
121
102
  self.rng = np.random.default_rng()
122
- kwargs = _kwargs_list_to_kwargs( psf_kwargs )
123
- self.psf = PSF.get_psf_object( psf_class, **kwargs )
103
+ self.psf = psf
124
104
 
125
105
  stars = []
126
106
  norm = ( alpha + 1 ) / ( m1 ** (alpha + 1) - m0 ** (alpha + 1) )
@@ -209,7 +189,7 @@ class ImageSimulatorImage:
209
189
  self.image.data += rng.normal( skymean, skysigma, size=self.image.data.shape )
210
190
  self.image.noise += np.full( self.image.noise.shape, skysigma**2 )
211
191
 
212
- def add_stars( self, stars, rng=None, numprocs=12 ):
192
+ def add_stars( self, stars, rng=None, noisy=False, numprocs=12 ):
213
193
  if rng is None:
214
194
  rng = np.random.default_rng()
215
195
 
@@ -234,7 +214,7 @@ class ImageSimulatorImage:
234
214
  x, y = self.image.get_wcs().world_to_pixel( star.ra, star.dec )
235
215
  try:
236
216
  data = star.render_star( self.image.data.shape[1], self.image.data.shape[0], x, y,
237
- zeropoint=self.image.zeropoint, rng=rng )
217
+ zeropoint=self.image.zeropoint, rng=rng, noisy=noisy )
238
218
  add_star_to_image( i, data )
239
219
  except Exception as ex:
240
220
  omg( ex )
@@ -244,7 +224,7 @@ class ImageSimulatorImage:
244
224
  x, y = self.image.get_wcs().world_to_pixel( star.ra, star.dec )
245
225
  doer = functools.partial( star.render_star,
246
226
  self.image.data.shape[1], self.image.data.shape[0], x, y,
247
- zeropoint=self.image.zeropoint, rng=rng )
227
+ zeropoint=self.image.zeropoint, rng=rng, noisy=noisy )
248
228
  callback = functools.partial( add_star_to_image, i )
249
229
  pool.apply_async( doer, callback=callback, error_callback=omg )
250
230
  pool.close()
@@ -254,7 +234,7 @@ class ImageSimulatorImage:
254
234
  raise RuntimeError( "Bad things have happened." )
255
235
 
256
236
 
257
- def add_transient( self, transient, rng=None ):
237
+ def add_transient( self, transient, rng=None, noisy=False ):
258
238
  if rng is None:
259
239
  rng = np.random.default_rng()
260
240
 
@@ -263,7 +243,7 @@ class ImageSimulatorImage:
263
243
  ( stamp, var,
264
244
  imcoords, stampcoords ) = transient.render_transient( self.image.data.shape[1], self.image.data.shape[0],
265
245
  x, y, self.image.mjd, zeropoint=self.image.zeropoint,
266
- rng=rng )
246
+ rng=rng, noisy=noisy )
267
247
  if stamp is not None:
268
248
  ix0, ix1, iy0, iy1 = imcoords
269
249
  sx0, sx1, sy0, sy1 = stampcoords
@@ -274,8 +254,7 @@ class ImageSimulatorImage:
274
254
  class ImageSimulator:
275
255
  def __init__( self,
276
256
  seed=None,
277
- star_center_ra=None,
278
- star_center_dec=None,
257
+ star_center=None,
279
258
  star_sky_radius=320.,
280
259
  min_star_magnitude=18.,
281
260
  max_star_magnitude=28.,
@@ -283,6 +262,7 @@ class ImageSimulator:
283
262
  nstars=200,
284
263
  psf_class='gaussian',
285
264
  psf_kwargs=[],
265
+ no_star_noise=False,
286
266
  basename='simimage',
287
267
  width=4088,
288
268
  height=4088,
@@ -302,13 +282,17 @@ class ImageSimulator:
302
282
  transient_peak_mjd=60030.,
303
283
  transient_start_mjd=60010.,
304
284
  transient_end_mjd=60060.,
285
+ no_transient_noise=False,
305
286
  overwrite=False,
306
287
  numprocs=12 ):
307
288
 
308
289
  self.mjds = mjds if mjds is not None else np.arange( 60000., 60065., 5. )
309
290
 
310
- if ( star_center_ra is None ) or ( star_center_dec ) is None:
311
- raise ValueError( "star_center_ra and star_center_dec are required" )
291
+ if star_center is None:
292
+ raise ValueError( "star_center and star_center is required" )
293
+ if ( not isSequence(star_center) ) or ( len(star_center) != 2 ):
294
+ raise ValueError( "star_center must have 2 values" )
295
+ star_center_ra, star_center_dec = star_center
312
296
 
313
297
  self.imdata = { 'mjds': mjds,
314
298
  'ras': [],
@@ -357,6 +341,7 @@ class ImageSimulator:
357
341
  self.nstars = nstars
358
342
  self.psf_class = psf_class
359
343
  self.psf_kwargs = psf_kwargs
344
+ self.no_star_noise = no_star_noise
360
345
  self.band = band
361
346
  self.sca = sca
362
347
  self.exptime = exptime
@@ -366,6 +351,7 @@ class ImageSimulator:
366
351
  self.transient_peak_mjd = transient_peak_mjd
367
352
  self.transient_start_mjd = transient_start_mjd
368
353
  self.transient_end_mjd = transient_end_mjd
354
+ self.no_transient_noise = no_transient_noise
369
355
  self.overwrite = overwrite
370
356
  self.numprocs = numprocs
371
357
 
@@ -375,15 +361,28 @@ class ImageSimulator:
375
361
  star_rng = np.random.default_rng( base_rng.integers( 1, 2147483648 ) )
376
362
  transient_rng = np.random.default_rng( base_rng.integers( 1, 2147483648 ) )
377
363
 
378
- stars = ImageSimulatorStarCollection( ra=self.star_center_ra, dec=self.star_center_dec,
364
+ unpack = re.compile( r"^([a-zA-Z0-9_]+)\s*=\s*(.*[^\s])\s*$" )
365
+ kwargs = {}
366
+ for arg in self.psf_kwargs:
367
+ mat = unpack.search( arg )
368
+ if mat is None:
369
+ raise ValueError( f"Failed to parse key=val from '{arg}'" )
370
+ try:
371
+ kwargs[ mat.group(1) ] = int( mat.group(2) )
372
+ except ValueError:
373
+ try:
374
+ kwargs[ mat.group(1) ] = float( mat.group(2) )
375
+ except ValueError:
376
+ kwargs[ mat.group(1) ] = mat.group(2)
377
+ psf = PSF.get_psf_object( self.psf_class, **kwargs )
378
+
379
+ stars = ImageSimulatorStarCollection( psf=psf, ra=self.star_center_ra, dec=self.star_center_dec,
379
380
  fieldrad=self.star_sky_radius,
380
381
  m0=self.min_star_magnitude, m1=self.max_star_magnitude,
381
- alpha=self.alpha, nstars=self.nstars,
382
- psf_class=self.psf_class, psf_kwargs=self.psf_kwargs,
383
- rng=star_rng )
382
+ alpha=self.alpha, nstars=self.nstars, rng=star_rng )
384
383
 
385
384
  transient = ImageSimulatorTransient( ra=self.transient_ra, dec=self.transient_dec,
386
- psf=stars.stars[0].psf, peak_mag=self.transient_peak_mag,
385
+ psf=psf, peak_mag=self.transient_peak_mag,
387
386
  peak_mjd=self.transient_peak_mjd, start_mjd=self.transient_start_mjd,
388
387
  end_mjd=self.transient_end_mjd )
389
388
 
@@ -395,8 +394,8 @@ class ImageSimulator:
395
394
  zeropoint=self.imdata['zps'][i], mjd=self.imdata['mjds'][i],
396
395
  pixscale=self.pixscale, band=self.band, sca=self.sca, exptime=self.exptime )
397
396
  image.render_sky( self.imdata['skys'][i], self.imdata['skyrmses'][i], rng=sky_rng )
398
- image.add_stars( stars, star_rng, numprocs=self.numprocs )
399
- image.add_transient( transient, rng=transient_rng )
397
+ image.add_stars( stars, star_rng, numprocs=self.numprocs, noisy=not self.no_star_noise )
398
+ image.add_transient( transient, rng=transient_rng, noisy=not self.no_transient_noise )
400
399
  image.image.noise = np.sqrt( image.image.noise )
401
400
  SNLogger.info( f"Writing {image.image.path}, {image.image.noisepath}, and {image.image.flagspath}" )
402
401
  image.image.save( overwrite=self.overwrite )
@@ -419,33 +418,35 @@ def main():
419
418
  help="Maxinum (dimmest) magnitude star created (default 18)" )
420
419
  parser.add_argument( '-a', '--alpha', type=float, default=1.,
421
420
  help="Power law exponent for star distribution (default: 1)" )
422
- parser.add_argument( '-n', '--nstars', type=float, default=200,
421
+ parser.add_argument( '-n', '--nstars', type=int, default=200,
423
422
  help="Generate this many stars (default 200)" )
424
423
  parser.add_argument( '-p', '--psf-class', default='gaussian',
425
424
  help="psfclass to use for stars (default 'gaussian')" )
426
425
  parser.add_argument( '--psf-kwargs', '--pk', nargs='*', default=[],
427
426
  help="Series of key=value PSF kwargs to pass to PSF.get_psf_object" )
427
+ parser.add_argument( '--no-star-noise', action='store_true', default=False,
428
+ help="Set this to not add poisson noise to stars." )
428
429
 
429
430
  parser.add_argument( '-b', '--basename', default='simimage',
430
431
  help=( "base for output filename. Written files will be basename_{mjd:7.1f}_image.fits, "
431
432
  "..._noise.fits, and ..._flags.fits" ) )
432
- parser.add_argument( '-w', '--width', type=int, default=4088, help="Image width (default: 4088)" )
433
- parser.add_argument( '-h', '--height', type=int, default=4088, help="Image height (default: 4088)" )
433
+ parser.add_argument( '--width', type=int, default=4088, help="Image width (default: 4088)" )
434
+ parser.add_argument( '--height', type=int, default=4088, help="Image height (default: 4088)" )
434
435
  parser.add_argument( '--pixscale', '--ps', type=float, default=0.11,
435
436
  help="Image pixel scale in arcsec/pixel (default 0.11)" )
436
437
  parser.add_argument( '-t', '--mjds', type=float, nargs='+', default=None,
437
438
  help="MJDs of images (default: start at 60000., space by 5 days for 60 days)" )
438
439
  parser.add_argument( '--image-centers', '--ic', type=float, nargs='+', default=None,
439
440
  help="ra0 dec0 ra1 dec1 ... ran decn centers of images" )
440
- parser.add_argument( '-r', '--image-rotations', type=float, nargs='+', default=[0.],
441
+ parser.add_argument( '', '--image-rotations', type=float, nargs='+', default=[0.],
441
442
  help="Rotations (degrees) of images about centers" )
442
- parser.add_argument( '-z', '--zerpoints', type=float, nargs='+', default=[33.],
443
+ parser.add_argument( '-z', '--zeropoints', type=float, nargs='+', default=[33.],
443
444
  help="Image zeropoints (default: 33. for all)" )
444
445
  parser.add_argument( '-r', '--sky-noise-rms', type=float, nargs='+', default=100.,
445
446
  help="Image sky RMS noise (default: 100. for all)" )
446
447
  parser.add_argument( '-s', '--sky-level', type=float, nargs='+', default=10.,
447
448
  help="Image sky level (default: 10. for all)" )
448
- parser.add_argument( '-b', '--band', default="R062",
449
+ parser.add_argument( '-f', '--band', '--filter', default="R062",
449
450
  help="Stuck in the BAND Header in the images (default R062)." )
450
451
  parser.add_argument( '--sca', default=1,
451
452
  help="Stuck in the SCA Header in the images (default 1)" )
@@ -462,8 +463,10 @@ def main():
462
463
  help="Start MJD of transient linear rise (default: 60010.)" )
463
464
  parser.add_argument( '--transient-peak-mjd', '--ttm', type=float, default=60030.,
464
465
  help="Peak MJD of transient (default: 60030.)" )
465
- parser.add_argument( '--transient-end-mjd', '--tt1', type=float, default=60010.,
466
+ parser.add_argument( '--transient-end-mjd', '--tt1', type=float, default=60060.,
466
467
  help="End MJD of transient linear decay (default: 60060.)" )
468
+ parser.add_argument( '--no-transient-noise', action='store_true', default=False,
469
+ help="Set this to not add poisson noise to transients." )
467
470
 
468
471
  parser.add_argument( '--numprocs', type=int, default=12, help="Number of star rendering processes (default 12)" )
469
472
  parser.add_argument( '-o', '--overwrite', action='store_true', default=False,
@@ -247,7 +247,8 @@ class ImageCollectionOU2024:
247
247
  if exptime_max is not None:
248
248
  params['exptime_max'] = float(exptime_max)
249
249
 
250
- res = retry_post( "https://roman-desc-simdex.lbl.gov/findromanimages", json=params ).json()
250
+ simdex = Config.get().value( 'photometry.snappl.simdex_server' )
251
+ res = retry_post( f"{simdex}/findromanimages", json=params ).json()
251
252
 
252
253
  images = []
253
254
  for i in range( len(res['pointing']) ):
@@ -1,28 +0,0 @@
1
- numpy
2
- scipy
3
- astropy
4
- photutils
5
- pandas
6
- h5py
7
- roman-datamodels
8
- snpit_utils
9
- towncrier
10
- setuptools_scm
11
- cruft
12
- coverage
13
-
14
- [docs]
15
- sphinx
16
- sphinx-automodapi
17
- matplotlib
18
- mock
19
- tomli
20
- graphviz
21
-
22
- [test]
23
- pytest
24
- pytest-doctestplus
25
- pytest-cov
26
- requests
27
- tox
28
- devpi_process