setiastrosuitepro 1.7.1.post2__py3-none-any.whl → 1.7.3__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.

Potentially problematic release.


This version of setiastrosuitepro might be problematic. Click here for more details.

Files changed (28) hide show
  1. setiastro/images/3dplanet.png +0 -0
  2. setiastro/saspro/__init__.py +9 -8
  3. setiastro/saspro/__main__.py +326 -285
  4. setiastro/saspro/_generated/build_info.py +2 -2
  5. setiastro/saspro/doc_manager.py +4 -1
  6. setiastro/saspro/gui/main_window.py +41 -2
  7. setiastro/saspro/gui/mixins/file_mixin.py +6 -2
  8. setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
  9. setiastro/saspro/gui/mixins/toolbar_mixin.py +8 -1
  10. setiastro/saspro/imageops/serloader.py +101 -17
  11. setiastro/saspro/layers.py +186 -10
  12. setiastro/saspro/layers_dock.py +198 -5
  13. setiastro/saspro/legacy/image_manager.py +10 -4
  14. setiastro/saspro/planetprojection.py +3854 -0
  15. setiastro/saspro/resources.py +2 -0
  16. setiastro/saspro/save_options.py +45 -13
  17. setiastro/saspro/ser_stack_config.py +21 -1
  18. setiastro/saspro/ser_stacker.py +8 -2
  19. setiastro/saspro/ser_stacker_dialog.py +37 -10
  20. setiastro/saspro/ser_tracking.py +57 -35
  21. setiastro/saspro/serviewer.py +164 -16
  22. setiastro/saspro/subwindow.py +36 -1
  23. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/METADATA +1 -1
  24. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/RECORD +28 -26
  25. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/WHEEL +0 -0
  26. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/entry_points.txt +0 -0
  27. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/licenses/LICENSE +0 -0
  28. {setiastrosuitepro-1.7.1.post2.dist-info → setiastrosuitepro-1.7.3.dist-info}/licenses/license.txt +0 -0
@@ -9,7 +9,7 @@ from PyQt6.QtGui import QImage, QPixmap, QPainter, QPen, QColor
9
9
  from PyQt6.QtWidgets import (
10
10
  QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFileDialog,
11
11
  QScrollArea, QSlider, QCheckBox, QGroupBox, QFormLayout, QSpinBox,
12
- QMessageBox, QRubberBand, QComboBox, QDoubleSpinBox
12
+ QMessageBox, QRubberBand, QComboBox, QDoubleSpinBox, QWidget
13
13
  )
14
14
 
15
15
  from setiastro.saspro.imageops.serloader import open_planetary_source, PlanetaryFrameSource
@@ -323,9 +323,80 @@ class SERViewer(QDialog):
323
323
 
324
324
  self.btn_stack = QPushButton("Open Stacker…", self)
325
325
  self.btn_stack.setEnabled(False) # enabled once SER loaded
326
+ self.chk_planet_norm = QCheckBox("Normalize for planetary centroid detect")
327
+ self.chk_planet_norm.setChecked(True)
328
+ self.chk_planet_norm.setToolTip("Detection-only normalization (does not change stacking pixels). Helps dim planets.")
329
+
330
+ self.spin_planet_thresh = QDoubleSpinBox()
331
+ self.spin_planet_thresh.setRange(50.0, 99.9)
332
+ self.spin_planet_thresh.setDecimals(1)
333
+ self.spin_planet_thresh.setSingleStep(0.5)
334
+ self.spin_planet_thresh.setValue(92.0)
335
+ self.spin_planet_thresh.setToolTip("Percentile used to threshold the blob for centroid detection.")
336
+ self.spin_planet_min = QDoubleSpinBox()
337
+ self.spin_planet_min.setRange(0.0, 0.5) # abs floor in [0..1]
338
+ self.spin_planet_min.setDecimals(3)
339
+ self.spin_planet_min.setSingleStep(0.005)
340
+ self.spin_planet_min.setValue(0.02)
341
+ self.spin_planet_min.setToolTip(
342
+ "Minimum normalized intensity (0..1) allowed for detection thresholding.\n"
343
+ "If percentile threshold is too low on dim planets, this prevents the mask from vanishing.\n"
344
+ "Typical: 0.01–0.05."
345
+ )
346
+
347
+ self.spin_planet_smooth = QDoubleSpinBox()
348
+ self.spin_planet_smooth.setRange(0.0, 10.0)
349
+ self.spin_planet_smooth.setDecimals(2)
350
+ self.spin_planet_smooth.setSingleStep(0.25)
351
+ self.spin_planet_smooth.setValue(1.5)
352
+ self.spin_planet_smooth.setToolTip("Gaussian blur sigma used before thresholding. 1.0–2.0 is typical.")
353
+
354
+ self.spin_norm_lo = QDoubleSpinBox(); self.spin_norm_lo.setRange(0.0, 20.0); self.spin_norm_lo.setValue(1.0)
355
+ self.spin_norm_hi = QDoubleSpinBox(); self.spin_norm_hi.setRange(80.0, 100.0); self.spin_norm_hi.setValue(99.5)
356
+
357
+ # -----------------------------
358
+ # Advanced detection settings
359
+ # -----------------------------
360
+ adv = QGroupBox("Advanced detection settings", self)
361
+ adv.setCheckable(True)
362
+ adv.setChecked(False)
363
+
364
+ adv_body = QWidget(adv) # <- content container
365
+ adv_form = QFormLayout(adv_body)
366
+ adv_form.setContentsMargins(8, 8, 8, 8)
367
+ adv_form.setVerticalSpacing(6)
368
+ adv_form.setHorizontalSpacing(10)
369
+
370
+ adv_form.addRow("", self.chk_planet_norm)
371
+ adv_form.addRow("Planet detect thresh (%)", self.spin_planet_thresh)
372
+ adv_form.addRow("Norm low pct", self.spin_norm_lo)
373
+ adv_form.addRow("Norm high pct", self.spin_norm_hi)
374
+ adv_form.addRow("Planet min val", self.spin_planet_min)
375
+ adv_form.addRow("Planet smooth σ", self.spin_planet_smooth)
376
+
377
+ # Put the body into the groupbox layout
378
+ adv_layout = QVBoxLayout(adv)
379
+ adv_layout.setContentsMargins(8, 8, 8, 8)
380
+ adv_layout.addWidget(adv_body)
381
+
382
+ # show/hide only the body
383
+ adv_body.setVisible(False)
384
+ adv.toggled.connect(adv_body.setVisible)
326
385
 
