Prenons comme exemple une observation du Soleil récente faite par C. Buil, le 29 novembre 2020 avec le Sol'Ex 1 :
http://www.astrosurf.com/topic/142367-solex-un-instrument-solaire-%C3%A0-petit-prix/
Il peut être intéressant de comparer et illustrer les résultats de l'observation dans d'autres longueurs d'onde ou types de visualisation.
Les exemples présentés ici sont basés sur la documentation officielle du module : https://sunpy.org/.
Pour afficher l'image initiale, nous pouvons utiliser la librairie Pillow qui, comme sa description l'indique, permet de manipuler et traiter les images.
Pillow : https://pillow.readthedocs.io/en/stable/
The Python Imaging Library adds image processing capabilities to your Python interpreter."
#Install Pillow Lib
!pip install --upgrade Pillow;
from PIL import Image
import requests #for download image
#retrieve image
url = 'http://www.astrosurf.com/uploads/monthly_2020_12/_obs_29112022-41.jpg.3bf652c08d329145898043ed0eb4ccb7.jpg'
img = Image.open(requests.get(url, stream=True).raw)
#show image
img
Selon l'utilisation, il est necéssaire d'installer la version complète de la librairie, comme ci-dessous.
#Requirements
#python >= 3.6
#astropy >= 3.2
import warnings
warnings.filterwarnings('ignore') # disable warning installation
#Sunpy installation (all packages, including optional dependencies)
!pip install "sunpy[all]"
#imports
#units
import astropy.units as u
#sunpy
from sunpy.net import Fido # => downloader client
from sunpy.net import attrs as a
Pour une première utilisation, un package data.sample est mis à disposition avec la librairie pour découvrir son fonctionnement et effectuer des essais. Nous pouvons donc importer cet échantillons de données avec "import sunpy.data.sample". Ainsi, nous disposons par exemple d'un jeu de données de l'instrument AIA pour la longueur d'onde 171 en faisant sunpy.data.sample.AIA_171_IMAGE
import sunpy.data.sample.AIA_171_IMAGE #import data sample
Pour afficher ces données, Sunpy met à disposition un objet map. Ces cartes sont des matrices de données spatiales, qui sont ainsi déclinés pour une image2D, une série temporelle d'image 2D, ou encore des images 2D alignées dans le temps. (source https://docs.sunpy.org/en/stable/guide/tour.html)
Nous allons pouvoir créer une nouvelle map en lui passant en paramètre soit un nom de fichier, une liste de noms de fichiers par exemple. Comme toujours, il faut commencer par l'import.
import sunpy.data.sample
import sunpy.map
aia = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)
aia.peek()
L'appel de la méthode peek() applicable sur l'objet aia permet ici d'avoir un affichage graphique rapide et facile. Cela nous évite ainsi d'avoir a préparer et configurer un graphique matplotlib. Cette dernière est accessible sur tous les objets de base Sunpy.
Cependant, ce qui nous intéresse c'est d'accèder aux données d'une certaine date.
Pour pouvoir vérifier s'ils existent des données à la date qui nous intéresse et les télécharger, nous pouvons utulilser Fido. Ce dernier permet d'effectuer des recherches et d'extraire les données en fournissant une interface unifiée et permet ainsi l'interrogation de plusieurs sources simultanément (https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a/pdf).
L'objet fido prend divers paramètre, par exemple dans notre cas :
#Get data from AIA with FIDO
result = Fido.search(a.Time('2020/11/29 12:05', '2020/11/29 12:06'),
a.Instrument.aia,
a.Wavelength(171*u.angstrom))
print(result)
Results from 1 Provider: 5 Results from the VSOClient: Start Time ... ... ----------------------- ... 2020-11-29 12:05:09.000 ... 2020-11-29 12:05:21.000 ... 2020-11-29 12:05:33.000 ... 2020-11-29 12:05:45.000 ... 2020-11-29 12:05:57.000 ...
#download files
downloaded_files = Fido.fetch(result)
print(downloaded_files) # output cells are hide here -> too long output. Let's try it.
Tout comme indiqué précedemment, nous pouvons afficher les données grâce à l'objet map le la libraie, qui prend en paramètre les éléments que l'on vient de télécharger. Cette fois en préparant un graphique à l'aide de matplotlib.
import sunpy.map
import matplotlib.pyplot as plt
# prepare map
map = sunpy.map.Map(downloaded_files[0])
#prepare figure
fig = plt.figure(figsize=(16,9))
map.plot()
#show plot
plt.show()
Nous pouvons aller encore plus loin en téléchargeant les images de deux instruments différents pour les superposées, avec AIA et l'instrument HMI (Helioseismic and Magnetic Imager) qui cartographie le champ magnétique et la vitesse de la surface du Soleil 24.
Pour effectuer cette superposition, nous avons besoin de la librairie Reproject.
La librairie reproject, lors de l'affichage deux images FITS, permet de recadrer l'affichage avec la même projection céleste, en se basant sur les données WCS de l'entête, en ayant la possibilité de changer l'orientation, le système de coordonnées, etc..
%%capture
!pip install reproject
# Imports
from reproject import reproject_interp
# Configuration de la taille de la figure
plt.rcParams['figure.figsize'] = (16, 8)
%%capture
# Configuration of time sample
time = (a.Sample(24 * u.hour) &
a.Time('2020-11-29', '2020-11-29T10:00:00', '2020-11-29') &
a.vso.Extent(0, 0, 0, 0, "FULLDISK"))
# Configuration for aia instrument data
aia = a.Instrument.aia & a.Wavelength(17 * u.nm, 18 * u.nm)
# COnfiguration for HMI instrument data
hmi = a.Instrument.hmi & a.Physobs.los_magnetic_field
# launch search
res = Fido.search(time, aia | hmi)
# get data
files = Fido.fetch(res[:, 0])
map_aia, map_hmi = [m.resample((1024, 1024)*u.pix) for m in sunpy.map.Map(sorted(files))]
map_hmi.plot_settings['cmap'] = "hmimag"
map_hmi.plot_settings['norm'] = plt.Normalize(-2000, 2000)
fig = plt.figure()
# Atmospheric Imaging Assembly (AIA) Plot
ax1 = fig.add_subplot(1, 2, 1, projection=map_aia)
map_aia.plot(axes=ax1)
# Helioseismic and Magnetic Imager (HMI) Plot
ax2 = fig.add_subplot(1, 2, 2, projection=map_hmi)
map_hmi.plot(axes=ax2)
<matplotlib.image.AxesImage at 0x140577970>
La fonction utilisée ici pour la reprojection, reproject_interp, prend en paramètre dans notre cas:
output, footprint = reproject_interp(map_hmi, map_aia.wcs, map_aia.data.shape)
out_hmi = sunpy.map.Map(output, map_aia.wcs)
out_hmi.plot_settings['cmap'] = "hmimag"
out_hmi.plot_settings['norm'] = plt.Normalize(-1500, 1500)
fig = plt.figure()
# plot 1
ax1 = fig.add_subplot(1, 2, 1, projection=map_aia)
map_aia.plot(axes=ax1)
# plot 2
ax2 = fig.add_subplot(1, 2, 2, projection=out_hmi)
out_hmi.plot(axes=ax2)
<matplotlib.image.AxesImage at 0x140678bb0>
fig = plt.figure(figsize=(20, 15))
ax1 = fig.add_subplot(1, 1, 1, projection=map_aia)
map_aia.plot(axes=ax1)
out_hmi.plot(axes=ax1, alpha=0.5)
plt.show()
# Show
im
Cet exemple n'est qu'une introduction, la librairie Sunpy contient de nombreuses fonctionnalités et types de données. Voici par exemple la liste des instruments à disposition, en sachant que chaque instruments a plusieurs configurations accessibles !
from sunpy.net import Fido, attrs as a
print(a.Instrument)
sunpy.net.attrs.Instrument Specifies the Instrument name for the search. Attribute Name ... --------------------------- ... aia ... bbi ... bcs ... be_continuum ... be_halpha ... bic_hifi ... bigbear ... caii ... cds ... celias ... cerrotololo ... chp ... chrotel ... climso ... cooke ... costep ... cp ... dpm ... eis ... eit ... elteide ... erne ... eve ... eve ... film ... five_12_channelmagnetograph ... foxsi ... gbm ... gfpi ... goes ... golf ... gong ... gris ... ha2 ... hi_c ... hi_c21 ... hmi ... hxeclipse ... hxt ... imax ... impact ... iris ... isoon ... iss ... ivm ... k_cor ... kpdc ... lasco ... learmonth ... longwave_lobe_06 ... longwave_lobe_07 ... longwave_slit_06 ... longwave_slit_07 ... lyra ... maunaloa ... mdi ... mees ... mergedgong ... meudonspectroheliograph ... mk4 ... noaa_indices ... noaa_predict ... norh ... ovsa ... phoenix ... phoka ... plastic ... ptmc ... rhessi ... rhessi ... secchi ... shortwave_lobe_06 ... shortwave_lobe_07 ... shortwave_slit_06 ... shortwave_slit_07 ... six_0_ftshg ... sj ... solarftsspectrometer ... soon ... sot ... sp1 ... sp2 ... spectroheliograph ... spectromagnetograph ... srs_table ... sumer ... suvi ... suvi ... swan ... swap ... swaves ... sxi_0 ... sxt ... tm_1001 ... tm_1010 ... trace ... udaipur ... uvcs ... vault_1999 ... vault_2002 ... vault_2014 ... virgo ... vsm ... wbs ... wispr ... x123 ... xrs ... xrt ... zimpol ...