Python data loader for Solar Orbiter's (SolO) Energetic Particle Detector (EPD).

Overview

solo-epd-loader

Python data loader for Solar Orbiter's (SolO) Energetic Particle Detector (EPD). Provides level 2 (l2) and low latency (ll) data obtained through CDF files from ESA's Solar Orbiter Archive (SOAR) for the following sensors:

  • Electron Proton Telescope (EPT)
  • High Energy Telescope (HET)
  • SupraThermal Electrons and Protons (STEP)

Installation

solo_epd_loader requires python >= 3.6, and it depends on cdflib and heliopy (which will be automatically installed). It can be installed from PyPI using:

pip install solo-epd-loader

Usage

The standard usecase is to utilize the epd_load function, which returns Pandas dataframe(s) of the EPD measurements and a dictionary containing information on the energy channels.

from solo_epd_loader import epd_load

df_1, df_2, energies = \
    epd_load(sensor, viewing, level, startdate, enddate, path, autodownload)

Input

  • sensor: ept, het, or step (string)
  • viewing: sun, asun, north, or south (string); not needed for sensor = step
  • level: ll or l2 (string)
  • startdate, enddate: YYYYMMDD, e.g., 20210415 (integer) (if no enddate is provided, enddate = startdate will be used)
  • path: directory in which Solar Orbiter data is/should be organized; e.g. /home/userxyz/solo/data/ (string)
  • autodownload: if True will try to download missing data files from SOAR (bolean)

Return

  • For sensor = ept or het:
    1. Pandas dataframe with proton fluxes and errors (for EPT also alpha particles) in ‘particles / (s cm^2 sr MeV)’
    2. Pandas dataframe with electron fluxes and errors in ‘particles / (s cm^2 sr MeV)’
    3. Dictionary with energy information for all particles:
      • String with energy channel info
      • Value of lower energy bin edge in MeV
      • Value of energy bin width in MeV
  • For sensor = step:
    1. Pandas dataframe with fluxes and errors in ‘particles / (s cm^2 sr MeV)’
    2. Dictionary with energy information for all particles:
      • String with energy channel info
      • Value of lower energy bin edge in MeV
      • Value of energy bin width in MeV

Data folder structure

The path variable provided to the module should be the base directory where the corresponding cdf data files should be placed in subdirectories. First subfolder defines the data product level (l2 or low_latency at the moment), the next one the instrument (so far only epd), and finally the sensor (ept, het or step).

For example, the folder structure could look like this: /home/userxyz/solo/data/l2/epd/het. In this case, you should call the loader with path=/home/userxyz/solo/data; i.e., the base directory for the data.

You can use the (automatic) download function described in the following section to let the subfolders be created initially automatically. NB: It might be that you need to run the code with sudo or admin privileges in order to be able to create new folders on your system.

Data download within Python

While using epd_load() to obtain the data, one can choose to automatically download missing data files from SOAR directly from within python. They are saved in the folder provided by the path argument (see above). For that, just add autodownload=True to the function call:

from solo_epd_loader import epd_load

df_protons, df_electrons, energies = \
    epd_load(sensor='het', viewing='sun', level='l2',
             startdate=20200820, enddate=20200821, \
             path='/home/userxyz/solo/data/', autodownload=True)

# plot protons and alphas
ax = df_protons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

# plot electrons
ax = df_electrons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

Note: The code will always download the latest version of the file available at SOAR. So in case a file V01.cdf is already locally present, V02.cdf will be downloaded nonetheless.

Example 1 - low latency data

Example code that loads low latency (ll) electron and proton (+alphas) fluxes (and errors) for EPT NORTH telescope from Apr 15 2021 to Apr 16 2021 into two Pandas dataframes (one for protons & alphas, one for electrons). In general available are ‘sun’, ‘asun’, ‘north’, and ‘south’ viewing directions for ‘ept’ and ‘het’ telescopes of SolO/EPD.

