Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ repos:
| docs/.*\.(svg|png)$ # documentation images
)
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: "v0.15.2"
rev: "v0.16.10"
hooks:
- id: ruff-check
args: [--fix]
Expand Down
73 changes: 64 additions & 9 deletions docs/swapi/figure_src/figure_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import os
import sys
import time
from collections.abc import Callable
from pathlib import Path
from typing import Callable, TypeVar
from typing import TypeVar

import numpy as np

Expand Down Expand Up @@ -42,14 +43,68 @@ def load_swapi_response() -> SwapiResponse:

COARSE_SWEEP_VOLTAGES_MEAN_V = np.array(
[
9895.52, 9088.69, 8348.80, 7667.55, 7042.16, 6469.31, 5941.77, 5457.31,
5013.22, 4603.65, 4230.77, 3886.92, 3569.16, 3278.72, 3011.13, 2766.25,
2539.54, 2333.83, 2144.24, 1969.31, 1808.74, 1660.86, 1525.75, 1401.82,
1287.58, 1182.24, 1085.15, 995.55, 914.31, 839.94, 771.70, 709.46,
651.59, 598.47, 549.91, 505.12, 463.89, 425.92, 391.18, 359.35,
329.94, 303.02, 278.25, 255.55, 234.77, 215.61, 197.95, 181.82,
167.04, 153.46, 140.91, 129.50, 118.91, 109.20, 100.30, 92.11,
84.61, 77.73, 71.40, 65.59, 60.23, 55.34,
9895.52,
9088.69,
8348.80,
7667.55,
7042.16,
6469.31,
5941.77,
5457.31,
5013.22,
4603.65,
4230.77,
3886.92,
3569.16,
3278.72,
3011.13,
2766.25,
2539.54,
2333.83,
2144.24,
1969.31,
1808.74,
1660.86,
1525.75,
1401.82,
1287.58,
1182.24,
1085.15,
995.55,
914.31,
839.94,
771.70,
709.46,
651.59,
598.47,
549.91,
505.12,
463.89,
425.92,
391.18,
359.35,
329.94,
303.02,
278.25,
255.55,
234.77,
215.61,
197.95,
181.82,
167.04,
153.46,
140.91,
129.50,
118.91,
109.20,
100.30,
92.11,
84.61,
77.73,
71.40,
65.59,
60.23,
55.34,
]
)

Expand Down
15 changes: 9 additions & 6 deletions docs/swapi/figure_src/plot_alpha_peak_finding.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@

sys.path.insert(0, str(Path(__file__).resolve().parents[3]))

from figure_utils import FIGURES_DIR, load_swapi_response

from imap_l3_processing.constants import (
ALPHA_MASS_PER_CHARGE_M_P_PER_E,
ALPHA_PARTICLE_MASS_KG,
Expand Down Expand Up @@ -70,7 +72,6 @@
)
from imap_l3_processing.swapi.response.deadtime import deadtime_factor
from imap_l3_processing.utils import SpiceKernelTypes
from figure_utils import FIGURES_DIR, load_swapi_response

