suboptimumg.loganalysis.macros#

High-level convenience macros that chain multiple loganalysis steps.

suboptimumg.loganalysis.macros.derive_quantities(df)[source]#

Compute all standard derived quantities.

TODO: Wire up the full set of derived.py calls.

Parameters:

df (DataFrame)

Return type:

DataFrame

suboptimumg.loganalysis.macros.fft_group(df, partial_path, log_y=False, stacked=False, **kwargs)[source]#

Plot FFT for all columns matching partial_path.*.

Default is linear y-axis and overlaid traces.

Parameters:
  • df (pd.DataFrame)

  • partial_path (str)

  • log_y (bool)

  • stacked (bool)

Return type:

go.Figure

suboptimumg.loganalysis.macros.filter_speeds(df, zscore_window=8.0, zscore_thresh=2.5, lowpass_hz=3.0)[source]#

Z-score + lowpass pipeline for wheel speed signals.

  1. Z-score filter the four raw wheelspeed sensors.

  2. Recompute groundSpeed from the cleaned front wheelspeeds.

  3. Lowpass all wheelspeeds, motor wheelSpeed, and groundSpeed.

Parameters:
  • df (DataFrame)

  • zscore_window (float)

  • zscore_thresh (float)

  • lowpass_hz (float)

Return type:

DataFrame

suboptimumg.loganalysis.macros.intake_vd_starter_kit(analyzer, deduplicate=True, resample_method='linear')[source]#

Load the standard vehicle-dynamics variable set into a DataFrame.

Wraps perda_to_dataframe with the default VD variable list and ZOH deduplication on VectorNav position and velocity channels.

pcm.vnav.gpsFix is always resampled with zero-order hold (it is a discrete state, not a continuous signal — linear interpolation between 0 and 3 would produce nonsensical fractional fix values that defeat downstream gpsFix-based masking).

Sentinel 0.0 samples in posLla.latitude/.longitude (VectorNav’s “no INS solution” marker) are stripped from the source DataInstance before resampling so dedup + linear interpolation don’t smear them into ramps across no-fix gaps.

Parameters:
  • analyzer (Analyzer)

  • deduplicate (bool)

  • resample_method (str | dict[str, str])

Return type:

pd.DataFrame

suboptimumg.loganalysis.macros.lowpass_group(df, partial_path, cutoff_hz, **kwargs)[source]#

Lowpass filter all columns matching partial_path.*.

Parameters:
  • df (DataFrame)

  • partial_path (str)

  • cutoff_hz (float)

Return type:

DataFrame

suboptimumg.loganalysis.macros.plot_group(df, partial_path, stacked=False, **kwargs)[source]#

Plot all columns matching partial_path.*.

Default is overlaid traces on a single axis.

Parameters:
  • df (pd.DataFrame)

  • partial_path (str)

  • stacked (bool)

Return type:

go.Figure

suboptimumg.loganalysis.macros.preprocess_gps(df)[source]#

Resolve GPS columns, clean/project, and compute elapsed distance.

Parameters:

df (DataFrame)

Return type:

DataFrame

suboptimumg.loganalysis.macros.preprocess_speeds(df, patch_ned=True, car_yaml='parameters/car.yaml')[source]#

NED velocity patch, wheelspeed unit conversion, motor correction, ground speed.

Parameters:
  • df (DataFrame)

  • patch_ned (bool)

  • car_yaml (str)

Return type:

DataFrame

suboptimumg.loganalysis.macros.simulate_on_track(lap_df, track, car_yaml='../parameters/car.yaml', velocity_col='groundSpeed')[source]#

Load a car, simulate on a Track, and return a QSS DataFrame.

Parameters:
  • lap_df (DataFrame) – The trimmed single-lap DataFrame used to build the track.

  • track (Track) – A QSS-compatible Track (from build_qss_track()).

  • car_yaml (str) – Path to the car YAML config file.

  • velocity_col (str) – Column to read IRL initial speed from.

Returns:

sim is the CustomRun instance (carries push/coast results). qss_df is a distance-indexed DataFrame with qss.* columns.

Return type:

(sim, qss_df)

suboptimumg.loganalysis.macros.zfilter_group(df, partial_path, window_s=2.0, threshold=4.8, **kwargs)[source]#

Z-score filter all columns matching partial_path.*.

Parameters:
  • df (DataFrame)

  • partial_path (str)

  • window_s (float)

  • threshold (float)

Return type:

DataFrame