from solo_epd_loader import *

df_protons, df_electrons, energies = \
    epd_load(sensor='ept', viewing='north', level='ll',
             startdate=20210415, enddate=20210416, \
             path='/home/userxyz/solo/data/')

# plot protons and alphas
ax = df_protons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

# plot electrons
ax = df_electrons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

Example 2 - level 2 data

Example code that loads level 2 (l2) electron and proton (+alphas) fluxes (and errors) for HET SUN telescope from Aug 20 2020 to Aug 20 2020 into two Pandas dataframes (one for protons & alphas, one for electrons).

from solo_epd_loader import epd_load

df_protons, df_electrons, energies = \
    epd_load(sensor='het', viewing='sun', level='l2',
             startdate=20200820, enddate=20200821, \
             path='/home/userxyz/solo/data/')

# plot protons and alphas
ax = df_protons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

# plot electrons
ax = df_electrons.plot(logy=True, subplots=True, figsize=(20,60))
plt.show()

Example 3 - reproducing EPT data from Fig. 2 in Gómez-Herrero et al. 2021 [1]

from solo_epd_loader import epd_load

# set your local path here
lpath = '/home/userxyz/solo/data'

# load data
df_protons, df_electrons, energies = \
    epd_load(sensor='ept', viewing='sun', level='l2', startdate=20200708,
             enddate=20200724, path=lpath, autodownload=True)

# change time resolution to get smoother curve (resample with mean)
resample = '60min'

fig, axs = plt.subplots(2, sharex=True)
fig.suptitle('EPT Sun')

# plot selection of channels
for channel in [0, 8, 16, 26]:
    df_electrons['Electron_Flux'][f'Electron_Flux_{channel}']\
        .resample(resample).mean().plot(ax = axs[0], logy=True,
        label=energies["Electron_Bins_Text"][channel][0])
for channel in [6, 22, 32, 48]:
    df_protons['Ion_Flux'][f'Ion_Flux_{channel}']\
        .resample(resample).mean().plot(ax = axs[1], logy=True,
        label=energies["Ion_Bins_Text"][channel][0])

axs[0].set_ylim([0.3, 4e6])
axs[1].set_ylim([0.01, 5e8])

axs[0].set_ylabel("Electron flux\n"+r"(cm$^2$ sr s MeV)$^{-1}$")
axs[1].set_ylabel("Ion flux\n"+r"(cm$^2$ sr s MeV)$^{-1}$")
axs[0].legend()
axs[1].legend()
plt.subplots_adjust(hspace=0)
plt.show()

NB: This is just an approximate reproduction with different energy channels (smaller, not combined) and different time resolution! Figure

Example 4 - reproducing EPT data from Fig. 2 in Wimmer-Schweingruber et al. 2021 [2]

from solo_epd_loader import epd_load
import datetime

# set your local path here
lpath = '/home/userxyz/solo/data'

# load data
df_protons_sun, df_electrons_sun, energies = \
    epd_load(sensor='ept', viewing='sun', level='l2',
             startdate=20201210, enddate=20201211,
             path=lpath, autodownload=True)
df_protons_asun, df_electrons_asun, energies = \
    epd_load(sensor='ept', viewing='asun', level='l2',
             startdate=20201210, enddate=20201211,
             path=lpath, autodownload=True)
df_protons_south, df_electrons_south, energies = \
    epd_load(sensor='ept', viewing='south', level='l2',
             startdate=20201210, enddate=20201211,
             path=lpath, autodownload=True)
df_protons_north, df_electrons_north, energies = \
    epd_load(sensor='ept', viewing='north', level='l2',
             startdate=20201210, enddate=20201211,
             path=lpath, autodownload=True)