DATE_YYYYMMDD = "20260101"
N_SWEEPS = 5
Expand Down Expand Up @@ -187,8 +188,12 @@ def _read_5_sweep_block(

def _coarse_measurement_times_ns(epoch_ns: np.ndarray) -> np.ndarray:
coarse_bins = np.arange(SWAPI_COARSE_SWEEP_BINS.start, SWAPI_COARSE_SWEEP_BINS.stop)
seconds_into_sweep = coarse_bins * SWAPI_BIN_PERIOD_S + SWAPI_LIVETIME_CENTER_OFFSET_S
return (epoch_ns[:, None] + seconds_into_sweep * ONE_SECOND_IN_NANOSECONDS).flatten()
seconds_into_sweep = (
coarse_bins * SWAPI_BIN_PERIOD_S + SWAPI_LIVETIME_CENTER_OFFSET_S
)
return (
epoch_ns[:, None] + seconds_into_sweep * ONE_SECOND_IN_NANOSECONDS
).flatten()


# --------------------------------------------------------------------------- #
Expand Down Expand Up @@ -261,9 +266,7 @@ def _plot_case(ax, swapi_response, cdf_path, mag_data, chunk_index):
proton_moments=proton_moments,
magnetic_field_direction=b_hat,
)
alpha_velocity_rtn = np.array(
[c.nominal_value for c in alpha_moments.velocity_rtn]
)
alpha_velocity_rtn = np.array([c.nominal_value for c in alpha_moments.velocity_rtn])
alpha_sw = SolarWindParams(
density=alpha_moments.density.nominal_value,
velocity_rtn=alpha_velocity_rtn,
Expand Down
2 changes: 1 addition & 1 deletion docs/swapi/figure_src/plot_calibration_curves.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from figure_utils import FIGURES_DIR, load_swapi_response

from imap_l3_processing.swapi.response.swapi_response import SwapiResponse
from figure_utils import FIGURES_DIR, load_swapi_response

_AREA_CSV = (
Path(__file__).resolve().parents[3]
Expand Down
10 changes: 7 additions & 3 deletions docs/swapi/figure_src/plot_collapsed_response_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,20 @@
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from figure_utils import FIGURES_DIR, REPO_ROOT, load_swapi_response

from imap_l3_processing.constants import HE_PUI_PARTICLE_MASS_PER_CHARGE_M_P_PER_E
from imap_l3_processing.swapi.l3a.science.pickup_ion.collapsed_response_grid import (
build_collapsed_response_grid,
solar_wind_frame_speed_range,
)
from figure_utils import FIGURES_DIR, REPO_ROOT, load_swapi_response
from imap_l3_processing.constants import HE_PUI_PARTICLE_MASS_PER_CHARGE_M_P_PER_E

_REFERENCE_CSV_PATH = (
REPO_ROOT / "tests" / "test_data" / "swapi" / "collapsed_response_grid_reference.csv"
REPO_ROOT
/ "tests"
/ "test_data"
/ "swapi"
/ "collapsed_response_grid_reference.csv"
)

_ESA_VOLTAGE = 5000.0
Expand Down
39 changes: 20 additions & 19 deletions docs/swapi/figure_src/plot_fit_accuracy.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,13 @@

import types

import matplotlib
import numpy as np
import pandas as pd
from uncertainties import UFloat
import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt

from imap_l3_processing.constants import (
PROTON_MASS_KG,
PROTON_MASS_PER_CHARGE_M_P_PER_E,
)
from imap_l3_processing.swapi.constants import SWAPI_LIVETIME_S
from figure_utils import (
COARSE_BIN_INDICES_IN_SWEEP,
COARSE_SWEEP_VOLTAGES_MEAN_V,
Expand All @@ -50,20 +44,26 @@
load_swapi_response,
run_parallel_map,
)
from imap_l3_processing.swapi.l3a.science.solar_wind.proton.fit_solar_wind_proton_model import (
fit_solar_wind_proton_model,

from imap_l3_processing.constants import (
PROTON_MASS_KG,
PROTON_MASS_PER_CHARGE_M_P_PER_E,
)
from imap_l3_processing.swapi.l3a.science.solar_wind.proton.calculate_initial_guess import (
calculate_initial_guess,
from imap_l3_processing.swapi.constants import SWAPI_LIVETIME_S
from imap_l3_processing.swapi.l3a.science.solar_wind.fit_context import (
build_solar_wind_fit_context,
)
from imap_l3_processing.swapi.l3a.science.solar_wind.forward_model import (
model_solar_wind_ideal_coincidence_rates,
)
from imap_l3_processing.swapi.response.deadtime import deadtime_factor
from imap_l3_processing.swapi.l3a.science.solar_wind.fit_context import (
build_solar_wind_fit_context,
)
from imap_l3_processing.swapi.l3a.science.solar_wind.params import SolarWindParams
from imap_l3_processing.swapi.l3a.science.solar_wind.proton.calculate_initial_guess import (
calculate_initial_guess,
)
from imap_l3_processing.swapi.l3a.science.solar_wind.proton.fit_solar_wind_proton_model import (
fit_solar_wind_proton_model,
)
from imap_l3_processing.swapi.response.deadtime import deadtime_factor

_N_SWEEPS = 5
_N_BINS = len(COARSE_SWEEP_VOLTAGES_MEAN_V)
Expand Down Expand Up @@ -188,10 +188,11 @@ def _process_one(i):
result = fit_solar_wind_proton_model(fit_ctx)
except Exception as e:
print(f" case {i}: fit failed ({type(e).__name__}: {e}); flagging bad")
from uncertainties import ufloat

from imap_l3_processing.swapi.l3a.science.solar_wind.proton.fit_solar_wind_proton_model import (
ProtonSolarWindFitResult,
)
from uncertainties import ufloat

nan_uf = ufloat(float("nan"), float("nan"))
result = ProtonSolarWindFitResult(
Expand Down Expand Up @@ -315,7 +316,7 @@ def _plot_results(data: pd.DataFrame) -> None:
marker="o",
zorder=2,
label="Initial guess",
rasterized=True
rasterized=True,
)
ax.errorbar(
truth[good],
Expand Down Expand Up @@ -344,7 +345,7 @@ def _plot_results(data: pd.DataFrame) -> None:
edgecolors="k",
linewidths=0.4,
zorder=4,
rasterized=True
rasterized=True,
)
ax.scatter(
truth[~good],
Expand All @@ -356,7 +357,7 @@ def _plot_results(data: pd.DataFrame) -> None:
edgecolors="k",
linewidths=0.4,
zorder=4,
rasterized=True
rasterized=True,
)

ax.set_xlabel(f"True {label}", fontsize=9)
Expand Down
6 changes: 2 additions & 4 deletions docs/swapi/figure_src/plot_passband_boundaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from figure_utils import FIGURES_DIR, load_swapi_response

from imap_l3_processing.swapi.response.passband_grid import PassbandGrid
from imap_l3_processing.swapi.response.swapi_response import SwapiResponse
from figure_utils import FIGURES_DIR, load_swapi_response

_ELEVATION_DISPLAY_LIMIT_DEG = 15.0
_ACTIVE_ELEVATION_SAMPLE_COUNT = 300
Expand Down Expand Up @@ -85,9 +85,7 @@ def plot_region_panel(
grid, grid.max_boundary, active_elevations, np.maximum
)

image = draw_transmission_heatmap(
axis, grid.values, elevations, speed_ratios
)
image = draw_transmission_heatmap(axis, grid.values, elevations, speed_ratios)
draw_integration_window_outline(
axis, active_elevations, lower_speed_ratios, upper_speed_ratios
)
Expand Down
Loading
Loading