setiastrosuitepro 1.6.7__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 (394) hide show
  1. setiastro/__init__.py +2 -0
  2. setiastro/data/SASP_data.fits +0 -0
  3. setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +488 -0
  4. setiastro/data/catalogs/astrobin_filters.csv +890 -0
  5. setiastro/data/catalogs/astrobin_filters_page1_local.csv +51 -0
  6. setiastro/data/catalogs/cali2.csv +63 -0
  7. setiastro/data/catalogs/cali2color.csv +65 -0
  8. setiastro/data/catalogs/celestial_catalog - original.csv +16471 -0
  9. setiastro/data/catalogs/celestial_catalog.csv +24031 -0
  10. setiastro/data/catalogs/detected_stars.csv +24784 -0
  11. setiastro/data/catalogs/fits_header_data.csv +46 -0
  12. setiastro/data/catalogs/test.csv +8 -0
  13. setiastro/data/catalogs/updated_celestial_catalog.csv +16471 -0
  14. setiastro/images/Astro_Spikes.png +0 -0
  15. setiastro/images/Background_startup.jpg +0 -0
  16. setiastro/images/HRDiagram.png +0 -0
  17. setiastro/images/LExtract.png +0 -0
  18. setiastro/images/LInsert.png +0 -0
  19. setiastro/images/Oxygenation-atm-2.svg.png +0 -0
  20. setiastro/images/RGB080604.png +0 -0
  21. setiastro/images/abeicon.png +0 -0
  22. setiastro/images/aberration.png +0 -0
  23. setiastro/images/acv_icon.png +0 -0
  24. setiastro/images/andromedatry.png +0 -0
  25. setiastro/images/andromedatry_satellited.png +0 -0
  26. setiastro/images/annotated.png +0 -0
  27. setiastro/images/aperture.png +0 -0
  28. setiastro/images/astrosuite.ico +0 -0
  29. setiastro/images/astrosuite.png +0 -0
  30. setiastro/images/astrosuitepro.icns +0 -0
  31. setiastro/images/astrosuitepro.ico +0 -0
  32. setiastro/images/astrosuitepro.png +0 -0
  33. setiastro/images/background.png +0 -0
  34. setiastro/images/background2.png +0 -0
  35. setiastro/images/benchmark.png +0 -0
  36. setiastro/images/big_moon_stabilizer_timeline.png +0 -0
  37. setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
  38. setiastro/images/blaster.png +0 -0
  39. setiastro/images/blink.png +0 -0
  40. setiastro/images/clahe.png +0 -0
  41. setiastro/images/collage.png +0 -0
  42. setiastro/images/colorwheel.png +0 -0
  43. setiastro/images/contsub.png +0 -0
  44. setiastro/images/convo.png +0 -0
  45. setiastro/images/copyslot.png +0 -0
  46. setiastro/images/cosmic.png +0 -0
  47. setiastro/images/cosmicsat.png +0 -0
  48. setiastro/images/crop1.png +0 -0
  49. setiastro/images/cropicon.png +0 -0
  50. setiastro/images/curves.png +0 -0
  51. setiastro/images/cvs.png +0 -0
  52. setiastro/images/debayer.png +0 -0
  53. setiastro/images/denoise_cnn_custom.png +0 -0
  54. setiastro/images/denoise_cnn_graph.png +0 -0
  55. setiastro/images/disk.png +0 -0
  56. setiastro/images/dse.png +0 -0
  57. setiastro/images/exoicon.png +0 -0
  58. setiastro/images/eye.png +0 -0
  59. setiastro/images/first_quarter.png +0 -0
  60. setiastro/images/fliphorizontal.png +0 -0
  61. setiastro/images/flipvertical.png +0 -0
  62. setiastro/images/font.png +0 -0
  63. setiastro/images/freqsep.png +0 -0
  64. setiastro/images/full_moon.png +0 -0
  65. setiastro/images/functionbundle.png +0 -0
  66. setiastro/images/graxpert.png +0 -0
  67. setiastro/images/green.png +0 -0
  68. setiastro/images/gridicon.png +0 -0
  69. setiastro/images/halo.png +0 -0
  70. setiastro/images/hdr.png +0 -0
  71. setiastro/images/histogram.png +0 -0
  72. setiastro/images/hubble.png +0 -0
  73. setiastro/images/imagecombine.png +0 -0
  74. setiastro/images/invert.png +0 -0
  75. setiastro/images/isophote.png +0 -0
  76. setiastro/images/isophote_demo_figure.png +0 -0
  77. setiastro/images/isophote_demo_image.png +0 -0
  78. setiastro/images/isophote_demo_model.png +0 -0
  79. setiastro/images/isophote_demo_residual.png +0 -0
  80. setiastro/images/jwstpupil.png +0 -0
  81. setiastro/images/last_quarter.png +0 -0
  82. setiastro/images/linearfit.png +0 -0
  83. setiastro/images/livestacking.png +0 -0
  84. setiastro/images/mask.png +0 -0
  85. setiastro/images/maskapply.png +0 -0
  86. setiastro/images/maskcreate.png +0 -0
  87. setiastro/images/maskremove.png +0 -0
  88. setiastro/images/morpho.png +0 -0
  89. setiastro/images/mosaic.png +0 -0
  90. setiastro/images/multiscale_decomp.png +0 -0
  91. setiastro/images/nbtorgb.png +0 -0
  92. setiastro/images/neutral.png +0 -0
  93. setiastro/images/new_moon.png +0 -0
  94. setiastro/images/nuke.png +0 -0
  95. setiastro/images/openfile.png +0 -0
  96. setiastro/images/pedestal.png +0 -0
  97. setiastro/images/pen.png +0 -0
  98. setiastro/images/pixelmath.png +0 -0
  99. setiastro/images/platesolve.png +0 -0
  100. setiastro/images/ppp.png +0 -0
  101. setiastro/images/pro.png +0 -0
  102. setiastro/images/project.png +0 -0
  103. setiastro/images/psf.png +0 -0
  104. setiastro/images/redo.png +0 -0
  105. setiastro/images/redoicon.png +0 -0
  106. setiastro/images/rescale.png +0 -0
  107. setiastro/images/rgbalign.png +0 -0
  108. setiastro/images/rgbcombo.png +0 -0
  109. setiastro/images/rgbextract.png +0 -0
  110. setiastro/images/rotate180.png +0 -0
  111. setiastro/images/rotatearbitrary.png +0 -0
  112. setiastro/images/rotateclockwise.png +0 -0
  113. setiastro/images/rotatecounterclockwise.png +0 -0
  114. setiastro/images/satellite.png +0 -0
  115. setiastro/images/script.png +0 -0
  116. setiastro/images/selectivecolor.png +0 -0
  117. setiastro/images/simbad.png +0 -0
  118. setiastro/images/slot0.png +0 -0
  119. setiastro/images/slot1.png +0 -0
  120. setiastro/images/slot2.png +0 -0
  121. setiastro/images/slot3.png +0 -0
  122. setiastro/images/slot4.png +0 -0
  123. setiastro/images/slot5.png +0 -0
  124. setiastro/images/slot6.png +0 -0
  125. setiastro/images/slot7.png +0 -0
  126. setiastro/images/slot8.png +0 -0
  127. setiastro/images/slot9.png +0 -0
  128. setiastro/images/spcc.png +0 -0
  129. setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
  130. setiastro/images/spinner.gif +0 -0
  131. setiastro/images/stacking.png +0 -0
  132. setiastro/images/staradd.png +0 -0
  133. setiastro/images/staralign.png +0 -0
  134. setiastro/images/starnet.png +0 -0
  135. setiastro/images/starregistration.png +0 -0
  136. setiastro/images/starspike.png +0 -0
  137. setiastro/images/starstretch.png +0 -0
  138. setiastro/images/statstretch.png +0 -0
  139. setiastro/images/supernova.png +0 -0
  140. setiastro/images/uhs.png +0 -0
  141. setiastro/images/undoicon.png +0 -0
  142. setiastro/images/upscale.png +0 -0
  143. setiastro/images/viewbundle.png +0 -0
  144. setiastro/images/waning_crescent_1.png +0 -0
  145. setiastro/images/waning_crescent_2.png +0 -0
  146. setiastro/images/waning_crescent_3.png +0 -0
  147. setiastro/images/waning_crescent_4.png +0 -0
  148. setiastro/images/waning_crescent_5.png +0 -0
  149. setiastro/images/waning_gibbous_1.png +0 -0
  150. setiastro/images/waning_gibbous_2.png +0 -0
  151. setiastro/images/waning_gibbous_3.png +0 -0
  152. setiastro/images/waning_gibbous_4.png +0 -0
  153. setiastro/images/waning_gibbous_5.png +0 -0
  154. setiastro/images/waxing_crescent_1.png +0 -0
  155. setiastro/images/waxing_crescent_2.png +0 -0
  156. setiastro/images/waxing_crescent_3.png +0 -0
  157. setiastro/images/waxing_crescent_4.png +0 -0
  158. setiastro/images/waxing_crescent_5.png +0 -0
  159. setiastro/images/waxing_gibbous_1.png +0 -0
  160. setiastro/images/waxing_gibbous_2.png +0 -0
  161. setiastro/images/waxing_gibbous_3.png +0 -0
  162. setiastro/images/waxing_gibbous_4.png +0 -0
  163. setiastro/images/waxing_gibbous_5.png +0 -0
  164. setiastro/images/whitebalance.png +0 -0
  165. setiastro/images/wimi_icon_256x256.png +0 -0
  166. setiastro/images/wimilogo.png +0 -0
  167. setiastro/images/wims.png +0 -0
  168. setiastro/images/wrench_icon.png +0 -0
  169. setiastro/images/xisfliberator.png +0 -0
  170. setiastro/qml/ResourceMonitor.qml +128 -0
  171. setiastro/saspro/__init__.py +20 -0
  172. setiastro/saspro/__main__.py +964 -0
  173. setiastro/saspro/_generated/__init__.py +7 -0
  174. setiastro/saspro/_generated/build_info.py +3 -0
  175. setiastro/saspro/abe.py +1379 -0
  176. setiastro/saspro/abe_preset.py +196 -0
  177. setiastro/saspro/aberration_ai.py +910 -0
  178. setiastro/saspro/aberration_ai_preset.py +224 -0
  179. setiastro/saspro/accel_installer.py +218 -0
  180. setiastro/saspro/accel_workers.py +30 -0
  181. setiastro/saspro/acv_exporter.py +379 -0
  182. setiastro/saspro/add_stars.py +627 -0
  183. setiastro/saspro/astrobin_exporter.py +1010 -0
  184. setiastro/saspro/astrospike.py +153 -0
  185. setiastro/saspro/astrospike_python.py +1841 -0
  186. setiastro/saspro/autostretch.py +198 -0
  187. setiastro/saspro/backgroundneutral.py +639 -0
  188. setiastro/saspro/batch_convert.py +328 -0
  189. setiastro/saspro/batch_renamer.py +522 -0
  190. setiastro/saspro/blemish_blaster.py +494 -0
  191. setiastro/saspro/blink_comparator_pro.py +3149 -0
  192. setiastro/saspro/bundles.py +61 -0
  193. setiastro/saspro/bundles_dock.py +114 -0
  194. setiastro/saspro/cheat_sheet.py +213 -0
  195. setiastro/saspro/clahe.py +371 -0
  196. setiastro/saspro/comet_stacking.py +1442 -0
  197. setiastro/saspro/common_tr.py +107 -0
  198. setiastro/saspro/config.py +38 -0
  199. setiastro/saspro/config_bootstrap.py +40 -0
  200. setiastro/saspro/config_manager.py +316 -0
  201. setiastro/saspro/continuum_subtract.py +1620 -0
  202. setiastro/saspro/convo.py +1403 -0
  203. setiastro/saspro/convo_preset.py +414 -0
  204. setiastro/saspro/copyastro.py +190 -0
  205. setiastro/saspro/cosmicclarity.py +1593 -0
  206. setiastro/saspro/cosmicclarity_preset.py +407 -0
  207. setiastro/saspro/crop_dialog_pro.py +1005 -0
  208. setiastro/saspro/crop_preset.py +189 -0
  209. setiastro/saspro/curve_editor_pro.py +2608 -0
  210. setiastro/saspro/curves_preset.py +375 -0
  211. setiastro/saspro/debayer.py +673 -0
  212. setiastro/saspro/debug_utils.py +29 -0
  213. setiastro/saspro/dnd_mime.py +35 -0
  214. setiastro/saspro/doc_manager.py +2727 -0
  215. setiastro/saspro/exoplanet_detector.py +2258 -0
  216. setiastro/saspro/file_utils.py +284 -0
  217. setiastro/saspro/fitsmodifier.py +748 -0
  218. setiastro/saspro/fix_bom.py +32 -0
  219. setiastro/saspro/free_torch_memory.py +48 -0
  220. setiastro/saspro/frequency_separation.py +1352 -0
  221. setiastro/saspro/function_bundle.py +1596 -0
  222. setiastro/saspro/generate_translations.py +3092 -0
  223. setiastro/saspro/ghs_dialog_pro.py +728 -0
  224. setiastro/saspro/ghs_preset.py +284 -0
  225. setiastro/saspro/graxpert.py +638 -0
  226. setiastro/saspro/graxpert_preset.py +287 -0
  227. setiastro/saspro/gui/__init__.py +0 -0
  228. setiastro/saspro/gui/main_window.py +8928 -0
  229. setiastro/saspro/gui/mixins/__init__.py +33 -0
  230. setiastro/saspro/gui/mixins/dock_mixin.py +375 -0
  231. setiastro/saspro/gui/mixins/file_mixin.py +450 -0
  232. setiastro/saspro/gui/mixins/geometry_mixin.py +503 -0
  233. setiastro/saspro/gui/mixins/header_mixin.py +441 -0
  234. setiastro/saspro/gui/mixins/mask_mixin.py +421 -0
  235. setiastro/saspro/gui/mixins/menu_mixin.py +391 -0
  236. setiastro/saspro/gui/mixins/theme_mixin.py +367 -0
  237. setiastro/saspro/gui/mixins/toolbar_mixin.py +1824 -0
  238. setiastro/saspro/gui/mixins/update_mixin.py +323 -0
  239. setiastro/saspro/gui/mixins/view_mixin.py +477 -0
  240. setiastro/saspro/gui/statistics_dialog.py +47 -0
  241. setiastro/saspro/halobgon.py +492 -0
  242. setiastro/saspro/header_viewer.py +448 -0
  243. setiastro/saspro/headless_utils.py +88 -0
  244. setiastro/saspro/histogram.py +760 -0
  245. setiastro/saspro/history_explorer.py +941 -0
  246. setiastro/saspro/i18n.py +168 -0
  247. setiastro/saspro/image_combine.py +421 -0
  248. setiastro/saspro/image_peeker_pro.py +1608 -0
  249. setiastro/saspro/imageops/__init__.py +37 -0
  250. setiastro/saspro/imageops/mdi_snap.py +292 -0
  251. setiastro/saspro/imageops/scnr.py +36 -0
  252. setiastro/saspro/imageops/starbasedwhitebalance.py +210 -0
  253. setiastro/saspro/imageops/stretch.py +236 -0
  254. setiastro/saspro/isophote.py +1186 -0
  255. setiastro/saspro/layers.py +208 -0
  256. setiastro/saspro/layers_dock.py +714 -0
  257. setiastro/saspro/lazy_imports.py +193 -0
  258. setiastro/saspro/legacy/__init__.py +2 -0
  259. setiastro/saspro/legacy/image_manager.py +2360 -0
  260. setiastro/saspro/legacy/numba_utils.py +3676 -0
  261. setiastro/saspro/legacy/xisf.py +1213 -0
  262. setiastro/saspro/linear_fit.py +537 -0
  263. setiastro/saspro/live_stacking.py +1854 -0
  264. setiastro/saspro/log_bus.py +5 -0
  265. setiastro/saspro/logging_config.py +460 -0
  266. setiastro/saspro/luminancerecombine.py +510 -0
  267. setiastro/saspro/main_helpers.py +201 -0
  268. setiastro/saspro/mask_creation.py +1090 -0
  269. setiastro/saspro/masks_core.py +56 -0
  270. setiastro/saspro/mdi_widgets.py +353 -0
  271. setiastro/saspro/memory_utils.py +666 -0
  272. setiastro/saspro/metadata_patcher.py +75 -0
  273. setiastro/saspro/mfdeconv.py +3909 -0
  274. setiastro/saspro/mfdeconv_earlystop.py +71 -0
  275. setiastro/saspro/mfdeconvcudnn.py +3312 -0
  276. setiastro/saspro/mfdeconvsport.py +2459 -0
  277. setiastro/saspro/minorbodycatalog.py +567 -0
  278. setiastro/saspro/morphology.py +411 -0
  279. setiastro/saspro/multiscale_decomp.py +1751 -0
  280. setiastro/saspro/nbtorgb_stars.py +541 -0
  281. setiastro/saspro/numba_utils.py +3145 -0
  282. setiastro/saspro/numba_warmup.py +141 -0
  283. setiastro/saspro/ops/__init__.py +9 -0
  284. setiastro/saspro/ops/command_help_dialog.py +623 -0
  285. setiastro/saspro/ops/command_runner.py +217 -0
  286. setiastro/saspro/ops/commands.py +1594 -0
  287. setiastro/saspro/ops/script_editor.py +1105 -0
  288. setiastro/saspro/ops/scripts.py +1476 -0
  289. setiastro/saspro/ops/settings.py +637 -0
  290. setiastro/saspro/parallel_utils.py +554 -0
  291. setiastro/saspro/pedestal.py +121 -0
  292. setiastro/saspro/perfect_palette_picker.py +1105 -0
  293. setiastro/saspro/pipeline.py +110 -0
  294. setiastro/saspro/pixelmath.py +1604 -0
  295. setiastro/saspro/plate_solver.py +2480 -0
  296. setiastro/saspro/project_io.py +797 -0
  297. setiastro/saspro/psf_utils.py +136 -0
  298. setiastro/saspro/psf_viewer.py +631 -0
  299. setiastro/saspro/pyi_rthook_astroquery.py +95 -0
  300. setiastro/saspro/remove_green.py +331 -0
  301. setiastro/saspro/remove_stars.py +1599 -0
  302. setiastro/saspro/remove_stars_preset.py +446 -0
  303. setiastro/saspro/resources.py +570 -0
  304. setiastro/saspro/rgb_combination.py +208 -0
  305. setiastro/saspro/rgb_extract.py +19 -0
  306. setiastro/saspro/rgbalign.py +727 -0
  307. setiastro/saspro/runtime_imports.py +7 -0
  308. setiastro/saspro/runtime_torch.py +754 -0
  309. setiastro/saspro/save_options.py +73 -0
  310. setiastro/saspro/selective_color.py +1614 -0
  311. setiastro/saspro/sfcc.py +1530 -0
  312. setiastro/saspro/shortcuts.py +3125 -0
  313. setiastro/saspro/signature_insert.py +1106 -0
  314. setiastro/saspro/stacking_suite.py +19069 -0
  315. setiastro/saspro/star_alignment.py +7383 -0
  316. setiastro/saspro/star_alignment_preset.py +329 -0
  317. setiastro/saspro/star_metrics.py +49 -0
  318. setiastro/saspro/star_spikes.py +769 -0
  319. setiastro/saspro/star_stretch.py +542 -0
  320. setiastro/saspro/stat_stretch.py +554 -0
  321. setiastro/saspro/status_log_dock.py +78 -0
  322. setiastro/saspro/subwindow.py +3523 -0
  323. setiastro/saspro/supernovaasteroidhunter.py +1719 -0
  324. setiastro/saspro/swap_manager.py +134 -0
  325. setiastro/saspro/torch_backend.py +89 -0
  326. setiastro/saspro/torch_rejection.py +434 -0
  327. setiastro/saspro/translations/all_source_strings.json +4726 -0
  328. setiastro/saspro/translations/ar_translations.py +4096 -0
  329. setiastro/saspro/translations/de_translations.py +3728 -0
  330. setiastro/saspro/translations/es_translations.py +4169 -0
  331. setiastro/saspro/translations/fr_translations.py +4090 -0
  332. setiastro/saspro/translations/hi_translations.py +3803 -0
  333. setiastro/saspro/translations/integrate_translations.py +271 -0
  334. setiastro/saspro/translations/it_translations.py +4728 -0
  335. setiastro/saspro/translations/ja_translations.py +3834 -0
  336. setiastro/saspro/translations/pt_translations.py +3847 -0
  337. setiastro/saspro/translations/ru_translations.py +3082 -0
  338. setiastro/saspro/translations/saspro_ar.qm +0 -0
  339. setiastro/saspro/translations/saspro_ar.ts +16019 -0
  340. setiastro/saspro/translations/saspro_de.qm +0 -0
  341. setiastro/saspro/translations/saspro_de.ts +14548 -0
  342. setiastro/saspro/translations/saspro_es.qm +0 -0
  343. setiastro/saspro/translations/saspro_es.ts +16202 -0
  344. setiastro/saspro/translations/saspro_fr.qm +0 -0
  345. setiastro/saspro/translations/saspro_fr.ts +15870 -0
  346. setiastro/saspro/translations/saspro_hi.qm +0 -0
  347. setiastro/saspro/translations/saspro_hi.ts +14855 -0
  348. setiastro/saspro/translations/saspro_it.qm +0 -0
  349. setiastro/saspro/translations/saspro_it.ts +19046 -0
  350. setiastro/saspro/translations/saspro_ja.qm +0 -0
  351. setiastro/saspro/translations/saspro_ja.ts +14980 -0
  352. setiastro/saspro/translations/saspro_pt.qm +0 -0
  353. setiastro/saspro/translations/saspro_pt.ts +15024 -0
  354. setiastro/saspro/translations/saspro_ru.qm +0 -0
  355. setiastro/saspro/translations/saspro_ru.ts +11835 -0
  356. setiastro/saspro/translations/saspro_sw.qm +0 -0
  357. setiastro/saspro/translations/saspro_sw.ts +15237 -0
  358. setiastro/saspro/translations/saspro_uk.qm +0 -0
  359. setiastro/saspro/translations/saspro_uk.ts +15248 -0
  360. setiastro/saspro/translations/saspro_zh.qm +0 -0
  361. setiastro/saspro/translations/saspro_zh.ts +15289 -0
  362. setiastro/saspro/translations/sw_translations.py +3897 -0
  363. setiastro/saspro/translations/uk_translations.py +3929 -0
  364. setiastro/saspro/translations/zh_translations.py +3910 -0
  365. setiastro/saspro/versioning.py +77 -0
  366. setiastro/saspro/view_bundle.py +1558 -0
  367. setiastro/saspro/wavescale_hdr.py +648 -0
  368. setiastro/saspro/wavescale_hdr_preset.py +101 -0
  369. setiastro/saspro/wavescalede.py +683 -0
  370. setiastro/saspro/wavescalede_preset.py +230 -0
  371. setiastro/saspro/wcs_update.py +374 -0
  372. setiastro/saspro/whitebalance.py +540 -0
  373. setiastro/saspro/widgets/__init__.py +48 -0
  374. setiastro/saspro/widgets/common_utilities.py +306 -0
  375. setiastro/saspro/widgets/graphics_views.py +122 -0
  376. setiastro/saspro/widgets/image_utils.py +518 -0
  377. setiastro/saspro/widgets/minigame/game.js +991 -0
  378. setiastro/saspro/widgets/minigame/index.html +53 -0
  379. setiastro/saspro/widgets/minigame/style.css +241 -0
  380. setiastro/saspro/widgets/preview_dialogs.py +280 -0
  381. setiastro/saspro/widgets/resource_monitor.py +313 -0
  382. setiastro/saspro/widgets/spinboxes.py +290 -0
  383. setiastro/saspro/widgets/themed_buttons.py +13 -0
  384. setiastro/saspro/widgets/wavelet_utils.py +331 -0
  385. setiastro/saspro/wimi.py +7367 -0
  386. setiastro/saspro/wims.py +588 -0
  387. setiastro/saspro/window_shelf.py +185 -0
  388. setiastro/saspro/xisf.py +1213 -0
  389. setiastrosuitepro-1.6.7.dist-info/METADATA +279 -0
  390. setiastrosuitepro-1.6.7.dist-info/RECORD +394 -0
  391. setiastrosuitepro-1.6.7.dist-info/WHEEL +4 -0
  392. setiastrosuitepro-1.6.7.dist-info/entry_points.txt +6 -0
  393. setiastrosuitepro-1.6.7.dist-info/licenses/LICENSE +674 -0
  394. setiastrosuitepro-1.6.7.dist-info/licenses/license.txt +2580 -0
@@ -0,0 +1,5 @@
1
+ # pro/log_bus.py
2
+ from PyQt6.QtCore import QObject, pyqtSignal
3
+
4
+ class LogBus(QObject):
5
+ posted = pyqtSignal(str) # emitted from any thread; connect with QueuedConnection
@@ -0,0 +1,460 @@
1
+ # pro/logging_config.py
2
+ """
3
+ Centralized logging configuration for Seti Astro Suite Pro.
4
+
5
+ Provides:
6
+ - Structured logging with consistent formatting
7
+ - Performance logging decorators
8
+ - Context managers for timed operations
9
+ - Log rotation and file output
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import logging
14
+ import sys
15
+ import time
16
+ import functools
17
+ from pathlib import Path
18
+ from datetime import datetime
19
+ from typing import Any, Callable, Optional, TypeVar
20
+ from contextlib import contextmanager
21
+
22
+ # For type hints
23
+ F = TypeVar('F', bound=Callable[..., Any])
24
+
25
+
26
+ # ============================================================================
27
+ # Custom Formatters
28
+ # ============================================================================
29
+
30
+ class ColoredFormatter(logging.Formatter):
31
+ """
32
+ Colored formatter for console output.
33
+ """
34
+
35
+ COLORS = {
36
+ logging.DEBUG: '\033[36m', # Cyan
37
+ logging.INFO: '\033[32m', # Green
38
+ logging.WARNING: '\033[33m', # Yellow
39
+ logging.ERROR: '\033[31m', # Red
40
+ logging.CRITICAL: '\033[35m', # Magenta
41
+ }
42
+ RESET = '\033[0m'
43
+
44
+ def format(self, record):
45
+ color = self.COLORS.get(record.levelno, self.RESET)
46
+ record.levelname = f"{color}{record.levelname}{self.RESET}"
47
+ return super().format(record)
48
+
49
+
50
+ class StructuredFormatter(logging.Formatter):
51
+ """
52
+ Structured formatter for file output.
53
+ Includes timestamp, level, module, function, and message.
54
+ """
55
+
56
+ def format(self, record):
57
+ # Add extra context if available
58
+ extra = ""
59
+ if hasattr(record, 'duration_ms'):
60
+ extra += f" [duration={record.duration_ms:.2f}ms]"
61
+ if hasattr(record, 'memory_mb'):
62
+ extra += f" [memory={record.memory_mb:.1f}MB]"
63
+ if hasattr(record, 'context'):
64
+ extra += f" [context={record.context}]"
65
+
66
+ record.extra = extra
67
+ return super().format(record)
68
+
69
+
70
+ # ============================================================================
71
+ # Logger Setup
72
+ # ============================================================================
73
+
74
+ def setup_logging(
75
+ app_name: str = "SetiAstroSuite",
76
+ log_dir: Optional[Path] = None,
77
+ console_level: int = logging.INFO,
78
+ file_level: int = logging.DEBUG,
79
+ max_file_size_mb: int = 10,
80
+ backup_count: int = 5,
81
+ enable_colors: bool = True
82
+ ) -> logging.Logger:
83
+ """
84
+ Setup centralized logging configuration.
85
+
86
+ Args:
87
+ app_name: Application name for the logger
88
+ log_dir: Directory for log files (default: ~/.setiastrosuite/logs)
89
+ console_level: Logging level for console output
90
+ file_level: Logging level for file output
91
+ max_file_size_mb: Maximum size of each log file
92
+ backup_count: Number of backup files to keep
93
+ enable_colors: Whether to use colored console output
94
+
95
+ Returns:
96
+ Configured logger
97
+ """
98
+ # Create or get the main logger
99
+ logger = logging.getLogger(app_name)
100
+
101
+ # Avoid adding handlers multiple times
102
+ if logger.handlers:
103
+ return logger
104
+
105
+ logger.setLevel(logging.DEBUG) # Capture all, filter at handlers
106
+
107
+ # Console handler
108
+ console_handler = logging.StreamHandler(sys.stdout)
109
+ console_handler.setLevel(console_level)
110
+
111
+ if enable_colors and sys.stdout.isatty():
112
+ console_format = ColoredFormatter(
113
+ '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
114
+ datefmt='%H:%M:%S'
115
+ )
116
+ else:
117
+ console_format = logging.Formatter(
118
+ '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
119
+ datefmt='%H:%M:%S'
120
+ )
121
+ console_handler.setFormatter(console_format)
122
+ logger.addHandler(console_handler)
123
+
124
+ # File handler (optional)
125
+ if log_dir is not None:
126
+ try:
127
+ log_dir = Path(log_dir)
128
+ log_dir.mkdir(parents=True, exist_ok=True)
129
+
130
+ # Use RotatingFileHandler if available
131
+ try:
132
+ from logging.handlers import RotatingFileHandler
133
+
134
+ log_file = log_dir / f"{app_name.lower()}.log"
135
+ file_handler = RotatingFileHandler(
136
+ log_file,
137
+ maxBytes=max_file_size_mb * 1024 * 1024,
138
+ backupCount=backup_count,
139
+ encoding='utf-8'
140
+ )
141
+ except ImportError:
142
+ # Fallback to regular FileHandler
143
+ log_file = log_dir / f"{app_name.lower()}_{datetime.now():%Y%m%d}.log"
144
+ file_handler = logging.FileHandler(log_file, encoding='utf-8')
145
+
146
+ file_handler.setLevel(file_level)
147
+ file_format = StructuredFormatter(
148
+ '%(asctime)s [%(levelname)s] %(name)s.%(funcName)s:%(lineno)d - %(message)s%(extra)s',
149
+ datefmt='%Y-%m-%d %H:%M:%S'
150
+ )
151
+ file_handler.setFormatter(file_format)
152
+ logger.addHandler(file_handler)
153
+
154
+ except Exception as e:
155
+ logger.warning(f"Could not setup file logging: {e}")
156
+
157
+ return logger
158
+
159
+
160
+ def get_logger(name: str = "SetiAstroSuite") -> logging.Logger:
161
+ """
162
+ Get a logger with the given name.
163
+
164
+ If the logger doesn't exist, it will be created as a child of the main logger.
165
+
166
+ Args:
167
+ name: Logger name (e.g., "SetiAstroSuite.stacking")
168
+
169
+ Returns:
170
+ Logger instance
171
+ """
172
+ return logging.getLogger(name)
173
+
174
+
175
+ # ============================================================================
176
+ # Performance Logging Decorators
177
+ # ============================================================================
178
+
179
+ def log_performance(
180
+ logger: Optional[logging.Logger] = None,
181
+ level: int = logging.DEBUG,
182
+ log_args: bool = False,
183
+ log_result: bool = False
184
+ ) -> Callable[[F], F]:
185
+ """
186
+ Decorator to log function execution time.
187
+
188
+ Usage:
189
+ @log_performance()
190
+ def my_function(x, y):
191
+ ...
192
+
193
+ @log_performance(logger=my_logger, level=logging.INFO)
194
+ def important_function():
195
+ ...
196
+ """
197
+ def decorator(func: F) -> F:
198
+ @functools.wraps(func)
199
+ def wrapper(*args, **kwargs):
200
+ _logger = logger or get_logger()
201
+
202
+ # Log start
203
+ msg_parts = [f"Starting {func.__qualname__}"]
204
+ if log_args:
205
+ msg_parts.append(f"args={args}, kwargs={kwargs}")
206
+ _logger.log(level, " ".join(msg_parts))
207
+
208
+ # Execute and time
209
+ start_time = time.perf_counter()
210
+ try:
211
+ result = func(*args, **kwargs)
212
+ duration_ms = (time.perf_counter() - start_time) * 1000
213
+
214
+ # Log completion
215
+ msg = f"Completed {func.__qualname__} in {duration_ms:.2f}ms"
216
+ if log_result:
217
+ msg += f" result={result}"
218
+ _logger.log(level, msg)
219
+
220
+ return result
221
+
222
+ except Exception as e:
223
+ duration_ms = (time.perf_counter() - start_time) * 1000
224
+ _logger.error(
225
+ f"Failed {func.__qualname__} after {duration_ms:.2f}ms: {type(e).__name__}: {e}"
226
+ )
227
+ raise
228
+
229
+ return wrapper # type: ignore
230
+
231
+ return decorator
232
+
233
+
234
+ def log_slow_operations(
235
+ threshold_ms: float = 1000,
236
+ logger: Optional[logging.Logger] = None
237
+ ) -> Callable[[F], F]:
238
+ """
239
+ Decorator to log operations that exceed a time threshold.
240
+
241
+ Usage:
242
+ @log_slow_operations(threshold_ms=500)
243
+ def possibly_slow_function():
244
+ ...
245
+ """
246
+ def decorator(func: F) -> F:
247
+ @functools.wraps(func)
248
+ def wrapper(*args, **kwargs):
249
+ start_time = time.perf_counter()
250
+ result = func(*args, **kwargs)
251
+ duration_ms = (time.perf_counter() - start_time) * 1000
252
+
253
+ if duration_ms >= threshold_ms:
254
+ _logger = logger or get_logger()
255
+ _logger.warning(
256
+ f"Slow operation: {func.__qualname__} took {duration_ms:.2f}ms "
257
+ f"(threshold: {threshold_ms}ms)"
258
+ )
259
+
260
+ return result
261
+
262
+ return wrapper # type: ignore
263
+
264
+ return decorator
265
+
266
+
267
+ # ============================================================================
268
+ # Context Managers
269
+ # ============================================================================
270
+
271
+ @contextmanager
272
+ def log_timing(
273
+ operation_name: str,
274
+ logger: Optional[logging.Logger] = None,
275
+ level: int = logging.DEBUG
276
+ ):
277
+ """
278
+ Context manager for logging operation timing.
279
+
280
+ Usage:
281
+ with log_timing("Image processing"):
282
+ process_image(data)
283
+ """
284
+ _logger = logger or get_logger()
285
+ _logger.log(level, f"Starting: {operation_name}")
286
+
287
+ start_time = time.perf_counter()
288
+ try:
289
+ yield
290
+ duration_ms = (time.perf_counter() - start_time) * 1000
291
+ _logger.log(level, f"Completed: {operation_name} in {duration_ms:.2f}ms")
292
+ except Exception as e:
293
+ duration_ms = (time.perf_counter() - start_time) * 1000
294
+ _logger.error(f"Failed: {operation_name} after {duration_ms:.2f}ms: {e}")
295
+ raise
296
+
297
+
298
+ @contextmanager
299
+ def log_memory(
300
+ operation_name: str,
301
+ logger: Optional[logging.Logger] = None,
302
+ level: int = logging.DEBUG
303
+ ):
304
+ """
305
+ Context manager for logging memory usage changes.
306
+
307
+ Usage:
308
+ with log_memory("Loading large dataset"):
309
+ load_dataset(path)
310
+ """
311
+ try:
312
+ import psutil
313
+ process = psutil.Process()
314
+ has_psutil = True
315
+ except ImportError:
316
+ has_psutil = False
317
+
318
+ _logger = logger or get_logger()
319
+
320
+ if not has_psutil:
321
+ yield
322
+ return
323
+
324
+ mem_before = process.memory_info().rss / (1024 * 1024)
325
+ _logger.log(level, f"Starting: {operation_name} (memory: {mem_before:.1f}MB)")
326
+
327
+ try:
328
+ yield
329
+ mem_after = process.memory_info().rss / (1024 * 1024)
330
+ delta = mem_after - mem_before
331
+ sign = "+" if delta >= 0 else ""
332
+ _logger.log(
333
+ level,
334
+ f"Completed: {operation_name} (memory: {mem_after:.1f}MB, {sign}{delta:.1f}MB)"
335
+ )
336
+ except Exception as e:
337
+ mem_after = process.memory_info().rss / (1024 * 1024)
338
+ _logger.error(f"Failed: {operation_name} (memory: {mem_after:.1f}MB): {e}")
339
+ raise
340
+
341
+
342
+ # ============================================================================
343
+ # Progress Logger
344
+ # ============================================================================
345
+
346
+ class ProgressLogger:
347
+ """
348
+ Logger for tracking progress of long operations.
349
+
350
+ Usage:
351
+ with ProgressLogger("Processing files", total=100) as progress:
352
+ for i, file in enumerate(files):
353
+ process(file)
354
+ progress.update(i + 1)
355
+ """
356
+
357
+ def __init__(
358
+ self,
359
+ operation_name: str,
360
+ total: int,
361
+ logger: Optional[logging.Logger] = None,
362
+ log_interval: int = 10, # Log every N percent
363
+ level: int = logging.INFO
364
+ ):
365
+ self.operation_name = operation_name
366
+ self.total = total
367
+ self.logger = logger or get_logger()
368
+ self.log_interval = log_interval
369
+ self.level = level
370
+ self.current = 0
371
+ self.last_logged_percent = -1
372
+ self.start_time: Optional[float] = None
373
+
374
+ def __enter__(self):
375
+ self.start_time = time.perf_counter()
376
+ self.logger.log(self.level, f"Starting: {self.operation_name} (0/{self.total})")
377
+ return self
378
+
379
+ def __exit__(self, exc_type, exc_val, exc_tb):
380
+ duration = time.perf_counter() - self.start_time if self.start_time else 0
381
+
382
+ if exc_type is None:
383
+ self.logger.log(
384
+ self.level,
385
+ f"Completed: {self.operation_name} ({self.total}/{self.total}) "
386
+ f"in {duration:.2f}s"
387
+ )
388
+ else:
389
+ self.logger.error(
390
+ f"Failed: {self.operation_name} at {self.current}/{self.total} "
391
+ f"after {duration:.2f}s: {exc_val}"
392
+ )
393
+ return False
394
+
395
+ def update(self, current: int, message: str = ""):
396
+ """Update progress and log if interval reached."""
397
+ self.current = current
398
+
399
+ if self.total <= 0:
400
+ return
401
+
402
+ percent = int((current / self.total) * 100)
403
+
404
+ # Log at intervals
405
+ if percent >= self.last_logged_percent + self.log_interval:
406
+ self.last_logged_percent = (percent // self.log_interval) * self.log_interval
407
+
408
+ elapsed = time.perf_counter() - self.start_time if self.start_time else 0
409
+ eta = (elapsed / current * (self.total - current)) if current > 0 else 0
410
+
411
+ msg = f"Progress: {self.operation_name} {percent}% ({current}/{self.total})"
412
+ if message:
413
+ msg += f" - {message}"
414
+ msg += f" [elapsed: {elapsed:.1f}s, ETA: {eta:.1f}s]"
415
+
416
+ self.logger.log(self.level, msg)
417
+
418
+
419
+ # ============================================================================
420
+ # Convenience Exports
421
+ # ============================================================================
422
+
423
+ # Pre-configured logger for common use
424
+ _main_logger: Optional[logging.Logger] = None
425
+
426
+
427
+ def init_app_logging(log_dir: Optional[Path] = None) -> logging.Logger:
428
+ """
429
+ Initialize application logging.
430
+
431
+ Call this once at application startup.
432
+
433
+ Args:
434
+ log_dir: Directory for log files (optional)
435
+
436
+ Returns:
437
+ Main application logger
438
+ """
439
+ global _main_logger
440
+
441
+ if log_dir is None:
442
+ # Default to user's home directory
443
+ log_dir = Path.home() / ".setiastrosuite" / "logs"
444
+
445
+ _main_logger = setup_logging(
446
+ app_name="SetiAstroSuite",
447
+ log_dir=log_dir,
448
+ console_level=logging.INFO,
449
+ file_level=logging.DEBUG
450
+ )
451
+
452
+ return _main_logger
453
+
454
+
455
+ def app_logger() -> logging.Logger:
456
+ """Get the main application logger."""
457
+ global _main_logger
458
+ if _main_logger is None:
459
+ _main_logger = setup_logging(app_name="SetiAstroSuite")
460
+ return _main_logger