# plot mean intensities of two energy channels; 'channel' defines the lower one
channel = 6
ax = pd.concat([df_electrons_sun['Electron_Flux'][f'Electron_Flux_{channel}'],
                df_electrons_sun['Electron_Flux'][f'Electron_Flux_{channel+1}']],
                axis=1).mean(axis=1).plot(logy=True, label='sun', color='#d62728')
ax = pd.concat([df_electrons_asun['Electron_Flux'][f'Electron_Flux_{channel}'],
                df_electrons_asun['Electron_Flux'][f'Electron_Flux_{channel+1}']],
                axis=1).mean(axis=1).plot(logy=True, label='asun', color='#ff7f0e')
ax = pd.concat([df_electrons_north['Electron_Flux'][f'Electron_Flux_{channel}'],
                df_electrons_north['Electron_Flux'][f'Electron_Flux_{channel+1}']],
                axis=1).mean(axis=1).plot(logy=True, label='north', color='#1f77b4')
ax = pd.concat([df_electrons_south['Electron_Flux'][f'Electron_Flux_{channel}'],
                df_electrons_south['Electron_Flux'][f'Electron_Flux_{channel+1}']],
                axis=1).mean(axis=1).plot(logy=True, label='south', color='#2ca02c')

plt.xlim([datetime.datetime(2020, 12, 10, 23, 0),
          datetime.datetime(2020, 12, 11, 12, 0)])

ax.set_ylabel("Electron flux\n"+r"(cm$^2$ sr s MeV)$^{-1}$")
plt.title('EPT electrons ('+str(energies['Electron_Bins_Low_Energy'][channel])
          + '-' + str(energies['Electron_Bins_Low_Energy'][channel+2])+' MeV)')
plt.legend()
plt.show()

NB: This is just an approximate reproduction; e.g., the channel combination is a over-simplified approximation! image1

References

[1] First near-relativistic solar electron events observed by EPD onboard Solar Orbiter, Gómez-Herrero et al., A&A, 656 (2021) L3, https://doi.org/10.1051/0004-6361/202039883
[2] First year of energetic particle measurements in the inner heliosphere with Solar Orbiter’s Energetic Particle Detector, Wimmer-Schweingruber et al., A&A, 656 (2021) A22, https://doi.org/10.1051/0004-6361/202140940

License

This project is Copyright (c) Jan Gieseler and licensed under the terms of the BSD 3-clause license. This package is based upon the Openastronomy packaging guide which is licensed under the BSD 3-clause licence. See the licenses folder for more information.