327
386
  sform.addRow("Tracking", self.cmb_track)
328
387
  sform.addRow("Keep %", self.spin_keep)
388
+
389
+ # instead of adding the detection rows directly:
390
+ # sform.addRow("", self.chk_planet_norm)
391
+ # sform.addRow("Planet detect thresh (%)", self.spin_planet_thresh)
392
+ # sform.addRow("Norm low pct", self.spin_norm_lo)
393
+ # sform.addRow("Norm high pct", self.spin_norm_hi)
394
+ # sform.addRow("Planet min val", self.spin_planet_min)
395
+ # sform.addRow("Planet smooth σ", self.spin_planet_smooth)
396
+
397
+ # add the advanced groupbox as a single row spanning the form
398
+ sform.addRow(adv)
399
+
329
400
  sform.addRow("", self.lbl_anchor)
330
401
  sform.addRow("", self.btn_stack)
331
402
 
@@ -354,7 +425,8 @@ class SERViewer(QDialog):
354
425
  w.toggled.connect(self._refresh)
355
426
  if hasattr(w, "valueChanged"):
356
427
  w.valueChanged.connect(self._refresh)
357
-
428
+ for s in (self.spin_x, self.spin_y, self.spin_w, self.spin_h):
429
+ s.valueChanged.connect(self._sanitize_roi_controls)
358
430
  self.cmb_track.currentIndexChanged.connect(self._on_track_mode_changed)
359
431
  self.btn_stack.clicked.connect(self._open_stacker_clicked)
360
432
  self.cmb_bayer.currentIndexChanged.connect(self._refresh)
@@ -746,16 +818,23 @@ class SERViewer(QDialog):
746
818
  x, y, w, h = rect_disp
747
819
  x_full = int(rx + x)
748
820
  y_full = int(ry + y)
821
+ w = int(w)
822
+ h = int(h)
823
+
824
+ x_full, y_full, w, h = self._even_roi(x_full, y_full, w, h)
825
+
749
826
  self.spin_x.setValue(x_full)
750
827
  self.spin_y.setValue(y_full)
751
- self.spin_w.setValue(int(w))
752
- self.spin_h.setValue(int(h))
828
+ self.spin_w.setValue(w)
829
+ self.spin_h.setValue(h)
753
830
  else:
754
831
  x, y, w, h = rect_disp
755
- self.spin_x.setValue(int(x))
756
- self.spin_y.setValue(int(y))
757
- self.spin_w.setValue(int(w))
758
- self.spin_h.setValue(int(h))
832
+ x, y, w, h = self._even_roi(int(x), int(y), int(w), int(h))
833
+
834
+ self.spin_x.setValue(x)
835
+ self.spin_y.setValue(y)
836
+ self.spin_w.setValue(w)
837
+ self.spin_h.setValue(h)
759
838
 
760
839
  self.chk_roi.setChecked(True)
761
840
  self._refresh()
@@ -844,10 +923,16 @@ class SERViewer(QDialog):
844
923
  track_mode=self._track_mode_value(),
845
924
  surface_anchor=anchor,
846
925
  debayer=debayer,
847
- bayer_pattern=bp, # ✅ THIS IS THE FIX
926
+ bayer_pattern=bp,
848
927
  keep_percent=float(self.spin_keep.value()),
849
- )
850
928
 
929
+ # ✅ planetary detect knobs
930
+ planet_min_val=float(self.spin_planet_min.value()),
931
+ planet_use_norm=bool(self.chk_planet_norm.isChecked()),
932
+ planet_norm_hi_pct=float(self.spin_norm_hi.value()), # <-- you already have this
933
+ planet_thresh_pct=float(self.spin_planet_thresh.value()),
934
+ planet_smooth_sigma=float(self.spin_planet_smooth.value()),
935
+ )
851
936
 
852
937
  dlg.stackProduced.connect(self._on_stacker_produced)
853
938
  dlg.show()
@@ -1090,10 +1175,10 @@ class SERViewer(QDialog):
1090
1175
  dlg.setDirectory(start_dir)
