solarviewer 1.0.2__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.
- solar_radio_image_viewer/__init__.py +12 -0
- solar_radio_image_viewer/assets/add_tab_default.png +0 -0
- solar_radio_image_viewer/assets/add_tab_default_light.png +0 -0
- solar_radio_image_viewer/assets/add_tab_hover.png +0 -0
- solar_radio_image_viewer/assets/add_tab_hover_light.png +0 -0
- solar_radio_image_viewer/assets/browse.png +0 -0
- solar_radio_image_viewer/assets/browse_light.png +0 -0
- solar_radio_image_viewer/assets/close_tab_default.png +0 -0
- solar_radio_image_viewer/assets/close_tab_default_light.png +0 -0
- solar_radio_image_viewer/assets/close_tab_hover.png +0 -0
- solar_radio_image_viewer/assets/close_tab_hover_light.png +0 -0
- solar_radio_image_viewer/assets/ellipse_selection.png +0 -0
- solar_radio_image_viewer/assets/ellipse_selection_light.png +0 -0
- solar_radio_image_viewer/assets/icons8-ellipse-90.png +0 -0
- solar_radio_image_viewer/assets/icons8-ellipse-90_light.png +0 -0
- solar_radio_image_viewer/assets/icons8-info-90.png +0 -0
- solar_radio_image_viewer/assets/icons8-info-90_light.png +0 -0
- solar_radio_image_viewer/assets/profile.png +0 -0
- solar_radio_image_viewer/assets/profile_light.png +0 -0
- solar_radio_image_viewer/assets/rectangle_selection.png +0 -0
- solar_radio_image_viewer/assets/rectangle_selection_light.png +0 -0
- solar_radio_image_viewer/assets/reset.png +0 -0
- solar_radio_image_viewer/assets/reset_light.png +0 -0
- solar_radio_image_viewer/assets/ruler.png +0 -0
- solar_radio_image_viewer/assets/ruler_light.png +0 -0
- solar_radio_image_viewer/assets/search.png +0 -0
- solar_radio_image_viewer/assets/search_light.png +0 -0
- solar_radio_image_viewer/assets/settings.png +0 -0
- solar_radio_image_viewer/assets/settings_light.png +0 -0
- solar_radio_image_viewer/assets/splash.fits +0 -0
- solar_radio_image_viewer/assets/zoom_60arcmin.png +0 -0
- solar_radio_image_viewer/assets/zoom_60arcmin_light.png +0 -0
- solar_radio_image_viewer/assets/zoom_in.png +0 -0
- solar_radio_image_viewer/assets/zoom_in_light.png +0 -0
- solar_radio_image_viewer/assets/zoom_out.png +0 -0
- solar_radio_image_viewer/assets/zoom_out_light.png +0 -0
- solar_radio_image_viewer/create_video.py +1345 -0
- solar_radio_image_viewer/dialogs.py +2665 -0
- solar_radio_image_viewer/from_simpl/__init__.py +184 -0
- solar_radio_image_viewer/from_simpl/caltable_visualizer.py +1001 -0
- solar_radio_image_viewer/from_simpl/dynamic_spectra_dialog.py +332 -0
- solar_radio_image_viewer/from_simpl/make_dynamic_spectra.py +351 -0
- solar_radio_image_viewer/from_simpl/pipeline_logger_gui.py +1232 -0
- solar_radio_image_viewer/from_simpl/simpl_theme.py +352 -0
- solar_radio_image_viewer/from_simpl/utils.py +984 -0
- solar_radio_image_viewer/from_simpl/view_dynamic_spectra_GUI.py +1975 -0
- solar_radio_image_viewer/helioprojective.py +1916 -0
- solar_radio_image_viewer/helioprojective_viewer.py +817 -0
- solar_radio_image_viewer/helioviewer_browser.py +1514 -0
- solar_radio_image_viewer/main.py +148 -0
- solar_radio_image_viewer/move_phasecenter.py +1269 -0
- solar_radio_image_viewer/napari_viewer.py +368 -0
- solar_radio_image_viewer/noaa_events/__init__.py +32 -0
- solar_radio_image_viewer/noaa_events/noaa_events.py +430 -0
- solar_radio_image_viewer/noaa_events/noaa_events_gui.py +1922 -0
- solar_radio_image_viewer/norms.py +293 -0
- solar_radio_image_viewer/radio_data_downloader/__init__.py +25 -0
- solar_radio_image_viewer/radio_data_downloader/radio_data_downloader.py +756 -0
- solar_radio_image_viewer/radio_data_downloader/radio_data_downloader_gui.py +528 -0
- solar_radio_image_viewer/searchable_combobox.py +220 -0
- solar_radio_image_viewer/solar_context/__init__.py +41 -0
- solar_radio_image_viewer/solar_context/active_regions.py +371 -0
- solar_radio_image_viewer/solar_context/cme_alerts.py +234 -0
- solar_radio_image_viewer/solar_context/context_images.py +297 -0
- solar_radio_image_viewer/solar_context/realtime_data.py +528 -0
- solar_radio_image_viewer/solar_data_downloader/__init__.py +35 -0
- solar_radio_image_viewer/solar_data_downloader/solar_data_downloader.py +1667 -0
- solar_radio_image_viewer/solar_data_downloader/solar_data_downloader_cli.py +901 -0
- solar_radio_image_viewer/solar_data_downloader/solar_data_downloader_gui.py +1210 -0
- solar_radio_image_viewer/styles.py +643 -0
- solar_radio_image_viewer/utils/__init__.py +32 -0
- solar_radio_image_viewer/utils/rate_limiter.py +255 -0
- solar_radio_image_viewer/utils.py +952 -0
- solar_radio_image_viewer/video_dialog.py +2629 -0
- solar_radio_image_viewer/video_utils.py +656 -0
- solar_radio_image_viewer/viewer.py +11174 -0
- solarviewer-1.0.2.dist-info/METADATA +343 -0
- solarviewer-1.0.2.dist-info/RECORD +82 -0
- solarviewer-1.0.2.dist-info/WHEEL +5 -0
- solarviewer-1.0.2.dist-info/entry_points.txt +8 -0
- solarviewer-1.0.2.dist-info/licenses/LICENSE +21 -0
- solarviewer-1.0.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Suppress CASA warnings (C++ level) before any imports
|
|
3
|
+
import os
|
|
4
|
+
os.environ.setdefault('CASA_LOGLEVEL', 'ERROR')
|
|
5
|
+
os.environ['CASARC'] = '/dev/null' # Prevent CASA config loading
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import argparse
|
|
9
|
+
from PyQt5.QtWidgets import QApplication
|
|
10
|
+
from PyQt5.QtGui import QPalette, QColor
|
|
11
|
+
from PyQt5.QtCore import Qt, QSettings
|
|
12
|
+
|
|
13
|
+
# Import theme manager FIRST, before viewer
|
|
14
|
+
from .styles import theme_manager, ThemeManager
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def apply_theme(app, theme_mgr):
|
|
18
|
+
"""Apply the current theme to the application."""
|
|
19
|
+
palette = theme_mgr.palette
|
|
20
|
+
is_dark = theme_mgr.is_dark
|
|
21
|
+
|
|
22
|
+
# Apply Qt palette
|
|
23
|
+
qt_palette = QPalette()
|
|
24
|
+
qt_palette.setColor(QPalette.Window, QColor(palette["window"]))
|
|
25
|
+
qt_palette.setColor(QPalette.WindowText, QColor(palette["text"]))
|
|
26
|
+
qt_palette.setColor(QPalette.Base, QColor(palette["base"]))
|
|
27
|
+
qt_palette.setColor(QPalette.AlternateBase, QColor(palette["surface"]))
|
|
28
|
+
qt_palette.setColor(QPalette.Text, QColor(palette["text"]))
|
|
29
|
+
qt_palette.setColor(QPalette.Button, QColor(palette["button"]))
|
|
30
|
+
qt_palette.setColor(QPalette.ButtonText, QColor(palette["text"]))
|
|
31
|
+
qt_palette.setColor(QPalette.Highlight, QColor(palette["highlight"]))
|
|
32
|
+
qt_palette.setColor(QPalette.HighlightedText, Qt.white)
|
|
33
|
+
qt_palette.setColor(QPalette.Link, QColor(palette["highlight"]))
|
|
34
|
+
qt_palette.setColor(QPalette.Disabled, QPalette.Text, QColor(palette["disabled"]))
|
|
35
|
+
qt_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(palette["disabled"]))
|
|
36
|
+
|
|
37
|
+
app.setPalette(qt_palette)
|
|
38
|
+
app.setStyleSheet(theme_mgr.stylesheet)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def main():
|
|
42
|
+
# Parse command-line arguments
|
|
43
|
+
parser = argparse.ArgumentParser(
|
|
44
|
+
description="Solar Radio Image Viewer - A tool for visualizing and analyzing solar radio images",
|
|
45
|
+
epilog="""
|
|
46
|
+
Viewer Types:
|
|
47
|
+
Standard Viewer: Full-featured viewer with comprehensive analysis tools,
|
|
48
|
+
coordinate systems, region selection, and statistical analysis.
|
|
49
|
+
|
|
50
|
+
Napari Viewer: Lightweight, fast viewer for quick visualization of images.
|
|
51
|
+
Offers basic functionality with faster loading times.
|
|
52
|
+
|
|
53
|
+
Examples:
|
|
54
|
+
solarviewer # Launch standard viewer
|
|
55
|
+
solarviewer image.fits # Open image.fits in standard viewer
|
|
56
|
+
solarviewer -f # Launch fast Napari viewer
|
|
57
|
+
solarviewer -f image.fits # Open image.fits in Napari viewer
|
|
58
|
+
sv --fast image.fits # Same as above using short command
|
|
59
|
+
""",
|
|
60
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
parser.add_argument(
|
|
64
|
+
"-f",
|
|
65
|
+
"--fast",
|
|
66
|
+
action="store_true",
|
|
67
|
+
help="Launch the fast Napari viewer instead of the standard viewer",
|
|
68
|
+
)
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"imagename",
|
|
71
|
+
nargs="?",
|
|
72
|
+
default=None,
|
|
73
|
+
help="Path to the image file to open (FITS or CASA format)",
|
|
74
|
+
)
|
|
75
|
+
parser.add_argument(
|
|
76
|
+
"--light",
|
|
77
|
+
action="store_true",
|
|
78
|
+
help="Start with light theme instead of dark theme",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Add version information
|
|
82
|
+
parser.add_argument(
|
|
83
|
+
"-v",
|
|
84
|
+
"--version",
|
|
85
|
+
action="version",
|
|
86
|
+
version="Solar Radio Image Viewer 1.0",
|
|
87
|
+
help="Show the application version and exit",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
args = parser.parse_args()
|
|
91
|
+
|
|
92
|
+
# Check if the specified image file exists
|
|
93
|
+
if args.imagename and not os.path.exists(args.imagename):
|
|
94
|
+
print(f"Error: Image file '{args.imagename}' not found.")
|
|
95
|
+
print("Please provide a valid path to an image file.")
|
|
96
|
+
sys.exit(1)
|
|
97
|
+
|
|
98
|
+
# Initialize the application
|
|
99
|
+
app = QApplication(sys.argv)
|
|
100
|
+
app.setStyle("Fusion")
|
|
101
|
+
|
|
102
|
+
# Load saved theme preference BEFORE importing viewer
|
|
103
|
+
settings = QSettings("SolarViewer", "SolarViewer")
|
|
104
|
+
saved_theme = settings.value("theme", ThemeManager.DARK)
|
|
105
|
+
|
|
106
|
+
# Command line --light flag overrides saved preference
|
|
107
|
+
if args.light:
|
|
108
|
+
saved_theme = ThemeManager.LIGHT
|
|
109
|
+
|
|
110
|
+
# Set initial theme BEFORE importing viewer (so matplotlib rcParams are correct)
|
|
111
|
+
# Use internal method to avoid triggering callbacks before viewer is loaded
|
|
112
|
+
theme_manager._current_theme = saved_theme
|
|
113
|
+
|
|
114
|
+
# Now import viewer - it will use the correct theme for matplotlib rcParams
|
|
115
|
+
from .viewer import SolarRadioImageViewerApp, update_matplotlib_theme
|
|
116
|
+
|
|
117
|
+
# Ensure matplotlib is updated with the correct theme
|
|
118
|
+
update_matplotlib_theme()
|
|
119
|
+
|
|
120
|
+
# Apply theme to application
|
|
121
|
+
apply_theme(app, theme_manager)
|
|
122
|
+
|
|
123
|
+
# Register theme change callback to update app
|
|
124
|
+
def on_theme_change(new_theme):
|
|
125
|
+
apply_theme(app, theme_manager)
|
|
126
|
+
update_matplotlib_theme()
|
|
127
|
+
# Save theme preference
|
|
128
|
+
settings.setValue("theme", new_theme)
|
|
129
|
+
|
|
130
|
+
theme_manager.register_callback(on_theme_change)
|
|
131
|
+
|
|
132
|
+
# Launch the appropriate viewer
|
|
133
|
+
if args.fast:
|
|
134
|
+
# Launch the Napari viewer
|
|
135
|
+
from .napari_viewer import main as napari_main
|
|
136
|
+
|
|
137
|
+
napari_main(args.imagename)
|
|
138
|
+
else:
|
|
139
|
+
# Launch the standard viewer
|
|
140
|
+
window = SolarRadioImageViewerApp(args.imagename)
|
|
141
|
+
window.resize(1920, 1080)
|
|
142
|
+
window.show()
|
|
143
|
+
sys.exit(app.exec_())
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
main()
|
|
148
|
+
|