Comments
  • Environment variable for path

    Environment variable for path

    Would it be possible to use (optionally) an environment variable for the path (preferably the same for all loaders)? That would make it much easier for multi-user environments to have data in one location only. Granted, it would possibly also need some file permission changing as well...

    enhancement 
    opened by tlml 12
  • Replacing FILLVALUES not working with pandas 1.5.0

    Replacing FILLVALUES not working with pandas 1.5.0

    At least until pandas 1.4.4 the replacement of FILLVAUES done by the following code worked: https://github.com/jgieseler/solo-epd-loader/blob/f92e4e995a273d5755792c3f02e4ea3c33cfc675/solo_epd_loader/init.py#L754-L761

    But since pandas 1.5.0 it doesn't work anymore, and the values of -1e+31 are not replaced with np.nan's.

    I don't know the reason, maybe it has to do with the fact that the corresponding DataFrames have a MultiIndex.

    bug 
    opened by jgieseler 1
  • Catch error that python doesn't have rights to create folders

    Catch error that python doesn't have rights to create folders

    Data for the different detectors are downloaded in subdirectories of the data directory provided by path. Under some circumstances, the script doesn't have the necessary rights to create these folders if they don't already exist. Then a FileNotFoundError: [Errno 2] No such file or directory: {path+subdir+file} is raised.

    Catch this problem and/or provide a meaningful warning message.

    bug 
    opened by jgieseler 1
  • Change from heliopy's cdf2lib to sunpy's read_cdf

    Change from heliopy's cdf2lib to sunpy's read_cdf

    Change the function to read cdf files from heliopy's cdf2lib() to sunpy's read_cdf() in _read_epd_cdf(); i.e., applies to EPT and HET data, not STEP data. The latter is read in manually using cdflib

    opened by jgieseler 0
  • Make downloading of all viewings optional

    Make downloading of all viewings optional

    SolO/EPD/EPT has for viewing directions; each delivered in a separate data file. Right now, all viewing files are downloaded for a requested day, even so the call to solo-epd-loader specifically asks for a single viewing direction and only returns that data. This has been included in the beginning because usually we have been interested in having all viewing-direction files anyhow. But it makes sense to have this at least as an option, so that you can deactivate this behaviour in case you want to only have e.g. the 'sun' viewing direction.

    enhancement 
    opened by jgieseler 0
  • Include resampling functionality

    Include resampling functionality

    Include resampling functionality like https://github.com/serpentine-h2020/SEPpy/blob/bc2e3e0662a019147d25bd554edbceaf7328e25b/seppy/loader/stereo.py#L24-L38

    enhancement 
    opened by jgieseler 0
  • Clean install_requires in setup.cfg

    Clean install_requires in setup.cfg

    With https://github.com/jgieseler/solo-epd-loader/commit/8fede59ac7a529cb1189f1ac40ddf20755b5cdaf bz4 and datetime have been added to the install_requires in setup.cfg (in the progress of establishing some testing), but this is not liked by the conda-forge version, which complains when bz4 and datetime are listed as requirements in the meta.yaml file. This needs to be sorted out.

    Until then, pip check has been removed from meta.yaml, cf. https://github.com/jgieseler/solo-epd-loader-feedstock/commit/9d9eda523e1690fc1d520bca4a4a40eba521b6be

    opened by jgieseler 0
  • Set level='l2' as default

    Set level='l2' as default

    Right now, level is a required positional argument. Set this by default to 'l2' because this should be the standard data product one should use if in doubt.

    opened by jgieseler 0
  • Add calc_av_en_flux_EPD()

    Add calc_av_en_flux_EPD()

    Add function that averages the flux of several energy channels into a combined energy channel. In principle already available here, but needs to be corectly integrated.

    enhancement 
    opened by jgieseler 1
  • Use sunpy_soar for downloading data from SOAR

    Use sunpy_soar for downloading data from SOAR

    sunpy_soar supports since v1.4 also low latency data. So it now is able to obtain all the same data we're downloading until now with solo_epd_loader (the source is in both cases ESA's SOAR). For the future, it would be worthwhile to completely move the downloading process to sunpy_soar to avoid duplication (and sunpy_soar is definitely much better written than my code 😅).

    enhancement 
    opened by jgieseler 1
Releases(v0.1.11)
Owner
Jan Gieseler
Jan Gieseler
Set of scripts that schedules employees for shifts throughout the week based on availability, shift times, and shift necessities

Automatic-Scheduler Set of scripts that schedules employees for shifts throughout the week based on availability, shift times, and shift necessities *

Matthew 1 May 01, 2022
GitHub saver for stargazers, forks, repos

GitHub backup repositories Save your repos and list of stargazers & list of forks for them. Pure python3 and git with no dependencies to install. GitH

Alexander Kapitanov 23 Aug 21, 2022
A PDM plugin to publish to PyPI

PDM Publish A PDM plugin to publish to PyPI NOTE: Consider if you need this over using twine directly Installation If you installed pdm via pipx: pipx

Branch Vincent 20 Aug 06, 2022
Taichi is a parallel programming language for high-performance numerical computations.

Taichi is a parallel programming language for high-performance numerical computations.

Taichi Developers 22k Jan 04, 2023
💘 Write any Python with 9 Characters: e,x,c,h,r,(,+,1,)

