Commit d6740b6a authored by Kelvin Rodriguez's avatar Kelvin Rodriguez Committed by Jesse Mapel
Browse files

Updated load interface (#253)

* kernel list support added

* simple spice as fixture

* removed abstractmethod tags

* added property tags

* addressed comments

* removed config, combined kernel and metakernel methods, added test for metakerenl queries

* added test to env var

* Add short name test for dawn

* added sorted driver list

* i don't remmeber

* updated tests to only need one reload for ale

* removed uneeded header

* removed cpp load notebook

* removed vis module

* updated write_metakernel code to use abspaths

* updated tests, removed json from repo and now is conda installed from conda-forge

* removed redundant json conversion in load func

* addressed commnets

* updated tests as per comments
parent 2fe89e3f
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -17,8 +17,15 @@ class Driver():
        file : str
               path to file to be parsed
        """

        if not props:
            self._props = {}
        elif isinstance(props, dict):
            self._props = props
        elif isinstance(props, str):
            self._props = json.loads(props)
        else:
            raise Exception(f'Invalid props arg: {props}')

        self._num_quaternions = num_quats
        self._num_ephem = num_ephem
        self._file = file
+8 −1
Original line number Diff line number Diff line
import spiceypy as spice
import numpy as np

import ale
from ale.base.type_sensor import Framer
from ale.transformation import FrameChain
from ale.rotation import TimeDependentRotation
@@ -31,7 +32,13 @@ class NaifSpice():
            if 'kernels' in self._props.keys():
                self._kernels =  self._props['kernels']
            else:
                search_results = util.get_metakernels(missions=self.short_mission_name, years=self.utc_start_time.year, versions='latest')
                if not ale.spice_root:
                    raise EnvironmentError(f'ale.spice_root is not set, cannot search for metakernels. ale.spice_root = "{ale.spice_root}"')

                search_results = util.get_metakernels(ale.spice_root, missions=self.short_mission_name, years=self.utc_start_time.year, versions='latest')

                if search_results['count'] == 0:
                    raise ValueError(f'Failed to find metakernels. mission: {self.short_mission_name}, year:{self.utc_start_time.year}, versions="latest" spice root = "{ale.spice_root}"')
                self._kernels = [search_results['data'][0]['path']]
        return self._kernels

+30 −25
Original line number Diff line number Diff line
@@ -12,9 +12,11 @@ import numpy as np
import datetime
from datetime import datetime, date
import traceback
from collections import OrderedDict

from ale.formatters.usgscsm_formatter import to_usgscsm
from ale.formatters.isis_formatter import to_isis
from ale.base.data_isis import IsisSpice

from abc import ABC

@@ -25,28 +27,24 @@ __driver_modules__ = [importlib.import_module('.'+m, package='ale.drivers') for
__formatters__ = {'usgscsm': to_usgscsm,
                  'isis': to_isis}

drivers = dict(chain.from_iterable(inspect.getmembers(dmod, lambda x: inspect.isclass(x) and "_driver" in x.__module__) for dmod in __driver_modules__))
def sort_drivers(drivers=[]):
    return list(sorted(drivers, key=lambda x:IsisSpice in x.__bases__, reverse=True))

class JsonEncoder(json.JSONEncoder):
class AleJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        if isinstance(obj, np.int64):
            return int(obj)
        if isinstance(obj, datetime.datetime):
            return obj.__str__()
        if isinstance(obj, bytes):
            return obj.decode("utf-8")
        if isinstance(obj, pvl.PVLModule):
            return pvl.dumps(obj)
        if isinstance(obj, set):
            return list(obj)
        if isinstance(obj, np.nan):
            return None
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.date):
            return obj.isoformat()
        return json.JSONEncoder.default(self, obj)


def load(file_path, formatter='usgscsm'):
def load(label, props={}, formatter='usgscsm', verbose=False):
    """
    Attempt to load a given label from all possible drivers

@@ -58,18 +56,25 @@ def load(file_path, formatter='usgscsm'):
    if isinstance(formatter, str):
        formatter = __formatters__[formatter]

    for name, driver in drivers.items():
        print(f'Trying {name}')
    drivers = chain.from_iterable(inspect.getmembers(dmod, lambda x: inspect.isclass(x) and "_driver" in x.__module__) for dmod in __driver_modules__)
    drivers = sort_drivers([d[1] for d in drivers])

    for driver in drivers:
        if verbose:
            print(f'Trying {driver}')
        try:
            res = driver(label)
            res = driver(label, props=props)
            # get instrument_id to force early failure
            res.instrument_id

            with res as driver:
                return formatter(driver)
        except Exception as e:
            if verbose:
                print(f'Failed: {e}\n')
                traceback.print_exc()
    raise Exception('No Such Driver for Label')


def loads(label, formatter='usgscsm'):
    res = load(label, formatter)
    return json.dumps(res, cls=JsonEncoder)
def loads(label, props='', formatter='usgscsm'):
    res = load(label, props, formatter)
    return json.dumps(res, cls=AleJsonEncoder)

ale/encoders.py

deleted100644 → 0
+0 −17
Original line number Diff line number Diff line
import json
import numpy as np
import datetime

class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.date):
            return obj.isoformat()
        return json.JSONEncoder.default(self, obj)
+2 −3
Original line number Diff line number Diff line
import json

from ale.rotation import ConstantRotation, TimeDependentRotation
from ale.encoders import NumpyEncoder

from networkx.algorithms.shortest_paths.generic import shortest_path

@@ -93,4 +92,4 @@ def to_isis(driver):
    sun_position['Velocities'] = velocities
    meta_data['SunPosition'] = sun_position

    return json.dumps(meta_data, cls=NumpyEncoder)
    return meta_data
Loading