1091
1176
  dlg.setFileMode(QFileDialog.FileMode.ExistingFiles)
1092
1177
  dlg.setNameFilters([
1093
- "Planetary Sources (*.ser *.avi *.mp4 *.mov *.mkv *.png *.tif *.tiff *.jpg *.jpeg *.bmp *.webp)",
1178
+ "Planetary Sources (*.ser *.avi *.mp4 *.mov *.mkv *.png *.tif *.tiff *.jpg *.jpeg *.bmp *.webp *.fit *.fits)",
1094
1179
  "SER Videos (*.ser)",
1095
1180
  "AVI/Video (*.avi *.mp4 *.mov *.mkv)",
1096
- "Images (*.png *.tif *.tiff *.jpg *.jpeg *.bmp *.webp)",
1181
+ "Images (*.png *.tif *.tiff *.jpg *.jpeg *.bmp *.webp *.fit *.fits)",
1097
1182
  "All Files (*)",
1098
1183
  ])
1099
1184
 
@@ -1217,12 +1302,65 @@ class SERViewer(QDialog):
1217
1302
  self._refresh()
1218
1303
 
1219
1304
  # ---------------- rendering ----------------
1305
+ def _even_roi(self, x: int, y: int, w: int, h: int):
1306
+ """Force ROI x,y,w,h to even numbers (preserves Bayer phase)."""
1307
+ if self.reader is None:
1308
+ return x, y, w, h
1309
+
1310
+ m = self.reader.meta
1311
+ W = int(m.width)
1312
+ H = int(m.height)
1313
+
1314
+ # Clamp first
1315
+ x = max(0, min(W - 1, int(x)))
1316
+ y = max(0, min(H - 1, int(y)))
1317
+ w = max(1, int(w))
1318
+ h = max(1, int(h))
1319
+
1320
+ # Make origin even (keep Bayer phase)
1321
+ x &= ~1
1322
+ y &= ~1
1323
+
1324
+ # Make size even
1325
+ w &= ~1
1326
+ h &= ~1
1327
+ if w < 2: w = 2
1328
+ if h < 2: h = 2
1329
+
1330
+ # Fit inside image (keep evenness)
1331
+ if x + w > W:
1332
+ w = (W - x) & ~1
1333
+ if w < 2:
1334
+ x = max(0, (W - 2) & ~1)
1335
+ w = 2
1336
+ if y + h > H:
1337
+ h = (H - y) & ~1
1338
+ if h < 2:
1339
+ y = max(0, (H - 2) & ~1)
1340
+ h = 2
1341
+
1342
+ return int(x), int(y), int(w), int(h)
1343
+
1344
+ def _sanitize_roi_controls(self):
1345
+ if self.reader is None:
1346
+ return
1347
+ x = int(self.spin_x.value()); y = int(self.spin_y.value())
1348
+ w = int(self.spin_w.value()); h = int(self.spin_h.value())
1349
+ ex, ey, ew, eh = self._even_roi(x, y, w, h)
1350
+ if (ex, ey, ew, eh) != (x, y, w, h):
1351
+ self.spin_x.blockSignals(True); self.spin_y.blockSignals(True)
1352
+ self.spin_w.blockSignals(True); self.spin_h.blockSignals(True)
1353
+ self.spin_x.setValue(ex); self.spin_y.setValue(ey)
1354
+ self.spin_w.setValue(ew); self.spin_h.setValue(eh)
1355
+ self.spin_x.blockSignals(False); self.spin_y.blockSignals(False)
1356
+ self.spin_w.blockSignals(False); self.spin_h.blockSignals(False)
1220
1357
 
1221
1358
  def _roi_tuple(self):
1222
1359
  if not self.chk_roi.isChecked():
1223
1360
  return None
1224
- return (int(self.spin_x.value()), int(self.spin_y.value()),
1225
- int(self.spin_w.value()), int(self.spin_h.value()))
1361
+ x, y, w, h = (int(self.spin_x.value()), int(self.spin_y.value()),
1362
+ int(self.spin_w.value()), int(self.spin_h.value()))
1363
+ return self._even_roi(x, y, w, h)
1226
1364
 
1227
1365
  def _on_trim_changed(self):
1228
1366
  if self.reader is None:
@@ -1542,18 +1680,28 @@ class SERViewer(QDialog):
1542
1680
 
1543
1681
  def _to_qimage(self, arr: np.ndarray) -> QImage:
1544
1682
  a = np.clip(arr, 0.0, 1.0)
1683
+
1545
1684
  if a.ndim == 2:
1546
- u = (a * 255.0).astype(np.uint8)
1685
+ u = (a * 255.0).astype(np.uint8, copy=False)
1686
+ # ✅ FITS/memmap correction: ensure C-contiguous rows
1687
+ if not u.flags["C_CONTIGUOUS"]:
1688
+ u = np.ascontiguousarray(u)
1689
+
1547
1690
  h, w = u.shape
1548
1691
  return QImage(u.data, w, h, w, QImage.Format.Format_Grayscale8).copy()
1549
1692
 
1550
1693
  if a.ndim == 3 and a.shape[2] >= 3:
