Module pyaurorax.data

Instrument data downloading and reading module. This module presently has support for data provided by the University of Calgary, such as THEMIS ASI, REGO, and the Transition Region Explorer (TREx) instruments.

Sub-modules

pyaurorax.data.ucalgary

Data downloading and reading routines for data provided by the University of Calgary.

Classes

class DataManager (aurorax_obj)
Expand source code
class DataManager:
    """
    The DataManager object is initialized within every PyAuroraX object. It acts as a way to access 
    the submodules and carry over configuration information in the super class.
    """

    def __init__(self, aurorax_obj):
        self.__aurorax_obj = aurorax_obj

        # initialize sub-modules
        self.__ucalgary = UCalgaryManager(self.__aurorax_obj)

    # ------------------------------------------
    # properties for submodule managers
    # ------------------------------------------
    @property
    def ucalgary(self):
        """
        Access to the `ucalgary` submodule from within a PyAuroraX object.
        """
        return self.__ucalgary

    def list_datasets(self, name: Optional[str] = None, timeout: Optional[int] = None) -> List[Dataset]:
        """
        List available datasets from all providers

        Args:
            name (str): 
                Supply a name used for filtering. If that name is found in the available dataset 
                names received from the API, it will be included in the results. This parameter is
                optional.
            
            timeout (int): 
                Represents how many seconds to wait for the API to send data before giving up. The 
                default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
                object. This parameter is optional.
            
        Returns:
            A list of [`Dataset`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Dataset)
            objects.
        
        Raises:
            pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
        """
        # init
        datasets = []

        # get ucalgary datasets
        ucalgary_datasets = self.__ucalgary.list_datasets(name=name, timeout=timeout)

        # merge
        datasets = datasets + ucalgary_datasets

        # sort by name
        datasets = sorted(datasets, key=lambda x: x.name)

        # return
        return datasets

    def list_datasets_in_table(self, name: Optional[str] = None, max_width: int = 200, timeout: Optional[int] = None) -> None:
        """
        Print available datasets from all providers in a table

        Args:
            name (str): 
                Supply a name used for filtering. If that name is found in the available dataset 
                names received from the API, it will be included in the results. This parameter is
                optional.
            
            max_width (int): 
                Maximum width of the table. Default is `200`. This parameter is optional.

            timeout (int): 
                Represents how many seconds to wait for the API to send data before giving up. The 
                default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
                object. This parameter is optional.
            
        Returns:
            Printed table.

        Raises:
            pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
        """
        # get datasets
        datasets = self.list_datasets(name=name, timeout=timeout)

        # set table lists
        table_names = []
        table_providers = []
        table_levels = []
        table_doi_details = []
        table_short_descriptions = []
        for d in datasets:
            table_names.append(d.name)
            table_providers.append(d.provider)
            table_levels.append(d.level)
            table_doi_details.append(d.doi_details)
            table_short_descriptions.append(d.short_description)

        # set header values
        table_headers = [
            "Name",
            "Provider",
            "Level",
            "DOI Details",
            "Short Description",
        ]

        # print as table
        table = Texttable(max_width=max_width)
        table.set_deco(Texttable.HEADER)
        table.set_cols_dtype(["t"] * len(table_headers))
        table.set_header_align(["l"] * len(table_headers))
        table.set_cols_align(["l"] * len(table_headers))
        table.header(table_headers)
        for i in range(0, len(table_names)):
            table.add_row([
                table_names[i],
                table_providers[i],
                table_levels[i],
                table_doi_details[i],
                table_short_descriptions[i],
            ])
        print(table.draw())

    def get_dataset(self, name: str, timeout: Optional[int] = None) -> Dataset:
        """
        Get a specific dataset

        Args:
            name (str): 
                The dataset name to get. Case is insensitive.

            timeout (int): 
                Represents how many seconds to wait for the API to send data before giving up. The 
                default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
                object. This parameter is optional.
            
        Returns:
            The found [`Dataset`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Dataset)
            object. Raises an exception if not found.
        
        Raises:
            pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
        """
        # init
        dataset = None

        # search ucalgary datasets
        try:
            ucalgary_dataset = self.__ucalgary.get_dataset(name, timeout=timeout)
            dataset = ucalgary_dataset
        except Exception:  # nosec
            pass

        # return
        if (dataset is None):
            # never could find it
            raise AuroraXAPIError("Dataset not found")
        else:
            return dataset

    def list_observatories(self,
                           instrument_array: Literal["themis_asi", "rego", "trex_rgb", "trex_nir", "trex_blue", "trex_spectrograph"],
                           uid: Optional[str] = None,
                           timeout: Optional[int] = None) -> List[Observatory]:
        """
        List information about observatories utilized by all providers.

        Args:
            instrument_array (str): 
                The instrument array to list observatories for. Valid values are: themis_asi, rego, 
                trex_rgb, trex_nir, trex_blue, and trex_spectrograph.

            uid (str): 
                Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID 
                is found in the available observatories received from the API, it will be included in the results. This 
                parameter is optional.
            
            timeout (int): 
                Represents how many seconds to wait for the API to send data before giving up. The 
                default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
                object. This parameter is optional.
            
        Returns:
            A list of [`Observatory`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Observatory)
            objects.
        
        Raises:
            pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
        """
        # init
        observatories = []

        # get ucalgary datasets
        ucalgary_observatories = self.__ucalgary.list_observatories(instrument_array, uid=uid, timeout=timeout)

        # merge
        observatories = observatories + ucalgary_observatories

        # sort by name
        observatories = sorted(observatories, key=lambda x: x.uid)

        # return
        return observatories

    def list_observatories_in_table(self,
                                    instrument_array: Literal["themis_asi", "rego", "trex_rgb", "trex_nir", "trex_blue", "trex_spectrograph"],
                                    uid: Optional[str] = None,
                                    max_width: int = 200,
                                    timeout: Optional[int] = None) -> None:
        """
        Print available observatories for a given instrument array in a table

        Args:
            instrument_array (str): 
                The instrument array to list observatories for. Valid values are: themis_asi, rego, 
                trex_rgb, trex_nir, trex_blue, and trex_spectrograph.

            uid (str): 
                Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID 
                is found in the available observatories received from the API, it will be included in the results. This 
                parameter is optional.
            
            max_width (int): 
                Maximum width of the table. Default is `200`. This parameter is optional.

            timeout (int): 
                Represents how many seconds to wait for the API to send data before giving up. The 
                default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
                object. This parameter is optional.
            
        Returns:
            Printed table.
        
        Raises:
            pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
        """
        # get observatories
        observatories = self.list_observatories(instrument_array, uid=uid, timeout=timeout)

        # set table lists
        table_uids = []
        table_full_names = []
        table_geo_lats = []
        table_geo_lons = []
        table_providers = []
        for o in observatories:
            table_uids.append(o.uid)
            table_full_names.append(o.full_name)
            table_geo_lats.append(o.geodetic_latitude)
            table_geo_lons.append(o.geodetic_longitude)
            table_providers.append(o.provider)

        # set header values
        table_headers = [
            "UID",
            "Full Name",
            "Geodetic Latitude",
            "Geodetic Longitude",
            "Provider",
        ]

        # print as table
        table = Texttable(max_width=max_width)
        table.set_deco(Texttable.HEADER)
        table.set_cols_dtype(["t"] * len(table_headers))
        table.set_header_align(["l"] * len(table_headers))
        table.set_cols_align(["l"] * len(table_headers))
        table.header(table_headers)
        for i in range(0, len(table_uids)):
            table.add_row([
                table_uids[i],
                table_full_names[i],
                table_geo_lats[i],
                table_geo_lons[i],
                table_providers[i],
            ])
        print(table.draw())

