setiastrosuitepro 1.6.12__py3-none-any.whl → 1.7.1.post2__py3-none-any.whl

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.
Files changed (42) hide show
  1. setiastro/images/TextureClarity.svg +56 -0
  2. setiastro/images/narrowbandnormalization.png +0 -0
  3. setiastro/images/planetarystacker.png +0 -0
  4. setiastro/saspro/_generated/build_info.py +2 -2
  5. setiastro/saspro/aberration_ai.py +128 -13
  6. setiastro/saspro/aberration_ai_preset.py +29 -3
  7. setiastro/saspro/astrospike_python.py +45 -3
  8. setiastro/saspro/blink_comparator_pro.py +116 -71
  9. setiastro/saspro/curve_editor_pro.py +72 -22
  10. setiastro/saspro/curves_preset.py +249 -47
  11. setiastro/saspro/gui/main_window.py +285 -44
  12. setiastro/saspro/gui/mixins/file_mixin.py +35 -16
  13. setiastro/saspro/gui/mixins/menu_mixin.py +8 -0
  14. setiastro/saspro/gui/mixins/toolbar_mixin.py +115 -6
  15. setiastro/saspro/histogram.py +179 -7
  16. setiastro/saspro/imageops/narrowband_normalization.py +816 -0
  17. setiastro/saspro/imageops/serloader.py +1345 -0
  18. setiastro/saspro/legacy/numba_utils.py +1 -1
  19. setiastro/saspro/live_stacking.py +24 -4
  20. setiastro/saspro/multiscale_decomp.py +30 -17
  21. setiastro/saspro/narrowband_normalization.py +1618 -0
  22. setiastro/saspro/remove_green.py +1 -1
  23. setiastro/saspro/resources.py +6 -0
  24. setiastro/saspro/rgbalign.py +456 -12
  25. setiastro/saspro/ser_stack_config.py +82 -0
  26. setiastro/saspro/ser_stacker.py +2321 -0
  27. setiastro/saspro/ser_stacker_dialog.py +1838 -0
  28. setiastro/saspro/ser_tracking.py +206 -0
  29. setiastro/saspro/serviewer.py +1625 -0
  30. setiastro/saspro/sfcc.py +298 -64
  31. setiastro/saspro/shortcuts.py +14 -7
  32. setiastro/saspro/stacking_suite.py +21 -6
  33. setiastro/saspro/stat_stretch.py +179 -31
  34. setiastro/saspro/subwindow.py +2 -4
  35. setiastro/saspro/texture_clarity.py +593 -0
  36. setiastro/saspro/widgets/resource_monitor.py +122 -74
  37. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/METADATA +3 -2
  38. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/RECORD +42 -30
  39. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/WHEEL +0 -0
  40. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/entry_points.txt +0 -0
  41. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/licenses/LICENSE +0 -0
  42. {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/licenses/license.txt +0 -0
@@ -0,0 +1,82 @@
1
+ # src/setiastro/saspro/ser_stack_config.py
2
+ from __future__ import annotations
3
+ from dataclasses import dataclass
4
+ from typing import Optional, Tuple, Literal, Union, Sequence, TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ import numpy as np
8
+ KeepMask = "np.ndarray"
9
+ else:
10
+ KeepMask = object
11
+
12
+ from setiastro.saspro.imageops.serloader import PlanetaryFrameSource
13
+
14
+ TrackMode = Literal["off", "planetary", "surface"]
15
+ PlanetarySource = Union[str, Sequence[str], PlanetaryFrameSource]
16
+
17
+ @dataclass
18
+ class SERStackConfig:
19
+ source: PlanetarySource
20
+ roi: Optional[Tuple[int, int, int, int]] = None
21
+ track_mode: TrackMode = "planetary"
22
+ surface_anchor: Optional[Tuple[int, int, int, int]] = None
23
+ keep_percent: float = 20.0
24
+ bayer_pattern: Optional[str] = None
25
+
26
+ # AP / alignment
27
+ ap_size: int = 64
28
+ ap_spacing: int = 48
29
+ ap_min_mean: float = 0.03
30
+ ap_multiscale: bool = False
31
+ ssd_refine_bruteforce: bool = False
32
+ keep_mask: Optional[KeepMask] = None
33
+
34
+ # ✅ Drizzle
35
+ drizzle_scale: float = 1.0 # 1.0 = off, 1.5, 2.0
36
+ drizzle_pixfrac: float = 0.80 # "drop shrink" in output pixels (roughly)
37
+ drizzle_kernel: str = "gaussian" # "square" | "circle" | "gaussian"
38
+ drizzle_sigma: float = 0.0 # only used for gaussian; 0 => auto from pixfrac
39
+
40
+ def __init__(self, source: PlanetarySource, **kwargs):
41
+ # Allow deprecated/ignored kwargs without crashing
42
+ kwargs.pop("multipoint", None) # accept but ignore
43
+
44
+ self.source = source
45
+ self.roi = kwargs.pop("roi", None)
46
+ self.track_mode = kwargs.pop("track_mode", "planetary")
47
+ self.surface_anchor = kwargs.pop("surface_anchor", None)
48
+ self.keep_percent = float(kwargs.pop("keep_percent", 20.0))
49
+ self.bayer_pattern = kwargs.pop("bayer_pattern", None)
50
+ if isinstance(self.bayer_pattern, str):
51
+ s = self.bayer_pattern.strip().upper()
52
+ self.bayer_pattern = s if s in ("RGGB", "BGGR", "GRBG", "GBRG") else None
53
+ else:
54
+ self.bayer_pattern = None
55
+ self.ap_size = int(kwargs.pop("ap_size", 64))
56
+ self.ap_spacing = int(kwargs.pop("ap_spacing", 48))
57
+ self.ap_min_mean = float(kwargs.pop("ap_min_mean", 0.03))
58
+ self.ap_multiscale = bool(kwargs.pop("ap_multiscale", False))
59
+ self.ssd_refine_bruteforce = bool(kwargs.pop("ssd_refine_bruteforce", False))
60
+ self.keep_mask = kwargs.pop("keep_mask", None)
61
+
62
+ # ✅ NEW: Drizzle params
63
+ self.drizzle_scale = float(kwargs.pop("drizzle_scale", 1.0))
64
+ if self.drizzle_scale not in (1.0, 1.5, 2.0):
65
+ self.drizzle_scale = 1.0
66
+
67
+ self.drizzle_pixfrac = float(kwargs.pop("drizzle_pixfrac", 0.80))
68
+ self.drizzle_kernel = str(kwargs.pop("drizzle_kernel", "gaussian")).strip().lower()
69
+ self.drizzle_sigma = float(kwargs.pop("drizzle_sigma", 0.0))
70
+
71
+ # sanitize a bit
72
+ if self.drizzle_scale < 1.0:
73
+ self.drizzle_scale = 1.0
74
+ if self.drizzle_pixfrac <= 0.0:
75
+ self.drizzle_pixfrac = 0.01
76
+ if self.drizzle_kernel not in ("square", "circle", "gaussian"):
77
+ self.drizzle_kernel = "gaussian"
78
+ if self.drizzle_sigma < 0.0:
79
+ self.drizzle_sigma = 0.0
80
+
81
+ if kwargs:
82
+ raise TypeError(f"Unexpected config keys: {sorted(kwargs.keys())}")