Commit baff4431 authored by acpaquette's avatar acpaquette Committed by Jesse Mapel
Browse files

General ISD Generation Fixes + Dawn Notebook (#206)

* Small import fixes to dawn

* More imports and updated the start_time to utc_start_time

* Added properties to dawn driver to get things working

* General changes to bring the isd back in line with isds generated in late April

* Update to dawn driver for detector sample and line center

* Added dawn notebook

* Fixed small type in sensor

* Fixed load/loads function

* Removed unnecessary print from load function

* Updated formatter test

* Updated load and loads to use a default formatter

* Minor import shuffling

* Reverted center ephemeris time

* Updated camera driver mixins to set the ephemeris stop time

* Suggested changes and test updates

* Removed weird driver importing

* Updated return in data_naif

* Small changes to get tests passing

* Updated line scan center ephemeris doc string

* Removed stop time from tests as it is computed from other properties
parent 92e073ee
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ class Pds3Label():
            try:
                unit = self.label['EXPOSURE_DURATION'].units
                unit = unit.lower()
                if unit == "ms" or unit == "msec":
                if unit == "ms" or unit == "msec" or unit == "millisecond":
                  return self.label['EXPOSURE_DURATION'].value * 0.001
                else:
                  return self.label['EXPOSURE_DURATION'].value
+33 −2
Original line number Diff line number Diff line
@@ -49,6 +49,22 @@ class LineScanner():
        """
        return np.linspace(self.ephemeris_start_time,  self.ephemeris_stop_time, self.image_lines / 64)

    @property
    def ephemeris_stop_time(self):
        """
        Returns the sum of the starting ephemeris time and the number of lines
        times the exposure duration. Expects ephemeris start time, exposure duration
        and image lines to be defined. These should be double precision numbers
        containing the ephemeris start, exposure duration and number of lines of
        the image.

        Returns
        -------
        : double
          Center ephemeris time for an image
        """
        return self.ephemeris_start_time + (self.image_lines * self.exposure_duration)

class Framer():
    @property
    def name_model(self):
@@ -66,8 +82,8 @@ class Framer():
    @property
    def ephemeris_time(self):
        """
        Returns the center ephemeris time for the image which is the average
        of the start and stop ephemeris time.
        Returns the center ephemeris time for the image which is start time plus
        half of the exposure duration.
        Expects center_ephemeris_time to be defined. This should be a double
        containing the average of the start and stop ephemeris times.

@@ -77,3 +93,18 @@ class Framer():
          Center ephemeris time for the image
        """
        return [self.center_ephemeris_time]

    @property
    def ephemeris_stop_time(self):
        """
        Returns the sum of the starting ephemeris time and the exposure duration.
        Expects ephemeris start time and exposure duration to be defined. These
        should be double precision numbers containing the ephemeris start and
        exposure duration of the image.

        Returns
        -------
        : double
          Ephemeris stop time for an image
        """
        return self.ephemeris_start_time + self.exposure_duration
+22 −16
Original line number Diff line number Diff line
@@ -9,18 +9,23 @@ import os
from glob import glob
import json
import numpy as np
import datetime
from datetime import datetime, date
import traceback

from abc import ABC
from ale.formatters.usgscsm_formatter import to_usgscsm
from ale.formatters.isis_formatter import to_isis

import datetime
from abc import ABC

# dynamically load drivers
__all__ = [os.path.splitext(os.path.basename(d))[0] for d in glob(os.path.join(os.path.dirname(__file__), '*_drivers.py'))]
__driver_modules__ = [importlib.import_module('.'+m, package='ale.drivers') for m in __all__]

drivers = dict(chain.from_iterable(inspect.getmembers(dmod, lambda x: inspect.isclass(x) and "_driver" in x.__module__) for dmod in __driver_modules__))
__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__))

class JsonEncoder(json.JSONEncoder):
    def default(self, obj):
@@ -41,7 +46,7 @@ class JsonEncoder(json.JSONEncoder):
        return json.JSONEncoder.default(self, obj)


def load(label):
def load(label, formatter='usgscsm'):
    """
    Attempt to load a given label from all possible drivers

@@ -50,20 +55,21 @@ def load(label):
    label : str
               String path to the given label file
    """
    if isinstance(formatter, str):
        formatter = __formatters__[formatter]

    for name, driver in drivers.items():
            print("Trying:", name)
        print(f'Trying {name}')
        try:
            res = driver(label)
                if res.is_valid():
                    with res as r:
                            return res.to_dict()
            with res as driver:
                return formatter(driver)
        except Exception as e:
                import traceback
                print("Driver Failed:", e)
            print(f'Failed: {e}\n')
            traceback.print_exc()
    raise Exception('No Such Driver for Label')


def loads(label):
    res = load(label)
def loads(label, formatter='usgscsm'):
    res = load(label, formatter)
    return json.dumps(res, cls=JsonEncoder)
+7 −7
Original line number Diff line number Diff line
@@ -127,11 +127,11 @@ class DawnFcPds3NaifSpiceDriver(Pds3Label, NaifSpice, Framer, Driver):
        via a spice call but 193 ms needs to be added to
        account for the CCD being discharged or cleared.
        """
        if not hasattr(self, '_starting_ephemeris_time'):
        if not hasattr(self, '_ephemeris_start_time'):
            sclock = self.spacecraft_clock_start_count
            self._starting_ephemeris_time = spice.scs2e(self.spacecraft_id, sclock)
            self._starting_ephemeris_time += 193.0 / 1000.0
        return self._starting_ephemeris_time
            self._ephemeris_start_time = spice.scs2e(self.spacecraft_id, sclock)
            self._ephemeris_start_time += 193.0 / 1000.0
        return self._ephemeris_start_time

    @property
    def usgscsm_distortion_model(self):
@@ -241,7 +241,7 @@ class DawnFcPds3NaifSpiceDriver(Pds3Label, NaifSpice, Framer, Driver):
        : float
          center detector sample
        """
        return float(spice.gdpool('INS{}_BORESIGHT'.format(self.ikid), 0, 3)[0])
        return float(spice.gdpool('INS{}_CCD_CENTER'.format(self.ikid), 0, 2)[0])

    @property
    def detector_center_line(self):
@@ -254,4 +254,4 @@ class DawnFcPds3NaifSpiceDriver(Pds3Label, NaifSpice, Framer, Driver):
        : float
          center detector line
        """
        return float(spice.gdpool('INS{}_BORESIGHT'.format(self.ikid), 0, 3)[1])
        return float(spice.gdpool('INS{}_CCD_CENTER'.format(self.ikid), 0, 2)[1])
+0 −1
Original line number Diff line number Diff line
@@ -61,7 +61,6 @@ class MroCtxIsisLabelIsisSpiceDriver(Driver, IsisSpice, LineScanner, RadialDisto
        """
        return self.label["IsisCube"]["Instrument"]["LineExposureDuration"].value * 0.001 # Scale to seconds


class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, NaifSpice, LineScanner, RadialDistortion, Driver):
    """
    Driver for reading CTX ISIS labels.
Loading