💘 PyFuck exchr(+1) PyFuck is a strange playful code. It uses only nine different characters to write Python3 code. Inspired by aemkei/jsfuck Example

Satoki 10 Dec 25, 2022
CarolinaCon CTF Online

CarolinaCon Online CTF CTF challenges from CarolinaCon Online April 23 through April 25, 2021. All challenges from the CTF will eventually be here. Co

49th Security Division 6 May 04, 2022
Pokehandy - Data web app sobre Pokémon TCG que desarrollo durante transmisiones de Twitch, 2022

⚡️ Pokéhandy – Pokémon Hand Simulator [WIP 🚧 ] This application aims to simulat

Rodolfo Ferro 5 Feb 23, 2022
My repository for the Advent of Code, starting from 2021

Advent of Code This is my repository for the Advent of Code (https://adventofcode.com/), starting from 2021. File Structure Inside each year folder, s

Yu-Ting 6 Dec 15, 2021
Just RESTing

petnica-api-workshop Just RESTing Setup Using pipenv You can setup this project with pipenv if you want isolated libraries. After you've installed pip

Aleksa Tešić 1 Oct 23, 2021
Purge all transformation orientations addon for Blender 2.8 and newer versions

CTO Purge This add-on adds a new button to Blender's Transformation Orientation panel which empowers the user to purge all of his/her custom transform

MMMrqs 10 Dec 29, 2022
A clock purely made with python(turtle)...

Clock A clock purely made with python(turtle)... Requirements Pythone3 IDE or any other IDE Installation Clone this repository Running Open this proje

Abhyush 1 Jan 11, 2022
Aerial Ace is a helper bot for poketwo which provide various functionalities on top of being a pokedex.

Aerial Ace is a helper bot for poketwo which provide various functionalities on top of being a pokedex.

Devanshu Mishra 1 Dec 01, 2021
CNKD - Minimalistic Windows ransomware written in Python

CNKD Minimalistic Windows ransomware written in Python (Still a work in progress

Alex 2 May 27, 2022
Prophet is a tool to discover resources detailed for cloud migration, cloud backup and disaster recovery

Prophet is a tool to discover resources detailed for cloud migration, cloud backup and disaster recovery

22 May 31, 2022
Dockernized ZeroTierOne controller with zero-ui web interface.

docker-zerotier-controller Dockernized ZeroTierOne controller with zero-ui web interface. 中文讨论 Customize ZeroTierOne's controller planets Modify patch

sbilly 209 Jan 04, 2023
GitHub Actions Version Updater Updates All GitHub Action Versions in a Repository and Creates a Pull Request with the Changes.

GitHub Actions Version Updater GitHub Actions Version Updater is GitHub Action that is used to update other GitHub Actions in a Repository and create

Maksudul Haque 42 Dec 22, 2022
Python implementation of an automatic parallel parking system in a virtual environment, including path planning, path tracking, and parallel parking

Automatic Parallel Parking: Path Planning, Path Tracking & Control This repository contains a python implementation of an automatic parallel parking s

134 Jan 09, 2023
一个IDA脚本,可以检测出哈希算法(无论是否魔改常数)并生成frida hook 代码。

findhash 在哈希算法上,比Findcrypt更好的检测工具,同时生成Frida hook代码。 使用方法 把findhash.xml和findhash.py扔到ida plugins目录下 ida -edit-plugin-findhash 试图解决的问题 哈希函数的初始化魔数被修改 想快速

266 Dec 29, 2022
An extension module to make reaction based menus with disnake

disnake-ext-menus An experimental extension menu that makes working with reaction menus a bit easier. Installing python -m pip install -U disnake-ext-

1 Nov 25, 2021
Repositório do Projeto de Jogo da Resília Educação.

Jogo da Segurança das Indústrias Acme Descrição Este jogo faz parte do projeto de entrega do primeiro módulo da Resilia Educação, referente ao curso d

Márcio Estevam da Silva 2 Apr 28, 2022