roman-snpit-snappl 0.14.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.14.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/82.snappl.rst +1 -0
  4. roman_snpit_snappl-0.15.0/experimentation/ap_phot_simulated_images.py +68 -0
  5. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/pyproject.toml +15 -13
  6. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0/roman_snpit_snappl.egg-info}/PKG-INFO +13 -13
  7. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/SOURCES.txt +3 -0
  8. roman_snpit_snappl-0.15.0/roman_snpit_snappl.egg-info/requires.txt +28 -0
  9. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/_version.py +3 -3
  10. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/diaobject.py +1 -1
  11. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/image.py +5 -5
  12. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/image_simulator.py +51 -47
  13. roman_snpit_snappl-0.14.0/roman_snpit_snappl.egg-info/requires.txt +0 -28
  14. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.cruft.json +0 -0
  15. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/CODEOWNERS +0 -0
  16. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  17. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md +0 -0
  18. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/ISSUE_TEMPLATE/PR_TEMPLATE.md +0 -0
  19. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/dependabot.yml +0 -0
  20. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/labeler.yml +0 -0
  21. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/workflows/changelog.yml +0 -0
  22. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/workflows/run_labeler.yml +0 -0
  23. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/workflows/run_snappl_tests.yml +0 -0
  24. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/workflows/sphinx-deploy.yml +0 -0
  25. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.github/workflows/sub_package_update.yml +0 -0
  26. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.gitignore +0 -0
  27. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/.pre-commit-config.yaml +0 -0
  28. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/CHANGES.rst +0 -0
  29. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/CITATION.cff +0 -0
  30. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/CODE_OF_CONDUCT.md +0 -0
  31. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/CONTRIBUTING.md +0 -0
  32. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/LICENSE +0 -0
  33. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/MANIFEST.in +0 -0
  34. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/README.rst +0 -0
  35. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/.gitkeep +0 -0
  36. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/10.snappl.rst +0 -0
  37. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/13.bugfix.rst +0 -0
  38. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/14.snappl.rst +0 -0
  39. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/15.feature.rst +0 -0
  40. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/16.feature.rst +0 -0
  41. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/18.feature.rst +0 -0
  42. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/20.bugfix.rst +0 -0
  43. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/23.snappl.rst +0 -0
  44. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/26.feature.rst +0 -0
  45. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/29.feature.rst +0 -0
  46. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/3.snappl.rst +0 -0
  47. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/31.feature.rst +0 -0
  48. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/35.snappl.rst +0 -0
  49. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/36.snappl.rst +0 -0
  50. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/37.snappl.rst +0 -0
  51. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/40.snappl.rst +0 -0
  52. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/41.snappl.rst +0 -0
  53. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/43.snappl.rst +0 -0
  54. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/47.feature.rst +0 -0
  55. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/49.docs.rst +0 -0
  56. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/5.snappl.rst +0 -0
  57. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/54.snappl.rst +0 -0
  58. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/57.snappl.rst +0 -0
  59. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/58.snappl.rst +0 -0
  60. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/61.bugfix.rst +0 -0
  61. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/62.snappl.rst +0 -0
  62. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/63.snappl.rst +0 -0
  63. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/65.bugfix.rst +0 -0
  64. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/68.feature.rst +0 -0
  65. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/72.snappl.rst +0 -0
  66. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/73.feature.rst +0 -0
  67. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/79.snappl.rst +0 -0
  68. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/8.snappl.rst +0 -0
  69. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/changes/9.snappl.rst +0 -0
  70. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/codespell-ignore.txt +0 -0
  71. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/Makefile +0 -0
  72. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/_static/logo_black_filled.png +0 -0
  73. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/api.rst +0 -0
  74. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/changes.rst +0 -0
  75. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/conf.py +0 -0
  76. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/index.rst +0 -0
  77. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/installation.rst +0 -0
  78. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/make.bat +0 -0
  79. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/docs/usage.rst +0 -0
  80. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/experimentation/README.md +0 -0
  81. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/experimentation/play_with_photutils.py +0 -0
  82. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/licenses/.DS_Store +0 -0
  83. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/licenses/LICENSE.rst +0 -0
  84. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/licenses/README.rst +0 -0
  85. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/licenses/TEMPLATE_LICENSE.rst +0 -0
  86. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/dependency_links.txt +0 -0
  87. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/not-zip-safe +0 -0
  88. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/roman_snpit_snappl.egg-info/top_level.txt +0 -0
  89. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/setup.cfg +0 -0
  90. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/setup.py +0 -0
  91. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/__init__.py +0 -0
  92. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/_dev/__init__.py +0 -0
  93. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/_dev/scm_version.py +0 -0
  94. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/data/README.rst +0 -0
  95. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/imagecollection.py +0 -0
  96. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/psf.py +0 -0
  97. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/sed.py +0 -0
  98. {roman_snpit_snappl-0.14.0 → roman_snpit_snappl-0.15.0}/snappl/wcs.py +0 -0
  99. {roman_snpit_snappl-0.14.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.14.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
+ 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.14.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,8 +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
58
59
  changes/79.snappl.rst
59
60
  changes/8.snappl.rst
61
+ changes/82.snappl.rst
60
62
  changes/9.snappl.rst
61
63
  docs/Makefile
62
64
  docs/api.rst
@@ -68,6 +70,7 @@ docs/make.bat
68
70
  docs/usage.rst
69
71
  docs/_static/logo_black_filled.png
70
72
  experimentation/README.md
73
+ experimentation/ap_phot_simulated_images.py
71
74
  experimentation/play_with_photutils.py
72
75
  licenses/.DS_Store
73
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.14.0'
32
- __version_tuple__ = version_tuple = (0, 14, 0)
31
+ __version__ = version = '0.15.0'
32
+ __version_tuple__ = version_tuple = (0, 15, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g6a12ff3d0'
34
+ __commit_id__ = commit_id = 'g719a5ba90'
@@ -54,7 +54,7 @@ class DiaObject:
54
54
  ----------
55
55
  collection : str
56
56
  Which collection of object to search. Currently only
57
- "ou2024" and "manuasl" are implemented, but others will be later.
57
+ "ou2024" and "manual" are implemented, but others will be later.
58
58
 
59
59
  subset : str
60
60
  Subset of collection to search. Many collections (including
@@ -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
@@ -7,28 +7,12 @@ import numpy as np
7
7
  import astropy.wcs
8
8
 
9
9
  from snpit_utils.logger import SNLogger
10
+ from snpit_utils.utils import isSequence
10
11
  from snappl.psf import PSF
11
12
  from snappl.image import FITSImageStdHeaders
12
13
  from snappl.wcs import AstropyWCS
13
14
 
14
15
 
15
- def _kwargs_list_to_kwargs( kwargs_list ):
16
- unpack = re.compile( r"^([a-zA-Z0-9_]+)\s*=\s*(.*[^\s])\s*$" )
17
- kwargs = {}
18
- for arg in kwargs_list:
19
- mat = unpack.search( arg )
20
- if mat is None:
21
- raise ValueError( f"Failed to parse key=val from '{arg}'" )
22
- try:
23
- kwargs[ mat.group(1) ] = int( mat.group(2) )
24
- except ValueError:
25
- try:
26
- kwargs[ mat.group(1) ] = float( mat.group(2) )
27
- except ValueError:
28
- kwargs[ mat.group(1) ] = mat.group(2)
29
- return kwargs
30
-
31
-
32
16
  class ImageSimulatorPointSource:
33
17
  def __init__( self, ra=None, dec=None, psf=None ):
34
18
  if any( i is None for i in [ ra, dec, psf ] ):
@@ -49,13 +33,13 @@ class ImageSimulatorPointSource:
49
33
  x0 = int( np.floor( x + 0.5 ) )
50
34
  y0 = int( np.floor( y + 0.5 ) )
51
35
  stamp = self.psf.get_stamp( x, y, x0=x0, y0=y0, flux=flux )
36
+ var = np.zeros( stamp.shape )
52
37
  if noisy:
53
38
  if rng is None:
54
39
  rng = np.random.default_rng()
55
40
  w = stamp > 0
56
- var = np.zeros( stamp.shape )
57
41
  var[ w ] = stamp[ w ] / gain
58
- stamp[ w ] += rng.normal( stamp[w], np.sqrt( var[w] ) )
42
+ stamp[ w ] += rng.normal( 0., np.sqrt( var[w] ) )
59
43
 
60
44
  sx0 = 0
61
45
  sx1 = stamp.shape[1]
@@ -113,13 +97,10 @@ class ImageSimulationStar( ImageSimulatorPointSource ):
113
97
 
114
98
 
115
99
  class ImageSimulatorStarCollection:
116
- def __init__( self, ra=None, dec=None, fieldrad=None, m0=None, m1=None, alpha=None, nstars=None,
117
- psf_class='gaussian', psf_kwargs=['sigmax=1.', 'sigmay=1.', 'theta=0.'],
118
- rng=None ):
100
+ def __init__( self, psf, ra=None, dec=None, fieldrad=None, m0=None, m1=None, alpha=None, nstars=None, rng=None ):
119
101
  if rng is None:
120
102
  self.rng = np.random.default_rng()
121
- kwargs = _kwargs_list_to_kwargs( psf_kwargs )
122
- self.psf = PSF.get_psf_object( psf_class, **kwargs )
103
+ self.psf = psf
123
104
 
124
105
  stars = []
125
106
  norm = ( alpha + 1 ) / ( m1 ** (alpha + 1) - m0 ** (alpha + 1) )
@@ -208,7 +189,7 @@ class ImageSimulatorImage:
208
189
  self.image.data += rng.normal( skymean, skysigma, size=self.image.data.shape )
209
190
  self.image.noise += np.full( self.image.noise.shape, skysigma**2 )
210
191
 
211
- def add_stars( self, stars, rng=None, numprocs=12 ):
192
+ def add_stars( self, stars, rng=None, noisy=False, numprocs=12 ):
212
193
  if rng is None:
213
194
  rng = np.random.default_rng()
214
195
 
@@ -233,7 +214,7 @@ class ImageSimulatorImage:
233
214
  x, y = self.image.get_wcs().world_to_pixel( star.ra, star.dec )
234
215
  try:
235
216
  data = star.render_star( self.image.data.shape[1], self.image.data.shape[0], x, y,
236
- zeropoint=self.image.zeropoint, rng=rng )
217
+ zeropoint=self.image.zeropoint, rng=rng, noisy=noisy )
237
218
  add_star_to_image( i, data )
238
219
  except Exception as ex:
239
220
  omg( ex )
@@ -243,7 +224,7 @@ class ImageSimulatorImage:
243
224
  x, y = self.image.get_wcs().world_to_pixel( star.ra, star.dec )
244
225
  doer = functools.partial( star.render_star,
245
226
  self.image.data.shape[1], self.image.data.shape[0], x, y,
246
- zeropoint=self.image.zeropoint, rng=rng )
227
+ zeropoint=self.image.zeropoint, rng=rng, noisy=noisy )
247
228
  callback = functools.partial( add_star_to_image, i )
248
229
  pool.apply_async( doer, callback=callback, error_callback=omg )
249
230
  pool.close()
@@ -253,7 +234,7 @@ class ImageSimulatorImage:
253
234
  raise RuntimeError( "Bad things have happened." )
254
235
 
255
236
 
256
- def add_transient( self, transient, rng=None ):
237
+ def add_transient( self, transient, rng=None, noisy=False ):
257
238
  if rng is None:
258
239
  rng = np.random.default_rng()
259
240
 
@@ -262,7 +243,7 @@ class ImageSimulatorImage:
262
243
  ( stamp, var,
263
244
  imcoords, stampcoords ) = transient.render_transient( self.image.data.shape[1], self.image.data.shape[0],
264
245
  x, y, self.image.mjd, zeropoint=self.image.zeropoint,
265
- rng=rng )
246
+ rng=rng, noisy=noisy )
266
247
  if stamp is not None:
267
248
  ix0, ix1, iy0, iy1 = imcoords
268
249
  sx0, sx1, sy0, sy1 = stampcoords
@@ -273,8 +254,7 @@ class ImageSimulatorImage:
273
254
  class ImageSimulator:
274
255
  def __init__( self,
275
256
  seed=None,
276
- star_center_ra=None,
277
- star_center_dec=None,
257
+ star_center=None,
278
258
  star_sky_radius=320.,
279
259
  min_star_magnitude=18.,
280
260
  max_star_magnitude=28.,
@@ -282,6 +262,7 @@ class ImageSimulator:
282
262
  nstars=200,
283
263
  psf_class='gaussian',
284
264
  psf_kwargs=[],
265
+ no_star_noise=False,
285
266
  basename='simimage',
286
267
  width=4088,
287
268
  height=4088,
@@ -301,13 +282,17 @@ class ImageSimulator:
301
282
  transient_peak_mjd=60030.,
302
283
  transient_start_mjd=60010.,
303
284
  transient_end_mjd=60060.,
285
+ no_transient_noise=False,
304
286
  overwrite=False,
305
287
  numprocs=12 ):
306
288
 
307
289
  self.mjds = mjds if mjds is not None else np.arange( 60000., 60065., 5. )
308
290
 
309
- if ( star_center_ra is None ) or ( star_center_dec ) is None:
310
- 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
311
296
 
