PyThea 0.14.0__tar.gz → 1.1.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.
Files changed (66) hide show
  1. {pythea-0.14.0 → pythea-1.1.0}/CHANGELOG.md +28 -0
  2. {pythea-0.14.0 → pythea-1.1.0}/PKG-INFO +24 -9
  3. {pythea-0.14.0 → pythea-1.1.0}/PyThea/PyThea_app.py +1 -1
  4. {pythea-0.14.0 → pythea-1.1.0}/PyThea/_version.py +2 -2
  5. {pythea-0.14.0 → pythea-1.1.0}/PyThea/config/selected_imagers.py +7 -0
  6. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/Parker_spirals/utils.py +1 -1
  7. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/hek/utils.py +67 -37
  8. {pythea-0.14.0 → pythea-1.1.0}/PyThea/modules.py +1 -1
  9. pythea-1.1.0/PyThea/sunpy_dev/extern/sunkit_instruments/aia/utils.py +20 -0
  10. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/map/maputils.py +25 -10
  11. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/figure_hashes.json +2 -2
  12. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_extension_utils.py +2 -2
  13. {pythea-0.14.0 → pythea-1.1.0}/PyThea/utils.py +14 -7
  14. {pythea-0.14.0 → pythea-1.1.0}/PyThea/utils_database.py +2 -1
  15. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/PKG-INFO +24 -9
  16. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/requires.txt +3 -3
  17. {pythea-0.14.0 → pythea-1.1.0}/README.md +5 -4
  18. {pythea-0.14.0 → pythea-1.1.0}/README_pypi.md +5 -1
  19. {pythea-0.14.0 → pythea-1.1.0}/environment.yml +4 -4
  20. {pythea-0.14.0 → pythea-1.1.0}/requirements.txt +3 -3
  21. {pythea-0.14.0 → pythea-1.1.0}/setup.cfg +1 -2
  22. {pythea-0.14.0 → pythea-1.1.0}/setup.py +3 -3
  23. pythea-0.14.0/PyThea/sunpy_dev/extern/sunkit_instruments/aia/utils.py +0 -14
  24. {pythea-0.14.0 → pythea-1.1.0}/.readthedocs.yaml +0 -0
  25. {pythea-0.14.0 → pythea-1.1.0}/LICENSE.md +0 -0
  26. {pythea-0.14.0 → pythea-1.1.0}/MANIFEST.in +0 -0
  27. {pythea-0.14.0 → pythea-1.1.0}/PyThea/__init__.py +0 -0
  28. {pythea-0.14.0 → pythea-1.1.0}/PyThea/callbacks.py +0 -0
  29. {pythea-0.14.0 → pythea-1.1.0}/PyThea/config/__init__.py +0 -0
  30. {pythea-0.14.0 → pythea-1.1.0}/PyThea/config/app_styles.py +0 -0
  31. {pythea-0.14.0 → pythea-1.1.0}/PyThea/config/config_sliders.py +0 -0
  32. {pythea-0.14.0 → pythea-1.1.0}/PyThea/config/selected_bodies.py +0 -0
  33. {pythea-0.14.0 → pythea-1.1.0}/PyThea/data/__init__.py +0 -0
  34. {pythea-0.14.0 → pythea-1.1.0}/PyThea/data/sample_data.py +0 -0
  35. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/LICENSE_gcs_python.md +0 -0
  36. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/Parker_spirals/__init__.py +0 -0
  37. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/__init__.py +0 -0
  38. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/buttons.py +0 -0
  39. {pythea-0.14.0 → pythea-1.1.0}/PyThea/extensions/hek/__init__.py +0 -0
  40. {pythea-0.14.0 → pythea-1.1.0}/PyThea/geometrical_models.py +0 -0
  41. {pythea-0.14.0 → pythea-1.1.0}/PyThea/pythea_cli.py +0 -0
  42. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/__init__.py +0 -0
  43. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/__init__.py +0 -0
  44. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/__init__.py +0 -0
  45. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/aia/__init__.py +0 -0
  46. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/lasco/__init__.py +0 -0
  47. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/lasco/utils.py +0 -0
  48. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/stereo/__init__.py +0 -0
  49. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/extern/sunkit_instruments/stereo/utils.py +0 -0
  50. {pythea-0.14.0 → pythea-1.1.0}/PyThea/sunpy_dev/map/__init__.py +0 -0
  51. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/Pythea_test.py +0 -0
  52. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/__init__.py +0 -0
  53. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/conftest.py +0 -0
  54. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_figures.py +0 -0
  55. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_geometrical_models.py +0 -0
  56. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_imports.py +0 -0
  57. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_remote_clients.py +0 -0
  58. {pythea-0.14.0 → pythea-1.1.0}/PyThea/test/test_utils.py +0 -0
  59. {pythea-0.14.0 → pythea-1.1.0}/PyThea/version.py +0 -0
  60. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/.DS_Store +0 -0
  61. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/SOURCES.txt +0 -0
  62. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/dependency_links.txt +0 -0
  63. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/entry_points.txt +0 -0
  64. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/not-zip-safe +0 -0
  65. {pythea-0.14.0 → pythea-1.1.0}/PyThea.egg-info/top_level.txt +0 -0
  66. {pythea-0.14.0 → pythea-1.1.0}/pyproject.toml +0 -0