The DataManager object is initialized within every PyAuroraX object. It acts as a way to access the submodules and carry over configuration information in the super class.

Instance variables

prop ucalgary
Expand source code
@property
def ucalgary(self):
    """
    Access to the `ucalgary` submodule from within a PyAuroraX object.
    """
    return self.__ucalgary

Access to the pyaurorax.data.ucalgary submodule from within a PyAuroraX object.

Methods

def get_dataset(self, name: str, timeout: int | None = None) ‑> pyucalgarysrs.data.classes.Dataset
Expand source code
def get_dataset(self, name: str, timeout: Optional[int] = None) -> Dataset:
    """
    Get a specific dataset

    Args:
        name (str): 
            The dataset name to get. Case is insensitive.

        timeout (int): 
            Represents how many seconds to wait for the API to send data before giving up. The 
            default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
            object. This parameter is optional.
        
    Returns:
        The found [`Dataset`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Dataset)
        object. Raises an exception if not found.
    
    Raises:
        pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
    """
    # init
    dataset = None

    # search ucalgary datasets
    try:
        ucalgary_dataset = self.__ucalgary.get_dataset(name, timeout=timeout)
        dataset = ucalgary_dataset
    except Exception:  # nosec
        pass

    # return
    if (dataset is None):
        # never could find it
        raise AuroraXAPIError("Dataset not found")
    else:
        return dataset

Get a specific dataset

Args

name : str
The dataset name to get. Case is insensitive.
timeout : int
Represents how many seconds to wait for the API to send data before giving up. The default is 10 seconds, or the api_timeout value in the super class' PyAuroraX object. This parameter is optional.

Returns