312
297
  self.imdata = { 'mjds': mjds,
313
298
  'ras': [],
@@ -356,6 +341,7 @@ class ImageSimulator:
356
341
  self.nstars = nstars
357
342
  self.psf_class = psf_class
358
343
  self.psf_kwargs = psf_kwargs
344
+ self.no_star_noise = no_star_noise
359
345
  self.band = band
360
346
  self.sca = sca
361
347
  self.exptime = exptime
@@ -365,6 +351,7 @@ class ImageSimulator:
365
351
  self.transient_peak_mjd = transient_peak_mjd
366
352
  self.transient_start_mjd = transient_start_mjd
367
353
  self.transient_end_mjd = transient_end_mjd
354
+ self.no_transient_noise = no_transient_noise
368
355
  self.overwrite = overwrite
369
356
  self.numprocs = numprocs
370
357
 
@@ -374,15 +361,28 @@ class ImageSimulator:
374
361
  star_rng = np.random.default_rng( base_rng.integers( 1, 2147483648 ) )
375
362
  transient_rng = np.random.default_rng( base_rng.integers( 1, 2147483648 ) )
376
363
 
377
- 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,
378
380
  fieldrad=self.star_sky_radius,
379
381
  m0=self.min_star_magnitude, m1=self.max_star_magnitude,
380
- alpha=self.alpha, nstars=self.nstars,
381
- psf_class=self.psf_class, psf_kwargs=self.psf_kwargs,
382
- rng=star_rng )
382
+ alpha=self.alpha, nstars=self.nstars, rng=star_rng )
383
383
 
