Class: SpiceKernelHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/spice_utils.rb

Overview

The SpiceKernelHelper class is used to parse out mk files.

LROC mk files, as a whole, wayyy blow past the 1000 file handle limit.

This pares it down to only the kernels which we need.

This file is already 'required' when you run 'require "spice"'

Examples:

skh = SpiceKernelHelper.new

#Loop through an array of kernels, furnshing
#non-mk kernels directly

kernels.each do |kernel|
  if kernel =~ /mk$/
    skh.parse kernel
  else
    furnsh kernel
  end
end
furnsh *skh.base_kernels
furnsh *skh.detail_kernels(et2rb(start_et))

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (SpiceKernelHelper) initialize

Returns a new instance of SpiceKernelHelper



44
45
46
47
# File 'lib/spice_utils.rb', line 44

def initialize
  @base_kernels = []
  @detail_kernels = []
end

Instance Attribute Details

- (Object) base_kernels (readonly)

Returns the value of attribute base_kernels



42
43
44
# File 'lib/spice_utils.rb', line 42

def base_kernels
  @base_kernels
end

Instance Method Details

- (Array<String>) detail_kernels(time)

Return kernels that cover a specified time

Parameters:

  • time (DateTime)

Returns:

  • (Array<String>)

    An array of paths to kernels that cover the given time



98
99
100
101
102
103
# File 'lib/spice_utils.rb', line 98

def detail_kernels time
  magic_sym = RUBY_VERSION =~ /^1\.8\./ ? :include? : :cover?
  @detail_kernels.find_all do |range, kernel|
    range.send(magic_sym, time) or range.send(magic_sym, time + 86400) or range.send(magic_sym, time - 86400)
  end.collect { |range, kernel| kernel }
end

- (Object) parse(file)

Parse an mk kernel and save kernel information that can be retrieved with #base_kernels or #detail_kernels

Parameters:

  • file (String)

    Path to mk kernel



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/spice_utils.rb', line 54

def parse file
  mkdata = open(file).read.gsub(/\s+/, " ").strip

  mkdata =~ /PATH_VALUES\s*=\s*\(\s*([^)]+?)\s*\)/
  path_values = $1.split(/\s*,\s*/).collect {|v| v.gsub "'", ''}

  mkdata =~ /PATH_SYMBOLS\s*=\s*\(\s*([^)]+?)\s*\)/
  path_symbols = $1.split(/\s*,\s*/).collect {|v| v.gsub "'", ''}

  mkdata =~ /KERNELS_TO_LOAD\s*=\s*\(\s*([^)]+?)\s*\)/
  raw_kernels = $1

  path_symbols.zip(path_values).each do |key, value|
    raw_kernels.gsub!("$#{key}", value)
  end

  kernels = raw_kernels.split(/\s*,\s*/).collect {|v| v.gsub "'", ''}.collect

  kernels.each do |kernel|
    if kernel =~ /\w\w\w\w\w\w?_(\d\d\d\d\d\d\d)_(\d\d\d\d\d\d\d)_.*?.(bc|bsp)$/
      start_doy = $1
      stop_doy = $2

      if start_doy == stop_doy
        @base_kernels << kernel
      else
        start_time = Time.gm(start_doy[0..3].to_i, 1, 1, 0, 0, 0) + (start_doy[4..6].to_i-1)*24*60*60
        stop_time = Time.gm(stop_doy[0..3].to_i, 1, 1, 0, 0, 0) + (stop_doy[4..6].to_i-1)*24*60*60

        @detail_kernels << [start_time..stop_time, kernel]
      end
    else
      @base_kernels << kernel
    end
  end
end