The found Dataset object. Raises an exception if not found.

Raises

AuroraXAPIError
An API error was encountered.
def list_datasets(self, name: str | None = None, timeout: int | None = None) ‑> List[pyucalgarysrs.data.classes.Dataset]
Expand source code
def list_datasets(self, name: Optional[str] = None, timeout: Optional[int] = None) -> List[Dataset]:
    """
    List available datasets from all providers

    Args:
        name (str): 
            Supply a name used for filtering. If that name is found in the available dataset 
            names received from the API, it will be included in the results. This parameter is
            optional.
        
        timeout (int): 
            Represents how many seconds to wait for the API to send data before giving up. The 
            default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
            object. This parameter is optional.
        
    Returns:
        A list of [`Dataset`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Dataset)
        objects.
    
    Raises:
        pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
    """
    # init
    datasets = []

    # get ucalgary datasets
    ucalgary_datasets = self.__ucalgary.list_datasets(name=name, timeout=timeout)

    # merge
    datasets = datasets + ucalgary_datasets

    # sort by name
    datasets = sorted(datasets, key=lambda x: x.name)

    # return
    return datasets

List available datasets from all providers

Args

name : str
Supply a name used for filtering. If that name is found in the available dataset names received from the API, it will be included in the results. This parameter is optional.
timeout : int
Represents how many seconds to wait for the API to send data before giving up. The default is 10 seconds, or the api_timeout value in the super class' PyAuroraX object. This parameter is optional.

Returns

A list of Dataset objects.

Raises

AuroraXAPIError
An API error was encountered.
def list_datasets_in_table(self, name: str | None = None, max_width: int = 200, timeout: int | None = None) ‑> None
Expand source code
def list_datasets_in_table(self, name: Optional[str] = None, max_width: int = 200, timeout: Optional[int] = None) -> None:
    """
    Print available datasets from all providers in a table

    Args:
        name (str): 
            Supply a name used for filtering. If that name is found in the available dataset 
            names received from the API, it will be included in the results. This parameter is
            optional.
        
        max_width (int): 
            Maximum width of the table. Default is `200`. This parameter is optional.

        timeout (int): 
            Represents how many seconds to wait for the API to send data before giving up. The 
            default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
            object. This parameter is optional.
        
    Returns:
        Printed table.

    Raises:
        pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
    """
    # get datasets
    datasets = self.list_datasets(name=name, timeout=timeout)

    # set table lists
    table_names = []
    table_providers = []
    table_levels = []
    table_doi_details = []
    table_short_descriptions = []
    for d in datasets:
        table_names.append(d.name)
        table_providers.append(d.provider)
        table_levels.append(d.level)
        table_doi_details.append(d.doi_details)
        table_short_descriptions.append(d.short_description)

    # set header values
    table_headers = [
        "Name",
        "Provider",
        "Level",
        "DOI Details",
        "Short Description",
    ]

    # print as table
    table = Texttable(max_width=max_width)
    table.set_deco(Texttable.HEADER)
    table.set_cols_dtype(["t"] * len(table_headers))
    table.set_header_align(["l"] * len(table_headers))
    table.set_cols_align(["l"] * len(table_headers))
    table.header(table_headers)
    for i in range(0, len(table_names)):
        table.add_row([
            table_names[i],
            table_providers[i],
            table_levels[i],
            table_doi_details[i],
            table_short_descriptions[i],
        ])
    print(table.draw())

Print available datasets from all providers in a table

Args

name : str
Supply a name used for filtering. If that name is found in the available dataset names received from the API, it will be included in the results. This parameter is optional.
max_width : int
Maximum width of the table. Default is 200. This parameter is optional.
timeout : int
Represents how many seconds to wait for the API to send data before giving up. The default is 10 seconds, or the api_timeout value in the super class' PyAuroraX object. This parameter is optional.

Returns

Printed table.

Raises

AuroraXAPIError
An API error was encountered.
def list_observatories(self,
instrument_array: Literal['themis_asi', 'rego', 'trex_rgb', 'trex_nir', 'trex_blue', 'trex_spectrograph'],
uid: str | None = None,
timeout: int | None = None) ‑> List[pyucalgarysrs.data.classes.Observatory]
Expand source code
def list_observatories(self,
                       instrument_array: Literal["themis_asi", "rego", "trex_rgb", "trex_nir", "trex_blue", "trex_spectrograph"],
                       uid: Optional[str] = None,
                       timeout: Optional[int] = None) -> List[Observatory]:
    """
    List information about observatories utilized by all providers.

    Args:
        instrument_array (str): 
            The instrument array to list observatories for. Valid values are: themis_asi, rego, 
            trex_rgb, trex_nir, trex_blue, and trex_spectrograph.

        uid (str): 
            Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID 
            is found in the available observatories received from the API, it will be included in the results. This 
            parameter is optional.
        
        timeout (int): 
            Represents how many seconds to wait for the API to send data before giving up. The 
            default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
            object. This parameter is optional.
        
    Returns:
        A list of [`Observatory`](https://docs-pyucalgarysrs.phys.ucalgary.ca/data/classes.html#pyucalgarysrs.data.classes.Observatory)
        objects.
    
    Raises:
        pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
    """
    # init
    observatories = []

    # get ucalgary datasets
    ucalgary_observatories = self.__ucalgary.list_observatories(instrument_array, uid=uid, timeout=timeout)

    # merge
    observatories = observatories + ucalgary_observatories

    # sort by name
    observatories = sorted(observatories, key=lambda x: x.uid)

    # return
    return observatories