@@ -1,3 +1,31 @@
1
+ # v1.1.0 (12-Feb-2025)
2
+
3
+ ## Minor Changes
4
+ - Updates the dependencies for sunpy>6.0
5
+ - Improves the utility of HEK events retrieval
6
+
7
+ ## Bug Fixes
8
+ - Fixes a flakes8 error for using bare except
9
+ - Fixes get_horizons_coord passing id_type
10
+ - Fixes a bug when no flare or AR data returned from HEK in the app
11
+ - Removes AIA fix_observer_location as it is no longer needed
12
+
13
+ # v1.0.0 (19-Nov-2024)
14
+
15
+ ## Features
16
+ - Adds imaging data from Solar Orbiter's SOLOHi.
17
+ - Implements offline fits file loading from local database.
18
+
19
+ ## Minor Changes
20
+ - Updates Test figure hashes.
21
+ - Final changes in README before the major release.
22
+
23
+ ## Bug Fixes
24
+ - Fixes a temporary bug with JSOC and AIA prep
25
+ - Fixes potential bug with maps loading into map sequence.
26
+ - Fixes a bug when fits database is selected but no files downloaded.
27
+ - Fixes a bug with the maps clims.
28
+
1
29
  # v0.14.0 (03-Oct-2024)
2
30
 
3
31
  ## Features
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: PyThea
3
- Version: 0.14.0
3
+ Version: 1.1.0
4
4
  Summary: PyThea: A software package to reconstruct the 3D structure of CMEs and shock waves
5
5
  Home-page: https://github.com/AthKouloumvakos/PyThea
6
6
  Author: Athanasios Kouloumvakos
@@ -10,25 +10,25 @@ Keywords: science,solar physics,solar,sun,shock waves
10
10
  Platform: any
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.8
14
- Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Development Status :: 4 - Beta
16
16
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Intended Audience :: Science/Research
19
19
  Classifier: Topic :: Scientific/Engineering :: Physics
20
- Requires-Python: >=3.8, <3.11
20
+ Requires-Python: >=3.10, <3.12
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE.md
23
- Requires-Dist: numpy==1.26.4
23
+ Requires-Dist: numpy
24
24
  Requires-Dist: pandas
25
25
  Requires-Dist: scipy
26
26
  Requires-Dist: aiapy
27
- Requires-Dist: astropy==6.0.0
27
+ Requires-Dist: astropy
28
28
  Requires-Dist: astroquery
29
29
  Requires-Dist: jplephem
30
30
  Requires-Dist: numexpr
31
- Requires-Dist: sunpy==5.1.2
31
+ Requires-Dist: sunpy==6.0.4
32
32
  Requires-Dist: sunpy_soar
33
33
  Requires-Dist: parfive==2.1.0
34
34
  Requires-Dist: pooch
@@ -44,6 +44,17 @@ Requires-Dist: pyvista
44
44
  Requires-Dist: pytest-astropy
45
45
  Requires-Dist: pytest-sugar
46
46
  Requires-Dist: pytest-mpl
47
+ Dynamic: author
48
+ Dynamic: author-email
49
+ Dynamic: classifier
50
+ Dynamic: description
51
+ Dynamic: description-content-type
52
+ Dynamic: home-page
53
+ Dynamic: keywords
54
+ Dynamic: license
55
+ Dynamic: requires-dist
56
+ Dynamic: requires-python
57
+ Dynamic: summary
47
58
 
48
59
  # PyThea: A software package to reconstruct the 3D structure of CMEs and shock waves
49
60
 
@@ -54,7 +65,7 @@ Requires-Dist: pytest-mpl
54
65
  ![flake8](https://github.com/AthKouloumvakos/PyThea/actions/workflows/flake8.yml/badge.svg)
55
66
  ![pytest](https://github.com/AthKouloumvakos/PyThea/actions/workflows/pytest.yml/badge.svg)
56
67
 
57
- _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO) and Solar Terrestrial Relations Observatory (STEREO).
68
+ _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO), Solar Terrestrial Relations Observatory (STEREO), and Parker Solar Probe.
58
69
 
59
70
  ## 💾 Installation
60
71
 
@@ -153,3 +164,7 @@ If you use _PyThea_ for scientific work or research presented in a publication,
153
164
  ## ⓘ The mythology of Thea:
154
165
 
155
166
  In Greek mythology, Thea, also called Euryphaessa "wide-shining", is the Titaness of sight and the shining light of the clear blue sky. Her brother/consort is Hyperion, a Titan and god of the sun, and together they are the parents of Helios (the Sun), Selene (the Moon), and Eos (the Dawn).
167
+
168
+ ## Development Support:
169
+
170
+ The lead author of this software package Athanasios Kouloumvakos acknowledges financial support from NASA Grant 80NSSC24K0071 for the further development and improvement of PyThea during 2024. This grant was part of the NASA Headquarters Heliophysics Tools and Methods Program in response to NASA ROSES–2022 (NNH22ZDA001N).
@@ -85,7 +85,7 @@ def footer_text():
85
85
  More imaging data have been added:
86
86
  - SDO/AIA images from 211A channel.
87
87
  - PSP/WISPR inner and outer telescope images.
88
- - SolO/EUI and METIS images.
88
+ - SolO/EUI, METIS, and HI(tiles 1&2) images.
89
89
  ''', icon='ℹ️')
90
90
  st.warning('''