384
384
  transient = ImageSimulatorTransient( ra=self.transient_ra, dec=self.transient_dec,
385
- psf=stars.stars[0].psf, peak_mag=self.transient_peak_mag,
385
+ psf=psf, peak_mag=self.transient_peak_mag,
386
386
  peak_mjd=self.transient_peak_mjd, start_mjd=self.transient_start_mjd,
387
387
  end_mjd=self.transient_end_mjd )
388
388
 
@@ -394,8 +394,8 @@ class ImageSimulator:
394
394
  zeropoint=self.imdata['zps'][i], mjd=self.imdata['mjds'][i],
395
395
  pixscale=self.pixscale, band=self.band, sca=self.sca, exptime=self.exptime )
396
396
  image.render_sky( self.imdata['skys'][i], self.imdata['skyrmses'][i], rng=sky_rng )
397
- image.add_stars( stars, star_rng, numprocs=self.numprocs )
398
- 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 )
399
399
  image.image.noise = np.sqrt( image.image.noise )
400
400
  SNLogger.info( f"Writing {image.image.path}, {image.image.noisepath}, and {image.image.flagspath}" )
401
401
  image.image.save( overwrite=self.overwrite )
@@ -418,33 +418,35 @@ def main():
418
418
  help="Maxinum (dimmest) magnitude star created (default 18)" )
419
419
  parser.add_argument( '-a', '--alpha', type=float, default=1.,
420
420
  help="Power law exponent for star distribution (default: 1)" )
421
- parser.add_argument( '-n', '--nstars', type=float, default=200,
421
+ parser.add_argument( '-n', '--nstars', type=int, default=200,
422
422
  help="Generate this many stars (default 200)" )
423
423
  parser.add_argument( '-p', '--psf-class', default='gaussian',
424
424
  help="psfclass to use for stars (default 'gaussian')" )
425
425
  parser.add_argument( '--psf-kwargs', '--pk', nargs='*', default=[],
426
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." )
427
429
 
428
430
  parser.add_argument( '-b', '--basename', default='simimage',
429
431
  help=( "base for output filename. Written files will be basename_{mjd:7.1f}_image.fits, "
430
432
  "..._noise.fits, and ..._flags.fits" ) )
431
- parser.add_argument( '-w', '--width', type=int, default=4088, help="Image width (default: 4088)" )
432
- 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)" )
433
435
  parser.add_argument( '--pixscale', '--ps', type=float, default=0.11,
434
436
  help="Image pixel scale in arcsec/pixel (default 0.11)" )
435
437
  parser.add_argument( '-t', '--mjds', type=float, nargs='+', default=None,
436
438
  help="MJDs of images (default: start at 60000., space by 5 days for 60 days)" )
437
439
  parser.add_argument( '--image-centers', '--ic', type=float, nargs='+', default=None,
438
440
  help="ra0 dec0 ra1 dec1 ... ran decn centers of images" )
439
- parser.add_argument( '-r', '--image-rotations', type=float, nargs='+', default=[0.],
441
+ parser.add_argument( '', '--image-rotations', type=float, nargs='+', default=[0.],
440
442
  help="Rotations (degrees) of images about centers" )
441
- parser.add_argument( '-z', '--zerpoints', type=float, nargs='+', default=[33.],
443
+ parser.add_argument( '-z', '--zeropoints', type=float, nargs='+', default=[33.],
442
444
  help="Image zeropoints (default: 33. for all)" )
443
445
  parser.add_argument( '-r', '--sky-noise-rms', type=float, nargs='+', default=100.,
444
446
  help="Image sky RMS noise (default: 100. for all)" )
445
447
  parser.add_argument( '-s', '--sky-level', type=float, nargs='+', default=10.,
446
448
  help="Image sky level (default: 10. for all)" )
447
- parser.add_argument( '-b', '--band', default="R062",
449
+ parser.add_argument( '-f', '--band', '--filter', default="R062",
448
450
  help="Stuck in the BAND Header in the images (default R062)." )
449
451
  parser.add_argument( '--sca', default=1,
450
452
  help="Stuck in the SCA Header in the images (default 1)" )
@@ -461,8 +463,10 @@ def main():
461
463
  help="Start MJD of transient linear rise (default: 60010.)" )
462
464
  parser.add_argument( '--transient-peak-mjd', '--ttm', type=float, default=60030.,
463
465
  help="Peak MJD of transient (default: 60030.)" )
464
- parser.add_argument( '--transient-end-mjd', '--tt1', type=float, default=60010.,
466
+ parser.add_argument( '--transient-end-mjd', '--tt1', type=float, default=60060.,
465
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." )
466
470
 
467
471
  parser.add_argument( '--numprocs', type=int, default=12, help="Number of star rendering processes (default 12)" )
468
472
  parser.add_argument( '-o', '--overwrite', action='store_true', default=False,
@@ -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