Source code for radiospectra.net.sources.rstn

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

from radiospectra.net.attrs import Observatory

__all__ = ["RSTNClient"]


[docs] class RSTNClient(GenericClient): """ Radio Spectrometer Telescope Network (RSTN) hosted at NOAA `National Geophysical Data <https://www.ngdc.noaa.gov>`__ (NGDC) archive. Examples -------- >>> from radiospectra import net >>> from sunpy.net import Fido, attrs as a >>> query = Fido.search(a.Time('2003/03/15 00:00', '2003/03/15 23:59'), ... a.Instrument('RSTN'), net.Observatory('San Vito')) #doctest: +REMOTE_DATA >>> query #doctest: +REMOTE_DATA <sunpy.net.fido_factory.UnifiedResponse object at ... Results from 1 Provider: <BLANKLINE> 1 Results from the RSTNClient: Start Time End Time Provider Instrument Observatory ----------------------- ----------------------- -------- ---------- ----------- 2003-03-15 00:00:00.000 2003-03-15 23:59:59.999 RSTN RSTN San Vito <BLANKLINE> <BLANKLINE> """ baseurl = ( r"https://www.ngdc.noaa.gov/stp/space-weather/solar-data/" r"solar-features/solar-radio/rstn-spectral/{obs}/%Y/%m/.*.gz" ) pattern = r"{}/rstn-spectral/{obs}/{year:4d}/{month:2d}/" r"{obs_short:2l}{year2:2d}{month2:2d}{day:2d}.SRS.gz" observatory_map = { "Holloman": "holloman", "Learmonth": "learmonth", "Palehua": "palehua", "Sagamore Hill": "sagamore", "San Vito": "san-vito", } observatory_map = {**observatory_map, **dict(map(reversed, observatory_map.items()))}
[docs] def search(self, *args, **kwargs): baseurl, pattern, matchdict = self.pre_search_hook(*args, **kwargs) metalist = [] for obs in matchdict["Observatory"]: scraper = Scraper(baseurl.format(obs=self.observatory_map[obs.title()]), regex=True) tr = TimeRange(matchdict["Start Time"], matchdict["End Time"]) filesmeta = scraper._extract_files_meta(tr, extractor=pattern, matcher=matchdict) for i in filesmeta: rowdict = self.post_search_hook(i, matchdict) metalist.append(rowdict) return QueryResponse(metalist, client=self)
[docs] def post_search_hook(self, exdict, matchdict): original = super().post_search_hook(exdict, matchdict) obs, *_ = [original.pop(name) for name in ["obs", "year2", "month2", "obs_short"]] original["Observatory"] = self.observatory_map[obs] return original
[docs] @classmethod def register_values(cls): adict = { a.Provider: [("RSTN", "Radio Solar Telescope Network.")], a.Instrument: [("RSTN", "Radio Solar Telescope Network.")], Observatory: [ ("Holloman", "Holloman"), ("Learmonth", "Learmonth"), ("Palehua", "Palehua"), ("Sagamore Hill", "Sagamore Hill"), ("San Vito", "San Vito"), ], } return adict