Skip to content

Analysis API

The Analysis API allows you to query the almanac for data products, events, and contact windows.

Reporting Scalars

Use report_scalars to generate time-series data for analysis or plotting.

almanac.report_scalars(report, time_series)

Expects a ReportScalars object containing a list of expressions and a StateSpec.

Parameters: - report: A ReportScalars instance defined with: - state_spec: The context (Target, Observer, Frame) to evaluate against. - scalars: A list of ScalarExpr items. - time_series: A hifitime::TimeSeries defining the start, end, and step.

Returns: A dictionary (or map) where keys are Epochs and values are maps of { "Alias": Value }.

    target_frame = analysis.FrameSpec.Loaded(Frames.EME2000)
    observer_frame = analysis.FrameSpec.Loaded(Frames.MOON_J2000)

    state = analysis.StateSpec(
        target_frame=target_frame,
        observer_frame=observer_frame,
        ab_corr=None,
    )

    # Define all scalars to be calculated
    scalars = [
        analysis.ScalarExpr.Element(analysis.OrbitalElement.SemiMajorAxis),
        analysis.ScalarExpr.Element(analysis.OrbitalElement.Eccentricity),
        analysis.ScalarExpr.Element(analysis.OrbitalElement.Rmag),
        analysis.ScalarExpr.BetaAngle(),
        analysis.ScalarExpr.SolarEclipsePercentage(eclipsing_frame=Frames.VENUS_J2000),
    ]

    # Add optional aliases (Tuple of (Scalar, Alias))
    scalars_with_aliases = [(s, None) for s in scalars]

    # Build the final report object
    report = analysis.ReportScalars(scalars_with_aliases, state)

    # Generate the report data
    series = TimeSeries(
        Epoch("2025-01-01 00:00:00 UTC"),
        Epoch("2025-01-02 12:00:00 UTC"),
        Unit.Day * 0.5,
        inclusive=True,
    )
    data = almanac.report_scalars(report, series)

Finding Events

Use report_events to find specific instants (points in time).

almanac.report_events(state, event, start, end)

Finds discrete events such as: - Orbital Events: Apoapsis, Periapsis. - Min/Max: Time of maximum elevation, minimum range. - Crossings: Time when altitude crosses 100km.

Returns: A list of EventDetails objects, each containing: - epoch: The precise time of the event. - value: The value of the scalar at that time. - orbit: The full spacecraft state at that time.

    # Define an event: Sun Angle < 90.0 degrees (Sunset)
    sun_has_set = analysis.Event(
        analysis.ScalarExpr.SunAngle(observer_id=-85), # LRO ID
        Condition.LessThan(90.0),
        Unit.Second * 0.5,
        ab_corr=None,
    )

    # Predefined events are also available
    apolune = Event.apoapsis()
    perilune = Event.periapsis()

    # Find distinct events (points in time)
    apo_events = almanac.report_events(lro_state_spec, apolune, start_epoch, end_epoch)

Finding Intervals (Arcs)

Use report_event_arcs to find durations.

almanac.report_event_arcs(state, event, start, end)

Finds time intervals where a condition is continuously true. - Visibility: "When can I see the station?" - Battery: "When am I in sunlight?" - Geometry: "When is the Earth-Sun-Probe angle < 90?"

Returns: A list of EventArc objects, each containing: - start: The EventDetails of the start (Rising edge). - end: The EventDetails of the end (Falling edge).

    eclipse = Event.total_eclipse(Frames.MOON_J2000)

    # Find durations (arcs)
    sunset_arcs = almanac.report_event_arcs(
        lro_state_spec, sun_has_set, start_epoch, end_epoch
    )

    eclipse_arcs = almanac.report_event_arcs(
        lro_state_spec, eclipse, start_epoch, start_epoch + period * 3
    )

Returns: A list of EventArc objects, each containing: - start: The EventDetails of the start (Rising edge). - end: The EventDetails of the end (Falling edge).

The EventArc provides the following helpers: - duration: the duration of the event, as a hifitime Duration - start_epoch, end_epoch: the epochs of the start and end of the event - midpoint_epoch: the half-way point in the event, useful if you need to check for some calculation that happens undoubtedly during the event itself.