List information about observatories utilized by all providers.

Args

instrument_array : str
The instrument array to list observatories for. Valid values are: themis_asi, rego, trex_rgb, trex_nir, trex_blue, and trex_spectrograph.
uid : str
Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID is found in the available observatories received from the API, it will be included in the results. This parameter is optional.
timeout : int
Represents how many seconds to wait for the API to send data before giving up. The default is 10 seconds, or the api_timeout value in the super class' PyAuroraX object. This parameter is optional.

Returns

A list of Observatory objects.

Raises

AuroraXAPIError
An API error was encountered.
def list_observatories_in_table(self,
instrument_array: Literal['themis_asi', 'rego', 'trex_rgb', 'trex_nir', 'trex_blue', 'trex_spectrograph'],
uid: str | None = None,
max_width: int = 200,
timeout: int | None = None) ‑> None
Expand source code
def list_observatories_in_table(self,
                                instrument_array: Literal["themis_asi", "rego", "trex_rgb", "trex_nir", "trex_blue", "trex_spectrograph"],
                                uid: Optional[str] = None,
                                max_width: int = 200,
                                timeout: Optional[int] = None) -> None:
    """
    Print available observatories for a given instrument array in a table

    Args:
        instrument_array (str): 
            The instrument array to list observatories for. Valid values are: themis_asi, rego, 
            trex_rgb, trex_nir, trex_blue, and trex_spectrograph.

        uid (str): 
            Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID 
            is found in the available observatories received from the API, it will be included in the results. This 
            parameter is optional.
        
        max_width (int): 
            Maximum width of the table. Default is `200`. This parameter is optional.

        timeout (int): 
            Represents how many seconds to wait for the API to send data before giving up. The 
            default is 10 seconds, or the `api_timeout` value in the super class' `pyaurorax.PyAuroraX`
            object. This parameter is optional.
        
    Returns:
        Printed table.
    
    Raises:
        pyaurorax.exceptions.AuroraXAPIError: An API error was encountered.
    """
    # get observatories
    observatories = self.list_observatories(instrument_array, uid=uid, timeout=timeout)

    # set table lists
    table_uids = []
    table_full_names = []
    table_geo_lats = []
    table_geo_lons = []
    table_providers = []
    for o in observatories:
        table_uids.append(o.uid)
        table_full_names.append(o.full_name)
        table_geo_lats.append(o.geodetic_latitude)
        table_geo_lons.append(o.geodetic_longitude)
        table_providers.append(o.provider)

    # set header values
    table_headers = [
        "UID",
        "Full Name",
        "Geodetic Latitude",
        "Geodetic Longitude",
        "Provider",
    ]

    # print as table
    table = Texttable(max_width=max_width)
    table.set_deco(Texttable.HEADER)
    table.set_cols_dtype(["t"] * len(table_headers))
    table.set_header_align(["l"] * len(table_headers))
    table.set_cols_align(["l"] * len(table_headers))
    table.header(table_headers)
    for i in range(0, len(table_uids)):
        table.add_row([
            table_uids[i],
            table_full_names[i],
            table_geo_lats[i],
            table_geo_lons[i],
            table_providers[i],
        ])
    print(table.draw())

Print available observatories for a given instrument array in a table

Args

instrument_array : str
The instrument array to list observatories for. Valid values are: themis_asi, rego, trex_rgb, trex_nir, trex_blue, and trex_spectrograph.
uid : str
Supply a observatory unique identifier used for filtering (usually 4-letter site code). If that UID is found in the available observatories received from the API, it will be included in the results. This parameter is optional.
max_width : int
Maximum width of the table. Default is 200. This parameter is optional.
timeout : int
Represents how many seconds to wait for the API to send data before giving up. The default is 10 seconds, or the api_timeout value in the super class' PyAuroraX object. This parameter is optional.

Returns

Printed table.

Raises

AuroraXAPIError
An API error was encountered.