Source code for radiospectra.net.sources.ecallisto

from sunpy.net import attrs as a
from sunpy.net.attr import SimpleAttr
from sunpy.net.dataretriever.client import GenericClient

from radiospectra.net.attrs import Observatory


[docs] class eCALLISTOClient(GenericClient): """ Provides access to `eCallisto radio spectrometer <http://soleil80.cs.technik.fhnw.ch/solarradio/data/2002-20yy_Callisto/>`__ `data archive <https://spdf.gsfc.nasa.gov>`__. `Further information <http://www.e-callisto.org>`__. Notes ----- `Specific information on the meaning of the filename. <http://soleil.i4ds.ch/solarradio/data/readme.txt>`__ From the filename alone there's no way to tell about either the frequency or duration. Therefore we only return a start time. Examples -------- >>> from radiospectra import net >>> from sunpy.net import Fido, attrs as a >>> query = Fido.search(a.Time('2019/10/05 23:00', '2019/10/05 23:30'), ... a.Instrument('eCALLISTO'), net.Observatory('ALASKA')) #doctest: +REMOTE_DATA >>> query #doctest: +REMOTE_DATA <sunpy.net.fido_factory.UnifiedResponse object at ...> Results from 1 Provider: <BLANKLINE> 3 Results from the eCALLISTOClient: Start Time Provider Instrument Observatory ID ----------------------- --------- ---------- ----------- --- 2019-10-05 23:00:00.000 ECALLISTO ECALLISTO ALASKA 59 2019-10-05 23:15:00.000 ECALLISTO ECALLISTO ALASKA 59 2019-10-05 23:30:00.000 ECALLISTO ECALLISTO ALASKA 59 <BLANKLINE> <BLANKLINE> """ baseurl = ( r"http://soleil80.cs.technik.fhnw.ch/solarradio/data/2002-20yy_Callisto/" r"%Y/%m/%d/{obs}_%Y%m%d_%H%M%S.*.fit.gz" ) pattern = ( r"{}/2002-20yy_Callisto/{year:4d}/{month:2d}/{day:2d}/" r"{Observatory}_{year:4d}{month:2d}{day:2d}" r"_{hour:2d}{minute:2d}{second:2d}{suffix}.fit.gz" )
[docs] @classmethod def pre_search_hook(cls, *args, **kwargs): baseurl, pattern, matchdict = super().pre_search_hook(*args, **kwargs) obs = matchdict.pop("Observatory") if obs[0] == "*": baseurl = baseurl.format(obs=r".*") else: # Need case sensitive so have to override obs_attr = [a for a in args if isinstance(a, Observatory)][0] baseurl = baseurl.format(obs=obs_attr.value) return baseurl, pattern, matchdict
[docs] def post_search_hook(self, exdict, matchdict): original = super().post_search_hook(exdict, matchdict) original["ID"] = original["suffix"].replace("_", "") del original["suffix"] # We don't know the end time for all files # https://github.com/sunpy/radiospectra/issues/60 del original["End Time"] return original
[docs] @classmethod def register_values(cls): adict = { a.Provider: [("eCALLISTO", "International Network of Solar Radio Spectrometers.")], a.Instrument: [("eCALLISTO", "e-Callisto - International Network of Solar Radio Spectrometers.")], Observatory: [("*", "Observatory Location")], } return adict
@classmethod def _can_handle_query(cls, *query): """ Method the `sunpy.net.fido_factory.UnifiedDownloaderFactory` class uses to dispatch queries to this Client. """ regattrs_dict = cls.register_values() optional = {k for k in regattrs_dict.keys()} - cls.required if not cls.check_attr_types_in_query(query, cls.required, optional): return False for key in regattrs_dict: all_vals = [i[0].lower() for i in regattrs_dict[key]] for x in query: if ( isinstance(x, key) and issubclass(key, SimpleAttr) and x.type_name != "observatory" and str(x.value).lower() not in all_vals ): return False return True