1551
- u = (a[..., :3] * 255.0).astype(np.uint8)
1694
+ u = (a[..., :3] * 255.0).astype(np.uint8, copy=False)
1695
+ # ✅ FITS/memmap correction: ensure C-contiguous packed RGB
1696
+ if not u.flags["C_CONTIGUOUS"]:
1697
+ u = np.ascontiguousarray(u)
1698
+
1552
1699
  h, w, _ = u.shape
1553
1700
  return QImage(u.data, w, h, w * 3, QImage.Format.Format_RGB888).copy()
1554
1701
 
1555
1702
  raise ValueError(f"Unexpected image shape: {a.shape}")
1556
1703
 
1704
+
1557
1705
  def _roi_bounds(self):
1558
1706
  """
1559
1707
  Returns (rx, ry, rw, rh) in full-frame coords if ROI enabled,
@@ -1737,6 +1737,29 @@ class ImageSubWindow(QWidget):
1737
1737
  a_help = menu.addAction(self.tr("Show pixel/WCS readout hint"))
1738
1738
  menu.addSeparator()
1739
1739
  a_prev = menu.addAction(self.tr("Create Preview (drag rectangle)"))
1740
+ # --- Mask actions (requested in zoom/context menu) ---
1741
+ mw = self._find_main_window()
1742
+ vw = self # this ImageSubWindow is the view
1743
+ doc = getattr(vw, "document", None)
1744
+
1745
+ has_mask = bool(doc and getattr(doc, "active_mask_id", None))
1746
+
1747
+ menu.addSeparator()
1748
+ menu.addSection(self.tr("Mask"))
1749
+
1750
+ # 1) Toggle overlay (single item: Show/Hide)
1751
+ a_mask_overlay = menu.addAction(self.tr("Show Mask Overlay"))
1752
+ a_mask_overlay.setCheckable(True)
1753
+ a_mask_overlay.setChecked(bool(getattr(vw, "show_mask_overlay", False)))
1754
+ a_mask_overlay.setEnabled(has_mask)
1755
+
1756
+ # 2) Invert mask
1757
+ a_invert = menu.addAction(self.tr("Invert Mask"))
1758
+ a_invert.setEnabled(has_mask)
1759
+
1760
+ # 3) Remove mask
1761
+ a_remove = menu.addAction(self.tr("Remove Mask"))
1762
+ a_remove.setEnabled(has_mask)
1740
1763
 
1741
1764
  act = menu.exec(self.mapToGlobal(pos))
1742
1765
 
@@ -1756,7 +1779,19 @@ class ImageSubWindow(QWidget):
1756
1779
  elif act == a_prev:
1757
1780
  self._preview_btn.setChecked(True)
1758
1781
  self._toggle_preview_select_mode(True)
1759
-
1782
+ # --- Mask dispatch ---
1783
+ elif act == a_mask_overlay:
1784
+ if mw:
1785
+ if a_mask_overlay.isChecked():
1786
+ mw._show_mask_overlay()
1787
+ else:
1788
+ mw._hide_mask_overlay()
1789
+ elif act == a_invert:
1790
+ if mw:
1791
+ mw._invert_mask()
1792
+ elif act == a_remove:
1793
+ if mw:
1794
+ mw._remove_mask_menu()
1760
1795
 
1761
1796
 
1762
1797
  def _send_to_shelf(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setiastrosuitepro
3
- Version: 1.7.1.post2
3
+ Version: 1.7.3
4
4
  Summary: Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization
5
5
  License: GPL-3.0
6
6
  License-File: LICENSE
@@ -11,6 +11,7 @@ setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv,sha256=NkZ9hflb9
11
11
  setiastro/data/catalogs/test.csv,sha256=vIL2AA8APalVj6ti-waEPS15Qey_DPUlxp1JZw1mN7E,93
12
12
  setiastro/data/catalogs/updated_celestial_catalog.csv,sha256=HOsuyWFrQXEDv0ql2MWSuFDuftOQkUzFWh_DfYM-mz4,936414
13
13
  setiastro/data/SASP_data.fits,sha256=_wLrlMnXSqY15dEvBtAnFE0IZOlj1zDbVEEhegKIcTk,4115520
14
+ setiastro/images/3dplanet.png,sha256=Zm4atz64lJe_uEULmA3QSZN1AKTtRvWeHTjOz4S1PyI,14612
14
15
  setiastro/images/abeicon.png,sha256=r9HNnjZa1Zw_hKP9h6I2XqxOio1_mJBYCgh5gagu6LA,19423
15
16
  setiastro/images/abeicon.svg,sha256=yAnr5-m3ej2OFPeCS156Ek0oI_PAe5Mivh6NXTI4DVo,866
16
17
  setiastro/images/aberration.png,sha256=lP86_M-M-Y6a21xgKnXXoq9GwkujpfxGQ99qyF05JL4,330009
@@ -178,10 +179,10 @@ setiastro/images/wims.png,sha256=EFFaRRUPMMPInRXSr_thUGQAxZTXgDVkjHeiaJiZmgk,117
178
179
  setiastro/images/wrench_icon.png,sha256=4-DFNkXZUBkfK4WCFLdcr1-b3MsrYcE3DGrp4tL6AVI,72352
179
180
  setiastro/images/xisfliberator.png,sha256=sPC7mPHX_ToyBh9nSLn9B5fVRaM89QvqzW30ohbW8VE,1551111
180
181
  setiastro/qml/ResourceMonitor.qml,sha256=k9_qXKAZLi8vj-5BffJTJu_UkRnxunZKn53HthdySKE,3948
181
- setiastro/saspro/__init__.py,sha256=C6Puq5PQr3n0aJ-2i_YAaUhTjPI-pcSzie3_tij3hhw,608
182
- setiastro/saspro/__main__.py,sha256=eghNEGSQqHQjNp0BY84T-nhQMPYSnWdIN_eRFvbLj3Q,38487
182
+ setiastro/saspro/__init__.py,sha256=SkWRk-MAmjda55lRe1NvOEKqweotw7DunPVXlrgRFDc,717
183
+ setiastro/saspro/__main__.py,sha256=CDMFSrgAwc8wdTwHCUTUzAapUbuw8NiVqkHYBijCmKE,40202
183
184
  setiastro/saspro/_generated/__init__.py,sha256=HbruQfKNbbVL4kh_t4oVG3UeUieaW8MUaqIcDCmnTvA,197
184
- setiastro/saspro/_generated/build_info.py,sha256=4UOR5gpp-kZV0OjktWjm1RWP5qcSBa5MuW3tA51hpHU,117
185
+ setiastro/saspro/_generated/build_info.py,sha256=iRzxmbhtGJIfcKywH10Ti1lyiapv-nfeMjJM6-teNcw,111
185
186
  setiastro/saspro/abe.py,sha256=ao9UiOneVvgubI19TCE4gk2FNfW_E3D8rr0D_bmQOwI,59779
186
187
  setiastro/saspro/abe_preset.py,sha256=u9t16yTb9v98tLjhvh496Fsp3Z-dNiBSs5itnAaJwh8,7750
187
188
  setiastro/saspro/aberration_ai.py,sha256=8LtDu_KuqvL-W0MTUIJq9KguMjJPiUEQjMUibY16H-4,41673
@@ -221,7 +222,7 @@ setiastro/saspro/curves_preset.py,sha256=Cmz34JZWWrPIbudpPk1WvDk5NFjGIP-Vui3h_mx
221
222
  setiastro/saspro/debayer.py,sha256=emuQdb41xHwGVvnBU-SF1H_Zdz271RFTz0lm09xl184,25314
222
223
  setiastro/saspro/debug_utils.py,sha256=uYQne3MHxg_R7y17NqKFj1_befrmjzOI3_jD4JKovnA,1085
223
224
  setiastro/saspro/dnd_mime.py,sha256=QNG97JQJc3xNQ5cPD4zwbC7OZTf9BzqjXE2SvZV9H5Q,1143
224
- setiastro/saspro/doc_manager.py,sha256=phRjYuGm1hI-tkSOHcvlkWyBCKdwy0CR2nYiIfVLbJk,112851
225
+ setiastro/saspro/doc_manager.py,sha256=ujII9hpYAgOagMxtUeeIwVEmQjzRot2kqj4-mF1ULGg,113035
225
226
  setiastro/saspro/exoplanet_detector.py,sha256=_zhasWOf63BCZJuFy1vRC5PMGcc4Rf6DmkbveUuzDdY,96858
226
227
  setiastro/saspro/file_utils.py,sha256=zB2BqVnDVLbg_5eO3PIFgYu_Ulm5M3MXQUuzNdvO6Q4,7569
227
228
  setiastro/saspro/fitsmodifier.py,sha256=jYrSUwMacohP8ErFdJy0sr8Ld4YrTUgDdwaDr-_pRWg,30362
@@ -235,16 +236,16 @@ setiastro/saspro/ghs_preset.py,sha256=Zw3MJH5rEz7nqLdlmRBm3vYXgyopoupyDGAhM-PRXq
235
236
  setiastro/saspro/graxpert.py,sha256=XSLeBhlAY2DkYUw93j2OEOuPLOPfzWYcT5Dz3JhhpW8,22579
236
237
  setiastro/saspro/graxpert_preset.py,sha256=ESds2NPMPfsBHWNBfyYZ1rFpQxZ9gPOtxwz8enHfFfc,10719
237
238
  setiastro/saspro/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
- setiastro/saspro/gui/main_window.py,sha256=diJSremknoG4m4xwiDV43VdMSlV04_7GqcQQO11TiCg,373474
239
+ setiastro/saspro/gui/main_window.py,sha256=ucjhcH9OZsQ3npCmYpVabAz47Xdu67LXdTqDqckao4g,374917
239
240
  setiastro/saspro/gui/mixins/__init__.py,sha256=ubdTIri0xoRs6MwDnEaVsAHbMxuPqz0CZcYcue3Mkcc,836
240
241
  setiastro/saspro/gui/mixins/dock_mixin.py,sha256=C6IWKM-uP2ekqO7ozVQQcTnEgAkUL_OaRZbncIdrh8g,23893
241
- setiastro/saspro/gui/mixins/file_mixin.py,sha256=ZzKzJhnNKjbi7UQHFhq4Nr2tNLRbB_fQeMHcOj09BU8,17714
242
+ setiastro/saspro/gui/mixins/file_mixin.py,sha256=p6gKJrDTKovK4YzowDQy1Z5nNsspQe7B9ICRXvCUvxc,17893
242
243
  setiastro/saspro/gui/mixins/geometry_mixin.py,sha256=x-HyLXGFhEs8SJuXT8EF6tS3XJaH8IhAP-ZFJ2BS2Lw,19038
243
244
  setiastro/saspro/gui/mixins/header_mixin.py,sha256=kfZUJviB61c8NBXFB3MVBEcRPX_36ZV8tUZNJkDmMJ0,17253
244
245
  setiastro/saspro/gui/mixins/mask_mixin.py,sha256=hrC5jLWxUZgQiYUXp7nvECo2uiarK7_HKgawG4HGB9w,15711
245
- setiastro/saspro/gui/mixins/menu_mixin.py,sha256=ibaDJx3HGrGTnhWxi7oZ6XxAy-eThKLSLqiL4gpnXqM,16696
246
+ setiastro/saspro/gui/mixins/menu_mixin.py,sha256=eoXZPjMysBXcC2DllHmXwSFv2BnFO-GDUgm-9XpJU0c,16750
246
247
  setiastro/saspro/gui/mixins/theme_mixin.py,sha256=td6hYnZn17lXlFxQOXgK7-qfKo6CIJACF8_zrULlEkc,20740
247
- setiastro/saspro/gui/mixins/toolbar_mixin.py,sha256=fYrgpt0jh1HbZ9i9Nb-bbgrgSUD5AMAHQ77y5W2rOI4,92408
248
+ setiastro/saspro/gui/mixins/toolbar_mixin.py,sha256=6LYgIRfNd59NYWEZ0zmCqLanwaYhLEqsGEm10RI9O54,92924
248
249
  setiastro/saspro/gui/mixins/update_mixin.py,sha256=rq7J0Pcn_gO8UehCGVtcSvf-MDbmeGf796h0JBGr0sM,16545
249
250
  setiastro/saspro/gui/mixins/view_mixin.py,sha256=EacXxtoAvkectGgLiahf3rHv2AaqKDQUteocVV_P834,17850
250
251
  setiastro/saspro/gui/statistics_dialog.py,sha256=celhcsHcp3lNpox_X0ByAiYE80qFaF-dYyP8StzgrcU,1955
@@ -260,15 +261,15 @@ setiastro/saspro/imageops/__init__.py,sha256=CE9mHOsruHOQ5bYOHr1_fhxd9sdK1W9BpAi
260
261
  setiastro/saspro/imageops/mdi_snap.py,sha256=Xyogrv3N0KRAKcfC65hy_PKG6ZktjmwDBisCQ_cP9pY,10117
261
262
  setiastro/saspro/imageops/narrowband_normalization.py,sha256=q1KdHS7bjRYW-N0Jbszxf0TF38tNNgXKknM80lrzUsA,26793
262
263
  setiastro/saspro/imageops/scnr.py,sha256=jLHxBU4KQ9Mu61Cym5YUq0pwxajJmGrPQRV2pug9LXE,1330
263
- setiastro/saspro/imageops/serloader.py,sha256=DJiHBKF8067wsHIRY7D2B-nAJI2iHzUpIW9b0zYpKRk,46366
264
+ setiastro/saspro/imageops/serloader.py,sha256=uxZUobb3ebvd5xWr4XorOSNmtg7_9EMj6WqQ-E1fnxo,49028
264
265
  setiastro/saspro/imageops/starbasedwhitebalance.py,sha256=urssLdgKD7J_LOuscjbf9zFImnUWoH-sotGvtbxfxTo,6589
265
266
  setiastro/saspro/imageops/stretch.py,sha256=E_Ydh5VxUHrehwivhvVDvF8y89U6SRyjIFUQgJjHWXI,27113
266
267
  setiastro/saspro/isophote.py,sha256=eSzlyBN_tZJSJTKlnBjwHY0zdw0SXPV6BRk_jt9TlVU,53753
267
- setiastro/saspro/layers.py,sha256=L-_C91YlPF8NtyNbALkU9OlhK5mhtP3Ks1XiGWGG5c0,6641
268
- setiastro/saspro/layers_dock.py,sha256=M4rc-UNDggClDxQdf-6wMwuvo6A23RK8fAqlcHJC8I4,35677
268
+ setiastro/saspro/layers.py,sha256=X83XlwJhH0zjjC6b3CGeQg4dBp4w9zxBGfZVwtY1h3Q,12997
269
+ setiastro/saspro/layers_dock.py,sha256=1vdxAPmdQ1_8ZqA4IySspqvcydB_alSj3AARoWbb29Y,42735
269
270
  setiastro/saspro/lazy_imports.py,sha256=0M-4zklRGlqt5tvV6XZEFm958cRrOkxrjvSp_Ib1_zA,6564
270
271
  setiastro/saspro/legacy/__init__.py,sha256=NjuxU-id3METsQ6tNd53YVqDTZK6mEz7uYjLzguCdNQ,121
271
- setiastro/saspro/legacy/image_manager.py,sha256=ApWwRKOgmzgpNLw_t0l4AFXdOAZhrIG71zL8NiDnzQY,101372
272
+ setiastro/saspro/legacy/image_manager.py,sha256=qH0NHRjJu6vDWTEYivTNifH9ytVRN1f5XMhm7pBCDVE,101597
272
273
  setiastro/saspro/legacy/numba_utils.py,sha256=JZW1yJGMd0QLYojVpk9h_nEf6MpbdFTzqEPnN4m7GjU,135407
273
274
  setiastro/saspro/legacy/xisf.py,sha256=Ah1CXDAohN__ej1Lq7LPU8vGLnDz8fluLQTGE71aUoc,52669
274
275
  setiastro/saspro/linear_fit.py,sha256=s17ZExDxToqBuqv14-o6OFQpXYTyW2TUj_EunohxvAk,20918
@@ -305,6 +306,7 @@ setiastro/saspro/pedestal.py,sha256=WkwNaY0Qp1XP6KFtb6tnnKMhg71R5WEhVOdwWwJFmJ8,
305
306
  setiastro/saspro/perfect_palette_picker.py,sha256=wJSTQQZgFm-baEBRopfF4Aw6vtvTmfL4_FZcd1q31vs,46937
306
307
  setiastro/saspro/pipeline.py,sha256=QO8tttr050dbJkpkShO4g7gUEESAcRhhn7LLp0IwKyw,3774
307
308
  setiastro/saspro/pixelmath.py,sha256=BVMe5ekKnPR2bLt6OEpUqzkMUsu2ENQhmcQ-hM5XcAw,72203
309
+ setiastro/saspro/planetprojection.py,sha256=2e51jpdabb9g6vJ1ItnaGxIUEJNRag4tEKDzP2FwaFw,144308
308
310
  setiastro/saspro/plate_solver.py,sha256=QREhP8OKEm4jy2VGFEINW1q3-B4-lGnpIKdNiOwgxuc,96342
309
311
  setiastro/saspro/project_io.py,sha256=usCbXxgB6bKj4L_71eTQIIzOzYAWxaNUoY4duB6oC5g,30357
310
312
  setiastro/saspro/psf_utils.py,sha256=K3R4BjUzsopLRuLTbPlm8lBw3-x9twNWG4bK-4phDM4,4555
@@ -313,19 +315,19 @@ setiastro/saspro/pyi_rthook_astroquery.py,sha256=Omt8U0gMI3efw3y-GUUJtBYUylwT1OM
313
315
  setiastro/saspro/remove_green.py,sha256=bd_4xLe-tEYPncOSVUHh-fVIrPWG6K0ESKgAygrwj_M,12082
314
316
  setiastro/saspro/remove_stars.py,sha256=tv61y58xdm5g5Gu5T3I7jUqSmVVguJ9BWOKBy_X8ub8,60967
315
317
  setiastro/saspro/remove_stars_preset.py,sha256=HcR50bRXqiJSx4jMyle389g8b6SIulXHxgSysk07vdk,19195
316
- setiastro/saspro/resources.py,sha256=flxNJp_0tAGHVVDkZCnxp5AsPJy-zfiOqjmAF8eGnYY,27412
318
+ setiastro/saspro/resources.py,sha256=gqnGhWd9gt4NnADI3fnTSRcs8koigFrihLUj4urLlWc,27559
317
319
  setiastro/saspro/rgb_combination.py,sha256=8MKlxsbn5Pmiq3Vh28fMVYgYG4EIsvOYrwSJisJGyds,8765
318
320
  setiastro/saspro/rgb_extract.py,sha256=FZRA2qac8LR2u-jNcQP-1xFeiOYVBo06-Q3Xl0KAlZM,624
319
321
  setiastro/saspro/rgbalign.py,sha256=XwBDj5t_zj9Uh-PaX1SNlzix9PftnQBIoTMtRPvYK80,46528
320
322
  setiastro/saspro/runtime_imports.py,sha256=tgIHH10cdAEbCTOmcs7retQhAww2dEc_3mKrv_m8W9s,206
321
323
  setiastro/saspro/runtime_torch.py,sha256=IEVqD8jgn6la8t3R9ngZ2egSGMAC_tr1im3R8BnvXTQ,33497
322
- setiastro/saspro/save_options.py,sha256=HPMXl5ya7HlCgDle9mPUrthzIFVJWXQGrea_OkcHg6c,2722
324
+ setiastro/saspro/save_options.py,sha256=wUvuZBCDcQFDXF846njBd_4xoSRa2Ih1-I8Hf5ZTLbk,3648
323
325
  setiastro/saspro/selective_color.py,sha256=hx-9X4jeso797ifoBmwp9hNagPW4cvNPs9-T0JLHce0,64804
324
- setiastro/saspro/ser_stack_config.py,sha256=iZ2Oj1WUs2N0betBzrQbdlpbaXKjba-x_YqI7s9U38s,3426
325
- setiastro/saspro/ser_stacker.py,sha256=gUXdPzEI6oiznWjONmXe8KmoWvZ3etWKp40-Rwr15GM,84879
326
- setiastro/saspro/ser_stacker_dialog.py,sha256=b_woajn2DPDXekxnVmbwCoAa22M4Lvhu9Dh5RgkCNEk,68306
327
- setiastro/saspro/ser_tracking.py,sha256=z5jHJIs0t3kK3p5C330vwz0c6zJ9KXtKIh1FlJ1LljU,7141
328
- setiastro/saspro/serviewer.py,sha256=7qLoZzRwwygqfZtGiewurAgkKuZ1gNe1e75B4gjnTz8,62200
326
+ setiastro/saspro/ser_stack_config.py,sha256=OMQHnRysXMW2l05PGLlwu1JxEBAcdUpBOEnFvn9jXP0,4921
327
+ setiastro/saspro/ser_stacker.py,sha256=HLJgX-Dc8hIajNupoK6U-APbr1vsHOycerL5KeYDI1Q,85310
328
+ setiastro/saspro/ser_stacker_dialog.py,sha256=TfQBwbEF7722jJAb4nML-eQPe247usbeaby98sz_Hho,69471
329
+ setiastro/saspro/ser_tracking.py,sha256=HU5F2ZAekjBsKu-nYQVqbx3FukUqGYTkTK6J9n0tUgg,8077
330
+ setiastro/saspro/serviewer.py,sha256=QvPtJky2IzrywXaOYjeSZSNY0I64TSrzfgH7vRgGk7M,68763
329
331
  setiastro/saspro/sfcc.py,sha256=mKdNfbMxl4fgqyZnuAlkzNNIU3huYOHgqw0FGjtVhUs,89097
330
332
  setiastro/saspro/shortcuts.py,sha256=QvFBXN_S8jqEwaP9m4pJMLVqzBmxo5HrjWhVCV9etQg,138256
331
333
  setiastro/saspro/signature_insert.py,sha256=pWDxUO1Rxm27_fHSo2Y99bdOD2iG9q4AUjGR20x6TiA,70401
@@ -337,7 +339,7 @@ setiastro/saspro/star_spikes.py,sha256=PKI9C8SYmyi9St-IMtyJn75858kfi0NIJ26uDEjlS
337
339
  setiastro/saspro/star_stretch.py,sha256=Sb4ZD3nTVS7zVIWPDtgjgwwhDnuOqM-cW6DBVLlqM1c,21308
338
340
  setiastro/saspro/stat_stretch.py,sha256=DQjLzhsvcqhJrBmR_ZuSoGHEo5D1R7SHg_pfRnEZQ58,50934
339
341
  setiastro/saspro/status_log_dock.py,sha256=SEZiijVLmtWbGxxjvf3XWUuMUhoVw50nwVfj7NhAl8s,2922
340
- setiastro/saspro/subwindow.py,sha256=-4m-2XS4H02H6kvloGnoPsvVj0GAy8eED-llQ1HmA2E,142877
342
+ setiastro/saspro/subwindow.py,sha256=xiaowKi_G4Ph4L4bW1vbG5ZzMwFfhNVdAEHnuFmdlZc,144201
341
343
  setiastro/saspro/supernovaasteroidhunter.py,sha256=PgCq3IR2pzsNBx6IxdhqfZlKPMZFhWI6cMJi600He78,66781
342
344
  setiastro/saspro/swap_manager.py,sha256=7hJvQsnm1LSqLmXrj5uQkTSqNJq1SvrtrkCQPJdNego,4643
343
345
  setiastro/saspro/texture_clarity.py,sha256=1snw-j91j5C--qi27VtQfZ_pIcRDLNH0K63tkFGvqe4,22918
@@ -405,9 +407,9 @@ setiastro/saspro/wimi.py,sha256=CNo833Pur9P-A1DUSntlAaQWekf6gzWIvetOMvLDrOw,3146
405
407
  setiastro/saspro/wims.py,sha256=HDfVI3Ckf5OJEJLH8NI36pFc2USZnETpb4UDIvweNX4,27450
406
408
  setiastro/saspro/window_shelf.py,sha256=jQUifB3uJ9tkzXqmscWj8lHQN5E8yleuRc7hDnes4-k,7453
407
409
  setiastro/saspro/xisf.py,sha256=Ah1CXDAohN__ej1Lq7LPU8vGLnDz8fluLQTGE71aUoc,52669
408
- setiastrosuitepro-1.7.1.post2.dist-info/entry_points.txt,sha256=vJfnZaV6Uj3laETakqT8-D-aJZI_nYIicrhSoL0uuko,227
409
- setiastrosuitepro-1.7.1.post2.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
410
- setiastrosuitepro-1.7.1.post2.dist-info/licenses/license.txt,sha256=KCwYZ9VpVwmzjelDq1BzzWqpBvt9nbbapa-woz47hfQ,123930
411
- setiastrosuitepro-1.7.1.post2.dist-info/METADATA,sha256=IepY0VUqaeAsDguY5J41SVRRtQvzQ5I8FuUuxYEietM,9925
412
- setiastrosuitepro-1.7.1.post2.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
413
- setiastrosuitepro-1.7.1.post2.dist-info/RECORD,,
410
+ setiastrosuitepro-1.7.3.dist-info/entry_points.txt,sha256=vJfnZaV6Uj3laETakqT8-D-aJZI_nYIicrhSoL0uuko,227
411
+ setiastrosuitepro-1.7.3.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
412
+ setiastrosuitepro-1.7.3.dist-info/licenses/license.txt,sha256=KCwYZ9VpVwmzjelDq1BzzWqpBvt9nbbapa-woz47hfQ,123930
413
+ setiastrosuitepro-1.7.3.dist-info/METADATA,sha256=vXF_AZ0PBoL03VyVA97BhQ-mOaJLYxfsz5c8QSwPXbU,9919
414
+ setiastrosuitepro-1.7.3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
415
+ setiastrosuitepro-1.7.3.dist-info/RECORD,,