91
91
  **NOTE: From PyThea >0.8.1 the JSON fitting files will be slightly different from the old ones.**
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.14.0'
16
- __version_tuple__ = version_tuple = (0, 14, 0)
15
+ __version__ = version = '1.1.0'
16
+ __version_tuple__ = version_tuple = (1, 1, 0)
@@ -80,3 +80,10 @@ imager_dict['EUI-FSI'] = {'fido': (a.Instrument('EUI'), a.soar.Product('EUI-FSI1
80
80
  imager_dict['METIS'] = {'fido': (a.Instrument('METIS'), a.soar.Product('METIS-VL-TB'), a.Level(2)),
81
81
  'process': {'dimensions': (1024*u.pixel, 1024*u.pixel), 'superpixel': 2},
82
82
  'source': 'SOLO', 'instrument': 'METIS', 'detector': 'VLD', 'wavelength': 'TB'}
83
+
84
+ for tile in range(1, 5):
85
+ z = 'T' if tile in [1, 2] else 'G'
86
+ imager_dict[f'SOLOHI-T{tile}'] = {'fido': (a.Instrument('SOLOHI'),
87
+ a.soar.Product(f'SOLOHI-{tile}F{z}'), a.Level(2)),
88
+ 'process': {'superpixel': 2},
89
+ 'source': 'SOLO', 'instrument': 'SOLOHI', 'detector': f'T{tile}'}
@@ -25,7 +25,7 @@ def plot_parker_spiral(axis, map, bodies, sw_speed=350 * (u.km / u.second)):
25
25
  None
26
26
  """
27
27
  for body in bodies:
28
- pos = get_horizons_coord(bodies_dict[body][0], map.date_average, 'id')
28
+ pos = get_horizons_coord(bodies_dict[body][0], map.date_average)
29
29
  pos = pos.transform_to(frames.HeliographicCarrington(observer='Earth', obstime=map.date_average))
30
30
 
31
31
  spiral_coord = Parker_spirals.spiral(pos, sw_speed[body], map.date_average)
@@ -8,8 +8,67 @@ from sunpy.net import hek
8
8
  from sunpy.physics.differential_rotation import solar_rotate_coordinate
9
9
  from sunpy.time import parse_time
10
10
 
11
+ hek_client = hek.HEKClient()
11
12
 
12
- def plot_hek(axis, map, mode, time_range=[-2, 2], hek_responses=None):
13
+
14
+ def get_hek_active_regions(date, time_range):
15
+ start_time = date + TimeDelta(time_range[0] * u.hour)
16
+ end_time = date + TimeDelta(time_range[1] * u.hour)
17
+
18
+ responses = hek_client.search(a.Time(start_time, end_time),
19
+ a.hek.AR, a.hek.FRM.Name == 'HMI SHARP')
20
+
21
+ if str(responses) == '<No columns>':
22
+ return []
23
+
24
+ responses.keep_columns(['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y', 'event_starttime'])
25
+ indx = [i for i, x in enumerate(responses['ar_noaanum']) if x is None]
26
+ responses.remove_rows(indx)
27
+ responses = responses[['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y', 'event_starttime']]
28
+ dates = Time(responses['event_starttime'])
29
+ time_diff = np.abs(dates - date)
30
+ time_diff_seconds = np.array([td.sec for td in time_diff])
31
+ if len(np.unique(time_diff_seconds)) > 1:
32
+ responses.remove_rows(np.where(time_diff_seconds == np.max(time_diff_seconds)))
33
+
34
+ responses_ = hek_client.search(a.Time(start_time, end_time),
35
+ a.hek.AR, a.hek.FRM.Name == 'NOAA SWPC Observer')
36
+ responses_.keep_columns(['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y'])
37
+
38
+ responses['ar_mcintoshcls'] = np.full(responses['ar_noaanum'].shape[0], None)
39
+ responses['ar_mtwilsoncls'] = np.full(responses['ar_noaanum'].shape[0], None)
40
+
41
+ for rn, clm, clw in zip(responses_['ar_noaanum'], responses_['ar_mcintoshcls'], responses_['ar_mtwilsoncls']):
42
+ i = np.argwhere(responses['ar_noaanum'] == rn)
43
+ responses['ar_mcintoshcls'][i] = clm
44
+ responses['ar_mtwilsoncls'][i] = clw
45
+
46
+ return responses
47
+
48
+
49
+ def get_hek_coronal_holes(start_time, end_time):
50
+
51
+ responses = hek_client.search(a.Time(start_time, end_time),
52
+ a.hek.CH, a.hek.FRM.Name == 'SPoCA')
53
+ return responses
54
+
55
+
56
+ def get_hek_flares(start_time, end_time):
57
+ # TODO: Merge this with get_hek_flare from PyThea utils.
58
+ responses = hek_client.search(a.Time(start_time, end_time),
59
+ a.hek.FL, a.hek.FRM.Name == 'SWPC')
60
+
61
+ if str(responses) == '<No columns>':
62
+ return []
63
+
64
+ responses.keep_columns(['event_starttime', 'event_peaktime', 'fl_goescls', 'hgs_x', 'hgs_y', 'ar_noaanum'])
65
+ responses.remove_rows(np.where((responses['hgs_x'] == 0) & (responses['hgs_y'] == 0)))
66
+ responses = responses[['event_starttime', 'event_peaktime', 'fl_goescls', 'hgs_x', 'hgs_y', 'ar_noaanum']]
67
+
68
+ return responses
69
+
70
+
71
+ def plot_hek(axis, date, mode, time_range=[-2, 2], hek_responses=None):
13
72
  """
14
73
  Plots HEK (Heliophysics Event Knowledgebase) events on a given axis.
15
74
 
@@ -34,37 +93,13 @@ def plot_hek(axis, map, mode, time_range=[-2, 2], hek_responses=None):
34
93
  responses: list
35
94
  The list of HEK event responses.
36
95
  """
37
- hek_client = hek.HEKClient()
38
- start_time = map.date_average + TimeDelta(time_range[0] * u.hour)
39
- end_time = map.date_average + TimeDelta(time_range[1] * u.hour)
96
+
97
+ start_time = date + TimeDelta(time_range[0] * u.hour)
98
+ end_time = date + TimeDelta(time_range[1] * u.hour)
40
99
 
41
100
  if mode == 'Active Regions':
42
101
  if hek_responses is None or not hek_responses['Active Regions']:
43
- responses = hek_client.search(a.Time(start_time, end_time),
44
- a.hek.AR, a.hek.FRM.Name == 'HMI SHARP')
45
-
46
- responses.keep_columns(['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y', 'event_starttime'])
47
- indx = [i for i, x in enumerate(responses['ar_noaanum']) if x is None]
48
- responses.remove_rows(indx)
49
- responses = responses[['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y', 'event_starttime']]
50
- dates = Time(responses['event_starttime'])
51
- time_diff = np.abs(dates - map.date_average)
52
- time_diff_seconds = np.array([td.sec for td in time_diff])
53
- if len(np.unique(time_diff_seconds)) > 1:
54
- responses.remove_rows(np.where(time_diff_seconds == np.max(time_diff_seconds)))
55
-
56
- responses_ = hek_client.search(a.Time(start_time, end_time),
57
- a.hek.AR, a.hek.FRM.Name == 'NOAA SWPC Observer')
58
- responses_.keep_columns(['ar_noaanum', 'ar_mcintoshcls', 'ar_mtwilsoncls', 'hgs_x', 'hgs_y'])
59
-
60
- responses['ar_mcintoshcls'] = np.full(responses['ar_noaanum'].shape[0], None)
61
- responses['ar_mtwilsoncls'] = np.full(responses['ar_noaanum'].shape[0], None)
62
-
63
- for rn, clm, clw in zip(responses_['ar_noaanum'], responses_['ar_mcintoshcls'], responses_['ar_mtwilsoncls']):
64
- i = np.argwhere(responses['ar_noaanum'] == rn)
65
- responses['ar_mcintoshcls'][i] = clm
66
- responses['ar_mtwilsoncls'][i] = clw
67
- print(responses)
102
+ responses = get_hek_active_regions(date, time_range)
68
103
  else:
69
104
  responses = hek_responses['Active Regions']
70
105
 
@@ -78,8 +113,7 @@ def plot_hek(axis, map, mode, time_range=[-2, 2], hek_responses=None):
78
113
  horizontalalignment='center', verticalalignment='center')
79
114
  elif mode == 'Coronal Holes':
80
115
  if hek_responses is None or not hek_responses['Coronal Holes']:
81
- responses = hek_client.search(a.Time(start_time, end_time),
82
- a.hek.CH, a.hek.FRM.Name == 'SPoCA')
116
+ responses = get_hek_coronal_holes(start_time, end_time)
83
117
  else:
84
118
  responses = hek_responses['Coronal Holes']
85
119
 
@@ -92,15 +126,11 @@ def plot_hek(axis, map, mode, time_range=[-2, 2], hek_responses=None):
92
126
  [(float(v[0]), float(v[1])) * u.arcsec for v in p3],
93
127
  obstime=ch_date, observer='earth',
94
128
  frame=frames.Helioprojective)
95
- rotated_ch_boundary = solar_rotate_coordinate(ch_boundary, time=map.date_average)
129
+ rotated_ch_boundary = solar_rotate_coordinate(ch_boundary, time=date)
96
130
  axis.plot_coord(rotated_ch_boundary, color='c')
97
131
  elif mode == 'Flares':
98
132
  if hek_responses is None or not hek_responses['Flares']:
99
- responses = hek_client.search(a.Time(start_time, end_time),
100
- a.hek.FL, a.hek.FRM.Name == 'SWPC')
101
- responses.keep_columns(['event_starttime', 'event_peaktime', 'fl_goescls', 'hgs_x', 'hgs_y', 'ar_noaanum'])
102
- responses.remove_rows(np.where((responses['hgs_x'] == 0) & (responses['hgs_y'] == 0)))
103
- responses = responses[['event_starttime', 'event_peaktime', 'fl_goescls', 'hgs_x', 'hgs_y', 'ar_noaanum']]
133
+ responses = get_hek_flares(start_time, end_time)
104
134
  else:
105
135
  responses = hek_responses['Flares']
106
136
 
@@ -352,7 +352,7 @@ def figure_streamlit(st, running_map, image_mode, imager, model):
352
352
  if 'hek_responses' not in st.session_state:
353
353
  st.session_state.hek_responses = {'Active Regions': [], 'Coronal Holes': [], 'Flares': []}
354
354
  for mode in st.session_state.hek_list:
355
- st.session_state.hek_responses[mode] = plot_hek(axis, running_map, mode,
355
+ st.session_state.hek_responses[mode] = plot_hek(axis, running_map.date_average, mode,
356
356
  st.session_state.imaging_time_range,
357
357
  hek_responses=st.session_state.hek_responses)
358
358
 
@@ -0,0 +1,20 @@
1
+ import warnings
2
+ from astropy.time import TimeDelta
3
+ from aiapy.calibrate import update_pointing
4
+
5
+ __all__ = ['prep_aia']
6
+
7
+
8
+ def prep_aia(map_sequence):
9
+ try:
10
+ map_sequence = [update_pointing(tmap) for tmap in map_sequence]
11
+ except Exception:
12
+ warnings.warn('Prepare AIA maps failed, script proceeded without update_pointing. Check connection with JSOC.', UserWarning)
13
+
14
+ # AIAMap already fixes the .observer_coordinate property with HAE, therefore, the following is removed.
15
+ # map_sequence = [fix_observer_location(tmap) for tmap in map_sequence]
16
+
17
+ for map_ in map_sequence:
18
+ map_.meta['DATE-AVG'] = (map_.date + TimeDelta(map_.meta['exptime']/2, format='sec')).value
19
+
20
+ return map_sequence
@@ -18,6 +18,16 @@ __all__ = ['maps_sequence_processing', 'get_closest', 'normalize_exposure',
18
18
  'prepare_maps', 'difference_maps', 'mask_occulter']
19
19
 
20
20
 
21
+ def check_maps_sequence(map_sequence):
22
+ if map_sequence:
23
+ if isinstance(map_sequence, MapSequence):
24
+ return map_sequence
25
+ else:
26
+ return sunpy.map.Map(map_sequence, sequence=True)
27
+ else:
28
+ return []
29
+
30
+
21
31
  def maps_sequence_processing(map_sequence, **kwargs):
22
32
  """
23
33
  Returns a sequence of maps which is processed as plain images, running or base difference images.
@@ -36,6 +46,7 @@ def maps_sequence_processing(map_sequence, **kwargs):
36
46
  A SunPy map.
37
47
  """
38
48
 
49
+ map_sequence = check_maps_sequence(map_sequence)
39
50
  if len(map_sequence) == 0:
40
51
  return []
41
52
 
@@ -139,6 +150,7 @@ def filter_maps(map_sequence, **kwargs):
139
150
 
140
151
  '''
141
152
 
153
+ map_sequence = check_maps_sequence(map_sequence)
142
154
  if len(map_sequence) == 0:
143
155
  return []
144
156
 
@@ -155,11 +167,7 @@ def filter_maps(map_sequence, **kwargs):
155
167
  map_sequence = [tmap for tmap in map_sequence if tmap.meta['polar'] == kwargs['polar']]
156
168
 
157
169
  if len(map_sequence) != 0:
158
- if isinstance(map_sequence, MapSequence):
159
- return map_sequence
160
- else:
161
- sequence_final = sunpy.map.Map(map_sequence, sequence=True)
162
-
170
+ sequence_final = check_maps_sequence(map_sequence)
163
171
  else:
164
172
  sequence_final = []
165
173
 
@@ -188,6 +196,7 @@ def prepare_maps(map_sequence, **kwargs):
188
196
 
189
197
  '''
190
198
 
199
+ map_sequence = check_maps_sequence(map_sequence)
191
200
  if len(map_sequence) == 0:
192
201
  return []
193
202
 
@@ -246,6 +255,7 @@ def difference_maps(smapi, smapm):
246
255
  if smapm.exposure_time != 1*u.second:
247
256
  smapm = normalize_exposure(smapm)
248
257
  smap_difference = smapi.data - smapm.data
258
+
249
259
  return sunpy.map.Map(smap_difference, smapi.meta)
250
260
 
251
261
 
@@ -300,11 +310,16 @@ def mask_occulter(smap, apply_mask=True, mask_value=0):
300
310
 
301
311
 
302
312
  def maps_clims(images):
303
- if images[1].instrument == 'WISPR':
304
- if images[1].detector == 'Outer':
313
+ i = 0 if len(images) < 2 else 1
314
+
315
+ if images[i].instrument == 'WISPR':
316
+ if images[i].detector == 'Outer':
305
317
  return [14., 14.]
306
- elif images[1].detector == 'Inner':
318
+ elif images[i].detector == 'Inner':
307
319
  return [13., 13.]
308
- if images[1].instrument == 'Metis':
320
+ elif images[i].instrument == 'Metis':
309
321
  return [12.80, 13.00]
310
- return [np.nanquantile(images[1].data, 0.20)-10, np.nanquantile(images[1].data, 0.80)+10]
322
+ elif images[i].instrument.startswith('SoloHI'):
323
+ return [13.95, 14.05]
324
+
325
+ return [np.nanquantile(images[i].data, 0.20)-10, np.nanquantile(images[i].data, 0.80)+10]
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "PyThea.test.test_figures.test_ellipsoid_on_AIA_venus": "f1ff774b483a8c934c9353c552278c8823216fc7d9dad4ccc00c74be3f30c4c3",
3
- "PyThea.test.test_figures.test_ellipsoid_on_AIA_mercury": "f6afda1c769a061b7ab1fc64c4e9c0f4658cdb97c3be83828ba5d98bf1bb182c",
3
+ "PyThea.test.test_figures.test_ellipsoid_on_AIA_mercury": "a70589cd9c052d80532df5f9fbbc6d857333dcd3e2e7acfbe0e73f6b98a2a6ef",
4
4
  "PyThea.test.test_figures.test_ellipsoid_on_STEREO_COR1_venus": "18a3af72e9da5b60e435f83ee3ef3f8cd0eb437eaef463329552ff56968f12ff",
5
5
  "PyThea.test.test_figures.test_ellipsoid_on_STEREO_COR2_three_planets": "231d5635f57c4d66556674a83f6cbcef7dc94b51846e977c4c2dc3dc244096ac",
6
- "PyThea.test.test_figures.test_kinematics_figure": "83e060de53b57e9d34fe50111ba60a44f7c7c7b20faae9a4381654ef1c9ea72d"
6
+ "PyThea.test.test_figures.test_kinematics_figure": "83e060de53b57e9d34fe50111ba60a44f7c7c7b20faae9a4381654ef1c9ea72d",
7
7
  "PyThea.test.test_figures.test_ellipsoid_on_WISPR_Inner_Venus": "8d831b43b0c789cacfcff8386c00af0707bb68d64fca16c6188deca93d3cba87",
8
8
  "PyThea.test.test_figures.test_ellipsoid_on_WISPR_Outer_Mercury": "f94c444f2c6f00cd5dd5deff394d0e233c9e720413fd5570b306b262915c9732"
9
9
  }
@@ -19,7 +19,7 @@ def test_parker_spiral():
19
19
  time = '2022-01-01T00:00:00'
20
20
  body = bodies_dict['Earth'][0]
21
21
 
22
- pos = get_horizons_coord(body, time, 'id')
22
+ pos = get_horizons_coord(body, time)
23
23
  pos = pos.transform_to(frames.HeliographicCarrington(observer='Earth', obstime=time))
24
24
 
25
25
  spiral_coord = Parker_spirals.spiral(pos, 350 * (u.km/u.second), time)
@@ -43,7 +43,7 @@ def test_footpoint():
43
43
  time = '2022-01-01T00:00:00'
44
44
  body = bodies_dict['Earth'][0]
45
45
 
46
- pos = get_horizons_coord(body, time, 'id')
46
+ pos = get_horizons_coord(body, time)
47
47
  pos = pos.transform_to(frames.HeliographicCarrington(observer='Earth', obstime=time))
48
48
 
49
49
  footpoint_coord = Parker_spirals.footpoint(pos, 350 * (u.km/u.second), time)
@@ -128,10 +128,7 @@ def make_figure(map, cmap='Greys_r', clim=[-20, 20], clip_model=True, **kwargs):
128
128
  if median_filter_value != 1:
129
129
  map = sunpy.map.Map(median_filter(map.data, size=int(median_filter_value)), map.meta)
130
130
 
131
- if map.instrument == 'WISPR':
132
- clim = [-10**-clim[0], 10**-clim[1]]
133
-
134
- if map.instrument == 'Metis':
131
+ if map.instrument in ['WISPR', 'Metis'] or map.instrument.startswith('SoloHI'):
135
132
  clim = [-10**-clim[0], 10**-clim[1]]
136
133
 
137
134
  if cmap == 'default':
@@ -155,9 +152,19 @@ def make_figure(map, cmap='Greys_r', clim=[-20, 20], clip_model=True, **kwargs):
155
152
  if cref.Ty > 0:
156
153
  axis.invert_yaxis()
157
154
 
158
- axis.set_title(re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
159
- ' $T_{AGV}:$' + parse_time(map.date_average).strftime('%Y-%m-%d %H:%M:%S'),
160
- map.latex_name.replace('VLD', 'METIS-VDL')),
155
+ if map.instrument == 'SoloHI':
156
+ title = 'SoloHI' + f' Tile-{map.detector}' ' $T_{AGV}:$' + parse_time(map.date_average).strftime('%Y-%m-%d %H:%M:%S')
157
+ elif map.instrument == 'Metis':
158
+ title = re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
159
+ ' $T_{AGV}:$' + parse_time(map.date_average).strftime('%Y-%m-%d %H:%M:%S'),
160
+ map.latex_name.replace('VLD', 'METIS-VDL'))
161
+ else:
162
+ title = re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
163
+ ' $T_{AGV}:$' + parse_time(map.date_average).strftime('%Y-%m-%d %H:%M:%S'),
164
+ map.latex_name)
165
+ print(map.instrument)
166
+ print(map.latex_name)
167
+ axis.set_title(title,
161
168
  fontsize=10, pad=8)
162
169
 
163
170
  return fig, axis
@@ -79,7 +79,8 @@ def get_fits_filenames_from_database(event_id, timerange, imager):
79
79
 
80
80
  if downloaded_files is None:
81
81
  downloaded_files = download_fits(timerange, imager)
82
-
82
+ if not downloaded_files:
83
+ return None
83
84
  nested_dict_ = create_nested_dict(db_args, downloaded_files.data)
84
85
  nested_dict_ = {str(timerange): nested_dict_}
85
86
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: PyThea
3
- Version: 0.14.0
3
+ Version: 1.1.0
4
4
  Summary: PyThea: A software package to reconstruct the 3D structure of CMEs and shock waves
5
5
  Home-page: https://github.com/AthKouloumvakos/PyThea
6
6
  Author: Athanasios Kouloumvakos
@@ -10,25 +10,25 @@ Keywords: science,solar physics,solar,sun,shock waves
10
10
  Platform: any
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.8
14
- Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Development Status :: 4 - Beta
16
16
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Intended Audience :: Science/Research
19
19
  Classifier: Topic :: Scientific/Engineering :: Physics
20
- Requires-Python: >=3.8, <3.11
20
+ Requires-Python: >=3.10, <3.12
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE.md
23
- Requires-Dist: numpy==1.26.4
23
+ Requires-Dist: numpy
24
24
  Requires-Dist: pandas
25
25
  Requires-Dist: scipy
26
26
  Requires-Dist: aiapy
27
- Requires-Dist: astropy==6.0.0
27
+ Requires-Dist: astropy
28
28
  Requires-Dist: astroquery
29
29
  Requires-Dist: jplephem
30
30
  Requires-Dist: numexpr
31
- Requires-Dist: sunpy==5.1.2
31
+ Requires-Dist: sunpy==6.0.4
32
32
  Requires-Dist: sunpy_soar
33
33
  Requires-Dist: parfive==2.1.0
34
34
  Requires-Dist: pooch
@@ -44,6 +44,17 @@ Requires-Dist: pyvista
44
44
  Requires-Dist: pytest-astropy
45
45
  Requires-Dist: pytest-sugar
46
46
  Requires-Dist: pytest-mpl
47
+ Dynamic: author
48
+ Dynamic: author-email
49
+ Dynamic: classifier
50
+ Dynamic: description
51
+ Dynamic: description-content-type
52
+ Dynamic: home-page
53
+ Dynamic: keywords
54
+ Dynamic: license
55
+ Dynamic: requires-dist
56
+ Dynamic: requires-python
57
+ Dynamic: summary
47
58
 
48
59
  # PyThea: A software package to reconstruct the 3D structure of CMEs and shock waves
49
60
 
@@ -54,7 +65,7 @@ Requires-Dist: pytest-mpl
54
65
  ![flake8](https://github.com/AthKouloumvakos/PyThea/actions/workflows/flake8.yml/badge.svg)
55
66
  ![pytest](https://github.com/AthKouloumvakos/PyThea/actions/workflows/pytest.yml/badge.svg)
56
67
 
57
- _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO) and Solar Terrestrial Relations Observatory (STEREO).
68
+ _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO), Solar Terrestrial Relations Observatory (STEREO), and Parker Solar Probe.
58
69
 
59
70
  ## 💾 Installation
60
71
 
@@ -153,3 +164,7 @@ If you use _PyThea_ for scientific work or research presented in a publication,
153
164
  ## ⓘ The mythology of Thea:
154
165
 
155
166
  In Greek mythology, Thea, also called Euryphaessa "wide-shining", is the Titaness of sight and the shining light of the clear blue sky. Her brother/consort is Hyperion, a Titan and god of the sun, and together they are the parents of Helios (the Sun), Selene (the Moon), and Eos (the Dawn).
167
+
168
+ ## Development Support:
169
+
170
+ The lead author of this software package Athanasios Kouloumvakos acknowledges financial support from NASA Grant 80NSSC24K0071 for the further development and improvement of PyThea during 2024. This grant was part of the NASA Headquarters Heliophysics Tools and Methods Program in response to NASA ROSES–2022 (NNH22ZDA001N).
@@ -1,12 +1,12 @@
1
- numpy==1.26.4
1
+ numpy
2
2
  pandas
3
3
  scipy
4
4
  aiapy
5
- astropy==6.0.0
5
+ astropy
6
6
  astroquery
7
7
  jplephem
8
8
  numexpr
9
- sunpy==5.1.2
9
+ sunpy==6.0.4
10
10
  sunpy_soar
11
11
  parfive==2.1.0
12
12
  pooch
@@ -10,10 +10,7 @@
10
10
 
11
11
  ![Logo](https://github.com/AthKouloumvakos/PyThea/blob/master/docs/logo/pythea_logo.png)
12
12
 
13
- _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO) and Solar Terrestrial Relations Observatory (STEREO).
14
-
15
- > [!NOTE]
16
- > The lead author of PyThea (A. Kouloumvakos) has been awarded a NASA Grant (80NSSC24K0071) for further developing and improving PyThea, during fiscal year 2024. The awarded proposal is part of the NASA Headquarters Heliophysics Tools and Methods Program in response to NASA ROSES–2022 (NNH22ZDA001N). The proposed software enhancements and new features encompass a range of improvements, including but not limited to: improved code documentation, expanded and improved code testing, improved image processing and visualization, and the incorporation of new solar mission imaging data.
13
+ _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO), Solar Terrestrial Relations Observatory (STEREO), and Parker Solar Probe.
17
14
 
18
15
  ## 💾 Installation
19
16
 
@@ -112,3 +109,7 @@ If you use _PyThea_ for scientific work or research presented in a publication,
112
109
  ## ⓘ The mythology of Thea:
113
110
 
114
111
  In Greek mythology, Thea, also called Euryphaessa "wide-shining", is the Titaness of sight and the shining light of the clear blue sky. Her brother/consort is Hyperion, a Titan and god of the sun, and together they are the parents of Helios (the Sun), Selene (the Moon), and Eos (the Dawn).
112
+
113
+ ## Development Support:
114
+
115
+ The lead author of this software package Athanasios Kouloumvakos acknowledges financial support from NASA Grant 80NSSC24K0071 for the further development and improvement of PyThea during 2024. This grant was part of the NASA Headquarters Heliophysics Tools and Methods Program in response to NASA ROSES–2022 (NNH22ZDA001N).
@@ -7,7 +7,7 @@
7
7
  ![flake8](https://github.com/AthKouloumvakos/PyThea/actions/workflows/flake8.yml/badge.svg)
8
8
  ![pytest](https://github.com/AthKouloumvakos/PyThea/actions/workflows/pytest.yml/badge.svg)
9
9
 
10
- _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO) and Solar Terrestrial Relations Observatory (STEREO).
10
+ _PyThea_ is an open-source software package that can be used to reconstruct the 3D structure of Coronal Mass Ejections (CMEs) and shock waves and determine their kinematics using remote-sensing observations. The tool implements the Graduated Cylindrical Shell (GCS) model that can be used to reconstruct CMEs and two geometrical models, namely a spheroid and ellipsoid model to reconstruct shock waves. It also implements remote-sensing observations from multiple viewpoints such as the Solar and Heliospheric Observatory (SoHO), Solar Terrestrial Relations Observatory (STEREO), and Parker Solar Probe.
11
11
 
12
12
  ## 💾 Installation
13
13
 
@@ -106,3 +106,7 @@ If you use _PyThea_ for scientific work or research presented in a publication,
106
106
  ## ⓘ The mythology of Thea:
107
107
 
108
108
  In Greek mythology, Thea, also called Euryphaessa "wide-shining", is the Titaness of sight and the shining light of the clear blue sky. Her brother/consort is Hyperion, a Titan and god of the sun, and together they are the parents of Helios (the Sun), Selene (the Moon), and Eos (the Dawn).
109
+
110
+ ## Development Support:
111
+
112
+ The lead author of this software package Athanasios Kouloumvakos acknowledges financial support from NASA Grant 80NSSC24K0071 for the further development and improvement of PyThea during 2024. This grant was part of the NASA Headquarters Heliophysics Tools and Methods Program in response to NASA ROSES–2022 (NNH22ZDA001N).
@@ -5,16 +5,16 @@ channels:
5
5
  - defaults
6
6
 
7
7
  dependencies:
8
- - python=3.9
9
- - numpy=1.26.4
8
+ - python=3.10
9
+ - numpy
10
10
  - pandas
11
11
  - scipy
12
12
  - matplotlib
13
13
  - aiapy
14
- - astropy=6.0.0
14
+ - astropy
15
15
  - astroquery
16
16
  - numexpr
17
- - sunpy=5.1.2
17
+ - sunpy=6.0.4
18
18
  - parfive=2.1.0 # The issue with streamlit and asyncio is resolved (see #13). Keep this for a while to make sure everything works smoothly.
19
19
  - streamlit
20
20
  - seaborn
@@ -1,12 +1,12 @@
1
- numpy==1.26.4
1
+ numpy
2
2
  pandas
3
3
  scipy
4
4
  aiapy
5
- astropy==6.0.0
5
+ astropy
6
6
  astroquery
7
7
  jplephem
8
8
  numexpr
9
- sunpy==5.1.2
9
+ sunpy==6.0.4
10
10
  sunpy_soar
11
11
  parfive==2.1.0
12
12
  pooch
@@ -9,9 +9,8 @@ classifiers =
9
9
  Operating System :: OS Independent
10
10
  Programming Language :: Python
11
11
  Programming Language :: Python :: 3
12
- Programming Language :: Python :: 3.8
13
- Programming Language :: Python :: 3.9
14
12
  Programming Language :: Python :: 3.10
13
+ Programming Language :: Python :: 3.11
15
14
  Topic :: Scientific/Engineering :: Physics
16
15
 
17
16
  [options]
@@ -37,8 +37,8 @@ setup(
37
37
  classifiers=[
38
38
  'Programming Language :: Python',
39
39
  'Programming Language :: Python :: 3',
40
- 'Programming Language :: Python :: 3.8',
41
- 'Programming Language :: Python :: 3.9',
40
+ 'Programming Language :: Python :: 3.10',
41
+ 'Programming Language :: Python :: 3.11',
42
42
  'Development Status :: 4 - Beta',
43
43
  'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
44
44
  'Operating System :: OS Independent',
@@ -46,7 +46,7 @@ setup(
46
46
  'Topic :: Scientific/Engineering :: Physics',
47
47
  ],
48
48
 
49
- python_requires='>=3.8, <3.11',
49
+ python_requires='>=3.10, <3.12',
50
50
  install_requires=requirements,
51
51
 
52
52
  packages=find_packages(),
@@ -1,14 +0,0 @@
1
- from astropy.time import TimeDelta
2
- from aiapy.calibrate import fix_observer_location, update_pointing
3
-
4
- __all__ = ['prep_aia']
5
-
6
-
7
- def prep_aia(map_sequence):
8
- map_sequence = [update_pointing(tmap) for tmap in map_sequence]
9
- map_sequence = [fix_observer_location(tmap) for tmap in map_sequence]
10
-
11
- for map_ in map_sequence:
12
- map_.meta['DATE-AVG'] = (map_.date + TimeDelta(map_.meta['exptime']/2, format='sec')).value
13
-
14
- return map_sequence
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes