Source code for sdss_brain.core
# !/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Filename: core.py
# Project: sdss_brain
# Author: Brian Cherinka
# Created: Sunday, 15th March 2020 4:53:35 pm
# License: BSD 3-clause "New" or "Revised" License
# Copyright (c) 2020 Brian Cherinka
# Last Modified: Wednesday, 18th March 2020 4:08:26 pm
# Modified By: Brian Cherinka
from __future__ import print_function, division, absolute_import
import abc
from sdss_brain.mma import MMAMixIn
from astropy.io import fits
[docs]class Base(abc.ABC):
''' abstract base class for tools '''
@abc.abstractmethod
def _load_object_from_file(self, data=None):
pass
@abc.abstractmethod
def _load_object_from_db(self, data=None):
pass
@abc.abstractmethod
def _load_object_from_api(self, data=None):
pass
[docs]class Brain(Base, MMAMixIn):
''' Convenience class for utilizing the MMA mixin
This is a convenience class with the ``MMAMixIn`` already implemented.
This class initializes the ``MMAMixIn`` and provides logic to load data based
on the data_origin. It also provides a simple ``repr``.
This class contains three abstractmethods you must override when subclassing.
- **_load_object_from_file**: defines data load/handling from a local file
- **_load_object_from_db**: defines data load/handling from a local database
- **_load_object_from_api**: defines data load/handling from a remote API
Parameters:
data_input (str):
The file or name of target data to load
filename (str):
The absolute filepath to data to load
objectid (str):
The object identifier of the data to load
mode (str):
The operating mode: auto, local, or remote
release (str):
The data release of the object, e.g. "DR16"
data (object):
Optional data to instantiate the object with
download (bool):
If True, downloads the object locally with sdss_access
ignore_db (bool):
If True, ignores any database connection for local access
use_db (sdssdb.DatabaseConnection):
a database connection to override the default with
Attributes:
_db (sdssdb.DatabaseConnection):
A relevant sdssdb database connection for the object
mapped_version (str):
The name of survey/category in the mapped_versions dictionary
'''
_db = None
mapped_version = None
def __init__(self, data_input=None, filename=None,
objectid=None, mode=None, data=None,
release=None, download=None,
ignore_db=None, use_db=None):
self.data = data
MMAMixIn.__init__(self, data_input=data_input, filename=filename,
objectid=objectid, mode=mode,
release=release, download=download,
ignore_db=ignore_db, use_db=use_db or self._db)
if self.data_origin == 'file':
self._load_object_from_file(data=data)
elif self.data_origin == 'db':
self._load_object_from_db(data=data)
elif self.data_origin == 'api':
self._load_object_from_api()
def __repr__(self):
objname = f"objectid='{self.objectid}'" if self.objectid else f"filename='{self.filename}'"
return (f"<{self.__class__.__name__} {objname}, mode='{self.mode}', "
f"data_origin='{self.data_origin}'>")
def __del__(self):
''' Destructor for closing FITS files. '''
if self.data_origin == 'file' and isinstance(self.data, fits.HDUList):
self.data.close()