Source code for radiospectra.net.sources.ilofar

import numpy as np

import astropy.units as u
from sunpy.net import attrs as a
from sunpy.net.dataretriever.client import GenericClient, QueryResponse
from sunpy.net.scraper import Scraper
from sunpy.time import TimeRange

from radiospectra.net.attrs import PolType

__all__ = ["ILOFARMode357Client"]

RECEIVER_FREQUENCIES = a.Wavelength(10.546875 * u.MHz, 244.53125 * u.MHz)
DATASET_NAMES = ["rcu357_1beam", "rcu357_1beam_datastream"]


[docs] class ILOFARMode357Client(GenericClient): """ Provides access to I-LOFAR mode 357 observations from the data `archive <https://data.lofar.ie>`__ Examples -------- >>> import radiospectra.net >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2021/09/01", "2021/09/21"), ... a.Instrument('ILOFAR')) # doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA <sunpy.net.fido_factory.UnifiedResponse object at ...> Results from 1 Provider: <BLANKLINE> 10 Results from the ILOFARMode357Client: <BLANKLINE> Start Time End Time ... Provider Polarisation ----------------------- ----------------------- ... -------- ------------ 2021-09-14 07:39:13.000 2021-09-14 07:39:13.999 ... ILOFAR X 2021-09-14 07:39:13.000 2021-09-14 07:39:13.999 ... ILOFAR Y 2021-09-01 08:07:29.000 2021-09-01 08:07:29.999 ... ILOFAR X 2021-09-01 08:07:29.000 2021-09-01 08:07:29.999 ... ILOFAR Y 2021-09-07 08:07:52.000 2021-09-07 08:07:52.999 ... ILOFAR X 2021-09-07 08:07:52.000 2021-09-07 08:07:52.999 ... ILOFAR Y 2021-09-08 08:04:07.000 2021-09-08 08:04:07.999 ... ILOFAR X 2021-09-08 08:04:07.000 2021-09-08 08:04:07.999 ... ILOFAR Y 2021-09-08 10:34:31.000 2021-09-08 10:34:31.999 ... ILOFAR X 2021-09-08 10:34:31.000 2021-09-08 10:34:31.999 ... ILOFAR Y <BLANKLINE> <BLANKLINE> """ baseurl = r"https://data.lofar.ie/%Y/%m/%d/bst/kbt/{dataset}/" r"%Y%m%d_\d{{6}}_bst_00\S{{1}}.dat" pattern = r"{}/{year:4d}{month:2d}{day:2d}_{hour:2d}{minute:2d}{second:2d}" r"_bst_00{Polarisation}.dat" @classmethod def _check_wavelengths(cls, wavelength): """ Check for overlap between given wavelength and receiver frequency coverage defined in `RECEIVER_FREQUENCIES`. Parameters ---------- wavelength : `sunpy.net.attrs.Wavelength` Input wavelength range to check Returns ------- `bool` """ return wavelength.min in RECEIVER_FREQUENCIES or wavelength.max in RECEIVER_FREQUENCIES
[docs] def search(self, *args, **kwargs): """ Query this client for a list of results. Parameters ---------- *args: `tuple` `sunpy.net.attrs` objects representing the query. **kwargs: `dict` Any extra keywords to refine the search. Returns ------- A `QueryResponse` instance containing the query result. """ matchdict = self._get_match_dict(*args, **kwargs) metalist = [] wavelentgh = matchdict.get("Wavelength", False) if wavelentgh and not self._check_wavelengths(wavelentgh): return QueryResponse(metalist, client=self) tr = TimeRange(matchdict["Start Time"], matchdict["End Time"]) for dataset in DATASET_NAMES: url = self.baseurl.format(dataset=dataset) scraper = Scraper(url, regex=True) filesmeta = scraper._extract_files_meta(tr, extractor=self.pattern) for i in filesmeta: rowdict = self.post_search_hook(i, matchdict) metalist.append(rowdict) query_response = QueryResponse(metalist, client=self) mask = np.full(len(query_response), True) pol = matchdict.get("PolType") if len(pol) == 1: pol = pol.upper() mask = mask & query_response["Polarisation"] == pol if query_response: query_response.remove_column("PolType") return query_response[mask]
[docs] @classmethod def register_values(cls): adict = { a.Instrument: [("ILOFAR", "Irish LOFAR STATION (IE63)")], a.Source: [("ILOFAR", "Irish LOFAR Data Archive")], a.Provider: [("ILOFAR", "Irish LOFAR Data Archive")], a.Wavelength: [("*")], PolType: [("X", "X"), ("X Linear Polarisation", "Y Linear Polarisation")], } return adict